Spaces:
Paused
Paused
| 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; | |
| } | |
| }, | |
| }, | |
| }; | |