mirror of
https://github.com/smogon/pokemon-showdown.git
synced 2026-05-02 19:47:44 -05:00
For side conditions, `onStart`/`onRestart`/`onResidual`/`onEnd` have been renamed `onSideStart`/`onSideRestart`/`onSideResidual`/`onSideEnd`, with the `onResidualOrder` properties renamed `onSideResidualOrder`. For field conditions, `onStart`/`onRestart`/`onResidual`/`onEnd` have been renamed `onFieldStart`/`onFieldRestart`/`onFieldResidual`/`onFieldEnd`, with the `onResidualOrder` properties renamed `onFieldResidualOrder`. (The `onField` and `onSide` part helps make it clear to the type system that the first argument is a Field or Side, not a Pokemon.) Side and field conditions can now use `onResidual` to tick separately on each pokemon in Speed order. `onResidualOrder` (the per-pokemon tick) can be timed separate from `onSideResidualOrder` (the per-condition tick), allowing conditions to end at a different priority than they tick per-pokemon. Relatedly, `onTeamPreview` and `onStart` in formats now need to be `onFieldTeamPreview` and `onFieldStart`. Unrelatedly, `effectData` has been renamed `effectState`, and the corresponding state containers (`pokemon.statusData`, `pokemon.speciesData`, `pokemon.itemData`, `pokemon.abilityData`, `field.weatherData`, `field.terrainData`) have been similarly renamed. I renamed the types a while ago, but I was holding off renaming the fields because it would be a breaking change. But this is a breaking change anyway, so we might as well do it now. Note: `onResidual` will tick even on `onSideEnd` turns, although `onSideResidual` won't. When refactoring weather, remember to check `this.state.duration` so you don't deal weather damage on the ending turn. Intended as a better fix for #8216
127 lines
3.2 KiB
TypeScript
127 lines
3.2 KiB
TypeScript
export const Abilities: {[k: string]: ModdedAbilityData} = {
|
|
aerilate: {
|
|
inherit: true,
|
|
onBasePower(basePower, pokemon, target, move) {
|
|
if (move.aerilateBoosted) return this.chainModify([5325, 4096]);
|
|
},
|
|
rating: 4.5,
|
|
},
|
|
aftermath: {
|
|
inherit: true,
|
|
onDamagingHit(damage, target, source, move) {
|
|
if (move.flags['contact'] && !target.hp) {
|
|
this.damage(source.baseMaxhp / 4, source, target, null, true);
|
|
}
|
|
},
|
|
},
|
|
galewings: {
|
|
inherit: true,
|
|
onModifyPriority(priority, pokemon, target, move) {
|
|
if (move && move.type === 'Flying') return priority + 1;
|
|
},
|
|
rating: 4,
|
|
},
|
|
ironbarbs: {
|
|
inherit: true,
|
|
onDamagingHit(damage, target, source, move) {
|
|
if (move.flags['contact']) {
|
|
this.damage(source.baseMaxhp / 8, source, target, null, true);
|
|
}
|
|
},
|
|
},
|
|
liquidooze: {
|
|
inherit: true,
|
|
onSourceTryHeal(damage, target, source, effect) {
|
|
this.debug("Heal is occurring: " + target + " <- " + source + " :: " + effect.id);
|
|
const canOoze = ['drain', 'leechseed'];
|
|
if (canOoze.includes(effect.id)) {
|
|
this.damage(damage, null, null, null, true);
|
|
return 0;
|
|
}
|
|
},
|
|
},
|
|
magicguard: {
|
|
inherit: true,
|
|
onDamage(damage, target, source, effect) {
|
|
if (effect.effectType !== 'Move') return false;
|
|
},
|
|
},
|
|
normalize: {
|
|
inherit: true,
|
|
onModifyMovePriority: 1,
|
|
onModifyMove(move) {
|
|
if (move.id !== 'struggle' && this.dex.moves.get(move.id).type !== 'Normal') {
|
|
move.type = 'Normal';
|
|
}
|
|
},
|
|
rating: -1,
|
|
},
|
|
parentalbond: {
|
|
inherit: true,
|
|
// Damage modifier implemented in BattleActions#modifyDamage()
|
|
rating: 5,
|
|
},
|
|
pixilate: {
|
|
inherit: true,
|
|
onBasePower(basePower, pokemon, target, move) {
|
|
if (move.pixilateBoosted) return this.chainModify([5325, 4096]);
|
|
},
|
|
rating: 4.5,
|
|
},
|
|
refrigerate: {
|
|
inherit: true,
|
|
onBasePower(basePower, pokemon, target, move) {
|
|
if (move.refrigerateBoosted) return this.chainModify([5325, 4096]);
|
|
},
|
|
rating: 4.5,
|
|
},
|
|
roughskin: {
|
|
inherit: true,
|
|
onDamagingHit(damage, target, source, move) {
|
|
if (move.flags['contact']) {
|
|
this.damage(source.baseMaxhp / 8, source, target, null, true);
|
|
}
|
|
},
|
|
},
|
|
stancechange: {
|
|
inherit: true,
|
|
onBeforeMovePriority: 11,
|
|
onBeforeMove(attacker, defender, move) {
|
|
if (attacker.species.baseSpecies !== 'Aegislash' || attacker.transformed) return;
|
|
if (move.category === 'Status' && move.id !== 'kingsshield') return;
|
|
const targetForme = (move.id === 'kingsshield' ? 'Aegislash' : 'Aegislash-Blade');
|
|
if (attacker.species.name !== targetForme) attacker.formeChange(targetForme);
|
|
},
|
|
onModifyMove() {},
|
|
},
|
|
symbiosis: {
|
|
inherit: true,
|
|
onAllyAfterUseItem(item, pokemon) {
|
|
const source = this.effectState.target;
|
|
const myItem = source.takeItem();
|
|
if (!myItem) return;
|
|
if (
|
|
!this.singleEvent('TakeItem', myItem, source.itemState, pokemon, source, this.effect, myItem) ||
|
|
!pokemon.setItem(myItem)
|
|
) {
|
|
source.item = myItem.id;
|
|
return;
|
|
}
|
|
this.add('-activate', source, 'ability: Symbiosis', myItem, '[of] ' + pokemon);
|
|
},
|
|
},
|
|
weakarmor: {
|
|
inherit: true,
|
|
onDamagingHit(damage, target, source, move) {
|
|
if (move.category === 'Physical') {
|
|
this.boost({def: -1, spe: 1}, target, target);
|
|
}
|
|
},
|
|
rating: 0.5,
|
|
},
|
|
zenmode: {
|
|
inherit: true,
|
|
isPermanent: false,
|
|
},
|
|
};
|