Spaces:
Sleeping
Sleeping
export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = { | |
disguise: { | |
inherit: true, | |
onDamage(damage, target, source, effect) { | |
if ( | |
effect && effect.effectType === 'Move' && | |
['mimikyu', 'mimikyutotem'].includes(target.species.id) && !target.transformed | |
) { | |
if (["rollout", "iceball"].includes(effect.id)) { | |
source.volatiles[effect.id].contactHitCount--; | |
} | |
this.add("-activate", target, "ability: Disguise"); | |
this.effectState.busted = true; | |
return 0; | |
} | |
}, | |
onUpdate(pokemon) { | |
if (['mimikyu', 'mimikyutotem'].includes(pokemon.species.id) && this.effectState.busted) { | |
const speciesid = pokemon.species.id === 'mimikyutotem' ? 'Mimikyu-Busted-Totem' : 'Mimikyu-Busted'; | |
pokemon.formeChange(speciesid, this.effect, true); | |
} | |
}, | |
}, | |
darkaura: { | |
inherit: true, | |
flags: { breakable: 1 }, | |
}, | |
fairyaura: { | |
inherit: true, | |
flags: { breakable: 1 }, | |
}, | |
innerfocus: { | |
inherit: true, | |
rating: 1, | |
onTryBoost() {}, | |
}, | |
moody: { | |
inherit: true, | |
onResidual(pokemon) { | |
let stats: BoostID[] = []; | |
const boost: SparseBoostsTable = {}; | |
let statPlus: BoostID; | |
for (statPlus in pokemon.boosts) { | |
if (pokemon.boosts[statPlus] < 6) { | |
stats.push(statPlus); | |
} | |
} | |
let randomStat = stats.length ? this.sample(stats) : undefined; | |
if (randomStat) boost[randomStat] = 2; | |
stats = []; | |
let statMinus: BoostID; | |
for (statMinus in pokemon.boosts) { | |
if (pokemon.boosts[statMinus] > -6 && statMinus !== randomStat) { | |
stats.push(statMinus); | |
} | |
} | |
randomStat = stats.length ? this.sample(stats) : undefined; | |
if (randomStat) boost[randomStat] = -1; | |
this.boost(boost, pokemon, pokemon); | |
}, | |
}, | |
oblivious: { | |
inherit: true, | |
onTryBoost() {}, | |
}, | |
owntempo: { | |
inherit: true, | |
onTryBoost() {}, | |
}, | |
rattled: { | |
onDamagingHit(damage, target, source, move) { | |
if (['Dark', 'Bug', 'Ghost'].includes(move.type)) { | |
this.boost({ spe: 1 }); | |
} | |
}, | |
name: "Rattled", | |
rating: 1.5, | |
num: 155, | |
}, | |
scrappy: { | |
inherit: true, | |
onTryBoost() {}, | |
}, | |
slowstart: { | |
inherit: true, | |
condition: { | |
duration: 5, | |
onResidualOrder: 28, | |
onResidualSubOrder: 2, | |
onStart(target) { | |
this.add('-start', target, 'ability: Slow Start'); | |
}, | |
onModifyAtkPriority: 5, | |
onModifyAtk(atk, pokemon, target, move) { | |
// This is because the game checks the move's category in data, rather than what it is currently, unlike e.g. Huge Power | |
if (this.dex.moves.get(move.id).category === 'Physical') { | |
return this.chainModify(0.5); | |
} | |
}, | |
onModifySpAPriority: 5, | |
onModifySpA(spa, pokemon, target, move) { | |
// Ordinary Z-moves like Breakneck Blitz will halve the user's Special Attack as well | |
if (this.dex.moves.get(move.id).category === 'Physical') { | |
return this.chainModify(0.5); | |
} | |
}, | |
onModifySpe(spe, pokemon) { | |
return this.chainModify(0.5); | |
}, | |
onEnd(target) { | |
this.add('-end', target, 'Slow Start'); | |
}, | |
}, | |
}, | |
soundproof: { | |
inherit: true, | |
onTryHit(target, source, move) { | |
if (move.flags['sound']) { | |
this.add('-immune', target, '[from] ability: Soundproof'); | |
return null; | |
} | |
}, | |
}, | |
technician: { | |
inherit: true, | |
onBasePowerPriority: 19, | |
}, | |
}; | |