Skip to content

Commit

Permalink
Merge pull request #2531 from AsparagusEduardo/RHH/pr/feature/Incense…
Browse files Browse the repository at this point in the history
…Baby

Refactored incense baby checks into table and added Gen 9 config.
  • Loading branch information
ghoulslash authored Jan 9, 2023
2 parents da27df9 + 612ef46 commit 05e9bfe
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 41 deletions.
9 changes: 8 additions & 1 deletion include/config/pokemon.h
Original file line number Diff line number Diff line change
@@ -1,14 +1,21 @@
#ifndef GUARD_CONFIG_POKEMON_H
#define GUARD_CONFIG_POKEMON_H

// Species data settings
#define P_UPDATED_TYPES GEN_LATEST // Since Gen 6, several Pokémon were changed to be partially or fully Fairy type.
#define P_UPDATED_STATS GEN_LATEST // Since Gen 6, Pokémon stats are updated with each passing generation.
#define P_UPDATED_ABILITIES GEN_LATEST // Since Gen 6, certain Pokémon have their abilities changed.
#define P_UPDATED_EGG_GROUPS GEN_LATEST // Since Gen 8, certain Pokémon have gained new egg groups.

// Breeding settings
#define P_NIDORAN_M_DITTO_BREED GEN_LATEST // Since Gen 5, when Nidoran♂ breeds with Ditto it can produce Nidoran♀ offspring. Before, it would only yield male offspring. This change also applies to Volbeat.
#define P_INCENSE_BREEDING GEN_LATEST // Since Gen 9, cross-generation Baby Pokémon don't require Incense being held by the parents to be obtained via breeding.
#define P_EGG_HATCH_LEVEL GEN_LATEST // Since Gen 4, Pokémon will hatch from eggs at level 1 instead of 5.

// Other settings
#define P_SHEDINJA_BALL GEN_LATEST // Since Gen 4, Shedinja requires a Poké Ball for its evolution. In Gen 3, Shedinja inherits Nincada's Ball.
#define P_LEGENDARY_PERFECT_IVS GEN_LATEST // Since Gen 6, Legendaries, Mythicals and Ultra Beasts found in the wild or given through gifts have at least 3 perfect IVs.
#define P_KADABRA_EVERSTONE GEN_LATEST // Since Gen 4, Kadabra can evolve even when holding an Everstone.
#define P_NIDORAN_M_DITTO_BREED GEN_LATEST // Since Gen 5, when Nidoran♂ breeds with Ditto it can produce Nidoran♀ offspring. Before, it would only yield male offspring. This change also applies to Volbeat.
#define P_HIPPO_GENDER_DIFF_ICONS TRUE // If TRUE, will give Hippopotas and Hippowdon custom icons for their female forms.

// Flag settings
Expand Down
4 changes: 4 additions & 0 deletions include/constants/daycare.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,11 @@
#define DAYCARE_TWO_MONS 3

#define INHERITED_IV_COUNT 3
#if P_EGG_HATCH_LEVEL >= GEN_4
#define EGG_HATCH_LEVEL 1
#else
#define EGG_HATCH_LEVEL 5
#endif
#define EGG_GENDER_MALE 0x8000 // used to create a male egg from a female-only parent species (e.g. Nidoran)

#define DAYCARE_LEVEL_MENU_EXIT 5
Expand Down
92 changes: 52 additions & 40 deletions src/daycare.c
Original file line number Diff line number Diff line change
Expand Up @@ -742,55 +742,66 @@ void RejectEggFromDayCare(void)
RemoveEggFromDayCare(&gSaveBlock1Ptr->daycare);
}

static const struct {
u16 currSpecies;
u16 item;
u16 babySpecies;
} IncenseBabyTable[][3] =
{
// Regular offspring, Item, Incense Offspring
{ SPECIES_WOBBUFFET, ITEM_LAX_INCENSE, SPECIES_WYNAUT },
{ SPECIES_MARILL, ITEM_SEA_INCENSE, SPECIES_AZURILL },
{ SPECIES_SNORLAX, ITEM_FULL_INCENSE, SPECIES_MUNCHLAX },
{ SPECIES_CHANSEY, ITEM_LUCK_INCENSE, SPECIES_HAPPINY },
{ SPECIES_MR_MIME, ITEM_ODD_INCENSE, SPECIES_MIME_JR },
{ SPECIES_CHIMECHO, ITEM_PURE_INCENSE, SPECIES_CHINGLING },
{ SPECIES_SUDOWOODO, ITEM_ROCK_INCENSE, SPECIES_BONSLY },
{ SPECIES_ROSELIA, ITEM_ROSE_INCENSE, SPECIES_BUDEW },
{ SPECIES_MANTINE, ITEM_WAVE_INCENSE, SPECIES_MANTYKE },
};

static void AlterEggSpeciesWithIncenseItem(u16 *species, struct DayCare *daycare)
{
u32 i;
u16 motherItem, fatherItem;
motherItem = GetBoxMonData(&daycare->mons[0].mon, MON_DATA_HELD_ITEM);
fatherItem = GetBoxMonData(&daycare->mons[1].mon, MON_DATA_HELD_ITEM);

if (*species == SPECIES_WYNAUT && motherItem != ITEM_LAX_INCENSE && fatherItem != ITEM_LAX_INCENSE)
*species = SPECIES_WOBBUFFET;
else if (*species == SPECIES_AZURILL && motherItem != ITEM_SEA_INCENSE && fatherItem != ITEM_SEA_INCENSE)
*species = SPECIES_MARILL;
#ifdef SPECIES_MUNCHLAX
else if (*species == SPECIES_MUNCHLAX && motherItem != ITEM_FULL_INCENSE && fatherItem != ITEM_FULL_INCENSE)
*species = SPECIES_SNORLAX;
#endif
#ifdef SPECIES_HAPPINY
else if (*species == SPECIES_HAPPINY && motherItem != ITEM_LUCK_INCENSE && fatherItem != ITEM_LUCK_INCENSE)
*species = SPECIES_CHANSEY;
#endif
#ifdef SPECIES_MIME_JR
else if (*species == SPECIES_MIME_JR && motherItem != ITEM_ODD_INCENSE && fatherItem != ITEM_ODD_INCENSE)
*species = SPECIES_MR_MIME;
#endif
#ifdef SPECIES_CHINGLING
else if (*species == SPECIES_CHINGLING && motherItem != ITEM_PURE_INCENSE && fatherItem != ITEM_PURE_INCENSE)
*species = SPECIES_CHIMECHO;
#endif
#ifdef SPECIES_BONSLY
else if (*species == SPECIES_BONSLY && motherItem != ITEM_ROCK_INCENSE && fatherItem != ITEM_ROCK_INCENSE)
*species = SPECIES_SUDOWOODO;
#endif
#ifdef SPECIES_BUDEW
else if (*species == SPECIES_BUDEW && motherItem != ITEM_ROSE_INCENSE && fatherItem != ITEM_ROSE_INCENSE)
*species = SPECIES_ROSELIA;
#endif
#ifdef SPECIES_MANTYKE
else if (*species == SPECIES_MANTYKE && motherItem != ITEM_WAVE_INCENSE && fatherItem != ITEM_WAVE_INCENSE)
*species = SPECIES_MANTINE;
#endif
}

static void GiveVoltTackleIfLightBall(struct Pokemon *mon, struct DayCare *daycare)
for (i = 0; i < ARRAY_COUNT(IncenseBabyTable); i++)
{
if (IncenseBabyTable[i]->babySpecies == *species && motherItem != IncenseBabyTable[i]->item && fatherItem != IncenseBabyTable[i]->item)
{
*species = IncenseBabyTable[i]->currSpecies;
break;
}
}
}

static const struct {
u16 offspring;
u16 item;
u16 move;
} BreedingSpecialMoveItemTable[][3] =
{
// Offspring, Item, Move
{ SPECIES_PICHU, ITEM_LIGHT_BALL, MOVE_VOLT_TACKLE },
};

static void GiveMoveIfItem(struct Pokemon *mon, struct DayCare *daycare)
{
u16 i, species = GetMonData(mon, MON_DATA_SPECIES);
u32 motherItem = GetBoxMonData(&daycare->mons[0].mon, MON_DATA_HELD_ITEM);
u32 fatherItem = GetBoxMonData(&daycare->mons[1].mon, MON_DATA_HELD_ITEM);

if (motherItem == ITEM_LIGHT_BALL || fatherItem == ITEM_LIGHT_BALL)
for (i = 0; i < ARRAY_COUNT(BreedingSpecialMoveItemTable); i++)
{
if (GiveMoveToMon(mon, MOVE_VOLT_TACKLE) == MON_HAS_MAX_MOVES)
DeleteFirstMoveAndGiveMoveToMon(mon, MOVE_VOLT_TACKLE);
if (BreedingSpecialMoveItemTable[i]->offspring == species
&& (motherItem == BreedingSpecialMoveItemTable[i]->item ||
fatherItem == BreedingSpecialMoveItemTable[i]->item))
{
if (GiveMoveToMon(mon, BreedingSpecialMoveItemTable[i]->move) == MON_HAS_MAX_MOVES)
DeleteFirstMoveAndGiveMoveToMon(mon, BreedingSpecialMoveItemTable[i]->move);
}
}
}

Expand Down Expand Up @@ -856,13 +867,14 @@ static void _GiveEggFromDaycare(struct DayCare *daycare)
bool8 isEgg;

species = DetermineEggSpeciesAndParentSlots(daycare, parentSlots);
#if P_INCENSE_BREEDING < GEN_9
AlterEggSpeciesWithIncenseItem(&species, daycare);
#endif
SetInitialEggData(&egg, species, daycare);
InheritIVs(&egg, daycare);
BuildEggMoveset(&egg, &daycare->mons[parentSlots[1]].mon, &daycare->mons[parentSlots[0]].mon);

if (species == SPECIES_PICHU)
GiveVoltTackleIfLightBall(&egg, daycare);
GiveMoveIfItem(&egg, daycare);

isEgg = TRUE;
SetMonData(&egg, MON_DATA_IS_EGG, &isEgg);
Expand Down

0 comments on commit 05e9bfe

Please sign in to comment.