pokemon-showdown/data/mods/gen8/abilities.ts
Guangcong Luo 78439b4a02
Update to ESLint 9 (#10926)
ESLint has a whole new config format, so I figure it's a good time to
make the config system saner.

- First, we no longer have separate eslint-no-types configs. Lint
  performance shouldn't be enough of a problem to justify the
  relevant maintenance complexity.

- Second, our base config should work out-of-the-box now. `npx eslint`
  will work as expected, without any CLI flags. You should still use
  `npm run lint` which adds the `--cached` flag for performance.

- Third, whatever updates I did fixed style linting, which apparently
  has been bugged for quite some time, considering all the obvious
  mixed-tabs-and-spaces issues I found in the upgrade.

Also here are some changes to our style rules. In particular:

- Curly brackets (for objects etc) now have spaces inside them. Sorry
  for the huge change. ESLint doesn't support our old style, and most
  projects use Prettier style, so we might as well match them in this way.
  See https://github.com/eslint-stylistic/eslint-stylistic/issues/415

- String + number concatenation is no longer allowed. We now
  consistently use template strings for this.
2025-02-25 20:03:46 -08:00

1225 lines
17 KiB
TypeScript

/*
Ratings and how they work:
-1: Detrimental
An ability that severely harms the user.
ex. Defeatist, Slow Start
0: Useless
An ability with no overall benefit in a singles battle.
ex. Color Change, Plus
1: Ineffective
An ability that has minimal effect or is only useful in niche situations.
ex. Light Metal, Suction Cups
2: Useful
An ability that can be generally useful.
ex. Flame Body, Overcoat
3: Effective
An ability with a strong effect on the user or foe.
ex. Chlorophyll, Sturdy
4: Very useful
One of the more popular abilities. It requires minimal support to be effective.
ex. Adaptability, Magic Bounce
5: Essential
The sort of ability that defines metagames.
ex. Imposter, Shadow Tag
*/
export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = {
noability: {
inherit: true,
rating: 0.1,
},
adaptability: {
inherit: true,
rating: 4,
},
aerilate: {
inherit: true,
rating: 4,
},
aftermath: {
inherit: true,
rating: 2.5,
},
airlock: {
inherit: true,
rating: 2,
},
analytic: {
inherit: true,
rating: 2.5,
},
angerpoint: {
inherit: true,
rating: 1.5,
},
anticipation: {
inherit: true,
rating: 0.5,
},
arenatrap: {
inherit: true,
rating: 5,
},
aromaveil: {
inherit: true,
rating: 2,
},
asoneglastrier: {
inherit: true,
rating: 3.5,
},
asonespectrier: {
inherit: true,
rating: 3.5,
},
aurabreak: {
inherit: true,
rating: 1,
},
baddreams: {
inherit: true,
rating: 1.5,
},
ballfetch: {
inherit: true,
rating: 0,
},
battery: {
inherit: true,
rating: 0,
},
battlearmor: {
inherit: true,
rating: 1,
},
battlebond: {
inherit: true,
onSourceAfterFaint(length, target, source, effect) {
if (effect?.effectType !== 'Move') {
return;
}
if (source.species.id === 'greninjabond' && source.hp && !source.transformed && source.side.foePokemonLeft()) {
this.add('-activate', source, 'ability: Battle Bond');
source.formeChange('Greninja-Ash', this.effect, true);
}
},
onModifyMovePriority: -1,
onModifyMove(move, attacker) {
if (move.id === 'watershuriken' && attacker.species.name === 'Greninja-Ash' &&
!attacker.transformed) {
move.multihit = 3;
}
},
isNonstandard: null,
rating: 4,
},
beastboost: {
inherit: true,
rating: 3.5,
},
berserk: {
inherit: true,
rating: 2,
},
bigpecks: {
inherit: true,
rating: 0.5,
},
blaze: {
inherit: true,
rating: 2,
},
bulletproof: {
inherit: true,
rating: 3,
},
cheekpouch: {
inherit: true,
rating: 2,
},
chillingneigh: {
inherit: true,
rating: 3,
},
chlorophyll: {
inherit: true,
rating: 3,
},
clearbody: {
inherit: true,
rating: 2,
},
cloudnine: {
inherit: true,
rating: 2,
},
colorchange: {
inherit: true,
rating: 0,
},
comatose: {
inherit: true,
rating: 4,
},
competitive: {
inherit: true,
onAfterEachBoost(boost, target, source, effect) {
if (!source || target.isAlly(source)) {
if (effect.id === 'stickyweb') {
this.hint("In Gen 8, Court Change Sticky Web counts as lowering your own Speed, and Competitive only affects stats lowered by foes.", true, source.side);
}
return;
}
let statsLowered = false;
let i: BoostID;
for (i in boost) {
if (boost[i]! < 0) {
statsLowered = true;
}
}
if (statsLowered) {
this.boost({ spa: 2 }, target, target, null, false, true);
}
},
rating: 2.5,
},
compoundeyes: {
inherit: true,
rating: 3,
},
contrary: {
inherit: true,
rating: 4.5,
},
corrosion: {
inherit: true,
rating: 2.5,
},
cottondown: {
inherit: true,
rating: 2,
},
curiousmedicine: {
inherit: true,
rating: 0,
},
cursedbody: {
inherit: true,
rating: 2,
},
cutecharm: {
inherit: true,
rating: 0.5,
},
damp: {
inherit: true,
rating: 1,
},
dancer: {
inherit: true,
rating: 1.5,
},
darkaura: {
inherit: true,
rating: 3,
},
dauntlessshield: {
inherit: true,
onStart(pokemon) {
this.boost({ def: 1 }, pokemon);
},
rating: 3.5,
},
dazzling: {
inherit: true,
rating: 2.5,
},
defeatist: {
inherit: true,
rating: -1,
},
defiant: {
inherit: true,
onAfterEachBoost(boost, target, source, effect) {
if (!source || target.isAlly(source)) {
if (effect.id === 'stickyweb') {
this.hint("In Gen 8, Court Change Sticky Web counts as lowering your own Speed, and Defiant only affects stats lowered by foes.", true, source.side);
}
return;
}
let statsLowered = false;
let i: BoostID;
for (i in boost) {
if (boost[i]! < 0) {
statsLowered = true;
}
}
if (statsLowered) {
this.boost({ atk: 2 }, target, target, null, false, true);
}
},
rating: 2.5,
},
deltastream: {
inherit: true,
rating: 4,
},
desolateland: {
inherit: true,
rating: 4.5,
},
disguise: {
inherit: true,
rating: 3.5,
},
download: {
inherit: true,
rating: 3.5,
},
dragonsmaw: {
inherit: true,
rating: 3.5,
},
drizzle: {
inherit: true,
rating: 4,
},
drought: {
inherit: true,
rating: 4,
},
dryskin: {
inherit: true,
rating: 3,
},
earlybird: {
inherit: true,
rating: 1.5,
},
effectspore: {
inherit: true,
rating: 2,
},
electricsurge: {
inherit: true,
rating: 4,
},
emergencyexit: {
inherit: true,
rating: 1,
},
fairyaura: {
inherit: true,
rating: 3,
},
filter: {
inherit: true,
rating: 3,
},
flamebody: {
inherit: true,
rating: 2,
},
flareboost: {
inherit: true,
rating: 2,
},
flashfire: {
inherit: true,
rating: 3.5,
},
flowergift: {
inherit: true,
rating: 1,
},
flowerveil: {
inherit: true,
rating: 0,
},
fluffy: {
inherit: true,
rating: 3.5,
},
forecast: {
inherit: true,
rating: 2,
},
forewarn: {
inherit: true,
rating: 0.5,
},
friendguard: {
inherit: true,
rating: 0,
},
frisk: {
inherit: true,
rating: 1.5,
},
fullmetalbody: {
inherit: true,
rating: 2,
},
furcoat: {
inherit: true,
rating: 4,
},
galewings: {
inherit: true,
rating: 2.5,
},
galvanize: {
inherit: true,
rating: 4,
},
gluttony: {
inherit: true,
rating: 1.5,
},
gooey: {
inherit: true,
rating: 2,
},
gorillatactics: {
inherit: true,
rating: 4.5,
},
grasspelt: {
inherit: true,
rating: 0.5,
},
grassysurge: {
inherit: true,
rating: 4,
},
grimneigh: {
inherit: true,
rating: 3,
},
gulpmissile: {
inherit: true,
flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, cantsuppress: 1, notransform: 1 },
rating: 2.5,
},
guts: {
inherit: true,
rating: 3,
},
harvest: {
inherit: true,
rating: 2.5,
},
healer: {
inherit: true,
rating: 0,
},
heatproof: {
inherit: true,
onSourceModifyAtk() {},
onSourceModifySpA() {},
onSourceBasePowerPriority: 18,
onSourceBasePower(basePower, attacker, defender, move) {
if (move.type === 'Fire') {
this.debug('Heatproof BP weaken');
return this.chainModify(0.5);
}
},
rating: 2,
},
heavymetal: {
inherit: true,
rating: 0,
},
honeygather: {
inherit: true,
rating: 0,
},
hugepower: {
inherit: true,
rating: 5,
},
hungerswitch: {
inherit: true,
rating: 1,
},
hustle: {
inherit: true,
rating: 3.5,
},
hydration: {
inherit: true,
rating: 1.5,
},
hypercutter: {
inherit: true,
rating: 1.5,
},
icebody: {
inherit: true,
rating: 1,
},
iceface: {
inherit: true,
rating: 3,
},
icescales: {
inherit: true,
rating: 4,
},
illuminate: {
inherit: true,
onTryBoost() {},
onModifyMove() {},
flags: {},
rating: 0,
},
illusion: {
inherit: true,
rating: 4.5,
},
immunity: {
inherit: true,
rating: 2,
},
imposter: {
inherit: true,
rating: 5,
},
infiltrator: {
inherit: true,
rating: 2.5,
},
innardsout: {
inherit: true,
rating: 4,
},
innerfocus: {
inherit: true,
rating: 1.5,
},
insomnia: {
inherit: true,
rating: 2,
},
intimidate: {
inherit: true,
rating: 3.5,
},
intrepidsword: {
inherit: true,
onStart(pokemon) {
this.boost({ atk: 1 }, pokemon);
},
rating: 4,
},
ironbarbs: {
inherit: true,
rating: 2.5,
},
ironfist: {
inherit: true,
rating: 3,
},
justified: {
inherit: true,
rating: 2.5,
},
keeneye: {
inherit: true,
rating: 0.5,
},
klutz: {
inherit: true,
rating: -1,
},
leafguard: {
inherit: true,
rating: 0.5,
},
levitate: {
inherit: true,
rating: 3.5,
},
libero: {
inherit: true,
onPrepareHit(source, target, move) {
if (move.hasBounced || move.flags['futuremove'] || move.sourceEffect === 'snatch' || move.callsMove) return;
const type = move.type;
if (type && type !== '???' && source.getTypes().join() !== type) {
if (!source.setType(type)) return;
this.add('-start', source, 'typechange', type, '[from] ability: Libero');
}
},
rating: 4.5,
},
lightmetal: {
inherit: true,
rating: 1,
},
lightningrod: {
inherit: true,
rating: 3,
},
limber: {
inherit: true,
rating: 2,
},
liquidooze: {
inherit: true,
rating: 1.5,
},
liquidvoice: {
inherit: true,
rating: 1.5,
},
longreach: {
inherit: true,
rating: 1,
},
magicbounce: {
inherit: true,
rating: 4,
},
magicguard: {
inherit: true,
rating: 4,
},
magician: {
inherit: true,
rating: 1.5,
},
magmaarmor: {
inherit: true,
rating: 1,
},
magnetpull: {
inherit: true,
rating: 4,
},
marvelscale: {
inherit: true,
rating: 2.5,
},
megalauncher: {
inherit: true,
rating: 3,
},
merciless: {
inherit: true,
rating: 1.5,
},
mimicry: {
inherit: true,
rating: 0.5,
},
minus: {
inherit: true,
rating: 0,
},
mirrorarmor: {
inherit: true,
rating: 2.5,
},
mistysurge: {
inherit: true,
rating: 3.5,
},
moldbreaker: {
inherit: true,
rating: 3.5,
},
moody: {
inherit: true,
rating: 5,
},
motordrive: {
inherit: true,
rating: 3,
},
moxie: {
inherit: true,
rating: 3,
},
multiscale: {
inherit: true,
rating: 3.5,
},
multitype: {
inherit: true,
rating: 4,
},
mummy: {
inherit: true,
rating: 2,
},
naturalcure: {
inherit: true,
rating: 2.5,
},
neuroforce: {
inherit: true,
rating: 2.5,
},
neutralizinggas: {
inherit: true,
rating: 4,
},
noguard: {
inherit: true,
rating: 4,
},
normalize: {
inherit: true,
rating: 0,
},
oblivious: {
inherit: true,
rating: 1.5,
},
overcoat: {
inherit: true,
rating: 2,
},
overgrow: {
inherit: true,
rating: 2,
},
owntempo: {
inherit: true,
rating: 1.5,
},
parentalbond: {
inherit: true,
rating: 4.5,
},
pastelveil: {
inherit: true,
rating: 2,
},
perishbody: {
inherit: true,
rating: 1,
},
pickpocket: {
inherit: true,
rating: 1,
},
pickup: {
inherit: true,
rating: 0.5,
},
pixilate: {
inherit: true,
rating: 4,
},
plus: {
inherit: true,
rating: 0,
},
poisonheal: {
inherit: true,
rating: 4,
},
poisonpoint: {
inherit: true,
rating: 1.5,
},
poisontouch: {
inherit: true,
rating: 2,
},
powerconstruct: {
inherit: true,
rating: 5,
},
powerofalchemy: {
inherit: true,
rating: 0,
},
powerspot: {
inherit: true,
rating: 1,
},
prankster: {
inherit: true,
rating: 4,
},
pressure: {
inherit: true,
rating: 2.5,
},
primordialsea: {
inherit: true,
rating: 4.5,
},
prismarmor: {
inherit: true,
rating: 3,
},
propellertail: {
inherit: true,
rating: 0,
},
protean: {
inherit: true,
onPrepareHit(source, target, move) {
if (move.hasBounced || move.flags['futuremove'] || move.sourceEffect === 'snatch' || move.callsMove) return;
const type = move.type;
if (type && type !== '???' && source.getTypes().join() !== type) {
if (!source.setType(type)) return;
this.add('-start', source, 'typechange', type, '[from] ability: Protean');
}
},
rating: 4.5,
},
psychicsurge: {
inherit: true,
rating: 4,
},
punkrock: {
inherit: true,
rating: 3.5,
},
purepower: {
inherit: true,
rating: 5,
},
queenlymajesty: {
inherit: true,
rating: 2.5,
},
quickdraw: {
inherit: true,
rating: 2.5,
},
quickfeet: {
inherit: true,
rating: 2.5,
},
raindish: {
inherit: true,
rating: 1.5,
},
rattled: {
inherit: true,
rating: 1.5,
},
receiver: {
inherit: true,
rating: 0,
},
reckless: {
inherit: true,
rating: 3,
},
refrigerate: {
inherit: true,
rating: 4,
},
regenerator: {
inherit: true,
rating: 4.5,
},
ripen: {
inherit: true,
rating: 2,
},
rivalry: {
inherit: true,
rating: 0,
},
rkssystem: {
inherit: true,
rating: 4,
},
rockhead: {
inherit: true,
rating: 3,
},
roughskin: {
inherit: true,
rating: 2.5,
},
runaway: {
inherit: true,
rating: 0,
},
sandforce: {
inherit: true,
rating: 2,
},
sandrush: {
inherit: true,
rating: 3,
},
sandspit: {
inherit: true,
rating: 2,
},
sandstream: {
inherit: true,
rating: 4,
},
sandveil: {
inherit: true,
rating: 1.5,
},
sapsipper: {
inherit: true,
rating: 3,
},
schooling: {
inherit: true,
rating: 3,
},
scrappy: {
inherit: true,
rating: 3,
},
screencleaner: {
inherit: true,
rating: 2,
},
serenegrace: {
inherit: true,
rating: 3.5,
},
shadowshield: {
inherit: true,
rating: 3.5,
},
shadowtag: {
inherit: true,
rating: 5,
},
shedskin: {
inherit: true,
rating: 3,
},
sheerforce: {
inherit: true,
rating: 3.5,
},
shellarmor: {
inherit: true,
rating: 1,
},
shielddust: {
inherit: true,
rating: 2,
},
shieldsdown: {
inherit: true,
rating: 3,
},
simple: {
inherit: true,
rating: 4,
},
skilllink: {
inherit: true,
rating: 3,
},
slowstart: {
inherit: true,
rating: -1,
},
slushrush: {
inherit: true,
rating: 3,
},
sniper: {
inherit: true,
rating: 2,
},
snowcloak: {
inherit: true,
rating: 1.5,
},
snowwarning: {
inherit: true,
onStart(source) {
this.field.setWeather('hail');
},
rating: 4,
},
solarpower: {
inherit: true,
rating: 2,
},
solidrock: {
inherit: true,
rating: 3,
},
soulheart: {
inherit: true,
rating: 3.5,
},
soundproof: {
inherit: true,
rating: 1.5,
},
speedboost: {
inherit: true,
rating: 4.5,
},
stakeout: {
inherit: true,
rating: 4.5,
},
stall: {
inherit: true,
rating: -1,
},
stalwart: {
inherit: true,
rating: 0,
},
stamina: {
inherit: true,
rating: 3.5,
},
stancechange: {
inherit: true,
rating: 4,
},
static: {
inherit: true,
rating: 2,
},
steadfast: {
inherit: true,
rating: 1,
},
steamengine: {
inherit: true,
rating: 2,
},
steelworker: {
inherit: true,
rating: 3.5,
},
steelyspirit: {
inherit: true,
rating: 3.5,
},
stench: {
inherit: true,
rating: 0.5,
},
stickyhold: {
inherit: true,
rating: 2,
},
stormdrain: {
inherit: true,
rating: 3,
},
strongjaw: {
inherit: true,
rating: 3,
},
sturdy: {
inherit: true,
rating: 3,
},
suctioncups: {
inherit: true,
rating: 1,
},
superluck: {
inherit: true,
rating: 1.5,
},
surgesurfer: {
inherit: true,
rating: 3,
},
swarm: {
inherit: true,
rating: 2,
},
sweetveil: {
inherit: true,
rating: 2,
},
swiftswim: {
inherit: true,
rating: 3,
},
symbiosis: {
inherit: true,
rating: 0,
},
synchronize: {
inherit: true,
rating: 2,
},
tangledfeet: {
inherit: true,
rating: 1,
},
tanglinghair: {
inherit: true,
rating: 2,
},
technician: {
inherit: true,
rating: 3.5,
},
telepathy: {
inherit: true,
rating: 0,
},
teravolt: {
inherit: true,
rating: 3.5,
},
thickfat: {
inherit: true,
rating: 3.5,
},
tintedlens: {
inherit: true,
rating: 4,
},
torrent: {
inherit: true,
rating: 2,
},
toughclaws: {
inherit: true,
rating: 3.5,
},
toxicboost: {
inherit: true,
rating: 2.5,
},
trace: {
inherit: true,
rating: 3,
},
transistor: {
inherit: true,
onModifyAtk(atk, attacker, defender, move) {
if (move.type === 'Electric') {
this.debug('Transistor boost');
return this.chainModify(1.5);
}
},
onModifySpA(atk, attacker, defender, move) {
if (move.type === 'Electric') {
this.debug('Transistor boost');
return this.chainModify(1.5);
}
},
rating: 3.5,
},
triage: {
inherit: true,
rating: 3.5,
},
truant: {
inherit: true,
rating: -1,
},
turboblaze: {
inherit: true,
rating: 3.5,
},
unaware: {
inherit: true,
rating: 4,
},
unburden: {
inherit: true,
rating: 3.5,
},
unnerve: {
inherit: true,
rating: 1.5,
},
unseenfist: {
inherit: true,
rating: 2,
},
victorystar: {
inherit: true,
rating: 2,
},
vitalspirit: {
inherit: true,
rating: 2,
},
voltabsorb: {
inherit: true,
rating: 3.5,
},
wanderingspirit: {
inherit: true,
rating: 2.5,
},
waterabsorb: {
inherit: true,
rating: 3.5,
},
waterbubble: {
inherit: true,
rating: 4.5,
},
watercompaction: {
inherit: true,
rating: 1.5,
},
waterveil: {
inherit: true,
rating: 2,
},
weakarmor: {
inherit: true,
rating: 1,
},
whitesmoke: {
inherit: true,
rating: 2,
},
wimpout: {
inherit: true,
rating: 1,
},
wonderguard: {
inherit: true,
flags: { failroleplay: 1, noreceiver: 1, failskillswap: 1, breakable: 1 },
rating: 5,
},
wonderskin: {
inherit: true,
rating: 2,
},
zenmode: {
inherit: true,
rating: 0,
},
mountaineer: {
inherit: true,
rating: 3,
},
rebound: {
inherit: true,
rating: 3,
},
persistent: {
inherit: true,
rating: 3,
},
};