From edaa838a203c845e4bbe96114b539bacea39ad78 Mon Sep 17 00:00:00 2001 From: FosterProgramming Date: Wed, 28 Jan 2026 15:50:06 +0100 Subject: [PATCH] Fix berry tree spawning with max yield when OW_BERRY_ALWAYS_WATERABLE is active (#8976) Co-authored-by: Bassoonian --- src/berry.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/berry.c b/src/berry.c index cb8a06ef5b..c6d542a4a6 100644 --- a/src/berry.c +++ b/src/berry.c @@ -20,6 +20,7 @@ static u8 BerryTreeGetNumStagesWatered(struct BerryTree *tree); static u8 GetNumStagesWateredByBerryTreeId(u8 id); static u8 CalcBerryYieldInternal(u16 max, u16 min, u8 water); static u8 CalcBerryYield(struct BerryTree *tree); +static u32 GetBerryTreeAge(u8 id, u8 stage); static u8 GetBerryCountByBerryTreeId(u8 id); static u16 GetStageDurationByBerryType(u8); static u8 GetDrainRateByBerryType(u8); @@ -1961,8 +1962,15 @@ void PlantBerryTree(u8 id, u8 berry, u8 stage, bool8 allowGrowth) tree->stage = stage; tree->moistureLevel = 100; if (OW_BERRY_ALWAYS_WATERABLE) - tree->berryYield = GetBerryInfo(berry)->maxYield; - if (stage == BERRY_STAGE_BERRIES) + { + // We simulate a tree having grown without water + u32 berryTreeAge = GetBerryTreeAge(id, stage); + if (GetBerryInfo(berry)->maxYield - berryTreeAge * GetBerryInfo(berry)->maxYield / 5 < GetBerryInfo(berry)->minYield) + tree->berryYield = GetBerryInfo(berry)->minYield; + else + tree->berryYield = GetBerryInfo(berry)->maxYield - berryTreeAge * GetBerryInfo(berry)->maxYield / 5; + } + else if (stage == BERRY_STAGE_BERRIES) { tree->berryYield = CalcBerryYield(tree); tree->minutesUntilNextStage *= ((tree->mulch == ITEM_TO_MULCH(ITEM_STABLE_MULCH)) ? 6 : 4); @@ -2094,6 +2102,17 @@ static u8 CalcBerryYield(struct BerryTree *tree) return result; } +static u32 GetBerryTreeAge(u8 id, u8 stage) +{ + if (stage == BERRY_STAGE_TRUNK) + stage = 5; + else if (stage == BERRY_STAGE_BUDDING) + stage = 6; + else if (stage > 0) + stage -= 1; + return GetBerryInfo(id)->growthDuration * stage / (OW_BERRY_SIX_STAGES ? 6 : 4); +} + static u8 GetBerryCountByBerryTreeId(u8 id) { return gSaveBlock1Ptr->berryTrees[id].berryYield; @@ -2331,7 +2350,6 @@ static const u8 sBerryMutations[][3] = { {ITEM_TO_BERRY(ITEM_IAPAPA_BERRY), ITEM_TO_BERRY(ITEM_MAGO_BERRY), ITEM_TO_BERRY(ITEM_POMEG_BERRY)}, {ITEM_TO_BERRY(ITEM_CHESTO_BERRY), ITEM_TO_BERRY(ITEM_PERSIM_BERRY), ITEM_TO_BERRY(ITEM_KELPSY_BERRY)}, {ITEM_TO_BERRY(ITEM_ORAN_BERRY), ITEM_TO_BERRY(ITEM_PECHA_BERRY), ITEM_TO_BERRY(ITEM_QUALOT_BERRY)}, - {ITEM_TO_BERRY(ITEM_CHESTO_BERRY), ITEM_TO_BERRY(ITEM_PERSIM_BERRY), ITEM_TO_BERRY(ITEM_KELPSY_BERRY)}, {ITEM_TO_BERRY(ITEM_ASPEAR_BERRY), ITEM_TO_BERRY(ITEM_LEPPA_BERRY), ITEM_TO_BERRY(ITEM_HONDEW_BERRY)}, {ITEM_TO_BERRY(ITEM_AGUAV_BERRY), ITEM_TO_BERRY(ITEM_FIGY_BERRY), ITEM_TO_BERRY(ITEM_GREPA_BERRY)}, {ITEM_TO_BERRY(ITEM_LUM_BERRY), ITEM_TO_BERRY(ITEM_SITRUS_BERRY), ITEM_TO_BERRY(ITEM_TAMATO_BERRY)},