CalculateEnemyPartyCount();
i = (Random() % 2);
firstmon = (Random() % monsCount);
if (i >= 0)
{
for (i = firstmon; i < monsCount; i++)
{
const struct TrainerMon *partyData;
if (FlagGet(FLAG_ENABLE_HARDCORE_TRAINER_PARTY))
partyData = gHardcoreTrainers[trainerNum].party.TrainerMon;
else
partyData = gTrainers[trainerNum].party.TrainerMon;
fixedIV = partyData[i].iv;
// Comment out the following line if you have changed .iv to go 0-31, instead of 0-255 as in vanilla.
fixedIV = fixedIV * MAX_PER_STAT_IVS / 255;
fixedIV = fixedIV + TRAINER_IV_MODIFIER;
gender = MON_MALE; // defaults to 0
if (FlagGet(FLAG_ENABLE_HARDCORE_TRAINER_PARTY))
{
if (gHardcoreTrainers[trainerNum].doubleBattle == TRUE)
personalityValue = 0x80;
else if (gHardcoreTrainers[trainerNum].encounterMusic_gender & F_TRAINER_FEMALE)
personalityValue = 0x78; // Use personality more likely to result in a female Pokémon
else
personalityValue = 0x88; // Use personality more likely to result in a male Pokémon
}
else
{
if (gTrainers[trainerNum].doubleBattle == TRUE)
personalityValue = 0x80;
else if (gTrainers[trainerNum].encounterMusic_gender & F_TRAINER_FEMALE)
personalityValue = 0x78; // Use personality more likely to result in a female Pokémon
else
personalityValue = 0x88; // Use personality more likely to result in a male Pokémon
}
if (FlagGet(FLAG_ENABLE_HARDCORE_TRAINER_PARTY))
{
for (j = 0; gHardcoreTrainers[trainerNum].trainerName[j] != EOS; j++)
nameHash += gHardcoreTrainers[trainerNum].trainerName[j];
}
else
{
for (j = 0; gTrainers[trainerNum].trainerName[j] != EOS; j++)
nameHash += gTrainers[trainerNum].trainerName[j];
}
if (FlagGet(FLAG_ENABLE_HARDCORE_TRAINER_PARTY))
{
if (gHardcoreTrainers[trainerNum].doubleBattle == TRUE)
personalityValue = 0x80;
else if (gHardcoreTrainers[trainerNum].encounterMusic_gender & 0x80)
{
personalityValue = 0x78;
gender = MON_MALE;
}
else
{
personalityValue = 0x88;
gender = MON_FEMALE;
}
}
else
{
if (gTrainers[trainerNum].doubleBattle == TRUE)
personalityValue = 0x80;
else if (gTrainers[trainerNum].encounterMusic_gender & 0x80)
{
personalityValue = 0x78;
gender = MON_MALE;
}
else
{
personalityValue = 0x88;
gender = MON_FEMALE;
}
}
if (partyData[i].gender == TRAINER_MON_MALE)
gender = MON_MALE;
else if (partyData[i].gender == TRAINER_MON_FEMALE)
gender = MON_FEMALE;
if (partyData[i].nature > 0)
{
CreateMonWithGenderNatureLetter(&party[i], partyData[i].species, GetScaledLevel(partyData[i].lvl), fixedIV, gender, partyData[i].nature, 0, partyData[i].shiny ? OT_ID_SHINY : OT_ID_RANDOM_NO_SHINY);
if (FlagGet(FLAG_ENABLE_TRAINER_EVOLUTION))
{
u16 targetSpecies = GetEvolutionTargetSpecies(&party[i], EVO_MODE_NORMAL, ITEM_NONE);
if ((targetSpecies != SPECIES_NONE))
{
u16 targetSpecies2;
u8 speciesName[POKEMON_NAME_LENGTH + 1];
u32 personality = GetMonData(&party[i], MON_DATA_PERSONALITY, 0);
u16 upperPersonality = personality >> 16;
u16 CurrentSpecies = GetMonData(&party[i], MON_DATA_SPECIES, 0);
u16 lvl = GetMonData(&party[i], MON_DATA_LEVEL, 0);
if ((targetSpecies == SPECIES_VILEPLUME) && (Random() % 100) <= 40)
targetSpecies = SPECIES_BELLOSSOM;
if ((targetSpecies == SPECIES_POLIWRATH) && (Random() % 100) <= 30)
targetSpecies = SPECIES_POLITOED;
if ((targetSpecies == SPECIES_SLOWBRO) && (Random() % 100) <= 30)
targetSpecies = SPECIES_SLOWKING;
if ((targetSpecies == SPECIES_HUNTAIL) && (Random() % 100) <= 50)
targetSpecies = SPECIES_GOREBYSS;
if ((targetSpecies == SPECIES_NINJASK) && (Random() % 100) <= 20)
targetSpecies = SPECIES_SHEDINJA;
if ((CurrentSpecies == SPECIES_WURMPLE) && lvl >= 7 && (upperPersonality % 10) <= 4)
targetSpecies = SPECIES_SILCOON;
if ((CurrentSpecies == SPECIES_WURMPLE) && lvl >= 7 && (upperPersonality % 10) > 4)
targetSpecies = SPECIES_CASCOON;
if ((CurrentSpecies == SPECIES_TYROGUE) && GetMonData(&party[i], MON_DATA_ATK, 0) < GetMonData(&party[i], MON_DATA_DEF, 0))
targetSpecies = SPECIES_HITMONCHAN;
if ((CurrentSpecies == SPECIES_TYROGUE) && GetMonData(&party[i], MON_DATA_ATK, 0) > GetMonData(&party[i], MON_DATA_DEF, 0))
targetSpecies = SPECIES_HITMONLEE;
if ((CurrentSpecies == SPECIES_TYROGUE) && GetMonData(&party[i], MON_DATA_ATK, 0) == GetMonData(&party[i], MON_DATA_DEF, 0))
targetSpecies = SPECIES_HITMONTOP;
if (CurrentSpecies == SPECIES_EEVEE && lvl >= 10)
{
u8 Eevo = (Random() % 5);
if (Eevo == 0)
targetSpecies = SPECIES_VAPOREON;
else if (Eevo == 1)
targetSpecies = SPECIES_JOLTEON;
else if (Eevo == 2)
targetSpecies = SPECIES_FLAREON;
else if (Eevo == 3)
targetSpecies = SPECIES_ESPEON;
else if (Eevo == 4)
targetSpecies = SPECIES_UMBREON;
}
SetMonData(&party[i], MON_DATA_SPECIES, &targetSpecies);
GetSpeciesName(speciesName, targetSpecies);
SetMonData(&party[i], MON_DATA_NICKNAME, speciesName);
targetSpecies2 = GetEvolutionTargetSpecies(&party[i], EVO_MODE_NORMAL, ITEM_NONE);
if ((targetSpecies2 != SPECIES_NONE))
{
if ((targetSpecies2 == SPECIES_VILEPLUME) && (Random() % 100) <= 33)
targetSpecies2 = SPECIES_BELLOSSOM;
if ((targetSpecies2 == SPECIES_POLIWRATH) && (Random() % 100) <= 33)
targetSpecies2 = SPECIES_POLITOED;
SetMonData(&party[i], MON_DATA_SPECIES, &targetSpecies2);
GetSpeciesName(speciesName, targetSpecies2);
SetMonData(&party[i], MON_DATA_NICKNAME, speciesName);
}
}
}
if (FlagGet(FLAG_ENABLE_MIRROR_MODE))
CopyMon(&gPlayerParty[i], &party[i], sizeof(struct Pokemon));
}
else
{
CreateMon(&party[i], partyData[i].species, GetScaledLevel(partyData[i].lvl), fixedIV, TRUE, personalityValue, partyData[i].shiny ? OT_ID_SHINY : OT_ID_RANDOM_NO_SHINY, 0);
if (FlagGet(FLAG_ENABLE_TRAINER_EVOLUTION))
{
u16 targetSpecies = GetEvolutionTargetSpecies(&party[i], EVO_MODE_NORMAL, ITEM_NONE);
if ((targetSpecies != SPECIES_NONE))
{
u32 personality = GetMonData(&party[i], MON_DATA_PERSONALITY, 0);
u16 upperPersonality = personality >> 16;
u16 CurrentSpecies = GetMonData(&party[i], MON_DATA_SPECIES, 0);
u16 lvl = GetMonData(&party[i], MON_DATA_LEVEL, 0);
u8 speciesName[POKEMON_NAME_LENGTH + 1];
u16 targetSpecies2;
if ((targetSpecies == SPECIES_VILEPLUME) && (Random() % 100) <= 40)
targetSpecies = SPECIES_BELLOSSOM;
if ((targetSpecies == SPECIES_POLIWRATH) && (Random() % 100) <= 30)
targetSpecies = SPECIES_POLITOED;
if ((targetSpecies == SPECIES_SLOWBRO) && (Random() % 100) <= 30)
targetSpecies = SPECIES_SLOWKING;
if ((targetSpecies == SPECIES_HUNTAIL) && (Random() % 100) <= 50)
targetSpecies = SPECIES_GOREBYSS;
if ((targetSpecies == SPECIES_NINJASK) && (Random() % 100) <= 20)
targetSpecies = SPECIES_SHEDINJA;
if ((CurrentSpecies == SPECIES_WURMPLE) && lvl >= 7 && (upperPersonality % 10) <= 4)
targetSpecies = SPECIES_SILCOON;
if ((CurrentSpecies == SPECIES_WURMPLE) && lvl >= 7 && (upperPersonality % 10) > 4)
targetSpecies = SPECIES_CASCOON;
if ((CurrentSpecies == SPECIES_TYROGUE) && GetMonData(&party[i], MON_DATA_ATK, 0) < GetMonData(&party[i], MON_DATA_DEF, 0))
targetSpecies = SPECIES_HITMONCHAN;
if ((CurrentSpecies == SPECIES_TYROGUE) && GetMonData(&party[i], MON_DATA_ATK, 0) > GetMonData(&party[i], MON_DATA_DEF, 0))
targetSpecies = SPECIES_HITMONLEE;
if ((CurrentSpecies == SPECIES_TYROGUE) && GetMonData(&party[i], MON_DATA_ATK, 0) == GetMonData(&party[i], MON_DATA_DEF, 0))
targetSpecies = SPECIES_HITMONTOP;
if (CurrentSpecies == SPECIES_EEVEE && lvl >= 10)
{
u8 Eevo = (Random() % 5);
if (Eevo == 0)
targetSpecies = SPECIES_VAPOREON;
else if (Eevo == 1)
targetSpecies = SPECIES_JOLTEON;
else if (Eevo == 2)
targetSpecies = SPECIES_FLAREON;
else if (Eevo == 3)
targetSpecies = SPECIES_ESPEON;
else if (Eevo == 4)
targetSpecies = SPECIES_UMBREON;
}
SetMonData(&party[i], MON_DATA_SPECIES, &targetSpecies);
GetSpeciesName(speciesName, targetSpecies);
SetMonData(&party[i], MON_DATA_NICKNAME, speciesName);
targetSpecies2 = GetEvolutionTargetSpecies(&party[i], EVO_MODE_NORMAL, ITEM_NONE);
if ((targetSpecies2 != SPECIES_NONE))
{
if ((targetSpecies2 == SPECIES_VILEPLUME) && (Random() % 100) <= 33)
targetSpecies2 = SPECIES_BELLOSSOM;
if ((targetSpecies2 == SPECIES_POLIWRATH) && (Random() % 100) <= 33)
targetSpecies2 = SPECIES_POLITOED;
SetMonData(&party[i], MON_DATA_SPECIES, &targetSpecies2);
GetSpeciesName(speciesName, targetSpecies2);
SetMonData(&party[i], MON_DATA_NICKNAME, speciesName);
}
}
}
if (FlagGet(FLAG_ENABLE_MIRROR_MODE))
CopyMon(&gPlayerParty[i], &party[i], sizeof(struct Pokemon));
}
if (partyData[i].friendship > 0)
{
if (partyData[i].friendship == TRAINER_MON_UNFRIENDLY)
friendship = 0;
else if (partyData[i].friendship == TRAINER_MON_FRIENDLY)
friendship = MAX_FRIENDSHIP;
SetMonData(&party[i], MON_DATA_FRIENDSHIP, &friendship);
if (FlagGet(FLAG_ENABLE_MIRROR_MODE))
SetMonData(&gPlayerParty[i], MON_DATA_FRIENDSHIP, &friendship);
}
if (partyData[i].nickname[0] != '\0')
{
SetMonData(&party[i], MON_DATA_NICKNAME, &partyData[i].nickname);
if (FlagGet(FLAG_ENABLE_MIRROR_MODE))
SetMonData(&gPlayerParty[i], MON_DATA_NICKNAME, &partyData[i].nickname);
}
if (partyData[i].ability > 0)
{
ability = partyData[i].ability;
if (partyData[i].ability == ABILITY_SLOT_1)
ability = 0;
SetMonData(&party[i], MON_DATA_ABILITY_NUM, &ability);
if (FlagGet(FLAG_ENABLE_MIRROR_MODE))
SetMonData(&gPlayerParty[i], MON_DATA_ABILITY_NUM, &ability);
}
for (j = 0; gTrainerBallTable[j].classId != 0xFF; j++)
{
if (gTrainerBallTable[j].classId == gTrainers[trainerNum].trainerClass)
SetMonData(&party[i], MON_DATA_POKEBALL, &gTrainerBallTable[j].Ball);
}
if (partyData[i].ball > 0)
{
SetMonData(&party[i], MON_DATA_POKEBALL, &partyData[i].ball);
if (FlagGet(FLAG_ENABLE_MIRROR_MODE))
SetMonData(&gPlayerParty[i], MON_DATA_POKEBALL, &partyData[i].ball);
}
if (partyData[i].heldItem > 0)
{
SetMonData(&party[i], MON_DATA_HELD_ITEM, &partyData[i].heldItem);
if (FlagGet(FLAG_ENABLE_MIRROR_MODE))
SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &partyData[i].heldItem);
}
if (partyData[i].moves[0] != '\0')
{
for (j = 0; j < MAX_MON_MOVES; j++)
{
SetMonData(&party[i], MON_DATA_MOVE1 + j, &partyData[i].moves[j]);
if (FlagGet(FLAG_ENABLE_MIRROR_MODE))
SetMonData(&gPlayerParty[i], MON_DATA_MOVE1 + j, &partyData[i].moves[j]);
SetMonData(&party[i], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp);
if (FlagGet(FLAG_ENABLE_MIRROR_MODE))
SetMonData(&gPlayerParty[i], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp);
}
}
if (partyData[i].iv > 0)
{
for (j = 0; j < NUM_STATS; j++)
{
SetMonData(&party[i], MON_DATA_HP_IV + j, &fixedIV);
if (FlagGet(FLAG_ENABLE_MIRROR_MODE))
SetMonData(&gPlayerParty[i], MON_DATA_HP_IV + j, &fixedIV);
}
}
else if (partyData[i].iv == WORST_IVS)
{
fixedIV = 0;
for (j = 0; j < NUM_STATS; j++)
{
SetMonData(&party[i], MON_DATA_HP_IV + j, &fixedIV);
if (FlagGet(FLAG_ENABLE_MIRROR_MODE))
SetMonData(&gPlayerParty[i], MON_DATA_HP_IV + j, &fixedIV);
}
}
else
{
for (j = 0; j < NUM_STATS; j++)
{
SetMonData(&party[i], MON_DATA_HP_IV + j, &partyData[i].ivs[j]);
if (FlagGet(FLAG_ENABLE_MIRROR_MODE))
SetMonData(&gPlayerParty[i], MON_DATA_HP_IV + j, &partyData[i].ivs[j]);
}
}
for (j = 0; j < NUM_STATS; j++)
{
SetMonData(&party[i], MON_DATA_HP_EV + j, &partyData[i].evs[j]);
if (FlagGet(FLAG_ENABLE_MIRROR_MODE))
SetMonData(&gPlayerParty[i], MON_DATA_HP_EV + j, &partyData[i].evs[j]);
}
if (FlagGet(FLAG_ENABLE_HARDCORE_TRAINER_PARTY))
StringCopy(trainerName, gHardcoreTrainers[trainerNum].trainerName);
else
StringCopy(trainerName, gTrainers[trainerNum].trainerName);
SetMonData(&party[i], MON_DATA_OT_NAME, trainerName);
CalculateMonStats(&party[i]);
if (FlagGet(FLAG_ENABLE_MIRROR_MODE))
CalculateMonStats(&gPlayerParty[i]);
CalculateEnemyPartyCount();
}
for (i = firstmon-1; i >= 0; i--)
{
const struct TrainerMon *partyData;
if (FlagGet(FLAG_ENABLE_HARDCORE_TRAINER_PARTY))
partyData = gHardcoreTrainers[trainerNum].party.TrainerMon;
else
partyData = gTrainers[trainerNum].party.TrainerMon;
fixedIV = partyData[i].iv;
// Comment out the following line if you have changed .iv to go 0-31, instead of 0-255 as in vanilla.
fixedIV = fixedIV * MAX_PER_STAT_IVS / 255;
fixedIV = fixedIV + TRAINER_IV_MODIFIER;
gender = MON_MALE; // defaults to 0
if (FlagGet(FLAG_ENABLE_HARDCORE_TRAINER_PARTY))
{
if (gHardcoreTrainers[trainerNum].doubleBattle == TRUE)
personalityValue = 0x80;
else if (gHardcoreTrainers[trainerNum].encounterMusic_gender & F_TRAINER_FEMALE)
personalityValue = 0x78; // Use personality more likely to result in a female Pokémon
else
personalityValue = 0x88; // Use personality more likely to result in a male Pokémon
}
else
{
if (gTrainers[trainerNum].doubleBattle == TRUE)
personalityValue = 0x80;
else if (gTrainers[trainerNum].encounterMusic_gender & F_TRAINER_FEMALE)
personalityValue = 0x78; // Use personality more likely to result in a female Pokémon
else
personalityValue = 0x88; // Use personality more likely to result in a male Pokémon
}
if (FlagGet(FLAG_ENABLE_HARDCORE_TRAINER_PARTY))
{
for (j = 0; gHardcoreTrainers[trainerNum].trainerName[j] != EOS; j++)
nameHash += gHardcoreTrainers[trainerNum].trainerName[j];
}
else
{
for (j = 0; gTrainers[trainerNum].trainerName[j] != EOS; j++)
nameHash += gTrainers[trainerNum].trainerName[j];
}
if (FlagGet(FLAG_ENABLE_HARDCORE_TRAINER_PARTY))
{
if (gHardcoreTrainers[trainerNum].doubleBattle == TRUE)
personalityValue = 0x80;
else if (gHardcoreTrainers[trainerNum].encounterMusic_gender & 0x80)
{
personalityValue = 0x78;
gender = MON_MALE;
}
else
{
personalityValue = 0x88;
gender = MON_FEMALE;
}
}
else
{
if (gTrainers[trainerNum].doubleBattle == TRUE)
personalityValue = 0x80;
else if (gTrainers[trainerNum].encounterMusic_gender & 0x80)
{
personalityValue = 0x78;
gender = MON_MALE;
}
else
{
personalityValue = 0x88;
gender = MON_FEMALE;
}
}
if (partyData[i].gender == TRAINER_MON_MALE)
gender = MON_MALE;
else if (partyData[i].gender == TRAINER_MON_FEMALE)
gender = MON_FEMALE;
if (partyData[i].nature > 0)
{
CreateMonWithGenderNatureLetter(&party[gEnemyPartyCount], partyData[i].species, GetScaledLevel(partyData[i].lvl), fixedIV, gender, partyData[i].nature, 0, partyData[i].shiny ? OT_ID_SHINY : OT_ID_RANDOM_NO_SHINY);
if (FlagGet(FLAG_ENABLE_TRAINER_EVOLUTION))
{
u16 targetSpecies = GetEvolutionTargetSpecies(&party[gEnemyPartyCount], EVO_MODE_NORMAL, ITEM_NONE);
if ((targetSpecies != SPECIES_NONE))
{
u16 targetSpecies2;
u8 speciesName[POKEMON_NAME_LENGTH + 1];
u32 personality = GetMonData(&party[gEnemyPartyCount], MON_DATA_PERSONALITY, 0);
u16 upperPersonality = personality >> 16;
u16 CurrentSpecies = GetMonData(&party[gEnemyPartyCount], MON_DATA_SPECIES, 0);
u16 lvl = GetMonData(&party[gEnemyPartyCount], MON_DATA_LEVEL, 0);
if ((targetSpecies == SPECIES_VILEPLUME) && (Random() % 100) <= 40)
targetSpecies = SPECIES_BELLOSSOM;
if ((targetSpecies == SPECIES_POLIWRATH) && (Random() % 100) <= 30)
targetSpecies = SPECIES_POLITOED;
if ((targetSpecies == SPECIES_SLOWBRO) && (Random() % 100) <= 30)
targetSpecies = SPECIES_SLOWKING;
if ((targetSpecies == SPECIES_HUNTAIL) && (Random() % 100) <= 50)
targetSpecies = SPECIES_GOREBYSS;
if ((targetSpecies == SPECIES_NINJASK) && (Random() % 100) <= 20)
targetSpecies = SPECIES_SHEDINJA;
if ((CurrentSpecies == SPECIES_WURMPLE) && lvl >= 7 && (upperPersonality % 10) <= 4)
targetSpecies = SPECIES_SILCOON;
if ((CurrentSpecies == SPECIES_WURMPLE) && lvl >= 7 && (upperPersonality % 10) > 4)
targetSpecies = SPECIES_CASCOON;
if ((CurrentSpecies == SPECIES_TYROGUE) && GetMonData(&party[gEnemyPartyCount], MON_DATA_ATK, 0) < GetMonData(&party[gEnemyPartyCount], MON_DATA_DEF, 0))
targetSpecies = SPECIES_HITMONCHAN;
if ((CurrentSpecies == SPECIES_TYROGUE) && GetMonData(&party[gEnemyPartyCount], MON_DATA_ATK, 0) > GetMonData(&party[gEnemyPartyCount], MON_DATA_DEF, 0))
targetSpecies = SPECIES_HITMONLEE;
if ((CurrentSpecies == SPECIES_TYROGUE) && GetMonData(&party[gEnemyPartyCount], MON_DATA_ATK, 0) == GetMonData(&party[gEnemyPartyCount], MON_DATA_DEF, 0))
targetSpecies = SPECIES_HITMONTOP;
if (CurrentSpecies == SPECIES_EEVEE && lvl >= 10)
{
u8 Eevo = (Random() % 5);
if (Eevo == 0)
targetSpecies = SPECIES_VAPOREON;
else if (Eevo == 1)
targetSpecies = SPECIES_JOLTEON;
else if (Eevo == 2)
targetSpecies = SPECIES_FLAREON;
else if (Eevo == 3)
targetSpecies = SPECIES_ESPEON;
else if (Eevo == 4)
targetSpecies = SPECIES_UMBREON;
}
SetMonData(&party[gEnemyPartyCount], MON_DATA_SPECIES, &targetSpecies);
GetSpeciesName(speciesName, targetSpecies);
SetMonData(&party[gEnemyPartyCount], MON_DATA_NICKNAME, speciesName);
targetSpecies2 = GetEvolutionTargetSpecies(&party[gEnemyPartyCount], EVO_MODE_NORMAL, ITEM_NONE);
if ((targetSpecies2 != SPECIES_NONE))
{
if ((targetSpecies2 == SPECIES_VILEPLUME) && (Random() % 100) <= 33)
targetSpecies2 = SPECIES_BELLOSSOM;
if ((targetSpecies2 == SPECIES_POLIWRATH) && (Random() % 100) <= 33)
targetSpecies2 = SPECIES_POLITOED;
SetMonData(&party[gEnemyPartyCount], MON_DATA_SPECIES, &targetSpecies2);
GetSpeciesName(speciesName, targetSpecies2);
SetMonData(&party[gEnemyPartyCount], MON_DATA_NICKNAME, speciesName);
}
}
}
if (FlagGet(FLAG_ENABLE_MIRROR_MODE))
CopyMon(&gPlayerParty[i], &party[gEnemyPartyCount], sizeof(struct Pokemon));
}
else
{
CreateMon(&party[gEnemyPartyCount], partyData[i].species, GetScaledLevel(partyData[i].lvl), fixedIV, TRUE, personalityValue, partyData[i].shiny ? OT_ID_SHINY : OT_ID_RANDOM_NO_SHINY, 0);
if (FlagGet(FLAG_ENABLE_TRAINER_EVOLUTION))
{
u16 targetSpecies = GetEvolutionTargetSpecies(&party[gEnemyPartyCount], EVO_MODE_NORMAL, ITEM_NONE);
if ((targetSpecies != SPECIES_NONE))
{
u32 personality = GetMonData(&party[gEnemyPartyCount], MON_DATA_PERSONALITY, 0);
u16 upperPersonality = personality >> 16;
u16 CurrentSpecies = GetMonData(&party[gEnemyPartyCount], MON_DATA_SPECIES, 0);
u16 lvl = GetMonData(&party[gEnemyPartyCount], MON_DATA_LEVEL, 0);
u8 speciesName[POKEMON_NAME_LENGTH + 1];
u16 targetSpecies2;
if ((targetSpecies == SPECIES_VILEPLUME) && (Random() % 100) <= 40)
targetSpecies = SPECIES_BELLOSSOM;
if ((targetSpecies == SPECIES_POLIWRATH) && (Random() % 100) <= 30)
targetSpecies = SPECIES_POLITOED;
if ((targetSpecies == SPECIES_SLOWBRO) && (Random() % 100) <= 30)
targetSpecies = SPECIES_SLOWKING;
if ((targetSpecies == SPECIES_HUNTAIL) && (Random() % 100) <= 50)
targetSpecies = SPECIES_GOREBYSS;
if ((targetSpecies == SPECIES_NINJASK) && (Random() % 100) <= 20)
targetSpecies = SPECIES_SHEDINJA;
if ((CurrentSpecies == SPECIES_WURMPLE) && lvl >= 7 && (upperPersonality % 10) <= 4)
targetSpecies = SPECIES_SILCOON;
if ((CurrentSpecies == SPECIES_WURMPLE) && lvl >= 7 && (upperPersonality % 10) > 4)
targetSpecies = SPECIES_CASCOON;
if ((CurrentSpecies == SPECIES_TYROGUE) && GetMonData(&party[gEnemyPartyCount], MON_DATA_ATK, 0) < GetMonData(&party[gEnemyPartyCount], MON_DATA_DEF, 0))
targetSpecies = SPECIES_HITMONCHAN;
if ((CurrentSpecies == SPECIES_TYROGUE) && GetMonData(&party[gEnemyPartyCount], MON_DATA_ATK, 0) > GetMonData(&party[gEnemyPartyCount], MON_DATA_DEF, 0))
targetSpecies = SPECIES_HITMONLEE;
if ((CurrentSpecies == SPECIES_TYROGUE) && GetMonData(&party[gEnemyPartyCount], MON_DATA_ATK, 0) == GetMonData(&party[gEnemyPartyCount], MON_DATA_DEF, 0))
targetSpecies = SPECIES_HITMONTOP;
if (CurrentSpecies == SPECIES_EEVEE && lvl >= 10)
{
u8 Eevo = (Random() % 5);
if (Eevo == 0)
targetSpecies = SPECIES_VAPOREON;
else if (Eevo == 1)
targetSpecies = SPECIES_JOLTEON;
else if (Eevo == 2)
targetSpecies = SPECIES_FLAREON;
else if (Eevo == 3)
targetSpecies = SPECIES_ESPEON;
else if (Eevo == 4)
targetSpecies = SPECIES_UMBREON;
}
SetMonData(&party[gEnemyPartyCount], MON_DATA_SPECIES, &targetSpecies);
GetSpeciesName(speciesName, targetSpecies);
SetMonData(&party[gEnemyPartyCount], MON_DATA_NICKNAME, speciesName);
targetSpecies2 = GetEvolutionTargetSpecies(&party[gEnemyPartyCount], EVO_MODE_NORMAL, ITEM_NONE);
if ((targetSpecies2 != SPECIES_NONE))
{
if ((targetSpecies2 == SPECIES_VILEPLUME) && (Random() % 100) <= 33)
targetSpecies2 = SPECIES_BELLOSSOM;
if ((targetSpecies2 == SPECIES_POLIWRATH) && (Random() % 100) <= 33)
targetSpecies2 = SPECIES_POLITOED;
SetMonData(&party[gEnemyPartyCount], MON_DATA_SPECIES, &targetSpecies2);
GetSpeciesName(speciesName, targetSpecies2);
SetMonData(&party[gEnemyPartyCount], MON_DATA_NICKNAME, speciesName);
}
}
}
if (FlagGet(FLAG_ENABLE_MIRROR_MODE))
CopyMon(&gPlayerParty[i], &party[gEnemyPartyCount], sizeof(struct Pokemon));
}
if (partyData[i].friendship > 0)
{
if (partyData[i].friendship == TRAINER_MON_UNFRIENDLY)
friendship = 0;
else if (partyData[i].friendship == TRAINER_MON_FRIENDLY)
friendship = MAX_FRIENDSHIP;
SetMonData(&party[gEnemyPartyCount], MON_DATA_FRIENDSHIP, &friendship);
if (FlagGet(FLAG_ENABLE_MIRROR_MODE))
SetMonData(&gPlayerParty[i], MON_DATA_FRIENDSHIP, &friendship);
}
if (partyData[i].nickname[0] != '\0')
{
SetMonData(&party[gEnemyPartyCount], MON_DATA_NICKNAME, &partyData[i].nickname);
if (FlagGet(FLAG_ENABLE_MIRROR_MODE))
SetMonData(&gPlayerParty[i], MON_DATA_NICKNAME, &partyData[i].nickname);
}
if (partyData[i].ability > 0)
{
ability = partyData[i].ability;
if (partyData[i].ability == ABILITY_SLOT_1)
ability = 0;
SetMonData(&party[gEnemyPartyCount], MON_DATA_ABILITY_NUM, &ability);
if (FlagGet(FLAG_ENABLE_MIRROR_MODE))
SetMonData(&gPlayerParty[i], MON_DATA_ABILITY_NUM, &ability);
}
for (j = 0; gTrainerBallTable[j].classId != 0xFF; j++)
{
if (gTrainerBallTable[j].classId == gTrainers[trainerNum].trainerClass)
SetMonData(&party[gEnemyPartyCount], MON_DATA_POKEBALL, &gTrainerBallTable[j].Ball);
}
if (partyData[i].ball > 0)
{
SetMonData(&party[gEnemyPartyCount], MON_DATA_POKEBALL, &partyData[i].ball);
if (FlagGet(FLAG_ENABLE_MIRROR_MODE))
SetMonData(&gPlayerParty[i], MON_DATA_POKEBALL, &partyData[i].ball);
}
if (partyData[i].heldItem > 0)
{
SetMonData(&party[gEnemyPartyCount], MON_DATA_HELD_ITEM, &partyData[i].heldItem);
if (FlagGet(FLAG_ENABLE_MIRROR_MODE))
SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &partyData[i].heldItem);
}
if (partyData[i].moves[0] != '\0')
{
for (j = 0; j < MAX_MON_MOVES; j++)
{
SetMonData(&party[gEnemyPartyCount], MON_DATA_MOVE1 + j, &partyData[i].moves[j]);
if (FlagGet(FLAG_ENABLE_MIRROR_MODE))
SetMonData(&gPlayerParty[i], MON_DATA_MOVE1 + j, &partyData[i].moves[j]);
SetMonData(&party[gEnemyPartyCount], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp);
if (FlagGet(FLAG_ENABLE_MIRROR_MODE))
SetMonData(&gPlayerParty[i], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp);
}
}
if (partyData[i].iv > 0)
{
for (j = 0; j < NUM_STATS; j++)
{
SetMonData(&party[gEnemyPartyCount], MON_DATA_HP_IV + j, &fixedIV);
if (FlagGet(FLAG_ENABLE_MIRROR_MODE))
SetMonData(&gPlayerParty[i], MON_DATA_HP_IV + j, &fixedIV);
}
}
else if (partyData[i].iv == WORST_IVS)
{
fixedIV = 0;
for (j = 0; j < NUM_STATS; j++)
{
SetMonData(&party[gEnemyPartyCount], MON_DATA_HP_IV + j, &fixedIV);
if (FlagGet(FLAG_ENABLE_MIRROR_MODE))
SetMonData(&gPlayerParty[i], MON_DATA_HP_IV + j, &fixedIV);
}
}
else
{
for (j = 0; j < NUM_STATS; j++)
{
SetMonData(&party[gEnemyPartyCount], MON_DATA_HP_IV + j, &partyData[i].ivs[j]);
if (FlagGet(FLAG_ENABLE_MIRROR_MODE))
SetMonData(&gPlayerParty[i], MON_DATA_HP_IV + j, &partyData[i].ivs[j]);
}
}
for (j = 0; j < NUM_STATS; j++)
{
SetMonData(&party[gEnemyPartyCount], MON_DATA_HP_EV + j, &partyData[i].evs[j]);
if (FlagGet(FLAG_ENABLE_MIRROR_MODE))
SetMonData(&gPlayerParty[i], MON_DATA_HP_EV + j, &partyData[i].evs[j]);
}
if (FlagGet(FLAG_ENABLE_HARDCORE_TRAINER_PARTY))
StringCopy(trainerName, gHardcoreTrainers[trainerNum].trainerName);
else
StringCopy(trainerName, gTrainers[trainerNum].trainerName);
SetMonData(&party[gEnemyPartyCount], MON_DATA_OT_NAME, trainerName);
CalculateMonStats(&party[gEnemyPartyCount]);
if (FlagGet(FLAG_ENABLE_MIRROR_MODE))
CalculateMonStats(&gPlayerParty[i]);
CalculateEnemyPartyCount();
}
}