Spaces:
Paused
Paused
| ; | |
| var __defProp = Object.defineProperty; | |
| var __getOwnPropDesc = Object.getOwnPropertyDescriptor; | |
| var __getOwnPropNames = Object.getOwnPropertyNames; | |
| var __hasOwnProp = Object.prototype.hasOwnProperty; | |
| var __export = (target, all) => { | |
| for (var name in all) | |
| __defProp(target, name, { get: all[name], enumerable: true }); | |
| }; | |
| var __copyProps = (to, from, except, desc) => { | |
| if (from && typeof from === "object" || typeof from === "function") { | |
| for (let key of __getOwnPropNames(from)) | |
| if (!__hasOwnProp.call(to, key) && key !== except) | |
| __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); | |
| } | |
| return to; | |
| }; | |
| var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); | |
| var abilities_exports = {}; | |
| __export(abilities_exports, { | |
| Abilities: () => Abilities | |
| }); | |
| module.exports = __toCommonJS(abilities_exports); | |
| const Abilities = { | |
| airlock: { | |
| inherit: true, | |
| onSwitchIn() { | |
| }, | |
| onStart(pokemon) { | |
| pokemon.abilityState.ending = false; | |
| } | |
| }, | |
| angerpoint: { | |
| inherit: true, | |
| onAfterSubDamage(damage, target, source, move) { | |
| if (!target.hp) | |
| return; | |
| if (move && move.effectType === "Move" && target.getMoveHitData(move).crit) { | |
| target.setBoost({ atk: 6 }); | |
| this.add("-setboost", target, "atk", 12, "[from] ability: Anger Point"); | |
| } | |
| }, | |
| rating: 1.5 | |
| }, | |
| baddreams: { | |
| inherit: true, | |
| onResidualOrder: 10, | |
| onResidualSubOrder: 10 | |
| }, | |
| blaze: { | |
| onBasePowerPriority: 2, | |
| onBasePower(basePower, attacker, defender, move) { | |
| if (move.type === "Fire" && attacker.hp <= attacker.maxhp / 3) { | |
| this.debug("Blaze boost"); | |
| return this.chainModify(1.5); | |
| } | |
| }, | |
| name: "Blaze", | |
| rating: 2, | |
| num: 66 | |
| }, | |
| cloudnine: { | |
| inherit: true, | |
| onSwitchIn() { | |
| }, | |
| onStart(pokemon) { | |
| pokemon.abilityState.ending = false; | |
| } | |
| }, | |
| colorchange: { | |
| inherit: true, | |
| onDamagingHit(damage, target, source, move) { | |
| if (!damage || !target.hp) | |
| return; | |
| const type = move.type; | |
| if (target.isActive && move.category !== "Status" && type !== "???" && !target.hasType(type)) { | |
| if (!target.setType(type)) | |
| return false; | |
| this.add("-start", target, "typechange", type, "[from] ability: Color Change"); | |
| } | |
| }, | |
| onAfterMoveSecondary() { | |
| } | |
| }, | |
| compoundeyes: { | |
| onSourceModifyAccuracyPriority: 9, | |
| onSourceModifyAccuracy(accuracy) { | |
| if (typeof accuracy !== "number") | |
| return; | |
| this.debug("compoundeyes - enhancing accuracy"); | |
| return accuracy * 1.3; | |
| }, | |
| inherit: true | |
| }, | |
| cutecharm: { | |
| inherit: true, | |
| onDamagingHit(damage, target, source, move) { | |
| if (damage && move.flags["contact"]) { | |
| if (this.randomChance(3, 10)) { | |
| source.addVolatile("attract", this.effectState.target); | |
| } | |
| } | |
| } | |
| }, | |
| download: { | |
| inherit: true, | |
| onStart(pokemon) { | |
| let totaldef = 0; | |
| let totalspd = 0; | |
| for (const target of pokemon.foes()) { | |
| if (target.volatiles.substitute) | |
| continue; | |
| totaldef += target.getStat("def", false, true); | |
| totalspd += target.getStat("spd", false, true); | |
| } | |
| if (totaldef && totaldef >= totalspd) { | |
| this.boost({ spa: 1 }); | |
| } else if (totalspd) { | |
| this.boost({ atk: 1 }); | |
| } | |
| } | |
| }, | |
| effectspore: { | |
| inherit: true, | |
| onDamagingHit(damage, target, source, move) { | |
| if (damage && move.flags["contact"] && !source.status) { | |
| const r = this.random(100); | |
| 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(3, 10)) { | |
| source.trySetStatus("brn", target); | |
| } | |
| } | |
| } | |
| }, | |
| flashfire: { | |
| inherit: true, | |
| onTryHit(target, source, move) { | |
| if (target !== source && move.type === "Fire") { | |
| if (target.status === "frz") { | |
| return; | |
| } | |
| if (!target.addVolatile("flashfire")) { | |
| this.add("-immune", target, "[from] ability: Flash Fire"); | |
| } | |
| return null; | |
| } | |
| }, | |
| condition: { | |
| noCopy: true, | |
| // doesn't get copied by Baton Pass | |
| onStart(target) { | |
| this.add("-start", target, "ability: Flash Fire"); | |
| }, | |
| onModifyDamagePhase1(atk, attacker, defender, move) { | |
| if (move.type === "Fire") { | |
| this.debug("Flash Fire boost"); | |
| return this.chainModify(1.5); | |
| } | |
| }, | |
| onEnd(target) { | |
| this.add("-end", target, "ability: Flash Fire", "[silent]"); | |
| } | |
| } | |
| }, | |
| flowergift: { | |
| inherit: true, | |
| onAllyModifyAtk(atk) { | |
| if (this.field.isWeather("sunnyday")) { | |
| return this.chainModify(1.5); | |
| } | |
| }, | |
| onAllyModifySpD(spd) { | |
| if (this.field.isWeather("sunnyday")) { | |
| return this.chainModify(1.5); | |
| } | |
| }, | |
| flags: { breakable: 1 } | |
| }, | |
| forecast: { | |
| inherit: true, | |
| flags: { notrace: 1 } | |
| }, | |
| forewarn: { | |
| inherit: true, | |
| onStart(pokemon) { | |
| let warnMoves = []; | |
| let warnBp = 1; | |
| for (const target of pokemon.foes()) { | |
| for (const moveSlot of target.moveSlots) { | |
| const move = this.dex.moves.get(moveSlot.move); | |
| let bp = move.basePower; | |
| if (move.ohko) | |
| bp = 160; | |
| if (move.id === "counter" || move.id === "metalburst" || move.id === "mirrorcoat") | |
| bp = 120; | |
| if (!bp && move.category !== "Status") | |
| bp = 80; | |
| if (bp > warnBp) { | |
| warnMoves = [move]; | |
| warnBp = bp; | |
| } else if (bp === warnBp) { | |
| warnMoves.push(move); | |
| } | |
| } | |
| } | |
| if (!warnMoves.length) | |
| return; | |
| const warnMove = this.sample(warnMoves); | |
| this.add("-activate", pokemon, "ability: Forewarn", warnMove); | |
| } | |
| }, | |
| frisk: { | |
| inherit: true, | |
| onStart(pokemon) { | |
| const target = pokemon.side.randomFoe(); | |
| if (target?.item && !target.itemState.knockedOff) { | |
| this.add("-item", "", target.getItem().name, "[from] ability: Frisk", `[of] ${pokemon}`); | |
| } | |
| } | |
| }, | |
| hustle: { | |
| inherit: true, | |
| onSourceModifyAccuracyPriority: 7, | |
| onSourceModifyAccuracy(accuracy, target, source, move) { | |
| if (move.category === "Physical" && typeof accuracy === "number") { | |
| return accuracy * 0.8; | |
| } | |
| } | |
| }, | |
| hydration: { | |
| onWeather(target, source, effect) { | |
| if (effect.id === "raindance" && target.status) { | |
| this.add("-activate", target, "ability: Hydration"); | |
| target.cureStatus(); | |
| } | |
| }, | |
| name: "Hydration", | |
| rating: 1.5, | |
| num: 93 | |
| }, | |
| insomnia: { | |
| inherit: true, | |
| rating: 2.5 | |
| }, | |
| intimidate: { | |
| inherit: true, | |
| onStart(pokemon) { | |
| const activated = pokemon.adjacentFoes().some((target) => !(target.volatiles["substitute"] || target.volatiles["substitutebroken"]?.move === "uturn")); | |
| if (!activated) { | |
| this.hint("In Gen 4, Intimidate does not activate if every target has a Substitute (or the Substitute was just broken by U-turn).", 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 if (target.volatiles["substitutebroken"]?.move === "uturn") { | |
| this.hint("In Gen 4, if U-turn breaks Substitute the incoming Intimidate does nothing."); | |
| } else { | |
| this.boost({ atk: -1 }, target, pokemon, null, true); | |
| } | |
| } | |
| } | |
| }, | |
| leafguard: { | |
| inherit: true, | |
| onSetStatus(status, target, source, effect) { | |
| if (effect && effect.id === "rest") { | |
| } else if (this.field.isWeather("sunnyday")) { | |
| return false; | |
| } | |
| } | |
| }, | |
| lightningrod: { | |
| inherit: true, | |
| onTryHit() { | |
| }, | |
| rating: 0 | |
| }, | |
| 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.activeMove?.id !== "dreameater") { | |
| this.damage(damage, null, null, null, true); | |
| return 0; | |
| } | |
| } | |
| }, | |
| magicguard: { | |
| onDamage(damage, target, source, effect) { | |
| if (effect.effectType !== "Move") { | |
| return false; | |
| } | |
| }, | |
| onSetStatus(status, target, source, effect) { | |
| if (effect && effect.id === "toxicspikes") { | |
| return false; | |
| } | |
| }, | |
| name: "Magic Guard", | |
| rating: 4.5, | |
| num: 98 | |
| }, | |
| minus: { | |
| onModifySpA(spa, pokemon) { | |
| for (const ally of pokemon.allies()) { | |
| if (ally.ability === "plus") { | |
| return spa * 1.5; | |
| } | |
| } | |
| }, | |
| name: "Minus", | |
| rating: 0, | |
| num: 58 | |
| }, | |
| naturalcure: { | |
| inherit: true, | |
| onCheckShow(pokemon) { | |
| }, | |
| onSwitchOut(pokemon) { | |
| if (!pokemon.status || pokemon.status === "fnt") | |
| return; | |
| this.add("-curestatus", pokemon, pokemon.status, "[from] ability: Natural Cure"); | |
| pokemon.clearStatus(); | |
| } | |
| }, | |
| normalize: { | |
| inherit: true, | |
| onModifyMove(move) { | |
| if (move.id !== "struggle") { | |
| move.type = "Normal"; | |
| } | |
| } | |
| }, | |
| overgrow: { | |
| onBasePowerPriority: 2, | |
| onBasePower(basePower, attacker, defender, move) { | |
| if (move.type === "Grass" && attacker.hp <= attacker.maxhp / 3) { | |
| this.debug("Overgrow boost"); | |
| return this.chainModify(1.5); | |
| } | |
| }, | |
| name: "Overgrow", | |
| rating: 2, | |
| num: 65 | |
| }, | |
| pickup: { | |
| name: "Pickup", | |
| rating: 0, | |
| num: 53 | |
| }, | |
| plus: { | |
| onModifySpA(spa, pokemon) { | |
| for (const ally of pokemon.allies()) { | |
| if (ally.ability === "minus") { | |
| return spa * 1.5; | |
| } | |
| } | |
| }, | |
| name: "Plus", | |
| rating: 0, | |
| num: 57 | |
| }, | |
| poisonpoint: { | |
| inherit: true, | |
| onDamagingHit(damage, target, source, move) { | |
| if (damage && move.flags["contact"]) { | |
| if (this.randomChance(3, 10)) { | |
| source.trySetStatus("psn", target); | |
| } | |
| } | |
| } | |
| }, | |
| pressure: { | |
| onStart(pokemon) { | |
| this.add("-ability", pokemon, "Pressure"); | |
| }, | |
| onDeductPP(target, source) { | |
| if (target === source) | |
| return; | |
| return 1; | |
| }, | |
| name: "Pressure", | |
| rating: 1.5, | |
| num: 46 | |
| }, | |
| roughskin: { | |
| inherit: true, | |
| onDamagingHit(damage, target, source, move) { | |
| if (damage && move.flags["contact"]) { | |
| this.damage(source.baseMaxhp / 8, source, target); | |
| } | |
| } | |
| }, | |
| sandveil: { | |
| inherit: true, | |
| onModifyAccuracyPriority: 8, | |
| onModifyAccuracy(accuracy) { | |
| if (typeof accuracy !== "number") | |
| return; | |
| if (this.field.isWeather("sandstorm")) { | |
| this.debug("Sand Veil - decreasing accuracy"); | |
| return accuracy * 0.8; | |
| } | |
| } | |
| }, | |
| serenegrace: { | |
| inherit: true, | |
| onModifyMove(move) { | |
| if (move.secondaries) { | |
| this.debug("doubling secondary chance"); | |
| for (const secondary of move.secondaries) { | |
| if (secondary.chance) | |
| secondary.chance *= 2; | |
| } | |
| } | |
| } | |
| }, | |
| shedskin: { | |
| inherit: true, | |
| onResidualOrder: 10, | |
| onResidualSubOrder: 3 | |
| }, | |
| simple: { | |
| onModifyBoost(boosts) { | |
| let key; | |
| for (key in boosts) { | |
| boosts[key] *= 2; | |
| } | |
| }, | |
| flags: { breakable: 1 }, | |
| name: "Simple", | |
| rating: 4, | |
| num: 86 | |
| }, | |
| snowcloak: { | |
| inherit: true, | |
| onModifyAccuracyPriority: 8, | |
| onModifyAccuracy(accuracy) { | |
| if (typeof accuracy !== "number") | |
| return; | |
| if (this.field.isWeather("hail")) { | |
| this.debug("Snow Cloak - decreasing accuracy"); | |
| return accuracy * 0.8; | |
| } | |
| } | |
| }, | |
| speedboost: { | |
| inherit: true, | |
| onResidualOrder: 10, | |
| onResidualSubOrder: 3 | |
| }, | |
| static: { | |
| inherit: true, | |
| onDamagingHit(damage, target, source, move) { | |
| if (damage && move.flags["contact"]) { | |
| if (this.randomChance(3, 10)) { | |
| source.trySetStatus("par", target); | |
| } | |
| } | |
| } | |
| }, | |
| stench: { | |
| name: "Stench", | |
| rating: 0, | |
| num: 1 | |
| }, | |
| stickyhold: { | |
| inherit: true, | |
| onTakeItem(item, pokemon, source) { | |
| if (source && source !== pokemon || this.activeMove && this.activeMove.id === "knockoff") { | |
| this.add("-activate", pokemon, "ability: Sticky Hold"); | |
| return false; | |
| } | |
| } | |
| }, | |
| stormdrain: { | |
| inherit: true, | |
| onTryHit() { | |
| }, | |
| rating: 0 | |
| }, | |
| sturdy: { | |
| inherit: true, | |
| onDamage() { | |
| }, | |
| rating: 0 | |
| }, | |
| swarm: { | |
| onBasePowerPriority: 2, | |
| onBasePower(basePower, attacker, defender, move) { | |
| if (move.type === "Bug" && attacker.hp <= attacker.maxhp / 3) { | |
| this.debug("Swarm boost"); | |
| return this.chainModify(1.5); | |
| } | |
| }, | |
| name: "Swarm", | |
| rating: 2, | |
| num: 68 | |
| }, | |
| synchronize: { | |
| inherit: true, | |
| onAfterSetStatus(status, target, source, effect) { | |
| if (!source || source === target) | |
| return; | |
| if (effect && effect.id === "toxicspikes") | |
| return; | |
| let id = status.id; | |
| if (id === "slp" || id === "frz") | |
| return; | |
| if (id === "tox") | |
| id = "psn"; | |
| source.trySetStatus(id, target); | |
| } | |
| }, | |
| tangledfeet: { | |
| inherit: true, | |
| onModifyAccuracyPriority: 6, | |
| onModifyAccuracy(accuracy, target) { | |
| if (typeof accuracy !== "number") | |
| return; | |
| if (target?.volatiles["confusion"]) { | |
| this.debug("Tangled Feet - decreasing accuracy"); | |
| return accuracy * 0.5; | |
| } | |
| } | |
| }, | |
| thickfat: { | |
| onSourceBasePowerPriority: 1, | |
| onSourceBasePower(basePower, attacker, defender, move) { | |
| if (move.type === "Ice" || move.type === "Fire") { | |
| return this.chainModify(0.5); | |
| } | |
| }, | |
| flags: { breakable: 1 }, | |
| name: "Thick Fat", | |
| rating: 3.5, | |
| num: 47 | |
| }, | |
| torrent: { | |
| onBasePowerPriority: 2, | |
| onBasePower(basePower, attacker, defender, move) { | |
| if (move.type === "Water" && attacker.hp <= attacker.maxhp / 3) { | |
| this.debug("Torrent boost"); | |
| return this.chainModify(1.5); | |
| } | |
| }, | |
| name: "Torrent", | |
| rating: 2, | |
| num: 67 | |
| }, | |
| trace: { | |
| inherit: true, | |
| onUpdate(pokemon) { | |
| if (!this.effectState.seek) | |
| return; | |
| const target = pokemon.side.randomFoe(); | |
| if (!target || target.fainted) | |
| return; | |
| const ability = target.getAbility(); | |
| const bannedAbilities = ["forecast", "multitype", "trace"]; | |
| if (bannedAbilities.includes(target.ability)) { | |
| return; | |
| } | |
| if (pokemon.setAbility(ability)) { | |
| this.add("-ability", pokemon, ability, "[from] ability: Trace", `[of] ${target}`); | |
| } | |
| }, | |
| flags: { notrace: 1 } | |
| }, | |
| unburden: { | |
| inherit: true, | |
| condition: { | |
| onModifySpe(spe, pokemon) { | |
| if ((!pokemon.item || pokemon.itemState.knockedOff) && !pokemon.ignoringAbility()) { | |
| return this.chainModify(2); | |
| } | |
| } | |
| } | |
| }, | |
| vitalspirit: { | |
| inherit: true, | |
| rating: 2.5 | |
| }, | |
| wonderguard: { | |
| inherit: true, | |
| onTryHit(target, source, move) { | |
| if (move.id === "firefang") { | |
| this.hint("In Gen 4, Fire Fang is always able to hit through Wonder Guard.", true, target.side); | |
| return; | |
| } | |
| if (target === source || move.category === "Status" || move.type === "???" || move.id === "struggle") | |
| return; | |
| this.debug("Wonder Guard immunity: " + move.id); | |
| if (target.runEffectiveness(move) <= 0) { | |
| this.add("-immune", target, "[from] ability: Wonder Guard"); | |
| return null; | |
| } | |
| } | |
| } | |
| }; | |
| //# sourceMappingURL=abilities.js.map | |