export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = { cutecharm: { inherit: true, onDamagingHit(damage, target, source, move) { if (damage && move.flags['contact']) { if (this.randomChance(1, 3)) { source.addVolatile('attract', target); } } }, }, effectspore: { inherit: true, onDamagingHit(damage, target, source, move) { if (damage && move.flags['contact'] && !source.status) { const r = this.random(300); if (r < 10) { source.setStatus('slp', target); } else if (r < 20) { source.setStatus('par', target); } else if (r < 30) { source.setStatus('psn', target); } } }, }, flamebody: { inherit: true, onDamagingHit(damage, target, source, move) { if (damage && move.flags['contact']) { if (this.randomChance(1, 3)) { source.trySetStatus('brn', target); } } }, }, flashfire: { inherit: true, onTryHit(target, source, move) { if (target !== source && move.type === 'Fire') { if (move.id === 'willowisp' && (target.hasType('Fire') || target.status || target.volatiles['substitute'])) { return; } if (target.status === 'frz') { return; } if (!target.addVolatile('flashfire')) { this.add('-immune', target, '[from] ability: Flash Fire'); } return null; } }, }, forecast: { inherit: true, flags: {}, }, hustle: { inherit: true, onSourceModifyAccuracy(accuracy, target, source, move) { const physicalTypes = ['Normal', 'Fighting', 'Flying', 'Poison', 'Ground', 'Rock', 'Bug', 'Ghost', 'Steel']; if (physicalTypes.includes(move.type) && typeof accuracy === 'number') { return this.chainModify([3277, 4096]); } }, }, intimidate: { inherit: true, onStart(pokemon) { let activated = false; for (const target of pokemon.adjacentFoes()) { if (!target.volatiles['substitute']) { activated = true; break; } } if (!activated) { this.hint("In Gen 3, Intimidate does not activate if every target has a Substitute.", false, pokemon.side); return; } this.add('-ability', pokemon, 'Intimidate', 'boost'); for (const target of pokemon.adjacentFoes()) { if (target.volatiles['substitute']) { this.add('-immune', target); } else { this.boost({ atk: -1 }, target, pokemon, null, true); } } }, }, lightningrod: { onFoeRedirectTarget(target, source, source2, move) { // don't count Hidden Power as Electric-type if (this.dex.moves.get(move.id).type !== 'Electric') return; if (this.validTarget(this.effectState.target, source, move.target)) { return this.effectState.target; } }, flags: { breakable: 1 }, name: "Lightning Rod", rating: 0, num: 32, }, minus: { inherit: true, onModifySpA(spa, pokemon) { for (const active of this.getAllActive()) { if (!active.fainted && active.hasAbility('plus')) { return this.chainModify(1.5); } } }, }, plus: { inherit: true, onModifySpA(spa, pokemon) { for (const active of this.getAllActive()) { if (!active.fainted && active.hasAbility('minus')) { return this.chainModify(1.5); } } }, }, poisonpoint: { inherit: true, onDamagingHit(damage, target, source, move) { if (damage && move.flags['contact']) { if (this.randomChance(1, 3)) { source.trySetStatus('psn', target); } } }, }, pressure: { inherit: true, onStart(pokemon) { this.addSplit(pokemon.side.id, ['-ability', pokemon, 'Pressure', '[silent]']); }, }, raindish: { inherit: true, onWeather() {}, onResidualOrder: 10, onResidualSubOrder: 3, onResidual(pokemon) { if (['raindance', 'primordialsea'].includes(pokemon.effectiveWeather())) { this.heal(pokemon.baseMaxhp / 16); } }, }, roughskin: { inherit: true, onDamagingHit(damage, target, source, move) { if (damage && move.flags['contact']) { this.damage(source.baseMaxhp / 16, source, target); } }, }, shadowtag: { inherit: true, onFoeTrapPokemon(pokemon) { pokemon.trapped = true; }, }, static: { inherit: true, onDamagingHit(damage, target, source, move) { if (damage && move.flags['contact']) { if (this.randomChance(1, 3)) { source.trySetStatus('par', target); } } }, }, trace: { inherit: true, onUpdate() {}, onStart(pokemon) { const target = pokemon.side.randomFoe(); if (!target || target.fainted) return; const ability = target.getAbility(); if (pokemon.setAbility(ability)) { this.add('-ability', pokemon, ability, '[from] ability: Trace', `[of] ${target}`); } }, flags: {}, }, truant: { inherit: true, onStart() {}, onSwitchIn(pokemon) { pokemon.truantTurn = this.turn !== 0; }, onBeforeMove(pokemon) { if (pokemon.truantTurn) { this.add('cant', pokemon, 'ability: Truant'); return false; } }, onResidualOrder: 27, onResidual(pokemon) { pokemon.truantTurn = !pokemon.truantTurn; }, }, voltabsorb: { inherit: true, onTryHit(target, source, move) { if (target !== source && move.type === 'Electric' && move.id !== 'thunderwave') { if (!this.heal(target.baseMaxhp / 4)) { this.add('-immune', target, '[from] ability: Volt Absorb'); } return null; } }, }, };