From 5879d48ec88fc5bd09d5bdd1a2d0c1d116d063b6 Mon Sep 17 00:00:00 2001 From: dameoffensive-cloud Date: Sun, 8 Feb 2026 09:41:30 -0500 Subject: [PATCH 001/171] Add files via upload --- scripts/yields_extra.json | 1742 +++++++++++++++++++++++++++++++++++++ 1 file changed, 1742 insertions(+) create mode 100644 scripts/yields_extra.json diff --git a/scripts/yields_extra.json b/scripts/yields_extra.json new file mode 100644 index 0000000..23885b0 --- /dev/null +++ b/scripts/yields_extra.json @@ -0,0 +1,1742 @@ +{ + "Blue Jazz": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Flower", + "base_price": 50, + "avg_price": 75.25, + "keg_price": null, + "preserve_price": null, + "other_process_price": 200, + "space": 1, + "spring_growth": 7, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": null, + "summer_growth_water": null, + "summer_regrowth": null, + "summer_coopmaster": null, + "fall_growth": null, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 7, + "greenhouse_regrowth": null, + "ginger_island": 7, + "ginger_island_water": null, + "ginger_island_regrowth": null + }, + "Carrot": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Veggie", + "base_price": 35, + "avg_price": 52.375, + "keg_price": 78, + "preserve_price": 120, + "other_process_price": null, + "space": 1, + "spring_growth": 3, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": null, + "summer_growth_water": null, + "summer_regrowth": null, + "summer_coopmaster": null, + "fall_growth": null, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 3, + "greenhouse_regrowth": null, + "ginger_island": 3, + "ginger_island_water": null, + "ginger_island_regrowth": null + }, + "Cauliflower": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Giant, Veggie", + "base_price": 175, + "avg_price": 263.625, + "keg_price": 393, + "preserve_price": 400, + "other_process_price": null, + "space": 1, + "spring_growth": 12, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": null, + "summer_growth_water": null, + "summer_regrowth": null, + "summer_coopmaster": null, + "fall_growth": null, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 12, + "greenhouse_regrowth": null, + "ginger_island": 12, + "ginger_island_water": null, + "ginger_island_regrowth": null + }, + "Coffee Bean": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Special Kegg", + "base_price": 15, + "avg_price": 21.25, + "keg_price": 30, + "preserve_price": null, + "other_process_price": null, + "space": 1, + "spring_growth": 10, + "spring_growth_water": null, + "spring_regrowth": 2.02, + "spring_coopmaster": null, + "summer_growth": 10, + "summer_growth_water": null, + "summer_regrowth": 2.02, + "summer_coopmaster": null, + "fall_growth": null, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 10, + "greenhouse_regrowth": 2.02, + "ginger_island": 10, + "ginger_island_water": null, + "ginger_island_regrowth": 2.02 + }, + "Garlic": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Veggie", + "base_price": 60, + "avg_price": 90.5, + "keg_price": 135, + "preserve_price": 170, + "other_process_price": null, + "space": 1, + "spring_growth": 4, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": null, + "summer_growth_water": null, + "summer_regrowth": null, + "summer_coopmaster": null, + "fall_growth": null, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": null, + "greenhouse_regrowth": null, + "ginger_island": null, + "ginger_island_water": null, + "ginger_island_regrowth": null + }, + "Green Bean": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Veggie", + "base_price": 40, + "avg_price": 60.375, + "keg_price": 90, + "preserve_price": 130, + "other_process_price": null, + "space": 1, + "spring_growth": 10, + "spring_growth_water": null, + "spring_regrowth": 3, + "spring_coopmaster": null, + "summer_growth": null, + "summer_growth_water": null, + "summer_regrowth": null, + "summer_coopmaster": null, + "fall_growth": null, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 10, + "greenhouse_regrowth": 3, + "ginger_island": 10, + "ginger_island_water": null, + "ginger_island_regrowth": 3 + }, + "Kale": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Veggie", + "base_price": 110, + "avg_price": 165.75, + "keg_price": 247, + "preserve_price": 270, + "other_process_price": null, + "space": 1, + "spring_growth": 6, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": null, + "summer_growth_water": null, + "summer_regrowth": null, + "summer_coopmaster": null, + "fall_growth": null, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 6, + "greenhouse_regrowth": null, + "ginger_island": 6, + "ginger_island_water": null, + "ginger_island_regrowth": null + }, + "Parsnip": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Veggie", + "base_price": 35, + "avg_price": 52.375, + "keg_price": 78, + "preserve_price": 120, + "other_process_price": null, + "space": 1, + "spring_growth": 4, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": null, + "summer_growth_water": null, + "summer_regrowth": null, + "summer_coopmaster": null, + "fall_growth": null, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 4, + "greenhouse_regrowth": null, + "ginger_island": 4, + "ginger_island_water": null, + "ginger_island_regrowth": null + }, + "Potato": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Veggie", + "base_price": 80, + "avg_price": 120.75, + "keg_price": 180, + "preserve_price": 210, + "other_process_price": null, + "space": 1, + "spring_growth": 6, + "spring_growth_water": null, + "spring_regrowth": 0.2083333333, + "spring_coopmaster": null, + "summer_growth": null, + "summer_growth_water": null, + "summer_regrowth": null, + "summer_coopmaster": null, + "fall_growth": null, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 6, + "greenhouse_regrowth": 0.2083333333, + "ginger_island": 6, + "ginger_island_water": null, + "ginger_island_regrowth": 0.2083333333 + }, + "Rhubarb": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Fruit", + "base_price": 220, + "avg_price": 332, + "keg_price": 660, + "preserve_price": 490, + "other_process_price": 335, + "space": 1, + "spring_growth": 13, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": null, + "summer_growth_water": null, + "summer_regrowth": null, + "summer_coopmaster": null, + "fall_growth": null, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 13, + "greenhouse_regrowth": null, + "ginger_island": 13, + "ginger_island_water": null, + "ginger_island_regrowth": null + }, + "Strawberry": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Fruit", + "base_price": 120, + "avg_price": 181.125, + "keg_price": 360, + "preserve_price": 290, + "other_process_price": 185, + "space": 1, + "spring_growth": 8, + "spring_growth_water": null, + "spring_regrowth": 4, + "spring_coopmaster": null, + "summer_growth": null, + "summer_growth_water": null, + "summer_regrowth": null, + "summer_coopmaster": null, + "fall_growth": null, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 8, + "greenhouse_regrowth": 4, + "ginger_island": 8, + "ginger_island_water": null, + "ginger_island_regrowth": 4 + }, + "Tulip": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Flower", + "base_price": 30, + "avg_price": 45, + "keg_price": null, + "preserve_price": null, + "other_process_price": 160, + "space": 1, + "spring_growth": 6, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": null, + "summer_growth_water": null, + "summer_regrowth": null, + "summer_coopmaster": null, + "fall_growth": null, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 6, + "greenhouse_regrowth": null, + "ginger_island": 6, + "ginger_island_water": null, + "ginger_island_regrowth": null + }, + "Unmilled Rice": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Veggie", + "base_price": 30, + "avg_price": 45, + "keg_price": 67, + "preserve_price": 110, + "other_process_price": null, + "space": 1, + "spring_growth": 8, + "spring_growth_water": 6, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": null, + "summer_growth_water": null, + "summer_regrowth": null, + "summer_coopmaster": null, + "fall_growth": null, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 8, + "greenhouse_regrowth": null, + "ginger_island": 8, + "ginger_island_water": 6, + "ginger_island_regrowth": null + }, + "Blueberry": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Fruit", + "base_price": 50, + "avg_price": 75.25, + "keg_price": 150, + "preserve_price": 150, + "other_process_price": 80, + "space": 1, + "spring_growth": null, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": 13, + "summer_growth_water": null, + "summer_regrowth": 4.02, + "summer_coopmaster": null, + "fall_growth": null, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 13, + "greenhouse_regrowth": 4.02, + "ginger_island": 13, + "ginger_island_water": null, + "ginger_island_regrowth": 4.02 + }, + "Corn": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Veggie", + "base_price": 50, + "avg_price": 75.25, + "keg_price": 112, + "preserve_price": 150, + "other_process_price": 100, + "space": 1, + "spring_growth": null, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": 14, + "summer_growth_water": null, + "summer_regrowth": 4, + "summer_coopmaster": null, + "fall_growth": null, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 14, + "greenhouse_regrowth": 4, + "ginger_island": 14, + "ginger_island_water": null, + "ginger_island_regrowth": 4 + }, + "Hops": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Special Kegg", + "base_price": 25, + "avg_price": 37.375, + "keg_price": 300, + "preserve_price": 100, + "other_process_price": null, + "space": 1, + "spring_growth": null, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": 11, + "summer_growth_water": null, + "summer_regrowth": 1, + "summer_coopmaster": null, + "fall_growth": null, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 11, + "greenhouse_regrowth": 1, + "ginger_island": 11, + "ginger_island_water": null, + "ginger_island_regrowth": 1 + }, + "Hot Pepper": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Fruit", + "base_price": 40, + "avg_price": 60.375, + "keg_price": 120, + "preserve_price": 130, + "other_process_price": 65, + "space": 1, + "spring_growth": null, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": 5, + "summer_growth_water": null, + "summer_regrowth": 3, + "summer_coopmaster": null, + "fall_growth": null, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 5, + "greenhouse_regrowth": 3, + "ginger_island": 5, + "ginger_island_water": null, + "ginger_island_regrowth": 3 + }, + "Melon": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Fruit", + "base_price": 250, + "avg_price": 377.125, + "keg_price": 750, + "preserve_price": 550, + "other_process_price": 380, + "space": 1, + "spring_growth": null, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": 12, + "summer_growth_water": null, + "summer_regrowth": null, + "summer_coopmaster": null, + "fall_growth": null, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 12, + "greenhouse_regrowth": null, + "ginger_island": 12, + "ginger_island_water": null, + "ginger_island_regrowth": null + }, + "Poppy": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Flower", + "base_price": 140, + "avg_price": 211.25, + "keg_price": null, + "preserve_price": null, + "other_process_price": 380, + "space": 1, + "spring_growth": null, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": 7, + "summer_growth_water": null, + "summer_regrowth": null, + "summer_coopmaster": null, + "fall_growth": null, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 7, + "greenhouse_regrowth": null, + "ginger_island": 7, + "ginger_island_water": null, + "ginger_island_regrowth": null + }, + "Radish": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Veggie", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 1, + "spring_growth": null, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": 6, + "summer_growth_water": null, + "summer_regrowth": null, + "summer_coopmaster": null, + "fall_growth": null, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 6, + "greenhouse_regrowth": null, + "ginger_island": 6, + "ginger_island_water": null, + "ginger_island_regrowth": null + }, + "Red Cabbage": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Veggie", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 1, + "spring_growth": null, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": 9, + "summer_growth_water": null, + "summer_regrowth": null, + "summer_coopmaster": null, + "fall_growth": null, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 9, + "greenhouse_regrowth": null, + "ginger_island": 9, + "ginger_island_water": null, + "ginger_island_regrowth": null + }, + "Starfruit": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Fruit", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 1, + "spring_growth": null, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": 13, + "summer_growth_water": null, + "summer_regrowth": null, + "summer_coopmaster": null, + "fall_growth": null, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 13, + "greenhouse_regrowth": null, + "ginger_island": 13, + "ginger_island_water": null, + "ginger_island_regrowth": null + }, + "Sumer Spangle": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Flower", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 1, + "spring_growth": null, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": 8, + "summer_growth_water": null, + "summer_regrowth": null, + "summer_coopmaster": null, + "fall_growth": null, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 8, + "greenhouse_regrowth": null, + "ginger_island": 8, + "ginger_island_water": null, + "ginger_island_regrowth": null + }, + "Summer Squash": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Veggie", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 1, + "spring_growth": null, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": 6, + "summer_growth_water": null, + "summer_regrowth": 3, + "summer_coopmaster": null, + "fall_growth": null, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 6, + "greenhouse_regrowth": 3, + "ginger_island": 6, + "ginger_island_water": null, + "ginger_island_regrowth": 3 + }, + "Sunflower": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Flower", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 1, + "spring_growth": null, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": 8, + "summer_growth_water": null, + "summer_regrowth": null, + "summer_coopmaster": null, + "fall_growth": null, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 8, + "greenhouse_regrowth": null, + "ginger_island": 8, + "ginger_island_water": null, + "ginger_island_regrowth": null + }, + "Tomato": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Veggie", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 1, + "spring_growth": null, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": 11, + "summer_growth_water": null, + "summer_regrowth": 4, + "summer_coopmaster": null, + "fall_growth": null, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 11, + "greenhouse_regrowth": 4, + "ginger_island": 11, + "ginger_island_water": null, + "ginger_island_regrowth": 4 + }, + "Wheat": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Special Kegg", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 1, + "spring_growth": null, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": 4, + "summer_growth_water": null, + "summer_regrowth": null, + "summer_coopmaster": null, + "fall_growth": null, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 4, + "greenhouse_regrowth": null, + "ginger_island": 4, + "ginger_island_water": null, + "ginger_island_regrowth": null + }, + "Amaranth": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Veggie", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 1, + "spring_growth": null, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": null, + "summer_growth_water": null, + "summer_regrowth": null, + "summer_coopmaster": null, + "fall_growth": 7, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 7, + "greenhouse_regrowth": null, + "ginger_island": 7, + "ginger_island_water": null, + "ginger_island_regrowth": null + }, + "Artichoke": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Veggie", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 1, + "spring_growth": null, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": null, + "summer_growth_water": null, + "summer_regrowth": null, + "summer_coopmaster": null, + "fall_growth": 8, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 8, + "greenhouse_regrowth": null, + "ginger_island": 8, + "ginger_island_water": null, + "ginger_island_regrowth": null + }, + "Beet": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Veggie", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 1, + "spring_growth": null, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": null, + "summer_growth_water": null, + "summer_regrowth": null, + "summer_coopmaster": null, + "fall_growth": 6, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 6, + "greenhouse_regrowth": null, + "ginger_island": 6, + "ginger_island_water": null, + "ginger_island_regrowth": null + }, + "Bok Choy": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Veggie", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 1, + "spring_growth": null, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": null, + "summer_growth_water": null, + "summer_regrowth": null, + "summer_coopmaster": null, + "fall_growth": 4, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 4, + "greenhouse_regrowth": null, + "ginger_island": 4, + "ginger_island_water": null, + "ginger_island_regrowth": null + }, + "Broccoli": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Veggie", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 1, + "spring_growth": null, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": null, + "summer_growth_water": null, + "summer_regrowth": null, + "summer_coopmaster": null, + "fall_growth": 8, + "fall_growth_water": null, + "fall_regrowth": 4, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 8, + "greenhouse_regrowth": 4, + "ginger_island": 8, + "ginger_island_water": null, + "ginger_island_regrowth": 4 + }, + "Cranberries": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Fruit", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 1, + "spring_growth": null, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": null, + "summer_growth_water": null, + "summer_regrowth": null, + "summer_coopmaster": null, + "fall_growth": 7, + "fall_growth_water": null, + "fall_regrowth": 5, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 7, + "greenhouse_regrowth": 5, + "ginger_island": 7, + "ginger_island_water": null, + "ginger_island_regrowth": 5 + }, + "Eggplant": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Veggie", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 1, + "spring_growth": null, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": null, + "summer_growth_water": null, + "summer_regrowth": null, + "summer_coopmaster": null, + "fall_growth": 5, + "fall_growth_water": null, + "fall_regrowth": 5, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 5, + "greenhouse_regrowth": 5, + "ginger_island": 5, + "ginger_island_water": null, + "ginger_island_regrowth": 5 + }, + "Fairy rose": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Flower", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 1, + "spring_growth": null, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": null, + "summer_growth_water": null, + "summer_regrowth": null, + "summer_coopmaster": null, + "fall_growth": 12, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 12, + "greenhouse_regrowth": null, + "ginger_island": 12, + "ginger_island_water": null, + "ginger_island_regrowth": null + }, + "Grape": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Fruit", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 1, + "spring_growth": null, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": null, + "summer_growth_water": null, + "summer_regrowth": null, + "summer_coopmaster": null, + "fall_growth": 10, + "fall_growth_water": null, + "fall_regrowth": 3, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 10, + "greenhouse_regrowth": 3, + "ginger_island": 10, + "ginger_island_water": null, + "ginger_island_regrowth": 3 + }, + "Pumpkin": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Veggie", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 1, + "spring_growth": null, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": null, + "summer_growth_water": null, + "summer_regrowth": null, + "summer_coopmaster": null, + "fall_growth": 13, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 13, + "greenhouse_regrowth": null, + "ginger_island": 13, + "ginger_island_water": null, + "ginger_island_regrowth": null + }, + "Yam": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Veggie", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 1, + "spring_growth": null, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": null, + "summer_growth_water": null, + "summer_regrowth": null, + "summer_coopmaster": null, + "fall_growth": 10, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 10, + "greenhouse_regrowth": null, + "ginger_island": 10, + "ginger_island_water": null, + "ginger_island_regrowth": null + }, + "Powdermelon": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Fruit", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 1, + "spring_growth": null, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": null, + "summer_growth_water": null, + "summer_regrowth": null, + "summer_coopmaster": null, + "fall_growth": null, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": 7, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 7, + "greenhouse_regrowth": null, + "ginger_island": 7, + "ginger_island_water": null, + "ginger_island_regrowth": null + }, + "Ancient Fruit": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Fruit", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 1, + "spring_growth": 28, + "spring_growth_water": null, + "spring_regrowth": 7, + "spring_coopmaster": null, + "summer_growth": 28, + "summer_growth_water": null, + "summer_regrowth": 7, + "summer_coopmaster": null, + "fall_growth": 28, + "fall_growth_water": null, + "fall_regrowth": 7, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 28, + "greenhouse_regrowth": 7, + "ginger_island": 28, + "ginger_island_water": null, + "ginger_island_regrowth": 7 + }, + "Cactus Fruit": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Fruit", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 1, + "spring_growth": null, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": null, + "summer_growth_water": null, + "summer_regrowth": null, + "summer_coopmaster": null, + "fall_growth": null, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 12, + "greenhouse_regrowth": 3, + "ginger_island": 12, + "ginger_island_water": null, + "ginger_island_regrowth": 3 + }, + "Pineapple": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Fruit", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 1, + "spring_growth": null, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": 14, + "summer_growth_water": null, + "summer_regrowth": 7, + "summer_coopmaster": null, + "fall_growth": null, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 14, + "greenhouse_regrowth": 7, + "ginger_island": 14, + "ginger_island_water": null, + "ginger_island_regrowth": 7 + }, + "Taro Root": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Preserve Only", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 1, + "spring_growth": null, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": 10, + "summer_growth_water": 7, + "summer_regrowth": null, + "summer_coopmaster": null, + "fall_growth": null, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 10, + "greenhouse_regrowth": null, + "ginger_island": 10, + "ginger_island_water": 7, + "ginger_island_regrowth": null + }, + "Sweet Gem Berry": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "No Process", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 1, + "spring_growth": null, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": null, + "summer_growth_water": null, + "summer_regrowth": null, + "summer_coopmaster": null, + "fall_growth": 24, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": null, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": null, + "greenhouse_regrowth": null, + "ginger_island": null, + "ginger_island_water": null, + "ginger_island_regrowth": null + }, + "Tea Leaves": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Special Kegg", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 1, + "spring_growth": 20, + "spring_growth_water": null, + "spring_regrowth": 1, + "spring_coopmaster": null, + "summer_growth": 20, + "summer_growth_water": null, + "summer_regrowth": 1, + "summer_coopmaster": null, + "fall_growth": 20, + "fall_growth_water": null, + "fall_regrowth": 1, + "fall_coopmaster": null, + "winter_growth": 20, + "winter_growth_water": null, + "winter_regrowth": 1, + "winter_coopmaster": null, + "greenhouse_growth": 20, + "greenhouse_regrowth": 1, + "ginger_island": 20, + "ginger_island_water": null, + "ginger_island_regrowth": 1 + }, + "Fiber": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "No Process", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 1, + "spring_growth": 7, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": 7, + "summer_growth_water": null, + "summer_regrowth": null, + "summer_coopmaster": null, + "fall_growth": 7, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": 7, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 7, + "greenhouse_regrowth": null, + "ginger_island": 7, + "ginger_island_water": null, + "ginger_island_regrowth": null + }, + "Wild Seeds": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Preserve Only", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 1, + "spring_growth": 7, + "spring_growth_water": null, + "spring_regrowth": null, + "spring_coopmaster": null, + "summer_growth": 7, + "summer_growth_water": null, + "summer_regrowth": null, + "summer_coopmaster": null, + "fall_growth": 7, + "fall_growth_water": null, + "fall_regrowth": null, + "fall_coopmaster": null, + "winter_growth": 7, + "winter_growth_water": null, + "winter_regrowth": null, + "winter_coopmaster": null, + "greenhouse_growth": 7, + "greenhouse_regrowth": null, + "ginger_island": 7, + "ginger_island_water": null, + "ginger_island_regrowth": null + }, + "Chicken": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Coop", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 1.5, + "spring_growth": 6, + "spring_growth_water": null, + "spring_regrowth": 1, + "spring_coopmaster": 3, + "summer_growth": 6, + "summer_growth_water": null, + "summer_regrowth": 1, + "summer_coopmaster": 3, + "fall_growth": 6, + "fall_growth_water": null, + "fall_regrowth": 1, + "fall_coopmaster": 3, + "winter_growth": 6, + "winter_growth_water": null, + "winter_regrowth": 1, + "winter_coopmaster": 3, + "greenhouse_growth": null, + "greenhouse_regrowth": null, + "ginger_island": null, + "ginger_island_water": null, + "ginger_island_regrowth": null + }, + "Void Chicken": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Coop", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 1.5, + "spring_growth": 6, + "spring_growth_water": null, + "spring_regrowth": 1, + "spring_coopmaster": 3, + "summer_growth": 6, + "summer_growth_water": null, + "summer_regrowth": 1, + "summer_coopmaster": 3, + "fall_growth": 6, + "fall_growth_water": null, + "fall_regrowth": 1, + "fall_coopmaster": 3, + "winter_growth": 6, + "winter_growth_water": null, + "winter_regrowth": 1, + "winter_coopmaster": 3, + "greenhouse_growth": null, + "greenhouse_regrowth": null, + "ginger_island": null, + "ginger_island_water": null, + "ginger_island_regrowth": null + }, + "Duck": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Coop", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 1.5, + "spring_growth": 6, + "spring_growth_water": null, + "spring_regrowth": 2, + "spring_coopmaster": 3, + "summer_growth": 6, + "summer_growth_water": null, + "summer_regrowth": 2, + "summer_coopmaster": 3, + "fall_growth": 6, + "fall_growth_water": null, + "fall_regrowth": 2, + "fall_coopmaster": 3, + "winter_growth": 6, + "winter_growth_water": null, + "winter_regrowth": 2, + "winter_coopmaster": 3, + "greenhouse_growth": null, + "greenhouse_regrowth": null, + "ginger_island": null, + "ginger_island_water": null, + "ginger_island_regrowth": null + }, + "Dinosaur": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Coop", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 1.5, + "spring_growth": 11.5, + "spring_growth_water": null, + "spring_regrowth": 7, + "spring_coopmaster": 6, + "summer_growth": 11.5, + "summer_growth_water": null, + "summer_regrowth": 7, + "summer_coopmaster": 6, + "fall_growth": 11.5, + "fall_growth_water": null, + "fall_regrowth": 7, + "fall_coopmaster": 6, + "winter_growth": 11.5, + "winter_growth_water": null, + "winter_regrowth": 7, + "winter_coopmaster": 6, + "greenhouse_growth": null, + "greenhouse_regrowth": null, + "ginger_island": null, + "ginger_island_water": null, + "ginger_island_regrowth": null + }, + "Golden Chicken": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Coop", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 1.5, + "spring_growth": 6, + "spring_growth_water": null, + "spring_regrowth": 1, + "spring_coopmaster": 3, + "summer_growth": 6, + "summer_growth_water": null, + "summer_regrowth": 1, + "summer_coopmaster": 3, + "fall_growth": 6, + "fall_growth_water": null, + "fall_regrowth": 1, + "fall_coopmaster": 3, + "winter_growth": 6, + "winter_growth_water": null, + "winter_regrowth": 1, + "winter_coopmaster": 3, + "greenhouse_growth": null, + "greenhouse_regrowth": null, + "ginger_island": null, + "ginger_island_water": null, + "ginger_island_regrowth": null + }, + "Rabbit": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Coop", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 1.5, + "spring_growth": 6, + "spring_growth_water": null, + "spring_regrowth": 4, + "spring_coopmaster": null, + "summer_growth": 6, + "summer_growth_water": null, + "summer_regrowth": 4, + "summer_coopmaster": null, + "fall_growth": 6, + "fall_growth_water": null, + "fall_regrowth": 4, + "fall_coopmaster": null, + "winter_growth": 6, + "winter_growth_water": null, + "winter_regrowth": 4, + "winter_coopmaster": null, + "greenhouse_growth": null, + "greenhouse_regrowth": null, + "ginger_island": null, + "ginger_island_water": null, + "ginger_island_regrowth": null + }, + "Cow": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Barn", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 2.333333333, + "spring_growth": 5, + "spring_growth_water": null, + "spring_regrowth": 1, + "spring_coopmaster": null, + "summer_growth": 5, + "summer_growth_water": null, + "summer_regrowth": 1, + "summer_coopmaster": null, + "fall_growth": 5, + "fall_growth_water": null, + "fall_regrowth": 1, + "fall_coopmaster": null, + "winter_growth": 5, + "winter_growth_water": null, + "winter_regrowth": 1, + "winter_coopmaster": null, + "greenhouse_growth": null, + "greenhouse_regrowth": null, + "ginger_island": null, + "ginger_island_water": null, + "ginger_island_regrowth": null + }, + "Ostrich": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Barn", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 2.333333333, + "spring_growth": 9.5, + "spring_growth_water": null, + "spring_regrowth": 7, + "spring_coopmaster": 5, + "summer_growth": 9.5, + "summer_growth_water": null, + "summer_regrowth": 7, + "summer_coopmaster": 5, + "fall_growth": 9.5, + "fall_growth_water": null, + "fall_regrowth": 7, + "fall_coopmaster": 5, + "winter_growth": 9.5, + "winter_growth_water": null, + "winter_regrowth": 7, + "winter_coopmaster": 5, + "greenhouse_growth": null, + "greenhouse_regrowth": null, + "ginger_island": null, + "ginger_island_water": null, + "ginger_island_regrowth": null + }, + "Goat": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Barn", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 2.333333333, + "spring_growth": 5, + "spring_growth_water": null, + "spring_regrowth": 2, + "spring_coopmaster": null, + "summer_growth": 5, + "summer_growth_water": null, + "summer_regrowth": 2, + "summer_coopmaster": null, + "fall_growth": 5, + "fall_growth_water": null, + "fall_regrowth": 2, + "fall_coopmaster": null, + "winter_growth": 5, + "winter_growth_water": null, + "winter_regrowth": 2, + "winter_coopmaster": null, + "greenhouse_growth": null, + "greenhouse_regrowth": null, + "ginger_island": null, + "ginger_island_water": null, + "ginger_island_regrowth": null + }, + "Sheep": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Barn", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 2.333333333, + "spring_growth": 4, + "spring_growth_water": null, + "spring_regrowth": 2, + "spring_coopmaster": null, + "summer_growth": 4, + "summer_growth_water": null, + "summer_regrowth": 2, + "summer_coopmaster": null, + "fall_growth": 4, + "fall_growth_water": null, + "fall_regrowth": 2, + "fall_coopmaster": null, + "winter_growth": 4, + "winter_growth_water": null, + "winter_regrowth": 2, + "winter_coopmaster": null, + "greenhouse_growth": null, + "greenhouse_regrowth": null, + "ginger_island": null, + "ginger_island_water": null, + "ginger_island_regrowth": null + }, + "Pig": { + "type_barn_coop_flower_special_kegg_preserve_only_fishing_pond_no_process_giant_fruit_veggie": "Barn", + "base_price": null, + "avg_price": null, + "keg_price": null, + "preserve_price": null, + "other_process_price": null, + "space": 2.333333333, + "spring_growth": 10, + "spring_growth_water": null, + "spring_regrowth": 1.1, + "spring_coopmaster": null, + "summer_growth": 10, + "summer_growth_water": null, + "summer_regrowth": 1.1, + "summer_coopmaster": null, + "fall_growth": 10, + "fall_growth_water": null, + "fall_regrowth": 1.1, + "fall_coopmaster": null, + "winter_growth": 10, + "winter_growth_water": null, + "winter_regrowth": 1.1, + "winter_coopmaster": null, + "greenhouse_growth": null, + "greenhouse_regrowth": null, + "ginger_island": null, + "ginger_island_water": null, + "ginger_island_regrowth": null + } +} \ No newline at end of file From 978bcabffdf0468820383c93a61c083431d4eedf Mon Sep 17 00:00:00 2001 From: dameoffensive-cloud Date: Sun, 8 Feb 2026 09:51:30 -0500 Subject: [PATCH 002/171] Add files via upload --- config.json | 2289 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 1355 insertions(+), 934 deletions(-) diff --git a/config.json b/config.json index dd38cfb..af60bb4 100644 --- a/config.json +++ b/config.json @@ -1,934 +1,1355 @@ -{ - "crops": [ - { - "buy": 70, - "harvest": {}, - "id": "amaranth", - "index": 299, - "name": "Amaranth", - "scythe": true, - "seasons": [ - "fall" - ], - "sell": 150, - "stages": [ - 1, - 2, - 2, - 2 - ] - }, - { - "buy": 700, - "harvest": {}, - "id": "ancient_fruit", - "index": 499, - "name": "Ancient Fruit", - "regrow": 7, - "seasons": [ - "spring", - "summer", - "fall" - ], - "sell": 550, - "stages": [ - 2, - 7, - 7, - 7, - 5 - ] - }, - { - "buy": 30, - "harvest": {}, - "id": "artichoke", - "index": 489, - "name": "Artichoke", - "seasons": [ - "fall" - ], - "sell": 160, - "stages": [ - 2, - 2, - 1, - 2, - 1 - ] - }, - { - "buy": 20, - "harvest": {}, - "id": "beet", - "index": 494, - "name": "Beet", - "seasons": [ - "fall" - ], - "sell": 100, - "stages": [ - 1, - 1, - 2, - 2 - ] - }, - { - "buy": 30, - "harvest": {}, - "id": "blue_jazz", - "index": 429, - "name": "Blue Jazz", - "seasons": [ - "spring" - ], - "sell": 50, - "stages": [ - 1, - 2, - 2, - 2 - ] - }, - { - "buy": 80, - "harvest": { - "extra_chance": 0.02, - "level_increase": 5, - "max": 5, - "min": 3 - }, - "id": "blueberry", - "index": 481, - "name": "Blueberry", - "regrow": 4, - "seasons": [ - "summer" - ], - "sell": 50, - "stages": [ - 1, - 3, - 3, - 4, - 2 - ] - }, - { - "buy": 50, - "harvest": {}, - "id": "bok_choy", - "index": 491, - "name": "Bok Choy", - "seasons": [ - "fall" - ], - "sell": 80, - "stages": [ - 1, - 1, - 1, - 1 - ] - }, - { - "buy": 80, - "harvest": {}, - "id": "cauliflower", - "index": 474, - "name": "Cauliflower", - "seasons": [ - "spring" - ], - "sell": 175, - "stages": [ - 1, - 2, - 4, - 4, - 1 - ] - }, - { - "buy": 30, - "harvest": { - "extra_chance": 0.02, - "level_increase": 10, - "max": 6, - "min": 4 - }, - "id": "coffee_bean", - "index": 433, - "name": "Coffee Bean", - "note": "Sold by Travelling Cart for ~2500g", - "regrow": 2, - "seasons": [ - "spring", - "summer" - ], - "sell": 15, - "stages": [ - 1, - 2, - 2, - 3, - 2 - ] - }, - { - "buy": 150, - "harvest": { - "extra_chance": 0.0, - "level_increase": 5, - "max": 2, - "min": 1 - }, - "id": "corn", - "index": 487, - "name": "Corn", - "regrow": 4, - "seasons": [ - "summer", - "fall" - ], - "sell": 50, - "stages": [ - 2, - 3, - 3, - 3, - 3 - ] - }, - { - "buy": 240, - "harvest": { - "extra_chance": 0.1, - "level_increase": 5, - "max": 6, - "min": 2 - }, - "id": "cranberries", - "index": 493, - "name": "Cranberries", - "regrow": 5, - "seasons": [ - "fall" - ], - "sell": 75, - "stages": [ - 1, - 2, - 1, - 1, - 2 - ] - }, - { - "buy": 20, - "harvest": { - "extra_chance": 0.002, - "level_increase": 10, - "max": 2, - "min": 1 - }, - "id": "eggplant", - "index": 488, - "name": "Eggplant", - "regrow": 5, - "seasons": [ - "fall" - ], - "sell": 60, - "stages": [ - 1, - 1, - 1, - 1, - 1 - ] - }, - { - "buy": 200, - "harvest": {}, - "id": "fairy_rose", - "index": 425, - "name": "Fairy Rose", - "seasons": [ - "fall" - ], - "sell": 290, - "stages": [ - 1, - 4, - 4, - 3 - ] - }, - { - "buy": 40, - "harvest": {}, - "id": "garlic", - "index": 476, - "name": "Garlic", - "seasons": [ - "spring" - ], - "sell": 60, - "stages": [ - 1, - 1, - 1, - 1 - ] - }, - { - "buy": 60, - "harvest": { - "extra_chance": 0.0, - "level_increase": 6, - "max": 2, - "min": 1 - }, - "id": "grape", - "index": 301, - "name": "Grape", - "regrow": 3, - "seasons": [ - "fall" - ], - "sell": 80, - "stages": [ - 1, - 1, - 2, - 3, - 3 - ], - "trellis": true - }, - { - "buy": 60, - "harvest": { - "extra_chance": 0.0, - "level_increase": 6, - "max": 2, - "min": 1 - }, - "id": "green_bean", - "index": 473, - "name": "Green Bean", - "regrow": 3, - "seasons": [ - "spring" - ], - "sell": 40, - "stages": [ - 1, - 1, - 1, - 3, - 4 - ], - "trellis": true - }, - { - "buy": 60, - "harvest": { - "extra_chance": 0.0, - "level_increase": 6, - "max": 2, - "min": 1 - }, - "id": "hops", - "index": 302, - "name": "Hops", - "regrow": 1, - "seasons": [ - "summer" - ], - "sell": 25, - "stages": [ - 1, - 1, - 2, - 3, - 4 - ], - "trellis": true - }, - { - "buy": 40, - "harvest": { - "extra_chance": 0.03, - "level_increase": 5, - "max": 1, - "min": 1 - }, - "id": "hot_pepper", - "index": 482, - "name": "Hot Pepper", - "regrow": 3, - "seasons": [ - "summer" - ], - "sell": 40, - "stages": [ - 1, - 1, - 1, - 1, - 1 - ] - }, - { - "buy": 70, - "harvest": {}, - "id": "kale", - "index": 477, - "name": "Kale", - "scythe": true, - "seasons": [ - "spring" - ], - "sell": 110, - "stages": [ - 1, - 2, - 2, - 1 - ] - }, - { - "buy": 80, - "harvest": {}, - "id": "melon", - "index": 479, - "name": "Melon", - "seasons": [ - "summer" - ], - "sell": 250, - "stages": [ - 1, - 2, - 3, - 3, - 3 - ] - }, - { - "buy": 20, - "harvest": {}, - "id": "parsnip", - "index": 472, - "name": "Parsnip", - "seasons": [ - "spring" - ], - "sell": 35, - "stages": [ - 1, - 1, - 1, - 1 - ] - }, - { - "buy": 100, - "harvest": {}, - "id": "poppy", - "index": 453, - "name": "Poppy", - "seasons": [ - "summer" - ], - "sell": 140, - "stages": [ - 1, - 2, - 2, - 2 - ] - }, - { - "buy": 50, - "harvest": { - "extra_chance": 0.2, - "level_increase": 8, - "max": 2, - "min": 1 - }, - "id": "potato", - "index": 475, - "name": "Potato", - "seasons": [ - "spring" - ], - "sell": 80, - "stages": [ - 1, - 1, - 1, - 2, - 1 - ] - }, - { - "buy": 100, - "harvest": {}, - "id": "pumpkin", - "index": 490, - "name": "Pumpkin", - "seasons": [ - "fall" - ], - "sell": 320, - "stages": [ - 1, - 2, - 3, - 4, - 3 - ] - }, - { - "buy": 40, - "harvest": {}, - "id": "radish", - "index": 484, - "name": "Radish", - "seasons": [ - "summer" - ], - "sell": 90, - "stages": [ - 2, - 1, - 2, - 1 - ] - }, - { - "buy": 100, - "harvest": {}, - "id": "red_cabbage", - "index": 485, - "name": "Red Cabbage", - "seasons": [ - "summer" - ], - "sell": 260, - "stages": [ - 2, - 1, - 2, - 2, - 2 - ] - }, - { - "buy": 100, - "harvest": {}, - "id": "rhubarb", - "index": 478, - "name": "Rhubarb", - "seasons": [ - "spring" - ], - "sell": 220, - "stages": [ - 2, - 2, - 2, - 3, - 4 - ] - }, - { - "buy": 400, - "harvest": {}, - "id": "starfruit", - "index": 486, - "name": "Starfruit", - "seasons": [ - "summer" - ], - "sell": 750, - "stages": [ - 2, - 3, - 2, - 3, - 3 - ] - }, - { - "buy": 100, - "harvest": { - "extra_chance": 0.02, - "level_increase": 5, - "max": 1, - "min": 1 - }, - "id": "strawberry", - "index": 745, - "name": "Strawberry", - "regrow": 4, - "seasons": [ - "spring" - ], - "sell": 120, - "stages": [ - 1, - 1, - 2, - 2, - 2 - ] - }, - { - "buy": 50, - "harvest": {}, - "id": "summer_spangle", - "index": 455, - "name": "Summer Spangle", - "seasons": [ - "summer" - ], - "sell": 90, - "stages": [ - 1, - 2, - 3, - 2 - ] - }, - { - "buy": 125, - "harvest": {}, - "id": "sunflower", - "index": 431, - "name": "Sunflower", - "note": "Cheapest at JojaMart", - "seasons": [ - "summer", - "fall" - ], - "sell": 80, - "stages": [ - 1, - 2, - 3, - 2 - ] - }, - { - "buy": 1000, - "harvest": {}, - "id": "sweet_gem_berry", - "index": 347, - "name": "Sweet Gem Berry", - "seasons": [ - "fall" - ], - "sell": 3000, - "stages": [ - 2, - 4, - 6, - 6, - 6 - ] - }, - { - "buy": 50, - "harvest": { - "extra_chance": 0.05, - "level_increase": 6, - "max": 1, - "min": 1 - }, - "id": "tomato", - "index": 480, - "name": "Tomato", - "regrow": 4, - "seasons": [ - "summer" - ], - "sell": 60, - "stages": [ - 2, - 2, - 2, - 2, - 3 - ] - }, - { - "buy": 20, - "harvest": {}, - "id": "tulip", - "index": 427, - "name": "Tulip", - "seasons": [ - "spring" - ], - "sell": 30, - "stages": [ - 1, - 1, - 2, - 2 - ] - }, - { - "buy": 10, - "harvest": {}, - "id": "wheat", - "index": 483, - "name": "Wheat", - "scythe": true, - "seasons": [ - "summer", - "fall" - ], - "sell": 25, - "stages": [ - 1, - 1, - 1, - 1 - ] - }, - { - "buy": 60, - "harvest": {}, - "id": "yam", - "index": 492, - "name": "Yam", - "seasons": [ - "fall" - ], - "sell": 160, - "stages": [ - 1, - 3, - 3, - 3 - ] - } - ], - "fertilizer": [ - { - "buy": 0, - "id": "none", - "name": "None" - }, - { - "buy": 100, - "id": "basic_fertilizer", - "name": "Basic Fertilizer" - }, - { - "buy": 150, - "id": "quality_fertilizer", - "name": "Quality Fertilizer" - }, - { - "buy": 100, - "growth_rate": 0.1, - "id": "speed_gro", - "name": "Speed-Gro" - }, - { - "buy": 150, - "growth_rate": 0.25, - "id": "delux_speed_gro", - "name": "Delux Speed-Gro" - } - ], - "events": { - "spring": [ - { - "day": 4, - "name": "Kent" - }, - { - "day": 7, - "name": "Lewis" - }, - { - "day": 10, - "name": "Vincent" - }, - { - "day": 13, - "name": "Egg Festival", - "festival": true - }, - { - "day": 14, - "name": "Haley" - }, - { - "day": 18, - "name": "Pam" - }, - { - "day": 20, - "name": "Shane" - }, - { - "day": 24, - "name": "Flower Dance", - "festival": true - }, - { - "day": 26, - "name": "Pierre" - }, - { - "day": 27, - "name": "Emily" - } - ], - "summer": [ - { - "day": 4, - "name": "Jas" - }, - { - "day": 8, - "name": "Gus" - }, - { - "day": 10, - "name": "Maru" - }, - { - "day": 11, - "name": "Luau", - "festival": true - }, - { - "day": 13, - "name": "Alex" - }, - { - "day": 17, - "name": "Sam" - }, - { - "day": 19, - "name": "Demetrius" - }, - { - "day": 22, - "name": "Dwarf" - }, - { - "day": 24, - "name": "Willy" - }, - { - "day": 28, - "name": "Dance of the Moonlight Jellies", - "festival": true - } - ], - "fall": [ - { - "day": 2, - "name": "Penny" - }, - { - "day": 5, - "name": "Elliot" - }, - { - "day": 11, - "name": "Jodi" - }, - { - "day": 13, - "name": "Abigail" - }, - { - "day": 15, - "name": "Sandy" - }, - { - "day": 16, - "name": "Stardew Valley Fair", - "festival": true - }, - { - "day": 18, - "name": "Marnie" - }, - { - "day": 21, - "name": "Robin" - }, - { - "day": 24, - "name": "George" - }, - { - "day": 27, - "name": "Spirit's Eve", - "festival": true - } - ], - "winter": [ - { - "day": 1, - "name": "Krobus" - }, - { - "day": 3, - "name": "Linus" - }, - { - "day": 7, - "name": "Caroline" - }, - { - "day": 8, - "name": "Festival of Ice", - "festival": true - }, - { - "day": 10, - "name": "Sebastian" - }, - { - "day": 14, - "name": "Harvey" - }, - { - "day": 17, - "name": "Wizard" - }, - { - "day": 20, - "name": "Evelyn" - }, - { - "day": 23, - "name": "Leah" - }, - { - "day": 25, - "name": "Feast of the Winter Star", - "festival": true - }, - { - "day": 26, - "name": "Clint" - } - ] - } -} \ No newline at end of file +{ + "crops": [ + { + "buy": 70, + "harvest": {}, + "id": "amaranth", + "index": 299, + "name": "Amaranth", + "scythe": true, + "seasons": [ + "fall" + ], + "sell": 150, + "stages": [ + 1, + 2, + 2, + 2 + ], + "extra": { + "Base Price": 150.0, + "Avg Price": 210.0, + "Keg Price": null, + "Preserve Price": 370.0, + "Spring": null, + "Summer": null, + "Fall": 7.0, + "Winter": null, + "Greenhouse": 7.0, + "Ginger Island": 7.0 + } + }, + { + "buy": 700, + "harvest": {}, + "id": "ancient_fruit", + "index": 499, + "name": "Ancient Fruit", + "regrow": 7, + "seasons": [ + "spring", + "summer", + "fall" + ], + "sell": 550, + "stages": [ + 2, + 7, + 7, + 7, + 5 + ], + "extra": { + "Base Price": 550.0, + "Avg Price": 770.0, + "Keg Price": 2310.0, + "Preserve Price": 1310.0, + "Spring": 28.0, + "Summer": 28.0, + "Fall": 28.0, + "Winter": null, + "Greenhouse": 28.0, + "Ginger Island": 28.0 + } + }, + { + "buy": 30, + "harvest": {}, + "id": "artichoke", + "index": 489, + "name": "Artichoke", + "seasons": [ + "fall" + ], + "sell": 160, + "stages": [ + 2, + 2, + 1, + 2, + 1 + ], + "extra": { + "Base Price": 160.0, + "Avg Price": 224.0, + "Keg Price": 360.0, + "Preserve Price": 410.0, + "Spring": null, + "Summer": null, + "Fall": 8.0, + "Winter": null, + "Greenhouse": 8.0, + "Ginger Island": 8.0 + } + }, + { + "buy": 20, + "harvest": {}, + "id": "beet", + "index": 494, + "name": "Beet", + "seasons": [ + "fall" + ], + "sell": 100, + "stages": [ + 1, + 1, + 2, + 2 + ], + "extra": { + "Base Price": 100.0, + "Avg Price": 140.0, + "Keg Price": 225.0, + "Preserve Price": 250.0, + "Spring": null, + "Summer": null, + "Fall": 6.0, + "Winter": null, + "Greenhouse": 6.0, + "Ginger Island": 6.0 + } + }, + { + "buy": 30, + "harvest": {}, + "id": "blue_jazz", + "index": 429, + "name": "Blue Jazz", + "seasons": [ + "spring" + ], + "sell": 50, + "stages": [ + 1, + 2, + 2, + 2 + ], + "extra": { + "Base Price": 50.0, + "Avg Price": 70.0, + "Keg Price": null, + "Preserve Price": 170.0, + "Spring": 7.0, + "Summer": null, + "Fall": null, + "Winter": null, + "Greenhouse": 7.0, + "Ginger Island": 7.0 + } + }, + { + "buy": 80, + "harvest": { + "extra_chance": 0.02, + "level_increase": 5, + "max": 5, + "min": 3 + }, + "id": "blueberry", + "index": 481, + "name": "Blueberry", + "regrow": 4, + "seasons": [ + "summer" + ], + "sell": 50, + "stages": [ + 1, + 3, + 3, + 4, + 2 + ], + "extra": { + "Base Price": 50.0, + "Avg Price": 70.0, + "Keg Price": 150.0, + "Preserve Price": 200.0, + "Spring": null, + "Summer": 13.0, + "Fall": null, + "Winter": null, + "Greenhouse": 13.0, + "Ginger Island": 13.0 + } + }, + { + "buy": 50, + "harvest": {}, + "id": "bok_choy", + "index": 491, + "name": "Bok Choy", + "seasons": [ + "fall" + ], + "sell": 80, + "stages": [ + 1, + 1, + 1, + 1 + ], + "extra": { + "Base Price": 80.0, + "Avg Price": 112.0, + "Keg Price": 180.0, + "Preserve Price": 230.0, + "Spring": null, + "Summer": null, + "Fall": 4.0, + "Winter": null, + "Greenhouse": 4.0, + "Ginger Island": 4.0 + } + }, + { + "buy": 80, + "harvest": {}, + "id": "cauliflower", + "index": 474, + "name": "Cauliflower", + "seasons": [ + "spring" + ], + "sell": 175, + "stages": [ + 1, + 2, + 4, + 4, + 1 + ], + "extra": { + "Base Price": 175.0, + "Avg Price": 245.0, + "Keg Price": 393.0, + "Preserve Price": 445.0, + "Spring": 12.0, + "Summer": null, + "Fall": null, + "Winter": null, + "Greenhouse": 12.0, + "Ginger Island": 12.0 + } + }, + { + "buy": 30, + "harvest": { + "extra_chance": 0.02, + "level_increase": 10, + "max": 6, + "min": 4 + }, + "id": "coffee_bean", + "index": 433, + "name": "Coffee Bean", + "note": "Sold by Travelling Cart for ~2500g", + "regrow": 2, + "seasons": [ + "spring", + "summer" + ], + "sell": 15, + "stages": [ + 1, + 2, + 2, + 3, + 2 + ], + "extra": { + "Base Price": 15.0, + "Avg Price": 21.0, + "Keg Price": null, + "Preserve Price": 110.0, + "Spring": 10.0, + "Summer": 10.0, + "Fall": null, + "Winter": null, + "Greenhouse": 10.0, + "Ginger Island": 10.0 + } + }, + { + "buy": 150, + "harvest": { + "extra_chance": 0.0, + "level_increase": 5, + "max": 2, + "min": 1 + }, + "id": "corn", + "index": 487, + "name": "Corn", + "regrow": 4, + "seasons": [ + "summer", + "fall" + ], + "sell": 50, + "stages": [ + 2, + 3, + 3, + 3, + 3 + ], + "extra": { + "Base Price": 50.0, + "Avg Price": 70.0, + "Keg Price": 112.0, + "Preserve Price": 200.0, + "Spring": null, + "Summer": 14.0, + "Fall": 14.0, + "Winter": null, + "Greenhouse": 14.0, + "Ginger Island": 14.0 + } + }, + { + "buy": 240, + "harvest": { + "extra_chance": 0.1, + "level_increase": 5, + "max": 6, + "min": 2 + }, + "id": "cranberries", + "index": 493, + "name": "Cranberries", + "regrow": 5, + "seasons": [ + "fall" + ], + "sell": 75, + "stages": [ + 1, + 2, + 1, + 1, + 2 + ], + "extra": { + "Base Price": 75.0, + "Avg Price": 105.0, + "Keg Price": 225.0, + "Preserve Price": 250.0, + "Spring": null, + "Summer": null, + "Fall": 7.0, + "Winter": null, + "Greenhouse": 7.0, + "Ginger Island": 7.0 + } + }, + { + "buy": 20, + "harvest": { + "extra_chance": 0.002, + "level_increase": 10, + "max": 2, + "min": 1 + }, + "id": "eggplant", + "index": 488, + "name": "Eggplant", + "regrow": 5, + "seasons": [ + "fall" + ], + "sell": 60, + "stages": [ + 1, + 1, + 1, + 1, + 1 + ], + "extra": { + "Base Price": 60.0, + "Avg Price": 84.0, + "Keg Price": 135.0, + "Preserve Price": 210.0, + "Spring": null, + "Summer": null, + "Fall": 5.0, + "Winter": null, + "Greenhouse": 5.0, + "Ginger Island": 5.0 + } + }, + { + "buy": 200, + "harvest": {}, + "id": "fairy_rose", + "index": 425, + "name": "Fairy Rose", + "seasons": [ + "fall" + ], + "sell": 290, + "stages": [ + 1, + 4, + 4, + 3 + ], + "extra": { + "Base Price": 290.0, + "Avg Price": 406.0, + "Keg Price": null, + "Preserve Price": 590.0, + "Spring": null, + "Summer": null, + "Fall": 12.0, + "Winter": null, + "Greenhouse": 12.0, + "Ginger Island": 12.0 + } + }, + { + "buy": 40, + "harvest": {}, + "id": "garlic", + "index": 476, + "name": "Garlic", + "seasons": [ + "spring" + ], + "sell": 60, + "stages": [ + 1, + 1, + 1, + 1 + ], + "extra": { + "Base Price": 60.0, + "Avg Price": 84.0, + "Keg Price": 135.0, + "Preserve Price": 210.0, + "Spring": 4.0, + "Summer": null, + "Fall": null, + "Winter": null, + "Greenhouse": 4.0, + "Ginger Island": 4.0 + } + }, + { + "buy": 60, + "harvest": { + "extra_chance": 0.0, + "level_increase": 5, + "max": 2, + "min": 1 + }, + "id": "grape", + "index": 301, + "name": "Grape", + "regrow": 3, + "seasons": [ + "fall" + ], + "sell": 80, + "stages": [ + 1, + 1, + 2, + 3, + 3 + ], + "trellis": true, + "extra": { + "Base Price": 80.0, + "Avg Price": 112.0, + "Keg Price": 240.0, + "Preserve Price": 330.0, + "Spring": null, + "Summer": null, + "Fall": 10.0, + "Winter": null, + "Greenhouse": 10.0, + "Ginger Island": 10.0 + } + }, + { + "buy": 60, + "harvest": { + "extra_chance": 0.0, + "level_increase": 6, + "max": 2, + "min": 1 + }, + "id": "green_bean", + "index": 473, + "name": "Green Bean", + "regrow": 3, + "seasons": [ + "spring" + ], + "sell": 40, + "stages": [ + 1, + 1, + 1, + 3, + 4 + ], + "trellis": true, + "extra": { + "Base Price": 40.0, + "Avg Price": 56.0, + "Keg Price": 90.0, + "Preserve Price": 190.0, + "Spring": 10.0, + "Summer": null, + "Fall": null, + "Winter": null, + "Greenhouse": 10.0, + "Ginger Island": 10.0 + } + }, + { + "buy": 60, + "harvest": { + "extra_chance": 0.0, + "level_increase": 6, + "max": 2, + "min": 1 + }, + "id": "hops", + "index": 302, + "name": "Hops", + "regrow": 1, + "seasons": [ + "summer" + ], + "sell": 25, + "stages": [ + 1, + 1, + 2, + 3, + 4 + ], + "trellis": true, + "extra": { + "Base Price": 25.0, + "Avg Price": 35.0, + "Keg Price": 420.0, + "Preserve Price": 150.0, + "Spring": null, + "Summer": 11.0, + "Fall": null, + "Winter": null, + "Greenhouse": 11.0, + "Ginger Island": 11.0 + } + }, + { + "buy": 40, + "harvest": { + "extra_chance": 0.03, + "level_increase": 5, + "max": 1, + "min": 1 + }, + "id": "hot_pepper", + "index": 482, + "name": "Hot Pepper", + "regrow": 3, + "seasons": [ + "summer" + ], + "sell": 40, + "stages": [ + 1, + 1, + 1, + 1, + 1 + ], + "extra": { + "Base Price": 40.0, + "Avg Price": 56.0, + "Keg Price": 90.0, + "Preserve Price": 190.0, + "Spring": null, + "Summer": 5.0, + "Fall": null, + "Winter": null, + "Greenhouse": 5.0, + "Ginger Island": 5.0 + } + }, + { + "buy": 70, + "harvest": {}, + "id": "kale", + "index": 477, + "name": "Kale", + "scythe": true, + "seasons": [ + "spring" + ], + "sell": 110, + "stages": [ + 1, + 2, + 2, + 1 + ], + "extra": { + "Base Price": 110.0, + "Avg Price": 154.0, + "Keg Price": 247.0, + "Preserve Price": 310.0, + "Spring": 6.0, + "Summer": null, + "Fall": null, + "Winter": null, + "Greenhouse": 6.0, + "Ginger Island": 6.0 + } + }, + { + "buy": 80, + "harvest": {}, + "id": "melon", + "index": 479, + "name": "Melon", + "seasons": [ + "summer" + ], + "sell": 250, + "stages": [ + 1, + 2, + 3, + 3, + 3 + ], + "extra": { + "Base Price": 250.0, + "Avg Price": 350.0, + "Keg Price": 1050.0, + "Preserve Price": 550.0, + "Spring": null, + "Summer": 12.0, + "Fall": null, + "Winter": null, + "Greenhouse": 12.0, + "Ginger Island": 12.0 + } + }, + { + "buy": 20, + "harvest": {}, + "id": "parsnip", + "index": 472, + "name": "Parsnip", + "seasons": [ + "spring" + ], + "sell": 35, + "stages": [ + 1, + 1, + 1, + 1 + ], + "extra": { + "Base Price": 35.0, + "Avg Price": 52.375, + "Keg Price": 78.0, + "Preserve Price": 120.0, + "Spring": 4.0, + "Summer": null, + "Fall": null, + "Winter": null, + "Greenhouse": 4.0, + "Ginger Island": 4.0 + } + }, + { + "buy": 100, + "harvest": {}, + "id": "poppy", + "index": 453, + "name": "Poppy", + "seasons": [ + "summer" + ], + "sell": 140, + "stages": [ + 1, + 2, + 2, + 2 + ], + "extra": { + "Base Price": 140.0, + "Avg Price": 196.0, + "Keg Price": null, + "Preserve Price": 340.0, + "Spring": null, + "Summer": 7.0, + "Fall": null, + "Winter": null, + "Greenhouse": 7.0, + "Ginger Island": 7.0 + } + }, + { + "buy": 50, + "harvest": { + "extra_chance": 0.2, + "level_increase": 8, + "max": 2, + "min": 1 + }, + "id": "potato", + "index": 475, + "name": "Potato", + "seasons": [ + "spring" + ], + "sell": 80, + "stages": [ + 1, + 1, + 1, + 2, + 1 + ], + "extra": { + "Base Price": 80.0, + "Avg Price": 112.0, + "Keg Price": 180.0, + "Preserve Price": 230.0, + "Spring": 6.0, + "Summer": null, + "Fall": null, + "Winter": null, + "Greenhouse": 6.0, + "Ginger Island": 6.0 + } + }, + { + "buy": 100, + "harvest": {}, + "id": "pumpkin", + "index": 490, + "name": "Pumpkin", + "seasons": [ + "fall" + ], + "sell": 320, + "stages": [ + 1, + 2, + 3, + 4, + 3 + ], + "extra": { + "Base Price": 320.0, + "Avg Price": 448.0, + "Keg Price": 1350.0, + "Preserve Price": 690.0, + "Spring": null, + "Summer": null, + "Fall": 13.0, + "Winter": null, + "Greenhouse": 13.0, + "Ginger Island": 13.0 + } + }, + { + "buy": 40, + "harvest": {}, + "id": "radish", + "index": 484, + "name": "Radish", + "seasons": [ + "summer" + ], + "sell": 90, + "stages": [ + 2, + 1, + 2, + 1 + ], + "extra": { + "Base Price": 90.0, + "Avg Price": 126.0, + "Keg Price": 202.0, + "Preserve Price": 240.0, + "Spring": null, + "Summer": 6.0, + "Fall": null, + "Winter": null, + "Greenhouse": 6.0, + "Ginger Island": 6.0 + } + }, + { + "buy": 100, + "harvest": {}, + "id": "red_cabbage", + "index": 485, + "name": "Red Cabbage", + "seasons": [ + "summer" + ], + "sell": 260, + "stages": [ + 2, + 1, + 2, + 2, + 2 + ], + "extra": { + "Base Price": 260.0, + "Avg Price": 364.0, + "Keg Price": 585.0, + "Preserve Price": 560.0, + "Spring": null, + "Summer": 9.0, + "Fall": null, + "Winter": null, + "Greenhouse": 9.0, + "Ginger Island": 9.0 + } + }, + { + "buy": 100, + "harvest": {}, + "id": "rhubarb", + "index": 478, + "name": "Rhubarb", + "seasons": [ + "spring" + ], + "sell": 220, + "stages": [ + 2, + 2, + 2, + 3, + 4 + ], + "extra": { + "Base Price": 220.0, + "Avg Price": 308.0, + "Keg Price": 495.0, + "Preserve Price": 490.0, + "Spring": 13.0, + "Summer": null, + "Fall": null, + "Winter": null, + "Greenhouse": 13.0, + "Ginger Island": 13.0 + } + }, + { + "buy": 400, + "harvest": {}, + "id": "starfruit", + "index": 486, + "name": "Starfruit", + "seasons": [ + "summer" + ], + "sell": 750, + "stages": [ + 2, + 3, + 2, + 3, + 3 + ], + "extra": { + "Base Price": 750.0, + "Avg Price": 1050.0, + "Keg Price": 3150.0, + "Preserve Price": 1550.0, + "Spring": null, + "Summer": 13.0, + "Fall": null, + "Winter": null, + "Greenhouse": 13.0, + "Ginger Island": 13.0 + } + }, + { + "buy": 100, + "harvest": { + "extra_chance": 0.02, + "level_increase": 5, + "max": 1, + "min": 1 + }, + "id": "strawberry", + "index": 745, + "name": "Strawberry", + "regrow": 4, + "seasons": [ + "spring" + ], + "sell": 120, + "stages": [ + 1, + 1, + 2, + 2, + 2 + ], + "extra": { + "Base Price": 120.0, + "Avg Price": 168.0, + "Keg Price": 360.0, + "Preserve Price": 290.0, + "Spring": 8.0, + "Summer": null, + "Fall": null, + "Winter": null, + "Greenhouse": 8.0, + "Ginger Island": 8.0 + } + }, + { + "buy": 50, + "harvest": {}, + "id": "summer_spangle", + "index": 455, + "name": "Summer Spangle", + "seasons": [ + "summer" + ], + "sell": 90, + "stages": [ + 1, + 2, + 3, + 2 + ], + "extra": { + "Base Price": 90.0, + "Avg Price": 126.0, + "Keg Price": null, + "Preserve Price": 270.0, + "Spring": null, + "Summer": 8.0, + "Fall": null, + "Winter": null, + "Greenhouse": 8.0, + "Ginger Island": 8.0 + } + }, + { + "buy": 125, + "harvest": {}, + "id": "sunflower", + "index": 431, + "name": "Sunflower", + "note": "Cheapest at JojaMart", + "seasons": [ + "summer", + "fall" + ], + "sell": 80, + "stages": [ + 1, + 2, + 3, + 2 + ], + "extra": null + }, + { + "buy": 1000, + "harvest": {}, + "id": "sweet_gem_berry", + "index": 347, + "name": "Sweet Gem Berry", + "seasons": [ + "fall" + ], + "sell": 3000, + "stages": [ + 2, + 4, + 6, + 6, + 6 + ], + "extra": { + "Base Price": 3000.0, + "Avg Price": 4200.0, + "Keg Price": null, + "Preserve Price": null, + "Spring": null, + "Summer": null, + "Fall": 24.0, + "Winter": null, + "Greenhouse": 24.0, + "Ginger Island": 24.0 + } + }, + { + "buy": 50, + "harvest": { + "extra_chance": 0.05, + "level_increase": 6, + "max": 1, + "min": 1 + }, + "id": "tomato", + "index": 480, + "name": "Tomato", + "regrow": 4, + "seasons": [ + "summer" + ], + "sell": 60, + "stages": [ + 2, + 2, + 2, + 2, + 3 + ], + "extra": { + "Base Price": 60.0, + "Avg Price": 84.0, + "Keg Price": 135.0, + "Preserve Price": 210.0, + "Spring": null, + "Summer": 11.0, + "Fall": null, + "Winter": null, + "Greenhouse": 11.0, + "Ginger Island": 11.0 + } + }, + { + "buy": 20, + "harvest": {}, + "id": "tulip", + "index": 427, + "name": "Tulip", + "seasons": [ + "spring" + ], + "sell": 30, + "stages": [ + 1, + 1, + 2, + 2 + ], + "extra": { + "Base Price": 30.0, + "Avg Price": 42.0, + "Keg Price": null, + "Preserve Price": 150.0, + "Spring": 6.0, + "Summer": null, + "Fall": null, + "Winter": null, + "Greenhouse": 6.0, + "Ginger Island": 6.0 + } + }, + { + "buy": 10, + "harvest": {}, + "id": "wheat", + "index": 483, + "name": "Wheat", + "scythe": true, + "seasons": [ + "summer", + "fall" + ], + "sell": 25, + "stages": [ + 1, + 1, + 1, + 1 + ], + "extra": { + "Base Price": 25.0, + "Avg Price": 35.0, + "Keg Price": 100.0, + "Preserve Price": 150.0, + "Spring": null, + "Summer": 4.0, + "Fall": 4.0, + "Winter": null, + "Greenhouse": 4.0, + "Ginger Island": 4.0 + } + }, + { + "buy": 60, + "harvest": {}, + "id": "yam", + "index": 492, + "name": "Yam", + "seasons": [ + "fall" + ], + "sell": 160, + "stages": [ + 1, + 3, + 3, + 3 + ], + "extra": { + "Base Price": 160.0, + "Avg Price": 224.0, + "Keg Price": 360.0, + "Preserve Price": 410.0, + "Spring": null, + "Summer": null, + "Fall": 10.0, + "Winter": null, + "Greenhouse": 10.0, + "Ginger Island": 10.0 + } + } + ], + "fertilizer": [ + { + "buy": 0, + "id": "none", + "name": "None" + }, + { + "buy": 100, + "id": "basic_fertilizer", + "name": "Basic Fertilizer" + }, + { + "buy": 150, + "id": "quality_fertilizer", + "name": "Quality Fertilizer" + }, + { + "buy": 100, + "growth_rate": 0.1, + "id": "speed_gro", + "name": "Speed-Gro" + }, + { + "buy": 150, + "growth_rate": 0.25, + "id": "delux_speed_gro", + "name": "Delux Speed-Gro" + } + ], + "events": { + "spring": [ + { + "day": 4, + "name": "Kent" + }, + { + "day": 7, + "name": "Lewis" + }, + { + "day": 10, + "name": "Vincent" + }, + { + "day": 13, + "name": "Egg Festival", + "festival": true + }, + { + "day": 14, + "name": "Haley" + }, + { + "day": 18, + "name": "Pam" + }, + { + "day": 20, + "name": "Shane" + }, + { + "day": 24, + "name": "Flower Dance", + "festival": true + }, + { + "day": 26, + "name": "Pierre" + }, + { + "day": 27, + "name": "Emily" + } + ], + "summer": [ + { + "day": 4, + "name": "Jas" + }, + { + "day": 8, + "name": "Gus" + }, + { + "day": 10, + "name": "Maru" + }, + { + "day": 11, + "name": "Luau", + "festival": true + }, + { + "day": 13, + "name": "Alex" + }, + { + "day": 17, + "name": "Sam" + }, + { + "day": 19, + "name": "Demetrius" + }, + { + "day": 22, + "name": "Dwarf" + }, + { + "day": 24, + "name": "Willy" + }, + { + "day": 28, + "name": "Dance of the Moonlight Jellies", + "festival": true + } + ], + "fall": [ + { + "day": 2, + "name": "Penny" + }, + { + "day": 5, + "name": "Elliot" + }, + { + "day": 11, + "name": "Jodi" + }, + { + "day": 13, + "name": "Abigail" + }, + { + "day": 15, + "name": "Sandy" + }, + { + "day": 16, + "name": "Stardew Valley Fair", + "festival": true + }, + { + "day": 18, + "name": "Marnie" + }, + { + "day": 21, + "name": "Robin" + }, + { + "day": 24, + "name": "George" + }, + { + "day": 27, + "name": "Spirit's Eve", + "festival": true + } + ], + "winter": [ + { + "day": 1, + "name": "Krobus" + }, + { + "day": 3, + "name": "Linus" + }, + { + "day": 7, + "name": "Caroline" + }, + { + "day": 8, + "name": "Festival of Ice", + "festival": true + }, + { + "day": 10, + "name": "Sebastian" + }, + { + "day": 14, + "name": "Harvey" + }, + { + "day": 17, + "name": "Wizard" + }, + { + "day": 20, + "name": "Evelyn" + }, + { + "day": 23, + "name": "Leah" + }, + { + "day": 25, + "name": "Feast of the Winter Star", + "festival": true + }, + { + "day": 26, + "name": "Clint" + } + ] + } +} From aab32f9a852ecb17987396cdb99b99d1999abbd9 Mon Sep 17 00:00:00 2001 From: dameoffensive-cloud Date: Sun, 8 Feb 2026 10:03:37 -0500 Subject: [PATCH 003/171] Add files via upload --- scripts/planner.js | 40 +++++++++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/scripts/planner.js b/scripts/planner.js index 09950d6..0c701d8 100644 --- a/scripts/planner.js +++ b/scripts/planner.js @@ -959,6 +959,7 @@ function planner_controller($scope){ self.stages = []; self.regrow; self.wild = false; + self.paddy = null; // {dry_days, irrigated_days} // Harvest data self.harvest = { @@ -992,6 +993,7 @@ function planner_controller($scope){ self.stages = data.stages; self.regrow = data.regrow; if (data.wild) self.wild = true; + if (data.paddy) self.paddy = data.paddy; // Harvest data if (data.harvest.min) self.harvest.min = data.harvest.min; @@ -1390,7 +1392,7 @@ function planner_controller($scope){ self.fertilizer = planner.fertilizer["none"]; self.harvests = []; self.greenhouse = false; - + self.irrigated = false; // for paddy crops (e.g., Rice) init(); @@ -1402,6 +1404,7 @@ function planner_controller($scope){ self.amount = data.amount; if (data.fertilizer && planner.fertilizer[data.fertilizer]) self.fertilizer = planner.fertilizer[data.fertilizer]; + if (data.irrigated) self.irrigated = true; self.greenhouse = in_greenhouse ? true : false; } } @@ -1412,12 +1415,27 @@ function planner_controller($scope){ data.crop = this.crop.id; data.amount = this.amount; if (this.fertilizer && !this.fertilizer.is_none()) data.fertilizer = this.fertilizer.id; + if (this.irrigated) data.irrigated = true; return data; }; Plan.prototype.get_grow_time = function(){ + // For most crops, growth is derived from the crop's stage list. + // For paddy crops (e.g., Rice), growth depends on whether the tile is irrigated (near water). + var base_grow = this.crop.grow; // default var stages = $.extend([], this.crop.stages); - + + if (this.crop.paddy){ + // Use configured paddy growth times if provided. + // Expecting: {dry_days: 8, irrigated_days: 6} + var dry = (this.crop.paddy.dry_days || this.crop.grow); + var irr = (this.crop.paddy.irrigated_days || dry); + base_grow = this.irrigated ? irr : dry; + + // Treat as a single growth stage so Speed-Gro/Agriculturist reductions still work. + stages = [base_grow]; + } + if (this.fertilizer.id == "speed_gro" || this.fertilizer.id == "delux_speed_gro" || planner.player.agriculturist){ // [SOURCE: StardewValley.TerrainFeatures/HoeDirt.cs : function plant] var rate = 0; @@ -1429,17 +1447,17 @@ function planner_controller($scope){ rate = 0.25; break; } - + // Agriculturist profession (ID 5) if (planner.player.agriculturist) rate += 0.1; - + // Days to remove - var remove_days = Math.ceil(this.crop.grow * rate); - + var remove_days = Math.ceil(base_grow * rate); + // For removing more than one day from larger stages of growth // when there are still days to remove var multi_remove = 0; - + // Remove days from stages while (remove_days > 0 && multi_remove < 3){ for (var i = 0; i < stages.length; i++){ @@ -1447,20 +1465,20 @@ function planner_controller($scope){ stages[i] -= 1; remove_days--; } - + if (remove_days <= 0) break; } - + multi_remove++; } } - + // Add up days of growth var days = 0; for (var i = 0; i < stages.length; i++){ days += stages[i]; } - + return days; }; From 952f7ebd9ecf081c5bf80d52487f36c056f18bda Mon Sep 17 00:00:00 2001 From: dameoffensive-cloud Date: Sun, 8 Feb 2026 10:17:16 -0500 Subject: [PATCH 004/171] Add files via upload --- config.json | 2339 ++++++++++++++++++++++----------------------------- 1 file changed, 984 insertions(+), 1355 deletions(-) diff --git a/config.json b/config.json index af60bb4..101af1c 100644 --- a/config.json +++ b/config.json @@ -1,1355 +1,984 @@ -{ - "crops": [ - { - "buy": 70, - "harvest": {}, - "id": "amaranth", - "index": 299, - "name": "Amaranth", - "scythe": true, - "seasons": [ - "fall" - ], - "sell": 150, - "stages": [ - 1, - 2, - 2, - 2 - ], - "extra": { - "Base Price": 150.0, - "Avg Price": 210.0, - "Keg Price": null, - "Preserve Price": 370.0, - "Spring": null, - "Summer": null, - "Fall": 7.0, - "Winter": null, - "Greenhouse": 7.0, - "Ginger Island": 7.0 - } - }, - { - "buy": 700, - "harvest": {}, - "id": "ancient_fruit", - "index": 499, - "name": "Ancient Fruit", - "regrow": 7, - "seasons": [ - "spring", - "summer", - "fall" - ], - "sell": 550, - "stages": [ - 2, - 7, - 7, - 7, - 5 - ], - "extra": { - "Base Price": 550.0, - "Avg Price": 770.0, - "Keg Price": 2310.0, - "Preserve Price": 1310.0, - "Spring": 28.0, - "Summer": 28.0, - "Fall": 28.0, - "Winter": null, - "Greenhouse": 28.0, - "Ginger Island": 28.0 - } - }, - { - "buy": 30, - "harvest": {}, - "id": "artichoke", - "index": 489, - "name": "Artichoke", - "seasons": [ - "fall" - ], - "sell": 160, - "stages": [ - 2, - 2, - 1, - 2, - 1 - ], - "extra": { - "Base Price": 160.0, - "Avg Price": 224.0, - "Keg Price": 360.0, - "Preserve Price": 410.0, - "Spring": null, - "Summer": null, - "Fall": 8.0, - "Winter": null, - "Greenhouse": 8.0, - "Ginger Island": 8.0 - } - }, - { - "buy": 20, - "harvest": {}, - "id": "beet", - "index": 494, - "name": "Beet", - "seasons": [ - "fall" - ], - "sell": 100, - "stages": [ - 1, - 1, - 2, - 2 - ], - "extra": { - "Base Price": 100.0, - "Avg Price": 140.0, - "Keg Price": 225.0, - "Preserve Price": 250.0, - "Spring": null, - "Summer": null, - "Fall": 6.0, - "Winter": null, - "Greenhouse": 6.0, - "Ginger Island": 6.0 - } - }, - { - "buy": 30, - "harvest": {}, - "id": "blue_jazz", - "index": 429, - "name": "Blue Jazz", - "seasons": [ - "spring" - ], - "sell": 50, - "stages": [ - 1, - 2, - 2, - 2 - ], - "extra": { - "Base Price": 50.0, - "Avg Price": 70.0, - "Keg Price": null, - "Preserve Price": 170.0, - "Spring": 7.0, - "Summer": null, - "Fall": null, - "Winter": null, - "Greenhouse": 7.0, - "Ginger Island": 7.0 - } - }, - { - "buy": 80, - "harvest": { - "extra_chance": 0.02, - "level_increase": 5, - "max": 5, - "min": 3 - }, - "id": "blueberry", - "index": 481, - "name": "Blueberry", - "regrow": 4, - "seasons": [ - "summer" - ], - "sell": 50, - "stages": [ - 1, - 3, - 3, - 4, - 2 - ], - "extra": { - "Base Price": 50.0, - "Avg Price": 70.0, - "Keg Price": 150.0, - "Preserve Price": 200.0, - "Spring": null, - "Summer": 13.0, - "Fall": null, - "Winter": null, - "Greenhouse": 13.0, - "Ginger Island": 13.0 - } - }, - { - "buy": 50, - "harvest": {}, - "id": "bok_choy", - "index": 491, - "name": "Bok Choy", - "seasons": [ - "fall" - ], - "sell": 80, - "stages": [ - 1, - 1, - 1, - 1 - ], - "extra": { - "Base Price": 80.0, - "Avg Price": 112.0, - "Keg Price": 180.0, - "Preserve Price": 230.0, - "Spring": null, - "Summer": null, - "Fall": 4.0, - "Winter": null, - "Greenhouse": 4.0, - "Ginger Island": 4.0 - } - }, - { - "buy": 80, - "harvest": {}, - "id": "cauliflower", - "index": 474, - "name": "Cauliflower", - "seasons": [ - "spring" - ], - "sell": 175, - "stages": [ - 1, - 2, - 4, - 4, - 1 - ], - "extra": { - "Base Price": 175.0, - "Avg Price": 245.0, - "Keg Price": 393.0, - "Preserve Price": 445.0, - "Spring": 12.0, - "Summer": null, - "Fall": null, - "Winter": null, - "Greenhouse": 12.0, - "Ginger Island": 12.0 - } - }, - { - "buy": 30, - "harvest": { - "extra_chance": 0.02, - "level_increase": 10, - "max": 6, - "min": 4 - }, - "id": "coffee_bean", - "index": 433, - "name": "Coffee Bean", - "note": "Sold by Travelling Cart for ~2500g", - "regrow": 2, - "seasons": [ - "spring", - "summer" - ], - "sell": 15, - "stages": [ - 1, - 2, - 2, - 3, - 2 - ], - "extra": { - "Base Price": 15.0, - "Avg Price": 21.0, - "Keg Price": null, - "Preserve Price": 110.0, - "Spring": 10.0, - "Summer": 10.0, - "Fall": null, - "Winter": null, - "Greenhouse": 10.0, - "Ginger Island": 10.0 - } - }, - { - "buy": 150, - "harvest": { - "extra_chance": 0.0, - "level_increase": 5, - "max": 2, - "min": 1 - }, - "id": "corn", - "index": 487, - "name": "Corn", - "regrow": 4, - "seasons": [ - "summer", - "fall" - ], - "sell": 50, - "stages": [ - 2, - 3, - 3, - 3, - 3 - ], - "extra": { - "Base Price": 50.0, - "Avg Price": 70.0, - "Keg Price": 112.0, - "Preserve Price": 200.0, - "Spring": null, - "Summer": 14.0, - "Fall": 14.0, - "Winter": null, - "Greenhouse": 14.0, - "Ginger Island": 14.0 - } - }, - { - "buy": 240, - "harvest": { - "extra_chance": 0.1, - "level_increase": 5, - "max": 6, - "min": 2 - }, - "id": "cranberries", - "index": 493, - "name": "Cranberries", - "regrow": 5, - "seasons": [ - "fall" - ], - "sell": 75, - "stages": [ - 1, - 2, - 1, - 1, - 2 - ], - "extra": { - "Base Price": 75.0, - "Avg Price": 105.0, - "Keg Price": 225.0, - "Preserve Price": 250.0, - "Spring": null, - "Summer": null, - "Fall": 7.0, - "Winter": null, - "Greenhouse": 7.0, - "Ginger Island": 7.0 - } - }, - { - "buy": 20, - "harvest": { - "extra_chance": 0.002, - "level_increase": 10, - "max": 2, - "min": 1 - }, - "id": "eggplant", - "index": 488, - "name": "Eggplant", - "regrow": 5, - "seasons": [ - "fall" - ], - "sell": 60, - "stages": [ - 1, - 1, - 1, - 1, - 1 - ], - "extra": { - "Base Price": 60.0, - "Avg Price": 84.0, - "Keg Price": 135.0, - "Preserve Price": 210.0, - "Spring": null, - "Summer": null, - "Fall": 5.0, - "Winter": null, - "Greenhouse": 5.0, - "Ginger Island": 5.0 - } - }, - { - "buy": 200, - "harvest": {}, - "id": "fairy_rose", - "index": 425, - "name": "Fairy Rose", - "seasons": [ - "fall" - ], - "sell": 290, - "stages": [ - 1, - 4, - 4, - 3 - ], - "extra": { - "Base Price": 290.0, - "Avg Price": 406.0, - "Keg Price": null, - "Preserve Price": 590.0, - "Spring": null, - "Summer": null, - "Fall": 12.0, - "Winter": null, - "Greenhouse": 12.0, - "Ginger Island": 12.0 - } - }, - { - "buy": 40, - "harvest": {}, - "id": "garlic", - "index": 476, - "name": "Garlic", - "seasons": [ - "spring" - ], - "sell": 60, - "stages": [ - 1, - 1, - 1, - 1 - ], - "extra": { - "Base Price": 60.0, - "Avg Price": 84.0, - "Keg Price": 135.0, - "Preserve Price": 210.0, - "Spring": 4.0, - "Summer": null, - "Fall": null, - "Winter": null, - "Greenhouse": 4.0, - "Ginger Island": 4.0 - } - }, - { - "buy": 60, - "harvest": { - "extra_chance": 0.0, - "level_increase": 5, - "max": 2, - "min": 1 - }, - "id": "grape", - "index": 301, - "name": "Grape", - "regrow": 3, - "seasons": [ - "fall" - ], - "sell": 80, - "stages": [ - 1, - 1, - 2, - 3, - 3 - ], - "trellis": true, - "extra": { - "Base Price": 80.0, - "Avg Price": 112.0, - "Keg Price": 240.0, - "Preserve Price": 330.0, - "Spring": null, - "Summer": null, - "Fall": 10.0, - "Winter": null, - "Greenhouse": 10.0, - "Ginger Island": 10.0 - } - }, - { - "buy": 60, - "harvest": { - "extra_chance": 0.0, - "level_increase": 6, - "max": 2, - "min": 1 - }, - "id": "green_bean", - "index": 473, - "name": "Green Bean", - "regrow": 3, - "seasons": [ - "spring" - ], - "sell": 40, - "stages": [ - 1, - 1, - 1, - 3, - 4 - ], - "trellis": true, - "extra": { - "Base Price": 40.0, - "Avg Price": 56.0, - "Keg Price": 90.0, - "Preserve Price": 190.0, - "Spring": 10.0, - "Summer": null, - "Fall": null, - "Winter": null, - "Greenhouse": 10.0, - "Ginger Island": 10.0 - } - }, - { - "buy": 60, - "harvest": { - "extra_chance": 0.0, - "level_increase": 6, - "max": 2, - "min": 1 - }, - "id": "hops", - "index": 302, - "name": "Hops", - "regrow": 1, - "seasons": [ - "summer" - ], - "sell": 25, - "stages": [ - 1, - 1, - 2, - 3, - 4 - ], - "trellis": true, - "extra": { - "Base Price": 25.0, - "Avg Price": 35.0, - "Keg Price": 420.0, - "Preserve Price": 150.0, - "Spring": null, - "Summer": 11.0, - "Fall": null, - "Winter": null, - "Greenhouse": 11.0, - "Ginger Island": 11.0 - } - }, - { - "buy": 40, - "harvest": { - "extra_chance": 0.03, - "level_increase": 5, - "max": 1, - "min": 1 - }, - "id": "hot_pepper", - "index": 482, - "name": "Hot Pepper", - "regrow": 3, - "seasons": [ - "summer" - ], - "sell": 40, - "stages": [ - 1, - 1, - 1, - 1, - 1 - ], - "extra": { - "Base Price": 40.0, - "Avg Price": 56.0, - "Keg Price": 90.0, - "Preserve Price": 190.0, - "Spring": null, - "Summer": 5.0, - "Fall": null, - "Winter": null, - "Greenhouse": 5.0, - "Ginger Island": 5.0 - } - }, - { - "buy": 70, - "harvest": {}, - "id": "kale", - "index": 477, - "name": "Kale", - "scythe": true, - "seasons": [ - "spring" - ], - "sell": 110, - "stages": [ - 1, - 2, - 2, - 1 - ], - "extra": { - "Base Price": 110.0, - "Avg Price": 154.0, - "Keg Price": 247.0, - "Preserve Price": 310.0, - "Spring": 6.0, - "Summer": null, - "Fall": null, - "Winter": null, - "Greenhouse": 6.0, - "Ginger Island": 6.0 - } - }, - { - "buy": 80, - "harvest": {}, - "id": "melon", - "index": 479, - "name": "Melon", - "seasons": [ - "summer" - ], - "sell": 250, - "stages": [ - 1, - 2, - 3, - 3, - 3 - ], - "extra": { - "Base Price": 250.0, - "Avg Price": 350.0, - "Keg Price": 1050.0, - "Preserve Price": 550.0, - "Spring": null, - "Summer": 12.0, - "Fall": null, - "Winter": null, - "Greenhouse": 12.0, - "Ginger Island": 12.0 - } - }, - { - "buy": 20, - "harvest": {}, - "id": "parsnip", - "index": 472, - "name": "Parsnip", - "seasons": [ - "spring" - ], - "sell": 35, - "stages": [ - 1, - 1, - 1, - 1 - ], - "extra": { - "Base Price": 35.0, - "Avg Price": 52.375, - "Keg Price": 78.0, - "Preserve Price": 120.0, - "Spring": 4.0, - "Summer": null, - "Fall": null, - "Winter": null, - "Greenhouse": 4.0, - "Ginger Island": 4.0 - } - }, - { - "buy": 100, - "harvest": {}, - "id": "poppy", - "index": 453, - "name": "Poppy", - "seasons": [ - "summer" - ], - "sell": 140, - "stages": [ - 1, - 2, - 2, - 2 - ], - "extra": { - "Base Price": 140.0, - "Avg Price": 196.0, - "Keg Price": null, - "Preserve Price": 340.0, - "Spring": null, - "Summer": 7.0, - "Fall": null, - "Winter": null, - "Greenhouse": 7.0, - "Ginger Island": 7.0 - } - }, - { - "buy": 50, - "harvest": { - "extra_chance": 0.2, - "level_increase": 8, - "max": 2, - "min": 1 - }, - "id": "potato", - "index": 475, - "name": "Potato", - "seasons": [ - "spring" - ], - "sell": 80, - "stages": [ - 1, - 1, - 1, - 2, - 1 - ], - "extra": { - "Base Price": 80.0, - "Avg Price": 112.0, - "Keg Price": 180.0, - "Preserve Price": 230.0, - "Spring": 6.0, - "Summer": null, - "Fall": null, - "Winter": null, - "Greenhouse": 6.0, - "Ginger Island": 6.0 - } - }, - { - "buy": 100, - "harvest": {}, - "id": "pumpkin", - "index": 490, - "name": "Pumpkin", - "seasons": [ - "fall" - ], - "sell": 320, - "stages": [ - 1, - 2, - 3, - 4, - 3 - ], - "extra": { - "Base Price": 320.0, - "Avg Price": 448.0, - "Keg Price": 1350.0, - "Preserve Price": 690.0, - "Spring": null, - "Summer": null, - "Fall": 13.0, - "Winter": null, - "Greenhouse": 13.0, - "Ginger Island": 13.0 - } - }, - { - "buy": 40, - "harvest": {}, - "id": "radish", - "index": 484, - "name": "Radish", - "seasons": [ - "summer" - ], - "sell": 90, - "stages": [ - 2, - 1, - 2, - 1 - ], - "extra": { - "Base Price": 90.0, - "Avg Price": 126.0, - "Keg Price": 202.0, - "Preserve Price": 240.0, - "Spring": null, - "Summer": 6.0, - "Fall": null, - "Winter": null, - "Greenhouse": 6.0, - "Ginger Island": 6.0 - } - }, - { - "buy": 100, - "harvest": {}, - "id": "red_cabbage", - "index": 485, - "name": "Red Cabbage", - "seasons": [ - "summer" - ], - "sell": 260, - "stages": [ - 2, - 1, - 2, - 2, - 2 - ], - "extra": { - "Base Price": 260.0, - "Avg Price": 364.0, - "Keg Price": 585.0, - "Preserve Price": 560.0, - "Spring": null, - "Summer": 9.0, - "Fall": null, - "Winter": null, - "Greenhouse": 9.0, - "Ginger Island": 9.0 - } - }, - { - "buy": 100, - "harvest": {}, - "id": "rhubarb", - "index": 478, - "name": "Rhubarb", - "seasons": [ - "spring" - ], - "sell": 220, - "stages": [ - 2, - 2, - 2, - 3, - 4 - ], - "extra": { - "Base Price": 220.0, - "Avg Price": 308.0, - "Keg Price": 495.0, - "Preserve Price": 490.0, - "Spring": 13.0, - "Summer": null, - "Fall": null, - "Winter": null, - "Greenhouse": 13.0, - "Ginger Island": 13.0 - } - }, - { - "buy": 400, - "harvest": {}, - "id": "starfruit", - "index": 486, - "name": "Starfruit", - "seasons": [ - "summer" - ], - "sell": 750, - "stages": [ - 2, - 3, - 2, - 3, - 3 - ], - "extra": { - "Base Price": 750.0, - "Avg Price": 1050.0, - "Keg Price": 3150.0, - "Preserve Price": 1550.0, - "Spring": null, - "Summer": 13.0, - "Fall": null, - "Winter": null, - "Greenhouse": 13.0, - "Ginger Island": 13.0 - } - }, - { - "buy": 100, - "harvest": { - "extra_chance": 0.02, - "level_increase": 5, - "max": 1, - "min": 1 - }, - "id": "strawberry", - "index": 745, - "name": "Strawberry", - "regrow": 4, - "seasons": [ - "spring" - ], - "sell": 120, - "stages": [ - 1, - 1, - 2, - 2, - 2 - ], - "extra": { - "Base Price": 120.0, - "Avg Price": 168.0, - "Keg Price": 360.0, - "Preserve Price": 290.0, - "Spring": 8.0, - "Summer": null, - "Fall": null, - "Winter": null, - "Greenhouse": 8.0, - "Ginger Island": 8.0 - } - }, - { - "buy": 50, - "harvest": {}, - "id": "summer_spangle", - "index": 455, - "name": "Summer Spangle", - "seasons": [ - "summer" - ], - "sell": 90, - "stages": [ - 1, - 2, - 3, - 2 - ], - "extra": { - "Base Price": 90.0, - "Avg Price": 126.0, - "Keg Price": null, - "Preserve Price": 270.0, - "Spring": null, - "Summer": 8.0, - "Fall": null, - "Winter": null, - "Greenhouse": 8.0, - "Ginger Island": 8.0 - } - }, - { - "buy": 125, - "harvest": {}, - "id": "sunflower", - "index": 431, - "name": "Sunflower", - "note": "Cheapest at JojaMart", - "seasons": [ - "summer", - "fall" - ], - "sell": 80, - "stages": [ - 1, - 2, - 3, - 2 - ], - "extra": null - }, - { - "buy": 1000, - "harvest": {}, - "id": "sweet_gem_berry", - "index": 347, - "name": "Sweet Gem Berry", - "seasons": [ - "fall" - ], - "sell": 3000, - "stages": [ - 2, - 4, - 6, - 6, - 6 - ], - "extra": { - "Base Price": 3000.0, - "Avg Price": 4200.0, - "Keg Price": null, - "Preserve Price": null, - "Spring": null, - "Summer": null, - "Fall": 24.0, - "Winter": null, - "Greenhouse": 24.0, - "Ginger Island": 24.0 - } - }, - { - "buy": 50, - "harvest": { - "extra_chance": 0.05, - "level_increase": 6, - "max": 1, - "min": 1 - }, - "id": "tomato", - "index": 480, - "name": "Tomato", - "regrow": 4, - "seasons": [ - "summer" - ], - "sell": 60, - "stages": [ - 2, - 2, - 2, - 2, - 3 - ], - "extra": { - "Base Price": 60.0, - "Avg Price": 84.0, - "Keg Price": 135.0, - "Preserve Price": 210.0, - "Spring": null, - "Summer": 11.0, - "Fall": null, - "Winter": null, - "Greenhouse": 11.0, - "Ginger Island": 11.0 - } - }, - { - "buy": 20, - "harvest": {}, - "id": "tulip", - "index": 427, - "name": "Tulip", - "seasons": [ - "spring" - ], - "sell": 30, - "stages": [ - 1, - 1, - 2, - 2 - ], - "extra": { - "Base Price": 30.0, - "Avg Price": 42.0, - "Keg Price": null, - "Preserve Price": 150.0, - "Spring": 6.0, - "Summer": null, - "Fall": null, - "Winter": null, - "Greenhouse": 6.0, - "Ginger Island": 6.0 - } - }, - { - "buy": 10, - "harvest": {}, - "id": "wheat", - "index": 483, - "name": "Wheat", - "scythe": true, - "seasons": [ - "summer", - "fall" - ], - "sell": 25, - "stages": [ - 1, - 1, - 1, - 1 - ], - "extra": { - "Base Price": 25.0, - "Avg Price": 35.0, - "Keg Price": 100.0, - "Preserve Price": 150.0, - "Spring": null, - "Summer": 4.0, - "Fall": 4.0, - "Winter": null, - "Greenhouse": 4.0, - "Ginger Island": 4.0 - } - }, - { - "buy": 60, - "harvest": {}, - "id": "yam", - "index": 492, - "name": "Yam", - "seasons": [ - "fall" - ], - "sell": 160, - "stages": [ - 1, - 3, - 3, - 3 - ], - "extra": { - "Base Price": 160.0, - "Avg Price": 224.0, - "Keg Price": 360.0, - "Preserve Price": 410.0, - "Spring": null, - "Summer": null, - "Fall": 10.0, - "Winter": null, - "Greenhouse": 10.0, - "Ginger Island": 10.0 - } - } - ], - "fertilizer": [ - { - "buy": 0, - "id": "none", - "name": "None" - }, - { - "buy": 100, - "id": "basic_fertilizer", - "name": "Basic Fertilizer" - }, - { - "buy": 150, - "id": "quality_fertilizer", - "name": "Quality Fertilizer" - }, - { - "buy": 100, - "growth_rate": 0.1, - "id": "speed_gro", - "name": "Speed-Gro" - }, - { - "buy": 150, - "growth_rate": 0.25, - "id": "delux_speed_gro", - "name": "Delux Speed-Gro" - } - ], - "events": { - "spring": [ - { - "day": 4, - "name": "Kent" - }, - { - "day": 7, - "name": "Lewis" - }, - { - "day": 10, - "name": "Vincent" - }, - { - "day": 13, - "name": "Egg Festival", - "festival": true - }, - { - "day": 14, - "name": "Haley" - }, - { - "day": 18, - "name": "Pam" - }, - { - "day": 20, - "name": "Shane" - }, - { - "day": 24, - "name": "Flower Dance", - "festival": true - }, - { - "day": 26, - "name": "Pierre" - }, - { - "day": 27, - "name": "Emily" - } - ], - "summer": [ - { - "day": 4, - "name": "Jas" - }, - { - "day": 8, - "name": "Gus" - }, - { - "day": 10, - "name": "Maru" - }, - { - "day": 11, - "name": "Luau", - "festival": true - }, - { - "day": 13, - "name": "Alex" - }, - { - "day": 17, - "name": "Sam" - }, - { - "day": 19, - "name": "Demetrius" - }, - { - "day": 22, - "name": "Dwarf" - }, - { - "day": 24, - "name": "Willy" - }, - { - "day": 28, - "name": "Dance of the Moonlight Jellies", - "festival": true - } - ], - "fall": [ - { - "day": 2, - "name": "Penny" - }, - { - "day": 5, - "name": "Elliot" - }, - { - "day": 11, - "name": "Jodi" - }, - { - "day": 13, - "name": "Abigail" - }, - { - "day": 15, - "name": "Sandy" - }, - { - "day": 16, - "name": "Stardew Valley Fair", - "festival": true - }, - { - "day": 18, - "name": "Marnie" - }, - { - "day": 21, - "name": "Robin" - }, - { - "day": 24, - "name": "George" - }, - { - "day": 27, - "name": "Spirit's Eve", - "festival": true - } - ], - "winter": [ - { - "day": 1, - "name": "Krobus" - }, - { - "day": 3, - "name": "Linus" - }, - { - "day": 7, - "name": "Caroline" - }, - { - "day": 8, - "name": "Festival of Ice", - "festival": true - }, - { - "day": 10, - "name": "Sebastian" - }, - { - "day": 14, - "name": "Harvey" - }, - { - "day": 17, - "name": "Wizard" - }, - { - "day": 20, - "name": "Evelyn" - }, - { - "day": 23, - "name": "Leah" - }, - { - "day": 25, - "name": "Feast of the Winter Star", - "festival": true - }, - { - "day": 26, - "name": "Clint" - } - ] - } -} +{ + "crops": [ + { + "buy": 70, + "harvest": {}, + "id": "amaranth", + "index": 299, + "name": "Amaranth", + "scythe": true, + "seasons": [ + "fall" + ], + "sell": 150, + "stages": [ + 1, + 2, + 2, + 2 + ] + }, + { + "buy": 700, + "harvest": {}, + "id": "ancient_fruit", + "index": 499, + "name": "Ancient Fruit", + "regrow": 7, + "seasons": [ + "spring", + "summer", + "fall" + ], + "sell": 550, + "stages": [ + 2, + 7, + 7, + 7, + 5 + ] + }, + { + "buy": 30, + "harvest": {}, + "id": "artichoke", + "index": 489, + "name": "Artichoke", + "seasons": [ + "fall" + ], + "sell": 160, + "stages": [ + 2, + 2, + 1, + 2, + 1 + ] + }, + { + "buy": 20, + "harvest": {}, + "id": "beet", + "index": 494, + "name": "Beet", + "seasons": [ + "fall" + ], + "sell": 100, + "stages": [ + 1, + 1, + 2, + 2 + ] + }, + { + "buy": 30, + "harvest": {}, + "id": "blue_jazz", + "index": 429, + "name": "Blue Jazz", + "seasons": [ + "spring" + ], + "sell": 50, + "stages": [ + 1, + 2, + 2, + 2 + ] + }, + { + "buy": 80, + "harvest": { + "extra_chance": 0.02, + "level_increase": 5, + "max": 5, + "min": 3 + }, + "id": "blueberry", + "index": 481, + "name": "Blueberry", + "regrow": 4, + "seasons": [ + "summer" + ], + "sell": 50, + "stages": [ + 1, + 3, + 3, + 4, + 2 + ] + }, + { + "buy": 50, + "harvest": {}, + "id": "bok_choy", + "index": 491, + "name": "Bok Choy", + "seasons": [ + "fall" + ], + "sell": 80, + "stages": [ + 1, + 1, + 1, + 1 + ] + }, + { + "buy": 80, + "harvest": {}, + "id": "cauliflower", + "index": 474, + "name": "Cauliflower", + "seasons": [ + "spring" + ], + "sell": 175, + "stages": [ + 1, + 2, + 4, + 4, + 1 + ] + }, + { + "buy": 30, + "harvest": { + "extra_chance": 0.02, + "level_increase": 10, + "max": 6, + "min": 4 + }, + "id": "coffee_bean", + "index": 433, + "name": "Coffee Bean", + "note": "Sold by Travelling Cart for ~2500g", + "regrow": 2, + "seasons": [ + "spring", + "summer" + ], + "sell": 15, + "stages": [ + 1, + 2, + 2, + 3, + 2 + ] + }, + { + "buy": 150, + "harvest": { + "extra_chance": 0.0, + "level_increase": 5, + "max": 2, + "min": 1 + }, + "id": "corn", + "index": 487, + "name": "Corn", + "regrow": 4, + "seasons": [ + "summer", + "fall" + ], + "sell": 50, + "stages": [ + 2, + 3, + 3, + 3, + 3 + ] + }, + { + "buy": 240, + "harvest": { + "extra_chance": 0.1, + "level_increase": 5, + "max": 6, + "min": 2 + }, + "id": "cranberries", + "index": 493, + "name": "Cranberries", + "regrow": 5, + "seasons": [ + "fall" + ], + "sell": 75, + "stages": [ + 1, + 2, + 1, + 1, + 2 + ] + }, + { + "buy": 20, + "harvest": { + "extra_chance": 0.002, + "level_increase": 10, + "max": 2, + "min": 1 + }, + "id": "eggplant", + "index": 488, + "name": "Eggplant", + "regrow": 5, + "seasons": [ + "fall" + ], + "sell": 60, + "stages": [ + 1, + 1, + 1, + 1, + 1 + ] + }, + { + "buy": 200, + "harvest": {}, + "id": "fairy_rose", + "index": 425, + "name": "Fairy Rose", + "seasons": [ + "fall" + ], + "sell": 290, + "stages": [ + 1, + 4, + 4, + 3 + ] + }, + { + "buy": 40, + "harvest": {}, + "id": "garlic", + "index": 476, + "name": "Garlic", + "seasons": [ + "spring" + ], + "sell": 60, + "stages": [ + 1, + 1, + 1, + 1 + ] + }, + { + "buy": 60, + "harvest": { + "extra_chance": 0.0, + "level_increase": 6, + "max": 2, + "min": 1 + }, + "id": "grape", + "index": 301, + "name": "Grape", + "regrow": 3, + "seasons": [ + "fall" + ], + "sell": 80, + "stages": [ + 1, + 1, + 2, + 3, + 3 + ], + "trellis": true + }, + { + "buy": 60, + "harvest": { + "extra_chance": 0.0, + "level_increase": 6, + "max": 2, + "min": 1 + }, + "id": "green_bean", + "index": 473, + "name": "Green Bean", + "regrow": 3, + "seasons": [ + "spring" + ], + "sell": 40, + "stages": [ + 1, + 1, + 1, + 3, + 4 + ], + "trellis": true + }, + { + "buy": 60, + "harvest": { + "extra_chance": 0.0, + "level_increase": 6, + "max": 2, + "min": 1 + }, + "id": "hops", + "index": 302, + "name": "Hops", + "regrow": 1, + "seasons": [ + "summer" + ], + "sell": 25, + "stages": [ + 1, + 1, + 2, + 3, + 4 + ], + "trellis": true + }, + { + "buy": 40, + "harvest": { + "extra_chance": 0.03, + "level_increase": 5, + "max": 1, + "min": 1 + }, + "id": "hot_pepper", + "index": 482, + "name": "Hot Pepper", + "regrow": 3, + "seasons": [ + "summer" + ], + "sell": 40, + "stages": [ + 1, + 1, + 1, + 1, + 1 + ] + }, + { + "buy": 70, + "harvest": {}, + "id": "kale", + "index": 477, + "name": "Kale", + "scythe": true, + "seasons": [ + "spring" + ], + "sell": 110, + "stages": [ + 1, + 2, + 2, + 1 + ] + }, + { + "buy": 80, + "harvest": {}, + "id": "melon", + "index": 479, + "name": "Melon", + "seasons": [ + "summer" + ], + "sell": 250, + "stages": [ + 1, + 2, + 3, + 3, + 3 + ] + }, + { + "buy": 20, + "harvest": {}, + "id": "parsnip", + "index": 472, + "name": "Parsnip", + "seasons": [ + "spring" + ], + "sell": 35, + "stages": [ + 1, + 1, + 1, + 1 + ] + }, + { + "buy": 100, + "harvest": {}, + "id": "poppy", + "index": 453, + "name": "Poppy", + "seasons": [ + "summer" + ], + "sell": 140, + "stages": [ + 1, + 2, + 2, + 2 + ] + }, + { + "buy": 50, + "harvest": { + "extra_chance": 0.2, + "level_increase": 8, + "max": 2, + "min": 1 + }, + "id": "potato", + "index": 475, + "name": "Potato", + "seasons": [ + "spring" + ], + "sell": 80, + "stages": [ + 1, + 1, + 1, + 2, + 1 + ] + }, + { + "buy": 100, + "harvest": {}, + "id": "pumpkin", + "index": 490, + "name": "Pumpkin", + "seasons": [ + "fall" + ], + "sell": 320, + "stages": [ + 1, + 2, + 3, + 4, + 3 + ] + }, + { + "buy": 40, + "harvest": {}, + "id": "radish", + "index": 484, + "name": "Radish", + "seasons": [ + "summer" + ], + "sell": 90, + "stages": [ + 2, + 1, + 2, + 1 + ] + }, + { + "buy": 100, + "harvest": {}, + "id": "red_cabbage", + "index": 485, + "name": "Red Cabbage", + "seasons": [ + "summer" + ], + "sell": 260, + "stages": [ + 2, + 1, + 2, + 2, + 2 + ] + }, + { + "buy": 100, + "harvest": {}, + "id": "rhubarb", + "index": 478, + "name": "Rhubarb", + "seasons": [ + "spring" + ], + "sell": 220, + "stages": [ + 2, + 2, + 2, + 3, + 4 + ] + }, + { + "buy": 400, + "harvest": {}, + "id": "starfruit", + "index": 486, + "name": "Starfruit", + "seasons": [ + "summer" + ], + "sell": 750, + "stages": [ + 2, + 3, + 2, + 3, + 3 + ] + }, + { + "buy": 100, + "harvest": { + "extra_chance": 0.02, + "level_increase": 5, + "max": 1, + "min": 1 + }, + "id": "strawberry", + "index": 745, + "name": "Strawberry", + "regrow": 4, + "seasons": [ + "spring" + ], + "sell": 120, + "stages": [ + 1, + 1, + 2, + 2, + 2 + ] + }, + { + "buy": 50, + "harvest": {}, + "id": "summer_spangle", + "index": 455, + "name": "Summer Spangle", + "seasons": [ + "summer" + ], + "sell": 90, + "stages": [ + 1, + 2, + 3, + 2 + ] + }, + { + "buy": 125, + "harvest": {}, + "id": "sunflower", + "index": 431, + "name": "Sunflower", + "note": "Cheapest at JojaMart", + "seasons": [ + "summer", + "fall" + ], + "sell": 80, + "stages": [ + 1, + 2, + 3, + 2 + ] + }, + { + "buy": 1000, + "harvest": {}, + "id": "sweet_gem_berry", + "index": 347, + "name": "Sweet Gem Berry", + "seasons": [ + "fall" + ], + "sell": 3000, + "stages": [ + 2, + 4, + 6, + 6, + 6 + ] + }, + { + "buy": 50, + "harvest": { + "extra_chance": 0.05, + "level_increase": 6, + "max": 1, + "min": 1 + }, + "id": "tomato", + "index": 480, + "name": "Tomato", + "regrow": 4, + "seasons": [ + "summer" + ], + "sell": 60, + "stages": [ + 2, + 2, + 2, + 2, + 3 + ] + }, + { + "buy": 20, + "harvest": {}, + "id": "tulip", + "index": 427, + "name": "Tulip", + "seasons": [ + "spring" + ], + "sell": 30, + "stages": [ + 1, + 1, + 2, + 2 + ] + }, + { + "buy": 10, + "harvest": {}, + "id": "wheat", + "index": 483, + "name": "Wheat", + "scythe": true, + "seasons": [ + "summer", + "fall" + ], + "sell": 25, + "stages": [ + 1, + 1, + 1, + 1 + ] + }, + { + "buy": 60, + "harvest": {}, + "id": "yam", + "index": 492, + "name": "Yam", + "seasons": [ + "fall" + ], + "sell": 160, + "stages": [ + 1, + 3, + 3, + 3 + ] + } + ], + "fertilizer": [ + { + "buy": 0, + "id": "none", + "name": "None" + }, + { + "buy": 100, + "id": "basic_fertilizer", + "name": "Basic Fertilizer" + }, + { + "buy": 150, + "id": "quality_fertilizer", + "name": "Quality Fertilizer" + }, + { + "buy": 100, + "growth_rate": 0.1, + "id": "speed_gro", + "name": "Speed-Gro" + }, + { + "buy": 150, + "growth_rate": 0.25, + "id": "delux_speed_gro", + "name": "Delux Speed-Gro" + } + ], + "events": { + "spring": [ + { + "day": 4, + "name": "Kent" + }, + { + "day": 7, + "name": "Lewis" + }, + { + "day": 10, + "name": "Vincent" + }, + { + "day": 13, + "name": "Egg Festival", + "festival": true + }, + { + "day": 14, + "name": "Haley" + }, + { + "day": 15, + "name": "Desert Festival", + "festival": true + }, + { + "day": 16, + "name": "Desert Festival", + "festival": true + }, + { + "day": 17, + "name": "Desert Festival", + "festival": true + }, + { + "day": 18, + "name": "Pam" + }, + { + "day": 20, + "name": "Shane" + }, + { + "day": 24, + "name": "Flower Dance", + "festival": true + }, + { + "day": 26, + "name": "Pierre" + }, + { + "day": 27, + "name": "Emily" + } + ], + "summer": [ + { + "day": 4, + "name": "Jas" + }, + { + "day": 8, + "name": "Gus" + }, + { + "day": 10, + "name": "Maru" + }, + { + "day": 11, + "name": "Luau", + "festival": true + }, + { + "day": 13, + "name": "Alex" + }, + { + "day": 17, + "name": "Sam" + }, + { + "day": 19, + "name": "Demetrius" + }, + { + "day": 20, + "name": "Trout Derby", + "festival": true + }, + { + "day": 21, + "name": "Trout Derby", + "festival": true + }, + { + "day": 22, + "name": "Dwarf" + }, + { + "day": 24, + "name": "Willy" + }, + { + "day": 28, + "name": "Dance of the Moonlight Jellies", + "festival": true + } + ], + "fall": [ + { + "day": 2, + "name": "Penny" + }, + { + "day": 5, + "name": "Elliot" + }, + { + "day": 11, + "name": "Jodi" + }, + { + "day": 13, + "name": "Abigail" + }, + { + "day": 15, + "name": "Sandy" + }, + { + "day": 16, + "name": "Stardew Valley Fair", + "festival": true + }, + { + "day": 18, + "name": "Marnie" + }, + { + "day": 21, + "name": "Robin" + }, + { + "day": 24, + "name": "George" + }, + { + "day": 27, + "name": "Spirit's Eve", + "festival": true + } + ], + "winter": [ + { + "day": 1, + "name": "Krobus" + }, + { + "day": 3, + "name": "Linus" + }, + { + "day": 7, + "name": "Caroline" + }, + { + "day": 8, + "name": "Festival of Ice", + "festival": true + }, + { + "day": 10, + "name": "Sebastian" + }, + { + "day": 12, + "name": "SquidFest", + "festival": true + }, + { + "day": 13, + "name": "SquidFest", + "festival": true + }, + { + "day": 14, + "name": "Harvey" + }, + { + "day": 15, + "name": "Night Market", + "festival": true + }, + { + "day": 16, + "name": "Night Market", + "festival": true + }, + { + "day": 17, + "name": "Night Market", + "festival": true + }, + { + "day": 17, + "name": "Wizard" + }, + { + "day": 20, + "name": "Evelyn" + }, + { + "day": 23, + "name": "Leah" + }, + { + "day": 25, + "name": "Feast of the Winter Star", + "festival": true + }, + { + "day": 26, + "name": "Clint" + } + ] + } +} \ No newline at end of file From 11aeebb6eb2624178fc85587d5e4ff9d0b6f8590 Mon Sep 17 00:00:00 2001 From: dameoffensive-cloud Date: Sun, 8 Feb 2026 10:23:04 -0500 Subject: [PATCH 005/171] Add files via upload --- config.json | 2060 +++++++++++++++++++++++++++------------------------ 1 file changed, 1078 insertions(+), 982 deletions(-) diff --git a/config.json b/config.json index 101af1c..17e7bd5 100644 --- a/config.json +++ b/config.json @@ -1,984 +1,1080 @@ { - "crops": [ - { - "buy": 70, - "harvest": {}, - "id": "amaranth", - "index": 299, - "name": "Amaranth", - "scythe": true, - "seasons": [ - "fall" - ], - "sell": 150, - "stages": [ - 1, - 2, - 2, - 2 - ] - }, - { - "buy": 700, - "harvest": {}, - "id": "ancient_fruit", - "index": 499, - "name": "Ancient Fruit", - "regrow": 7, - "seasons": [ - "spring", - "summer", - "fall" - ], - "sell": 550, - "stages": [ - 2, - 7, - 7, - 7, - 5 - ] - }, - { - "buy": 30, - "harvest": {}, - "id": "artichoke", - "index": 489, - "name": "Artichoke", - "seasons": [ - "fall" - ], - "sell": 160, - "stages": [ - 2, - 2, - 1, - 2, - 1 - ] - }, - { - "buy": 20, - "harvest": {}, - "id": "beet", - "index": 494, - "name": "Beet", - "seasons": [ - "fall" - ], - "sell": 100, - "stages": [ - 1, - 1, - 2, - 2 - ] - }, - { - "buy": 30, - "harvest": {}, - "id": "blue_jazz", - "index": 429, - "name": "Blue Jazz", - "seasons": [ - "spring" - ], - "sell": 50, - "stages": [ - 1, - 2, - 2, - 2 - ] - }, - { - "buy": 80, - "harvest": { - "extra_chance": 0.02, - "level_increase": 5, - "max": 5, - "min": 3 - }, - "id": "blueberry", - "index": 481, - "name": "Blueberry", - "regrow": 4, - "seasons": [ - "summer" - ], - "sell": 50, - "stages": [ - 1, - 3, - 3, - 4, - 2 - ] - }, - { - "buy": 50, - "harvest": {}, - "id": "bok_choy", - "index": 491, - "name": "Bok Choy", - "seasons": [ - "fall" - ], - "sell": 80, - "stages": [ - 1, - 1, - 1, - 1 - ] - }, - { - "buy": 80, - "harvest": {}, - "id": "cauliflower", - "index": 474, - "name": "Cauliflower", - "seasons": [ - "spring" - ], - "sell": 175, - "stages": [ - 1, - 2, - 4, - 4, - 1 - ] - }, - { - "buy": 30, - "harvest": { - "extra_chance": 0.02, - "level_increase": 10, - "max": 6, - "min": 4 - }, - "id": "coffee_bean", - "index": 433, - "name": "Coffee Bean", - "note": "Sold by Travelling Cart for ~2500g", - "regrow": 2, - "seasons": [ - "spring", - "summer" - ], - "sell": 15, - "stages": [ - 1, - 2, - 2, - 3, - 2 - ] - }, - { - "buy": 150, - "harvest": { - "extra_chance": 0.0, - "level_increase": 5, - "max": 2, - "min": 1 - }, - "id": "corn", - "index": 487, - "name": "Corn", - "regrow": 4, - "seasons": [ - "summer", - "fall" - ], - "sell": 50, - "stages": [ - 2, - 3, - 3, - 3, - 3 - ] - }, - { - "buy": 240, - "harvest": { - "extra_chance": 0.1, - "level_increase": 5, - "max": 6, - "min": 2 - }, - "id": "cranberries", - "index": 493, - "name": "Cranberries", - "regrow": 5, - "seasons": [ - "fall" - ], - "sell": 75, - "stages": [ - 1, - 2, - 1, - 1, - 2 - ] - }, - { - "buy": 20, - "harvest": { - "extra_chance": 0.002, - "level_increase": 10, - "max": 2, - "min": 1 - }, - "id": "eggplant", - "index": 488, - "name": "Eggplant", - "regrow": 5, - "seasons": [ - "fall" - ], - "sell": 60, - "stages": [ - 1, - 1, - 1, - 1, - 1 - ] - }, - { - "buy": 200, - "harvest": {}, - "id": "fairy_rose", - "index": 425, - "name": "Fairy Rose", - "seasons": [ - "fall" - ], - "sell": 290, - "stages": [ - 1, - 4, - 4, - 3 - ] - }, - { - "buy": 40, - "harvest": {}, - "id": "garlic", - "index": 476, - "name": "Garlic", - "seasons": [ - "spring" - ], - "sell": 60, - "stages": [ - 1, - 1, - 1, - 1 - ] - }, - { - "buy": 60, - "harvest": { - "extra_chance": 0.0, - "level_increase": 6, - "max": 2, - "min": 1 - }, - "id": "grape", - "index": 301, - "name": "Grape", - "regrow": 3, - "seasons": [ - "fall" - ], - "sell": 80, - "stages": [ - 1, - 1, - 2, - 3, - 3 - ], - "trellis": true - }, - { - "buy": 60, - "harvest": { - "extra_chance": 0.0, - "level_increase": 6, - "max": 2, - "min": 1 - }, - "id": "green_bean", - "index": 473, - "name": "Green Bean", - "regrow": 3, - "seasons": [ - "spring" - ], - "sell": 40, - "stages": [ - 1, - 1, - 1, - 3, - 4 - ], - "trellis": true - }, - { - "buy": 60, - "harvest": { - "extra_chance": 0.0, - "level_increase": 6, - "max": 2, - "min": 1 - }, - "id": "hops", - "index": 302, - "name": "Hops", - "regrow": 1, - "seasons": [ - "summer" - ], - "sell": 25, - "stages": [ - 1, - 1, - 2, - 3, - 4 - ], - "trellis": true - }, - { - "buy": 40, - "harvest": { - "extra_chance": 0.03, - "level_increase": 5, - "max": 1, - "min": 1 - }, - "id": "hot_pepper", - "index": 482, - "name": "Hot Pepper", - "regrow": 3, - "seasons": [ - "summer" - ], - "sell": 40, - "stages": [ - 1, - 1, - 1, - 1, - 1 - ] - }, - { - "buy": 70, - "harvest": {}, - "id": "kale", - "index": 477, - "name": "Kale", - "scythe": true, - "seasons": [ - "spring" - ], - "sell": 110, - "stages": [ - 1, - 2, - 2, - 1 - ] - }, - { - "buy": 80, - "harvest": {}, - "id": "melon", - "index": 479, - "name": "Melon", - "seasons": [ - "summer" - ], - "sell": 250, - "stages": [ - 1, - 2, - 3, - 3, - 3 - ] - }, - { - "buy": 20, - "harvest": {}, - "id": "parsnip", - "index": 472, - "name": "Parsnip", - "seasons": [ - "spring" - ], - "sell": 35, - "stages": [ - 1, - 1, - 1, - 1 - ] - }, - { - "buy": 100, - "harvest": {}, - "id": "poppy", - "index": 453, - "name": "Poppy", - "seasons": [ - "summer" - ], - "sell": 140, - "stages": [ - 1, - 2, - 2, - 2 - ] - }, - { - "buy": 50, - "harvest": { - "extra_chance": 0.2, - "level_increase": 8, - "max": 2, - "min": 1 - }, - "id": "potato", - "index": 475, - "name": "Potato", - "seasons": [ - "spring" - ], - "sell": 80, - "stages": [ - 1, - 1, - 1, - 2, - 1 - ] - }, - { - "buy": 100, - "harvest": {}, - "id": "pumpkin", - "index": 490, - "name": "Pumpkin", - "seasons": [ - "fall" - ], - "sell": 320, - "stages": [ - 1, - 2, - 3, - 4, - 3 - ] - }, - { - "buy": 40, - "harvest": {}, - "id": "radish", - "index": 484, - "name": "Radish", - "seasons": [ - "summer" - ], - "sell": 90, - "stages": [ - 2, - 1, - 2, - 1 - ] - }, - { - "buy": 100, - "harvest": {}, - "id": "red_cabbage", - "index": 485, - "name": "Red Cabbage", - "seasons": [ - "summer" - ], - "sell": 260, - "stages": [ - 2, - 1, - 2, - 2, - 2 - ] - }, - { - "buy": 100, - "harvest": {}, - "id": "rhubarb", - "index": 478, - "name": "Rhubarb", - "seasons": [ - "spring" - ], - "sell": 220, - "stages": [ - 2, - 2, - 2, - 3, - 4 - ] - }, - { - "buy": 400, - "harvest": {}, - "id": "starfruit", - "index": 486, - "name": "Starfruit", - "seasons": [ - "summer" - ], - "sell": 750, - "stages": [ - 2, - 3, - 2, - 3, - 3 - ] - }, - { - "buy": 100, - "harvest": { - "extra_chance": 0.02, - "level_increase": 5, - "max": 1, - "min": 1 - }, - "id": "strawberry", - "index": 745, - "name": "Strawberry", - "regrow": 4, - "seasons": [ - "spring" - ], - "sell": 120, - "stages": [ - 1, - 1, - 2, - 2, - 2 - ] - }, - { - "buy": 50, - "harvest": {}, - "id": "summer_spangle", - "index": 455, - "name": "Summer Spangle", - "seasons": [ - "summer" - ], - "sell": 90, - "stages": [ - 1, - 2, - 3, - 2 - ] - }, - { - "buy": 125, - "harvest": {}, - "id": "sunflower", - "index": 431, - "name": "Sunflower", - "note": "Cheapest at JojaMart", - "seasons": [ - "summer", - "fall" - ], - "sell": 80, - "stages": [ - 1, - 2, - 3, - 2 - ] - }, - { - "buy": 1000, - "harvest": {}, - "id": "sweet_gem_berry", - "index": 347, - "name": "Sweet Gem Berry", - "seasons": [ - "fall" - ], - "sell": 3000, - "stages": [ - 2, - 4, - 6, - 6, - 6 - ] - }, - { - "buy": 50, - "harvest": { - "extra_chance": 0.05, - "level_increase": 6, - "max": 1, - "min": 1 - }, - "id": "tomato", - "index": 480, - "name": "Tomato", - "regrow": 4, - "seasons": [ - "summer" - ], - "sell": 60, - "stages": [ - 2, - 2, - 2, - 2, - 3 - ] - }, - { - "buy": 20, - "harvest": {}, - "id": "tulip", - "index": 427, - "name": "Tulip", - "seasons": [ - "spring" - ], - "sell": 30, - "stages": [ - 1, - 1, - 2, - 2 - ] - }, - { - "buy": 10, - "harvest": {}, - "id": "wheat", - "index": 483, - "name": "Wheat", - "scythe": true, - "seasons": [ - "summer", - "fall" - ], - "sell": 25, - "stages": [ - 1, - 1, - 1, - 1 - ] - }, - { - "buy": 60, - "harvest": {}, - "id": "yam", - "index": 492, - "name": "Yam", - "seasons": [ - "fall" - ], - "sell": 160, - "stages": [ - 1, - 3, - 3, - 3 - ] - } - ], - "fertilizer": [ - { - "buy": 0, - "id": "none", - "name": "None" - }, - { - "buy": 100, - "id": "basic_fertilizer", - "name": "Basic Fertilizer" - }, - { - "buy": 150, - "id": "quality_fertilizer", - "name": "Quality Fertilizer" - }, - { - "buy": 100, - "growth_rate": 0.1, - "id": "speed_gro", - "name": "Speed-Gro" - }, - { - "buy": 150, - "growth_rate": 0.25, - "id": "delux_speed_gro", - "name": "Delux Speed-Gro" - } - ], - "events": { - "spring": [ - { - "day": 4, - "name": "Kent" - }, - { - "day": 7, - "name": "Lewis" - }, - { - "day": 10, - "name": "Vincent" - }, - { - "day": 13, - "name": "Egg Festival", - "festival": true - }, - { - "day": 14, - "name": "Haley" - }, - { - "day": 15, - "name": "Desert Festival", - "festival": true - }, - { - "day": 16, - "name": "Desert Festival", - "festival": true - }, - { - "day": 17, - "name": "Desert Festival", - "festival": true - }, - { - "day": 18, - "name": "Pam" - }, - { - "day": 20, - "name": "Shane" - }, - { - "day": 24, - "name": "Flower Dance", - "festival": true - }, - { - "day": 26, - "name": "Pierre" - }, - { - "day": 27, - "name": "Emily" - } - ], - "summer": [ - { - "day": 4, - "name": "Jas" - }, - { - "day": 8, - "name": "Gus" - }, - { - "day": 10, - "name": "Maru" - }, - { - "day": 11, - "name": "Luau", - "festival": true - }, - { - "day": 13, - "name": "Alex" - }, - { - "day": 17, - "name": "Sam" - }, - { - "day": 19, - "name": "Demetrius" - }, - { - "day": 20, - "name": "Trout Derby", - "festival": true - }, - { - "day": 21, - "name": "Trout Derby", - "festival": true - }, - { - "day": 22, - "name": "Dwarf" - }, - { - "day": 24, - "name": "Willy" - }, - { - "day": 28, - "name": "Dance of the Moonlight Jellies", - "festival": true - } - ], - "fall": [ - { - "day": 2, - "name": "Penny" - }, - { - "day": 5, - "name": "Elliot" - }, - { - "day": 11, - "name": "Jodi" - }, - { - "day": 13, - "name": "Abigail" - }, - { - "day": 15, - "name": "Sandy" - }, - { - "day": 16, - "name": "Stardew Valley Fair", - "festival": true - }, - { - "day": 18, - "name": "Marnie" - }, - { - "day": 21, - "name": "Robin" - }, - { - "day": 24, - "name": "George" - }, - { - "day": 27, - "name": "Spirit's Eve", - "festival": true - } - ], - "winter": [ - { - "day": 1, - "name": "Krobus" - }, - { - "day": 3, - "name": "Linus" - }, - { - "day": 7, - "name": "Caroline" - }, - { - "day": 8, - "name": "Festival of Ice", - "festival": true - }, - { - "day": 10, - "name": "Sebastian" - }, - { - "day": 12, - "name": "SquidFest", - "festival": true - }, - { - "day": 13, - "name": "SquidFest", - "festival": true - }, - { - "day": 14, - "name": "Harvey" - }, - { - "day": 15, - "name": "Night Market", - "festival": true - }, - { - "day": 16, - "name": "Night Market", - "festival": true - }, - { - "day": 17, - "name": "Night Market", - "festival": true - }, - { - "day": 17, - "name": "Wizard" - }, - { - "day": 20, - "name": "Evelyn" - }, - { - "day": 23, - "name": "Leah" - }, - { - "day": 25, - "name": "Feast of the Winter Star", - "festival": true - }, - { - "day": 26, - "name": "Clint" - } - ] - } + "crops": [ + { + "buy": 70, + "harvest": {}, + "id": "amaranth", + "index": 299, + "name": "Amaranth", + "scythe": true, + "seasons": [ + "fall" + ], + "sell": 150, + "stages": [ + 1, + 2, + 2, + 2 + ] + }, + { + "buy": 700, + "harvest": {}, + "id": "ancient_fruit", + "index": 499, + "name": "Ancient Fruit", + "regrow": 7, + "seasons": [ + "spring", + "summer", + "fall" + ], + "sell": 550, + "stages": [ + 2, + 7, + 7, + 7, + 5 + ] + }, + { + "buy": 30, + "harvest": {}, + "id": "artichoke", + "index": 489, + "name": "Artichoke", + "seasons": [ + "fall" + ], + "sell": 160, + "stages": [ + 2, + 2, + 1, + 2, + 1 + ] + }, + { + "buy": 20, + "harvest": {}, + "id": "beet", + "index": 494, + "name": "Beet", + "seasons": [ + "fall" + ], + "sell": 100, + "stages": [ + 1, + 1, + 2, + 2 + ] + }, + { + "buy": 30, + "harvest": {}, + "id": "blue_jazz", + "index": 429, + "name": "Blue Jazz", + "seasons": [ + "spring" + ], + "sell": 50, + "stages": [ + 1, + 2, + 2, + 2 + ] + }, + { + "buy": 80, + "harvest": { + "extra_chance": 0.02, + "level_increase": 5, + "max": 5, + "min": 3 + }, + "id": "blueberry", + "index": 481, + "name": "Blueberry", + "regrow": 4, + "seasons": [ + "summer" + ], + "sell": 50, + "stages": [ + 1, + 3, + 3, + 4, + 2 + ] + }, + { + "buy": 50, + "harvest": {}, + "id": "bok_choy", + "index": 491, + "name": "Bok Choy", + "seasons": [ + "fall" + ], + "sell": 80, + "stages": [ + 1, + 1, + 1, + 1 + ] + }, + { + "buy": 80, + "harvest": {}, + "id": "cauliflower", + "index": 474, + "name": "Cauliflower", + "seasons": [ + "spring" + ], + "sell": 175, + "stages": [ + 1, + 2, + 4, + 4, + 1 + ] + }, + { + "buy": 30, + "harvest": { + "extra_chance": 0.02, + "level_increase": 10, + "max": 6, + "min": 4 + }, + "id": "coffee_bean", + "index": 433, + "name": "Coffee Bean", + "note": "Sold by Travelling Cart for ~2500g", + "regrow": 2, + "seasons": [ + "spring", + "summer" + ], + "sell": 15, + "stages": [ + 1, + 2, + 2, + 3, + 2 + ] + }, + { + "buy": 150, + "harvest": { + "extra_chance": 0.0, + "level_increase": 5, + "max": 2, + "min": 1 + }, + "id": "corn", + "index": 487, + "name": "Corn", + "regrow": 4, + "seasons": [ + "summer", + "fall" + ], + "sell": 50, + "stages": [ + 2, + 3, + 3, + 3, + 3 + ] + }, + { + "buy": 240, + "harvest": { + "extra_chance": 0.1, + "level_increase": 5, + "max": 6, + "min": 2 + }, + "id": "cranberries", + "index": 493, + "name": "Cranberries", + "regrow": 5, + "seasons": [ + "fall" + ], + "sell": 75, + "stages": [ + 1, + 2, + 1, + 1, + 2 + ] + }, + { + "buy": 20, + "harvest": { + "extra_chance": 0.002, + "level_increase": 10, + "max": 2, + "min": 1 + }, + "id": "eggplant", + "index": 488, + "name": "Eggplant", + "regrow": 5, + "seasons": [ + "fall" + ], + "sell": 60, + "stages": [ + 1, + 1, + 1, + 1, + 1 + ] + }, + { + "buy": 200, + "harvest": {}, + "id": "fairy_rose", + "index": 425, + "name": "Fairy Rose", + "seasons": [ + "fall" + ], + "sell": 290, + "stages": [ + 1, + 4, + 4, + 3 + ] + }, + { + "buy": 40, + "harvest": {}, + "id": "garlic", + "index": 476, + "name": "Garlic", + "seasons": [ + "spring" + ], + "sell": 60, + "stages": [ + 1, + 1, + 1, + 1 + ] + }, + { + "buy": 60, + "harvest": { + "extra_chance": 0.0, + "level_increase": 6, + "max": 2, + "min": 1 + }, + "id": "grape", + "index": 301, + "name": "Grape", + "regrow": 3, + "seasons": [ + "fall" + ], + "sell": 80, + "stages": [ + 1, + 1, + 2, + 3, + 3 + ], + "trellis": true + }, + { + "buy": 60, + "harvest": { + "extra_chance": 0.0, + "level_increase": 6, + "max": 2, + "min": 1 + }, + "id": "green_bean", + "index": 473, + "name": "Green Bean", + "regrow": 3, + "seasons": [ + "spring" + ], + "sell": 40, + "stages": [ + 1, + 1, + 1, + 3, + 4 + ], + "trellis": true + }, + { + "buy": 60, + "harvest": { + "extra_chance": 0.0, + "level_increase": 6, + "max": 2, + "min": 1 + }, + "id": "hops", + "index": 302, + "name": "Hops", + "regrow": 1, + "seasons": [ + "summer" + ], + "sell": 25, + "stages": [ + 1, + 1, + 2, + 3, + 4 + ], + "trellis": true + }, + { + "buy": 40, + "harvest": { + "extra_chance": 0.03, + "level_increase": 5, + "max": 1, + "min": 1 + }, + "id": "hot_pepper", + "index": 482, + "name": "Hot Pepper", + "regrow": 3, + "seasons": [ + "summer" + ], + "sell": 40, + "stages": [ + 1, + 1, + 1, + 1, + 1 + ] + }, + { + "buy": 70, + "harvest": {}, + "id": "kale", + "index": 477, + "name": "Kale", + "scythe": true, + "seasons": [ + "spring" + ], + "sell": 110, + "stages": [ + 1, + 2, + 2, + 1 + ] + }, + { + "buy": 80, + "harvest": {}, + "id": "melon", + "index": 479, + "name": "Melon", + "seasons": [ + "summer" + ], + "sell": 250, + "stages": [ + 1, + 2, + 3, + 3, + 3 + ] + }, + { + "buy": 20, + "harvest": {}, + "id": "parsnip", + "index": 472, + "name": "Parsnip", + "seasons": [ + "spring" + ], + "sell": 35, + "stages": [ + 1, + 1, + 1, + 1 + ] + }, + { + "buy": 100, + "harvest": {}, + "id": "poppy", + "index": 453, + "name": "Poppy", + "seasons": [ + "summer" + ], + "sell": 140, + "stages": [ + 1, + 2, + 2, + 2 + ] + }, + { + "buy": 50, + "harvest": { + "extra_chance": 0.2, + "level_increase": 8, + "max": 2, + "min": 1 + }, + "id": "potato", + "index": 475, + "name": "Potato", + "seasons": [ + "spring" + ], + "sell": 80, + "stages": [ + 1, + 1, + 1, + 2, + 1 + ] + }, + { + "buy": 100, + "harvest": {}, + "id": "pumpkin", + "index": 490, + "name": "Pumpkin", + "seasons": [ + "fall" + ], + "sell": 320, + "stages": [ + 1, + 2, + 3, + 4, + 3 + ] + }, + { + "buy": 40, + "harvest": {}, + "id": "radish", + "index": 484, + "name": "Radish", + "seasons": [ + "summer" + ], + "sell": 90, + "stages": [ + 2, + 1, + 2, + 1 + ] + }, + { + "buy": 100, + "harvest": {}, + "id": "red_cabbage", + "index": 485, + "name": "Red Cabbage", + "seasons": [ + "summer" + ], + "sell": 260, + "stages": [ + 2, + 1, + 2, + 2, + 2 + ] + }, + { + "buy": 100, + "harvest": {}, + "id": "rhubarb", + "index": 478, + "name": "Rhubarb", + "seasons": [ + "spring" + ], + "sell": 220, + "stages": [ + 2, + 2, + 2, + 3, + 4 + ] + }, + { + "buy": 400, + "harvest": {}, + "id": "starfruit", + "index": 486, + "name": "Starfruit", + "seasons": [ + "summer" + ], + "sell": 750, + "stages": [ + 2, + 3, + 2, + 3, + 3 + ] + }, + { + "buy": 100, + "harvest": { + "extra_chance": 0.02, + "level_increase": 5, + "max": 1, + "min": 1 + }, + "id": "strawberry", + "index": 745, + "name": "Strawberry", + "regrow": 4, + "seasons": [ + "spring" + ], + "sell": 120, + "stages": [ + 1, + 1, + 2, + 2, + 2 + ] + }, + { + "buy": 50, + "harvest": {}, + "id": "summer_spangle", + "index": 455, + "name": "Summer Spangle", + "seasons": [ + "summer" + ], + "sell": 90, + "stages": [ + 1, + 2, + 3, + 2 + ] + }, + { + "buy": 125, + "harvest": {}, + "id": "sunflower", + "index": 431, + "name": "Sunflower", + "note": "Cheapest at JojaMart", + "seasons": [ + "summer", + "fall" + ], + "sell": 80, + "stages": [ + 1, + 2, + 3, + 2 + ] + }, + { + "buy": 1000, + "harvest": {}, + "id": "sweet_gem_berry", + "index": 347, + "name": "Sweet Gem Berry", + "seasons": [ + "fall" + ], + "sell": 3000, + "stages": [ + 2, + 4, + 6, + 6, + 6 + ] + }, + { + "buy": 50, + "harvest": { + "extra_chance": 0.05, + "level_increase": 6, + "max": 1, + "min": 1 + }, + "id": "tomato", + "index": 480, + "name": "Tomato", + "regrow": 4, + "seasons": [ + "summer" + ], + "sell": 60, + "stages": [ + 2, + 2, + 2, + 2, + 3 + ] + }, + { + "buy": 20, + "harvest": {}, + "id": "tulip", + "index": 427, + "name": "Tulip", + "seasons": [ + "spring" + ], + "sell": 30, + "stages": [ + 1, + 1, + 2, + 2 + ] + }, + { + "buy": 10, + "harvest": {}, + "id": "wheat", + "index": 483, + "name": "Wheat", + "scythe": true, + "seasons": [ + "summer", + "fall" + ], + "sell": 25, + "stages": [ + 1, + 1, + 1, + 1 + ] + }, + { + "buy": 60, + "harvest": {}, + "id": "yam", + "index": 492, + "name": "Yam", + "seasons": [ + "fall" + ], + "sell": 160, + "stages": [ + 1, + 3, + 3, + 3 + ] + }, + { + "buy": 15, + "harvest": {}, + "id": "carrot", + "index": 746, + "name": "Carrot", + "seasons": [ + "spring" + ], + "sell": 35, + "stages": [ + 1, + 1, + 1 + ], + "note": "Seeds not sold (1.6+); obtained from Seed Spots/Raccoon/etc. Buy value set to seed sell price for planning." + }, + { + "buy": 20, + "harvest": {}, + "id": "summer_squash", + "index": 747, + "name": "Summer Squash", + "seasons": [ + "summer" + ], + "sell": 45, + "stages": [ + 1, + 1, + 1, + 1, + 2 + ], + "regrow": 3, + "note": "Seeds not sold (1.6+); obtained from Seed Spots/Raccoon/etc. Buy value set to seed sell price for planning." + }, + { + "buy": 40, + "harvest": {}, + "id": "broccoli", + "index": 748, + "name": "Broccoli", + "seasons": [ + "fall" + ], + "sell": 70, + "stages": [ + 2, + 2, + 2, + 2 + ], + "regrow": 4, + "note": "Seeds not sold (1.6+); obtained from Seed Spots/Raccoon/etc. Buy value set to seed sell price for planning." + }, + { + "buy": 20, + "harvest": {}, + "id": "powdermelon", + "index": 749, + "name": "Powdermelon", + "seasons": [ + "winter" + ], + "sell": 60, + "stages": [ + 1, + 1, + 1, + 2, + 2 + ], + "note": "Seeds not sold (1.6+); obtained from Seed Spots/Raccoon/etc. Buy value set to seed sell price for planning." + } + ], + "fertilizer": [ + { + "buy": 0, + "id": "none", + "name": "None" + }, + { + "buy": 100, + "id": "basic_fertilizer", + "name": "Basic Fertilizer" + }, + { + "buy": 150, + "id": "quality_fertilizer", + "name": "Quality Fertilizer" + }, + { + "buy": 100, + "growth_rate": 0.1, + "id": "speed_gro", + "name": "Speed-Gro" + }, + { + "buy": 150, + "growth_rate": 0.25, + "id": "delux_speed_gro", + "name": "Delux Speed-Gro" + }, + { + "buy": 150, + "growth_rate": 0.25, + "id": "deluxe_speed_gro", + "name": "Deluxe Speed-Gro" + }, + { + "buy": 0, + "growth_rate": 0.33, + "id": "hyper_speed_gro", + "name": "Hyper Speed-Gro" + }, + { + "buy": 0, + "id": "deluxe_fertilizer", + "name": "Deluxe Fertilizer" + } + ], + "events": { + "spring": [ + { + "day": 4, + "name": "Kent" + }, + { + "day": 7, + "name": "Lewis" + }, + { + "day": 10, + "name": "Vincent" + }, + { + "day": 13, + "name": "Egg Festival", + "festival": true + }, + { + "day": 14, + "name": "Haley" + }, + { + "day": 15, + "name": "Desert Festival", + "festival": true + }, + { + "day": 16, + "name": "Desert Festival", + "festival": true + }, + { + "day": 17, + "name": "Desert Festival", + "festival": true + }, + { + "day": 18, + "name": "Pam" + }, + { + "day": 20, + "name": "Shane" + }, + { + "day": 24, + "name": "Flower Dance", + "festival": true + }, + { + "day": 26, + "name": "Pierre" + }, + { + "day": 27, + "name": "Emily" + } + ], + "summer": [ + { + "day": 4, + "name": "Jas" + }, + { + "day": 8, + "name": "Gus" + }, + { + "day": 10, + "name": "Maru" + }, + { + "day": 11, + "name": "Luau", + "festival": true + }, + { + "day": 13, + "name": "Alex" + }, + { + "day": 17, + "name": "Sam" + }, + { + "day": 19, + "name": "Demetrius" + }, + { + "day": 20, + "name": "Trout Derby", + "festival": true + }, + { + "day": 21, + "name": "Trout Derby", + "festival": true + }, + { + "day": 22, + "name": "Dwarf" + }, + { + "day": 24, + "name": "Willy" + }, + { + "day": 26, + "name": "Leo" + }, + { + "day": 28, + "name": "Dance of the Moonlight Jellies", + "festival": true + } + ], + "fall": [ + { + "day": 2, + "name": "Penny" + }, + { + "day": 5, + "name": "Elliot" + }, + { + "day": 11, + "name": "Jodi" + }, + { + "day": 13, + "name": "Abigail" + }, + { + "day": 15, + "name": "Sandy" + }, + { + "day": 16, + "name": "Stardew Valley Fair", + "festival": true + }, + { + "day": 18, + "name": "Marnie" + }, + { + "day": 21, + "name": "Robin" + }, + { + "day": 24, + "name": "George" + }, + { + "day": 27, + "name": "Spirit's Eve", + "festival": true + } + ], + "winter": [ + { + "day": 1, + "name": "Krobus" + }, + { + "day": 3, + "name": "Linus" + }, + { + "day": 7, + "name": "Caroline" + }, + { + "day": 8, + "name": "Festival of Ice", + "festival": true + }, + { + "day": 10, + "name": "Sebastian" + }, + { + "day": 12, + "name": "SquidFest", + "festival": true + }, + { + "day": 13, + "name": "SquidFest", + "festival": true + }, + { + "day": 14, + "name": "Harvey" + }, + { + "day": 15, + "name": "Night Market", + "festival": true + }, + { + "day": 16, + "name": "Night Market", + "festival": true + }, + { + "day": 17, + "name": "Night Market", + "festival": true + }, + { + "day": 17, + "name": "Wizard" + }, + { + "day": 20, + "name": "Evelyn" + }, + { + "day": 23, + "name": "Leah" + }, + { + "day": 25, + "name": "Feast of the Winter Star", + "festival": true + }, + { + "day": 26, + "name": "Clint" + } + ] + } } \ No newline at end of file From ca759a48673d741852c7219c4b6f674899b92ac2 Mon Sep 17 00:00:00 2001 From: dameoffensive-cloud Date: Sun, 8 Feb 2026 10:31:33 -0500 Subject: [PATCH 006/171] Add files via upload --- planner.js | 1636 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1636 insertions(+) create mode 100644 planner.js diff --git a/planner.js b/planner.js new file mode 100644 index 0000000..0c701d8 --- /dev/null +++ b/planner.js @@ -0,0 +1,1636 @@ +// CONSTANTS +var SEASON_DAYS = 28; +var YEAR_DAYS = SEASON_DAYS * 4; +var VERSION = "2.0"; +var DATA_VERSION = "2"; + + +// Save/load helper functions +function SAVE_JSON(key, data){ + var json_data = JSON.stringify(data); + localStorage.setItem(key + "_v" + DATA_VERSION, json_data); +} + +function LOAD_JSON(key, raw_json){ + var json_data = localStorage.getItem(key + "_v" + DATA_VERSION); + if (!json_data) return; + if (raw_json) return json_data; + return JSON.parse(json_data); +} + +// Misc helper functions +function round(num, decimals){ + decimals = Math.pow(10, decimals || 0); + return Math.round(num * decimals) / decimals; +} + + +// Angular app +angular.module("planner_app", ["checklist-model"]) + .controller("planner_controller", planner_controller); + +function planner_controller($scope){ + + /******************************** + PLANNER VARIABLES + ********************************/ + var self = this; window.planner = self; + + // Core data & objects + self.config = {}; + self.loaded = false; + self.sidebar; + self.player; + self.planner_modal; + + // Static planner data + self.days = new Array(YEAR_DAYS); // Array of days in a year (only used by one ng-repeat) + self.seasons = []; // Array of seasons + self.SEASON_DAYS = SEASON_DAYS; // Exposing SEASON_DAYS constant to app scope + self.crops_list = []; // [id, id, ...] + self.crops = {}; // {id: {data}} + self.fertilizer = {}; // [fertilizer, fertilizer, ...] + self.events = {}; // Birthdays & festivals + + // State objects & variables + self.years = []; + + self.cdate; // Current date to add plan to + self.cseason; // Current season + self.cmode = "farm"; // Current farm mode (farm / greenhouse) + self.cyear; // Current year + + self.newplan; + self.editplan; + + // Core planner functions + self.update = update; + self.add_plan = add_plan; + self.add_plan_key = add_plan_key; + self.edit_plan = edit_plan; + self.remove_plan = remove_plan; + self.clear_season = clear_season; + self.clear_year = clear_year; + self.clear_all = clear_all; + self.open_plans = open_plans; + + self.inc_year = inc_year; // Increment/decrement current year + self.inc_season = inc_season; // Increment/decrement current season + self.set_season = set_season; // Set current season + self.cfarm = cfarm; // Get current farm + self.in_greenhouse = in_greenhouse; // Check if current farm mode == greenhouse + self.toggle_mode = toggle_mode; // Toggle current farm mode (farm / greenhouse) + self.set_mode = set_mode; // Set current farm mode (farm / greenhouse) + + self.get_season = get_season; // Get season object by id + self.get_date = get_date; // Get formatted date string + self.ci_set_sort = ci_set_sort; // Set key to sort crop info by + self.planner_valid_crops = planner_valid_crops; + + // Crop info search/filter settings + self.cinfo_settings = { + season: "spring", + seasons: ["spring"], + season_options: [], + sort: "name", + search: "", + regrows: false, + order: false, + use_fbp: false, + }; + + + /******************************** + PLANNER INITIALIZATION + ********************************/ + function init(){ + // Initialize planner variables + self.sidebar = new Sidebar; + self.player = new Player; + self.planner_modal = $("#crop_planner"); + + for (var i = 0; i < self.days.length; i++) self.days[i] = i + 1; + self.seasons = [new Season(0), new Season(1), new Season(2), new Season(3)]; + self.cseason = self.seasons[0]; + self.cinfo_settings.season_options = [self.seasons[0], self.seasons[1], self.seasons[2]]; + + // Enable bootstrap tooltips + $("body").tooltip({selector: "[data-toggle=tooltip]", trigger: "hover", container: "body"}); + + // Keydown events + $(document).keydown(function(e){ + if (planner_event_handler(e)) return; + if (self.sidebar.keydown(e)) return; + }); + + // On modal close: save plans and update + self.planner_modal.on("hide.bs.modal", function(){ + // Only if currently editing + if (self.editplan){ + self.editplan = null; + self.update(self.cyear); + $scope.$apply(); + } + }); + + // Development mode + // has issues in Firefox, works fine in Chrome + if (window.location.hash == "#dev"){ + console.log("Development mode enabled."); + + // Update CSS every 400 ms + var stylesheet = $("link[href='style.css']"); + var stylesheet_url = stylesheet.attr("href"); + setInterval(function(){ + var time = Date.now(); + stylesheet.attr("href", stylesheet_url + "?t=" + time); + }, 400); + } + + // Load planner config data + $.ajax({ + url: "config.json", + dataType: "json", + success: function(config){ + self.config = config; + + // Process crop data + $.each(self.config.crops, function(i, crop){ + crop = new Crop(crop); + self.crops_list.push(crop); + self.crops[crop.id] = crop; + }); + + // Process fertilizer data + $.each(self.config.fertilizer, function(i, fertilizer){ + fertilizer = new Fertilizer(fertilizer); + self.config.fertilizer[i] = fertilizer; + self.fertilizer[fertilizer.id] = fertilizer; + }); + + // Process events data + var s_index = 0; + $.each(self.config.events, function(season_name, season){ + $.each(season, function(ii, c_event){ + c_event.season = s_index; + c_event = new CalendarEvent(c_event); + self.events[c_event.date] = c_event; + }); + + s_index++; + }); + + // Create newplan template + self.newplan = new Plan; + + // Load saved plans from browser storage + var plan_count = load_data(); + + // Create first year if it doesn't exist + if (!self.years.length) self.years.push(new Year(0)); + + // Set current year to first year + self.cyear = self.years[0]; + + // Debug info + console.log("Loaded " + self.crops_list.length + " crops."); + console.log("Loaded " + plan_count + " plans into " + self.years.length + " year(s)."); + + // Update plans + update(self.years[0].data.farm, true); // Update farm + update(self.years[0].data.greenhouse, true); // Update greenhouse + + self.loaded = true; + $scope.$apply(); + }, + error: function(xhr, status, error){ + if (!xhr.responseText) return; + alert("An error occurred in loading planner data. Check the browser console."); + console.log("Error: ", status); + console.log("Reason: ", error); + } + }); + } + + + /******************************** + CORE PLANNER FUNCTIONS + ********************************/ + // Planner general event handler + function planner_event_handler(e){ + // Not focused on anything + if ($(document.activeElement).is("input") || $(document.activeElement).is("textarea")) return; + + // Sidebar must be closed + if (self.sidebar.is_open()) return; + + // Planner modal must be closed + if (self.planner_modal.hasClass("in")) return; + + var event_handled = true; + if (e.which == 39){ + // Right arrow + self.inc_season(1); + } else if (e.which == 37){ + // Left arrow + self.inc_season(-1); + } else if (e.which == 27){ + // ESC + self.sidebar.open("cropinfo"); + } else if (e.which == 192){ + // Tilde + self.toggle_mode(); + } else { + event_handled = false; + } + + if (event_handled){ + e.preventDefault(); + $scope.$apply(); + return true; + } + } + + // Save plan data to browser storage + function save_data(){ + // Save plan data + var plan_data = []; + $.each(self.years, function(i, year){ + var year_data = year.get_data(); + //if (!year_data) return; // continue + plan_data.push(year_data); + }); + SAVE_JSON("plans", plan_data); + } + + // Load plan data from browser storage + function load_data(){ + // Load plan data + var plan_data = LOAD_JSON("plans"); + if (!plan_data) return 0; + + var plan_count = 0; + self.years = []; + $.each(plan_data, function(i, year_data){ + var new_year = new Year(i); + plan_count += new_year.set_data(year_data); + self.years.push(new_year); + }); + self.cyear = self.years[0]; + + return plan_count; + } + + // Update planner info of current farm/year + function update(farm, full_update){ + // Received year, expected farm + if (farm instanceof Year) farm = farm.farm(); + + // If farm is null, get first farm/year + farm = farm || self.years[0].farm(); + + // Update all years after this one VS just this year + full_update = full_update || (farm.greenhouse && farm.has_regrowing_crops()); + + // Reset harvests + farm.harvests = []; + + // Reset financial totals + farm.totals = {}; + farm.totals.day = {}; + farm.totals.season = [new Finance, new Finance, new Finance, new Finance]; + farm.totals.year = new Finance; + + // Rebuild data + $.each(farm.plans, function(date, plans){ + date = parseInt(date); + + $.each(plans, function(i, plan){ + var crop = plan.crop; + var first_harvest = date + plan.get_grow_time(); + var planting_cost = plan.get_cost(); + var season = self.seasons[Math.floor((plan.date-1)/SEASON_DAYS)]; + var crop_end = crop.end; + + if (farm.greenhouse){ + crop_end = YEAR_DAYS; + } + + // Update daily costs for planting + if (!farm.totals.day[date]) farm.totals.day[date] = new Finance; + var d_plant = farm.totals.day[date]; + d_plant.profit.min -= planting_cost; + d_plant.profit.max -= planting_cost; + + // Update seasonal costs for planting + var s_plant_total = farm.totals.season[season.index]; + s_plant_total.profit.min -= planting_cost; + s_plant_total.profit.max -= planting_cost; + + // Update seasonal number of plantings + s_plant_total.plantings += plan.amount; + + // If first harvest of crop occurs after its + // growth season(s), continue $.each + if (first_harvest > crop_end) return; + + // Initial harvest + var harvests = []; + harvests.push(new Harvest(plan, first_harvest)); + + // Regrowth harvests + if (crop.regrow){ + var regrowths = Math.floor((crop_end - first_harvest) / crop.regrow); + for (var i = 1; i <= regrowths; i++){ + var regrow_date = first_harvest + (i * crop.regrow); + if (regrow_date > crop_end) break; + harvests.push(new Harvest(plan, regrow_date, true)); + } + } + + // Assign harvests to plan object + plan.harvests = harvests; + + // Add up all harvests + for (var i = 0; i < harvests.length; i++){ + var harvest = harvests[i]; + + // Update harvests + if (!farm.harvests[harvest.date]) farm.harvests[harvest.date] = []; + farm.harvests[harvest.date].push(harvest); + + // Update daily revenues from harvests + if (!farm.totals.day[harvest.date]) farm.totals.day[harvest.date] = new Finance; + var d_harvest = farm.totals.day[harvest.date]; + d_harvest.profit.min += harvest.revenue.min; + d_harvest.profit.max += harvest.revenue.max; + + // Update seasonal revenues from harvests + var h_season = Math.floor((harvest.date - 1) / SEASON_DAYS); + var s_harvest_total = farm.totals.season[h_season]; + s_harvest_total.profit.min += harvest.revenue.min; + s_harvest_total.profit.max += harvest.revenue.max; + + // Update seasonal number of harvests + s_harvest_total.harvests.min += harvest.yield.min; + s_harvest_total.harvests.max += harvest.yield.max; + } + }); + }); + + // Add up annual total + for (var i = 0; i < farm.totals.seasons; i++){ + var season = farm.totals.seasons[i]; + var y_total = farm.totals.year; + y_total.profit.min += season.profit.min + y_total.profit.max += season.profit.max + } + + // Update next year + if (full_update){ + var next_year = farm.year.next(); + if (!next_year) return; + update(next_year, true); + } + } + + // Add self.newplan to plans list + function add_plan(date, auto_replant){ + if (!validate_plan_amount()) return; + self.cyear.add_plan(self.newplan, date, auto_replant); + self.newplan = new Plan; + } + + // Add plan to plans list on enter keypress + function add_plan_key(date, e){ + if (e.which != 13) return; + if (!validate_plan_amount()) return; + add_plan(date); + } + + // Validate newplan amount + function validate_plan_amount(){ + // Remove all whitespace + var amount = (self.newplan.amount + "") || ""; + amount = amount.replace(/\s/g, ""); + + // Is empty string + if (!amount){ + self.newplan.amount = 1; + return; + } + + // Check if input is in gold + if (amount.toLowerCase().endsWith("g")){ + var match = amount.match(/^([0-9]+)g$/i) + if (!match) return; + + var gold = parseInt(match[1] || 0); + var crop = self.crops[self.newplan.crop_id]; + if (!crop) return; + amount = Math.floor(gold / crop.buy); + amount = amount || 1; + self.newplan.amount = amount; + return; + } + + // Invalid non-integer amount + if (!amount.match(/^[0-9]+$/)) return; + + // Parse normal integer input + amount = parseInt(amount || 0); + if (amount <= 0) return; + + return true; + } + + // Edit plan + function edit_plan(plan, save){ + if (save){ + self.editplan = null; + save_data(); + update(self.cyear); + return; + } else if (self.editplan){ + // Other edit already open + save_data(); + update(self.cyear); + } + + self.editplan = plan; + } + + // Remove plan from plans list of current farm/year + function remove_plan(date, index){ + self.editplan = null; + self.cyear.remove_plan(date, index); + } + + // Remove plans from current farm/season + function clear_season(season){ + var full_update = self.cfarm().has_regrowing_crops(season); + for (var date = season.start; date <= season.end; date++){ + self.cfarm().plans[date] = []; + } + save_data(); + update(self.cyear, full_update); + } + + // Remove plans from current farm/year + function clear_year(year){ + var farm = year.farm(); + var full_update = farm.has_regrowing_crops(); + $.each(farm.plans, function(date, plans){ + farm.plans[date] = []; + }); + save_data(); + update(year, full_update); + } + + // Remove all plans + function clear_all(){ + if (!confirm("Permanently clear all plans?")) return; + self.years = [new Year(0)]; + self.cyear = self.years[0]; + save_data(); + update(null, true); + } + + // Open crop planner modal + function open_plans(date){ + self.planner_modal.modal(); + self.cdate = date; + } + + //////////////////////////////// + + // Increment/decrement current year; creates new year if necessary + function inc_year(direction){ + direction = direction > 0 ? true : false; + + if (direction){ + // Next year + self.cyear = self.cyear.next(true); + } else { + // Previous year + var prev_year = self.cyear.previous(); + if (!prev_year) return; + self.cyear = prev_year; + } + } + + // Increment/decrement current season; creates new year if necessary + function inc_season(direction){ + direction = direction > 0 ? true : false; + var next_season = direction ? self.cseason.index + 1 : self.cseason.index - 1; + + if (next_season > 3){ + // Next season + next_season = 0; + self.cyear = self.cyear.next(true); + } else if (next_season < 0) { + // Previous season + next_season = 3; + var prev_year = self.cyear.previous(); + if (!prev_year) return; + self.cyear = prev_year; + } + + self.set_season(next_season); + } + + // Set current season + function set_season(index){ + self.cseason = self.seasons[index]; + self.newplan.crop_id = null; + } + + // Get current farm object of current year + function cfarm(){ + if (!self.cyear) return {}; + return self.cyear.farm(); + } + + // Check if current farm mode is greenhouse + function in_greenhouse(){ + return self.cmode == "greenhouse"; + } + + // Toggle current farm mode + function toggle_mode(){ + if (self.cmode == "farm"){ + set_mode("greenhouse"); + } else { + set_mode("farm"); + } + } + + // Set current farm mode + function set_mode(mode){ + self.cmode = mode; + } + + //////////////////////////////// + + // Get season object by id name or date + function get_season(id){ + // Get season containing a date + if (typeof id == "number"){ + return self.seasons[Math.floor((id - 1) / SEASON_DAYS)]; + } + + // Get season by string ID + for (var i = 0; i < self.seasons.length; i++){ + if (self.seasons[i].id == id) return self.seasons[i]; + } + } + + // Get formatted date + function get_date(real_date, format){ + real_date = real_date || self.cdate; + if (!real_date) return; + date = real_date % SEASON_DAYS || SEASON_DAYS; + + var nth = "th"; // st nd rd th + if (date <= 3 || date >= 21){ + switch((date % 100) % 10){ + case 1: nth = "st"; break; + case 2: nth = "nd"; break; + case 3: nth = "rd"; break; + } + } + + var days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; + var day = days[date % 7]; + var season = self.seasons[Math.floor((real_date - 1) / SEASON_DAYS)]; + season = season.name; + + var str = format.replace("%l", day) + .replace("%j", date) + .replace("%S", nth) + .replace("%F", season); + + return str; + } + + // Set key to sort crop info by + function ci_set_sort(key){ + if (self.cinfo_settings.sort == key){ + self.cinfo_settings.order = !self.cinfo_settings.order; + } else { + self.cinfo_settings.sort = key; + self.cinfo_settings.order = false; + } + } + + // Filter crops that can be planted in the planner's drop down list + function planner_valid_crops(crop){ + return crop.can_grow(self.cseason, true) || self.in_greenhouse(); + } + + + /******************************** + CLASSES + ********************************/ + /**************** + Sidebar class - controlling the sidebar [single instance] + ****************/ + function Sidebar(){ + var self = this; + self.mode = ""; + self.crop = null; // crop object + + self.keydown = keydown; + self.open = open_view; + self.close = close_view; + self.is_open = is_open; + self.open_crop = open_crop; + self.back = back; + self.export_data = export_data; + self.import_data = import_data; + self.legacy_import_data = legacy_import_data; + + function keydown(e){ + // Sidebar must be open + if (!self.is_open()) return; + + var event_handled = true; + if (e.which == 27){ + // ESC + back(); + } else { + event_handled = false + } + + if (event_handled){ + e.preventDefault(); + $scope.$apply(); + return true; + } + } + + function close_view(){ + open_view(""); + } + + function is_open(){ + return self.mode != ""; + } + + function open_view(view){ + // Toggle off + if (self.mode == view) + view = ""; + + // Clear properties & save on close + if (!view){ + self.crop = null; + planner.cinfo_settings.search = ""; + planner.player.save(); + planner.update(null, true); + } else { + // Set certain properties on open + if (planner.cseason.id != "winter") + planner.cinfo_settings.seasons = [planner.cseason.id]; + } + + // Set mode + self.mode = view; + } + + function back(full_close){ + // back to crop info + if (self.crop){ + self.crop = null; + if (!full_close) return; + } + + open_view(""); + } + + function open_crop(crop){ + self.mode = "cropinfo"; + self.crop = crop; + } + + function export_data(){ + // Save player + //planner.player.save(); + + // Export data + var out_data = {}; + out_data.plans = LOAD_JSON("plans"); + //out_data.player = LOAD_JSON("player"); + out_data.version = DATA_VERSION; + + var blob = new Blob([JSON.stringify(out_data)], {type: "octet/stream"}); + var blob_url = window.URL.createObjectURL(blob); + + var link = document.createElement("a"); + link.href = blob_url; + link.style = "display: none"; + link.download = "Crop Planner [" + Date.now() + "]" + ".json"; + document.body.appendChild(link); + link.click(); + } + + function import_data(){ + var input = $("").appendTo("body"); + input.css("display", "none"); + input.change(read_file); + input.click(); + } + + function read_file(evt){ + var file = evt.target.files[0]; + if (!file) return; + + // Read data from JSON file + var reader = new FileReader; + reader.onload = function(e){ + var data = {}; + + try { + data = JSON.parse(e.target.result); + } catch(e){ + alert("Not valid JSON data to import.") + return; + } + + //if (!data.plans || !data.player){ + if (!data.plans){ + alert("Invalid data to import.") + return; + } + + if (data.version != DATA_VERSION){ + alert("Incompatible plan version."); + return; + } + + SAVE_JSON("plans", data.plans); + //SAVE_JSON("player", data.player); + + var plan_count = load_data(); + //planner.player.load(); + update(planner.years[0].data.farm, true); // Update farm + update(planner.years[0].data.greenhouse, true); // Update greenhouse + $scope.$apply(); + alert("Successfully imported " + plan_count + " plans into " + planner.years.length + " year(s)."); + console.log("Imported " + plan_count + " plans into " + planner.years.length + " year(s)."); + }; + + reader.readAsText(file); + } + + function legacy_import_data(){ + if (!confirm("This will attempt to import planner data from the old v1 planner, and will overwrite any current plans. This change is not reversible and is not guaranteed to always work. Continue?")) return; + + // Load old v1 planner data + var plan_data = localStorage.getItem("crops"); + if (!plan_data){ alert("No plan data to import"); return; } + plan_data = JSON.parse(plan_data); + if (!plan_data){ alert("No plan data to import"); return; } + + // Create new plan data + var new_plans = [{"farm":{}, "greenhouse":{}}]; + $.each(plan_data, function(date, plans){ + date = parseInt(date); + $.each(plans, function(i, plan){ + plan.date = date; + if (!planner.crops[plan.crop]) return; // Invalid crop + + if (plan.greenhouse){ + if (!new_plans[0].greenhouse[date]) new_plans[0].greenhouse[date] = []; + delete plan.greenhouse; + new_plans[0].greenhouse[date].push(plan); + } else { + if (!new_plans[0].farm[date]) new_plans[0].farm[date] = []; + new_plans[0].farm[date].push(plan); + } + + plan_count++; + }); + }); + + // Save data + SAVE_JSON("plans", new_plans); + + // Reload data and update + var plan_count = load_data(); + update(planner.years[0].data.farm, true); // Update farm + update(planner.years[0].data.greenhouse, true); // Update greenhouse + alert("Successfully imported " + plan_count + " legacy plans into " + planner.years.length + " year(s)."); + console.log("Imported " + plan_count + " legacy plans into " + planner.years.length + " year(s)."); + } + } + + + /**************** + Player class - user-set player configs [single instance] + ****************/ + function Player(){ + var self = this; + self.level = 0; // farming level; starts at 0 + self.tiller = false; + self.agriculturist = false; + + self.load = load + self.save = save; + self.toggle_perk = toggle_perk; + self.quality_chance = quality_chance; + + // Miscellaneous client settings + self.settings = { + show_events: true, + }; + + + init(); + + + function init(){ + load(); + console.log("Loaded player settings"); + } + + // Load player config from browser storage + function load(){ + var pdata = LOAD_JSON("player"); + if (!pdata) return; + + if (pdata.tiller) self.tiller = true; + if (pdata.agriculturist) self.agriculturist = true; + if (pdata.level) self.level = pdata.level; + if (pdata.settings) self.settings = pdata.settings; + } + + // Save player config to browser storage + function save(){ + var pdata = {}; + if (self.tiller) pdata.tiller = self.tiller; + if (self.agriculturist) pdata.agriculturist = self.agriculturist; + pdata.settings = self.settings; + pdata.level = self.level; + SAVE_JSON("player", pdata); + } + + // Toggle profession perks + function toggle_perk(key){ + self[key] = !self[key]; + + // Must have Tiller to have Agriculturist + if (!self.tiller && key == "tiller"){ + self.agriculturist = false; + } else if (self.agriculturist && key == "agriculturist"){ + self.tiller = true; + } + } + + // Get scalar value of chance of crop being 0=regular; 1=silver; 2=gold quality + // [SOURCE: StardewValley/Crop.cs : function harvest] + function quality_chance(quality, mult, locale){ + quality = quality || 0; // Default: check regular quality chance + mult = mult || 0; // Multiplier given by type of fertilizer used (0, 1, or 2) + + var gold_chance = 0.2 * (self.level / 10) + 0.2 * mult * ((self.level + 2) / 12) + 0.01; + var silver_chance = Math.min(0.75, gold_chance * 2); + + var chance = 0; + switch (quality){ + case 0: + chance = Math.max(0, 1 - (gold_chance + silver_chance)); + break; + case 1: + chance = Math.min(1, silver_chance); + break; + case 2: + chance = Math.min(1, gold_chance); + break; + } + + if (locale) return Math.round(chance * 100); + return chance; + } + } + + + /**************** + Season class - representing one of the four seasons + ****************/ + function Season(ind){ + var self = this; + self.index = ind; + self.id; + self.name; + self.start = 0; + self.end = 0; + + + init(); + + + function init(){ + var seasons = ["spring", "summer", "fall", "winter"]; + self.id = seasons[self.index]; + self.name = self.id.charAt(0).toUpperCase() + self.id.slice(1); + self.start = (self.index * SEASON_DAYS) + 1; + self.end = self.start + SEASON_DAYS - 1; + } + } + + Season.prototype.get_image = function(){ + return "images/seasons/" + this.id + ".png"; + }; + + + /**************** + Crop class - represents a crop + ****************/ + function Crop(data){ + var self = this; + + // Config properties + self.id; + self.name; + self.sell; + self.buy; + self.seasons = []; + self.stages = []; + self.regrow; + self.wild = false; + self.paddy = null; // {dry_days, irrigated_days} + + // Harvest data + self.harvest = { + min: 1, + max: 1, + level_increase: 1, + extra_chance: 0 + }; + + // Custom properties + self.note = ""; + self.start = 0; // Start of grow season(s) + self.end = 0; // End of grow season(s) + self.grow = 0; // Total days to grow + self.profit = 0; // Minimum profit/day (for crops info menu) + self.fixed_profit = 0; // Fixed budget profit + + + init(); + + + function init(){ + if (!data) return; + + // Base properties + self.id = data.id; + self.name = data.name; + self.sell = data.sell; + self.buy = data.buy; + self.seasons = data.seasons; + self.stages = data.stages; + self.regrow = data.regrow; + if (data.wild) self.wild = true; + if (data.paddy) self.paddy = data.paddy; + + // Harvest data + if (data.harvest.min) self.harvest.min = data.harvest.min; + if (data.harvest.max) self.harvest.max = data.harvest.max; + if (data.harvest.level_increase) self.harvest.level_increase = data.harvest.level_increase; + if (data.harvest.extra_chance) self.harvest.extra_chance = data.harvest.extra_chance; + + // Custom properties + if (data.note) self.note = data.note; + self.start = get_season(data.seasons[0]).start; + self.end = get_season(data.seasons[data.seasons.length-1]).end; + self.grow = 0; + for (var i = 0; i < data.stages.length; i++){ + self.grow += data.stages[i]; + } + + // Calculate profit per day + var season_days = (self.end - self.start) + 1; + var regrowths = self.regrow ? Math.floor(((season_days - 1) - self.grow) / self.regrow) : 0; + + var plantings = 1; + if (!regrowths) plantings = Math.floor((season_days - 1) / self.grow); + var growth_days = (plantings * self.grow) + (regrowths * (self.regrow ? self.regrow : 0)); + + self.profit -= self.buy * plantings; + self.profit += self.harvest.min * self.get_sell() * (plantings + regrowths); + self.profit = round(self.profit / growth_days, 1); + + // Calculate fixed budget profit + var budget = 1000; // 1000g worth of seeds + var plantings = Math.floor(budget / self.buy); + var growth_days = self.grow + (regrowths * (self.regrow ? self.regrow : 0)); + + self.fixed_profit -= self.buy * plantings; + self.fixed_profit += self.harvest.min * self.get_sell() * (plantings + regrowths); + self.fixed_profit = round((self.fixed_profit / growth_days), 1); + } + } + + // Get crop quality-modified sell price + // [SOURCE: StardewValley/Object.cs : function sellToStorePrice] + Crop.prototype.get_sell = function(quality){ + quality = quality || 0; + return Math.floor(this.sell * (1 + (quality * 0.25))); + }; + + // Check if crop can grow on date/season + Crop.prototype.can_grow = function(date, is_season, in_greenhouse){ + var self = this; + + // Expected numeric date, received array of seasons + if (date.constructor === Array){ + var result = false; + $.each(date, function(i, v){ + result = result || self.can_grow(v, is_season, in_greenhouse); + if (result) return false; // break on true + }); + return result; + } + + if (in_greenhouse && (date <= YEAR_DAYS)) return true; + if (is_season){ + var season = date; + if (typeof season == "string") season = planner.get_season(season); + return (this.start <= season.start) && (this.end >= season.end); + } else { + return (date >= this.start) && (date <= this.end); + } + }; + + // Get url to Stardew Valley wiki + Crop.prototype.get_url = function(){ + var fragment = this.id.split("_"); + for (var i=0; i= planner.years.length){ + if (!force_create) return; + var new_year = new Year(next_id); + planner.years.push(new_year); + return new_year; + } + return planner.years[next_id]; + }; + + // Returns previous year + Year.prototype.previous = function(){ + var next_id = this.index - 1; + if (next_id < 0) return; + return planner.years[next_id]; + }; + + // Get data from year (for saving) + Year.prototype.get_data = function(){ + var self = this; + var year_plans = {}; + var total_count = 0; + + $.each(self.data, function(type, farm){ + var type_plans = {}; + var type_count = 0; + + $.each(farm.plans, function(date, plans){ + if (!plans.length) return; + type_count += plans.length; + total_count += plans.length; + type_plans[date] = []; + + $.each(plans, function(i, plan){ + type_plans[date].push(plan.get_data()); + }); + }); + + if (type_count) year_plans[type] = type_plans; + }); + + if (!total_count) return; + return year_plans; + }; + + // Load data into year (from loading) + Year.prototype.set_data = function(l_data){ + var self = this; + var plan_count = 0; + + $.each(l_data, function(type, plan_data){ + $.each(plan_data, function(date, plans){ + date = parseInt(date); + + $.each(plans, function(i, plan){ + plan.date = date; + if (!planner.crops[plan.crop]) return; // Invalid crop + var plan_object = new Plan(plan, type == "greenhouse"); + self.data[type].plans[date].push(plan_object); + plan_count++; + }); + }); + }); + + return plan_count; + }; + + // Add plan to this farm/year + Year.prototype.add_plan = function(newplan, date, auto_replant){ + // Validate data + if (!newplan.crop_id) return false; + + // Date out of bounds + if (date < 1 || date > YEAR_DAYS) return false; + + // Check that crop can grow + var crop = planner.crops[newplan.crop_id]; + if (!crop || !crop.can_grow(date, false, planner.in_greenhouse())) return false; + newplan.crop = crop; + + // Amount to plant + newplan.amount = parseInt(newplan.amount || 0); + if (newplan.amount <= 0) return false; + + // Add plan + var plan = new Plan(newplan.get_data(), planner.in_greenhouse()); + plan.date = date; + this.farm().plans[date].push(plan); + + // Auto-replanting within current year + var crop_growth = plan.get_grow_time(); + var next_planting = date + crop_growth; + var next_grow = next_planting + crop_growth; + if (!auto_replant || crop.regrow || (auto_replant && !crop.can_grow(next_grow, false, planner.in_greenhouse()))){ + // Update + update(this); + save_data(); + } else if (auto_replant){ + // Auto-replant + this.add_plan(newplan, next_planting, true); + } + }; + + // Remove plan from current farm/year + Year.prototype.remove_plan = function(date, index){ + var farm = this.farm(); + if (!farm.plans[date][index]) return; + var full_update = farm.plans[date][index].crop.regrow; + farm.plans[date].splice(index, 1); + save_data(); + update(this, full_update); + }; + + + /**************** + Farm class - used only within Year + ****************/ + function Farm(parent_year, is_greenhouse){ + var self = this; + self.year; + self.greenhouse = false; + self.plans = {}; + self.harvests = {}; + self.totals = {}; + + + init(); + + + function init(){ + self.year = parent_year; + self.greenhouse = is_greenhouse; + + for (var i = 0; i < YEAR_DAYS; i++){ + self.plans[i+1] = []; + } + self.totals.season = [new Finance, new Finance, new Finance, new Finance]; + } + } + + // Check if farm has crops that regrow; season param optional + Farm.prototype.has_regrowing_crops = function(season){ + var start_day = 1; + var end_day = YEAR_DAYS; + + if (season){ + start_day = season.start; + end_day = season.end; + } + + for (var date = start_day; date <= end_day; date++){ + for (var i = 0; i < this.plans[date].length; i++){ + if (this.plans[date][i].crop.regrow){ + return true; + } + } + } + return false; + }; + + // Get image representing farm type + Farm.prototype.get_image = function(){ + var type = this.greenhouse ? "greenhouse" : "scarecrow"; + return "images/" + type + ".png"; + }; + + /**************** + Harvest class - represents crops harvested on a date + ****************/ + function Harvest(plan, date, is_regrowth){ + var self = this; + self.date = 0; + self.plan = {}; + self.crop = {}; + self.yield = {min: 0, max: 0}; + self.revenue = {min: 0, max: 0}; + self.cost = 0; + self.profit = {min: 0, max: 0}; + self.is_regrowth = false; + + + init(); + + + function init(){ + if (!plan || !date) return; + var crop = plan.crop; + self.plan = plan; + self.crop = crop; + self.date = date; + + // Calculate crop yield (+ extra crop drops) + // [SOURCE: StardewValley/Crop.cs : function harvest] + self.yield.min = crop.harvest.min * plan.amount; + self.yield.max = (Math.min(crop.harvest.min + 1, crop.harvest.max + 1 + (planner.player.level / crop.harvest.level_increase))-1) * plan.amount; + + // Harvest revenue and costs + var q_mult = 0; + if (plan.fertilizer && !plan.fertilizer.is_none()){ + switch (plan.fertilizer.id){ + case "basic_fertilizer": + q_mult = 1; + break; + case "quality_fertilizer": + q_mult = 2; + break; + } + } + + // Fertilizers expire at the beginning of a new season in the greenhouse + if (self.plan.greenhouse && (planner.get_season(self.date) != planner.get_season(self.plan.date))) + q_mult = 0; + + // Calculate min/max revenue based on regular/silver/gold chance + var regular_chance = planner.player.quality_chance(0, q_mult); + var silver_chance = planner.player.quality_chance(1, q_mult); + var gold_chance = planner.player.quality_chance(2, q_mult); + + var min_revenue = crop.get_sell(0); + var max_revenue = (min_revenue*regular_chance) + (crop.get_sell(1)*silver_chance) + (crop.get_sell(2)*gold_chance); + max_revenue = Math.min(crop.get_sell(2), max_revenue); + + // Quality from fertilizer only applies to picked harvest + // and not to extra dropped yields + self.revenue.min = Math.floor(min_revenue) * self.yield.min; + self.revenue.max = Math.floor(max_revenue) + (Math.floor(min_revenue) * Math.max(0, self.yield.max - 1)); + self.cost = crop.buy * plan.amount; + + // Tiller profession (ID 1) + // [SOURCE: StardewValley/Object.cs : function sellToStorePrice] + if (planner.player.tiller){ + self.revenue.min = Math.floor(self.revenue.min * 1.1); + self.revenue.max = Math.floor(self.revenue.max * 1.1); + } + + // Regrowth + if (is_regrowth){ + self.is_regrowth = true; + self.cost = 0; + } + + // Harvest profit + self.profit.min = self.revenue.min - self.cost; + self.profit.max = self.revenue.max - self.cost; + } + } + + Harvest.prototype.get_cost = function(locale){ + if (locale) return this.cost.toLocaleString(); + return this.cost; + }; + + Harvest.prototype.get_revenue = function(locale, max){ + var value = max ? this.revenue.max : this.revenue.min; + if (locale) return value.toLocaleString(); + return value; + }; + + Harvest.prototype.get_profit = function(locale, max){ + var value = max ? this.profit.max : this.profit.min; + if (locale) return value.toLocaleString(); + return value; + }; + + + /**************** + Plan class - represents seeds planted on a date + ****************/ + function Plan(data, in_greenhouse){ + var self = this; + self.date; + self.crop_id; + self.crop = {}; + self.amount = 1; + self.fertilizer = planner.fertilizer["none"]; + self.harvests = []; + self.greenhouse = false; + self.irrigated = false; // for paddy crops (e.g., Rice) + + init(); + + + function init(){ + if (!data) return; + self.date = data.date; + self.crop = planner.crops[data.crop]; + self.amount = data.amount; + if (data.fertilizer && planner.fertilizer[data.fertilizer]) + self.fertilizer = planner.fertilizer[data.fertilizer]; + if (data.irrigated) self.irrigated = true; + self.greenhouse = in_greenhouse ? true : false; + } + } + + // Compile data to be saved as JSON + Plan.prototype.get_data = function(){ + var data = {}; + data.crop = this.crop.id; + data.amount = this.amount; + if (this.fertilizer && !this.fertilizer.is_none()) data.fertilizer = this.fertilizer.id; + if (this.irrigated) data.irrigated = true; + return data; + }; + + Plan.prototype.get_grow_time = function(){ + // For most crops, growth is derived from the crop's stage list. + // For paddy crops (e.g., Rice), growth depends on whether the tile is irrigated (near water). + var base_grow = this.crop.grow; // default + var stages = $.extend([], this.crop.stages); + + if (this.crop.paddy){ + // Use configured paddy growth times if provided. + // Expecting: {dry_days: 8, irrigated_days: 6} + var dry = (this.crop.paddy.dry_days || this.crop.grow); + var irr = (this.crop.paddy.irrigated_days || dry); + base_grow = this.irrigated ? irr : dry; + + // Treat as a single growth stage so Speed-Gro/Agriculturist reductions still work. + stages = [base_grow]; + } + + if (this.fertilizer.id == "speed_gro" || this.fertilizer.id == "delux_speed_gro" || planner.player.agriculturist){ + // [SOURCE: StardewValley.TerrainFeatures/HoeDirt.cs : function plant] + var rate = 0; + switch (this.fertilizer.id){ + case "speed_gro": + rate = 0.1; + break; + case "delux_speed_gro": + rate = 0.25; + break; + } + + // Agriculturist profession (ID 5) + if (planner.player.agriculturist) rate += 0.1; + + // Days to remove + var remove_days = Math.ceil(base_grow * rate); + + // For removing more than one day from larger stages of growth + // when there are still days to remove + var multi_remove = 0; + + // Remove days from stages + while (remove_days > 0 && multi_remove < 3){ + for (var i = 0; i < stages.length; i++){ + if (i > 0 || stages[i] > 1){ + stages[i] -= 1; + remove_days--; + } + + if (remove_days <= 0) break; + } + + multi_remove++; + } + } + + // Add up days of growth + var days = 0; + for (var i = 0; i < stages.length; i++){ + days += stages[i]; + } + + return days; + }; + + Plan.prototype.get_cost = function(locale){ + var amount = this.crop.buy * this.amount; + if (locale) return amount.toLocaleString(); + return amount; + }; + + Plan.prototype.get_revenue = function(locale, max){ + var amount = 0; + for (var i = 0; i < this.harvests.length; i++){ + amount += max ? this.harvests[i].revenue.max : this.harvests[i].revenue.min; + } + if (locale) return amount.toLocaleString(); + return amount; + }; + + Plan.prototype.get_profit = function(locale, max){ + var amount = this.get_revenue(max) - this.get_cost(); + if (locale) return amount.toLocaleString(); + return amount; + }; + + + /**************** + Fertilizer class - represents a type of fertilizer + ****************/ + function Fertilizer(data){ + var self = this; + self.id; + self.name; + self.buy = 0; + self.quality = [0, 0, 0]; // for quality-modifying fertilizers + self.growth_rate = 0; // for growth-modifying fertilizers + + + init(); + + + function init(){ + if (!data) return; + self.id = data.id; + self.name = data.name; + self.buy = data.buy; + if (data.quality) self.quality = data.quality; + if (data.growth_rate) self.growth_rate = data.growth_rate; + } + } + + // Check if fertilizer is not being used ("none" type) + Fertilizer.prototype.is_none = function(){ + return this.id == "none"; + }; + + // Get fertilizer image + Fertilizer.prototype.get_image = function(){ + if (!this.is_none()) return "images/fertilizer/" + this.id + ".png"; + }; + + + /**************** + Finance class - datatype for storing financial details of a day/season/year + ****************/ + function Finance(){ + var self = this; + self.cost = 0; + self.revenue = {min: 0, max: 0}; + self.profit = {min: 0, max: 0}; + + self.plantings = 0; // planting count + self.harvests = {min: 0, max: 0}; // harvest count + } + + // Return cost value + Finance.prototype.get_cost = function(locale){ + if (locale) return this.cost.toLocaleString(); + return this.cost; + }; + + // Return revenue value (min or max) + Finance.prototype.get_revenue = function(locale, max){ + var value = max ? this.revenue.max : this.revenue.min; + if (locale) return value.toLocaleString(); + return value; + }; + + // Return profit value (min or max) + Finance.prototype.get_profit = function(locale, max){ + var value = max ? this.profit.max : this.profit.min; + if (locale) return value.toLocaleString(); + return value; + }; + + // Return plantings count + Finance.prototype.get_plantings = function(locale){ + if (locale) return this.plantings.toLocaleString(); + return this.plantings; + }; + + // Return harvests count (min or max) + Finance.prototype.get_harvests = function(locale, max){ + var value = max ? this.harvests.max : this.harvests.min; + if (locale) return value.toLocaleString(); + return value; + }; + + + /**************** + Calendar Event class - event on the calendar + ****************/ + function CalendarEvent(data){ + var self = this; + self.day; + self.season; + + self.date; + self.name = ""; + self.festival = false; + + + init(); + + + function init(){ + if (!data) return; + self.day = data.day; + self.season = planner.seasons[data.season]; + + self.date = (data.season * SEASON_DAYS) + self.day; + self.name = data.name; + self.festival = data.festival; + } + } + + // Get event image + CalendarEvent.prototype.get_image = function(){ + if (this.festival) return "images/flag.gif"; + return "images/people/" + this.name.toLowerCase() + ".png"; + }; + + // Get readable text of event + CalendarEvent.prototype.get_text = function(){ + if (!this.festival) return this.name + "'s Birthday"; + return this.name; + }; + + + /******************************** + RUN INITIALIZATION + ********************************/ + // Initialization runs last since Function.prototype methods + // aren't hoisted + init(); +} \ No newline at end of file From c8d66758ea11282b2f2b566572fbaecd2f800ca7 Mon Sep 17 00:00:00 2001 From: dameoffensive-cloud Date: Sun, 8 Feb 2026 10:34:40 -0500 Subject: [PATCH 007/171] Add files via upload --- scripts/planner.js | 89 ++++++++++++++++------------------------------ 1 file changed, 31 insertions(+), 58 deletions(-) diff --git a/scripts/planner.js b/scripts/planner.js index 0c701d8..b40575d 100644 --- a/scripts/planner.js +++ b/scripts/planner.js @@ -959,7 +959,6 @@ function planner_controller($scope){ self.stages = []; self.regrow; self.wild = false; - self.paddy = null; // {dry_days, irrigated_days} // Harvest data self.harvest = { @@ -993,7 +992,6 @@ function planner_controller($scope){ self.stages = data.stages; self.regrow = data.regrow; if (data.wild) self.wild = true; - if (data.paddy) self.paddy = data.paddy; // Harvest data if (data.harvest.min) self.harvest.min = data.harvest.min; @@ -1392,7 +1390,7 @@ function planner_controller($scope){ self.fertilizer = planner.fertilizer["none"]; self.harvests = []; self.greenhouse = false; - self.irrigated = false; // for paddy crops (e.g., Rice) + init(); @@ -1404,7 +1402,6 @@ function planner_controller($scope){ self.amount = data.amount; if (data.fertilizer && planner.fertilizer[data.fertilizer]) self.fertilizer = planner.fertilizer[data.fertilizer]; - if (data.irrigated) self.irrigated = true; self.greenhouse = in_greenhouse ? true : false; } } @@ -1415,74 +1412,50 @@ function planner_controller($scope){ data.crop = this.crop.id; data.amount = this.amount; if (this.fertilizer && !this.fertilizer.is_none()) data.fertilizer = this.fertilizer.id; - if (this.irrigated) data.irrigated = true; return data; }; Plan.prototype.get_grow_time = function(){ - // For most crops, growth is derived from the crop's stage list. - // For paddy crops (e.g., Rice), growth depends on whether the tile is irrigated (near water). - var base_grow = this.crop.grow; // default - var stages = $.extend([], this.crop.stages); - - if (this.crop.paddy){ - // Use configured paddy growth times if provided. - // Expecting: {dry_days: 8, irrigated_days: 6} - var dry = (this.crop.paddy.dry_days || this.crop.grow); - var irr = (this.crop.paddy.irrigated_days || dry); - base_grow = this.irrigated ? irr : dry; - - // Treat as a single growth stage so Speed-Gro/Agriculturist reductions still work. - stages = [base_grow]; - } - - if (this.fertilizer.id == "speed_gro" || this.fertilizer.id == "delux_speed_gro" || planner.player.agriculturist){ - // [SOURCE: StardewValley.TerrainFeatures/HoeDirt.cs : function plant] - var rate = 0; - switch (this.fertilizer.id){ - case "speed_gro": - rate = 0.1; - break; - case "delux_speed_gro": - rate = 0.25; - break; - } + var stages = $.extend([], this.crop.stages); - // Agriculturist profession (ID 5) - if (planner.player.agriculturist) rate += 0.1; + // Data-driven fertilizer growth rate (supports any speed fertilizer in config.json) + var rate = 0; + if (this.fertilizer && this.fertilizer.growth_rate) { + rate += this.fertilizer.growth_rate; + } - // Days to remove - var remove_days = Math.ceil(base_grow * rate); + // Agriculturist profession (ID 5): +10% faster + if (planner.player.agriculturist) rate += 0.1; - // For removing more than one day from larger stages of growth - // when there are still days to remove - var multi_remove = 0; + if (rate > 0){ + // Days to remove + var remove_days = Math.ceil(this.crop.grow * rate); - // Remove days from stages - while (remove_days > 0 && multi_remove < 3){ - for (var i = 0; i < stages.length; i++){ - if (i > 0 || stages[i] > 1){ - stages[i] -= 1; - remove_days--; - } + // For removing more than one day from larger stages of growth + // when there are still days to remove + var multi_remove = 0; - if (remove_days <= 0) break; + // Remove days from stages + while (remove_days > 0 && multi_remove < 3){ + for (var i = 0; i < stages.length; i++){ + if (i > 0 || stages[i] > 1){ + stages[i] -= 1; + remove_days--; } - - multi_remove++; + if (remove_days <= 0) break; } + multi_remove++; } + } - // Add up days of growth - var days = 0; - for (var i = 0; i < stages.length; i++){ - days += stages[i]; - } + // Add up days of growth + var days = 0; + for (var j = 0; j < stages.length; j++){ + days += stages[j]; + } - return days; - }; - - Plan.prototype.get_cost = function(locale){ + return days; +};Plan.prototype.get_cost = function(locale){ var amount = this.crop.buy * this.amount; if (locale) return amount.toLocaleString(); return amount; From 9f5a92c3f0506b1bb8459251b6b15645fa8cbd01 Mon Sep 17 00:00:00 2001 From: dameoffensive-cloud Date: Sun, 8 Feb 2026 10:36:20 -0500 Subject: [PATCH 008/171] Add files via upload From 945950f0f9767f938f6dfd1d00cc5eb9725239f8 Mon Sep 17 00:00:00 2001 From: dameoffensive-cloud Date: Sun, 8 Feb 2026 10:36:34 -0500 Subject: [PATCH 009/171] Add files via upload --- scripts/planner.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/scripts/planner.js b/scripts/planner.js index b40575d..683cc38 100644 --- a/scripts/planner.js +++ b/scripts/planner.js @@ -1424,7 +1424,7 @@ function planner_controller($scope){ rate += this.fertilizer.growth_rate; } - // Agriculturist profession (ID 5): +10% faster + // Agriculturist profession (ID 5) if (planner.player.agriculturist) rate += 0.1; if (rate > 0){ @@ -1455,7 +1455,9 @@ function planner_controller($scope){ } return days; -};Plan.prototype.get_cost = function(locale){ +}; + + Plan.prototype.get_cost = function(locale){ var amount = this.crop.buy * this.amount; if (locale) return amount.toLocaleString(); return amount; From 3ce964bd80d1f400ff61a100fc7927daa80ac106 Mon Sep 17 00:00:00 2001 From: dameoffensive-cloud Date: Sun, 8 Feb 2026 10:38:24 -0500 Subject: [PATCH 010/171] Delete planner.js --- planner.js | 1636 ---------------------------------------------------- 1 file changed, 1636 deletions(-) delete mode 100644 planner.js diff --git a/planner.js b/planner.js deleted file mode 100644 index 0c701d8..0000000 --- a/planner.js +++ /dev/null @@ -1,1636 +0,0 @@ -// CONSTANTS -var SEASON_DAYS = 28; -var YEAR_DAYS = SEASON_DAYS * 4; -var VERSION = "2.0"; -var DATA_VERSION = "2"; - - -// Save/load helper functions -function SAVE_JSON(key, data){ - var json_data = JSON.stringify(data); - localStorage.setItem(key + "_v" + DATA_VERSION, json_data); -} - -function LOAD_JSON(key, raw_json){ - var json_data = localStorage.getItem(key + "_v" + DATA_VERSION); - if (!json_data) return; - if (raw_json) return json_data; - return JSON.parse(json_data); -} - -// Misc helper functions -function round(num, decimals){ - decimals = Math.pow(10, decimals || 0); - return Math.round(num * decimals) / decimals; -} - - -// Angular app -angular.module("planner_app", ["checklist-model"]) - .controller("planner_controller", planner_controller); - -function planner_controller($scope){ - - /******************************** - PLANNER VARIABLES - ********************************/ - var self = this; window.planner = self; - - // Core data & objects - self.config = {}; - self.loaded = false; - self.sidebar; - self.player; - self.planner_modal; - - // Static planner data - self.days = new Array(YEAR_DAYS); // Array of days in a year (only used by one ng-repeat) - self.seasons = []; // Array of seasons - self.SEASON_DAYS = SEASON_DAYS; // Exposing SEASON_DAYS constant to app scope - self.crops_list = []; // [id, id, ...] - self.crops = {}; // {id: {data}} - self.fertilizer = {}; // [fertilizer, fertilizer, ...] - self.events = {}; // Birthdays & festivals - - // State objects & variables - self.years = []; - - self.cdate; // Current date to add plan to - self.cseason; // Current season - self.cmode = "farm"; // Current farm mode (farm / greenhouse) - self.cyear; // Current year - - self.newplan; - self.editplan; - - // Core planner functions - self.update = update; - self.add_plan = add_plan; - self.add_plan_key = add_plan_key; - self.edit_plan = edit_plan; - self.remove_plan = remove_plan; - self.clear_season = clear_season; - self.clear_year = clear_year; - self.clear_all = clear_all; - self.open_plans = open_plans; - - self.inc_year = inc_year; // Increment/decrement current year - self.inc_season = inc_season; // Increment/decrement current season - self.set_season = set_season; // Set current season - self.cfarm = cfarm; // Get current farm - self.in_greenhouse = in_greenhouse; // Check if current farm mode == greenhouse - self.toggle_mode = toggle_mode; // Toggle current farm mode (farm / greenhouse) - self.set_mode = set_mode; // Set current farm mode (farm / greenhouse) - - self.get_season = get_season; // Get season object by id - self.get_date = get_date; // Get formatted date string - self.ci_set_sort = ci_set_sort; // Set key to sort crop info by - self.planner_valid_crops = planner_valid_crops; - - // Crop info search/filter settings - self.cinfo_settings = { - season: "spring", - seasons: ["spring"], - season_options: [], - sort: "name", - search: "", - regrows: false, - order: false, - use_fbp: false, - }; - - - /******************************** - PLANNER INITIALIZATION - ********************************/ - function init(){ - // Initialize planner variables - self.sidebar = new Sidebar; - self.player = new Player; - self.planner_modal = $("#crop_planner"); - - for (var i = 0; i < self.days.length; i++) self.days[i] = i + 1; - self.seasons = [new Season(0), new Season(1), new Season(2), new Season(3)]; - self.cseason = self.seasons[0]; - self.cinfo_settings.season_options = [self.seasons[0], self.seasons[1], self.seasons[2]]; - - // Enable bootstrap tooltips - $("body").tooltip({selector: "[data-toggle=tooltip]", trigger: "hover", container: "body"}); - - // Keydown events - $(document).keydown(function(e){ - if (planner_event_handler(e)) return; - if (self.sidebar.keydown(e)) return; - }); - - // On modal close: save plans and update - self.planner_modal.on("hide.bs.modal", function(){ - // Only if currently editing - if (self.editplan){ - self.editplan = null; - self.update(self.cyear); - $scope.$apply(); - } - }); - - // Development mode - // has issues in Firefox, works fine in Chrome - if (window.location.hash == "#dev"){ - console.log("Development mode enabled."); - - // Update CSS every 400 ms - var stylesheet = $("link[href='style.css']"); - var stylesheet_url = stylesheet.attr("href"); - setInterval(function(){ - var time = Date.now(); - stylesheet.attr("href", stylesheet_url + "?t=" + time); - }, 400); - } - - // Load planner config data - $.ajax({ - url: "config.json", - dataType: "json", - success: function(config){ - self.config = config; - - // Process crop data - $.each(self.config.crops, function(i, crop){ - crop = new Crop(crop); - self.crops_list.push(crop); - self.crops[crop.id] = crop; - }); - - // Process fertilizer data - $.each(self.config.fertilizer, function(i, fertilizer){ - fertilizer = new Fertilizer(fertilizer); - self.config.fertilizer[i] = fertilizer; - self.fertilizer[fertilizer.id] = fertilizer; - }); - - // Process events data - var s_index = 0; - $.each(self.config.events, function(season_name, season){ - $.each(season, function(ii, c_event){ - c_event.season = s_index; - c_event = new CalendarEvent(c_event); - self.events[c_event.date] = c_event; - }); - - s_index++; - }); - - // Create newplan template - self.newplan = new Plan; - - // Load saved plans from browser storage - var plan_count = load_data(); - - // Create first year if it doesn't exist - if (!self.years.length) self.years.push(new Year(0)); - - // Set current year to first year - self.cyear = self.years[0]; - - // Debug info - console.log("Loaded " + self.crops_list.length + " crops."); - console.log("Loaded " + plan_count + " plans into " + self.years.length + " year(s)."); - - // Update plans - update(self.years[0].data.farm, true); // Update farm - update(self.years[0].data.greenhouse, true); // Update greenhouse - - self.loaded = true; - $scope.$apply(); - }, - error: function(xhr, status, error){ - if (!xhr.responseText) return; - alert("An error occurred in loading planner data. Check the browser console."); - console.log("Error: ", status); - console.log("Reason: ", error); - } - }); - } - - - /******************************** - CORE PLANNER FUNCTIONS - ********************************/ - // Planner general event handler - function planner_event_handler(e){ - // Not focused on anything - if ($(document.activeElement).is("input") || $(document.activeElement).is("textarea")) return; - - // Sidebar must be closed - if (self.sidebar.is_open()) return; - - // Planner modal must be closed - if (self.planner_modal.hasClass("in")) return; - - var event_handled = true; - if (e.which == 39){ - // Right arrow - self.inc_season(1); - } else if (e.which == 37){ - // Left arrow - self.inc_season(-1); - } else if (e.which == 27){ - // ESC - self.sidebar.open("cropinfo"); - } else if (e.which == 192){ - // Tilde - self.toggle_mode(); - } else { - event_handled = false; - } - - if (event_handled){ - e.preventDefault(); - $scope.$apply(); - return true; - } - } - - // Save plan data to browser storage - function save_data(){ - // Save plan data - var plan_data = []; - $.each(self.years, function(i, year){ - var year_data = year.get_data(); - //if (!year_data) return; // continue - plan_data.push(year_data); - }); - SAVE_JSON("plans", plan_data); - } - - // Load plan data from browser storage - function load_data(){ - // Load plan data - var plan_data = LOAD_JSON("plans"); - if (!plan_data) return 0; - - var plan_count = 0; - self.years = []; - $.each(plan_data, function(i, year_data){ - var new_year = new Year(i); - plan_count += new_year.set_data(year_data); - self.years.push(new_year); - }); - self.cyear = self.years[0]; - - return plan_count; - } - - // Update planner info of current farm/year - function update(farm, full_update){ - // Received year, expected farm - if (farm instanceof Year) farm = farm.farm(); - - // If farm is null, get first farm/year - farm = farm || self.years[0].farm(); - - // Update all years after this one VS just this year - full_update = full_update || (farm.greenhouse && farm.has_regrowing_crops()); - - // Reset harvests - farm.harvests = []; - - // Reset financial totals - farm.totals = {}; - farm.totals.day = {}; - farm.totals.season = [new Finance, new Finance, new Finance, new Finance]; - farm.totals.year = new Finance; - - // Rebuild data - $.each(farm.plans, function(date, plans){ - date = parseInt(date); - - $.each(plans, function(i, plan){ - var crop = plan.crop; - var first_harvest = date + plan.get_grow_time(); - var planting_cost = plan.get_cost(); - var season = self.seasons[Math.floor((plan.date-1)/SEASON_DAYS)]; - var crop_end = crop.end; - - if (farm.greenhouse){ - crop_end = YEAR_DAYS; - } - - // Update daily costs for planting - if (!farm.totals.day[date]) farm.totals.day[date] = new Finance; - var d_plant = farm.totals.day[date]; - d_plant.profit.min -= planting_cost; - d_plant.profit.max -= planting_cost; - - // Update seasonal costs for planting - var s_plant_total = farm.totals.season[season.index]; - s_plant_total.profit.min -= planting_cost; - s_plant_total.profit.max -= planting_cost; - - // Update seasonal number of plantings - s_plant_total.plantings += plan.amount; - - // If first harvest of crop occurs after its - // growth season(s), continue $.each - if (first_harvest > crop_end) return; - - // Initial harvest - var harvests = []; - harvests.push(new Harvest(plan, first_harvest)); - - // Regrowth harvests - if (crop.regrow){ - var regrowths = Math.floor((crop_end - first_harvest) / crop.regrow); - for (var i = 1; i <= regrowths; i++){ - var regrow_date = first_harvest + (i * crop.regrow); - if (regrow_date > crop_end) break; - harvests.push(new Harvest(plan, regrow_date, true)); - } - } - - // Assign harvests to plan object - plan.harvests = harvests; - - // Add up all harvests - for (var i = 0; i < harvests.length; i++){ - var harvest = harvests[i]; - - // Update harvests - if (!farm.harvests[harvest.date]) farm.harvests[harvest.date] = []; - farm.harvests[harvest.date].push(harvest); - - // Update daily revenues from harvests - if (!farm.totals.day[harvest.date]) farm.totals.day[harvest.date] = new Finance; - var d_harvest = farm.totals.day[harvest.date]; - d_harvest.profit.min += harvest.revenue.min; - d_harvest.profit.max += harvest.revenue.max; - - // Update seasonal revenues from harvests - var h_season = Math.floor((harvest.date - 1) / SEASON_DAYS); - var s_harvest_total = farm.totals.season[h_season]; - s_harvest_total.profit.min += harvest.revenue.min; - s_harvest_total.profit.max += harvest.revenue.max; - - // Update seasonal number of harvests - s_harvest_total.harvests.min += harvest.yield.min; - s_harvest_total.harvests.max += harvest.yield.max; - } - }); - }); - - // Add up annual total - for (var i = 0; i < farm.totals.seasons; i++){ - var season = farm.totals.seasons[i]; - var y_total = farm.totals.year; - y_total.profit.min += season.profit.min - y_total.profit.max += season.profit.max - } - - // Update next year - if (full_update){ - var next_year = farm.year.next(); - if (!next_year) return; - update(next_year, true); - } - } - - // Add self.newplan to plans list - function add_plan(date, auto_replant){ - if (!validate_plan_amount()) return; - self.cyear.add_plan(self.newplan, date, auto_replant); - self.newplan = new Plan; - } - - // Add plan to plans list on enter keypress - function add_plan_key(date, e){ - if (e.which != 13) return; - if (!validate_plan_amount()) return; - add_plan(date); - } - - // Validate newplan amount - function validate_plan_amount(){ - // Remove all whitespace - var amount = (self.newplan.amount + "") || ""; - amount = amount.replace(/\s/g, ""); - - // Is empty string - if (!amount){ - self.newplan.amount = 1; - return; - } - - // Check if input is in gold - if (amount.toLowerCase().endsWith("g")){ - var match = amount.match(/^([0-9]+)g$/i) - if (!match) return; - - var gold = parseInt(match[1] || 0); - var crop = self.crops[self.newplan.crop_id]; - if (!crop) return; - amount = Math.floor(gold / crop.buy); - amount = amount || 1; - self.newplan.amount = amount; - return; - } - - // Invalid non-integer amount - if (!amount.match(/^[0-9]+$/)) return; - - // Parse normal integer input - amount = parseInt(amount || 0); - if (amount <= 0) return; - - return true; - } - - // Edit plan - function edit_plan(plan, save){ - if (save){ - self.editplan = null; - save_data(); - update(self.cyear); - return; - } else if (self.editplan){ - // Other edit already open - save_data(); - update(self.cyear); - } - - self.editplan = plan; - } - - // Remove plan from plans list of current farm/year - function remove_plan(date, index){ - self.editplan = null; - self.cyear.remove_plan(date, index); - } - - // Remove plans from current farm/season - function clear_season(season){ - var full_update = self.cfarm().has_regrowing_crops(season); - for (var date = season.start; date <= season.end; date++){ - self.cfarm().plans[date] = []; - } - save_data(); - update(self.cyear, full_update); - } - - // Remove plans from current farm/year - function clear_year(year){ - var farm = year.farm(); - var full_update = farm.has_regrowing_crops(); - $.each(farm.plans, function(date, plans){ - farm.plans[date] = []; - }); - save_data(); - update(year, full_update); - } - - // Remove all plans - function clear_all(){ - if (!confirm("Permanently clear all plans?")) return; - self.years = [new Year(0)]; - self.cyear = self.years[0]; - save_data(); - update(null, true); - } - - // Open crop planner modal - function open_plans(date){ - self.planner_modal.modal(); - self.cdate = date; - } - - //////////////////////////////// - - // Increment/decrement current year; creates new year if necessary - function inc_year(direction){ - direction = direction > 0 ? true : false; - - if (direction){ - // Next year - self.cyear = self.cyear.next(true); - } else { - // Previous year - var prev_year = self.cyear.previous(); - if (!prev_year) return; - self.cyear = prev_year; - } - } - - // Increment/decrement current season; creates new year if necessary - function inc_season(direction){ - direction = direction > 0 ? true : false; - var next_season = direction ? self.cseason.index + 1 : self.cseason.index - 1; - - if (next_season > 3){ - // Next season - next_season = 0; - self.cyear = self.cyear.next(true); - } else if (next_season < 0) { - // Previous season - next_season = 3; - var prev_year = self.cyear.previous(); - if (!prev_year) return; - self.cyear = prev_year; - } - - self.set_season(next_season); - } - - // Set current season - function set_season(index){ - self.cseason = self.seasons[index]; - self.newplan.crop_id = null; - } - - // Get current farm object of current year - function cfarm(){ - if (!self.cyear) return {}; - return self.cyear.farm(); - } - - // Check if current farm mode is greenhouse - function in_greenhouse(){ - return self.cmode == "greenhouse"; - } - - // Toggle current farm mode - function toggle_mode(){ - if (self.cmode == "farm"){ - set_mode("greenhouse"); - } else { - set_mode("farm"); - } - } - - // Set current farm mode - function set_mode(mode){ - self.cmode = mode; - } - - //////////////////////////////// - - // Get season object by id name or date - function get_season(id){ - // Get season containing a date - if (typeof id == "number"){ - return self.seasons[Math.floor((id - 1) / SEASON_DAYS)]; - } - - // Get season by string ID - for (var i = 0; i < self.seasons.length; i++){ - if (self.seasons[i].id == id) return self.seasons[i]; - } - } - - // Get formatted date - function get_date(real_date, format){ - real_date = real_date || self.cdate; - if (!real_date) return; - date = real_date % SEASON_DAYS || SEASON_DAYS; - - var nth = "th"; // st nd rd th - if (date <= 3 || date >= 21){ - switch((date % 100) % 10){ - case 1: nth = "st"; break; - case 2: nth = "nd"; break; - case 3: nth = "rd"; break; - } - } - - var days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; - var day = days[date % 7]; - var season = self.seasons[Math.floor((real_date - 1) / SEASON_DAYS)]; - season = season.name; - - var str = format.replace("%l", day) - .replace("%j", date) - .replace("%S", nth) - .replace("%F", season); - - return str; - } - - // Set key to sort crop info by - function ci_set_sort(key){ - if (self.cinfo_settings.sort == key){ - self.cinfo_settings.order = !self.cinfo_settings.order; - } else { - self.cinfo_settings.sort = key; - self.cinfo_settings.order = false; - } - } - - // Filter crops that can be planted in the planner's drop down list - function planner_valid_crops(crop){ - return crop.can_grow(self.cseason, true) || self.in_greenhouse(); - } - - - /******************************** - CLASSES - ********************************/ - /**************** - Sidebar class - controlling the sidebar [single instance] - ****************/ - function Sidebar(){ - var self = this; - self.mode = ""; - self.crop = null; // crop object - - self.keydown = keydown; - self.open = open_view; - self.close = close_view; - self.is_open = is_open; - self.open_crop = open_crop; - self.back = back; - self.export_data = export_data; - self.import_data = import_data; - self.legacy_import_data = legacy_import_data; - - function keydown(e){ - // Sidebar must be open - if (!self.is_open()) return; - - var event_handled = true; - if (e.which == 27){ - // ESC - back(); - } else { - event_handled = false - } - - if (event_handled){ - e.preventDefault(); - $scope.$apply(); - return true; - } - } - - function close_view(){ - open_view(""); - } - - function is_open(){ - return self.mode != ""; - } - - function open_view(view){ - // Toggle off - if (self.mode == view) - view = ""; - - // Clear properties & save on close - if (!view){ - self.crop = null; - planner.cinfo_settings.search = ""; - planner.player.save(); - planner.update(null, true); - } else { - // Set certain properties on open - if (planner.cseason.id != "winter") - planner.cinfo_settings.seasons = [planner.cseason.id]; - } - - // Set mode - self.mode = view; - } - - function back(full_close){ - // back to crop info - if (self.crop){ - self.crop = null; - if (!full_close) return; - } - - open_view(""); - } - - function open_crop(crop){ - self.mode = "cropinfo"; - self.crop = crop; - } - - function export_data(){ - // Save player - //planner.player.save(); - - // Export data - var out_data = {}; - out_data.plans = LOAD_JSON("plans"); - //out_data.player = LOAD_JSON("player"); - out_data.version = DATA_VERSION; - - var blob = new Blob([JSON.stringify(out_data)], {type: "octet/stream"}); - var blob_url = window.URL.createObjectURL(blob); - - var link = document.createElement("a"); - link.href = blob_url; - link.style = "display: none"; - link.download = "Crop Planner [" + Date.now() + "]" + ".json"; - document.body.appendChild(link); - link.click(); - } - - function import_data(){ - var input = $("").appendTo("body"); - input.css("display", "none"); - input.change(read_file); - input.click(); - } - - function read_file(evt){ - var file = evt.target.files[0]; - if (!file) return; - - // Read data from JSON file - var reader = new FileReader; - reader.onload = function(e){ - var data = {}; - - try { - data = JSON.parse(e.target.result); - } catch(e){ - alert("Not valid JSON data to import.") - return; - } - - //if (!data.plans || !data.player){ - if (!data.plans){ - alert("Invalid data to import.") - return; - } - - if (data.version != DATA_VERSION){ - alert("Incompatible plan version."); - return; - } - - SAVE_JSON("plans", data.plans); - //SAVE_JSON("player", data.player); - - var plan_count = load_data(); - //planner.player.load(); - update(planner.years[0].data.farm, true); // Update farm - update(planner.years[0].data.greenhouse, true); // Update greenhouse - $scope.$apply(); - alert("Successfully imported " + plan_count + " plans into " + planner.years.length + " year(s)."); - console.log("Imported " + plan_count + " plans into " + planner.years.length + " year(s)."); - }; - - reader.readAsText(file); - } - - function legacy_import_data(){ - if (!confirm("This will attempt to import planner data from the old v1 planner, and will overwrite any current plans. This change is not reversible and is not guaranteed to always work. Continue?")) return; - - // Load old v1 planner data - var plan_data = localStorage.getItem("crops"); - if (!plan_data){ alert("No plan data to import"); return; } - plan_data = JSON.parse(plan_data); - if (!plan_data){ alert("No plan data to import"); return; } - - // Create new plan data - var new_plans = [{"farm":{}, "greenhouse":{}}]; - $.each(plan_data, function(date, plans){ - date = parseInt(date); - $.each(plans, function(i, plan){ - plan.date = date; - if (!planner.crops[plan.crop]) return; // Invalid crop - - if (plan.greenhouse){ - if (!new_plans[0].greenhouse[date]) new_plans[0].greenhouse[date] = []; - delete plan.greenhouse; - new_plans[0].greenhouse[date].push(plan); - } else { - if (!new_plans[0].farm[date]) new_plans[0].farm[date] = []; - new_plans[0].farm[date].push(plan); - } - - plan_count++; - }); - }); - - // Save data - SAVE_JSON("plans", new_plans); - - // Reload data and update - var plan_count = load_data(); - update(planner.years[0].data.farm, true); // Update farm - update(planner.years[0].data.greenhouse, true); // Update greenhouse - alert("Successfully imported " + plan_count + " legacy plans into " + planner.years.length + " year(s)."); - console.log("Imported " + plan_count + " legacy plans into " + planner.years.length + " year(s)."); - } - } - - - /**************** - Player class - user-set player configs [single instance] - ****************/ - function Player(){ - var self = this; - self.level = 0; // farming level; starts at 0 - self.tiller = false; - self.agriculturist = false; - - self.load = load - self.save = save; - self.toggle_perk = toggle_perk; - self.quality_chance = quality_chance; - - // Miscellaneous client settings - self.settings = { - show_events: true, - }; - - - init(); - - - function init(){ - load(); - console.log("Loaded player settings"); - } - - // Load player config from browser storage - function load(){ - var pdata = LOAD_JSON("player"); - if (!pdata) return; - - if (pdata.tiller) self.tiller = true; - if (pdata.agriculturist) self.agriculturist = true; - if (pdata.level) self.level = pdata.level; - if (pdata.settings) self.settings = pdata.settings; - } - - // Save player config to browser storage - function save(){ - var pdata = {}; - if (self.tiller) pdata.tiller = self.tiller; - if (self.agriculturist) pdata.agriculturist = self.agriculturist; - pdata.settings = self.settings; - pdata.level = self.level; - SAVE_JSON("player", pdata); - } - - // Toggle profession perks - function toggle_perk(key){ - self[key] = !self[key]; - - // Must have Tiller to have Agriculturist - if (!self.tiller && key == "tiller"){ - self.agriculturist = false; - } else if (self.agriculturist && key == "agriculturist"){ - self.tiller = true; - } - } - - // Get scalar value of chance of crop being 0=regular; 1=silver; 2=gold quality - // [SOURCE: StardewValley/Crop.cs : function harvest] - function quality_chance(quality, mult, locale){ - quality = quality || 0; // Default: check regular quality chance - mult = mult || 0; // Multiplier given by type of fertilizer used (0, 1, or 2) - - var gold_chance = 0.2 * (self.level / 10) + 0.2 * mult * ((self.level + 2) / 12) + 0.01; - var silver_chance = Math.min(0.75, gold_chance * 2); - - var chance = 0; - switch (quality){ - case 0: - chance = Math.max(0, 1 - (gold_chance + silver_chance)); - break; - case 1: - chance = Math.min(1, silver_chance); - break; - case 2: - chance = Math.min(1, gold_chance); - break; - } - - if (locale) return Math.round(chance * 100); - return chance; - } - } - - - /**************** - Season class - representing one of the four seasons - ****************/ - function Season(ind){ - var self = this; - self.index = ind; - self.id; - self.name; - self.start = 0; - self.end = 0; - - - init(); - - - function init(){ - var seasons = ["spring", "summer", "fall", "winter"]; - self.id = seasons[self.index]; - self.name = self.id.charAt(0).toUpperCase() + self.id.slice(1); - self.start = (self.index * SEASON_DAYS) + 1; - self.end = self.start + SEASON_DAYS - 1; - } - } - - Season.prototype.get_image = function(){ - return "images/seasons/" + this.id + ".png"; - }; - - - /**************** - Crop class - represents a crop - ****************/ - function Crop(data){ - var self = this; - - // Config properties - self.id; - self.name; - self.sell; - self.buy; - self.seasons = []; - self.stages = []; - self.regrow; - self.wild = false; - self.paddy = null; // {dry_days, irrigated_days} - - // Harvest data - self.harvest = { - min: 1, - max: 1, - level_increase: 1, - extra_chance: 0 - }; - - // Custom properties - self.note = ""; - self.start = 0; // Start of grow season(s) - self.end = 0; // End of grow season(s) - self.grow = 0; // Total days to grow - self.profit = 0; // Minimum profit/day (for crops info menu) - self.fixed_profit = 0; // Fixed budget profit - - - init(); - - - function init(){ - if (!data) return; - - // Base properties - self.id = data.id; - self.name = data.name; - self.sell = data.sell; - self.buy = data.buy; - self.seasons = data.seasons; - self.stages = data.stages; - self.regrow = data.regrow; - if (data.wild) self.wild = true; - if (data.paddy) self.paddy = data.paddy; - - // Harvest data - if (data.harvest.min) self.harvest.min = data.harvest.min; - if (data.harvest.max) self.harvest.max = data.harvest.max; - if (data.harvest.level_increase) self.harvest.level_increase = data.harvest.level_increase; - if (data.harvest.extra_chance) self.harvest.extra_chance = data.harvest.extra_chance; - - // Custom properties - if (data.note) self.note = data.note; - self.start = get_season(data.seasons[0]).start; - self.end = get_season(data.seasons[data.seasons.length-1]).end; - self.grow = 0; - for (var i = 0; i < data.stages.length; i++){ - self.grow += data.stages[i]; - } - - // Calculate profit per day - var season_days = (self.end - self.start) + 1; - var regrowths = self.regrow ? Math.floor(((season_days - 1) - self.grow) / self.regrow) : 0; - - var plantings = 1; - if (!regrowths) plantings = Math.floor((season_days - 1) / self.grow); - var growth_days = (plantings * self.grow) + (regrowths * (self.regrow ? self.regrow : 0)); - - self.profit -= self.buy * plantings; - self.profit += self.harvest.min * self.get_sell() * (plantings + regrowths); - self.profit = round(self.profit / growth_days, 1); - - // Calculate fixed budget profit - var budget = 1000; // 1000g worth of seeds - var plantings = Math.floor(budget / self.buy); - var growth_days = self.grow + (regrowths * (self.regrow ? self.regrow : 0)); - - self.fixed_profit -= self.buy * plantings; - self.fixed_profit += self.harvest.min * self.get_sell() * (plantings + regrowths); - self.fixed_profit = round((self.fixed_profit / growth_days), 1); - } - } - - // Get crop quality-modified sell price - // [SOURCE: StardewValley/Object.cs : function sellToStorePrice] - Crop.prototype.get_sell = function(quality){ - quality = quality || 0; - return Math.floor(this.sell * (1 + (quality * 0.25))); - }; - - // Check if crop can grow on date/season - Crop.prototype.can_grow = function(date, is_season, in_greenhouse){ - var self = this; - - // Expected numeric date, received array of seasons - if (date.constructor === Array){ - var result = false; - $.each(date, function(i, v){ - result = result || self.can_grow(v, is_season, in_greenhouse); - if (result) return false; // break on true - }); - return result; - } - - if (in_greenhouse && (date <= YEAR_DAYS)) return true; - if (is_season){ - var season = date; - if (typeof season == "string") season = planner.get_season(season); - return (this.start <= season.start) && (this.end >= season.end); - } else { - return (date >= this.start) && (date <= this.end); - } - }; - - // Get url to Stardew Valley wiki - Crop.prototype.get_url = function(){ - var fragment = this.id.split("_"); - for (var i=0; i= planner.years.length){ - if (!force_create) return; - var new_year = new Year(next_id); - planner.years.push(new_year); - return new_year; - } - return planner.years[next_id]; - }; - - // Returns previous year - Year.prototype.previous = function(){ - var next_id = this.index - 1; - if (next_id < 0) return; - return planner.years[next_id]; - }; - - // Get data from year (for saving) - Year.prototype.get_data = function(){ - var self = this; - var year_plans = {}; - var total_count = 0; - - $.each(self.data, function(type, farm){ - var type_plans = {}; - var type_count = 0; - - $.each(farm.plans, function(date, plans){ - if (!plans.length) return; - type_count += plans.length; - total_count += plans.length; - type_plans[date] = []; - - $.each(plans, function(i, plan){ - type_plans[date].push(plan.get_data()); - }); - }); - - if (type_count) year_plans[type] = type_plans; - }); - - if (!total_count) return; - return year_plans; - }; - - // Load data into year (from loading) - Year.prototype.set_data = function(l_data){ - var self = this; - var plan_count = 0; - - $.each(l_data, function(type, plan_data){ - $.each(plan_data, function(date, plans){ - date = parseInt(date); - - $.each(plans, function(i, plan){ - plan.date = date; - if (!planner.crops[plan.crop]) return; // Invalid crop - var plan_object = new Plan(plan, type == "greenhouse"); - self.data[type].plans[date].push(plan_object); - plan_count++; - }); - }); - }); - - return plan_count; - }; - - // Add plan to this farm/year - Year.prototype.add_plan = function(newplan, date, auto_replant){ - // Validate data - if (!newplan.crop_id) return false; - - // Date out of bounds - if (date < 1 || date > YEAR_DAYS) return false; - - // Check that crop can grow - var crop = planner.crops[newplan.crop_id]; - if (!crop || !crop.can_grow(date, false, planner.in_greenhouse())) return false; - newplan.crop = crop; - - // Amount to plant - newplan.amount = parseInt(newplan.amount || 0); - if (newplan.amount <= 0) return false; - - // Add plan - var plan = new Plan(newplan.get_data(), planner.in_greenhouse()); - plan.date = date; - this.farm().plans[date].push(plan); - - // Auto-replanting within current year - var crop_growth = plan.get_grow_time(); - var next_planting = date + crop_growth; - var next_grow = next_planting + crop_growth; - if (!auto_replant || crop.regrow || (auto_replant && !crop.can_grow(next_grow, false, planner.in_greenhouse()))){ - // Update - update(this); - save_data(); - } else if (auto_replant){ - // Auto-replant - this.add_plan(newplan, next_planting, true); - } - }; - - // Remove plan from current farm/year - Year.prototype.remove_plan = function(date, index){ - var farm = this.farm(); - if (!farm.plans[date][index]) return; - var full_update = farm.plans[date][index].crop.regrow; - farm.plans[date].splice(index, 1); - save_data(); - update(this, full_update); - }; - - - /**************** - Farm class - used only within Year - ****************/ - function Farm(parent_year, is_greenhouse){ - var self = this; - self.year; - self.greenhouse = false; - self.plans = {}; - self.harvests = {}; - self.totals = {}; - - - init(); - - - function init(){ - self.year = parent_year; - self.greenhouse = is_greenhouse; - - for (var i = 0; i < YEAR_DAYS; i++){ - self.plans[i+1] = []; - } - self.totals.season = [new Finance, new Finance, new Finance, new Finance]; - } - } - - // Check if farm has crops that regrow; season param optional - Farm.prototype.has_regrowing_crops = function(season){ - var start_day = 1; - var end_day = YEAR_DAYS; - - if (season){ - start_day = season.start; - end_day = season.end; - } - - for (var date = start_day; date <= end_day; date++){ - for (var i = 0; i < this.plans[date].length; i++){ - if (this.plans[date][i].crop.regrow){ - return true; - } - } - } - return false; - }; - - // Get image representing farm type - Farm.prototype.get_image = function(){ - var type = this.greenhouse ? "greenhouse" : "scarecrow"; - return "images/" + type + ".png"; - }; - - /**************** - Harvest class - represents crops harvested on a date - ****************/ - function Harvest(plan, date, is_regrowth){ - var self = this; - self.date = 0; - self.plan = {}; - self.crop = {}; - self.yield = {min: 0, max: 0}; - self.revenue = {min: 0, max: 0}; - self.cost = 0; - self.profit = {min: 0, max: 0}; - self.is_regrowth = false; - - - init(); - - - function init(){ - if (!plan || !date) return; - var crop = plan.crop; - self.plan = plan; - self.crop = crop; - self.date = date; - - // Calculate crop yield (+ extra crop drops) - // [SOURCE: StardewValley/Crop.cs : function harvest] - self.yield.min = crop.harvest.min * plan.amount; - self.yield.max = (Math.min(crop.harvest.min + 1, crop.harvest.max + 1 + (planner.player.level / crop.harvest.level_increase))-1) * plan.amount; - - // Harvest revenue and costs - var q_mult = 0; - if (plan.fertilizer && !plan.fertilizer.is_none()){ - switch (plan.fertilizer.id){ - case "basic_fertilizer": - q_mult = 1; - break; - case "quality_fertilizer": - q_mult = 2; - break; - } - } - - // Fertilizers expire at the beginning of a new season in the greenhouse - if (self.plan.greenhouse && (planner.get_season(self.date) != planner.get_season(self.plan.date))) - q_mult = 0; - - // Calculate min/max revenue based on regular/silver/gold chance - var regular_chance = planner.player.quality_chance(0, q_mult); - var silver_chance = planner.player.quality_chance(1, q_mult); - var gold_chance = planner.player.quality_chance(2, q_mult); - - var min_revenue = crop.get_sell(0); - var max_revenue = (min_revenue*regular_chance) + (crop.get_sell(1)*silver_chance) + (crop.get_sell(2)*gold_chance); - max_revenue = Math.min(crop.get_sell(2), max_revenue); - - // Quality from fertilizer only applies to picked harvest - // and not to extra dropped yields - self.revenue.min = Math.floor(min_revenue) * self.yield.min; - self.revenue.max = Math.floor(max_revenue) + (Math.floor(min_revenue) * Math.max(0, self.yield.max - 1)); - self.cost = crop.buy * plan.amount; - - // Tiller profession (ID 1) - // [SOURCE: StardewValley/Object.cs : function sellToStorePrice] - if (planner.player.tiller){ - self.revenue.min = Math.floor(self.revenue.min * 1.1); - self.revenue.max = Math.floor(self.revenue.max * 1.1); - } - - // Regrowth - if (is_regrowth){ - self.is_regrowth = true; - self.cost = 0; - } - - // Harvest profit - self.profit.min = self.revenue.min - self.cost; - self.profit.max = self.revenue.max - self.cost; - } - } - - Harvest.prototype.get_cost = function(locale){ - if (locale) return this.cost.toLocaleString(); - return this.cost; - }; - - Harvest.prototype.get_revenue = function(locale, max){ - var value = max ? this.revenue.max : this.revenue.min; - if (locale) return value.toLocaleString(); - return value; - }; - - Harvest.prototype.get_profit = function(locale, max){ - var value = max ? this.profit.max : this.profit.min; - if (locale) return value.toLocaleString(); - return value; - }; - - - /**************** - Plan class - represents seeds planted on a date - ****************/ - function Plan(data, in_greenhouse){ - var self = this; - self.date; - self.crop_id; - self.crop = {}; - self.amount = 1; - self.fertilizer = planner.fertilizer["none"]; - self.harvests = []; - self.greenhouse = false; - self.irrigated = false; // for paddy crops (e.g., Rice) - - init(); - - - function init(){ - if (!data) return; - self.date = data.date; - self.crop = planner.crops[data.crop]; - self.amount = data.amount; - if (data.fertilizer && planner.fertilizer[data.fertilizer]) - self.fertilizer = planner.fertilizer[data.fertilizer]; - if (data.irrigated) self.irrigated = true; - self.greenhouse = in_greenhouse ? true : false; - } - } - - // Compile data to be saved as JSON - Plan.prototype.get_data = function(){ - var data = {}; - data.crop = this.crop.id; - data.amount = this.amount; - if (this.fertilizer && !this.fertilizer.is_none()) data.fertilizer = this.fertilizer.id; - if (this.irrigated) data.irrigated = true; - return data; - }; - - Plan.prototype.get_grow_time = function(){ - // For most crops, growth is derived from the crop's stage list. - // For paddy crops (e.g., Rice), growth depends on whether the tile is irrigated (near water). - var base_grow = this.crop.grow; // default - var stages = $.extend([], this.crop.stages); - - if (this.crop.paddy){ - // Use configured paddy growth times if provided. - // Expecting: {dry_days: 8, irrigated_days: 6} - var dry = (this.crop.paddy.dry_days || this.crop.grow); - var irr = (this.crop.paddy.irrigated_days || dry); - base_grow = this.irrigated ? irr : dry; - - // Treat as a single growth stage so Speed-Gro/Agriculturist reductions still work. - stages = [base_grow]; - } - - if (this.fertilizer.id == "speed_gro" || this.fertilizer.id == "delux_speed_gro" || planner.player.agriculturist){ - // [SOURCE: StardewValley.TerrainFeatures/HoeDirt.cs : function plant] - var rate = 0; - switch (this.fertilizer.id){ - case "speed_gro": - rate = 0.1; - break; - case "delux_speed_gro": - rate = 0.25; - break; - } - - // Agriculturist profession (ID 5) - if (planner.player.agriculturist) rate += 0.1; - - // Days to remove - var remove_days = Math.ceil(base_grow * rate); - - // For removing more than one day from larger stages of growth - // when there are still days to remove - var multi_remove = 0; - - // Remove days from stages - while (remove_days > 0 && multi_remove < 3){ - for (var i = 0; i < stages.length; i++){ - if (i > 0 || stages[i] > 1){ - stages[i] -= 1; - remove_days--; - } - - if (remove_days <= 0) break; - } - - multi_remove++; - } - } - - // Add up days of growth - var days = 0; - for (var i = 0; i < stages.length; i++){ - days += stages[i]; - } - - return days; - }; - - Plan.prototype.get_cost = function(locale){ - var amount = this.crop.buy * this.amount; - if (locale) return amount.toLocaleString(); - return amount; - }; - - Plan.prototype.get_revenue = function(locale, max){ - var amount = 0; - for (var i = 0; i < this.harvests.length; i++){ - amount += max ? this.harvests[i].revenue.max : this.harvests[i].revenue.min; - } - if (locale) return amount.toLocaleString(); - return amount; - }; - - Plan.prototype.get_profit = function(locale, max){ - var amount = this.get_revenue(max) - this.get_cost(); - if (locale) return amount.toLocaleString(); - return amount; - }; - - - /**************** - Fertilizer class - represents a type of fertilizer - ****************/ - function Fertilizer(data){ - var self = this; - self.id; - self.name; - self.buy = 0; - self.quality = [0, 0, 0]; // for quality-modifying fertilizers - self.growth_rate = 0; // for growth-modifying fertilizers - - - init(); - - - function init(){ - if (!data) return; - self.id = data.id; - self.name = data.name; - self.buy = data.buy; - if (data.quality) self.quality = data.quality; - if (data.growth_rate) self.growth_rate = data.growth_rate; - } - } - - // Check if fertilizer is not being used ("none" type) - Fertilizer.prototype.is_none = function(){ - return this.id == "none"; - }; - - // Get fertilizer image - Fertilizer.prototype.get_image = function(){ - if (!this.is_none()) return "images/fertilizer/" + this.id + ".png"; - }; - - - /**************** - Finance class - datatype for storing financial details of a day/season/year - ****************/ - function Finance(){ - var self = this; - self.cost = 0; - self.revenue = {min: 0, max: 0}; - self.profit = {min: 0, max: 0}; - - self.plantings = 0; // planting count - self.harvests = {min: 0, max: 0}; // harvest count - } - - // Return cost value - Finance.prototype.get_cost = function(locale){ - if (locale) return this.cost.toLocaleString(); - return this.cost; - }; - - // Return revenue value (min or max) - Finance.prototype.get_revenue = function(locale, max){ - var value = max ? this.revenue.max : this.revenue.min; - if (locale) return value.toLocaleString(); - return value; - }; - - // Return profit value (min or max) - Finance.prototype.get_profit = function(locale, max){ - var value = max ? this.profit.max : this.profit.min; - if (locale) return value.toLocaleString(); - return value; - }; - - // Return plantings count - Finance.prototype.get_plantings = function(locale){ - if (locale) return this.plantings.toLocaleString(); - return this.plantings; - }; - - // Return harvests count (min or max) - Finance.prototype.get_harvests = function(locale, max){ - var value = max ? this.harvests.max : this.harvests.min; - if (locale) return value.toLocaleString(); - return value; - }; - - - /**************** - Calendar Event class - event on the calendar - ****************/ - function CalendarEvent(data){ - var self = this; - self.day; - self.season; - - self.date; - self.name = ""; - self.festival = false; - - - init(); - - - function init(){ - if (!data) return; - self.day = data.day; - self.season = planner.seasons[data.season]; - - self.date = (data.season * SEASON_DAYS) + self.day; - self.name = data.name; - self.festival = data.festival; - } - } - - // Get event image - CalendarEvent.prototype.get_image = function(){ - if (this.festival) return "images/flag.gif"; - return "images/people/" + this.name.toLowerCase() + ".png"; - }; - - // Get readable text of event - CalendarEvent.prototype.get_text = function(){ - if (!this.festival) return this.name + "'s Birthday"; - return this.name; - }; - - - /******************************** - RUN INITIALIZATION - ********************************/ - // Initialization runs last since Function.prototype methods - // aren't hoisted - init(); -} \ No newline at end of file From 0a31b5e263ae8f8252348f3eb2de3ebfda5c2c76 Mon Sep 17 00:00:00 2001 From: dameoffensive-cloud Date: Sun, 8 Feb 2026 10:44:49 -0500 Subject: [PATCH 011/171] Add files via upload --- index.html | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/index.html b/index.html index e9138e8..6af4ab9 100644 --- a/index.html +++ b/index.html @@ -51,7 +51,7 @@
Year {{self.cyear.index+1}}, {{self.cseason.name}}
-
{{self.cmode}}
+
{{self.cmode=="farm" && "farm" || (self.cmode=="greenhouse" && "greenhouse" || "ginger island")}}
@@ -401,6 +401,14 @@