pokeemerald/src/berry.c
2018-11-21 21:58:35 +01:00

1263 lines
37 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "global.h"
#include "berry.h"
#include "event_data.h"
#include "field_control_avatar.h"
#include "fieldmap.h"
#include "item.h"
#include "item_menu.h"
#include "main.h"
#include "random.h"
#include "string_util.h"
#include "text.h"
#include "constants/event_object_movement_constants.h"
#include "constants/items.h"
extern u8 EventObjectGetBerryTreeId(u8 eventObjectId);
extern void sub_8092EF0(u8 mapId, u8 mapNumber, u8 mapGroup);
extern void CB2_ChooseBerry(void);
extern bool8 IsBerryTreeSparkling(u8, u8, u8);
extern const u8 BerryTreeScript[];
static u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry);
static bool32 BerryTreeGrow(struct BerryTree *tree);
static u16 BerryTypeToItemId(u16 berry);
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 u8 GetBerryCountByBerryTreeId(u8 id);
static u16 GetStageDurationByBerryType(u8);
//.rodata
static const u8 sBerryDescriptionPart1_Cheri[] = _("Blooms with delicate pretty flowers.");
static const u8 sBerryDescriptionPart2_Cheri[] = _("The bright red BERRY is very spicy.");
static const u8 sBerryDescriptionPart1_Chesto[] = _("The BERRYs thick skin and fruit are");
static const u8 sBerryDescriptionPart2_Chesto[] = _("very tough. It is dry-tasting all over.");
static const u8 sBerryDescriptionPart1_Pecha[] = _("Very sweet and delicious.");
static const u8 sBerryDescriptionPart2_Pecha[] = _("Also very tender - handle with care.");
static const u8 sBerryDescriptionPart1_Rawst[] = _("If the leaves grow long and curly,");
static const u8 sBerryDescriptionPart2_Rawst[] = _("the BERRY seems to grow very bitter.");
static const u8 sBerryDescriptionPart1_Aspear[] = _("The hard BERRY is dense with a rich");
static const u8 sBerryDescriptionPart2_Aspear[] = _("juice. It is quite sour.");
static const u8 sBerryDescriptionPart1_Leppa[] = _("Grows slower than CHERI and others.");
static const u8 sBerryDescriptionPart2_Leppa[] = _("The smaller the BERRY, the tastier.");
static const u8 sBerryDescriptionPart1_Oran[] = _("A peculiar BERRY with a mix of flavors.");
static const u8 sBerryDescriptionPart2_Oran[] = _("BERRIES grow in half a day.");
static const u8 sBerryDescriptionPart1_Persim[] = _("Loves sunlight. The BERRYs color");
static const u8 sBerryDescriptionPart2_Persim[] = _("grows vivid when exposed to the sun.");
static const u8 sBerryDescriptionPart1_Lum[] = _("Slow to grow. If raised with loving");
static const u8 sBerryDescriptionPart2_Lum[] = _("care, it may grow two BERRIES.");
static const u8 sBerryDescriptionPart1_Sitrus[] = _("Closely related to ORAN. The large");
static const u8 sBerryDescriptionPart2_Sitrus[] = _("BERRY has a well-rounded flavor.");
static const u8 sBerryDescriptionPart1_Figy[] = _("The BERRY, which looks chewed up,");
static const u8 sBerryDescriptionPart2_Figy[] = _("brims with spicy substances.");
static const u8 sBerryDescriptionPart1_Wiki[] = _("The BERRY is said to have grown lumpy");
static const u8 sBerryDescriptionPart2_Wiki[] = _("to help POKéMON grip it.");
static const u8 sBerryDescriptionPart1_Mago[] = _("The BERRY turns curvy as it grows.");
static const u8 sBerryDescriptionPart2_Mago[] = _("The curvier, the sweeter and tastier.");
static const u8 sBerryDescriptionPart1_Aguav[] = _("The flower is dainty. It is rare in its");
static const u8 sBerryDescriptionPart2_Aguav[] = _("ability to grow without light.");
static const u8 sBerryDescriptionPart1_Iapapa[] = _("The BERRY is very big and sour.");
static const u8 sBerryDescriptionPart2_Iapapa[] = _("It takes at least a day to grow.");
static const u8 sBerryDescriptionPart1_Razz[] = _("The red BERRY tastes slightly spicy.");
static const u8 sBerryDescriptionPart2_Razz[] = _("It grows quickly in just four hours.");
static const u8 sBerryDescriptionPart1_Bluk[] = _("The BERRY is blue on the outside, but");
static const u8 sBerryDescriptionPart2_Bluk[] = _("it blackens the mouth when eaten.");
static const u8 sBerryDescriptionPart1_Nanab[] = _("This BERRY was the seventh");
static const u8 sBerryDescriptionPart2_Nanab[] = _("discovered in the world. It is sweet.");
static const u8 sBerryDescriptionPart1_Wepear[] = _("The flower is small and white. It has a");
static const u8 sBerryDescriptionPart2_Wepear[] = _("delicate balance of bitter and sour.");
static const u8 sBerryDescriptionPart1_Pinap[] = _("Weak against wind and cold.");
static const u8 sBerryDescriptionPart2_Pinap[] = _("The fruit is spicy and the skin, sour.");
static const u8 sBerryDescriptionPart1_Pomeg[] = _("However much it is watered,");
static const u8 sBerryDescriptionPart2_Pomeg[] = _("it only grows up to six BERRIES.");
static const u8 sBerryDescriptionPart1_Kelpsy[] = _("A rare variety shaped like a root.");
static const u8 sBerryDescriptionPart2_Kelpsy[] = _("Grows a very large flower.");
static const u8 sBerryDescriptionPart1_Qualot[] = _("Loves water. Grows strong even in");
static const u8 sBerryDescriptionPart2_Qualot[] = _("locations with constant rainfall.");
static const u8 sBerryDescriptionPart1_Hondew[] = _("A BERRY that is very valuable and");
static const u8 sBerryDescriptionPart2_Hondew[] = _("rarely seen. It is very delicious.");
static const u8 sBerryDescriptionPart1_Grepa[] = _("Despite its tenderness and round");
static const u8 sBerryDescriptionPart2_Grepa[] = _("shape, the BERRY is unimaginably sour.");
static const u8 sBerryDescriptionPart1_Tamato[] = _("The BERRY is lip-bendingly spicy.");
static const u8 sBerryDescriptionPart2_Tamato[] = _("It takes time to grow.");
static const u8 sBerryDescriptionPart1_Cornn[] = _("A BERRY from an ancient era. May not");
static const u8 sBerryDescriptionPart2_Cornn[] = _("grow unless planted in quantity.");
static const u8 sBerryDescriptionPart1_Magost[] = _("A BERRY that is widely said to have");
static const u8 sBerryDescriptionPart2_Magost[] = _("a finely balanced flavor.");
static const u8 sBerryDescriptionPart1_Rabuta[] = _("A rare variety that is overgrown with");
static const u8 sBerryDescriptionPart2_Rabuta[] = _("hair. It is quite bitter.");
static const u8 sBerryDescriptionPart1_Nomel[] = _("Quite sour. Just one bite makes it");
static const u8 sBerryDescriptionPart2_Nomel[] = _("impossible to taste for three days.");
static const u8 sBerryDescriptionPart1_Spelon[] = _("The vividly red BERRY is very spicy.");
static const u8 sBerryDescriptionPart2_Spelon[] = _("Its warts secrete a spicy substance.");
static const u8 sBerryDescriptionPart1_Pamtre[] = _("Drifts on the sea from somewhere.");
static const u8 sBerryDescriptionPart2_Pamtre[] = _("It is thought to grow elsewhere.");
static const u8 sBerryDescriptionPart1_Watmel[] = _("A huge BERRY, with some over 20");
static const u8 sBerryDescriptionPart2_Watmel[] = _("inches discovered. Exceedingly sweet.");
static const u8 sBerryDescriptionPart1_Durin[] = _("Bitter to even look at. It is so");
static const u8 sBerryDescriptionPart2_Durin[] = _("bitter, no one has ever eaten it as is.");
static const u8 sBerryDescriptionPart1_Belue[] = _("It is glossy and looks delicious, but");
static const u8 sBerryDescriptionPart2_Belue[] = _("it is awfully sour. Takes time to grow.");
static const u8 sBerryDescriptionPart1_Liechi[] = _("A mysterious BERRY. It is rumored to");
static const u8 sBerryDescriptionPart2_Liechi[] = _("contain the power of the sea.");
static const u8 sBerryDescriptionPart1_Ganlon[] = _("A mysterious BERRY. It is rumored to");
static const u8 sBerryDescriptionPart2_Ganlon[] = _("contain the power of the land.");
static const u8 sBerryDescriptionPart1_Salac[] = _("A mysterious BERRY. It is rumored to");
static const u8 sBerryDescriptionPart2_Salac[] = _("contain the power of the sky.");
static const u8 sBerryDescriptionPart1_Petaya[] = _("A mysterious BERRY. It is rumored to");
static const u8 sBerryDescriptionPart2_Petaya[] = _("contain the power of all living things.");
static const u8 sBerryDescriptionPart1_Apicot[] = _("A very mystifying BERRY. No telling");
static const u8 sBerryDescriptionPart2_Apicot[] = _("what may happen or how it can be used.");
static const u8 sBerryDescriptionPart1_Lansat[] = _("Said to be a legendary BERRY.");
static const u8 sBerryDescriptionPart2_Lansat[] = _("Holding it supposedly brings joy.");
static const u8 sBerryDescriptionPart1_Starf[] = _("So strong, it was abandoned at the");
static const u8 sBerryDescriptionPart2_Starf[] = _("worlds edge. Considered a mirage.");
static const u8 sBerryDescriptionPart1_Enigma[] = _("A completely enigmatic BERRY.");
static const u8 sBerryDescriptionPart2_Enigma[] = _("Appears to have the power of stars.");
const struct Berry gBerries[] =
{
{
.name = _("CHERI"),
.firmness = BERRY_FIRMNESS_SOFT,
.size = 20,
.maxYield = 3,
.minYield = 2,
.description1 = sBerryDescriptionPart1_Cheri,
.description2 = sBerryDescriptionPart2_Cheri,
.stageDuration = 3,
.spicy = 10,
.dry = 0,
.sweet = 0,
.bitter = 0,
.sour = 0,
.smoothness = 25,
},
{
.name = _("CHESTO"),
.firmness = BERRY_FIRMNESS_SUPER_HARD,
.size = 80,
.maxYield = 3,
.minYield = 2,
.description1 = sBerryDescriptionPart1_Chesto,
.description2 = sBerryDescriptionPart2_Chesto,
.stageDuration = 3,
.spicy = 0,
.dry = 10,
.sweet = 0,
.bitter = 0,
.sour = 0,
.smoothness = 25,
},
{
.name = _("PECHA"),
.firmness = BERRY_FIRMNESS_VERY_SOFT,
.size = 40,
.maxYield = 3,
.minYield = 2,
.description1 = sBerryDescriptionPart1_Pecha,
.description2 = sBerryDescriptionPart2_Pecha,
.stageDuration = 3,
.spicy = 0,
.dry = 0,
.sweet = 10,
.bitter = 0,
.sour = 0,
.smoothness = 25,
},
{
.name = _("RAWST"),
.firmness = BERRY_FIRMNESS_HARD,
.size = 32,
.maxYield = 3,
.minYield = 2,
.description1 = sBerryDescriptionPart1_Rawst,
.description2 = sBerryDescriptionPart2_Rawst,
.stageDuration = 3,
.spicy = 0,
.dry = 0,
.sweet = 0,
.bitter = 10,
.sour = 0,
.smoothness = 25,
},
{
.name = _("ASPEAR"),
.firmness = BERRY_FIRMNESS_SUPER_HARD,
.size = 50,
.maxYield = 3,
.minYield = 2,
.description1 = sBerryDescriptionPart1_Aspear,
.description2 = sBerryDescriptionPart2_Aspear,
.stageDuration = 3,
.spicy = 0,
.dry = 0,
.sweet = 0,
.bitter = 0,
.sour = 10,
.smoothness = 25,
},
{
.name = _("LEPPA"),
.firmness = BERRY_FIRMNESS_VERY_HARD,
.size = 28,
.maxYield = 3,
.minYield = 2,
.description1 = sBerryDescriptionPart1_Leppa,
.description2 = sBerryDescriptionPart2_Leppa,
.stageDuration = 4,
.spicy = 10,
.dry = 0,
.sweet = 10,
.bitter = 10,
.sour = 10,
.smoothness = 20,
},
{
.name = _("ORAN"),
.firmness = BERRY_FIRMNESS_SUPER_HARD,
.size = 35,
.maxYield = 3,
.minYield = 2,
.description1 = sBerryDescriptionPart1_Oran,
.description2 = sBerryDescriptionPart2_Oran,
.stageDuration = 3,
.spicy = 10,
.dry = 10,
.sweet = 10,
.bitter = 10,
.sour = 10,
.smoothness = 20,
},
{
.name = _("PERSIM"),
.firmness = BERRY_FIRMNESS_HARD,
.size = 47,
.maxYield = 3,
.minYield = 2,
.description1 = sBerryDescriptionPart1_Persim,
.description2 = sBerryDescriptionPart2_Persim,
.stageDuration = 3,
.spicy = 10,
.dry = 10,
.sweet = 10,
.bitter = 10,
.sour = 10,
.smoothness = 20,
},
{
.name = _("LUM"),
.firmness = BERRY_FIRMNESS_SUPER_HARD,
.size = 34,
.maxYield = 2,
.minYield = 1,
.description1 = sBerryDescriptionPart1_Lum,
.description2 = sBerryDescriptionPart2_Lum,
.stageDuration = 12,
.spicy = 10,
.dry = 10,
.sweet = 10,
.bitter = 10,
.sour = 10,
.smoothness = 20,
},
{
.name = _("SITRUS"),
.firmness = BERRY_FIRMNESS_VERY_HARD,
.size = 95,
.maxYield = 3,
.minYield = 2,
.description1 = sBerryDescriptionPart1_Sitrus,
.description2 = sBerryDescriptionPart2_Sitrus,
.stageDuration = 6,
.spicy = 10,
.dry = 10,
.sweet = 10,
.bitter = 10,
.sour = 10,
.smoothness = 20,
},
{
.name = _("FIGY"),
.firmness = BERRY_FIRMNESS_SOFT,
.size = 100,
.maxYield = 3,
.minYield = 2,
.description1 = sBerryDescriptionPart1_Figy,
.description2 = sBerryDescriptionPart2_Figy,
.stageDuration = 6,
.spicy = 10,
.dry = 0,
.sweet = 0,
.bitter = 0,
.sour = 0,
.smoothness = 25,
},
{
.name = _("WIKI"),
.firmness = BERRY_FIRMNESS_HARD,
.size = 115,
.maxYield = 3,
.minYield = 2,
.description1 = sBerryDescriptionPart1_Wiki,
.description2 = sBerryDescriptionPart2_Wiki,
.stageDuration = 6,
.spicy = 0,
.dry = 10,
.sweet = 0,
.bitter = 0,
.sour = 0,
.smoothness = 25,
},
{
.name = _("MAGO"),
.firmness = BERRY_FIRMNESS_HARD,
.size = 126,
.maxYield = 3,
.minYield = 2,
.description1 = sBerryDescriptionPart1_Mago,
.description2 = sBerryDescriptionPart2_Mago,
.stageDuration = 6,
.spicy = 0,
.dry = 0,
.sweet = 10,
.bitter = 0,
.sour = 0,
.smoothness = 25,
},
{
.name = _("AGUAV"),
.firmness = BERRY_FIRMNESS_SUPER_HARD,
.size = 64,
.maxYield = 3,
.minYield = 2,
.description1 = sBerryDescriptionPart1_Aguav,
.description2 = sBerryDescriptionPart2_Aguav,
.stageDuration = 6,
.spicy = 0,
.dry = 0,
.sweet = 0,
.bitter = 10,
.sour = 0,
.smoothness = 25,
},
{
.name = _("IAPAPA"),
.firmness = BERRY_FIRMNESS_SOFT,
.size = 223,
.maxYield = 3,
.minYield = 2,
.description1 = sBerryDescriptionPart1_Iapapa,
.description2 = sBerryDescriptionPart2_Iapapa,
.stageDuration = 6,
.spicy = 0,
.dry = 0,
.sweet = 0,
.bitter = 0,
.sour = 10,
.smoothness = 25,
},
{
.name = _("RAZZ"),
.firmness = BERRY_FIRMNESS_VERY_HARD,
.size = 120,
.maxYield = 6,
.minYield = 3,
.description1 = sBerryDescriptionPart1_Razz,
.description2 = sBerryDescriptionPart2_Razz,
.stageDuration = 1,
.spicy = 10,
.dry = 10,
.sweet = 0,
.bitter = 0,
.sour = 0,
.smoothness = 20,
},
{
.name = _("BLUK"),
.firmness = BERRY_FIRMNESS_SOFT,
.size = 108,
.maxYield = 6,
.minYield = 3,
.description1 = sBerryDescriptionPart1_Bluk,
.description2 = sBerryDescriptionPart2_Bluk,
.stageDuration = 1,
.spicy = 0,
.dry = 10,
.sweet = 10,
.bitter = 0,
.sour = 0,
.smoothness = 20,
},
{
.name = _("NANAB"),
.firmness = BERRY_FIRMNESS_VERY_HARD,
.size = 77,
.maxYield = 6,
.minYield = 3,
.description1 = sBerryDescriptionPart1_Nanab,
.description2 = sBerryDescriptionPart2_Nanab,
.stageDuration = 1,
.spicy = 0,
.dry = 0,
.sweet = 10,
.bitter = 10,
.sour = 0,
.smoothness = 20,
},
{
.name = _("WEPEAR"),
.firmness = BERRY_FIRMNESS_SUPER_HARD,
.size = 74,
.maxYield = 6,
.minYield = 3,
.description1 = sBerryDescriptionPart1_Wepear,
.description2 = sBerryDescriptionPart2_Wepear,
.stageDuration = 1,
.spicy = 0,
.dry = 0,
.sweet = 0,
.bitter = 10,
.sour = 10,
.smoothness = 20,
},
{
.name = _("PINAP"),
.firmness = BERRY_FIRMNESS_HARD,
.size = 80,
.maxYield = 6,
.minYield = 3,
.description1 = sBerryDescriptionPart1_Pinap,
.description2 = sBerryDescriptionPart2_Pinap,
.stageDuration = 1,
.spicy = 10,
.dry = 0,
.sweet = 0,
.bitter = 0,
.sour = 10,
.smoothness = 20,
},
{
.name = _("POMEG"),
.firmness = BERRY_FIRMNESS_VERY_HARD,
.size = 135,
.maxYield = 6,
.minYield = 2,
.description1 = sBerryDescriptionPart1_Pomeg,
.description2 = sBerryDescriptionPart2_Pomeg,
.stageDuration = 3,
.spicy = 10,
.dry = 0,
.sweet = 10,
.bitter = 10,
.sour = 0,
.smoothness = 20,
},
{
.name = _("KELPSY"),
.firmness = BERRY_FIRMNESS_HARD,
.size = 150,
.maxYield = 6,
.minYield = 2,
.description1 = sBerryDescriptionPart1_Kelpsy,
.description2 = sBerryDescriptionPart2_Kelpsy,
.stageDuration = 3,
.spicy = 0,
.dry = 10,
.sweet = 0,
.bitter = 10,
.sour = 10,
.smoothness = 20,
},
{
.name = _("QUALOT"),
.firmness = BERRY_FIRMNESS_HARD,
.size = 110,
.maxYield = 6,
.minYield = 2,
.description1 = sBerryDescriptionPart1_Qualot,
.description2 = sBerryDescriptionPart2_Qualot,
.stageDuration = 3,
.spicy = 10,
.dry = 0,
.sweet = 10,
.bitter = 0,
.sour = 10,
.smoothness = 20,
},
{
.name = _("HONDEW"),
.firmness = BERRY_FIRMNESS_HARD,
.size = 162,
.maxYield = 6,
.minYield = 2,
.description1 = sBerryDescriptionPart1_Hondew,
.description2 = sBerryDescriptionPart2_Hondew,
.stageDuration = 3,
.spicy = 10,
.dry = 10,
.sweet = 0,
.bitter = 10,
.sour = 0,
.smoothness = 20,
},
{
.name = _("GREPA"),
.firmness = BERRY_FIRMNESS_SOFT,
.size = 149,
.maxYield = 6,
.minYield = 2,
.description1 = sBerryDescriptionPart1_Grepa,
.description2 = sBerryDescriptionPart2_Grepa,
.stageDuration = 3,
.spicy = 0,
.dry = 10,
.sweet = 10,
.bitter = 0,
.sour = 10,
.smoothness = 20,
},
{
.name = _("TAMATO"),
.firmness = BERRY_FIRMNESS_SOFT,
.size = 200,
.maxYield = 4,
.minYield = 2,
.description1 = sBerryDescriptionPart1_Tamato,
.description2 = sBerryDescriptionPart2_Tamato,
.stageDuration = 6,
.spicy = 20,
.dry = 10,
.sweet = 0,
.bitter = 0,
.sour = 0,
.smoothness = 30,
},
{
.name = _("CORNN"),
.firmness = BERRY_FIRMNESS_HARD,
.size = 75,
.maxYield = 4,
.minYield = 2,
.description1 = sBerryDescriptionPart1_Cornn,
.description2 = sBerryDescriptionPart2_Cornn,
.stageDuration = 6,
.spicy = 0,
.dry = 20,
.sweet = 10,
.bitter = 0,
.sour = 0,
.smoothness = 30,
},
{
.name = _("MAGOST"),
.firmness = BERRY_FIRMNESS_HARD,
.size = 140,
.maxYield = 4,
.minYield = 2,
.description1 = sBerryDescriptionPart1_Magost,
.description2 = sBerryDescriptionPart2_Magost,
.stageDuration = 6,
.spicy = 0,
.dry = 0,
.sweet = 20,
.bitter = 10,
.sour = 0,
.smoothness = 30,
},
{
.name = _("RABUTA"),
.firmness = BERRY_FIRMNESS_SOFT,
.size = 226,
.maxYield = 4,
.minYield = 2,
.description1 = sBerryDescriptionPart1_Rabuta,
.description2 = sBerryDescriptionPart2_Rabuta,
.stageDuration = 6,
.spicy = 0,
.dry = 0,
.sweet = 0,
.bitter = 20,
.sour = 10,
.smoothness = 30,
},
{
.name = _("NOMEL"),
.firmness = BERRY_FIRMNESS_SUPER_HARD,
.size = 285,
.maxYield = 4,
.minYield = 2,
.description1 = sBerryDescriptionPart1_Nomel,
.description2 = sBerryDescriptionPart2_Nomel,
.stageDuration = 6,
.spicy = 10,
.dry = 0,
.sweet = 0,
.bitter = 0,
.sour = 20,
.smoothness = 30,
},
{
.name = _("SPELON"),
.firmness = BERRY_FIRMNESS_SOFT,
.size = 133,
.maxYield = 2,
.minYield = 1,
.description1 = sBerryDescriptionPart1_Spelon,
.description2 = sBerryDescriptionPart2_Spelon,
.stageDuration = 18,
.spicy = 40,
.dry = 10,
.sweet = 0,
.bitter = 0,
.sour = 0,
.smoothness = 70,
},
{
.name = _("PAMTRE"),
.firmness = BERRY_FIRMNESS_VERY_SOFT,
.size = 244,
.maxYield = 2,
.minYield = 1,
.description1 = sBerryDescriptionPart1_Pamtre,
.description2 = sBerryDescriptionPart2_Pamtre,
.stageDuration = 18,
.spicy = 0,
.dry = 40,
.sweet = 10,
.bitter = 0,
.sour = 0,
.smoothness = 70,
},
{
.name = _("WATMEL"),
.firmness = BERRY_FIRMNESS_SOFT,
.size = 250,
.maxYield = 2,
.minYield = 1,
.description1 = sBerryDescriptionPart1_Watmel,
.description2 = sBerryDescriptionPart2_Watmel,
.stageDuration = 18,
.spicy = 0,
.dry = 0,
.sweet = 40,
.bitter = 10,
.sour = 0,
.smoothness = 70,
},
{
.name = _("DURIN"),
.firmness = BERRY_FIRMNESS_HARD,
.size = 280,
.maxYield = 2,
.minYield = 1,
.description1 = sBerryDescriptionPart1_Durin,
.description2 = sBerryDescriptionPart2_Durin,
.stageDuration = 18,
.spicy = 0,
.dry = 0,
.sweet = 0,
.bitter = 40,
.sour = 10,
.smoothness = 70,
},
{
.name = _("BELUE"),
.firmness = BERRY_FIRMNESS_VERY_SOFT,
.size = 300,
.maxYield = 2,
.minYield = 1,
.description1 = sBerryDescriptionPart1_Belue,
.description2 = sBerryDescriptionPart2_Belue,
.stageDuration = 18,
.spicy = 10,
.dry = 0,
.sweet = 0,
.bitter = 0,
.sour = 40,
.smoothness = 70,
},
{
.name = _("LIECHI"),
.firmness = BERRY_FIRMNESS_VERY_HARD,
.size = 111,
.maxYield = 2,
.minYield = 1,
.description1 = sBerryDescriptionPart1_Liechi,
.description2 = sBerryDescriptionPart2_Liechi,
.stageDuration = 24,
.spicy = 40,
.dry = 0,
.sweet = 40,
.bitter = 0,
.sour = 10,
.smoothness = 80,
},
{
.name = _("GANLON"),
.firmness = BERRY_FIRMNESS_VERY_HARD,
.size = 33,
.maxYield = 2,
.minYield = 1,
.description1 = sBerryDescriptionPart1_Ganlon,
.description2 = sBerryDescriptionPart2_Ganlon,
.stageDuration = 24,
.spicy = 0,
.dry = 40,
.sweet = 0,
.bitter = 40,
.sour = 0,
.smoothness = 80,
},
{
.name = _("SALAC"),
.firmness = BERRY_FIRMNESS_VERY_HARD,
.size = 95,
.maxYield = 2,
.minYield = 1,
.description1 = sBerryDescriptionPart1_Salac,
.description2 = sBerryDescriptionPart2_Salac,
.stageDuration = 24,
.spicy = 0,
.dry = 0,
.sweet = 40,
.bitter = 0,
.sour = 40,
.smoothness = 80,
},
{
.name = _("PETAYA"),
.firmness = BERRY_FIRMNESS_VERY_HARD,
.size = 237,
.maxYield = 2,
.minYield = 1,
.description1 = sBerryDescriptionPart1_Petaya,
.description2 = sBerryDescriptionPart2_Petaya,
.stageDuration = 24,
.spicy = 40,
.dry = 0,
.sweet = 0,
.bitter = 40,
.sour = 0,
.smoothness = 80,
},
{
.name = _("APICOT"),
.firmness = BERRY_FIRMNESS_HARD,
.size = 75,
.maxYield = 2,
.minYield = 1,
.description1 = sBerryDescriptionPart1_Apicot,
.description2 = sBerryDescriptionPart2_Apicot,
.stageDuration = 24,
.spicy = 0,
.dry = 40,
.sweet = 0,
.bitter = 0,
.sour = 40,
.smoothness = 80,
},
{
.name = _("LANSAT"),
.firmness = BERRY_FIRMNESS_SOFT,
.size = 97,
.maxYield = 2,
.minYield = 1,
.description1 = sBerryDescriptionPart1_Lansat,
.description2 = sBerryDescriptionPart2_Lansat,
.stageDuration = 24,
.spicy = 10,
.dry = 10,
.sweet = 10,
.bitter = 10,
.sour = 10,
.smoothness = 30,
},
{
.name = _("STARF"),
.firmness = BERRY_FIRMNESS_SUPER_HARD,
.size = 153,
.maxYield = 2,
.minYield = 1,
.description1 = sBerryDescriptionPart1_Starf,
.description2 = sBerryDescriptionPart2_Starf,
.stageDuration = 24,
.spicy = 10,
.dry = 10,
.sweet = 10,
.bitter = 10,
.sour = 10,
.smoothness = 30,
},
{
.name = _("ENIGMA"),
.firmness = BERRY_FIRMNESS_UNKNOWN,
.size = 0,
.maxYield = 2,
.minYield = 1,
.description1 = sBerryDescriptionPart1_Enigma,
.description2 = sBerryDescriptionPart2_Enigma,
.stageDuration = 24,
.spicy = 40,
.dry = 40,
.sweet = 40,
.bitter = 40,
.sour = 40,
.smoothness = 40,
},
};
const struct UnkStruct_0858AB24 gUnknown_0858AB24[] = {
{ 50, 20},
{ 50, 20},
{ 50, 20},
{ 50, 20},
{ 50, 20},
{ 50, 30},
{ 50, 30},
{ 50, 30},
{ 50, 30},
{ 50, 30},
{ 60, 50},
{ 60, 50},
{ 60, 50},
{ 60, 50},
{ 60, 50},
{ 80, 70},
{ 80, 70},
{ 80, 70},
{ 80, 70},
{ 80, 70},
{100, 100},
{100, 100},
{100, 100},
{100, 100},
{100, 100},
{130, 150},
{130, 150},
{130, 150},
{130, 150},
{130, 150},
{160, 250},
{160, 250},
{160, 250},
{160, 250},
{160, 250},
{180, 500},
{180, 500},
{180, 500},
{180, 500},
{180, 500},
{200, 750},
{200, 750},
{150, 200}
};
const struct BerryTree gBlankBerryTree = {};
//.text
// unused
void ClearEnigmaBerries(void)
{
CpuFill16(0, &gSaveBlock1Ptr->enigmaBerry, 52);
}
void SetEnigmaBerry(u8 *src)
{
u32 i;
u8 *dest = (u8*)&gSaveBlock1Ptr->enigmaBerry;
for (i = 0; i < 52; i++)
dest[i] = src[i];
}
static u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry)
{
u32 i;
u32 checksum;
u8 *dest;
dest = (u8*)enigmaBerry;
checksum = 0;
for (i = 0; i < 52 - sizeof(gSaveBlock1Ptr->enigmaBerry.checksum); i++)
{
checksum += dest[i];
}
return checksum;
}
bool32 IsEnigmaBerryValid(void)
{
if (!gSaveBlock1Ptr->enigmaBerry.berry.stageDuration)
return FALSE;
if (!gSaveBlock1Ptr->enigmaBerry.berry.maxYield)
return FALSE;
if (GetEnigmaBerryChecksum(&gSaveBlock1Ptr->enigmaBerry) != gSaveBlock1Ptr->enigmaBerry.checksum)
return FALSE;
return TRUE;
}
const struct Berry *GetBerryInfo(u8 berry)
{
if (berry == ITEM_TO_BERRY(ITEM_ENIGMA_BERRY) && IsEnigmaBerryValid())
return (struct Berry*)(&gSaveBlock1Ptr->enigmaBerry.berry);
else
{
if (berry == BERRY_NONE || berry > ITEM_TO_BERRY(LAST_BERRY_INDEX))
berry = ITEM_TO_BERRY(FIRST_BERRY_INDEX);
return &gBerries[berry - 1];
}
}
struct BerryTree *GetBerryTreeInfo(u8 id)
{
return &gSaveBlock1Ptr->berryTrees[id];
}
bool32 EventObjectInteractionWaterBerryTree(void)
{
struct BerryTree *tree = GetBerryTreeInfo(EventObjectGetBerryTreeId(gSelectedEventObject));
switch (tree->stage)
{
case BERRY_STAGE_PLANTED:
tree->watered1 = TRUE;
break;
case BERRY_STAGE_SPROUTED:
tree->watered2 = TRUE;
break;
case BERRY_STAGE_TALLER:
tree->watered3 = TRUE;
break;
case BERRY_STAGE_FLOWERING:
tree->watered4 = TRUE;
break;
default:
return FALSE;
}
return TRUE;
}
bool8 IsPlayerFacingPlantedBerryTree(void)
{
if (GetEventObjectScriptPointerPlayerFacing() == BerryTreeScript
&& GetStageByBerryTreeId(EventObjectGetBerryTreeId(gSelectedEventObject)) == 0)
return TRUE;
else
return FALSE;
}
bool8 TryToWaterBerryTree(void)
{
if (GetEventObjectScriptPointerPlayerFacing() != BerryTreeScript)
return FALSE;
else
return EventObjectInteractionWaterBerryTree();
}
void ClearBerryTrees(void)
{
int i;
for (i = 0; i < BERRY_TREES_COUNT; i++)
gSaveBlock1Ptr->berryTrees[i] = gBlankBerryTree;
}
static bool32 BerryTreeGrow(struct BerryTree *tree)
{
if (tree->growthSparkle)
return FALSE;
switch (tree->stage)
{
case BERRY_STAGE_NO_BERRY:
return FALSE;
case BERRY_STAGE_FLOWERING:
tree->berryYield = CalcBerryYield(tree);
case BERRY_STAGE_PLANTED:
case BERRY_STAGE_SPROUTED:
case BERRY_STAGE_TALLER:
tree->stage++;
break;
case BERRY_STAGE_BERRIES:
tree->watered1 = 0;
tree->watered2 = 0;
tree->watered3 = 0;
tree->watered4 = 0;
tree->berryYield = 0;
tree->stage = BERRY_STAGE_SPROUTED;
if (++tree->regrowthCount == 10)
*tree = gBlankBerryTree;
break;
}
return TRUE;
}
void BerryTreeTimeUpdate(s32 minutes)
{
int i;
struct BerryTree *tree;
for (i = 0; i < BERRY_TREES_COUNT; i++)
{
tree = &gSaveBlock1Ptr->berryTrees[i];
if (tree->berry && tree->stage && !tree->growthSparkle)
{
if (minutes >= GetStageDurationByBerryType(tree->berry) * 71)
{
*tree = gBlankBerryTree;
}
else
{
s32 time = minutes;
while (time != 0)
{
if (tree->minutesUntilNextStage > time)
{
tree->minutesUntilNextStage -= time;
break;
}
time -= tree->minutesUntilNextStage;
tree->minutesUntilNextStage = GetStageDurationByBerryType(tree->berry);
if (!BerryTreeGrow(tree))
break;
if (tree->stage == BERRY_STAGE_BERRIES)
tree->minutesUntilNextStage *= 4;
}
}
}
}
}
void PlantBerryTree(u8 id, u8 berry, u8 stage, bool8 sparkle)
{
struct BerryTree *tree = GetBerryTreeInfo(id);
*tree = gBlankBerryTree;
tree->berry = berry;
tree->minutesUntilNextStage = GetStageDurationByBerryType(berry);
tree->stage = stage;
if (stage == BERRY_STAGE_BERRIES)
{
tree->berryYield = CalcBerryYield(tree);
tree->minutesUntilNextStage *= 4;
}
if (!sparkle)
{
tree->growthSparkle = TRUE;
}
}
void RemoveBerryTree(u8 id)
{
gSaveBlock1Ptr->berryTrees[id] = gBlankBerryTree;
}
u8 GetBerryTypeByBerryTreeId(u8 id)
{
return gSaveBlock1Ptr->berryTrees[id].berry;
}
u8 GetStageByBerryTreeId(u8 id)
{
return gSaveBlock1Ptr->berryTrees[id].stage;
}
u8 ItemIdToBerryType(u16 item)
{
u16 berry = item - FIRST_BERRY_INDEX;
if (berry > LAST_BERRY_INDEX - FIRST_BERRY_INDEX)
return 1;
else
return ITEM_TO_BERRY(item);
}
static u16 BerryTypeToItemId(u16 berry)
{
u16 item = berry - 1;
if (item > LAST_BERRY_INDEX - FIRST_BERRY_INDEX)
return FIRST_BERRY_INDEX;
else
return berry + FIRST_BERRY_INDEX - 1;
}
void GetBerryNameByBerryType(u8 berry, u8 *string)
{
memcpy(string, GetBerryInfo(berry)->name, BERRY_NAME_LENGTH);
string[BERRY_NAME_LENGTH] = EOS;
}
void GetBerryCountStringByBerryType(u8 berry, u8* dest, u32 berryCount)
{
GetBerryCountString(dest, GetBerryInfo(berry)->name, berryCount);
}
void ResetBerryTreeSparkleFlag(u8 id)
{
GetBerryTreeInfo(id)->growthSparkle = FALSE;
}
static u8 BerryTreeGetNumStagesWatered(struct BerryTree *tree)
{
u8 count = 0;
if (tree->watered1)
count++;
if (tree->watered2)
count++;
if (tree->watered3)
count++;
if (tree->watered4)
count++;
return count;
}
static u8 GetNumStagesWateredByBerryTreeId(u8 id)
{
return BerryTreeGetNumStagesWatered(GetBerryTreeInfo(id));
}
static u8 CalcBerryYieldInternal(u16 max, u16 min, u8 water)
{
u32 randMin;
u32 randMax;
u32 rand;
u32 extraYield;
if (water == 0)
return min;
else
{
randMin = (max - min) * (water - 1);
randMax = (max - min) * (water);
rand = randMin + Random() % (randMax - randMin + 1);
if ((rand & 3) > 1)
extraYield = rand / 4 + 1;
else
extraYield = rand / 4;
return extraYield + min;
}
}
static u8 CalcBerryYield(struct BerryTree *tree)
{
const struct Berry *berry = GetBerryInfo(tree->berry);
u8 min = berry->minYield;
u8 max = berry->maxYield;
return CalcBerryYieldInternal(max, min, BerryTreeGetNumStagesWatered(tree));
}
static u8 GetBerryCountByBerryTreeId(u8 id)
{
return gSaveBlock1Ptr->berryTrees[id].berryYield;
}
static u16 GetStageDurationByBerryType(u8 berry)
{
return GetBerryInfo(berry)->stageDuration * 60;
}
void EventObjectInteractionGetBerryTreeData(void)
{
u8 id;
u8 berry;
u8 localId;
u8 group;
u8 num;
id = EventObjectGetBerryTreeId(gSelectedEventObject);
berry = GetBerryTypeByBerryTreeId(id);
ResetBerryTreeSparkleFlag(id);
localId = gSpecialVar_LastTalked;
num = gSaveBlock1Ptr->location.mapNum;
group = gSaveBlock1Ptr->location.mapGroup;
if (IsBerryTreeSparkling(localId, num, group))
gSpecialVar_0x8004 = BERRY_STAGE_SPARKLING;
else
gSpecialVar_0x8004 = GetStageByBerryTreeId(id);
gSpecialVar_0x8005 = GetNumStagesWateredByBerryTreeId(id);
gSpecialVar_0x8006 = GetBerryCountByBerryTreeId(id);
GetBerryCountStringByBerryType(berry, gStringVar1, gSpecialVar_0x8006);
}
void EventObjectInteractionGetBerryName(void)
{
u8 berryType = GetBerryTypeByBerryTreeId(EventObjectGetBerryTreeId(gSelectedEventObject));
GetBerryNameByBerryType(berryType, gStringVar1);
}
void EventObjectInteractionGetBerryCountString(void)
{
u8 treeId = EventObjectGetBerryTreeId(gSelectedEventObject);
u8 berry = GetBerryTypeByBerryTreeId(treeId);
u8 count = GetBerryCountByBerryTreeId(treeId);
GetBerryCountStringByBerryType(berry, gStringVar1, count);
}
void Bag_ChooseBerry(void)
{
SetMainCallback2(CB2_ChooseBerry);
}
void EventObjectInteractionPlantBerryTree(void)
{
u8 berry = ItemIdToBerryType(gSpecialVar_ItemId);
PlantBerryTree(EventObjectGetBerryTreeId(gSelectedEventObject), berry, 1, TRUE);
EventObjectInteractionGetBerryTreeData();
}
void EventObjectInteractionPickBerryTree(void)
{
u8 id = EventObjectGetBerryTreeId(gSelectedEventObject);
u8 berry = GetBerryTypeByBerryTreeId(id);
gSpecialVar_0x8004 = AddBagItem(BerryTypeToItemId(berry), GetBerryCountByBerryTreeId(id));
}
void EventObjectInteractionRemoveBerryTree(void)
{
RemoveBerryTree(EventObjectGetBerryTreeId(gSelectedEventObject));
sub_8092EF0(gSpecialVar_LastTalked, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);
}
bool8 PlayerHasBerries(void)
{
return IsBagPocketNonEmpty(POCKET_BERRIES);
}
void ResetBerryTreeSparkleFlags(void)
{
s16 cam_left;
s16 cam_top;
s16 left;
s16 top;
s16 right;
s16 bottom;
int i;
GetCameraCoords(&cam_left, &cam_top);
left = cam_left;
top = cam_top + 3;
right = cam_left + 14;
bottom = top + 8;
for (i = 0; i < EVENT_OBJECTS_COUNT; i++)
{
if (gEventObjects[i].active && gEventObjects[i].movementType == MOVEMENT_TYPE_BERRY_TREE_GROWTH)
{
cam_left = gEventObjects[i].currentCoords.x;
cam_top = gEventObjects[i].currentCoords.y;
if (left <= cam_left && cam_left <= right && top <= cam_top && cam_top <= bottom)
ResetBerryTreeSparkleFlag(gEventObjects[i].trainerRange_berryTreeId);
}
}
}