diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 979b94f84d6..a97457a818b 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -3,9 +3,6 @@ # everything (whole code-base) - Junior Devs * @pagefaultgames/junior-dev-team -# github actions/templates etc. - Dev Leads -/.github @pagefaultgames/senior-dev-team - # Art Team /public/**/*.png @pagefaultgames/art-team /public/**/*.json @pagefaultgames/art-team @@ -19,4 +16,11 @@ /public/audio @pagefaultgames/composer-team # Balance Files; contain actual code logic and must also be owned by dev team -/src/data/balance @pagefaultgames/balance-team @pagefaultgames/junior-dev-team \ No newline at end of file +/src/data/balance @pagefaultgames/balance-team @pagefaultgames/junior-dev-team +/src/data/trainers @pagefaultgames/balance-team @pagefaultgames/junior-dev-team + +# GitHub actions/templates etc. - Senior Devs +# Should be defined last in the file to make sure these always override all other definitions +/.github @pagefaultgames/senior-dev-team +package.json @pagefaultgames/senior-dev-team +pnpm-lock.yaml @pagefaultgames/senior-dev-team \ No newline at end of file diff --git a/public/images/logo_fake.png b/public/images/logo_fake.png new file mode 100755 index 00000000000..9fdb8724025 Binary files /dev/null and b/public/images/logo_fake.png differ diff --git a/public/images/trainer/rocket_boss_giovanni_1.json b/public/images/trainer/rocket_boss_giovanni_1.json new file mode 100644 index 00000000000..a53be1a20e8 --- /dev/null +++ b/public/images/trainer/rocket_boss_giovanni_1.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "rocket_boss_giovanni_1.png", + "format": "RGBA8888", + "size": { + "w": 79, + "h": 79 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 39, + "h": 79 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 39, + "h": 79 + }, + "frame": { + "x": 0, + "y": 0, + "w": 39, + "h": 79 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:d6c5e1804414106d43a7c46f83468d39:1f3f7898a58950988acac6ee7167e012:5f742cbdaafcd5ae864f18ec2af7512a$" + } +} diff --git a/public/images/trainer/rocket_boss_giovanni_1.png b/public/images/trainer/rocket_boss_giovanni_1.png new file mode 100644 index 00000000000..8adab2d0575 Binary files /dev/null and b/public/images/trainer/rocket_boss_giovanni_1.png differ diff --git a/public/locales b/public/locales index fa35780fed7..ab2716d5440 160000 --- a/public/locales +++ b/public/locales @@ -1 +1 @@ -Subproject commit fa35780fed762017c89d1e9ece8a2779dff56c4d +Subproject commit ab2716d5440c25f73986664aa3f3131821c3c392 diff --git a/src/constants.ts b/src/constants.ts index f3b37563d11..6f9f4a6d2fb 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -94,3 +94,10 @@ export const AVERAGE_ENCOUNTERS_PER_RUN_TARGET = 12; * So anti-variance adds -15/256 to the spawn weight check for ME spawn. */ export const ANTI_VARIANCE_WEIGHT_MODIFIER = 15; + +/** + * The chance (out of 1) that a different title logo will show when the title screen is drawn. + * Inverted during April Fools (such that this becomes the chance for the _normal_ title logo is displayed). + * Default: `10000` (0.01%) + */ +export const FAKE_TITLE_LOGO_CHANCE = 10000; diff --git a/src/data/abilities/ability.ts b/src/data/abilities/ability.ts index 336d45fed66..f5fd9b19f72 100644 --- a/src/data/abilities/ability.ts +++ b/src/data/abilities/ability.ts @@ -5491,7 +5491,7 @@ export class PostFaintContactDamageAbAttr extends PostFaintAbAttr { * Attribute used for abilities that damage opponents causing the user to faint * equal to the amount of damage the last attack inflicted. * - * Used for {@linkcode Abilities.INNARDS_OUT}. + * Used for {@linkcode AbilityId.INNARDS_OUT | Innards Out}. * @sealed */ export class PostFaintHPDamageAbAttr extends PostFaintAbAttr { @@ -7307,7 +7307,7 @@ export function initAbilities() { .attr(HealFromBerryUseAbAttr, 1 / 3), new Ability(AbilityId.PROTEAN, 6) .attr(PokemonTypeChangeAbAttr) - // .condition((p) => !p.summonData.abilitiesApplied.includes(Abilities.PROTEAN)) //Gen 9 Implementation + // .condition((p) => !p.summonData.abilitiesApplied.includes(AbilityId.PROTEAN)) //Gen 9 Implementation // TODO: needs testing on interaction with weather blockage .edgeCase(), new Ability(AbilityId.FUR_COAT, 6) @@ -7566,7 +7566,7 @@ export function initAbilities() { .attr(PostSummonStatStageChangeAbAttr, [ Stat.DEF ], 1, true), new Ability(AbilityId.LIBERO, 8) .attr(PokemonTypeChangeAbAttr) - //.condition((p) => !p.summonData.abilitiesApplied.includes(Abilities.LIBERO)), //Gen 9 Implementation + //.condition((p) => !p.summonData.abilitiesApplied.includes(AbilityId.LIBERO)), //Gen 9 Implementation // TODO: needs testing on interaction with weather blockage .edgeCase(), new Ability(AbilityId.BALL_FETCH, 8) diff --git a/src/data/balance/egg-moves.ts b/src/data/balance/egg-moves.ts index 3475fe4fdea..e936afcdc08 100644 --- a/src/data/balance/egg-moves.ts +++ b/src/data/balance/egg-moves.ts @@ -15,7 +15,7 @@ export const speciesEggMoves = { [SpeciesId.SPEAROW]: [ MoveId.FLOATY_FALL, MoveId.EXTREME_SPEED, MoveId.KNOCK_OFF, MoveId.TRIPLE_ARROWS ], [SpeciesId.EKANS]: [ MoveId.NOXIOUS_TORQUE, MoveId.DRAGON_DANCE, MoveId.SLACK_OFF, MoveId.SHED_TAIL ], [SpeciesId.SANDSHREW]: [ MoveId.HIGH_HORSEPOWER, MoveId.DIRE_CLAW, MoveId.SHORE_UP, MoveId.MIGHTY_CLEAVE ], - [SpeciesId.NIDORAN_F]: [ MoveId.CALM_MIND, MoveId.MOONLIGHT, MoveId.MALIGNANT_CHAIN, MoveId.SANDSEAR_STORM ], + [SpeciesId.NIDORAN_F]: [ MoveId.BANEFUL_BUNKER, MoveId.MOONLIGHT, MoveId.BARB_BARRAGE, MoveId.THOUSAND_WAVES ], [SpeciesId.NIDORAN_M]: [ MoveId.DRAGON_DANCE, MoveId.MOUNTAIN_GALE, MoveId.NOXIOUS_TORQUE, MoveId.PRECIPICE_BLADES ], [SpeciesId.VULPIX]: [ MoveId.MOONBLAST, MoveId.INFERNAL_PARADE, MoveId.MORNING_SUN, MoveId.TAIL_GLOW ], [SpeciesId.ZUBAT]: [ MoveId.FLOATY_FALL, MoveId.DIRE_CLAW, MoveId.SWORDS_DANCE, MoveId.COLLISION_COURSE ], @@ -293,7 +293,7 @@ export const speciesEggMoves = { [SpeciesId.ARCHEN]: [ MoveId.ROOST, MoveId.EARTHQUAKE, MoveId.FLOATY_FALL, MoveId.MIGHTY_CLEAVE ], [SpeciesId.TRUBBISH]: [ MoveId.COIL, MoveId.RECOVER, MoveId.DIRE_CLAW, MoveId.GIGATON_HAMMER ], [SpeciesId.ZORUA]: [ MoveId.MALIGNANT_CHAIN, MoveId.MOONBLAST, MoveId.SECRET_SWORD, MoveId.FIERY_WRATH ], - [SpeciesId.MINCCINO]: [ MoveId.ICICLE_SPEAR, MoveId.TIDY_UP, MoveId.KNOCK_OFF, MoveId.POPULATION_BOMB ], + [SpeciesId.MINCCINO]: [ MoveId.ICICLE_SPEAR, MoveId.TIDY_UP, MoveId.LOW_KICK, MoveId.POPULATION_BOMB ], [SpeciesId.GOTHITA]: [ MoveId.RECOVER, MoveId.MOONBLAST, MoveId.AURA_SPHERE, MoveId.LUMINA_CRASH ], [SpeciesId.SOLOSIS]: [ MoveId.MIST_BALL, MoveId.SPEED_SWAP, MoveId.FLAMETHROWER, MoveId.LIGHT_OF_RUIN ], [SpeciesId.DUCKLETT]: [ MoveId.SPLISHY_SPLASH, MoveId.SANDSEAR_STORM, MoveId.WILDBOLT_STORM, MoveId.QUIVER_DANCE ], @@ -310,7 +310,7 @@ export const speciesEggMoves = { [SpeciesId.TYNAMO]: [ MoveId.SCALD, MoveId.STRENGTH_SAP, MoveId.FIRE_LASH, MoveId.AURA_WHEEL ], [SpeciesId.ELGYEM]: [ MoveId.THUNDERCLAP, MoveId.BADDY_BAD, MoveId.AURA_SPHERE, MoveId.PHOTON_GEYSER ], [SpeciesId.LITWICK]: [ MoveId.GIGA_DRAIN, MoveId.EARTH_POWER, MoveId.MOONBLAST, MoveId.TORCH_SONG ], - [SpeciesId.AXEW]: [ MoveId.STONE_AXE, MoveId.DIRE_CLAW, MoveId.BITTER_BLADE, MoveId.GLAIVE_RUSH ], + [SpeciesId.AXEW]: [ MoveId.STONE_AXE, MoveId.DIRE_CLAW, MoveId.RAGING_FURY, MoveId.BITTER_BLADE ], [SpeciesId.CUBCHOO]: [ MoveId.MOUNTAIN_GALE, MoveId.AQUA_STEP, MoveId.ICE_SHARD, MoveId.COLLISION_COURSE ], [SpeciesId.CRYOGONAL]: [ MoveId.FREEZING_GLARE, MoveId.AURORA_VEIL, MoveId.NASTY_PLOT, MoveId.ORIGIN_PULSE ], [SpeciesId.SHELMET]: [ MoveId.POWER_GEM, MoveId.NASTY_PLOT, MoveId.EARTH_POWER, MoveId.STEAM_ERUPTION ], @@ -448,7 +448,7 @@ export const speciesEggMoves = { [SpeciesId.ROOKIDEE]: [ MoveId.ROOST, MoveId.BODY_PRESS, MoveId.KINGS_SHIELD, MoveId.BEHEMOTH_BASH ], [SpeciesId.BLIPBUG]: [ MoveId.HEAL_ORDER, MoveId.LUSTER_PURGE, MoveId.SLEEP_POWDER, MoveId.TAIL_GLOW ], [SpeciesId.NICKIT]: [ MoveId.BADDY_BAD, MoveId.MYSTICAL_FIRE, MoveId.SPARKLY_SWIRL, MoveId.MAKE_IT_RAIN ], - [SpeciesId.GOSSIFLEUR]: [ MoveId.PARTING_SHOT, MoveId.STRENGTH_SAP, MoveId.SAPPY_SEED, MoveId.SEED_FLARE ], + [SpeciesId.GOSSIFLEUR]: [ MoveId.BATON_PASS, MoveId.TAILWIND, MoveId.SAPPY_SEED, MoveId.SPORE ], [SpeciesId.WOOLOO]: [ MoveId.NUZZLE, MoveId.MILK_DRINK, MoveId.BODY_PRESS, MoveId.MULTI_ATTACK ], [SpeciesId.CHEWTLE]: [ MoveId.ICE_FANG, MoveId.PSYCHIC_FANGS, MoveId.SHELL_SMASH, MoveId.MIGHTY_CLEAVE ], [SpeciesId.YAMPER]: [ MoveId.ICE_FANG, MoveId.SWORDS_DANCE, MoveId.THUNDER_FANG, MoveId.BOLT_STRIKE ], @@ -514,7 +514,7 @@ export const speciesEggMoves = { [SpeciesId.TAROUNTULA]: [ MoveId.STONE_AXE, MoveId.LEECH_LIFE, MoveId.FAKE_OUT, MoveId.SPORE ], [SpeciesId.NYMBLE]: [ MoveId.KNOCK_OFF, MoveId.FELL_STINGER, MoveId.ATTACK_ORDER, MoveId.WICKED_BLOW ], [SpeciesId.PAWMI]: [ MoveId.DRAIN_PUNCH, MoveId.METEOR_MASH, MoveId.JET_PUNCH, MoveId.PLASMA_FISTS ], - [SpeciesId.TANDEMAUS]: [ MoveId.BATON_PASS, MoveId.COVET, MoveId.SIZZLY_SLIDE, MoveId.REVIVAL_BLESSING ], + [SpeciesId.TANDEMAUS]: [ MoveId.BATON_PASS, MoveId.FAKE_OUT, MoveId.POWER_UP_PUNCH, MoveId.REVIVAL_BLESSING ], [SpeciesId.FIDOUGH]: [ MoveId.SOFT_BOILED, MoveId.HIGH_HORSEPOWER, MoveId.SIZZLY_SLIDE, MoveId.TIDY_UP ], [SpeciesId.SMOLIV]: [ MoveId.STRENGTH_SAP, MoveId.EARTH_POWER, MoveId.CALM_MIND, MoveId.BOOMBURST ], [SpeciesId.SQUAWKABILLY]: [ MoveId.PARTING_SHOT, MoveId.EARTHQUAKE, MoveId.FLARE_BLITZ, MoveId.EXTREME_SPEED ], diff --git a/src/data/balance/passives.ts b/src/data/balance/passives.ts index 0a76b3036b9..64fa9b87138 100644 --- a/src/data/balance/passives.ts +++ b/src/data/balance/passives.ts @@ -36,9 +36,9 @@ export const starterPassiveAbilities: StarterPassiveAbilities = { [SpeciesId.ARBOK]: { 0: AbilityId.REGENERATOR }, [SpeciesId.SANDSHREW]: { 0: AbilityId.TOUGH_CLAWS }, [SpeciesId.SANDSLASH]: { 0: AbilityId.TOUGH_CLAWS }, - [SpeciesId.NIDORAN_F]: { 0: AbilityId.FLARE_BOOST }, - [SpeciesId.NIDORINA]: { 0: AbilityId.FLARE_BOOST }, - [SpeciesId.NIDOQUEEN]: { 0: AbilityId.FLARE_BOOST }, + [SpeciesId.NIDORAN_F]: { 0: AbilityId.TOXIC_DEBRIS }, + [SpeciesId.NIDORINA]: { 0: AbilityId.TOXIC_DEBRIS }, + [SpeciesId.NIDOQUEEN]: { 0: AbilityId.TOXIC_DEBRIS }, [SpeciesId.NIDORAN_M]: { 0: AbilityId.GUTS }, [SpeciesId.NIDORINO]: { 0: AbilityId.GUTS }, [SpeciesId.NIDOKING]: { 0: AbilityId.GUTS }, @@ -220,8 +220,8 @@ export const starterPassiveAbilities: StarterPassiveAbilities = { [SpeciesId.YANMEGA]: { 0: AbilityId.SHEER_FORCE }, [SpeciesId.WOOPER]: { 0: AbilityId.WATER_VEIL }, [SpeciesId.QUAGSIRE]: { 0: AbilityId.COMATOSE }, - [SpeciesId.MURKROW]: { 0: AbilityId.DARK_AURA }, - [SpeciesId.HONCHKROW]: { 0: AbilityId.DARK_AURA }, + [SpeciesId.MURKROW]: { 0: AbilityId.UNNERVE }, + [SpeciesId.HONCHKROW]: { 0: AbilityId.INTIMIDATE }, [SpeciesId.MISDREAVUS]: { 0: AbilityId.BEADS_OF_RUIN }, [SpeciesId.MISMAGIUS]: { 0: AbilityId.BEADS_OF_RUIN }, [SpeciesId.UNOWN]: { 0: AbilityId.ADAPTABILITY, 1: AbilityId.BEAST_BOOST, 2: AbilityId.CONTRARY, 3: AbilityId.DAZZLING, 4: AbilityId.EMERGENCY_EXIT, 5: AbilityId.FRIEND_GUARD, 6: AbilityId.GOOD_AS_GOLD, 7: AbilityId.HONEY_GATHER, 8: AbilityId.IMPOSTER, 9: AbilityId.JUSTIFIED, 10: AbilityId.KLUTZ, 11: AbilityId.LIBERO, 12: AbilityId.MOODY, 13: AbilityId.NEUTRALIZING_GAS, 14: AbilityId.OPPORTUNIST, 15: AbilityId.PICKUP, 16: AbilityId.QUICK_DRAW, 17: AbilityId.RUN_AWAY, 18: AbilityId.SIMPLE, 19: AbilityId.TRACE, 20: AbilityId.UNNERVE, 21: AbilityId.VICTORY_STAR, 22: AbilityId.WANDERING_SPIRIT, 23: AbilityId.FAIRY_AURA, 24: AbilityId.DARK_AURA, 25: AbilityId.AURA_BREAK, 26: AbilityId.PURE_POWER, 27: AbilityId.UNAWARE }, @@ -391,7 +391,7 @@ export const starterPassiveAbilities: StarterPassiveAbilities = { [SpeciesId.BANETTE]: { 0: AbilityId.SHADOW_SHIELD, 1: AbilityId.SHADOW_SHIELD }, [SpeciesId.DUSKULL]: { 0: AbilityId.UNNERVE }, [SpeciesId.DUSCLOPS]: { 0: AbilityId.UNNERVE }, - [SpeciesId.DUSKNOIR]: { 0: AbilityId.UNNERVE }, + [SpeciesId.DUSKNOIR]: { 0: AbilityId.LEVITATE }, [SpeciesId.TROPIUS]: { 0: AbilityId.RIPEN }, [SpeciesId.ABSOL]: { 0: AbilityId.SHARPNESS, 1: AbilityId.SHARPNESS }, [SpeciesId.WYNAUT]: { 0: AbilityId.STURDY }, @@ -640,9 +640,9 @@ export const starterPassiveAbilities: StarterPassiveAbilities = { [SpeciesId.LITWICK]: { 0: AbilityId.SHADOW_TAG }, [SpeciesId.LAMPENT]: { 0: AbilityId.SHADOW_TAG }, [SpeciesId.CHANDELURE]: { 0: AbilityId.SHADOW_TAG }, - [SpeciesId.AXEW]: { 0: AbilityId.DRAGONS_MAW }, - [SpeciesId.FRAXURE]: { 0: AbilityId.DRAGONS_MAW }, - [SpeciesId.HAXORUS]: { 0: AbilityId.DRAGONS_MAW }, + [SpeciesId.AXEW]: { 0: AbilityId.OWN_TEMPO }, + [SpeciesId.FRAXURE]: { 0: AbilityId.OWN_TEMPO }, + [SpeciesId.HAXORUS]: { 0: AbilityId.OWN_TEMPO }, [SpeciesId.CUBCHOO]: { 0: AbilityId.FUR_COAT }, [SpeciesId.BEARTIC]: { 0: AbilityId.FUR_COAT }, [SpeciesId.CRYOGONAL]: { 0: AbilityId.SNOW_WARNING }, @@ -827,7 +827,7 @@ export const starterPassiveAbilities: StarterPassiveAbilities = { [SpeciesId.TAPU_LELE]: { 0: AbilityId.BERSERK }, [SpeciesId.TAPU_BULU]: { 0: AbilityId.FLOWER_VEIL }, [SpeciesId.TAPU_FINI]: { 0: AbilityId.FAIRY_AURA }, - [SpeciesId.COSMOG]: { 0: AbilityId.PICKUP }, + [SpeciesId.COSMOG]: { 0: AbilityId.POWER_SPOT }, [SpeciesId.COSMOEM]: { 0: AbilityId.POWER_SPOT }, [SpeciesId.SOLGALEO]: { 0: AbilityId.BEAST_BOOST }, [SpeciesId.LUNALA]: { 0: AbilityId.BEAST_BOOST }, @@ -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/balance/signature-species.ts b/src/data/balance/signature-species.ts index fba91f6fe3d..557bcdfed16 100644 --- a/src/data/balance/signature-species.ts +++ b/src/data/balance/signature-species.ts @@ -30,7 +30,7 @@ export const signatureSpecies: SignatureSpecies = new Proxy({ FALKNER: [SpeciesId.PIDGEY, SpeciesId.HOOTHOOT, SpeciesId.NATU, SpeciesId.MURKROW], BUGSY: [SpeciesId.SCYTHER, SpeciesId.SHUCKLE, SpeciesId.YANMA, [SpeciesId.PINSIR, SpeciesId.HERACROSS]], 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], JASMINE: [SpeciesId.STEELIX, SpeciesId.MAGNEMITE, SpeciesId.PINECO, SpeciesId.SKARMORY], PRYCE: [SpeciesId.SWINUB, SpeciesId.SEEL, SpeciesId.SHELLDER, SpeciesId.SNEASEL], diff --git a/src/data/balance/starters.ts b/src/data/balance/starters.ts index 8b91c12ae2d..99d5ad62e47 100644 --- a/src/data/balance/starters.ts +++ b/src/data/balance/starters.ts @@ -566,7 +566,7 @@ export const speciesStarterCosts = { [SpeciesId.FLITTLE]: 3, [SpeciesId.TINKATINK]: 4, [SpeciesId.WIGLETT]: 2, - [SpeciesId.BOMBIRDIER]: 3, + [SpeciesId.BOMBIRDIER]: 4, [SpeciesId.FINIZEN]: 3, [SpeciesId.VAROOM]: 4, [SpeciesId.CYCLIZAR]: 4, diff --git a/src/data/trainers/trainer-config.ts b/src/data/trainers/trainer-config.ts index 5739492f96e..d29b40e0972 100644 --- a/src/data/trainers/trainer-config.ts +++ b/src/data/trainers/trainer-config.ts @@ -223,9 +223,8 @@ export class TrainerConfig { case TrainerType.LARRY_ELITE: trainerType = TrainerType.LARRY; break; - case TrainerType.ROCKET_BOSS_GIOVANNI_1: case TrainerType.ROCKET_BOSS_GIOVANNI_2: - trainerType = TrainerType.GIOVANNI; + trainerType = TrainerType.ROCKET_BOSS_GIOVANNI_1; break; case TrainerType.MAXIE_2: trainerType = TrainerType.MAXIE; @@ -895,7 +894,7 @@ export class TrainerConfig { /** * Helper function to check if a specialty type is set - * @returns true if specialtyType is defined and not Type.UNKNOWN + * @returns `true` if `specialtyType` is defined and not {@link PokemonType.UNKNOWN} */ hasSpecialtyType(): boolean { return !isNullOrUndefined(this.specialtyType) && this.specialtyType !== PokemonType.UNKNOWN; @@ -1593,9 +1592,9 @@ export const trainerConfigs: TrainerConfigs = { .setSpeciesFilter(s => tmSpecies[MoveId.FLY].indexOf(s.speciesId) > -1), [TrainerType.POKEFAN]: new TrainerConfig(++t) .setMoneyMultiplier(1.4) - .setName("PokéFan") - .setHasGenders("PokéFan Female") - .setHasDouble("PokéFan Family") + .setName("Pokéfan") + .setHasGenders("Pokéfan Female") + .setHasDouble("Pokéfan Family") .setEncounterBgm(TrainerType.POKEFAN) .setPartyTemplates( trainerPartyTemplates.SIX_WEAKER, @@ -2562,7 +2561,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 +2581,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 +2601,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 +2621,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 +2641,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), ]; }), @@ -3791,27 +3790,28 @@ export const trainerConfigs: TrainerConfigs = { .setDoubleTrainerType(TrainerType.RED) .setDoubleTitle("champion_double") .setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.ALAKAZAM])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.MACHAMP])) .setPartyMemberFunc( - 2, - getRandomPartyMemberFunc([SpeciesId.HO_OH], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - }), - ) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.RHYPERIOR, SpeciesId.ELECTIVIRE])) - .setPartyMemberFunc( - 4, + 1, getRandomPartyMemberFunc( [SpeciesId.ARCANINE, SpeciesId.EXEGGUTOR, SpeciesId.GYARADOS], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); - p.setBoss(true, 2); + p.teraType = p.species.type1; }, ), ) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.RHYPERIOR, SpeciesId.ELECTIVIRE])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.MACHAMP])) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([SpeciesId.HO_OH], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + p.abilityIndex = 2; // Regenerator + }), + ) .setPartyMemberFunc( 5, getRandomPartyMemberFunc([SpeciesId.PIDGEOT], TrainerSlot.TRAINER, true, p => { @@ -3819,9 +3819,10 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.generateName(); p.gender = Gender.MALE; + p.setBoss(true, 2); }), ) - .setInstantTera(3), // Tera Ground or Rock Rhyperior / Electric Electivire / Fire Magmortar + .setInstantTera(2), // Tera Fire Arcanine, Tera Grass Exeggutor, Tera Water Gyarados [TrainerType.RED]: new TrainerConfig(++t) .initForChampion(true) .setBattleBgm("battle_johto_champion") @@ -3832,26 +3833,24 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc( 0, getRandomPartyMemberFunc([SpeciesId.PIKACHU], TrainerSlot.TRAINER, true, p => { - p.formIndex = 8; // G-Max Pikachu - p.generateAndPopulateMoveset(); - p.generateName(); + p.formIndex = 1; // Partner Pikachu p.gender = Gender.MALE; + p.generateAndPopulateMoveset(); + if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === MoveId.VOLT_TACKLE)) { + // Check if Volt Tackle is in the moveset, if not, replace the first move with Volt Tackle. + p.moveset[0] = new PokemonMove(MoveId.VOLT_TACKLE); + } }), ) - .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( - 2, + 4, getRandomPartyMemberFunc([SpeciesId.LUGIA], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); 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); + p.abilityIndex = 2; // Multiscale }), ) .setPartyMemberFunc( @@ -3865,10 +3864,11 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.generateName(); p.gender = Gender.MALE; + p.setBoss(true, 2); }, ), ) - .setInstantTera(3), // Tera Grass Meganium / Fire Typhlosion / Water Feraligatr + .setInstantTera(0), // Tera Electric Pikachu [TrainerType.LANCE_CHAMPION]: new TrainerConfig(++t) .setName("Lance") .initForChampion(true) @@ -3876,37 +3876,38 @@ export const trainerConfigs: TrainerConfigs = { .setMixedBattleBgm("battle_johto_champion") .setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.GYARADOS, SpeciesId.KINGDRA])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.AERODACTYL])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.CHARIZARD])) .setPartyMemberFunc( - 2, + 3, + getRandomPartyMemberFunc( + [SpeciesId.TYRANITAR, SpeciesId.GARCHOMP, SpeciesId.HYDREIGON], + TrainerSlot.TRAINER, + true, + p => { + p.abilityIndex = 2; // Unnerve Tyranitar, Rough Skin Garchomp, Levitate Hydreigon + p.generateAndPopulateMoveset(); + }, + ), + ) + .setPartyMemberFunc( + 4, getRandomPartyMemberFunc([SpeciesId.SALAMENCE], TrainerSlot.TRAINER, true, p => { p.formIndex = 1; // Mega Salamence p.generateAndPopulateMoveset(); 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( 5, getRandomPartyMemberFunc([SpeciesId.DRAGONITE], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); + p.abilityIndex = 2; // Multiscale p.gender = Gender.MALE; 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) .initForChampion(true) .setBattleBgm("battle_hoenn_champion_g5") @@ -3914,16 +3915,22 @@ export const trainerConfigs: TrainerConfigs = { .setHasDouble("steven_wallace_double") .setDoubleTrainerType(TrainerType.WALLACE) .setDoubleTitle("champion_double") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.SKARMORY])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.CRADILY, SpeciesId.ARMALDO])) .setPartyMemberFunc( - 2, - getRandomPartyMemberFunc([SpeciesId.AGGRON], TrainerSlot.TRAINER, true, p => { + 0, + getRandomPartyMemberFunc([SpeciesId.GIGALITH], TrainerSlot.TRAINER, true, p => { + p.abilityIndex = 1; // Sand Stream + p.generateAndPopulateMoveset(); + }), + ) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.SKARMORY, SpeciesId.CLAYDOL])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.AGGRON])) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([SpeciesId.GOLURK, SpeciesId.RUNERIGUS], TrainerSlot.TRAINER, true, p => { + p.abilityIndex = 0; // Iron Fist Golurk, Wandering Spirit Runerigus p.generateAndPopulateMoveset(); - p.setBoss(true, 2); }), ) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.GOLURK, SpeciesId.RUNERIGUS])) .setPartyMemberFunc( 4, getRandomPartyMemberFunc( @@ -3942,6 +3949,7 @@ export const trainerConfigs: TrainerConfigs = { p.formIndex = 1; // Mega Metagross p.generateAndPopulateMoveset(); p.generateName(); + p.setBoss(true, 2); }), ) .setInstantTera(4), // Tera Rock Regirock / Ice Regice / Steel Registeel @@ -3959,22 +3967,34 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); }), ) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.LUDICOLO])) .setPartyMemberFunc( - 2, - getRandomPartyMemberFunc([SpeciesId.LATIAS, SpeciesId.LATIOS], TrainerSlot.TRAINER, true, p => { - p.formIndex = 1; // Mega Latios or Mega Latias + 1, + getRandomPartyMemberFunc([SpeciesId.LUDICOLO], TrainerSlot.TRAINER, true, p => { + p.abilityIndex = 0; // Swift Swim p.generateAndPopulateMoveset(); - p.generateName(); - p.pokeball = PokeballType.MASTER_BALL; }), ) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.SWAMPERT, SpeciesId.GASTRODON, SpeciesId.SEISMITOAD])) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([SpeciesId.TENTACRUEL, SpeciesId.WALREIN], TrainerSlot.TRAINER, true, p => { + p.abilityIndex = p.species.speciesId === SpeciesId.TENTACRUEL ? 2 : 0; // Rain Dish Tentacruel, Thick Fat Walrein + p.generateAndPopulateMoveset(); + }), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([SpeciesId.LATIAS, SpeciesId.LATIOS], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.generateName(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) .setPartyMemberFunc( 4, - getRandomPartyMemberFunc([SpeciesId.REGIELEKI, SpeciesId.REGIDRAGO], TrainerSlot.TRAINER, true, p => { + getRandomPartyMemberFunc([SpeciesId.SWAMPERT], TrainerSlot.TRAINER, true, p => { + p.formIndex = 1; // Mega Swampert p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; + p.generateName(); }), ) .setPartyMemberFunc( @@ -3985,22 +4005,14 @@ export const trainerConfigs: TrainerConfigs = { p.setBoss(true, 2); }), ) - .setInstantTera(4), // Tera Electric Regieleki / Dragon Regidrago + .setInstantTera(5), // Tera Water Milotic [TrainerType.CYNTHIA]: new TrainerConfig(++t) .initForChampion(false) .setBattleBgm("battle_sinnoh_champion") .setMixedBattleBgm("battle_sinnoh_champion") .setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.SPIRITOMB])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.LUCARIO])) .setPartyMemberFunc( - 2, - getRandomPartyMemberFunc([SpeciesId.GIRATINA], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - }), - ) - .setPartyMemberFunc( - 3, + 1, getRandomPartyMemberFunc( [SpeciesId.MILOTIC, SpeciesId.ROSERADE, SpeciesId.HISUI_ARCANINE], TrainerSlot.TRAINER, @@ -4011,11 +4023,13 @@ export const trainerConfigs: TrainerConfigs = { }, ), ) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.TOGEKISS])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.LUCARIO])) .setPartyMemberFunc( 4, - getRandomPartyMemberFunc([SpeciesId.TOGEKISS], TrainerSlot.TRAINER, true, p => { + getRandomPartyMemberFunc([SpeciesId.GIRATINA], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); - p.setBoss(true, 2); + p.pokeball = PokeballType.MASTER_BALL; }), ) .setPartyMemberFunc( @@ -4025,9 +4039,10 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.generateName(); 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) .initForChampion(true) .setHasDouble("alder_iris_double") @@ -4050,29 +4065,26 @@ export const trainerConfigs: TrainerConfigs = { ) .setPartyMemberFunc( 2, - getRandomPartyMemberFunc([SpeciesId.ZEKROM], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - }), + getRandomPartyMemberFunc([SpeciesId.CHANDELURE, SpeciesId.KROOKODILE, SpeciesId.REUNICLUS, SpeciesId.CONKELDURR]), ) .setPartyMemberFunc( 3, getRandomPartyMemberFunc([SpeciesId.KELDEO], TrainerSlot.TRAINER, true, p => { + p.pokeball = PokeballType.ROGUE_BALL; p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_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 third move with Secret Sword. + p.moveset[2] = new PokemonMove(MoveId.SECRET_SWORD); + } + p.formIndex = 1; // Resolute Form }), ) .setPartyMemberFunc( 4, - getRandomPartyMemberFunc( - [SpeciesId.CHANDELURE, SpeciesId.KROOKODILE, SpeciesId.REUNICLUS, SpeciesId.CONKELDURR], - TrainerSlot.TRAINER, - true, - p => { - p.generateAndPopulateMoveset(); - p.teraType = p.species.speciesId === SpeciesId.KROOKODILE ? PokemonType.DARK : p.species.type1; - }, - ), + getRandomPartyMemberFunc([SpeciesId.ZEKROM], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), ) .setPartyMemberFunc( 5, @@ -4080,9 +4092,10 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.gender = Gender.MALE; 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) .initForChampion(false) .setBattleBgm("battle_champion_iris") @@ -4091,34 +4104,29 @@ export const trainerConfigs: TrainerConfigs = { .setDoubleTrainerType(TrainerType.ALDER) .setDoubleTitle("champion_double") .setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.DRUDDIGON])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.ARCHEOPS])) .setPartyMemberFunc( - 2, - getRandomPartyMemberFunc([SpeciesId.RESHIRAM], TrainerSlot.TRAINER, true, p => { + 1, + getRandomPartyMemberFunc([SpeciesId.ARCHEOPS], TrainerSlot.TRAINER, true, p => { + p.abilityIndex = 2; // Emergency Exit p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; }), ) .setPartyMemberFunc( - 3, - getRandomPartyMemberFunc( - [SpeciesId.SALAMENCE, SpeciesId.HYDREIGON, SpeciesId.ARCHALUDON], - TrainerSlot.TRAINER, - true, - p => { - p.generateAndPopulateMoveset(); - p.teraType = PokemonType.DRAGON; - }, - ), - ) - .setPartyMemberFunc( - 4, + 2, getRandomPartyMemberFunc([SpeciesId.LAPRAS], TrainerSlot.TRAINER, true, p => { p.formIndex = 1; // G-Max Lapras p.generateAndPopulateMoveset(); p.generateName(); }), ) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.AGGRON, SpeciesId.HYDREIGON, SpeciesId.ARCHALUDON])) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([SpeciesId.RESHIRAM], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ) .setPartyMemberFunc( 5, getRandomPartyMemberFunc([SpeciesId.HAXORUS], TrainerSlot.TRAINER, true, p => { @@ -4128,37 +4136,32 @@ export const trainerConfigs: TrainerConfigs = { p.setBoss(true, 2); }), ) - .setInstantTera(3), // Tera Dragon Salamence / Hydreigon / Archaludon + .setInstantTera(5), // Tera Dragon Haxorus [TrainerType.DIANTHA]: new TrainerConfig(++t) .initForChampion(false) .setMixedBattleBgm("battle_kalos_champion") + .setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.HAWLUCHA])) .setPartyMemberFunc( - 0, - getRandomPartyMemberFunc([SpeciesId.HAWLUCHA], TrainerSlot.TRAINER, true, p => { + 1, + getRandomPartyMemberFunc([SpeciesId.TREVENANT, SpeciesId.GOURGEIST], TrainerSlot.TRAINER, true, p => { + p.abilityIndex = 2; // Harvest Trevenant, Insomnia Gourgeist p.generateAndPopulateMoveset(); }), ) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.TREVENANT, SpeciesId.GOURGEIST])) .setPartyMemberFunc( 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 => { p.generateAndPopulateMoveset(); p.abilityIndex = 2; // Rock Head Tyrantrum, Snow Warning Aurorus p.teraType = p.species.type2!; }), ) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.GOODRA])) .setPartyMemberFunc( 4, - getRandomPartyMemberFunc([SpeciesId.GOODRA], TrainerSlot.TRAINER, true, p => { + getRandomPartyMemberFunc([SpeciesId.XERNEAS], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); - p.setBoss(true, 2); + p.pokeball = PokeballType.MASTER_BALL; }), ) .setPartyMemberFunc( @@ -4168,9 +4171,10 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.generateName(); p.gender = Gender.FEMALE; + p.setBoss(true, 2); }), ) - .setInstantTera(3), // Tera Dragon Tyrantrum / Ice Aurorus + .setInstantTera(2), // Tera Dragon Tyrantrum / Ice Aurorus [TrainerType.KUKUI]: new TrainerConfig(++t) .initForChampion(true) .setMixedBattleBgm("battle_champion_kukui") @@ -4181,7 +4185,13 @@ export const trainerConfigs: TrainerConfigs = { 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( 2, getRandomPartyMemberFunc( @@ -4191,16 +4201,16 @@ export const trainerConfigs: TrainerConfigs = { p => { p.formIndex = 1; // Therian Formes p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; + p.pokeball = PokeballType.ROGUE_BALL; }, ), ) .setPartyMemberFunc( 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.setBoss(true, 2); p.pokeball = PokeballType.ULTRA_BALL; + p.abilityIndex = 0; // Psychic / Misty Surge }), ) .setPartyMemberFunc( @@ -4216,6 +4226,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.gender = Gender.MALE; p.teraType = p.species.type2!; + p.setBoss(true, 2); }), ) .setInstantTera(5), // Tera Dark Incineroar / Fighting Hisuian Decidueye @@ -4223,28 +4234,33 @@ export const trainerConfigs: TrainerConfigs = { .initForChampion(true) .setMixedBattleBgm("battle_alola_champion") .setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.ALOLA_RAICHU])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.NOIVERN])) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([SpeciesId.NOIVERN], TrainerSlot.TRAINER, true, p => { + p.abilityIndex = 1; // Infiltrator + p.generateAndPopulateMoveset(); + }), + ) .setPartyMemberFunc( 2, - getRandomPartyMemberFunc([SpeciesId.SOLGALEO], TrainerSlot.TRAINER, true, p => { + getRandomPartyMemberFunc([SpeciesId.BLACEPHALON, SpeciesId.STAKATAKA], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; + p.pokeball = PokeballType.ROGUE_BALL; }), ) .setPartyMemberFunc( 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.pokeball = PokeballType.ULTRA_BALL; - p.teraType = p.species.type1; + p.abilityIndex = 0; // Electric / Grassy Surge }), ) .setPartyMemberFunc( 4, - getRandomPartyMemberFunc([SpeciesId.ZYGARDE], TrainerSlot.TRAINER, true, p => { - p.formIndex = 1; // Zygarde 10% forme, Aura Break + getRandomPartyMemberFunc([SpeciesId.SOLGALEO], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ROGUE_BALL; + p.pokeball = PokeballType.MASTER_BALL; }), ) .setPartyMemberFunc( @@ -4253,34 +4269,35 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.setBoss(true, 2); 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) .initForChampion(true) .setMixedBattleBgm("battle_galar_champion") .setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.AEGISLASH])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.RHYPERIOR, SpeciesId.SEISMITOAD, SpeciesId.MR_RIME])) .setPartyMemberFunc( - 2, + 1, + getRandomPartyMemberFunc( + [SpeciesId.RHYPERIOR, SpeciesId.SEISMITOAD, SpeciesId.MR_RIME], + TrainerSlot.TRAINER, + true, + p => { + p.abilityIndex = 1; // Solid Rock Rhyperior, Poison Touch Seismitoad, Screen Cleaner Mr. Rime + p.generateAndPopulateMoveset(); + }, + ), + ) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.DRAGAPULT])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.RILLABOOM, SpeciesId.CINDERACE, SpeciesId.INTELEON])) + .setPartyMemberFunc( + 4, getRandomPartyMemberFunc([SpeciesId.ZACIAN], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); 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( 5, getRandomPartyMemberFunc([SpeciesId.CHARIZARD], TrainerSlot.TRAINER, true, p => { @@ -4288,22 +4305,23 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.generateName(); 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) .initForChampion(true) .setMixedBattleBgm("battle_mustard") .setPartyMemberFunc( 0, - getRandomPartyMemberFunc([SpeciesId.CORVIKNIGHT], TrainerSlot.TRAINER, true, p => { + getRandomPartyMemberFunc([SpeciesId.MIENSHAO], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; }), ) .setPartyMemberFunc( 1, - getRandomPartyMemberFunc([SpeciesId.KOMMO_O], TrainerSlot.TRAINER, true, p => { + getRandomPartyMemberFunc([SpeciesId.CORVIKNIGHT], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; }), @@ -4312,36 +4330,46 @@ export const trainerConfigs: TrainerConfigs = { 2, getRandomPartyMemberFunc([SpeciesId.GALAR_SLOWBRO, SpeciesId.GALAR_SLOWKING], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); + p.abilityIndex = p.species.speciesId === SpeciesId.GALAR_SLOWBRO ? 0 : 2; // Quick Draw Galar Slowbro, Regenerator Galar Slowking p.pokeball = PokeballType.ULTRA_BALL; - p.teraType = p.species.type1; }), ) .setPartyMemberFunc( 3, - getRandomPartyMemberFunc([SpeciesId.GALAR_DARMANITAN], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); + getRandomPartyMemberFunc([SpeciesId.VENUSAUR, SpeciesId.BLASTOISE], TrainerSlot.TRAINER, true, p => { p.pokeball = PokeballType.ULTRA_BALL; }), ) .setPartyMemberFunc( 4, - getRandomPartyMemberFunc([SpeciesId.BLASTOISE, SpeciesId.VENUSAUR], TrainerSlot.TRAINER, true, p => { + getRandomPartyMemberFunc([SpeciesId.KOMMO_O], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); - p.setBoss(true, 2); p.pokeball = PokeballType.ULTRA_BALL; + p.generateAndPopulateMoveset(); }), ) .setPartyMemberFunc( 5, getRandomPartyMemberFunc([SpeciesId.URSHIFU], TrainerSlot.TRAINER, true, p => { - p.formIndex = randSeedIntRange(2, 3); // Random G-Max Urshifu - p.generateAndPopulateMoveset(); + p.formIndex = randSeedIntRange(2, 3); // Random G-Max Urshifu form p.generateName(); p.gender = Gender.MALE; p.pokeball = PokeballType.ULTRA_BALL; + p.setBoss(true, 2); + if (p.formIndex === 2) { + p.moveset[0] = new PokemonMove(MoveId.WICKED_BLOW); + p.moveset[1] = new PokemonMove(MoveId.BRICK_BREAK); + p.moveset[2] = new PokemonMove(randSeedItem([MoveId.FIRE_PUNCH, MoveId.THUNDER_PUNCH, MoveId.ICE_PUNCH])); + p.moveset[3] = new PokemonMove(MoveId.FOCUS_ENERGY); + } else if (p.formIndex === 3) { + p.moveset[0] = new PokemonMove(MoveId.SURGING_STRIKES); + p.moveset[1] = new PokemonMove(MoveId.BRICK_BREAK); + p.moveset[2] = new PokemonMove(randSeedItem([MoveId.FIRE_PUNCH, MoveId.THUNDER_PUNCH, MoveId.ICE_PUNCH])); + p.moveset[3] = new PokemonMove(MoveId.FOCUS_ENERGY); + } }), ) - .setInstantTera(2), // Tera Poison Galar-Slowbro / Galar-Slowking + .setInstantTera(4), // Tera Fighting Kommo-o [TrainerType.GEETA]: new TrainerConfig(++t) .initForChampion(false) .setMixedBattleBgm("battle_champion_geeta") @@ -4353,16 +4381,22 @@ export const trainerConfigs: TrainerConfigs = { p.setBoss(true, 2); }), ) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.ESPATHRA, SpeciesId.VELUZA])) .setPartyMemberFunc( - 2, + 1, + getRandomPartyMemberFunc([SpeciesId.ESPATHRA], TrainerSlot.TRAINER, true, p => { + p.abilityIndex = 0; // Opportunist + p.generateAndPopulateMoveset(); + }), + ) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.BAXCALIBUR])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.CHESNAUGHT, SpeciesId.DELPHOX, SpeciesId.GRENINJA])) + .setPartyMemberFunc( + 4, getRandomPartyMemberFunc([SpeciesId.MIRAIDON], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.MASTER_BALL; }), ) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.BAXCALIBUR])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([SpeciesId.CHESNAUGHT, SpeciesId.DELPHOX, SpeciesId.GRENINJA])) .setPartyMemberFunc( 5, getRandomPartyMemberFunc([SpeciesId.KINGAMBIT], TrainerSlot.TRAINER, true, p => { @@ -4389,19 +4423,19 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.PAWMOT])) .setPartyMemberFunc( 2, + getRandomPartyMemberFunc([SpeciesId.DUDUNSPARCE], TrainerSlot.TRAINER, true, p => { + p.abilityIndex = 0; // Serene Grace + p.generateAndPopulateMoveset(); + }), + ) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.ARMAROUGE, SpeciesId.CERULEDGE])) + .setPartyMemberFunc( + 4, getRandomPartyMemberFunc([SpeciesId.KORAIDON], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); 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( 5, getRandomPartyMemberFunc( @@ -4412,10 +4446,11 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.gender = Gender.MALE; p.setBoss(true, 2); + p.teraType = p.species.type2!; }, ), ) - .setInstantTera(4), // Tera Psychic Armarouge / Ghost Ceruledge + .setInstantTera(5), // Tera Dark Meowscarada, Ghost Skeledirge, Fighting Quaquaval [TrainerType.KIERAN]: new TrainerConfig(++t) .initForChampion(true) .setMixedBattleBgm("battle_champion_kieran") @@ -4429,9 +4464,9 @@ export const trainerConfigs: TrainerConfigs = { ) .setPartyMemberFunc( 2, - getRandomPartyMemberFunc([SpeciesId.TERAPAGOS], TrainerSlot.TRAINER, true, p => { + getRandomPartyMemberFunc([SpeciesId.DRAGONITE], TrainerSlot.TRAINER, true, p => { + p.abilityIndex = 2; // Multiscale p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; }), ) .setPartyMemberFunc( @@ -4443,25 +4478,29 @@ export const trainerConfigs: TrainerConfigs = { ) .setPartyMemberFunc( 4, - getRandomPartyMemberFunc([SpeciesId.OGERPON], TrainerSlot.TRAINER, true, p => { - p.formIndex = randSeedInt(4); // Random Ogerpon Tera Mask + getRandomPartyMemberFunc([SpeciesId.TERAPAGOS], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === MoveId.IVY_CUDGEL)) { - // Check if Ivy Cudgel is in the moveset, if not, replace the first move with Ivy Cudgel. - p.moveset[0] = new PokemonMove(MoveId.IVY_CUDGEL); + if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === MoveId.TERA_STARSTORM)) { + // Check if Tera Starstorm is in the moveset, if not, replace the first move with Tera Starstorm. + p.moveset[0] = new PokemonMove(MoveId.TERA_STARSTORM); } + p.pokeball = PokeballType.MASTER_BALL; }), ) .setPartyMemberFunc( 5, getRandomPartyMemberFunc([SpeciesId.HYDRAPPLE], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); p.gender = Gender.MALE; 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)) .setName("Finn") @@ -4974,21 +5013,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 +5036,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 +5096,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 +5186,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 +5271,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 +5279,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 +5297,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 +5418,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 +5444,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 +5485,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 +5510,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 +5590,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 +5607,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 +5641,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 +5723,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 +5741,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 +5762,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 +5795,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 +5807,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 +5823,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 +5860,7 @@ export const trainerConfigs: TrainerConfigs = { }), ) .setInstantTera(0), // Tera Fairy Sylveon + [TrainerType.BUCK]: new TrainerConfig(++t) .setName("Buck") .initForStatTrainer(true) diff --git a/src/enums/ability-id.ts b/src/enums/ability-id.ts index c9681fb1109..f054c7b574e 100644 --- a/src/enums/ability-id.ts +++ b/src/enums/ability-id.ts @@ -1,624 +1,624 @@ export enum AbilityId { - /**{@link https://bulbapedia.bulbagarden.net/wiki/None_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/None_(ability) | Source} */ NONE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Stench_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Stench_(ability) | Source} */ STENCH, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Drizzle_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Drizzle_(ability) | Source} */ DRIZZLE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Speed_Boost_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Speed_Boost_(ability) | Source} */ SPEED_BOOST, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Battle_Armor_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Battle_Armor_(ability) | Source} */ BATTLE_ARMOR, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Sturdy_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Sturdy_(ability) | Source} */ STURDY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Damp_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Damp_(ability) | Source} */ DAMP, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Limber_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Limber_(ability) | Source} */ LIMBER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Sand_Veil_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Sand_Veil_(ability) | Source} */ SAND_VEIL, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Static_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Static_(ability) | Source} */ STATIC, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Volt_Absorb_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Volt_Absorb_(ability) | Source} */ VOLT_ABSORB, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Water_Absorb_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Water_Absorb_(ability) | Source} */ WATER_ABSORB, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Oblivious_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Oblivious_(ability) | Source} */ OBLIVIOUS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Cloud_Nine_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Cloud_Nine_(ability) | Source} */ CLOUD_NINE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Compound_Eyes_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Compound_Eyes_(ability) | Source} */ COMPOUND_EYES, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Insomnia_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Insomnia_(ability) | Source} */ INSOMNIA, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Color_Change_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Color_Change_(ability) | Source} */ COLOR_CHANGE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Immunity_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Immunity_(ability) | Source} */ IMMUNITY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Flash_Fire_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Flash_Fire_(ability) | Source} */ FLASH_FIRE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Shield_Dust_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Shield_Dust_(ability) | Source} */ SHIELD_DUST, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Own_Tempo_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Own_Tempo_(ability) | Source} */ OWN_TEMPO, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Suction_Cups_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Suction_Cups_(ability) | Source} */ SUCTION_CUPS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Intimidate_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Intimidate_(ability) | Source} */ INTIMIDATE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Shadow_Tag_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Shadow_Tag_(ability) | Source} */ SHADOW_TAG, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Rough_Skin_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Rough_Skin_(ability) | Source} */ ROUGH_SKIN, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Wonder_Guard_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Wonder_Guard_(ability) | Source} */ WONDER_GUARD, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Levitate_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Levitate_(ability) | Source} */ LEVITATE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Effect_Spore_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Effect_Spore_(ability) | Source} */ EFFECT_SPORE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Synchronize_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Synchronize_(ability) | Source} */ SYNCHRONIZE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Clear_Body_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Clear_Body_(ability) | Source} */ CLEAR_BODY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Natural_Cure_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Natural_Cure_(ability) | Source} */ NATURAL_CURE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Lightning_Rod_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Lightning_Rod_(ability) | Source} */ LIGHTNING_ROD, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Serene_Grace_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Serene_Grace_(ability) | Source} */ SERENE_GRACE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Swift_Swim_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Swift_Swim_(ability) | Source} */ SWIFT_SWIM, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Chlorophyll_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Chlorophyll_(ability) | Source} */ CHLOROPHYLL, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Illuminate_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Illuminate_(ability) | Source} */ ILLUMINATE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Trace_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Trace_(ability) | Source} */ TRACE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Huge_Power_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Huge_Power_(ability) | Source} */ HUGE_POWER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Poison_Point_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Poison_Point_(ability) | Source} */ POISON_POINT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Inner_Focus_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Inner_Focus_(ability) | Source} */ INNER_FOCUS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Magma_Armor_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Magma_Armor_(ability) | Source} */ MAGMA_ARMOR, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Water_Veil_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Water_Veil_(ability) | Source} */ WATER_VEIL, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Magnet_Pull_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Magnet_Pull_(ability) | Source} */ MAGNET_PULL, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Soundproof_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Soundproof_(ability) | Source} */ SOUNDPROOF, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Rain_Dish_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Rain_Dish_(ability) | Source} */ RAIN_DISH, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Sand_Stream_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Sand_Stream_(ability) | Source} */ SAND_STREAM, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Pressure_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Pressure_(ability) | Source} */ PRESSURE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Thick_Fat_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Thick_Fat_(ability) | Source} */ THICK_FAT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Early_Bird_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Early_Bird_(ability) | Source} */ EARLY_BIRD, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Flame_Body_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Flame_Body_(ability) | Source} */ FLAME_BODY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Run_Away_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Run_Away_(ability) | Source} */ RUN_AWAY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Keen_Eye_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Keen_Eye_(ability) | Source} */ KEEN_EYE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Hyper_Cutter_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Hyper_Cutter_(ability) | Source} */ HYPER_CUTTER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Pickup_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Pickup_(ability) | Source} */ PICKUP, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Truant_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Truant_(ability) | Source} */ TRUANT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Hustle_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Hustle_(ability) | Source} */ HUSTLE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Cute_Charm_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Cute_Charm_(ability) | Source} */ CUTE_CHARM, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Plus_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Plus_(ability) | Source} */ PLUS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Minus_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Minus_(ability) | Source} */ MINUS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Forecast_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Forecast_(ability) | Source} */ FORECAST, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Sticky_Hold_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Sticky_Hold_(ability) | Source} */ STICKY_HOLD, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Shed_Skin_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Shed_Skin_(ability) | Source} */ SHED_SKIN, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Guts_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Guts_(ability) | Source} */ GUTS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Marvel_Scale_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Marvel_Scale_(ability) | Source} */ MARVEL_SCALE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Liquid_Ooze_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Liquid_Ooze_(ability) | Source} */ LIQUID_OOZE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Overgrow_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Overgrow_(ability) | Source} */ OVERGROW, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Blaze_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Blaze_(ability) | Source} */ BLAZE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Torrent_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Torrent_(ability) | Source} */ TORRENT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Swarm_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Swarm_(ability) | Source} */ SWARM, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Rock_Head_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Rock_Head_(ability) | Source} */ ROCK_HEAD, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Drought_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Drought_(ability) | Source} */ DROUGHT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Arena_Trap_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Arena_Trap_(ability) | Source} */ ARENA_TRAP, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Vital_Spirit_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Vital_Spirit_(ability) | Source} */ VITAL_SPIRIT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/White_Smoke_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/White_Smoke_(ability) | Source} */ WHITE_SMOKE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Pure_Power_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Pure_Power_(ability) | Source} */ PURE_POWER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Shell_Armor_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Shell_Armor_(ability) | Source} */ SHELL_ARMOR, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Air_Lock_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Air_Lock_(ability) | Source} */ AIR_LOCK, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Tangled_Feet_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Tangled_Feet_(ability) | Source} */ TANGLED_FEET, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Motor_Drive_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Motor_Drive_(ability) | Source} */ MOTOR_DRIVE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Rivalry_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Rivalry_(ability) | Source} */ RIVALRY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Steadfast_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Steadfast_(ability) | Source} */ STEADFAST, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Snow_Cloak_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Snow_Cloak_(ability) | Source} */ SNOW_CLOAK, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Gluttony_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Gluttony_(ability) | Source} */ GLUTTONY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Anger_Point_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Anger_Point_(ability) | Source} */ ANGER_POINT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Unburden_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Unburden_(ability) | Source} */ UNBURDEN, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Heatproof_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Heatproof_(ability) | Source} */ HEATPROOF, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Simple_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Simple_(ability) | Source} */ SIMPLE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Dry_Skin_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Dry_Skin_(ability) | Source} */ DRY_SKIN, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Download_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Download_(ability) | Source} */ DOWNLOAD, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Iron_Fist_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Iron_Fist_(ability) | Source} */ IRON_FIST, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Poison_Heal_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Poison_Heal_(ability) | Source} */ POISON_HEAL, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Adaptability_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Adaptability_(ability) | Source} */ ADAPTABILITY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Skill_Link_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Skill_Link_(ability) | Source} */ SKILL_LINK, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Hydration_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Hydration_(ability) | Source} */ HYDRATION, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Solar_Power_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Solar_Power_(ability) | Source} */ SOLAR_POWER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Quick_Feet_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Quick_Feet_(ability) | Source} */ QUICK_FEET, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Normalize_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Normalize_(ability) | Source} */ NORMALIZE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Sniper_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Sniper_(ability) | Source} */ SNIPER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Magic_Guard_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Magic_Guard_(ability) | Source} */ MAGIC_GUARD, - /**{@link https://bulbapedia.bulbagarden.net/wiki/No_Guard_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/No_Guard_(ability) | Source} */ NO_GUARD, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Stall_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Stall_(ability) | Source} */ STALL, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Technician_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Technician_(ability) | Source} */ TECHNICIAN, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Leaf_Guard_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Leaf_Guard_(ability) | Source} */ LEAF_GUARD, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Klutz_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Klutz_(ability) | Source} */ KLUTZ, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Mold_Breaker_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Mold_Breaker_(ability) | Source} */ MOLD_BREAKER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Super_Luck_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Super_Luck_(ability) | Source} */ SUPER_LUCK, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Aftermath_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Aftermath_(ability) | Source} */ AFTERMATH, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Anticipation_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Anticipation_(ability) | Source} */ ANTICIPATION, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Forewarn_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Forewarn_(ability) | Source} */ FOREWARN, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Unaware_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Unaware_(ability) | Source} */ UNAWARE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Tinted_Lens_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Tinted_Lens_(ability) | Source} */ TINTED_LENS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Filter_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Filter_(ability) | Source} */ FILTER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Slow_Start_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Slow_Start_(ability) | Source} */ SLOW_START, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Scrappy_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Scrappy_(ability) | Source} */ SCRAPPY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Storm_Drain_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Storm_Drain_(ability) | Source} */ STORM_DRAIN, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Ice_Body_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Ice_Body_(ability) | Source} */ ICE_BODY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Solid_Rock_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Solid_Rock_(ability) | Source} */ SOLID_ROCK, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Snow_Warning_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Snow_Warning_(ability) | Source} */ SNOW_WARNING, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Honey_Gather_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Honey_Gather_(ability) | Source} */ HONEY_GATHER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Frisk_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Frisk_(ability) | Source} */ FRISK, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Reckless_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Reckless_(ability) | Source} */ RECKLESS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Multitype_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Multitype_(ability) | Source} */ MULTITYPE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Flower_Gift_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Flower_Gift_(ability) | Source} */ FLOWER_GIFT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Bad_Dreams_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Bad_Dreams_(ability) | Source} */ BAD_DREAMS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Pickpocket_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Pickpocket_(ability) | Source} */ PICKPOCKET, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Sheer_Force_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Sheer_Force_(ability) | Source} */ SHEER_FORCE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Contrary_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Contrary_(ability) | Source} */ CONTRARY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Unnerve_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Unnerve_(ability) | Source} */ UNNERVE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Defiant_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Defiant_(ability) | Source} */ DEFIANT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Defeatist_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Defeatist_(ability) | Source} */ DEFEATIST, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Cursed_Body_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Cursed_Body_(ability) | Source} */ CURSED_BODY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Healer_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Healer_(ability) | Source} */ HEALER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Friend_Guard_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Friend_Guard_(ability) | Source} */ FRIEND_GUARD, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Weak_Armor_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Weak_Armor_(ability) | Source} */ WEAK_ARMOR, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Heavy_Metal_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Heavy_Metal_(ability) | Source} */ HEAVY_METAL, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Light_Metal_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Light_Metal_(ability) | Source} */ LIGHT_METAL, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Multiscale_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Multiscale_(ability) | Source} */ MULTISCALE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Toxic_Boost_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Toxic_Boost_(ability) | Source} */ TOXIC_BOOST, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Flare_Boost_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Flare_Boost_(ability) | Source} */ FLARE_BOOST, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Harvest_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Harvest_(ability) | Source} */ HARVEST, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Telepathy_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Telepathy_(ability) | Source} */ TELEPATHY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Moody_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Moody_(ability) | Source} */ MOODY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Overcoat_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Overcoat_(ability) | Source} */ OVERCOAT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Poison_Touch_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Poison_Touch_(ability) | Source} */ POISON_TOUCH, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Regenerator_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Regenerator_(ability) | Source} */ REGENERATOR, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Big_Pecks_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Big_Pecks_(ability) | Source} */ BIG_PECKS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Sand_Rush_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Sand_Rush_(ability) | Source} */ SAND_RUSH, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Wonder_Skin_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Wonder_Skin_(ability) | Source} */ WONDER_SKIN, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Analytic_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Analytic_(ability) | Source} */ ANALYTIC, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Illusion_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Illusion_(ability) | Source} */ ILLUSION, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Imposter_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Imposter_(ability) | Source} */ IMPOSTER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Infiltrator_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Infiltrator_(ability) | Source} */ INFILTRATOR, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Mummy_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Mummy_(ability) | Source} */ MUMMY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Moxie_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Moxie_(ability) | Source} */ MOXIE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Justified_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Justified_(ability) | Source} */ JUSTIFIED, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Rattled_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Rattled_(ability) | Source} */ RATTLED, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Magic_Bounce_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Magic_Bounce_(ability) | Source} */ MAGIC_BOUNCE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Sap_Sipper_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Sap_Sipper_(ability) | Source} */ SAP_SIPPER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Prankster_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Prankster_(ability) | Source} */ PRANKSTER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Sand_Force_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Sand_Force_(ability) | Source} */ SAND_FORCE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Iron_Barbs_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Iron_Barbs_(ability) | Source} */ IRON_BARBS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Zen_Mode_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Zen_Mode_(ability) | Source} */ ZEN_MODE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Victory_Star_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Victory_Star_(ability) | Source} */ VICTORY_STAR, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Turboblaze_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Turboblaze_(ability) | Source} */ TURBOBLAZE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Teravolt_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Teravolt_(ability) | Source} */ TERAVOLT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Aroma_Veil_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Aroma_Veil_(ability) | Source} */ AROMA_VEIL, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Flower_Veil_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Flower_Veil_(ability) | Source} */ FLOWER_VEIL, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Cheek_Pouch_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Cheek_Pouch_(ability) | Source} */ CHEEK_POUCH, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Protean_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Protean_(ability) | Source} */ PROTEAN, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Fur_Coat_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Fur_Coat_(ability) | Source} */ FUR_COAT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Magician_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Magician_(ability) | Source} */ MAGICIAN, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Bulletproof_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Bulletproof_(ability) | Source} */ BULLETPROOF, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Competitive_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Competitive_(ability) | Source} */ COMPETITIVE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Strong_Jaw_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Strong_Jaw_(ability) | Source} */ STRONG_JAW, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Refrigerate_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Refrigerate_(ability) | Source} */ REFRIGERATE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Sweet_Veil_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Sweet_Veil_(ability) | Source} */ SWEET_VEIL, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Stance_Change_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Stance_Change_(ability) | Source} */ STANCE_CHANGE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Gale_Wings_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Gale_Wings_(ability) | Source} */ GALE_WINGS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Mega_Launcher_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Mega_Launcher_(ability) | Source} */ MEGA_LAUNCHER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Grass_Pelt_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Grass_Pelt_(ability) | Source} */ GRASS_PELT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Symbiosis_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Symbiosis_(ability) | Source} */ SYMBIOSIS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Tough_Claws_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Tough_Claws_(ability) | Source} */ TOUGH_CLAWS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Pixilate_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Pixilate_(ability) | Source} */ PIXILATE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Gooey_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Gooey_(ability) | Source} */ GOOEY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Aerilate_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Aerilate_(ability) | Source} */ AERILATE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Parental_Bond_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Parental_Bond_(ability) | Source} */ PARENTAL_BOND, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Dark_Aura_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Dark_Aura_(ability) | Source} */ DARK_AURA, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Fairy_Aura_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Fairy_Aura_(ability) | Source} */ FAIRY_AURA, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Aura_Break_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Aura_Break_(ability) | Source} */ AURA_BREAK, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Primordial_Sea_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Primordial_Sea_(ability) | Source} */ PRIMORDIAL_SEA, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Desolate_Land_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Desolate_Land_(ability) | Source} */ DESOLATE_LAND, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Delta_Stream_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Delta_Stream_(ability) | Source} */ DELTA_STREAM, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Stamina_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Stamina_(ability) | Source} */ STAMINA, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Wimp_Out_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Wimp_Out_(ability) | Source} */ WIMP_OUT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Emergency_Exit_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Emergency_Exit_(ability) | Source} */ EMERGENCY_EXIT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Water_Compaction_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Water_Compaction_(ability) | Source} */ WATER_COMPACTION, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Merciless_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Merciless_(ability) | Source} */ MERCILESS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Shields_Down_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Shields_Down_(ability) | Source} */ SHIELDS_DOWN, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Stakeout_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Stakeout_(ability) | Source} */ STAKEOUT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Water_Bubble_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Water_Bubble_(ability) | Source} */ WATER_BUBBLE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Steelworker_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Steelworker_(ability) | Source} */ STEELWORKER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Berserk_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Berserk_(ability) | Source} */ BERSERK, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Slush_Rush_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Slush_Rush_(ability) | Source} */ SLUSH_RUSH, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Long_Reach_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Long_Reach_(ability) | Source} */ LONG_REACH, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Liquid_Voice_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Liquid_Voice_(ability) | Source} */ LIQUID_VOICE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Triage_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Triage_(ability) | Source} */ TRIAGE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Galvanize_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Galvanize_(ability) | Source} */ GALVANIZE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Surge_Surfer_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Surge_Surfer_(ability) | Source} */ SURGE_SURFER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Schooling_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Schooling_(ability) | Source} */ SCHOOLING, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Disguise_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Disguise_(ability) | Source} */ DISGUISE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Battle_Bond_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Battle_Bond_(ability) | Source} */ BATTLE_BOND, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Power_Construct_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Power_Construct_(ability) | Source} */ POWER_CONSTRUCT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Corrosion_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Corrosion_(ability) | Source} */ CORROSION, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Comatose_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Comatose_(ability) | Source} */ COMATOSE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Queenly_Majesty_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Queenly_Majesty_(ability) | Source} */ QUEENLY_MAJESTY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Innards_Out_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Innards_Out_(ability) | Source} */ INNARDS_OUT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Dancer_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Dancer_(ability) | Source} */ DANCER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Battery_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Battery_(ability) | Source} */ BATTERY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Fluffy_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Fluffy_(ability) | Source} */ FLUFFY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Dazzling_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Dazzling_(ability) | Source} */ DAZZLING, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Soul_Heart_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Soul_Heart_(ability) | Source} */ SOUL_HEART, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Tangling_Hair_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Tangling_Hair_(ability) | Source} */ TANGLING_HAIR, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Receiver_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Receiver_(ability) | Source} */ RECEIVER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Power_Of_Alchemy_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Power_Of_Alchemy_(ability) | Source} */ POWER_OF_ALCHEMY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Beast_Boost_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Beast_Boost_(ability) | Source} */ BEAST_BOOST, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Rks_System_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Rks_System_(ability) | Source} */ RKS_SYSTEM, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Electric_Surge_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Electric_Surge_(ability) | Source} */ ELECTRIC_SURGE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Psychic_Surge_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Psychic_Surge_(ability) | Source} */ PSYCHIC_SURGE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Misty_Surge_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Misty_Surge_(ability) | Source} */ MISTY_SURGE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Grassy_Surge_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Grassy_Surge_(ability) | Source} */ GRASSY_SURGE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Full_Metal_Body_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Full_Metal_Body_(ability) | Source} */ FULL_METAL_BODY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Shadow_Shield_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Shadow_Shield_(ability) | Source} */ SHADOW_SHIELD, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Prism_Armor_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Prism_Armor_(ability) | Source} */ PRISM_ARMOR, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Neuroforce_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Neuroforce_(ability) | Source} */ NEUROFORCE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Intrepid_Sword_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Intrepid_Sword_(ability) | Source} */ INTREPID_SWORD, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Dauntless_Shield_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Dauntless_Shield_(ability) | Source} */ DAUNTLESS_SHIELD, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Libero_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Libero_(ability) | Source} */ LIBERO, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Ball_Fetch_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Ball_Fetch_(ability) | Source} */ BALL_FETCH, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Cotton_Down_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Cotton_Down_(ability) | Source} */ COTTON_DOWN, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Propeller_Tail_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Propeller_Tail_(ability) | Source} */ PROPELLER_TAIL, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Mirror_Armor_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Mirror_Armor_(ability) | Source} */ MIRROR_ARMOR, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Gulp_Missile_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Gulp_Missile_(ability) | Source} */ GULP_MISSILE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Stalwart_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Stalwart_(ability) | Source} */ STALWART, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Steam_Engine_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Steam_Engine_(ability) | Source} */ STEAM_ENGINE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Punk_Rock_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Punk_Rock_(ability) | Source} */ PUNK_ROCK, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Sand_Spit_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Sand_Spit_(ability) | Source} */ SAND_SPIT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Ice_Scales_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Ice_Scales_(ability) | Source} */ ICE_SCALES, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Ripen_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Ripen_(ability) | Source} */ RIPEN, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Ice_Face_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Ice_Face_(ability) | Source} */ ICE_FACE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Power_Spot_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Power_Spot_(ability) | Source} */ POWER_SPOT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Mimicry_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Mimicry_(ability) | Source} */ MIMICRY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Screen_Cleaner_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Screen_Cleaner_(ability) | Source} */ SCREEN_CLEANER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Steely_Spirit_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Steely_Spirit_(ability) | Source} */ STEELY_SPIRIT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Perish_Body_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Perish_Body_(ability) | Source} */ PERISH_BODY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Wandering_Spirit_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Wandering_Spirit_(ability) | Source} */ WANDERING_SPIRIT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Gorilla_Tactics_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Gorilla_Tactics_(ability) | Source} */ GORILLA_TACTICS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Neutralizing_Gas_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Neutralizing_Gas_(ability) | Source} */ NEUTRALIZING_GAS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Pastel_Veil_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Pastel_Veil_(ability) | Source} */ PASTEL_VEIL, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Hunger_Switch_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Hunger_Switch_(ability) | Source} */ HUNGER_SWITCH, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Quick_Draw_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Quick_Draw_(ability) | Source} */ QUICK_DRAW, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Unseen_Fist_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Unseen_Fist_(ability) | Source} */ UNSEEN_FIST, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Curious_Medicine_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Curious_Medicine_(ability) | Source} */ CURIOUS_MEDICINE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Transistor_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Transistor_(ability) | Source} */ TRANSISTOR, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Dragons_Maw_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Dragons_Maw_(ability) | Source} */ DRAGONS_MAW, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Chilling_Neigh_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Chilling_Neigh_(ability) | Source} */ CHILLING_NEIGH, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Grim_Neigh_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Grim_Neigh_(ability) | Source} */ GRIM_NEIGH, - /**{@link https://bulbapedia.bulbagarden.net/wiki/As_One_Glastrier_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/As_One_Glastrier_(ability) | Source} */ AS_ONE_GLASTRIER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/As_One_Spectrier_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/As_One_Spectrier_(ability) | Source} */ AS_ONE_SPECTRIER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Lingering_Aroma_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Lingering_Aroma_(ability) | Source} */ LINGERING_AROMA, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Seed_Sower_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Seed_Sower_(ability) | Source} */ SEED_SOWER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Thermal_Exchange_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Thermal_Exchange_(ability) | Source} */ THERMAL_EXCHANGE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Anger_Shell_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Anger_Shell_(ability) | Source} */ ANGER_SHELL, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Purifying_Salt_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Purifying_Salt_(ability) | Source} */ PURIFYING_SALT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Well_Baked_Body_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Well_Baked_Body_(ability) | Source} */ WELL_BAKED_BODY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Wind_Rider_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Wind_Rider_(ability) | Source} */ WIND_RIDER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Guard_Dog_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Guard_Dog_(ability) | Source} */ GUARD_DOG, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Rocky_Payload_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Rocky_Payload_(ability) | Source} */ ROCKY_PAYLOAD, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Wind_Power_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Wind_Power_(ability) | Source} */ WIND_POWER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Zero_To_Hero_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Zero_To_Hero_(ability) | Source} */ ZERO_TO_HERO, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Commander_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Commander_(ability) | Source} */ COMMANDER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Electromorphosis_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Electromorphosis_(ability) | Source} */ ELECTROMORPHOSIS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Protosynthesis_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Protosynthesis_(ability) | Source} */ PROTOSYNTHESIS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Quark_Drive_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Quark_Drive_(ability) | Source} */ QUARK_DRIVE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Good_As_Gold_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Good_As_Gold_(ability) | Source} */ GOOD_AS_GOLD, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Vessel_Of_Ruin_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Vessel_Of_Ruin_(ability) | Source} */ VESSEL_OF_RUIN, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Sword_Of_Ruin_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Sword_Of_Ruin_(ability) | Source} */ SWORD_OF_RUIN, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Tablets_Of_Ruin_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Tablets_Of_Ruin_(ability) | Source} */ TABLETS_OF_RUIN, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Beads_Of_Ruin_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Beads_Of_Ruin_(ability) | Source} */ BEADS_OF_RUIN, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Orichalcum_Pulse_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Orichalcum_Pulse_(ability) | Source} */ ORICHALCUM_PULSE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Hadron_Engine_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Hadron_Engine_(ability) | Source} */ HADRON_ENGINE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Opportunist_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Opportunist_(ability) | Source} */ OPPORTUNIST, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Cud_Chew_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Cud_Chew_(ability) | Source} */ CUD_CHEW, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Sharpness_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Sharpness_(ability) | Source} */ SHARPNESS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Supreme_Overlord_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Supreme_Overlord_(ability) | Source} */ SUPREME_OVERLORD, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Costar_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Costar_(ability) | Source} */ COSTAR, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Toxic_Debris_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Toxic_Debris_(ability) | Source} */ TOXIC_DEBRIS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Armor_Tail_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Armor_Tail_(ability) | Source} */ ARMOR_TAIL, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Earth_Eater_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Earth_Eater_(ability) | Source} */ EARTH_EATER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Mycelium_Might_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Mycelium_Might_(ability) | Source} */ MYCELIUM_MIGHT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Minds_Eye_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Minds_Eye_(ability) | Source} */ MINDS_EYE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Supersweet_Syrup_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Supersweet_Syrup_(ability) | Source} */ SUPERSWEET_SYRUP, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Hospitality_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Hospitality_(ability) | Source} */ HOSPITALITY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Toxic_Chain_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Toxic_Chain_(ability) | Source} */ TOXIC_CHAIN, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Embody_Aspect_Teal_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Embody_Aspect_Teal_(ability) | Source} */ EMBODY_ASPECT_TEAL, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Embody_Aspect_Wellspring_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Embody_Aspect_Wellspring_(ability) | Source} */ EMBODY_ASPECT_WELLSPRING, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Embody_Aspect_Hearthflame_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Embody_Aspect_Hearthflame_(ability) | Source} */ EMBODY_ASPECT_HEARTHFLAME, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Embody_Aspect_Cornerstone_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Embody_Aspect_Cornerstone_(ability) | Source} */ EMBODY_ASPECT_CORNERSTONE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Tera_Shift_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Tera_Shift_(ability) | Source} */ TERA_SHIFT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Tera_Shell_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Tera_Shell_(ability) | Source} */ TERA_SHELL, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Teraform_Zero_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Teraform_Zero_(ability) | Source} */ TERAFORM_ZERO, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Poison_Puppeteer_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Poison_Puppeteer_(ability) | Source} */ POISON_PUPPETEER, } diff --git a/src/field/arena.ts b/src/field/arena.ts index ed2f1df9b12..06ba6fdd334 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -536,6 +536,7 @@ export class Arena { case BiomeId.ABYSS: case BiomeId.SPACE: case BiomeId.TEMPLE: + case BiomeId.LABORATORY: return 16; default: return 0; diff --git a/src/loading-scene.ts b/src/loading-scene.ts index c5b0263e785..d2b4a76ef10 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -29,6 +29,7 @@ export class LoadingScene extends SceneBase { this.loadImage("loading_bg", "arenas"); this.loadImage("logo", ""); + this.loadImage("logo_fake", ""); // Load menu images this.loadAtlas("bg", "ui"); diff --git a/src/phases/move-effect-phase.ts b/src/phases/move-effect-phase.ts index c57e0f6cead..767d7a79968 100644 --- a/src/phases/move-effect-phase.ts +++ b/src/phases/move-effect-phase.ts @@ -829,6 +829,7 @@ export class MoveEffectPhase extends PokemonPhase { const substitute = target.getTag(SubstituteTag); const isBlockedBySubstitute = substitute && this.move.hitsSubstitute(user, target); if (isBlockedBySubstitute) { + user.turnData.totalDamageDealt += Math.min(dmg, substitute.hp); substitute.hp -= dmg; } else if (!target.isPlayer() && dmg >= target.hp) { globalScene.applyModifiers(EnemyEndureChanceModifier, false, target); diff --git a/src/timed-event-manager.ts b/src/timed-event-manager.ts index 9e711735e7f..ed92a1c9ca5 100644 --- a/src/timed-event-manager.ts +++ b/src/timed-event-manager.ts @@ -397,6 +397,16 @@ export class TimedEventManager { return timedEvents.some((te: TimedEvent) => this.isActive(te)); } + /** + * Check whether the current event is active and for April Fools. + * @returns Whether the April Fools event is currently active. + */ + isAprilFoolsActive(): boolean { + return timedEvents.some( + te => this.isActive(te) && te.hasOwnProperty("bannerKey") && te.bannerKey!.startsWith("aprf"), + ); + } + activeEventHasBanner(): boolean { const activeEvents = timedEvents.filter(te => this.isActive(te) && te.hasOwnProperty("bannerKey")); return activeEvents.length > 0; diff --git a/src/ui/title-ui-handler.ts b/src/ui/title-ui-handler.ts index ab7a4d020fa..36e37500a64 100644 --- a/src/ui/title-ui-handler.ts +++ b/src/ui/title-ui-handler.ts @@ -1,4 +1,5 @@ import { pokerogueApi } from "#api/pokerogue-api"; +import { FAKE_TITLE_LOGO_CHANCE } from "#app/constants"; import { timedEventManager } from "#app/global-event-manager"; import { globalScene } from "#app/global-scene"; import { TimedEventDisplay } from "#app/timed-event-manager"; @@ -41,7 +42,7 @@ export class TitleUiHandler extends OptionSelectUiHandler { this.titleContainer.setAlpha(0); ui.add(this.titleContainer); - const logo = globalScene.add.image(globalScene.scaledCanvas.width / 2, 8, "logo"); + const logo = globalScene.add.image(globalScene.scaledCanvas.width / 2, 8, this.getLogo()); logo.setOrigin(0.5, 0); this.titleContainer.add(logo); @@ -186,4 +187,14 @@ export class TitleUiHandler extends OptionSelectUiHandler { ease: "Sine.easeInOut", }); } + + /** + * Get the logo file path to load, with a 0.1% chance to use the fake logo instead. + * @returns The path to the image. + */ + private getLogo(): string { + // Invert spawn chances on april fools + const aprilFools = timedEventManager.isAprilFoolsActive(); + return aprilFools === !!randInt(FAKE_TITLE_LOGO_CHANCE) ? "logo_fake" : "logo"; + } } diff --git a/src/utils/common.ts b/src/utils/common.ts index 1c75dac93b4..aac1ef359e6 100644 --- a/src/utils/common.ts +++ b/src/utils/common.ts @@ -70,12 +70,16 @@ export function padInt(value: number, length: number, padWith?: string): string } /** - * Returns a random integer between min and min + range - * @param range The amount of possible numbers - * @param min The starting number + * Returns a **completely unseeded** random integer between `min` and `min + range`. + * @param range - The amount of possible numbers to pick + * @param min - The minimum number to pick; default `0` + * @returns A psuedo-random, unseeded integer within the interval [min, min+range]. + * @remarks + * This should not be used for battles or other outwards-facing randomness; + * battles are intended to be seeded and deterministic. */ export function randInt(range: number, min = 0): number { - if (range === 1) { + if (range <= 1) { return min; } return Math.floor(Math.random() * range) + min; diff --git a/test/abilities/arena-trap.test.ts b/test/abilities/arena-trap.test.ts index f85fae5b259..0090487f49c 100644 --- a/test/abilities/arena-trap.test.ts +++ b/test/abilities/arena-trap.test.ts @@ -1,10 +1,15 @@ +import { getPokemonNameWithAffix } from "#app/messages"; import { allAbilities } from "#data/data-lists"; import { AbilityId } from "#enums/ability-id"; +import { Button } from "#enums/buttons"; import { MoveId } from "#enums/move-id"; import { SpeciesId } from "#enums/species-id"; +import { UiMode } from "#enums/ui-mode"; import { GameManager } from "#test/test-utils/game-manager"; +import type { PartyUiHandler } from "#ui/party-ui-handler"; +import i18next from "i18next"; import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Abilities - Arena Trap", () => { let phaserGame: Phaser.Game; @@ -23,68 +28,64 @@ describe("Abilities - Arena Trap", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset(MoveId.SPLASH) .ability(AbilityId.ARENA_TRAP) + .enemyAbility(AbilityId.ARENA_TRAP) .enemySpecies(SpeciesId.RALTS) - .enemyAbility(AbilityId.BALL_FETCH) - .enemyMoveset(MoveId.TELEPORT); + .enemyMoveset(MoveId.SPLASH); }); - // TODO: Enable test when Issue #935 is addressed - it.todo("should not allow grounded Pokémon to flee", async () => { + // NB: Since switching moves bypass trapping, the only way fleeing can occur in PKR is from the player + // TODO: Implement once forced flee helper exists + it.todo("should interrupt player flee attempt and display message, unless user has Run Away"); + + // TODO: Figure out how to wrangle the UI into not timing out + it.todo("should interrupt player switch attempt and display message", async () => { game.override.battleStyle("single"); + await game.classicMode.startBattle([SpeciesId.DUGTRIO, SpeciesId.GOTHITELLE]); - await game.classicMode.startBattle(); + const enemy = game.field.getEnemyPokemon(); - const enemy = game.scene.getEnemyPokemon(); + game.doSwitchPokemon(1); + game.onNextPrompt("CommandPhase", UiMode.PARTY, () => { + // no switch out command should be queued due to arena trap + expect(game.scene.currentBattle.turnCommands[0]).toBeNull(); - game.move.select(MoveId.SPLASH); + // back out and end the phase to avoid timeout + console.log(game.scene.ui.getHandler().constructor.name); + (game.scene.ui.getHandler() as PartyUiHandler).processInput(Button.CANCEL); + }); - await game.toNextTurn(); + await game.phaseInterceptor.to("CommandPhase"); - expect(enemy).toBe(game.scene.getEnemyPokemon()); + expect(game.textInterceptor.logs).toContain( + i18next.t("abilityTriggers:arenaTrap", { + pokemonNameWithAffix: getPokemonNameWithAffix(enemy), + abilityName: allAbilities[AbilityId.ARENA_TRAP].name, + }), + ); }); it("should guarantee double battle with any one LURE", async () => { game.override.startingModifier([{ name: "LURE" }]).startingWave(2); + await game.classicMode.startBattle([SpeciesId.DUGTRIO]); - await game.classicMode.startBattle(); - - expect(game.scene.getEnemyField().length).toBe(2); + expect(game.scene.getEnemyField()).toHaveLength(2); }); - /** - * This checks if the Player Pokemon is able to switch out/run away after the Enemy Pokemon with {@linkcode AbilityId.ARENA_TRAP} - * is forcefully moved out of the field from moves such as Roar {@linkcode MoveId.ROAR} - * - * Note: It should be able to switch out/run away - */ it("should lift if pokemon with this ability leaves the field", async () => { - game.override - .battleStyle("double") - .enemyMoveset(MoveId.SPLASH) - .moveset([MoveId.ROAR, MoveId.SPLASH]) - .ability(AbilityId.BALL_FETCH); - await game.classicMode.startBattle([SpeciesId.MAGIKARP, SpeciesId.SUDOWOODO, SpeciesId.LUNATONE]); + game.override.battleStyle("single"); + await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const [enemy1, enemy2] = game.scene.getEnemyField(); - const [player1, player2] = game.scene.getPlayerField(); + const player = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); - vi.spyOn(enemy1, "getAbility").mockReturnValue(allAbilities[AbilityId.ARENA_TRAP]); + expect(player.isTrapped()).toBe(true); + expect(enemy.isOnField()).toBe(true); - game.move.select(MoveId.ROAR); - game.move.select(MoveId.SPLASH, 1); + game.move.use(MoveId.ROAR); + await game.toEndOfTurn(); - // This runs the fist command phase where the moves are selected - await game.toNextTurn(); - // During the next command phase the player pokemons should not be trapped anymore - game.move.select(MoveId.SPLASH); - game.move.select(MoveId.SPLASH, 1); - await game.toNextTurn(); - - expect(player1.isTrapped()).toBe(false); - expect(player2.isTrapped()).toBe(false); - expect(enemy1.isOnField()).toBe(false); - expect(enemy2.isOnField()).toBe(true); + expect(player.isTrapped()).toBe(false); + expect(enemy.isOnField()).toBe(false); }); }); diff --git a/test/moves/recoil-moves.test.ts b/test/moves/recoil-moves.test.ts new file mode 100644 index 00000000000..6fc69c932ac --- /dev/null +++ b/test/moves/recoil-moves.test.ts @@ -0,0 +1,84 @@ +import { AbilityId } from "#enums/ability-id"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { MoveId } from "#enums/move-id"; +import { SpeciesId } from "#enums/species-id"; +import { GameManager } from "#test/test-utils/game-manager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Recoil Moves", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .battleStyle("single") + .enemySpecies(SpeciesId.PIDOVE) + .startingLevel(1) + .enemyLevel(100) + .enemyMoveset(MoveId.SUBSTITUTE) + .criticalHits(false) + .ability(AbilityId.NO_GUARD) + .enemyAbility(AbilityId.BALL_FETCH); + }); + + it.each([ + { moveName: "Double Edge", moveId: MoveId.DOUBLE_EDGE }, + { moveName: "Brave Bird", moveId: MoveId.BRAVE_BIRD }, + { moveName: "Flare Blitz", moveId: MoveId.FLARE_BLITZ }, + { moveName: "Head Charge", moveId: MoveId.HEAD_CHARGE }, + { moveName: "Head Smash", moveId: MoveId.HEAD_SMASH }, + { moveName: "Light of Ruin", moveId: MoveId.LIGHT_OF_RUIN }, + { moveName: "Struggle", moveId: MoveId.STRUGGLE }, + { moveName: "Submission", moveId: MoveId.SUBMISSION }, + { moveName: "Take Down", moveId: MoveId.TAKE_DOWN }, + { moveName: "Volt Tackle", moveId: MoveId.VOLT_TACKLE }, + { moveName: "Wave Crash", moveId: MoveId.WAVE_CRASH }, + { moveName: "Wild Charge", moveId: MoveId.WILD_CHARGE }, + { moveName: "Wood Hammer", moveId: MoveId.WOOD_HAMMER }, + ])("$moveName causes recoil damage when hitting a substitute", async ({ moveId }) => { + await game.classicMode.startBattle([SpeciesId.TOGEPI]); + + game.move.use(moveId); + await game.phaseInterceptor.to("MoveEndPhase"); // Pidove substitute + + const pidove = game.field.getEnemyPokemon(); + const subTag = pidove.getTag(BattlerTagType.SUBSTITUTE)!; + expect(subTag).toBeDefined(); + const subInitialHp = subTag.hp; + + await game.phaseInterceptor.to("MoveEndPhase"); // player attack + + expect(subTag.hp).toBeLessThan(subInitialHp); + + const playerPokemon = game.field.getPlayerPokemon(); + expect(playerPokemon.hp).toBeLessThan(playerPokemon.getMaxHp()); + }); + + it("causes recoil damage when hitting a substitute in a double battle", async () => { + game.override.battleStyle("double"); + + await game.classicMode.startBattle([SpeciesId.TOGEPI, SpeciesId.TOGEPI]); + + const [playerPokemon1, playerPokemon2] = game.scene.getPlayerField(); + + game.move.use(MoveId.DOUBLE_EDGE, 0); + game.move.use(MoveId.DOUBLE_EDGE, 1); + + await game.toNextTurn(); + + expect(playerPokemon1.hp).toBeLessThan(playerPokemon1.getMaxHp()); + expect(playerPokemon2.hp).toBeLessThan(playerPokemon2.getMaxHp()); + }); +});