This commit is contained in:
Blitzy 2025-08-03 22:17:01 -05:00 committed by GitHub
commit c28268d001
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 130 additions and 188 deletions

View File

@ -30,7 +30,7 @@ export const signatureSpecies: SignatureSpecies = new Proxy({
FALKNER: [SpeciesId.PIDGEY, SpeciesId.HOOTHOOT, SpeciesId.NATU, SpeciesId.MURKROW], FALKNER: [SpeciesId.PIDGEY, SpeciesId.HOOTHOOT, SpeciesId.NATU, SpeciesId.MURKROW],
BUGSY: [SpeciesId.SCYTHER, SpeciesId.SHUCKLE, SpeciesId.YANMA, [SpeciesId.PINSIR, SpeciesId.HERACROSS]], BUGSY: [SpeciesId.SCYTHER, SpeciesId.SHUCKLE, SpeciesId.YANMA, [SpeciesId.PINSIR, SpeciesId.HERACROSS]],
WHITNEY: [SpeciesId.MILTANK, SpeciesId.AIPOM, SpeciesId.IGGLYBUFF, [SpeciesId.GIRAFARIG, SpeciesId.STANTLER]], WHITNEY: [SpeciesId.MILTANK, SpeciesId.AIPOM, SpeciesId.IGGLYBUFF, [SpeciesId.GIRAFARIG, SpeciesId.STANTLER]],
MORTY: [SpeciesId.GASTLY, SpeciesId.MISDREAVUS, SpeciesId.DUSKULL, SpeciesId.SABLEYE], MORTY: [SpeciesId.GASTLY, SpeciesId.MISDREAVUS, SpeciesId.DUSKULL, SpeciesId.HISUI_TYPHLOSION],
CHUCK: [SpeciesId.POLIWRATH, SpeciesId.MANKEY, SpeciesId.TYROGUE, SpeciesId.MACHOP], CHUCK: [SpeciesId.POLIWRATH, SpeciesId.MANKEY, SpeciesId.TYROGUE, SpeciesId.MACHOP],
JASMINE: [SpeciesId.STEELIX, SpeciesId.MAGNEMITE, SpeciesId.PINECO, SpeciesId.SKARMORY], JASMINE: [SpeciesId.STEELIX, SpeciesId.MAGNEMITE, SpeciesId.PINECO, SpeciesId.SKARMORY],
PRYCE: [SpeciesId.SWINUB, SpeciesId.SEEL, SpeciesId.SHELLDER, SpeciesId.SNEASEL], PRYCE: [SpeciesId.SWINUB, SpeciesId.SEEL, SpeciesId.SHELLDER, SpeciesId.SNEASEL],

View File

@ -3791,27 +3791,16 @@ export const trainerConfigs: TrainerConfigs = {
.setDoubleTrainerType(TrainerType.RED) .setDoubleTrainerType(TrainerType.RED)
.setDoubleTitle("champion_double") .setDoubleTitle("champion_double")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.ALAKAZAM])) .setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.ALAKAZAM]))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.MACHAMP])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.ARCANINE, SpeciesId.EXEGGUTOR, SpeciesId.GYARADOS]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.RHYPERIOR, SpeciesId.ELECTIVIRE]))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.MACHAMP]))
.setPartyMemberFunc( .setPartyMemberFunc(
2, 4,
getRandomPartyMemberFunc([SpeciesId.HO_OH], TrainerSlot.TRAINER, true, p => { getRandomPartyMemberFunc([SpeciesId.HO_OH], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.pokeball = PokeballType.MASTER_BALL; p.pokeball = PokeballType.MASTER_BALL;
}), }),
) )
.setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.RHYPERIOR, SpeciesId.ELECTIVIRE]))
.setPartyMemberFunc(
4,
getRandomPartyMemberFunc(
[SpeciesId.ARCANINE, SpeciesId.EXEGGUTOR, SpeciesId.GYARADOS],
TrainerSlot.TRAINER,
true,
p => {
p.generateAndPopulateMoveset();
p.setBoss(true, 2);
},
),
)
.setPartyMemberFunc( .setPartyMemberFunc(
5, 5,
getRandomPartyMemberFunc([SpeciesId.PIDGEOT], TrainerSlot.TRAINER, true, p => { getRandomPartyMemberFunc([SpeciesId.PIDGEOT], TrainerSlot.TRAINER, true, p => {
@ -3819,9 +3808,10 @@ export const trainerConfigs: TrainerConfigs = {
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.generateName(); p.generateName();
p.gender = Gender.MALE; p.gender = Gender.MALE;
p.setBoss(true, 2);
}), }),
) )
.setInstantTera(3), // Tera Ground or Rock Rhyperior / Electric Electivire / Fire Magmortar .setInstantTera(3), // Tera Ground or Rock Rhyperior / Electric Electivire
[TrainerType.RED]: new TrainerConfig(++t) [TrainerType.RED]: new TrainerConfig(++t)
.initForChampion(true) .initForChampion(true)
.setBattleBgm("battle_johto_champion") .setBattleBgm("battle_johto_champion")
@ -3838,22 +3828,16 @@ export const trainerConfigs: TrainerConfigs = {
p.gender = Gender.MALE; p.gender = Gender.MALE;
}), }),
) )
.setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.ESPEON, SpeciesId.UMBREON, SpeciesId.SYLVEON])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.MEGANIUM, SpeciesId.TYPHLOSION, SpeciesId.FERALIGATR]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.ESPEON, SpeciesId.UMBREON, SpeciesId.SYLVEON]))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.SNORLAX]))
.setPartyMemberFunc( .setPartyMemberFunc(
2, 4,
getRandomPartyMemberFunc([SpeciesId.LUGIA], TrainerSlot.TRAINER, true, p => { getRandomPartyMemberFunc([SpeciesId.LUGIA], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.pokeball = PokeballType.MASTER_BALL; p.pokeball = PokeballType.MASTER_BALL;
}), }),
) )
.setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.MEGANIUM, SpeciesId.TYPHLOSION, SpeciesId.FERALIGATR]))
.setPartyMemberFunc(
4,
getRandomPartyMemberFunc([SpeciesId.SNORLAX], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.setBoss(true, 2);
}),
)
.setPartyMemberFunc( .setPartyMemberFunc(
5, 5,
getRandomPartyMemberFunc( getRandomPartyMemberFunc(
@ -3865,48 +3849,38 @@ export const trainerConfigs: TrainerConfigs = {
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.generateName(); p.generateName();
p.gender = Gender.MALE; p.gender = Gender.MALE;
p.setBoss(true, 2);
}, },
), ),
) )
.setInstantTera(3), // Tera Grass Meganium / Fire Typhlosion / Water Feraligatr .setInstantTera(1), // Tera Grass Meganium / Fire Typhlosion / Water Feraligatr
[TrainerType.LANCE_CHAMPION]: new TrainerConfig(++t) [TrainerType.LANCE_CHAMPION]: new TrainerConfig(++t)
.setName("Lance") .setName("Lance")
.initForChampion(true) .initForChampion(true)
.setBattleBgm("battle_johto_champion") .setBattleBgm("battle_johto_champion")
.setMixedBattleBgm("battle_johto_champion") .setMixedBattleBgm("battle_johto_champion")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.GYARADOS, SpeciesId.KINGDRA])) .setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.GYARADOS]))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.AERODACTYL])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.AERODACTYL]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.CHARIZARD]))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.KINGDRA, SpeciesId.TYRANITAR, SpeciesId.GARCHOMP]))
.setPartyMemberFunc( .setPartyMemberFunc(
2, 4,
getRandomPartyMemberFunc([SpeciesId.SALAMENCE], TrainerSlot.TRAINER, true, p => { getRandomPartyMemberFunc([SpeciesId.SALAMENCE], TrainerSlot.TRAINER, true, p => {
p.formIndex = 1; // Mega Salamence p.formIndex = 1; // Mega Salamence
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.generateName(); p.generateName();
}), }),
) )
.setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.CHARIZARD]))
.setPartyMemberFunc(
4,
getRandomPartyMemberFunc(
[SpeciesId.TYRANITAR, SpeciesId.GARCHOMP, SpeciesId.KOMMO_O],
TrainerSlot.TRAINER,
true,
p => {
p.teraType = PokemonType.DRAGON;
p.generateAndPopulateMoveset();
p.abilityIndex = p.species.speciesId === SpeciesId.KOMMO_O ? 1 : 2; // Soundproof Kommo-o, Unnerve Tyranitar, Rough Skin Garchomp
},
),
)
.setPartyMemberFunc( .setPartyMemberFunc(
5, 5,
getRandomPartyMemberFunc([SpeciesId.DRAGONITE], TrainerSlot.TRAINER, true, p => { getRandomPartyMemberFunc([SpeciesId.DRAGONITE], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.gender = Gender.MALE; p.gender = Gender.MALE;
p.setBoss(true, 2); p.setBoss(true, 2);
p.teraType = PokemonType.DRAGON;
}), }),
) )
.setInstantTera(4), // Tera Dragon Tyranitar / Garchomp / Kommo-o .setInstantTera(5), // Tera Dragon Dragonite
[TrainerType.STEVEN]: new TrainerConfig(++t) [TrainerType.STEVEN]: new TrainerConfig(++t)
.initForChampion(true) .initForChampion(true)
.setBattleBgm("battle_hoenn_champion_g5") .setBattleBgm("battle_hoenn_champion_g5")
@ -3916,13 +3890,7 @@ export const trainerConfigs: TrainerConfigs = {
.setDoubleTitle("champion_double") .setDoubleTitle("champion_double")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.SKARMORY])) .setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.SKARMORY]))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.CRADILY, SpeciesId.ARMALDO])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.CRADILY, SpeciesId.ARMALDO]))
.setPartyMemberFunc( .setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.AGGRON]))
2,
getRandomPartyMemberFunc([SpeciesId.AGGRON], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.setBoss(true, 2);
}),
)
.setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.GOLURK, SpeciesId.RUNERIGUS])) .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.GOLURK, SpeciesId.RUNERIGUS]))
.setPartyMemberFunc( .setPartyMemberFunc(
4, 4,
@ -3942,6 +3910,7 @@ export const trainerConfigs: TrainerConfigs = {
p.formIndex = 1; // Mega Metagross p.formIndex = 1; // Mega Metagross
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.generateName(); p.generateName();
p.setBoss(true, 2);
}), }),
) )
.setInstantTera(4), // Tera Rock Regirock / Ice Regice / Steel Registeel .setInstantTera(4), // Tera Rock Regirock / Ice Regice / Steel Registeel
@ -3959,21 +3928,33 @@ export const trainerConfigs: TrainerConfigs = {
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
}), }),
) )
.setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.LUDICOLO]))
.setPartyMemberFunc( .setPartyMemberFunc(
2, 1,
getRandomPartyMemberFunc([SpeciesId.LUDICOLO], TrainerSlot.TRAINER, true, p => {
p.abilityIndex = 1; // Rain Dish
p.generateAndPopulateMoveset();
}),
)
.setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.SWAMPERT, SpeciesId.GASTRODON]))
.setPartyMemberFunc(
3,
getRandomPartyMemberFunc(
[SpeciesId.KINGDRA, SpeciesId.OVERQWIL, SpeciesId.BASCULEGION],
TrainerSlot.TRAINER,
true,
p => {
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL;
p.abilityIndex = p.species.speciesId === SpeciesId.OVERQWIL ? 1 : 0; // Swift Swim
},
),
)
.setPartyMemberFunc(
4,
getRandomPartyMemberFunc([SpeciesId.LATIAS, SpeciesId.LATIOS], TrainerSlot.TRAINER, true, p => { getRandomPartyMemberFunc([SpeciesId.LATIAS, SpeciesId.LATIOS], TrainerSlot.TRAINER, true, p => {
p.formIndex = 1; // Mega Latios or Mega Latias p.formIndex = 1; // Mega Latios or Mega Latias
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.generateName(); p.generateName();
p.pokeball = PokeballType.MASTER_BALL;
}),
)
.setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.SWAMPERT, SpeciesId.GASTRODON, SpeciesId.SEISMITOAD]))
.setPartyMemberFunc(
4,
getRandomPartyMemberFunc([SpeciesId.REGIELEKI, SpeciesId.REGIDRAGO], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL; p.pokeball = PokeballType.ULTRA_BALL;
}), }),
) )
@ -3985,22 +3966,14 @@ export const trainerConfigs: TrainerConfigs = {
p.setBoss(true, 2); p.setBoss(true, 2);
}), }),
) )
.setInstantTera(4), // Tera Electric Regieleki / Dragon Regidrago .setInstantTera(5), // Tera Water Milotic
[TrainerType.CYNTHIA]: new TrainerConfig(++t) [TrainerType.CYNTHIA]: new TrainerConfig(++t)
.initForChampion(false) .initForChampion(false)
.setBattleBgm("battle_sinnoh_champion") .setBattleBgm("battle_sinnoh_champion")
.setMixedBattleBgm("battle_sinnoh_champion") .setMixedBattleBgm("battle_sinnoh_champion")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.SPIRITOMB])) .setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.SPIRITOMB]))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.LUCARIO]))
.setPartyMemberFunc( .setPartyMemberFunc(
2, 1,
getRandomPartyMemberFunc([SpeciesId.GIRATINA], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.MASTER_BALL;
}),
)
.setPartyMemberFunc(
3,
getRandomPartyMemberFunc( getRandomPartyMemberFunc(
[SpeciesId.MILOTIC, SpeciesId.ROSERADE, SpeciesId.HISUI_ARCANINE], [SpeciesId.MILOTIC, SpeciesId.ROSERADE, SpeciesId.HISUI_ARCANINE],
TrainerSlot.TRAINER, TrainerSlot.TRAINER,
@ -4011,11 +3984,13 @@ export const trainerConfigs: TrainerConfigs = {
}, },
), ),
) )
.setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.TOGEKISS]))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.LUCARIO]))
.setPartyMemberFunc( .setPartyMemberFunc(
4, 4,
getRandomPartyMemberFunc([SpeciesId.TOGEKISS], TrainerSlot.TRAINER, true, p => { getRandomPartyMemberFunc([SpeciesId.GIRATINA], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.setBoss(true, 2); p.pokeball = PokeballType.MASTER_BALL;
}), }),
) )
.setPartyMemberFunc( .setPartyMemberFunc(
@ -4025,9 +4000,10 @@ export const trainerConfigs: TrainerConfigs = {
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.generateName(); p.generateName();
p.gender = Gender.FEMALE; p.gender = Gender.FEMALE;
p.setBoss(true, 2);
}), }),
) )
.setInstantTera(3), // Tera Water Milotic / Grass Roserade / Fire Hisuian Arcanine .setInstantTera(1), // Tera Water Milotic / Grass Roserade / Fire Hisuian Arcanine
[TrainerType.ALDER]: new TrainerConfig(++t) [TrainerType.ALDER]: new TrainerConfig(++t)
.initForChampion(true) .initForChampion(true)
.setHasDouble("alder_iris_double") .setHasDouble("alder_iris_double")
@ -4050,29 +4026,26 @@ export const trainerConfigs: TrainerConfigs = {
) )
.setPartyMemberFunc( .setPartyMemberFunc(
2, 2,
getRandomPartyMemberFunc([SpeciesId.ZEKROM], TrainerSlot.TRAINER, true, p => { getRandomPartyMemberFunc([SpeciesId.KELDEO], TrainerSlot.TRAINER, true, p => {
p.pokeball = PokeballType.ULTRA_BALL;
p.formIndex = 1; // Resolute Form
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.pokeball = PokeballType.MASTER_BALL; if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === MoveId.SECRET_SWORD)) {
// Check if Secret Sword is in the moveset, if not, replace the second move with Secret Sword.
p.moveset[1] = new PokemonMove(MoveId.SECRET_SWORD);
}
}), }),
) )
.setPartyMemberFunc( .setPartyMemberFunc(
3, 3,
getRandomPartyMemberFunc([SpeciesId.KELDEO], TrainerSlot.TRAINER, true, p => { getRandomPartyMemberFunc([SpeciesId.CHANDELURE, SpeciesId.KROOKODILE, SpeciesId.REUNICLUS, SpeciesId.CONKELDURR]),
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL;
}),
) )
.setPartyMemberFunc( .setPartyMemberFunc(
4, 4,
getRandomPartyMemberFunc( getRandomPartyMemberFunc([SpeciesId.ZEKROM], TrainerSlot.TRAINER, true, p => {
[SpeciesId.CHANDELURE, SpeciesId.KROOKODILE, SpeciesId.REUNICLUS, SpeciesId.CONKELDURR],
TrainerSlot.TRAINER,
true,
p => {
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.teraType = p.species.speciesId === SpeciesId.KROOKODILE ? PokemonType.DARK : p.species.type1; p.pokeball = PokeballType.MASTER_BALL;
}, }),
),
) )
.setPartyMemberFunc( .setPartyMemberFunc(
5, 5,
@ -4080,9 +4053,10 @@ export const trainerConfigs: TrainerConfigs = {
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.gender = Gender.MALE; p.gender = Gender.MALE;
p.setBoss(true, 2); p.setBoss(true, 2);
p.teraType = PokemonType.FIRE;
}), }),
) )
.setInstantTera(4), // Tera Ghost Chandelure / Dark Krookodile / Psychic Reuniclus / Fighting Conkeldurr .setInstantTera(5), // Tera Fire Volcarona
[TrainerType.IRIS]: new TrainerConfig(++t) [TrainerType.IRIS]: new TrainerConfig(++t)
.initForChampion(false) .initForChampion(false)
.setBattleBgm("battle_champion_iris") .setBattleBgm("battle_champion_iris")
@ -4092,33 +4066,22 @@ export const trainerConfigs: TrainerConfigs = {
.setDoubleTitle("champion_double") .setDoubleTitle("champion_double")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.DRUDDIGON])) .setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.DRUDDIGON]))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.ARCHEOPS])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.ARCHEOPS]))
.setPartyMemberFunc( .setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.AGGRON, SpeciesId.HYDREIGON, SpeciesId.ARCHALUDON]))
2,
getRandomPartyMemberFunc([SpeciesId.RESHIRAM], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.MASTER_BALL;
}),
)
.setPartyMemberFunc( .setPartyMemberFunc(
3, 3,
getRandomPartyMemberFunc(
[SpeciesId.SALAMENCE, SpeciesId.HYDREIGON, SpeciesId.ARCHALUDON],
TrainerSlot.TRAINER,
true,
p => {
p.generateAndPopulateMoveset();
p.teraType = PokemonType.DRAGON;
},
),
)
.setPartyMemberFunc(
4,
getRandomPartyMemberFunc([SpeciesId.LAPRAS], TrainerSlot.TRAINER, true, p => { getRandomPartyMemberFunc([SpeciesId.LAPRAS], TrainerSlot.TRAINER, true, p => {
p.formIndex = 1; // G-Max Lapras p.formIndex = 1; // G-Max Lapras
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.generateName(); p.generateName();
}), }),
) )
.setPartyMemberFunc(
4,
getRandomPartyMemberFunc([SpeciesId.RESHIRAM], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.MASTER_BALL;
}),
)
.setPartyMemberFunc( .setPartyMemberFunc(
5, 5,
getRandomPartyMemberFunc([SpeciesId.HAXORUS], TrainerSlot.TRAINER, true, p => { getRandomPartyMemberFunc([SpeciesId.HAXORUS], TrainerSlot.TRAINER, true, p => {
@ -4128,37 +4091,26 @@ export const trainerConfigs: TrainerConfigs = {
p.setBoss(true, 2); p.setBoss(true, 2);
}), }),
) )
.setInstantTera(3), // Tera Dragon Salamence / Hydreigon / Archaludon .setInstantTera(5), // Tera Dragon Haxorus
[TrainerType.DIANTHA]: new TrainerConfig(++t) [TrainerType.DIANTHA]: new TrainerConfig(++t)
.initForChampion(false) .initForChampion(false)
.setMixedBattleBgm("battle_kalos_champion") .setMixedBattleBgm("battle_kalos_champion")
.setPartyMemberFunc( .setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.HAWLUCHA]))
0,
getRandomPartyMemberFunc([SpeciesId.HAWLUCHA], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
}),
)
.setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.TREVENANT, SpeciesId.GOURGEIST])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.TREVENANT, SpeciesId.GOURGEIST]))
.setPartyMemberFunc( .setPartyMemberFunc(
2, 2,
getRandomPartyMemberFunc([SpeciesId.XERNEAS], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.MASTER_BALL;
}),
)
.setPartyMemberFunc(
3,
getRandomPartyMemberFunc([SpeciesId.TYRANTRUM, SpeciesId.AURORUS], TrainerSlot.TRAINER, true, p => { getRandomPartyMemberFunc([SpeciesId.TYRANTRUM, SpeciesId.AURORUS], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.abilityIndex = 2; // Rock Head Tyrantrum, Snow Warning Aurorus p.abilityIndex = 2; // Rock Head Tyrantrum, Snow Warning Aurorus
p.teraType = p.species.type2!; p.teraType = p.species.type2!;
}), }),
) )
.setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.GOODRA]))
.setPartyMemberFunc( .setPartyMemberFunc(
4, 2,
getRandomPartyMemberFunc([SpeciesId.GOODRA], TrainerSlot.TRAINER, true, p => { getRandomPartyMemberFunc([SpeciesId.XERNEAS], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.setBoss(true, 2); p.pokeball = PokeballType.MASTER_BALL;
}), }),
) )
.setPartyMemberFunc( .setPartyMemberFunc(
@ -4168,6 +4120,7 @@ export const trainerConfigs: TrainerConfigs = {
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.generateName(); p.generateName();
p.gender = Gender.FEMALE; p.gender = Gender.FEMALE;
p.setBoss(true, 2);
}), }),
) )
.setInstantTera(3), // Tera Dragon Tyrantrum / Ice Aurorus .setInstantTera(3), // Tera Dragon Tyrantrum / Ice Aurorus
@ -4181,7 +4134,13 @@ export const trainerConfigs: TrainerConfigs = {
p.formIndex = 2; // Dusk Lycanroc p.formIndex = 2; // Dusk Lycanroc
}), }),
) )
.setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.MAGNEZONE, SpeciesId.ALOLA_NINETALES])) .setPartyMemberFunc(
1,
getRandomPartyMemberFunc([SpeciesId.MAGNEZONE, SpeciesId.ALOLA_NINETALES], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.abilityIndex = p.species.speciesId === SpeciesId.MAGNEZONE ? 1 : 2; // Sturdy Magnezone, Snow Warning Ninetales
}),
)
.setPartyMemberFunc( .setPartyMemberFunc(
2, 2,
getRandomPartyMemberFunc( getRandomPartyMemberFunc(
@ -4197,9 +4156,8 @@ export const trainerConfigs: TrainerConfigs = {
) )
.setPartyMemberFunc( .setPartyMemberFunc(
3, 3,
getRandomPartyMemberFunc([SpeciesId.TAPU_KOKO, SpeciesId.TAPU_FINI], TrainerSlot.TRAINER, true, p => { getRandomPartyMemberFunc([SpeciesId.TAPU_LELE, SpeciesId.TAPU_FINI], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.setBoss(true, 2);
p.pokeball = PokeballType.ULTRA_BALL; p.pokeball = PokeballType.ULTRA_BALL;
}), }),
) )
@ -4216,6 +4174,7 @@ export const trainerConfigs: TrainerConfigs = {
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.gender = Gender.MALE; p.gender = Gender.MALE;
p.teraType = p.species.type2!; p.teraType = p.species.type2!;
p.setBoss(true, 2);
}), }),
) )
.setInstantTera(5), // Tera Dark Incineroar / Fighting Hisuian Decidueye .setInstantTera(5), // Tera Dark Incineroar / Fighting Hisuian Decidueye
@ -4226,25 +4185,23 @@ export const trainerConfigs: TrainerConfigs = {
.setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.NOIVERN])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.NOIVERN]))
.setPartyMemberFunc( .setPartyMemberFunc(
2, 2,
getRandomPartyMemberFunc([SpeciesId.SOLGALEO], TrainerSlot.TRAINER, true, p => { getRandomPartyMemberFunc([SpeciesId.BLACEPHALON, SpeciesId.STAKATAKA], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.pokeball = PokeballType.MASTER_BALL; p.pokeball = PokeballType.ROGUE_BALL;
}), }),
) )
.setPartyMemberFunc( .setPartyMemberFunc(
3, 3,
getRandomPartyMemberFunc([SpeciesId.TAPU_LELE, SpeciesId.TAPU_BULU], TrainerSlot.TRAINER, true, p => { getRandomPartyMemberFunc([SpeciesId.TAPU_KOKO, SpeciesId.TAPU_BULU], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL; p.pokeball = PokeballType.ULTRA_BALL;
p.teraType = p.species.type1;
}), }),
) )
.setPartyMemberFunc( .setPartyMemberFunc(
4, 4,
getRandomPartyMemberFunc([SpeciesId.ZYGARDE], TrainerSlot.TRAINER, true, p => { getRandomPartyMemberFunc([SpeciesId.SOLGALEO], TrainerSlot.TRAINER, true, p => {
p.formIndex = 1; // Zygarde 10% forme, Aura Break
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ROGUE_BALL; p.pokeball = PokeballType.MASTER_BALL;
}), }),
) )
.setPartyMemberFunc( .setPartyMemberFunc(
@ -4253,34 +4210,24 @@ export const trainerConfigs: TrainerConfigs = {
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.setBoss(true, 2); p.setBoss(true, 2);
p.gender = p.species.speciesId === SpeciesId.PRIMARINA ? Gender.FEMALE : Gender.MALE; p.gender = p.species.speciesId === SpeciesId.PRIMARINA ? Gender.FEMALE : Gender.MALE;
p.teraType = p.species.speciesId === SpeciesId.PRIMARINA ? PokemonType.WATER : PokemonType.GHOST;
}), }),
) )
.setInstantTera(3), // Tera Psychic Tapu Lele / Grass Tapu Bulu .setInstantTera(5), // Tera Ghost Decidueye, Water Primarina
[TrainerType.LEON]: new TrainerConfig(++t) [TrainerType.LEON]: new TrainerConfig(++t)
.initForChampion(true) .initForChampion(true)
.setMixedBattleBgm("battle_galar_champion") .setMixedBattleBgm("battle_galar_champion")
.setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.AEGISLASH])) .setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.AEGISLASH]))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.RHYPERIOR, SpeciesId.SEISMITOAD, SpeciesId.MR_RIME])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.RHYPERIOR, SpeciesId.SEISMITOAD, SpeciesId.MR_RIME]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.DRAGAPULT]))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.RILLABOOM, SpeciesId.CINDERACE, SpeciesId.INTELEON]))
.setPartyMemberFunc( .setPartyMemberFunc(
2, 4,
getRandomPartyMemberFunc([SpeciesId.ZACIAN], TrainerSlot.TRAINER, true, p => { getRandomPartyMemberFunc([SpeciesId.ZACIAN], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.pokeball = PokeballType.MASTER_BALL; p.pokeball = PokeballType.MASTER_BALL;
}), }),
) )
.setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.DRAGAPULT]))
.setPartyMemberFunc(
4,
getRandomPartyMemberFunc(
[SpeciesId.RILLABOOM, SpeciesId.CINDERACE, SpeciesId.INTELEON],
TrainerSlot.TRAINER,
true,
p => {
p.generateAndPopulateMoveset();
p.setBoss(true, 2);
},
),
)
.setPartyMemberFunc( .setPartyMemberFunc(
5, 5,
getRandomPartyMemberFunc([SpeciesId.CHARIZARD], TrainerSlot.TRAINER, true, p => { getRandomPartyMemberFunc([SpeciesId.CHARIZARD], TrainerSlot.TRAINER, true, p => {
@ -4288,9 +4235,10 @@ export const trainerConfigs: TrainerConfigs = {
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.generateName(); p.generateName();
p.gender = Gender.MALE; p.gender = Gender.MALE;
p.setBoss(true, 2);
}), }),
) )
.setInstantTera(3), // Tera Dragapult to Ghost or Dragon .setInstantTera(3), // Tera Grass Rillaboom, Fire Cinderace, Water Inteleon
[TrainerType.MUSTARD]: new TrainerConfig(++t) [TrainerType.MUSTARD]: new TrainerConfig(++t)
.initForChampion(true) .initForChampion(true)
.setMixedBattleBgm("battle_mustard") .setMixedBattleBgm("battle_mustard")
@ -4313,35 +4261,36 @@ export const trainerConfigs: TrainerConfigs = {
getRandomPartyMemberFunc([SpeciesId.GALAR_SLOWBRO, SpeciesId.GALAR_SLOWKING], TrainerSlot.TRAINER, true, p => { getRandomPartyMemberFunc([SpeciesId.GALAR_SLOWBRO, SpeciesId.GALAR_SLOWKING], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL; p.pokeball = PokeballType.ULTRA_BALL;
p.teraType = p.species.type1;
}), }),
) )
.setPartyMemberFunc( .setPartyMemberFunc(
3, 3,
getRandomPartyMemberFunc([SpeciesId.GALAR_DARMANITAN], TrainerSlot.TRAINER, true, p => { getRandomPartyMemberFunc([SpeciesId.BLASTOISE, SpeciesId.VENUSAUR], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL; p.pokeball = PokeballType.ULTRA_BALL;
p.formIndex = 2; // G-Max Blastoise, G-Max Venusaur
}), }),
) )
.setPartyMemberFunc( .setPartyMemberFunc(
4, 4,
getRandomPartyMemberFunc([SpeciesId.BLASTOISE, SpeciesId.VENUSAUR], TrainerSlot.TRAINER, true, p => { getRandomPartyMemberFunc([SpeciesId.ZAMAZENTA], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.setBoss(true, 2);
p.pokeball = PokeballType.ULTRA_BALL; p.pokeball = PokeballType.ULTRA_BALL;
}), }),
) )
.setPartyMemberFunc( .setPartyMemberFunc(
5, 5,
getRandomPartyMemberFunc([SpeciesId.URSHIFU], TrainerSlot.TRAINER, true, p => { getRandomPartyMemberFunc([SpeciesId.URSHIFU], TrainerSlot.TRAINER, true, p => {
p.formIndex = randSeedIntRange(2, 3); // Random G-Max Urshifu p.formIndex = randSeedIntRange(0, 1); // Random Urshifu form
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.generateName(); p.generateName();
p.gender = Gender.MALE; p.gender = Gender.MALE;
p.pokeball = PokeballType.ULTRA_BALL; p.pokeball = PokeballType.ULTRA_BALL;
p.setBoss(true, 2);
p.teraType = p.formIndex === 0 ? PokemonType.DARK : PokemonType.WATER;
}), }),
) )
.setInstantTera(2), // Tera Poison Galar-Slowbro / Galar-Slowking .setInstantTera(5), // Tera Dark Urshifu Single / Tera Water Urshifu Rapid
[TrainerType.GEETA]: new TrainerConfig(++t) [TrainerType.GEETA]: new TrainerConfig(++t)
.initForChampion(false) .initForChampion(false)
.setMixedBattleBgm("battle_champion_geeta") .setMixedBattleBgm("battle_champion_geeta")
@ -4353,16 +4302,16 @@ export const trainerConfigs: TrainerConfigs = {
p.setBoss(true, 2); p.setBoss(true, 2);
}), }),
) )
.setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.ESPATHRA, SpeciesId.VELUZA])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.ESPATHRA]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.BAXCALIBUR]))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.CHESNAUGHT, SpeciesId.DELPHOX, SpeciesId.GRENINJA]))
.setPartyMemberFunc( .setPartyMemberFunc(
2, 4,
getRandomPartyMemberFunc([SpeciesId.MIRAIDON], TrainerSlot.TRAINER, true, p => { getRandomPartyMemberFunc([SpeciesId.MIRAIDON], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.pokeball = PokeballType.MASTER_BALL; p.pokeball = PokeballType.MASTER_BALL;
}), }),
) )
.setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.BAXCALIBUR]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([SpeciesId.CHESNAUGHT, SpeciesId.DELPHOX, SpeciesId.GRENINJA]))
.setPartyMemberFunc( .setPartyMemberFunc(
5, 5,
getRandomPartyMemberFunc([SpeciesId.KINGAMBIT], TrainerSlot.TRAINER, true, p => { getRandomPartyMemberFunc([SpeciesId.KINGAMBIT], TrainerSlot.TRAINER, true, p => {
@ -4387,21 +4336,15 @@ export const trainerConfigs: TrainerConfigs = {
}), }),
) )
.setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.PAWMOT])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.PAWMOT]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.DUDUNSPARCE]))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.CERULEDGE, SpeciesId.ARMAROUGE]))
.setPartyMemberFunc( .setPartyMemberFunc(
2, 4,
getRandomPartyMemberFunc([SpeciesId.KORAIDON], TrainerSlot.TRAINER, true, p => { getRandomPartyMemberFunc([SpeciesId.KORAIDON], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.pokeball = PokeballType.MASTER_BALL; p.pokeball = PokeballType.MASTER_BALL;
}), }),
) )
.setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.GHOLDENGO]))
.setPartyMemberFunc(
4,
getRandomPartyMemberFunc([SpeciesId.ARMAROUGE, SpeciesId.CERULEDGE], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.teraType = p.species.type2!;
}),
)
.setPartyMemberFunc( .setPartyMemberFunc(
5, 5,
getRandomPartyMemberFunc( getRandomPartyMemberFunc(
@ -4412,10 +4355,11 @@ export const trainerConfigs: TrainerConfigs = {
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.gender = Gender.MALE; p.gender = Gender.MALE;
p.setBoss(true, 2); p.setBoss(true, 2);
p.teraType = p.species.type1!;
}, },
), ),
) )
.setInstantTera(4), // Tera Psychic Armarouge / Ghost Ceruledge .setInstantTera(5), // Tera Grass Meowscarada, Fire Skeledirge, Water Quaquaval
[TrainerType.KIERAN]: new TrainerConfig(++t) [TrainerType.KIERAN]: new TrainerConfig(++t)
.initForChampion(true) .initForChampion(true)
.setMixedBattleBgm("battle_champion_kieran") .setMixedBattleBgm("battle_champion_kieran")
@ -4427,13 +4371,7 @@ export const trainerConfigs: TrainerConfigs = {
p.abilityIndex = p.species.speciesId === SpeciesId.INCINEROAR ? 2 : 0; // Intimidate Incineroar, Prankster Grimmsnarl p.abilityIndex = p.species.speciesId === SpeciesId.INCINEROAR ? 2 : 0; // Intimidate Incineroar, Prankster Grimmsnarl
}), }),
) )
.setPartyMemberFunc( .setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.DRAGONITE]))
2,
getRandomPartyMemberFunc([SpeciesId.TERAPAGOS], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.MASTER_BALL;
}),
)
.setPartyMemberFunc( .setPartyMemberFunc(
3, 3,
getRandomPartyMemberFunc([SpeciesId.URSALUNA, SpeciesId.BLOODMOON_URSALUNA], TrainerSlot.TRAINER, true, p => { getRandomPartyMemberFunc([SpeciesId.URSALUNA, SpeciesId.BLOODMOON_URSALUNA], TrainerSlot.TRAINER, true, p => {
@ -4443,25 +4381,29 @@ export const trainerConfigs: TrainerConfigs = {
) )
.setPartyMemberFunc( .setPartyMemberFunc(
4, 4,
getRandomPartyMemberFunc([SpeciesId.OGERPON], TrainerSlot.TRAINER, true, p => { getRandomPartyMemberFunc([SpeciesId.TERAPAGOS], TrainerSlot.TRAINER, true, p => {
p.formIndex = randSeedInt(4); // Random Ogerpon Tera Mask
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL; if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === MoveId.TERA_STARSTORM)) {
if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === MoveId.IVY_CUDGEL)) { // Check if Tera Starstorm is in the moveset, if not, replace the first move with Tera Starstorm.
// Check if Ivy Cudgel is in the moveset, if not, replace the first move with Ivy Cudgel. p.moveset[0] = new PokemonMove(MoveId.TERA_STARSTORM);
p.moveset[0] = new PokemonMove(MoveId.IVY_CUDGEL);
} }
p.pokeball = PokeballType.MASTER_BALL;
}), }),
) )
.setPartyMemberFunc( .setPartyMemberFunc(
5, 5,
getRandomPartyMemberFunc([SpeciesId.HYDRAPPLE], TrainerSlot.TRAINER, true, p => { getRandomPartyMemberFunc([SpeciesId.HYDRAPPLE], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.gender = Gender.MALE; p.gender = Gender.MALE;
p.setBoss(true, 2); p.setBoss(true, 2);
p.teraType = PokemonType.FIGHTING;
p.generateAndPopulateMoveset();
if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === MoveId.TERA_BLAST)) {
// Check if Tera Blast is in the moveset, if not, replace the third move with Tera Blast.
p.moveset[2] = new PokemonMove(MoveId.TERA_BLAST);
}
}), }),
) )
.setInstantTera(4), // Tera Ogerpon .setInstantTera(5), // Tera Fighting Hydrapple
[TrainerType.RIVAL]: new TrainerConfig((t = TrainerType.RIVAL)) [TrainerType.RIVAL]: new TrainerConfig((t = TrainerType.RIVAL))
.setName("Finn") .setName("Finn")