diff --git a/src/data/balance/passives.ts b/src/data/balance/passives.ts index 0a76b3036b9..c0f84d90cf0 100644 --- a/src/data/balance/passives.ts +++ b/src/data/balance/passives.ts @@ -1044,7 +1044,7 @@ export const starterPassiveAbilities: StarterPassiveAbilities = { [SpeciesId.FINIZEN]: { 0: AbilityId.FRIEND_GUARD }, [SpeciesId.PALAFIN]: { 0: AbilityId.EMERGENCY_EXIT, 1: AbilityId.IRON_FIST }, [SpeciesId.VAROOM]: { 0: AbilityId.LEVITATE }, - [SpeciesId.REVAVROOM]: { 0: AbilityId.LEVITATE, 1: AbilityId.DARK_AURA, 2: AbilityId.FLASH_FIRE, 3: AbilityId.MERCILESS, 4: AbilityId.FILTER, 5: AbilityId.SCRAPPY }, + [SpeciesId.REVAVROOM]: { 0: AbilityId.LEVITATE, 1: AbilityId.INTIMIDATE, 2: AbilityId.SPEED_BOOST, 3: AbilityId.TOXIC_DEBRIS, 4: AbilityId.MISTY_SURGE, 5: AbilityId.STAMINA }, [SpeciesId.CYCLIZAR]: { 0: AbilityId.PROTEAN }, [SpeciesId.ORTHWORM]: { 0: AbilityId.REGENERATOR }, [SpeciesId.GLIMMET]: { 0: AbilityId.STURDY }, diff --git a/src/data/balance/pokemon-species.ts b/src/data/balance/pokemon-species.ts index 5e9d352f437..13269308958 100644 --- a/src/data/balance/pokemon-species.ts +++ b/src/data/balance/pokemon-species.ts @@ -1618,11 +1618,11 @@ export function initSpecies() { new PokemonSpecies(SpeciesId.VAROOM, 9, false, false, false, "Single-Cyl Pokémon", PokemonType.STEEL, PokemonType.POISON, 1, 35, AbilityId.OVERCOAT, AbilityId.NONE, AbilityId.SLOW_START, 300, 45, 70, 63, 30, 45, 47, 190, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(SpeciesId.REVAVROOM, 9, false, false, false, "Multi-Cyl Pokémon", PokemonType.STEEL, PokemonType.POISON, 1.8, 120, AbilityId.OVERCOAT, AbilityId.NONE, AbilityId.FILTER, 500, 80, 119, 90, 54, 67, 90, 75, 50, 175, GrowthRate.MEDIUM_FAST, 50, false, false, new PokemonForm("Normal", "", PokemonType.STEEL, PokemonType.POISON, 1.8, 120, AbilityId.OVERCOAT, AbilityId.NONE, AbilityId.FILTER, 500, 80, 119, 90, 54, 67, 90, 75, 50, 175, false, null, true), - new PokemonForm("Segin Starmobile", "segin-starmobile", PokemonType.STEEL, PokemonType.DARK, 1.8, 240, AbilityId.INTIMIDATE, AbilityId.NONE, AbilityId.INTIMIDATE, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175, false, null, false, true), - new PokemonForm("Schedar Starmobile", "schedar-starmobile", PokemonType.STEEL, PokemonType.FIRE, 1.8, 240, AbilityId.SPEED_BOOST, AbilityId.NONE, AbilityId.SPEED_BOOST, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175, false, null, false, true), - new PokemonForm("Navi Starmobile", "navi-starmobile", PokemonType.STEEL, PokemonType.POISON, 1.8, 240, AbilityId.TOXIC_DEBRIS, AbilityId.NONE, AbilityId.TOXIC_DEBRIS, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175, false, null, false, true), - new PokemonForm("Ruchbah Starmobile", "ruchbah-starmobile", PokemonType.STEEL, PokemonType.FAIRY, 1.8, 240, AbilityId.MISTY_SURGE, AbilityId.NONE, AbilityId.MISTY_SURGE, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175, false, null, false, true), - new PokemonForm("Caph Starmobile", "caph-starmobile", PokemonType.STEEL, PokemonType.FIGHTING, 1.8, 240, AbilityId.STAMINA, AbilityId.NONE, AbilityId.STAMINA, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175, false, null, false, true) + new PokemonForm("Segin Starmobile", "segin-starmobile", PokemonType.STEEL, PokemonType.DARK, 1.8, 240, AbilityId.OVERCOAT, AbilityId.NONE, AbilityId.OVERCOAT, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175, false, null, false, true), + new PokemonForm("Schedar Starmobile", "schedar-starmobile", PokemonType.STEEL, PokemonType.FIRE, 1.8, 240, AbilityId.OVERCOAT, AbilityId.NONE, AbilityId.OVERCOAT, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175, false, null, false, true), + new PokemonForm("Navi Starmobile", "navi-starmobile", PokemonType.STEEL, PokemonType.POISON, 1.8, 240, AbilityId.OVERCOAT, AbilityId.NONE, AbilityId.OVERCOAT, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175, false, null, false, true), + new PokemonForm("Ruchbah Starmobile", "ruchbah-starmobile", PokemonType.STEEL, PokemonType.FAIRY, 1.8, 240, AbilityId.OVERCOAT, AbilityId.NONE, AbilityId.OVERCOAT, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175, false, null, false, true), + new PokemonForm("Caph Starmobile", "caph-starmobile", PokemonType.STEEL, PokemonType.FIGHTING, 1.8, 240, AbilityId.OVERCOAT, AbilityId.NONE, AbilityId.OVERCOAT, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175, false, null, false, true) ), new PokemonSpecies(SpeciesId.CYCLIZAR, 9, false, false, false, "Mount Pokémon", PokemonType.DRAGON, PokemonType.NORMAL, 1.6, 63, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.REGENERATOR, 501, 70, 95, 65, 85, 65, 121, 190, 50, 175, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(SpeciesId.ORTHWORM, 9, false, false, false, "Earthworm Pokémon", PokemonType.STEEL, null, 2.5, 310, AbilityId.EARTH_EATER, AbilityId.NONE, AbilityId.SAND_VEIL, 480, 70, 85, 145, 60, 55, 65, 25, 50, 240, GrowthRate.SLOW, 50, false), diff --git a/src/data/trainers/trainer-config.ts b/src/data/trainers/trainer-config.ts index 5739492f96e..6c643737778 100644 --- a/src/data/trainers/trainer-config.ts +++ b/src/data/trainers/trainer-config.ts @@ -2562,7 +2562,7 @@ export const trainerConfigs: TrainerConfigs = { p.moveset = [ new PokemonMove(MoveId.WICKED_TORQUE), new PokemonMove(MoveId.SPIN_OUT), - new PokemonMove(MoveId.SHIFT_GEAR), + new PokemonMove(MoveId.PARTING_SHOT), new PokemonMove(MoveId.HIGH_HORSEPOWER), ]; }), @@ -2582,7 +2582,7 @@ export const trainerConfigs: TrainerConfigs = { p.moveset = [ new PokemonMove(MoveId.BLAZING_TORQUE), new PokemonMove(MoveId.SPIN_OUT), - new PokemonMove(MoveId.SHIFT_GEAR), + new PokemonMove(MoveId.FLAME_CHARGE), new PokemonMove(MoveId.HIGH_HORSEPOWER), ]; }), @@ -2602,7 +2602,7 @@ export const trainerConfigs: TrainerConfigs = { p.moveset = [ new PokemonMove(MoveId.NOXIOUS_TORQUE), new PokemonMove(MoveId.SPIN_OUT), - new PokemonMove(MoveId.SHIFT_GEAR), + new PokemonMove(MoveId.TOXIC_SPIKES), new PokemonMove(MoveId.HIGH_HORSEPOWER), ]; }), @@ -2622,7 +2622,7 @@ export const trainerConfigs: TrainerConfigs = { p.moveset = [ new PokemonMove(MoveId.MAGICAL_TORQUE), new PokemonMove(MoveId.SPIN_OUT), - new PokemonMove(MoveId.SHIFT_GEAR), + new PokemonMove(MoveId.MISTY_TERRAIN), new PokemonMove(MoveId.HIGH_HORSEPOWER), ]; }), @@ -2642,7 +2642,7 @@ export const trainerConfigs: TrainerConfigs = { p.moveset = [ new PokemonMove(MoveId.COMBAT_TORQUE), new PokemonMove(MoveId.SPIN_OUT), - new PokemonMove(MoveId.SHIFT_GEAR), + new PokemonMove(MoveId.IRON_DEFENSE), new PokemonMove(MoveId.HIGH_HORSEPOWER), ]; }), @@ -4974,21 +4974,21 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.NIDOQUEEN, SpeciesId.NIDOKING])) .setPartyMemberFunc( 4, - getRandomPartyMemberFunc([SpeciesId.RHYPERIOR], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - p.abilityIndex = 1; // Solid Rock - }), - ) - .setPartyMemberFunc( - 5, getRandomPartyMemberFunc([SpeciesId.KANGASKHAN], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; // Mega Kangaskhan p.generateName(); }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([SpeciesId.RHYPERIOR], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.abilityIndex = 1; // Solid Rock + p.setBoss(true, 2); + }), ), [TrainerType.ROCKET_BOSS_GIOVANNI_2]: new TrainerConfig(++t) .setName("Giovanni") @@ -4997,52 +4997,53 @@ export const trainerConfigs: TrainerConfigs = { .setVictoryBgm("victory_team_plasma") .setPartyMemberFunc( 0, - getRandomPartyMemberFunc([SpeciesId.TYRANITAR], TrainerSlot.TRAINER, true, p => { + getRandomPartyMemberFunc([SpeciesId.RHYPERIOR], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); + p.abilityIndex = 1; // Solid Rock p.pokeball = PokeballType.ULTRA_BALL; }), ) .setPartyMemberFunc( 1, - getRandomPartyMemberFunc([SpeciesId.GASTRODON, SpeciesId.SEISMITOAD], TrainerSlot.TRAINER, true, p => { - if (p.species.speciesId === SpeciesId.GASTRODON) { - p.abilityIndex = 0; // Storm Drain - } else if (p.species.speciesId === SpeciesId.SEISMITOAD) { - p.abilityIndex = 2; // Water Absorb - } + getRandomPartyMemberFunc([SpeciesId.NIDOKING, SpeciesId.NIDOQUEEN], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = 2; // Sheer Force }), ) .setPartyMemberFunc( 2, - getRandomPartyMemberFunc([SpeciesId.GARCHOMP, SpeciesId.EXCADRILL], TrainerSlot.TRAINER, true, p => { + getRandomPartyMemberFunc([SpeciesId.HONCHKROW], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - if (p.species.speciesId === SpeciesId.GARCHOMP) { - p.abilityIndex = 2; // Rough Skin - } else if (p.species.speciesId === SpeciesId.EXCADRILL) { - p.abilityIndex = 0; // Sand Rush + if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === MoveId.SUCKER_PUNCH)) { + // Check if Sucker Punch is in the moveset, if not, replace the third move with Sucker Punch. + p.moveset[2] = new PokemonMove(MoveId.SUCKER_PUNCH); } }), ) .setPartyMemberFunc( 3, - getRandomPartyMemberFunc([SpeciesId.RHYPERIOR], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - p.abilityIndex = 1; // Solid Rock - }), - ) - .setPartyMemberFunc( - 4, getRandomPartyMemberFunc([SpeciesId.KANGASKHAN], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; // Mega Kangaskhan p.generateName(); }), ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc( + [SpeciesId.ARTICUNO, SpeciesId.ZAPDOS, SpeciesId.MOLTRES], + TrainerSlot.TRAINER, + true, + p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.abilityIndex = 2; // Snow Cloak Articuno, Static Zapdos, Flame Body Moltres + p.setBoss(true, 2); + }, + ), + ) .setPartyMemberFunc( 5, getRandomPartyMemberFunc([SpeciesId.MEWTWO], TrainerSlot.TRAINER, true, p => { @@ -5056,16 +5057,22 @@ export const trainerConfigs: TrainerConfigs = { .initForEvilTeamLeader("Magma Boss", []) .setMixedBattleBgm("battle_aqua_magma_boss") .setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.SOLROCK])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.TALONFLAME])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.WEEZING, SpeciesId.GALAR_WEEZING])) .setPartyMemberFunc( - 3, + 0, getRandomPartyMemberFunc([SpeciesId.TORKOAL], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.abilityIndex = 1; // Drought }), ) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.SOLROCK])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.WEEZING, SpeciesId.GALAR_WEEZING])) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([SpeciesId.SCOVILLAIN], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = 0; // Chlorophyll + }), + ) .setPartyMemberFunc(4, getRandomPartyMemberFunc([SpeciesId.DONPHAN])) .setPartyMemberFunc( 5, @@ -5140,16 +5147,16 @@ export const trainerConfigs: TrainerConfigs = { .initForEvilTeamLeader("Aqua Boss", []) .setMixedBattleBgm("battle_aqua_magma_boss") .setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.LUDICOLO])) .setPartyMemberFunc( - 1, + 0, getRandomPartyMemberFunc([SpeciesId.PELIPPER], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.abilityIndex = 1; // Drizzle }), ) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.WAILORD])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.MUK, SpeciesId.ALOLA_MUK])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.WAILORD])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.LUDICOLO])) .setPartyMemberFunc( 4, getRandomPartyMemberFunc([SpeciesId.QWILFISH], TrainerSlot.TRAINER, true, p => { @@ -5225,7 +5232,7 @@ export const trainerConfigs: TrainerConfigs = { .setMixedBattleBgm("battle_galactic_boss") .setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.GYARADOS])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.HONCHKROW, SpeciesId.HISUI_BRAVIARY])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.CROBAT, SpeciesId.HONCHKROW])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.MAGNEZONE])) .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.UXIE, SpeciesId.MESPRIT, SpeciesId.AZELF])) .setPartyMemberFunc( @@ -5233,8 +5240,6 @@ export const trainerConfigs: TrainerConfigs = { getRandomPartyMemberFunc([SpeciesId.HOUNDOOM], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; - p.formIndex = 1; // Mega Houndoom - p.generateName(); }), ) .setPartyMemberFunc( @@ -5253,7 +5258,7 @@ export const trainerConfigs: TrainerConfigs = { .setVictoryBgm("victory_team_plasma") .setPartyMemberFunc( 0, - getRandomPartyMemberFunc([SpeciesId.CROBAT], TrainerSlot.TRAINER, true, p => { + getRandomPartyMemberFunc([SpeciesId.CROBAT, SpeciesId.HONCHKROW], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); }), @@ -5374,24 +5379,8 @@ export const trainerConfigs: TrainerConfigs = { p.gender = Gender.MALE; }), ) - .setPartyMemberFunc( - 3, - getRandomPartyMemberFunc([SpeciesId.DRAGALGE, SpeciesId.CLAWITZER], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - if (p.species.speciesId === SpeciesId.DRAGALGE) { - p.abilityIndex = 2; // Adaptability - } else if (p.species.speciesId === SpeciesId.CLAWITZER) { - p.abilityIndex = 0; // Mega Launcher - } - }), - ) - .setPartyMemberFunc( - 4, - getRandomPartyMemberFunc([SpeciesId.GALLADE], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.abilityIndex = 1; // Sharpness - }), - ) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.MALAMAR])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([SpeciesId.AEGISLASH, SpeciesId.HISUI_GOODRA])) .setPartyMemberFunc( 5, getRandomPartyMemberFunc([SpeciesId.GYARADOS], TrainerSlot.TRAINER, true, p => { @@ -5416,21 +5405,11 @@ export const trainerConfigs: TrainerConfigs = { p.gender = Gender.MALE; }), ) - .setPartyMemberFunc( - 1, - getRandomPartyMemberFunc([SpeciesId.DRAGALGE, SpeciesId.CLAWITZER], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - if (p.species.speciesId === SpeciesId.DRAGALGE) { - p.abilityIndex = 2; // Adaptability - } else if (p.species.speciesId === SpeciesId.CLAWITZER) { - p.abilityIndex = 0; // Mega Launcher - } - }), - ) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.MIENSHAO])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.AEGISLASH, SpeciesId.HISUI_GOODRA])) .setPartyMemberFunc( 3, - getRandomPartyMemberFunc([SpeciesId.IRON_VALIANT], TrainerSlot.TRAINER, true, p => { + getRandomPartyMemberFunc([SpeciesId.VOLCANION], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ROGUE_BALL; }), @@ -5467,10 +5446,10 @@ export const trainerConfigs: TrainerConfigs = { p.gender = Gender.FEMALE; }), ) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.LILLIGANT, SpeciesId.HISUI_LILLIGANT])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.MILOTIC, SpeciesId.PRIMARINA])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.LILLIGANT])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.MILOTIC])) .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.GALAR_SLOWBRO, SpeciesId.GALAR_SLOWKING])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([SpeciesId.BEWEAR])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([SpeciesId.BEWEAR, SpeciesId.LOPUNNY])) .setPartyMemberFunc( 5, getRandomPartyMemberFunc([SpeciesId.NIHILEGO], TrainerSlot.TRAINER, true, p => { @@ -5492,7 +5471,7 @@ export const trainerConfigs: TrainerConfigs = { p.gender = Gender.FEMALE; }), ) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.MILOTIC, SpeciesId.PRIMARINA])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.MILOTIC, SpeciesId.LILLIGANT])) .setPartyMemberFunc( 2, getRandomPartyMemberFunc([SpeciesId.SILVALLY], TrainerSlot.TRAINER, true, p => { @@ -5572,7 +5551,11 @@ export const trainerConfigs: TrainerConfigs = { getRandomPartyMemberFunc([SpeciesId.GOLISOPOD], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); - p.gender = Gender.MALE; + if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === MoveId.FIRST_IMPRESSION)) { + // Check if First Impression is in the moveset, if not, replace the third move with First Impression. + p.moveset[2] = new PokemonMove(MoveId.FIRST_IMPRESSION); + p.gender = Gender.MALE; + } }), ), [TrainerType.GUZMA_2]: new TrainerConfig(++t) @@ -5585,8 +5568,12 @@ export const trainerConfigs: TrainerConfigs = { getRandomPartyMemberFunc([SpeciesId.GOLISOPOD], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); - p.abilityIndex = 2; // Anticipation - p.gender = Gender.MALE; + if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === MoveId.FIRST_IMPRESSION)) { + // Check if First Impression is in the moveset, if not, replace the third move with First Impression. + p.moveset[2] = new PokemonMove(MoveId.FIRST_IMPRESSION); + p.abilityIndex = 2; // Anticipation + p.gender = Gender.MALE; + } }), ) .setPartyMemberFunc( @@ -5615,7 +5602,7 @@ export const trainerConfigs: TrainerConfigs = { getRandomPartyMemberFunc([SpeciesId.GENESECT], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; + p.pokeball = PokeballType.ROGUE_BALL; p.formIndex = randSeedInt(4, 1); // Shock, Burn, Chill, or Douse Drive if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === MoveId.TECHNO_BLAST)) { // Check if Techno Blast is in the moveset, if not, replace the third move with Techno Blast. @@ -5697,13 +5684,7 @@ export const trainerConfigs: TrainerConfigs = { p.pokeball = PokeballType.ULTRA_BALL; }), ) - .setPartyMemberFunc( - 1, - getRandomPartyMemberFunc([SpeciesId.AEGISLASH, SpeciesId.GHOLDENGO], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - }), - ) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.CORVIKNIGHT])) .setPartyMemberFunc( 2, getRandomPartyMemberFunc([SpeciesId.DRACOZOLT, SpeciesId.DRACOVISH], TrainerSlot.TRAINER, true, p => { @@ -5721,6 +5702,17 @@ export const trainerConfigs: TrainerConfigs = { ) .setPartyMemberFunc( 4, + getRandomPartyMemberFunc([SpeciesId.COPPERAJAH], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.formIndex = 1; // G-Max Copperajah + p.generateName(); + p.pokeball = PokeballType.ULTRA_BALL; + p.gender = Gender.FEMALE; + }), + ) + .setPartyMemberFunc( + 5, getRandomPartyMemberFunc( [SpeciesId.GALAR_ARTICUNO, SpeciesId.GALAR_ZAPDOS, SpeciesId.GALAR_MOLTRES], TrainerSlot.TRAINER, @@ -5731,33 +5723,27 @@ export const trainerConfigs: TrainerConfigs = { p.pokeball = PokeballType.ULTRA_BALL; }, ), - ) - .setPartyMemberFunc( - 5, - getRandomPartyMemberFunc([SpeciesId.COPPERAJAH], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.formIndex = 1; // G-Max Copperajah - p.generateName(); - p.pokeball = PokeballType.ULTRA_BALL; - p.gender = Gender.FEMALE; - }), ), [TrainerType.PENNY]: new TrainerConfig(++t) .setName("Cassiopeia") .initForEvilTeamLeader("Star Boss", []) .setMixedBattleBgm("battle_star_boss") .setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.JOLTEON, SpeciesId.LEAFEON])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.VAPOREON, SpeciesId.UMBREON])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.ESPEON, SpeciesId.GLACEON])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.FLAREON])) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.ESPEON])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.UMBREON])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.LEAFEON, SpeciesId.GLACEON])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.VAPOREON, SpeciesId.FLAREON, SpeciesId.JOLTEON])) .setPartyMemberFunc( 4, getRandomPartyMemberFunc([SpeciesId.SYLVEON], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); p.abilityIndex = 2; // Pixilate p.generateAndPopulateMoveset(); - p.gender = Gender.FEMALE; + if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === MoveId.HYPER_VOICE)) { + // Check if Hyper Voice is in the moveset, if not, replace the second move with Hyper Voice. + p.moveset[1] = new PokemonMove(MoveId.HYPER_VOICE); + p.gender = Gender.FEMALE; + } }), ) .setPartyMemberFunc( @@ -5770,7 +5756,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateName(); }), ) - .setInstantTera(4), // Tera Fairy Sylveon + .setInstantTera(3), // Tera Fairy Sylveon [TrainerType.PENNY_2]: new TrainerConfig(++t) .setName("Cassiopeia") .initForEvilTeamLeader("Star Boss", [], true) @@ -5782,7 +5768,11 @@ export const trainerConfigs: TrainerConfigs = { p.setBoss(true, 2); p.abilityIndex = 2; // Pixilate p.generateAndPopulateMoveset(); - p.gender = Gender.FEMALE; + if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === MoveId.HYPER_VOICE)) { + // Check if Hyper Voice is in the moveset, if not, replace the second move with Hyper Voice. + p.moveset[1] = new PokemonMove(MoveId.HYPER_VOICE); + p.gender = Gender.FEMALE; + } }), ) .setPartyMemberFunc( @@ -5794,25 +5784,30 @@ export const trainerConfigs: TrainerConfigs = { ) .setPartyMemberFunc( 2, - getRandomPartyMemberFunc([SpeciesId.RAIKOU, SpeciesId.ENTEI, SpeciesId.SUICUNE], TrainerSlot.TRAINER, true, p => { + getRandomPartyMemberFunc([SpeciesId.ESPEON, SpeciesId.UMBREON], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; + p.abilityIndex = p.species.speciesId === SpeciesId.UMBREON ? 0 : 2; // Synchronize Umbreon, Magic Bounce Espeon }), ) .setPartyMemberFunc( 3, + getRandomPartyMemberFunc( + [SpeciesId.WALKING_WAKE, SpeciesId.GOUGING_FIRE, SpeciesId.RAGING_BOLT], + TrainerSlot.TRAINER, + true, + p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ROGUE_BALL; + }, + ), + ) + .setPartyMemberFunc( + 4, getRandomPartyMemberFunc([SpeciesId.REVAVROOM], TrainerSlot.TRAINER, true, p => { p.formIndex = randSeedInt(5, 1); // Random Starmobile form p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ROGUE_BALL; - }), - ) - .setPartyMemberFunc( - 4, - getRandomPartyMemberFunc([SpeciesId.ZAMAZENTA], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; }), ) .setPartyMemberFunc( @@ -5826,6 +5821,7 @@ export const trainerConfigs: TrainerConfigs = { }), ) .setInstantTera(0), // Tera Fairy Sylveon + [TrainerType.BUCK]: new TrainerConfig(++t) .setName("Buck") .initForStatTrainer(true)