Make signature species return empty array when key does not exist

This commit is contained in:
Sirz Benjie 2025-04-25 15:26:56 -05:00
parent 0867716347
commit bbf79fd1e6
No known key found for this signature in database
GPG Key ID: 4A524B4D196C759E
2 changed files with 617 additions and 446 deletions

View File

@ -4,12 +4,19 @@ export type SignatureSpecies = {
[key in string]: (Species | Species[])[];
};
/*
/**
* The signature species for each Gym Leader, Elite Four member, and Champion.
* The key is the trainer type, and the value is an array of Species or Species arrays.
* This is in a separate const so it can be accessed from other places and not just the trainerConfigs
*
* @remarks
* The `Proxy` object allows us to define a handler that will intercept
* the property access and return an empty array if the property does not exist in the object.
*
* This means that accessing `signatureSpecies` will not throw an error if the property does not exist,
* but instead default to an empty array.
*/
export const signatureSpecies: SignatureSpecies = {
export const signatureSpecies: SignatureSpecies = new Proxy({
// Gym Leaders- Kanto
BROCK: [Species.ONIX, Species.GEODUDE, [Species.OMANYTE, Species.KABUTO], Species.AERODACTYL],
MISTY: [Species.STARYU, Species.PSYDUCK, Species.WOOPER, Species.LAPRAS],
@ -92,56 +99,8 @@ export const signatureSpecies: SignatureSpecies = {
RYME: [Species.TOXEL, Species.GREAVARD, Species.SHUPPET, Species.MIMIKYU], // Tera Ghost Toxel
TULIP: [Species.FLABEBE, Species.FLITTLE, Species.RALTS, Species.GIRAFARIG], // Tera Psychic Flabebe
GRUSHA: [Species.SWABLU, Species.CETODDLE, Species.SNOM, Species.CUBCHOO], // Tera Ice Swablu
// Elite Four- Kanto
LORELEI: [],
BRUNO: [],
AGATHA: [],
LANCE: [],
// Elite Four- Johto (Bruno included)
WILL: [],
KOGA: [],
KAREN: [],
// Elite Four- Hoenn
SIDNEY: [],
PHOEBE: [],
GLACIA: [],
DRAKE: [],
// Elite Four- Sinnoh
AARON: [],
BERTHA: [],
FLINT: [],
LUCIAN: [],
// Elite Four- Unova
SHAUNTAL: [],
MARSHAL: [],
GRIMSLEY: [],
CAITLIN: [],
// Elite Four- Kalos
MALVA: [],
SIEBOLD: [],
WIKSTROM: [],
DRASNA: [],
// Elite Four- Alola
HALA: [],
MOLAYNE: [],
OLIVIA: [],
ACEROLA: [],
KAHILI: [],
// Elite Four- Galar
MARNIE_ELITE: [],
NESSA_ELITE: [],
BEA_ELITE: [],
ALLISTER_ELITE: [],
RAIHAN_ELITE: [],
// Elite Four- Paldea
RIKA: [],
POPPY: [],
LARRY_ELITE: [],
HASSEL: [],
// Elite Four- BBL
CRISPIN: [],
AMARYS: [],
LACEY: [],
DRAYTON: [],
};
}, {
get(target, prop: string) {
return target[prop as keyof SignatureSpecies] ?? [];
}
});

View File

@ -707,11 +707,11 @@ export class TrainerConfig {
/**
* Initializes the trainer configuration for an Elite Four member.
* @param {Species | Species[]} signatureSpecies The signature species for the Elite Four member.
* @param isMale Whether the Elite Four Member is Male or Female (for localization of the title).
* @param specialtyType {PokemonType} The specialty type for the Elite Four member.
* @param teraSlot Optional, sets the party member in this slot to Terastallize.
* @returns {TrainerConfig} The updated TrainerConfig instance.
* @param signatureSpecies - The signature species for the Elite Four member.
* @param isMale - Whether the Elite Four Member is Male or Female (for localization of the title).
* @param specialtyType - The specialty type for the Elite Four member.
* @param teraSlot - Optional, sets the party member in this slot to Terastallize.
* @returns The updated TrainerConfig instance.
**/
initForEliteFour(
signatureSpecies: (Species | Species[])[],
@ -2857,7 +2857,10 @@ export const trainerConfigs: TrainerConfigs = {
.setBattleBgm("battle_kanto_gym")
.setMixedBattleBgm("battle_kanto_gym")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.DEWGONG]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SLOWBRO, Species.GALAR_SLOWBRO ], TrainerSlot.TRAINER, true, p => { // Tera Ice Slowbro/G-Slowbro
.setPartyMemberFunc(
2,
getRandomPartyMemberFunc([Species.SLOWBRO, Species.GALAR_SLOWBRO], TrainerSlot.TRAINER, true, p => {
// Tera Ice Slowbro/G-Slowbro
p.generateAndPopulateMoveset();
if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === Moves.ICE_BEAM)) {
// Check if Ice Beam is in the moveset, if not, replace the third move with Ice Beam.
@ -2867,16 +2870,22 @@ export const trainerConfigs: TrainerConfigs = {
)
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.JYNX]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.CLOYSTER, Species.ALOLA_SANDSLASH]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.LAPRAS ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.LAPRAS], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.BRUNO]: new TrainerConfig(++t)
.initForEliteFour(signatureSpecies["BRUNO"], true, PokemonType.FIGHTING, 2)
.setBattleBgm("battle_kanto_gym")
.setMixedBattleBgm("battle_kanto_gym")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.HITMONCHAN, Species.HITMONLEE, Species.HITMONTOP]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.STEELIX ], TrainerSlot.TRAINER, true, p => { // Tera Fighting Steelix
.setPartyMemberFunc(
2,
getRandomPartyMemberFunc([Species.STEELIX], TrainerSlot.TRAINER, true, p => {
// Tera Fighting Steelix
p.generateAndPopulateMoveset();
if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === Moves.BODY_PRESS)) {
// Check if Body Press is in the moveset, if not, replace the third move with Body Press.
@ -2886,16 +2895,22 @@ export const trainerConfigs: TrainerConfigs = {
)
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.POLIWRATH]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.ANNIHILAPE]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.MACHAMP ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.MACHAMP], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.AGATHA]: new TrainerConfig(++t)
.initForEliteFour(signatureSpecies["AGATHA"], false, PokemonType.GHOST, 2)
.setBattleBgm("battle_kanto_gym")
.setMixedBattleBgm("battle_kanto_gym")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.MISMAGIUS]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.WEEZING, Species.ARBOK ], TrainerSlot.TRAINER, true, p => { // Tera Ghost Arbok/Weezing
.setPartyMemberFunc(
2,
getRandomPartyMemberFunc([Species.WEEZING, Species.ARBOK], TrainerSlot.TRAINER, true, p => {
// Tera Ghost Arbok/Weezing
p.generateAndPopulateMoveset();
if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === Moves.TERA_BLAST)) {
// Check if Tera Blast is in the moveset, if not, replace the third move with Tera Blast.
@ -2905,17 +2920,23 @@ export const trainerConfigs: TrainerConfigs = {
)
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.ALOLA_MAROWAK]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.CURSOLA]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.GENGAR ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.GENGAR], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.LANCE]: new TrainerConfig(++t)
.setName("Lance")
.initForEliteFour(signatureSpecies["LANCE"], true, PokemonType.DRAGON, 2)
.setBattleBgm("battle_kanto_gym")
.setMixedBattleBgm("battle_kanto_gym")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.KINGDRA]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.GYARADOS, Species.AERODACTYL ], TrainerSlot.TRAINER, true, p => { // Tera Dragon Gyarados/Aerodactyl
.setPartyMemberFunc(
2,
getRandomPartyMemberFunc([Species.GYARADOS, Species.AERODACTYL], TrainerSlot.TRAINER, true, p => {
// Tera Dragon Gyarados/Aerodactyl
p.generateAndPopulateMoveset();
if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === Moves.TERA_BLAST)) {
// Check if Tera Blast is in the moveset, if not, replace the third move with Tera Blast.
@ -2925,10 +2946,13 @@ export const trainerConfigs: TrainerConfigs = {
)
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.ALOLA_EXEGGUTOR]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.SALAMENCE]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.DRAGONITE ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.DRAGONITE], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.WILL]: new TrainerConfig(++t)
.initForEliteFour(signatureSpecies["WILL"], true, PokemonType.PSYCHIC, 2)
.setBattleBgm("battle_johto_gym")
@ -2937,31 +2961,43 @@ export const trainerConfigs: TrainerConfigs = {
.setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.SLOWKING, Species.GALAR_SLOWKING])) // Tera Psychic Slowking/G-Slowking
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.EXEGGUTOR]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.FARIGIRAF, Species.WYRDEER]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.XATU ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.XATU], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.KOGA]: new TrainerConfig(++t)
.initForEliteFour(signatureSpecies["KOGA"], true, PokemonType.POISON, 2)
.setBattleBgm("battle_johto_gym")
.setMixedBattleBgm("battle_johto_gym")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENOMOTH ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
0,
getRandomPartyMemberFunc([Species.VENOMOTH], TrainerSlot.TRAINER, true, p => {
p.abilityIndex = 1; // Tinted Lens
p.generateAndPopulateMoveset();
}))
}),
)
.setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.MUK, Species.WEEZING])) // Tera Poison Muk/Weezing
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.TENTACRUEL]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.SNEASLER, Species.OVERQWIL]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.CROBAT ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.CROBAT], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.KAREN]: new TrainerConfig(++t)
.initForEliteFour(signatureSpecies["KAREN"], false, PokemonType.DARK, 2)
.setBattleBgm("battle_johto_gym")
.setMixedBattleBgm("battle_johto_gym")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.UMBREON]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.GENGAR ], TrainerSlot.TRAINER, true, p => { // Tera Dark Gengar
.setPartyMemberFunc(
2,
getRandomPartyMemberFunc([Species.GENGAR], TrainerSlot.TRAINER, true, p => {
// Tera Dark Gengar
p.generateAndPopulateMoveset();
if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === Moves.DARK_PULSE)) {
// Check if Dark Pulse is in the moveset, if not, replace the third move with Dark Pulse.
@ -2971,10 +3007,13 @@ export const trainerConfigs: TrainerConfigs = {
)
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.HONCHKROW]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.WEAVILE]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.HOUNDOOM ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.HOUNDOOM], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.SIDNEY]: new TrainerConfig(++t)
.initForEliteFour(signatureSpecies["SIDNEY"], true, PokemonType.DARK, 2)
.setMixedBattleBgm("battle_hoenn_elite")
@ -2982,44 +3021,61 @@ export const trainerConfigs: TrainerConfigs = {
.setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.OBSTAGOON])) // Tera Dark Obstagoon
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.SHIFTRY, Species.CACTURNE]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.SHARPEDO, Species.CRAWDAUNT]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.ABSOL ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.ABSOL], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.PHOEBE]: new TrainerConfig(++t)
.initForEliteFour(signatureSpecies["PHOEBE"], false, PokemonType.GHOST, 2)
.setMixedBattleBgm("battle_hoenn_elite")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.SABLEYE]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.BANETTE])) // Tera Ghost Banette
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.DRIFBLIM, Species.MISMAGIUS]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.ORICORIO, Species.ALOLA_MAROWAK ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
4,
getRandomPartyMemberFunc([Species.ORICORIO, Species.ALOLA_MAROWAK], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.formIndex = p.species.speciesId === Species.ORICORIO ? 3 : 0; // Oricorio-Sensu
}),
)
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.DUSKNOIR ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.DUSKNOIR], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.GLACIA]: new TrainerConfig(++t)
.initForEliteFour(signatureSpecies["GLACIA"], false, PokemonType.ICE, 2)
.setMixedBattleBgm("battle_hoenn_elite")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ABOMASNOW ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
0,
getRandomPartyMemberFunc([Species.ABOMASNOW], TrainerSlot.TRAINER, true, p => {
p.abilityIndex = 0; // Snow Warning
p.generateAndPopulateMoveset();
}))
}),
)
.setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.GLALIE])) // Tera Ice Glalie
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.FROSLASS]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.ALOLA_NINETALES]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.WALREIN ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.WALREIN], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.DRAKE]: new TrainerConfig(++t)
.initForEliteFour(signatureSpecies["DRAKE"], true, PokemonType.DRAGON, 2)
.setMixedBattleBgm("battle_hoenn_elite")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.ALTARIA]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.DHELMISE ], TrainerSlot.TRAINER, true, p => { // Tera Dragon Dhelmise
.setPartyMemberFunc(
2,
getRandomPartyMemberFunc([Species.DHELMISE], TrainerSlot.TRAINER, true, p => {
// Tera Dragon Dhelmise
p.generateAndPopulateMoveset();
if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === Moves.TERA_BLAST)) {
// Check if Tera Blast is in the moveset, if not, replace the third move with Tera Blast.
@ -3029,10 +3085,13 @@ export const trainerConfigs: TrainerConfigs = {
)
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.FLYGON]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.KINGDRA]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.SALAMENCE ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.SALAMENCE], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.AARON]: new TrainerConfig(++t)
.initForEliteFour(signatureSpecies["AARON"], true, PokemonType.BUG, 5)
.setBattleBgm("battle_sinnoh_gym")
@ -3041,7 +3100,10 @@ export const trainerConfigs: TrainerConfigs = {
.setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.HERACROSS]))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.VESPIQUEN]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.SCIZOR, Species.KLEAVOR]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.DRAPION ], TrainerSlot.TRAINER, true, p => { // Tera Bug Drapion
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.DRAPION], TrainerSlot.TRAINER, true, p => {
// Tera Bug Drapion
p.setBoss(true, 2);
p.abilityIndex = 1; // Sniper
p.generateAndPopulateMoveset();
@ -3049,29 +3111,40 @@ export const trainerConfigs: TrainerConfigs = {
// Check if X-Scissor is in the moveset, if not, replace the third move with X-Scissor.
p.moveset[2] = new PokemonMove(Moves.X_SCISSOR);
}
})),
}),
),
[TrainerType.BERTHA]: new TrainerConfig(++t)
.initForEliteFour(signatureSpecies["BERTHA"], false, PokemonType.GROUND, 2)
.setBattleBgm("battle_sinnoh_gym")
.setMixedBattleBgm("battle_sinnoh_gym")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.WHISCASH]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.HIPPOWDON ], TrainerSlot.TRAINER, true, p => { // Tera Ground Hippowdon
.setPartyMemberFunc(
2,
getRandomPartyMemberFunc([Species.HIPPOWDON], TrainerSlot.TRAINER, true, p => {
// Tera Ground Hippowdon
p.abilityIndex = 0; // Sand Stream
p.generateAndPopulateMoveset();
}))
}),
)
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.GLISCOR]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.MAMOSWINE, Species.URSALUNA]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.RHYPERIOR ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.RHYPERIOR], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.abilityIndex = 1; // Solid Rock
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.FLINT]: new TrainerConfig(++t)
.initForEliteFour(signatureSpecies["FLINT"], true, PokemonType.FIRE, 2)
.setBattleBgm("battle_sinnoh_gym")
.setMixedBattleBgm("battle_sinnoh_gym")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.RAPIDASH]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.STEELIX, Species.LOPUNNY ], TrainerSlot.TRAINER, true, p => { // Tera Fire Steelix/Lopunny
.setPartyMemberFunc(
2,
getRandomPartyMemberFunc([Species.STEELIX, Species.LOPUNNY], TrainerSlot.TRAINER, true, p => {
// Tera Fire Steelix/Lopunny
p.generateAndPopulateMoveset();
if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === Moves.TERA_BLAST)) {
// Check if Tera Blast is in the moveset, if not, replace the third move with Tera Blast.
@ -3081,10 +3154,13 @@ export const trainerConfigs: TrainerConfigs = {
)
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.INFERNAPE]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.ARCANINE, Species.HISUI_ARCANINE]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.MAGMORTAR ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.MAGMORTAR], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.LUCIAN]: new TrainerConfig(++t)
.initForEliteFour(signatureSpecies["LUCIAN"], true, PokemonType.PSYCHIC, 2)
.setBattleBgm("battle_sinnoh_gym")
@ -3093,11 +3169,14 @@ export const trainerConfigs: TrainerConfigs = {
.setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.FARIGIRAF])) // Tera Psychic Farigiraf
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.BRONZONG]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.MR_RIME, Species.HISUI_BRAVIARY]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.GALLADE ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.GALLADE], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.abilityIndex = 1; // Sharpness
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.SHAUNTAL]: new TrainerConfig(++t)
.initForEliteFour(signatureSpecies["SHAUNTAL"], false, PokemonType.GHOST, 2)
.setMixedBattleBgm("battle_unova_elite")
@ -3105,10 +3184,13 @@ export const trainerConfigs: TrainerConfigs = {
.setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.GOLURK])) // Tera Ghost Golurk
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.JELLICENT]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.BASCULEGION, Species.HISUI_ZOROARK]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.CHANDELURE ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.CHANDELURE], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.MARSHAL]: new TrainerConfig(++t)
.initForEliteFour(signatureSpecies["MARSHAL"], true, PokemonType.FIGHTING, 2)
.setMixedBattleBgm("battle_unova_elite")
@ -3116,10 +3198,13 @@ export const trainerConfigs: TrainerConfigs = {
.setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.MIENSHAO])) // Tera Fighting Mienshao
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.EMBOAR]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.HISUI_LILLIGANT]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.CONKELDURR ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.CONKELDURR], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.GRIMSLEY]: new TrainerConfig(++t)
.initForEliteFour(signatureSpecies["GRIMSLEY"], true, PokemonType.DARK, 2)
.setMixedBattleBgm("battle_unova_elite")
@ -3127,44 +3212,65 @@ export const trainerConfigs: TrainerConfigs = {
.setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.KROOKODILE])) // Tera Dark Krookodile
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.SCRAFTY]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.HISUI_SAMUROTT]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.KINGAMBIT ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.KINGAMBIT], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.CAITLIN]: new TrainerConfig(++t)
.initForEliteFour(signatureSpecies["CAITLIN"], false, PokemonType.PSYCHIC, 2)
.setMixedBattleBgm("battle_unova_elite")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.MUSHARNA]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.REUNICLUS])) // Tera Psychic Reuniclus
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GALLADE ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
3,
getRandomPartyMemberFunc([Species.GALLADE], TrainerSlot.TRAINER, true, p => {
p.abilityIndex = 1; // Sharpness
p.generateAndPopulateMoveset();
}))
}),
)
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.SIGILYPH, Species.HISUI_BRAVIARY]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.GOTHITELLE ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.GOTHITELLE], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.MALVA]: new TrainerConfig(++t)
.initForEliteFour(signatureSpecies["MALVA"], false, PokemonType.FIRE, 2)
.setMixedBattleBgm("battle_kalos_elite")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.PYROAR ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
0,
getRandomPartyMemberFunc([Species.PYROAR], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.gender = Gender.FEMALE;
}))
}),
)
.setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.HOUNDOOM])) // Tera Fire Houndoom
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.TORKOAL ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
3,
getRandomPartyMemberFunc([Species.TORKOAL], TrainerSlot.TRAINER, true, p => {
p.abilityIndex = 1; // Drought
p.generateAndPopulateMoveset();
}))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.SCOVILLAIN ], TrainerSlot.TRAINER, true, p => {
}),
)
.setPartyMemberFunc(
4,
getRandomPartyMemberFunc([Species.SCOVILLAIN], TrainerSlot.TRAINER, true, p => {
p.abilityIndex = 0; // Chlorophyll
p.generateAndPopulateMoveset();
}))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.TALONFLAME ], TrainerSlot.TRAINER, true, p => {
}),
)
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.TALONFLAME], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.SIEBOLD]: new TrainerConfig(++t)
.initForEliteFour(signatureSpecies["SIEBOLD"], true, PokemonType.WATER, 2)
.setMixedBattleBgm("battle_kalos_elite")
@ -3172,16 +3278,22 @@ export const trainerConfigs: TrainerConfigs = {
.setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.GYARADOS])) // Tera Water Gyarados
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.STARMIE]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.DONDOZO]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.BARBARACLE ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.BARBARACLE], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.abilityIndex = 1; // Tough Claws
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.WIKSTROM]: new TrainerConfig(++t)
.initForEliteFour(signatureSpecies["WIKSTROM"], true, PokemonType.STEEL, 2)
.setMixedBattleBgm("battle_kalos_elite")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.KLEFKI]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.CERULEDGE ], TrainerSlot.TRAINER, true, p => { // Tera Steel Ceruledge
.setPartyMemberFunc(
2,
getRandomPartyMemberFunc([Species.CERULEDGE], TrainerSlot.TRAINER, true, p => {
// Tera Steel Ceruledge
p.generateAndPopulateMoveset();
if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === Moves.IRON_HEAD)) {
// Check if Iron Head is in the moveset, if not, replace the third move with Iron Head.
@ -3191,10 +3303,13 @@ export const trainerConfigs: TrainerConfigs = {
)
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.SCIZOR]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.CORVIKNIGHT]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.AEGISLASH ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.AEGISLASH], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.DRASNA]: new TrainerConfig(++t)
.initForEliteFour(signatureSpecies["DRASNA"], false, PokemonType.DRAGON, 2)
.setMixedBattleBgm("battle_kalos_elite")
@ -3202,15 +3317,21 @@ export const trainerConfigs: TrainerConfigs = {
.setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.GARCHOMP])) // Tera Dragon Garchomp
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.ALTARIA]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.DRUDDIGON]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.NOIVERN ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.NOIVERN], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.HALA]: new TrainerConfig(++t)
.initForEliteFour(signatureSpecies["HALA"], true, PokemonType.FIGHTING, 2)
.setMixedBattleBgm("battle_alola_elite")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.HARIYAMA]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.INCINEROAR ], TrainerSlot.TRAINER, true, p => { // Tera Fighting Incineroar
.setPartyMemberFunc(
2,
getRandomPartyMemberFunc([Species.INCINEROAR], TrainerSlot.TRAINER, true, p => {
// Tera Fighting Incineroar
p.generateAndPopulateMoveset();
if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === Moves.CROSS_CHOP)) {
// Check if Cross Chop is in the moveset, if not, replace the third move with Cross Chop.
@ -3220,10 +3341,13 @@ export const trainerConfigs: TrainerConfigs = {
)
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.BEWEAR]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.POLIWRATH, Species.ANNIHILAPE]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.CRABOMINABLE ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.CRABOMINABLE], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.MOLAYNE]: new TrainerConfig(++t)
.initForEliteFour(signatureSpecies["MOLAYNE"], true, PokemonType.STEEL, 2)
.setMixedBattleBgm("battle_alola_elite")
@ -3231,25 +3355,34 @@ export const trainerConfigs: TrainerConfigs = {
.setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.ALOLA_SANDSLASH])) // Tera Steel A-Sandslash
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.MAGNEZONE]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.METAGROSS, Species.KINGAMBIT]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.ALOLA_DUGTRIO ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.ALOLA_DUGTRIO], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.OLIVIA]: new TrainerConfig(++t)
.initForEliteFour(signatureSpecies["OLIVIA"], false, PokemonType.ROCK, 2)
.setMixedBattleBgm("battle_alola_elite")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.GIGALITH ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
0,
getRandomPartyMemberFunc([Species.GIGALITH], TrainerSlot.TRAINER, true, p => {
p.abilityIndex = 1; // Sand Stream
p.generateAndPopulateMoveset();
}))
}),
)
.setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.PROBOPASS])) // Tera Rock Probopass
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.ALOLA_GOLEM]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.CARBINK, Species.RELICANTH]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.LYCANROC ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.LYCANROC], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.formIndex = 1;
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.ACEROLA]: new TrainerConfig(++t)
.initForEliteFour(signatureSpecies["ACEROLA"], false, PokemonType.GHOST, 2)
.setMixedBattleBgm("battle_alola_elite")
@ -3257,15 +3390,21 @@ export const trainerConfigs: TrainerConfigs = {
.setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.MIMIKYU])) // Tera Ghost Mimikyu
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.DHELMISE]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.FROSLASS]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.PALOSSAND ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.PALOSSAND], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.KAHILI]: new TrainerConfig(++t)
.initForEliteFour(signatureSpecies["KAHILI"], false, PokemonType.FLYING)
.setMixedBattleBgm("battle_alola_elite")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.HAWLUCHA]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.DECIDUEYE ], TrainerSlot.TRAINER, true, p => { // Tera Flying Decidueye
.setPartyMemberFunc(
2,
getRandomPartyMemberFunc([Species.DECIDUEYE], TrainerSlot.TRAINER, true, p => {
// Tera Flying Decidueye
p.generateAndPopulateMoveset();
if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === Moves.BRAVE_BIRD)) {
// Check if Brave Bird is in the moveset, if not, replace the third move with Brave Bird.
@ -3275,16 +3414,22 @@ export const trainerConfigs: TrainerConfigs = {
)
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.BRAVIARY, Species.MANDIBUZZ]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.ORICORIO]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.TOUCANNON ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.TOUCANNON], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.MARNIE_ELITE]: new TrainerConfig(++t)
.setName("Marnie")
.initForEliteFour(signatureSpecies["MARNIE_ELITE"], false, PokemonType.DARK, 2)
.setMixedBattleBgm("battle_galar_elite")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.LIEPARD]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.TOXICROAK ], TrainerSlot.TRAINER, true, p => { // Tera Dark Toxicroak
.setPartyMemberFunc(
2,
getRandomPartyMemberFunc([Species.TOXICROAK], TrainerSlot.TRAINER, true, p => {
// Tera Dark Toxicroak
p.generateAndPopulateMoveset();
if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === Moves.SUCKER_PUNCH)) {
// Check if Sucker Punch is in the moveset, if not, replace the third move with Sucker Punch.
@ -3294,16 +3439,22 @@ export const trainerConfigs: TrainerConfigs = {
)
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.SCRAFTY, Species.PANGORO]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.MORPEKO]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.GRIMMSNARL ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.GRIMMSNARL], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.NESSA_ELITE]: new TrainerConfig(++t)
.setName("Nessa")
.initForEliteFour(signatureSpecies["NESSA_ELITE"], false, PokemonType.WATER, 2)
.setMixedBattleBgm("battle_galar_elite")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.GOLISOPOD]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.EISCUE ], TrainerSlot.TRAINER, true, p => { // Tera Water Eiscue
.setPartyMemberFunc(
2,
getRandomPartyMemberFunc([Species.EISCUE], TrainerSlot.TRAINER, true, p => {
// Tera Water Eiscue
p.generateAndPopulateMoveset();
if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === Moves.LIQUIDATION)) {
// Check if Liquidation is in the moveset, if not, replace the third move with Liquidation.
@ -3311,15 +3462,21 @@ export const trainerConfigs: TrainerConfigs = {
}
}),
)
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.PELIPPER ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
3,
getRandomPartyMemberFunc([Species.PELIPPER], TrainerSlot.TRAINER, true, p => {
p.abilityIndex = 1; // Drizzle
p.generateAndPopulateMoveset();
}))
}),
)
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.TOXAPEX]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.DREDNAW ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.DREDNAW], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.BEA_ELITE]: new TrainerConfig(++t)
.setName("Bea")
.initForEliteFour(signatureSpecies["BEA_ELITE"], false, PokemonType.FIGHTING, 2)
@ -3328,10 +3485,13 @@ export const trainerConfigs: TrainerConfigs = {
.setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.SIRFETCHD])) // Tera Fighting Sirfetch'd
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.GRAPPLOCT, Species.FALINKS]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.HITMONTOP]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.MACHAMP ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.MACHAMP], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.ALLISTER_ELITE]: new TrainerConfig(++t)
.setName("Allister")
.initForEliteFour(signatureSpecies["ALLISTER_ELITE"], true, PokemonType.GHOST, 2)
@ -3340,16 +3500,22 @@ export const trainerConfigs: TrainerConfigs = {
.setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.RUNERIGUS])) // Tera Ghost Runerigus
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.POLTEAGEIST, Species.SINISTCHA]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.CURSOLA]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.GENGAR ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.GENGAR], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.RAIHAN_ELITE]: new TrainerConfig(++t)
.setName("Raihan")
.initForEliteFour(signatureSpecies["RAIHAN_ELITE"], true, PokemonType.DRAGON, 2)
.setMixedBattleBgm("battle_galar_elite")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.FLYGON]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.TORKOAL ], TrainerSlot.TRAINER, true, p => { // Tera Dragon Torkoal
.setPartyMemberFunc(
2,
getRandomPartyMemberFunc([Species.TORKOAL], TrainerSlot.TRAINER, true, p => {
// Tera Dragon Torkoal
p.abilityIndex = 1; // Drought
p.generateAndPopulateMoveset();
if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === Moves.TERA_BLAST)) {
@ -3360,10 +3526,13 @@ export const trainerConfigs: TrainerConfigs = {
)
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.GOODRA]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.TURTONATOR]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.ARCHALUDON ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.ARCHALUDON], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.RIKA]: new TrainerConfig(++t)
.initForEliteFour(signatureSpecies["RIKA"], false, PokemonType.GROUND, 5)
.setMixedBattleBgm("battle_paldea_elite")
@ -3371,10 +3540,14 @@ export const trainerConfigs: TrainerConfigs = {
.setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.DONPHAN]))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.TORTERRA, Species.TOEDSCRUEL]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.CAMERUPT]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.CLODSIRE ], TrainerSlot.TRAINER, true, p => { // Tera Ground Clodsire
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.CLODSIRE], TrainerSlot.TRAINER, true, p => {
// Tera Ground Clodsire
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.POPPY]: new TrainerConfig(++t)
.initForEliteFour(signatureSpecies["POPPY"], false, PokemonType.STEEL, 5)
.setMixedBattleBgm("battle_paldea_elite")
@ -3382,10 +3555,14 @@ export const trainerConfigs: TrainerConfigs = {
.setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.MAGNEZONE]))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.CORVIKNIGHT, Species.BRONZONG]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.STEELIX]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.TINKATON ], TrainerSlot.TRAINER, true, p => { // Tera Steel Tinkaton
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.TINKATON], TrainerSlot.TRAINER, true, p => {
// Tera Steel Tinkaton
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.LARRY_ELITE]: new TrainerConfig(++t)
.setName("Larry")
.initForEliteFour(signatureSpecies["LARRY_ELITE"], true, PokemonType.FLYING, 5)
@ -3394,10 +3571,14 @@ export const trainerConfigs: TrainerConfigs = {
.setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.BOMBIRDIER]))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.TROPIUS]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.STARAPTOR]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.FLAMIGO ], TrainerSlot.TRAINER, true, p => { // Tera Flying Flamigo
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.FLAMIGO], TrainerSlot.TRAINER, true, p => {
// Tera Flying Flamigo
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.HASSEL]: new TrainerConfig(++t)
.initForEliteFour(signatureSpecies["HASSEL"], true, PokemonType.DRAGON, 5)
.setMixedBattleBgm("battle_paldea_elite")
@ -3405,18 +3586,28 @@ export const trainerConfigs: TrainerConfigs = {
.setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.DRAGALGE]))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.FLAPPLE, Species.APPLETUN, Species.HYDRAPPLE]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.HAXORUS]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.BAXCALIBUR ], TrainerSlot.TRAINER, true, p => { // Tera Dragon Baxcalibur
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.BAXCALIBUR], TrainerSlot.TRAINER, true, p => {
// Tera Dragon Baxcalibur
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.CRISPIN]: new TrainerConfig(++t)
.initForEliteFour(signatureSpecies["CRISPIN"], true, PokemonType.FIRE, 2)
.setMixedBattleBgm("battle_bb_elite")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ROTOM ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
0,
getRandomPartyMemberFunc([Species.ROTOM], TrainerSlot.TRAINER, true, p => {
p.formIndex = 1; // Heat Rotom
p.generateAndPopulateMoveset();
}))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.EXEGGUTOR ], TrainerSlot.TRAINER, true, p => { // Tera Fire Exeggutor
}),
)
.setPartyMemberFunc(
2,
getRandomPartyMemberFunc([Species.EXEGGUTOR], TrainerSlot.TRAINER, true, p => {
// Tera Fire Exeggutor
p.generateAndPopulateMoveset();
if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === Moves.TERA_BLAST)) {
// Check if Tera Blast is in the moveset, if not, replace the third move with Tera Blast.
@ -3424,7 +3615,9 @@ export const trainerConfigs: TrainerConfigs = {
}
}),
)
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.TALONFLAME ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
3,
getRandomPartyMemberFunc([Species.TALONFLAME], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === Moves.SUNNY_DAY)) {
// Check if Sunny Day is in the moveset, if not, replace the third move with Sunny Day.
@ -3433,15 +3626,21 @@ export const trainerConfigs: TrainerConfigs = {
}),
)
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.MAGMORTAR]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.BLAZIKEN ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.BLAZIKEN], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.AMARYS]: new TrainerConfig(++t)
.initForEliteFour(signatureSpecies["AMARYS"], false, PokemonType.STEEL, 2)
.setMixedBattleBgm("battle_bb_elite")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.SKARMORY]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.REUNICLUS ], TrainerSlot.TRAINER, true, p => { // Tera Steel Reuniclus
.setPartyMemberFunc(
2,
getRandomPartyMemberFunc([Species.REUNICLUS], TrainerSlot.TRAINER, true, p => {
// Tera Steel Reuniclus
p.generateAndPopulateMoveset();
if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === Moves.FLASH_CANNON)) {
// Check if Flash Cannon is in the moveset, if not, replace the third move with Flash Cannon.
@ -3451,10 +3650,13 @@ export const trainerConfigs: TrainerConfigs = {
)
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.EMPOLEON]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.SCIZOR]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.METAGROSS ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.METAGROSS], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.LACEY]: new TrainerConfig(++t)
.initForEliteFour(signatureSpecies["LACEY"], false, PokemonType.FAIRY, 5)
.setMixedBattleBgm("battle_bb_elite")
@ -3462,19 +3664,26 @@ export const trainerConfigs: TrainerConfigs = {
.setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.PRIMARINA]))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.GRANBULL]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.ALCREMIE]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.EXCADRILL ], TrainerSlot.TRAINER, true, p => { // Tera Fairy Excadrill
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.EXCADRILL], TrainerSlot.TRAINER, true, p => {
// Tera Fairy Excadrill
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === Moves.TERA_BLAST)) {
// Check if Tera Blast is in the moveset, if not, replace the third move with Tera Blast.
p.moveset[2] = new PokemonMove(Moves.TERA_BLAST);
}
})),
}),
),
[TrainerType.DRAYTON]: new TrainerConfig(++t)
.initForEliteFour(signatureSpecies["DRAYTON"], true, PokemonType.DRAGON, 2)
.setMixedBattleBgm("battle_bb_elite")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.DRAGONITE]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SCEPTILE ], TrainerSlot.TRAINER, true, p => { // Tera Dragon Sceptile
.setPartyMemberFunc(
2,
getRandomPartyMemberFunc([Species.SCEPTILE], TrainerSlot.TRAINER, true, p => {
// Tera Dragon Sceptile
p.generateAndPopulateMoveset();
if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === Moves.DUAL_CHOP)) {
// Check if Dual Chop is in the moveset, if not, replace the third move with Dual Chop.
@ -3484,10 +3693,13 @@ export const trainerConfigs: TrainerConfigs = {
)
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.HAXORUS]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.KINGDRA, Species.DRACOVISH]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.ARCHALUDON ], TrainerSlot.TRAINER, true, p => {
.setPartyMemberFunc(
5,
getRandomPartyMemberFunc([Species.ARCHALUDON], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
})),
}),
),
[TrainerType.BLUE]: new TrainerConfig((t = TrainerType.BLUE))
.initForChampion(true)