From 061e56a5648c0eaf9f52ca8df5bcdc4f1b2b63a7 Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Fri, 8 Dec 2023 00:22:12 +0100 Subject: [PATCH] Make weeds and pests affect yield --- include/config/overworld.h | 18 +++++++-------- include/global.berry.h | 2 +- src/berry.c | 46 ++++++++++++++++++++++++++++++++------ 3 files changed, 49 insertions(+), 17 deletions(-) diff --git a/include/config/overworld.h b/include/config/overworld.h index dc4c600e21..8e8a0a27a8 100644 --- a/include/config/overworld.h +++ b/include/config/overworld.h @@ -17,16 +17,16 @@ #define GEN_6_XY GEN_6 #define GEN_6_ORAS (GEN_6 + 0.5) -#define OW_BERRY_MUTATIONS FALSE // If enabled, Berry plants can mutate based on berries planted next to them. -#define OW_BERRY_MULCH_USAGE FALSE // If enabled, Mulch can be used on soil to fertilize it. Otherwise, it is considered unusable. Note that moisture effects only work with OW_BERRY_MOISTURE enabled! -#define OW_BERRY_WEEDS FALSE // If enabled, weeds may grow on Berry plants that the player needs to take care of. -#define OW_BERRY_PESTS FALSE // If enabled, pests may approach Berry plants that the player needs to take care of. -#define OW_BERRY_MOISTURE FALSE // If enabled, Berry watering is not a matter of watering it once per stage, but rather of keeping the soil moist. -#define OW_BERRY_VARIABLE_DRAIN_RATE FALSE // If moisture is enabled, this setting uses the Gen4 drain rates for different berries. -#define OW_BERRY_SIX_STAGES FALSE // In XY, Berries go through six stages instead of four. This toggle does not affect the time it takes for a tree to be ready for harvest. Without OW_BERRY_MOISTURE, the two extra stages count as BERRY_STAGE_TALLER for watering purposes. +#define OW_BERRY_MUTATIONS FALSE // If enabled, Berry plants can mutate based on berries planted next to them. +#define OW_BERRY_MOISTURE FALSE // If enabled, Berry watering is not a matter of watering it once per stage, but rather of keeping the soil moist. +#define OW_BERRY_VARIABLE_DRAIN_RATE FALSE // If moisture is enabled, this setting uses the Gen4 drain rates for different berries. +#define OW_BERRY_MULCH_USAGE FALSE // If enabled, Mulch can be used on soil to fertilize it. Otherwise, it is considered unusable. Note that moisture effects only work with OW_BERRY_MOISTURE enabled! +#define OW_BERRY_WEEDS FALSE // If enabled, weeds may grow on Berry plants that the player needs to take care of. Without OW_BERRY_MOISTURE, weeding bonuses are rounded down. +#define OW_BERRY_PESTS FALSE // If enabled, pests may approach Berry plants that the player needs to take care of. Without OW_BERRY_MOISTURE, pest bonuses are rounded down. +#define OW_BERRY_SIX_STAGES FALSE // In XY, Berries go through six stages instead of four. This toggle does not affect the time it takes for a tree to be ready for harvest. Without OW_BERRY_MOISTURE, the two extra stages count as BERRY_STAGE_TALLER for watering purposes. -#define OW_BERRY_GROWTH_RATE GEN_3 // Presets for how long each Berry plant takes to grow. -#define OW_BERRY_YIELD_RATE GEN_3 // Presets for how many Berries each plant can yield. +#define OW_BERRY_GROWTH_RATE GEN_3 // Presets for how long each Berry plant takes to grow. +#define OW_BERRY_YIELD_RATE GEN_3 // Presets for how many Berries each plant can yield. // Out-of-battle Ability effects #define OW_SYNCHRONIZE_NATURE GEN_LATEST // In Gen8, if a Pokémon with Synchronize is leading the party, it's 100% guaranteed that wild Pokémon will have the same Nature, as opposed to 50% previously. Stationary Pokémon are excluded in Gen3. In Gen6, all No Eggs Discovered gift Pokémon will have the same Nature, while in Gen7 all gift Pokémon will, regardless of Egg Group - In Gen 8, no gift Pokémon are affected. In Gen9, this ability has no out-of-battle effect. diff --git a/include/global.berry.h b/include/global.berry.h index 18b48d191b..f5967d4839 100644 --- a/include/global.berry.h +++ b/include/global.berry.h @@ -86,7 +86,7 @@ struct BerryTree u8 pests:1; u8 mutationB:2; u8 regrowthCount:4; - u8 watered:4; // Used to keep track of yield lost to drought in case of Gen4 watering + u8 watered:4; // Used to keep track of bonuses in case of gradient watering u16 moistureLevel:7; u16 moistureClock:7; u16 padding:2; diff --git a/src/berry.c b/src/berry.c index 6a95d1d6a2..3d709fc88f 100644 --- a/src/berry.c +++ b/src/berry.c @@ -32,6 +32,7 @@ static u8 GetTreeMutationValue(u8 id); static u16 GetBerryPestSpecies(u8 berryId); static void TryForWeeds(struct BerryTree *tree); static void TryForPests(struct BerryTree *tree); +static void AddTreeBonus(struct BerryTree *tree, u8 bonus); //.rodata static const u8 sBerryDescriptionPart1_Cheri[] = _("Blooms with delicate pretty flowers."); @@ -1919,7 +1920,7 @@ bool32 BerryTreeGrow(struct BerryTree *tree) case BERRY_STAGE_NO_BERRY: return FALSE; case BERRY_STAGE_FLOWERING: - tree->berryYield = tree->berryYield + CalcBerryYield(tree); + tree->berryYield = CalcBerryYield(tree); case BERRY_STAGE_PLANTED: case BERRY_STAGE_SPROUTED: case BERRY_STAGE_TRUNK: @@ -2042,7 +2043,7 @@ void PlantBerryTree(u8 id, u8 berry, u8 stage, bool8 allowGrowth) tree->moistureLevel = 100; if (stage == BERRY_STAGE_BERRIES) { - tree->berryYield = tree->berryYield + CalcBerryYield(tree); + tree->berryYield = CalcBerryYield(tree); tree->minutesUntilNextStage *= ((tree->mulch == ITEM_TO_MULCH(ITEM_STABLE_MULCH)) ? 6 : 4); } @@ -2166,11 +2167,15 @@ static u8 CalcBerryYieldInternal(u16 max, u16 min, u8 water) static u8 CalcBerryYield(struct BerryTree *tree) { const struct Berry *berry = GetBerryInfo(tree->berry); - u8 min = berry->minYield; + u8 min = berry->minYield + tree->berryYield; u8 max = berry->maxYield; - u8 result = CalcBerryYieldInternal(max, min, BerryTreeGetNumStagesWatered(tree)); + u8 result; if (OW_BERRY_MULCH_USAGE && (tree->mulch == ITEM_TO_MULCH(ITEM_RICH_MULCH) || tree->mulch == ITEM_TO_MULCH(ITEM_AMAZE_MULCH))) - result += 2; + min += 2; + if (min >= max) + result = max; + else + result = CalcBerryYieldInternal(max, min, BerryTreeGetNumStagesWatered(tree)); return result; } @@ -2306,12 +2311,16 @@ void ObjectEventInteractionRemoveBerryTree(void) void ObjectEventInteractionPullBerryWeed(void) { - gSaveBlock1Ptr->berryTrees[GetObjectEventBerryTreeId(gSelectedObjectEvent)].weeds = FALSE; + struct BerryTree *tree = GetBerryTreeInfo(GetObjectEventBerryTreeId(gSelectedObjectEvent)); + tree->weeds = FALSE; + AddTreeBonus(tree, GetWeedingBonusByBerryType(tree->berry)); } void ObjectEventInteractionClearBerryPests(void) { - gSaveBlock1Ptr->berryTrees[GetObjectEventBerryTreeId(gSelectedObjectEvent)].pests = FALSE; + struct BerryTree *tree = GetBerryTreeInfo(GetObjectEventBerryTreeId(gSelectedObjectEvent)); + tree->pests = FALSE; + AddTreeBonus(tree, GetPestsBonusByBerryType(tree->berry)); } bool8 PlayerHasBerries(void) @@ -2549,3 +2558,26 @@ static void TryForPests(struct BerryTree *tree) if (Random() % 100 < BERRY_PESTS_CHANCE && tree->stage > BERRY_STAGE_PLANTED) tree->pests = TRUE; } + +static void AddTreeBonus(struct BerryTree *tree, u8 bonus) +{ + if (OW_BERRY_MOISTURE) // use watered field to save track of intermediate bonuses + { + tree->watered += bonus; + while (tree->watered > 10) + { + tree->watered -= 10; + bonus = tree->berryYield + 1; + if (bonus > GetBerryInfo(tree->berry)->maxYield) + bonus = GetBerryInfo(tree->berry)->maxYield; + tree->berryYield = bonus; + } + } + else + { + bonus = tree->berryYield + bonus / 10; + if (bonus > GetBerryInfo(tree->berry)->maxYield) + bonus = GetBerryInfo(tree->berry)->maxYield; + tree->berryYield = bonus; + } +}