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, }, };