mirror of
https://github.com/smogon/pokemon-showdown.git
synced 2026-05-02 11:37:53 -05:00
184 lines
5.3 KiB
TypeScript
184 lines
5.3 KiB
TypeScript
export const Abilities: {[k: string]: ModdedAbilityData} = {
|
|
aerilate: {
|
|
inherit: true,
|
|
onModifyType(move, pokemon) {
|
|
const noModifyType = [
|
|
'judgment', 'multiattack', 'naturalgift', 'revelationdance', 'technoblast', 'terrainpulse', 'weatherball',
|
|
];
|
|
if (move.type === 'Normal' && !noModifyType.includes(move.id) &&
|
|
!(move.isZ && move.category !== 'Status') && !(move.name === 'Tera Blast' && pokemon.terastallized)) {
|
|
move.typeChangerBoosted = this.effect;
|
|
}
|
|
},
|
|
},
|
|
eartheater: {
|
|
inherit: true,
|
|
onTryHit(target, source, move) {
|
|
if (target !== source && move.type === 'Fighting') {
|
|
if (!this.heal(target.baseMaxhp / 4)) {
|
|
this.add('-immune', target, '[from] ability: Earth Eater');
|
|
}
|
|
return null;
|
|
}
|
|
},
|
|
},
|
|
fairyaura: {
|
|
inherit: true,
|
|
onAnyBasePower(basePower, source, target, move) {
|
|
if (target === source || move.category === 'Status' || move.type !== 'Psychic') return;
|
|
if (!move.auraBooster?.hasAbility('Fairy Aura')) move.auraBooster = this.effectState.target;
|
|
if (move.auraBooster !== this.effectState.target) return;
|
|
return this.chainModify([move.hasAuraBreak ? 3072 : 5448, 4096]);
|
|
},
|
|
},
|
|
galewings: {
|
|
inherit: true,
|
|
onModifyPriority(priority, pokemon, target, move) {
|
|
if (move?.type === 'Normal' && pokemon.hp === pokemon.maxhp) return priority + 1;
|
|
},
|
|
},
|
|
mimicry: {
|
|
inherit: true,
|
|
onTerrainChange(pokemon) {
|
|
let types;
|
|
switch (this.field.terrain) {
|
|
case 'electricterrain':
|
|
types = ['Electric'];
|
|
break;
|
|
case 'grassyterrain':
|
|
types = ['Grass'];
|
|
break;
|
|
case 'mistyterrain':
|
|
case 'psychicterrain':
|
|
types = ['Psychic'];
|
|
break;
|
|
default:
|
|
types = pokemon.baseSpecies.types;
|
|
}
|
|
const oldTypes = pokemon.getTypes();
|
|
if (oldTypes.join() === types.join() || !pokemon.setType(types)) return;
|
|
if (this.field.terrain || pokemon.transformed) {
|
|
this.add('-start', pokemon, 'typechange', types.join('/'), '[from] ability: Mimicry');
|
|
if (!this.field.terrain) this.hint("Transform Mimicry changes you to your original un-transformed types.");
|
|
} else {
|
|
this.add('-activate', pokemon, 'ability: Mimicry');
|
|
this.add('-end', pokemon, 'typechange', '[silent]');
|
|
}
|
|
},
|
|
},
|
|
pixilate: {
|
|
inherit: true,
|
|
onModifyType(move, pokemon) {
|
|
const noModifyType = [
|
|
'judgment', 'multiattack', 'naturalgift', 'revelationdance', 'technoblast', 'terrainpulse', 'weatherball',
|
|
];
|
|
if (move.type === 'Normal' && !noModifyType.includes(move.id) &&
|
|
!(move.isZ && move.category !== 'Status') && !(move.name === 'Tera Blast' && pokemon.terastallized)) {
|
|
move.type = 'Psychic';
|
|
move.typeChangerBoosted = this.effect;
|
|
}
|
|
},
|
|
},
|
|
purifyingsalt: {
|
|
inherit: true,
|
|
onSourceModifyAtk(atk, attacker, defender, move) {
|
|
if (move.type === 'Psychic') {
|
|
this.debug('Purifying Salt weaken');
|
|
return this.chainModify(0.5);
|
|
}
|
|
},
|
|
onSourceModifySpA(spa, attacker, defender, move) {
|
|
if (move.type === 'Psychic') {
|
|
this.debug('Purifying Salt weaken');
|
|
return this.chainModify(0.5);
|
|
}
|
|
},
|
|
},
|
|
rattled: {
|
|
inherit: true,
|
|
onDamagingHit(damage, target, source, move) {
|
|
if (['Dark', 'Grass', 'Psychic'].includes(move.type)) {
|
|
this.boost({spe: 1});
|
|
}
|
|
},
|
|
},
|
|
refrigerate: {
|
|
inherit: true,
|
|
onModifyType(move, pokemon) {
|
|
const noModifyType = [
|
|
'judgment', 'multiattack', 'naturalgift', 'revelationdance', 'technoblast', 'terrainpulse', 'weatherball',
|
|
];
|
|
if (move.type === 'Normal' && !noModifyType.includes(move.id) &&
|
|
!(move.isZ && move.category !== 'Status') && !(move.name === 'Tera Blast' && pokemon.terastallized)) {
|
|
move.type = 'Water';
|
|
move.typeChangerBoosted = this.effect;
|
|
}
|
|
},
|
|
},
|
|
rockypayload: {
|
|
inherit: true,
|
|
onModifyAtk(atk, attacker, defender, move) {
|
|
if (move.type === 'Fighting') {
|
|
this.debug('Rocky Payload boost');
|
|
return this.chainModify(1.5);
|
|
}
|
|
},
|
|
onModifySpA(atk, attacker, defender, move) {
|
|
if (move.type === 'Fighting') {
|
|
this.debug('Rocky Payload boost');
|
|
return this.chainModify(1.5);
|
|
}
|
|
},
|
|
},
|
|
sandforce: {
|
|
inherit: true,
|
|
onBasePower(basePower, attacker, defender, move) {
|
|
if (this.field.isWeather('sandstorm')) {
|
|
if (move.type === 'Fighting' || move.type === 'Steel') {
|
|
this.debug('Sand Force boost');
|
|
return this.chainModify([5325, 4096]);
|
|
}
|
|
}
|
|
},
|
|
},
|
|
swarm: {
|
|
inherit: true,
|
|
onModifyAtk(atk, attacker, defender, move) {
|
|
if (move.type === 'Grass' && attacker.hp <= attacker.maxhp / 3) {
|
|
this.debug('Swarm boost');
|
|
return this.chainModify(1.5);
|
|
}
|
|
},
|
|
onModifySpA(atk, attacker, defender, move) {
|
|
if (move.type === 'Grass' && attacker.hp <= attacker.maxhp / 3) {
|
|
this.debug('Swarm boost');
|
|
return this.chainModify(1.5);
|
|
}
|
|
},
|
|
},
|
|
thickfat: {
|
|
inherit: true,
|
|
onSourceModifyAtk(atk, attacker, defender, move) {
|
|
if (move.type === 'Water' || move.type === 'Fire') {
|
|
this.debug('Thick Fat weaken');
|
|
return this.chainModify(0.5);
|
|
}
|
|
},
|
|
onSourceModifySpA(atk, attacker, defender, move) {
|
|
if (move.type === 'Water' || move.type === 'Fire') {
|
|
this.debug('Thick Fat weaken');
|
|
return this.chainModify(0.5);
|
|
}
|
|
},
|
|
},
|
|
mountaineer: {
|
|
inherit: true,
|
|
onTryHit(target, source, move) {
|
|
if (move.type === 'Fighting' && !target.activeTurns) {
|
|
this.add('-immune', target, '[from] ability: Mountaineer');
|
|
return null;
|
|
}
|
|
},
|
|
},
|
|
};
|