add shiny chaining

This commit is contained in:
ghoulslash 2021-06-17 11:15:53 -06:00
parent 8010facac5
commit 608dd9ddc5
3 changed files with 19 additions and 7 deletions

View file

@ -1382,7 +1382,7 @@
#define FLAG_NURSE_UNION_ROOM_REMINDER (SYSTEM_FLAGS + 0x20)
#define FLAG_SYS_DEXNAV_SEARCH (SYSTEM_FLAGS + 0x21)
#define FLAG_UNUSED_0x882 (SYSTEM_FLAGS + 0x22) // Unused Flag
#define FLAG_SHINY_CREATION (SYSTEM_FLAGS + 0x22) // force creation of a shiny mon
#define FLAG_UNUSED_0x883 (SYSTEM_FLAGS + 0x23) // Unused Flag
#define FLAG_UNUSED_0x884 (SYSTEM_FLAGS + 0x24) // Unused Flag
#define FLAG_UNUSED_0x885 (SYSTEM_FLAGS + 0x25) // Unused Flag

View file

@ -1215,6 +1215,9 @@ static void CreateDexNavWildMon(u16 species, u8 potential, u8 level, u8 abilityN
u8 i;
u8 perfectIv = 31;
if (DexNavTryMakeShinyMon())
FlagSet(FLAG_SHINY_CREATION); // just easier this way
CreateWildMon(species, level); // shiny rate bonus handled in CreateBoxMon
//Pick potential unique ivs to set to 31
@ -1239,6 +1242,7 @@ static void CreateDexNavWildMon(u16 species, u8 potential, u8 level, u8 abilityN
SetMonMoveSlot(mon, moves[i], i);
CalculateMonStats(mon);
FlagClear(FLAG_SHINY_CREATION);
}
// gets a random level of the species based on map data.

View file

@ -2179,8 +2179,6 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV,
else
personality = Random32();
SetBoxMonData(boxMon, MON_DATA_PERSONALITY, &personality);
//Determine original trainer ID
if (otIdType == OT_ID_RANDOM_NO_SHINY) //Pokemon cannot be shiny
{
@ -2198,11 +2196,21 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV,
else //Player is the OT
{
value = gSaveBlock2Ptr->playerTrainerId[0]
| (gSaveBlock2Ptr->playerTrainerId[1] << 8)
| (gSaveBlock2Ptr->playerTrainerId[2] << 16)
| (gSaveBlock2Ptr->playerTrainerId[3] << 24);
| (gSaveBlock2Ptr->playerTrainerId[1] << 8)
| (gSaveBlock2Ptr->playerTrainerId[2] << 16)
| (gSaveBlock2Ptr->playerTrainerId[3] << 24);
if (FlagGet(FLAG_SHINY_CREATION))
{
u8 nature = personality % NUM_NATURES; // keep current nature
do {
personality = Random32();
personality = ((((Random() % SHINY_ODDS) ^ (HIHALF(value) ^ LOHALF(value))) ^ LOHALF(personality)) << 16) | LOHALF(personality);
} while (nature != GetNatureFromPersonality(personality));
}
}
SetBoxMonData(boxMon, MON_DATA_PERSONALITY, &personality);
SetBoxMonData(boxMon, MON_DATA_OT_ID, &value);
checksum = CalculateBoxMonChecksum(boxMon);