2346 lines
69 KiB
JavaScript
2346 lines
69 KiB
JavaScript
"use strict";
|
|
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 = {
|
|
schooling: {
|
|
onStart(pokemon) {
|
|
if (pokemon.baseSpecies.baseSpecies !== "Wishiwashi" || pokemon.level < 20 || pokemon.transformed)
|
|
return;
|
|
if (pokemon.hp > pokemon.maxhp / 4 || pokemon.hasItem("graduationscale")) {
|
|
if (pokemon.species.id === "wishiwashi") {
|
|
pokemon.formeChange("Wishiwashi-School");
|
|
}
|
|
} else {
|
|
if (pokemon.species.id === "wishiwashischool") {
|
|
pokemon.formeChange("Wishiwashi");
|
|
}
|
|
}
|
|
},
|
|
onResidualOrder: 27,
|
|
onResidual(pokemon) {
|
|
if (pokemon.baseSpecies.baseSpecies !== "Wishiwashi" || pokemon.level < 20 || pokemon.transformed || !pokemon.hp)
|
|
return;
|
|
if (pokemon.hp > pokemon.maxhp / 4 || pokemon.hasItem("graduationscale")) {
|
|
if (pokemon.species.id === "wishiwashi") {
|
|
pokemon.formeChange("Wishiwashi-School");
|
|
}
|
|
} else {
|
|
if (pokemon.species.id === "wishiwashischool") {
|
|
pokemon.formeChange("Wishiwashi");
|
|
}
|
|
}
|
|
},
|
|
inherit: true
|
|
},
|
|
lightpower: {
|
|
onModifySpAPriority: 5,
|
|
onModifySpA(spa) {
|
|
return this.chainModify(2);
|
|
},
|
|
name: "Light Power",
|
|
shortDesc: "This Pokemon's Special Attack is doubled.",
|
|
rating: 5
|
|
},
|
|
raindish: {
|
|
onResidualOrder: 5,
|
|
onResidualSubOrder: 2,
|
|
onResidual(pokemon) {
|
|
if (this.field.isWeather(["raindance", "primordialsea"]))
|
|
return;
|
|
this.heal(pokemon.maxhp / 16);
|
|
},
|
|
onWeather(target, source, effect) {
|
|
if (effect.id === "raindance" || effect.id === "primordialsea") {
|
|
this.heal(target.baseMaxhp / 8);
|
|
}
|
|
},
|
|
name: "Rain Dish",
|
|
shortDesc: "Heals 6.25% of user's max HP at the end of each turn. Heals 12.5% in Rain.",
|
|
num: 44,
|
|
rating: 3
|
|
},
|
|
icebody: {
|
|
onResidualOrder: 5,
|
|
onResidualSubOrder: 2,
|
|
onResidual(pokemon) {
|
|
if (this.field.isWeather("hail"))
|
|
return;
|
|
this.heal(pokemon.maxhp / 16);
|
|
},
|
|
onWeather(target, source, effect) {
|
|
if (effect.id === "hail") {
|
|
this.heal(target.baseMaxhp / 8);
|
|
}
|
|
},
|
|
name: "Ice Body",
|
|
shortDesc: "Heals 6.25% of user's max HP at the end of each turn. Heals 12.5% in Hail.",
|
|
num: 115,
|
|
rating: 3
|
|
},
|
|
sweetveil: {
|
|
name: "Sweet Veil",
|
|
shortDesc: "This Pokemon and its allies can't fall asleep. This Pokemon heals 1/8 of its max HP if it's holding Honey.",
|
|
onAllySetStatus(status, target, source, effect) {
|
|
if (status.id === "slp") {
|
|
this.debug("Sweet Veil interrupts sleep");
|
|
const effectHolder = this.effectState.target;
|
|
this.add("-block", target, "ability: Sweet Veil", "[of] " + effectHolder);
|
|
return null;
|
|
}
|
|
},
|
|
onAllyTryAddVolatile(status, target) {
|
|
if (status.id === "yawn") {
|
|
this.debug("Sweet Veil blocking yawn");
|
|
const effectHolder = this.effectState.target;
|
|
this.add("-block", target, "ability: Sweet Veil", "[of] " + effectHolder);
|
|
return null;
|
|
}
|
|
},
|
|
onResidualOrder: 26,
|
|
onResidualSubOrder: 1,
|
|
onResidual(pokemon) {
|
|
if (pokemon.hasItem("honey")) {
|
|
this.heal(pokemon.baseMaxhp / 8);
|
|
}
|
|
},
|
|
rating: 2,
|
|
num: 175
|
|
},
|
|
libero: {
|
|
shortDesc: "Non-STAB moves have 1.2x power.",
|
|
onBasePowerPriority: 23,
|
|
onBasePower(basePower, pokemon, target, move) {
|
|
if (!pokemon.hasType(move.type)) {
|
|
return this.chainModify(1.2);
|
|
}
|
|
},
|
|
name: "Libero",
|
|
rating: 4.5,
|
|
num: 236
|
|
},
|
|
moody: {
|
|
shortDesc: "This Pokemon's lowest stat goes up by 1 every turn.",
|
|
onResidualOrder: 26,
|
|
onResidualSubOrder: 1,
|
|
onResidual(pokemon) {
|
|
if (pokemon.activeTurns) {
|
|
let statName = "atk";
|
|
let worstStat = 3e3;
|
|
let s;
|
|
for (s in pokemon.storedStats) {
|
|
if (pokemon.storedStats[s] >= worstStat)
|
|
continue;
|
|
statName = s;
|
|
worstStat = pokemon.storedStats[s];
|
|
}
|
|
this.boost({ [statName]: 1 }, pokemon, pokemon);
|
|
}
|
|
},
|
|
name: "Moody",
|
|
rating: 3,
|
|
num: 141
|
|
},
|
|
stickyhold: {
|
|
onTakeItem(item, pokemon, source) {
|
|
if (this.suppressingAbility(pokemon) || !pokemon.hp || pokemon.item === "stickybarb")
|
|
return;
|
|
if (!this.activeMove)
|
|
throw new Error("Battle.activeMove is null");
|
|
if (source && source !== pokemon || this.activeMove.id === "knockoff") {
|
|
this.add("-activate", pokemon, "ability: Sticky Hold");
|
|
return false;
|
|
}
|
|
},
|
|
onSourceModifyDamage(damage, source, target, move) {
|
|
if (move.name === "Knock Off") {
|
|
this.debug("Sticky Hold weaken");
|
|
return this.chainModify(0.67);
|
|
}
|
|
},
|
|
onTryHit(pokemon, target, move) {
|
|
if (move.name === "Poltergeist") {
|
|
this.add("-immune", pokemon, "[from] ability: Sticky Hold");
|
|
return null;
|
|
}
|
|
},
|
|
name: "Sticky Hold",
|
|
rating: 2,
|
|
num: 60
|
|
},
|
|
watercompaction: {
|
|
shortDesc: "This Pokemon's Defense goes up 2 stages when hit by a Water-type move; Water immunity.",
|
|
onTryHitPriority: 1,
|
|
onTryHit(target, source, move) {
|
|
if (target !== source && move.type === "Water") {
|
|
if (!this.boost({ def: 2 })) {
|
|
this.add("-immune", target, "[from] ability: Water Compaction");
|
|
}
|
|
return null;
|
|
}
|
|
},
|
|
onAllyTryHitSide(target, source, move) {
|
|
if (target === this.effectState.target || target.side !== source.side)
|
|
return;
|
|
if (move.type === "Water") {
|
|
this.boost({ def: 2 }, this.effectState.target);
|
|
}
|
|
},
|
|
name: "Water Compaction",
|
|
rating: 3,
|
|
num: 195
|
|
},
|
|
ironfist: {
|
|
shortDesc: "This Pokemon's punch attacks have 1.25x power and don't make contact. Sucker Punch is not boosted.",
|
|
onBasePowerPriority: 23,
|
|
onBasePower(basePower, attacker, defender, move) {
|
|
if (move.flags["punch"]) {
|
|
this.debug("Iron Fist boost");
|
|
return this.chainModify([5120, 4096]);
|
|
}
|
|
},
|
|
onModifyMove(move) {
|
|
if (move.flags["punch"]) {
|
|
delete move.flags["contact"];
|
|
}
|
|
},
|
|
name: "Iron Fist",
|
|
rating: 3,
|
|
num: 89
|
|
},
|
|
overclock: {
|
|
shortDesc: "This Pokemon's moves that lower its stats have 1.3x power.",
|
|
onBasePowerPriority: 23,
|
|
onBasePower(basePower, attacker, defender, move) {
|
|
const statLoweringMoves = [
|
|
"Draco Meteor",
|
|
"Fleur Cannon",
|
|
"Leaf Storm",
|
|
"Overheat",
|
|
"Psycho Boost",
|
|
"Superpower",
|
|
"Lightning Lance",
|
|
"Clanging Scales",
|
|
"Close Combat",
|
|
"Dragon Ascent",
|
|
"Hyperspace Fury",
|
|
"Scale Shot",
|
|
"V-create",
|
|
"Hammer Arm",
|
|
"Ice Hammer"
|
|
];
|
|
if (statLoweringMoves.includes(move.name)) {
|
|
return this.chainModify(1.3);
|
|
}
|
|
},
|
|
name: "Overclock",
|
|
rating: 4
|
|
},
|
|
pricklycoat: {
|
|
shortDesc: "This Pokemon sets a layer of Spikes when hit by a contact move, or Toxic Spikes if it's a Poison-type or hit by a Poison-type move.",
|
|
onDamagingHitOrder: 1,
|
|
onDamagingHit(damage, target, source, move) {
|
|
if (move.flags["contact"]) {
|
|
this.add("-ability", target, "Prickly Coat");
|
|
if (move.type === "Poison" || target.hasType("Poison")) {
|
|
target.side.foe.addSideCondition("toxicspikes");
|
|
} else {
|
|
target.side.foe.addSideCondition("spikes");
|
|
}
|
|
}
|
|
},
|
|
name: "Prickly Coat",
|
|
rating: 3
|
|
},
|
|
sandveil: {
|
|
desc: "If Sandstorm is active, this Pokemon's SpD is multiplied by 1.5. This Pokemon takes no damage from Sandstorm.",
|
|
shortDesc: "If Sandstorm is active, this Pokemon's SpD is boosted 1.5x; immunity to Sandstorm.",
|
|
onImmunity(type, pokemon) {
|
|
if (type === "sandstorm")
|
|
return false;
|
|
},
|
|
onModifySpD(spd, pokemon) {
|
|
if (this.field.isWeather("sandstorm")) {
|
|
return this.chainModify(1.5);
|
|
}
|
|
},
|
|
name: "Sand Veil",
|
|
rating: 3,
|
|
num: 146
|
|
},
|
|
snowcloak: {
|
|
desc: "If Hail is active, this Pokemon's Ice, Water, and Fairy-type moves deal 1.3x damage. This Pokemon takes no damage from Hail.",
|
|
shortDesc: "This Pokemon's Ice/Water/Fairy attacks deal 1.3x damage in Hail; immunity to Hail.",
|
|
onImmunity(type, pokemon) {
|
|
if (type === "hail")
|
|
return false;
|
|
},
|
|
onBasePowerPriority: 21,
|
|
onBasePower(basePower, attacker, defender, move) {
|
|
if (this.field.isWeather("hail")) {
|
|
if (move.type === "Ice" || move.type === "Water" || move.type === "Fairy") {
|
|
this.debug("Snow Cloak boost");
|
|
return this.chainModify([5325, 4096]);
|
|
}
|
|
}
|
|
},
|
|
name: "Snow Cloak",
|
|
rating: 3,
|
|
num: 81
|
|
},
|
|
powerofalchemy: {
|
|
shortDesc: "All of this Pokemon's abilities are active at once.",
|
|
onPreStart(pokemon) {
|
|
this.add("-ability", pokemon, "Power of Alchemy");
|
|
},
|
|
isPermanent: true,
|
|
name: "Power of Alchemy",
|
|
rating: 0,
|
|
num: 223
|
|
},
|
|
powerofalchemymukalola: {
|
|
shortDesc: "All of this Pokemon's abilities are active at once.",
|
|
onPreStart(pokemon) {
|
|
this.add("-ability", pokemon, "Power of Alchemy");
|
|
},
|
|
onModifyMove(move) {
|
|
if (!move || !move.flags["contact"] || move.target === "self")
|
|
return;
|
|
if (!move.secondaries) {
|
|
move.secondaries = [];
|
|
}
|
|
move.secondaries.push({
|
|
chance: 30,
|
|
status: "psn",
|
|
ability: this.dex.abilities.get("poisontouch")
|
|
});
|
|
},
|
|
onSourceAfterFaint(length, target, source, effect) {
|
|
if (effect && effect.effectType === "Move") {
|
|
this.add("-activate", source, "ability: Scavenge");
|
|
this.heal(source.baseMaxhp / 3, source, source, effect);
|
|
}
|
|
},
|
|
isPermanent: true,
|
|
name: "Power of Alchemy (Muk-Alola)",
|
|
rating: 5
|
|
},
|
|
merciless: {
|
|
shortDesc: "This Pokemon's attacks are critical hits if the target is statused.",
|
|
onModifyCritRatio(critRatio, source, target) {
|
|
if (target?.status)
|
|
return 5;
|
|
},
|
|
name: "Merciless",
|
|
rating: 1.5,
|
|
num: 196
|
|
},
|
|
pastelveil: {
|
|
shortDesc: "This Pokemon and its allies cannot be poisoned. Poison-type moves have 0.5x power against this Pokemon and its allies. On switch-in, cures poisoned allies.",
|
|
onStart(pokemon) {
|
|
for (const ally of pokemon.allies()) {
|
|
if (["psn", "tox"].includes(ally.status)) {
|
|
this.add("-activate", pokemon, "ability: Pastel Veil");
|
|
ally.cureStatus();
|
|
}
|
|
}
|
|
},
|
|
onUpdate(pokemon) {
|
|
if (["psn", "tox"].includes(pokemon.status)) {
|
|
this.add("-activate", pokemon, "ability: Pastel Veil");
|
|
pokemon.cureStatus();
|
|
}
|
|
},
|
|
onAllySwitchIn(pokemon) {
|
|
if (["psn", "tox"].includes(pokemon.status)) {
|
|
this.add("-activate", this.effectState.target, "ability: Pastel Veil");
|
|
pokemon.cureStatus();
|
|
}
|
|
},
|
|
onSetStatus(status, target, source, effect) {
|
|
if (!["psn", "tox"].includes(status.id))
|
|
return;
|
|
if (effect?.status) {
|
|
this.add("-immune", target, "[from] ability: Pastel Veil");
|
|
}
|
|
return false;
|
|
},
|
|
onAllySetStatus(status, target, source, effect) {
|
|
if (!["psn", "tox"].includes(status.id))
|
|
return;
|
|
if (effect?.status) {
|
|
const effectHolder = this.effectState.target;
|
|
this.add("-block", target, "ability: Pastel Veil", "[of] " + effectHolder);
|
|
}
|
|
return false;
|
|
},
|
|
onSourceModifyAtkPriority: 6,
|
|
onSourceModifyAtk(atk, attacker, defender, move) {
|
|
if (move.type === "Poison") {
|
|
this.debug("Pastel Veil weaken");
|
|
return this.chainModify(0.5);
|
|
}
|
|
},
|
|
onSourceModifySpAPriority: 5,
|
|
onSourceModifySpA(atk, attacker, defender, move) {
|
|
if (move.type === "Poison") {
|
|
this.debug("Pastel Veil weaken");
|
|
return this.chainModify(0.5);
|
|
}
|
|
},
|
|
name: "Pastel Veil",
|
|
rating: 2,
|
|
num: 257
|
|
},
|
|
gravitation: {
|
|
shortDesc: "On switch-in, this Pokemon summons Gravity.",
|
|
onStart(source) {
|
|
this.add("-ability", source, "Gravitation");
|
|
this.field.addPseudoWeather("gravity", source, source.getAbility());
|
|
},
|
|
name: "Gravitation",
|
|
rating: 4
|
|
},
|
|
buzzoff: {
|
|
shortDesc: "This Pokemon switches out after using a Bug-type move.",
|
|
onModifyMove(move, pokemon) {
|
|
if (move.type === "Bug") {
|
|
move.selfSwitch = true;
|
|
this.add("-ability", pokemon, "Buzz Off");
|
|
}
|
|
},
|
|
name: "Buzz Off",
|
|
rating: 4.5
|
|
},
|
|
magmaarmor: {
|
|
onUpdate(pokemon) {
|
|
if (pokemon.status === "frz") {
|
|
this.add("-activate", pokemon, "ability: Magma Armor");
|
|
pokemon.cureStatus();
|
|
}
|
|
},
|
|
onImmunity(type, pokemon) {
|
|
if (type === "hail")
|
|
return false;
|
|
if (type === "frz")
|
|
return false;
|
|
},
|
|
onSourceModifyAtkPriority: 6,
|
|
onSourceModifyAtk(atk, attacker, defender, move) {
|
|
if (move.type === "Ice" || move.type === "Water") {
|
|
this.debug("Magma Armor weaken");
|
|
return this.chainModify(0.5);
|
|
}
|
|
},
|
|
onSourceModifySpAPriority: 5,
|
|
onSourceModifySpA(atk, attacker, defender, move) {
|
|
if (move.type === "Ice" || move.type === "Water") {
|
|
this.debug("Magma Armor weaken");
|
|
return this.chainModify(0.5);
|
|
}
|
|
},
|
|
name: "Magma Armor",
|
|
rating: 2,
|
|
num: 40,
|
|
shortDesc: "Water/Ice-type moves against this Pokemon deal damage with a halved attacking stat. Hail & Freeze immunity."
|
|
},
|
|
leafguard: {
|
|
onSetStatus(status, target, source, effect) {
|
|
if (["sunnyday", "desolateland"].includes(target.effectiveWeather())) {
|
|
if (effect?.status) {
|
|
this.add("-immune", target, "[from] ability: Leaf Guard");
|
|
}
|
|
return false;
|
|
}
|
|
},
|
|
onTryAddVolatile(status, target) {
|
|
if ((status.id === "yawn" || status.id === "flinch") && ["sunnyday", "desolateland"].includes(target.effectiveWeather())) {
|
|
this.add("-immune", target, "[from] ability: Leaf Guard");
|
|
return null;
|
|
}
|
|
},
|
|
onSourceModifyAtkPriority: 6,
|
|
onSourceModifyAtk(atk, attacker, defender, move) {
|
|
if (move.type === "Flying" || move.type === "Bug") {
|
|
this.debug("Leaf Guard weaken");
|
|
return this.chainModify(0.5);
|
|
}
|
|
},
|
|
onSourceModifySpAPriority: 5,
|
|
onSourceModifySpA(atk, attacker, defender, move) {
|
|
if (move.type === "Flying" || move.type === "Bug") {
|
|
this.debug("Leaf Guard weaken");
|
|
return this.chainModify(0.5);
|
|
}
|
|
},
|
|
name: "Leaf Guard",
|
|
rating: 0.5,
|
|
num: 102,
|
|
shortDesc: "Flying/Bug-type moves against this Pokemon deal damage with a halved attacking stat. Can't be statused or flinched by others in Sun."
|
|
},
|
|
soullink: {
|
|
onDamagingHitOrder: 1,
|
|
onDamagingHit(damage, target, source, move) {
|
|
if (move.flags["contact"] && !source.hasType("Ghost") && source.addType("Ghost")) {
|
|
this.add("-start", source, "typeadd", "Ghost", "[from] ability: Soul Link");
|
|
}
|
|
},
|
|
name: "Soul Link",
|
|
shortDesc: "Pok\xE9mon that make contact with this Pok\xE9mon have the Ghost-type added to their existing typings until they switch out (Trick-or-Treat effect).",
|
|
rating: 2.5
|
|
},
|
|
wanderingspirit: {
|
|
shortDesc: "On switch-in, swaps ability with the opponent.",
|
|
onSwitchIn(pokemon) {
|
|
this.effectState.switchingIn = true;
|
|
},
|
|
onStart(pokemon) {
|
|
if (pokemon.foes().some(
|
|
(foeActive) => foeActive && foeActive.isAdjacent(pokemon) && foeActive.ability === "noability"
|
|
) || ![
|
|
"spiritomb",
|
|
"spectrier",
|
|
"yamaskgalar",
|
|
"runerigus",
|
|
"cofagrigus",
|
|
"cacturne",
|
|
"hoopa",
|
|
"marowak",
|
|
"rotom"
|
|
].includes(pokemon.species.id)) {
|
|
this.effectState.gaveUp = true;
|
|
}
|
|
},
|
|
onUpdate(pokemon) {
|
|
if (!pokemon.isStarted || this.effectState.gaveUp)
|
|
return;
|
|
if (!this.effectState.switchingIn)
|
|
return;
|
|
const possibleTargets = pokemon.foes().filter((foeActive) => foeActive && foeActive.isAdjacent(pokemon));
|
|
while (possibleTargets.length) {
|
|
let rand = 0;
|
|
if (possibleTargets.length > 1)
|
|
rand = this.random(possibleTargets.length);
|
|
const target = possibleTargets[rand];
|
|
const ability = target.getAbility();
|
|
const additionalBannedAbilities = [
|
|
// Zen Mode included here for compatability with Gen 5-6
|
|
"noability",
|
|
"flowergift",
|
|
"forecast",
|
|
"hungerswitch",
|
|
"illusion",
|
|
"wanderingspirit",
|
|
"imposter",
|
|
"neutralizinggas",
|
|
"powerofalchemy",
|
|
"receiver",
|
|
"trace",
|
|
"zenmode",
|
|
"concussion",
|
|
"gorillatactics",
|
|
"counterfeit"
|
|
];
|
|
if (target.getAbility().isPermanent || additionalBannedAbilities.includes(target.ability)) {
|
|
possibleTargets.splice(rand, 1);
|
|
continue;
|
|
}
|
|
target.setAbility("wanderingspirit", pokemon);
|
|
pokemon.setAbility(ability);
|
|
this.add("-activate", pokemon, "ability: Wandering Spirit", ability.name, "Wandering Spirit", "[of] " + target);
|
|
return;
|
|
}
|
|
},
|
|
name: "Wandering Spirit",
|
|
rating: 4,
|
|
num: 254
|
|
},
|
|
honeygather: {
|
|
name: "Honey Gather",
|
|
shortDesc: "At the end of each turn, if this Pokemon has no item, it gets Honey. Knock Off doesn't get boosted against Pokemon with this ability.",
|
|
onResidualOrder: 26,
|
|
onResidualSubOrder: 1,
|
|
onResidual(pokemon) {
|
|
if (pokemon.hp && !pokemon.item) {
|
|
pokemon.setItem("honey");
|
|
this.add("-item", pokemon, pokemon.getItem(), "[from] ability: Honey Gather");
|
|
}
|
|
if (pokemon.hasItem("honey")) {
|
|
this.heal(pokemon.baseMaxhp / 8);
|
|
}
|
|
},
|
|
onSourceModifyDamage(damage, source, target, move) {
|
|
if (move.name === "Knock Off") {
|
|
this.debug("Honey Gather weaken");
|
|
return this.chainModify(0.67);
|
|
}
|
|
},
|
|
rating: 3,
|
|
num: 118
|
|
},
|
|
hydration: {
|
|
shortDesc: "This Pokemon has its status cured at the end of each turn if Rain Dance is active or it gets hit by a Water move; Water immunity. Heals 12.5% HP if hit by a Water move.",
|
|
onResidualOrder: 5,
|
|
onResidualSubOrder: 4,
|
|
onResidual(pokemon) {
|
|
if (pokemon.status && ["raindance", "primordialsea"].includes(pokemon.effectiveWeather())) {
|
|
this.debug("hydration");
|
|
this.add("-activate", pokemon, "ability: Hydration");
|
|
this.add("-message", `Hydration activated!`);
|
|
pokemon.cureStatus();
|
|
}
|
|
},
|
|
onTryHit(target, source, move) {
|
|
if (target !== source && move.type === "Water") {
|
|
if (!this.heal(target.baseMaxhp / 8) || !target.cureStatus()) {
|
|
this.add("-immune", target, "[from] ability: Hydration");
|
|
}
|
|
return null;
|
|
}
|
|
},
|
|
name: "Hydration",
|
|
rating: 1.5,
|
|
num: 93
|
|
},
|
|
parentalbond: {
|
|
onPrepareHit(source, target, move) {
|
|
if (move.category === "Status" || move.selfdestruct || move.multihit)
|
|
return;
|
|
const noParentalBond = [
|
|
"endeavor",
|
|
"seismictoss",
|
|
"psywave",
|
|
"nightshade",
|
|
"sonicboom",
|
|
"dragonrage",
|
|
"superfang",
|
|
"naturesmadness",
|
|
"bide",
|
|
"counter",
|
|
"mirrorcoat",
|
|
"metalburst"
|
|
];
|
|
if (noParentalBond.includes(move.id))
|
|
return;
|
|
if (!move.spreadHit && !move.isZ && !move.isMax) {
|
|
move.multihit = 2;
|
|
move.multihitType = "parentalbond";
|
|
}
|
|
},
|
|
onBasePowerPriority: 7,
|
|
onBasePower(basePower, pokemon, target, move) {
|
|
if (move.multihitType === "parentalbond" && move.hit > 1)
|
|
return this.chainModify(0.25);
|
|
},
|
|
onSourceModifySecondaries(secondaries, target, source, move) {
|
|
if (move.multihitType === "parentalbond" && move.id === "secretpower" && move.hit < 2) {
|
|
return secondaries.filter((effect) => effect.volatileStatus === "flinch");
|
|
}
|
|
},
|
|
name: "Parental Bond",
|
|
rating: 4.5,
|
|
num: 184
|
|
},
|
|
scavenge: {
|
|
shortDesc: "This Pokemon's heals 33% of its HP when another Pokemon faints.",
|
|
onSourceAfterFaint(length, target, source, effect) {
|
|
if (effect && effect.effectType === "Move") {
|
|
this.add("-activate", source, "ability: Scavenge");
|
|
this.heal(source.baseMaxhp / 3, source, source, effect);
|
|
}
|
|
},
|
|
name: "Scavenge",
|
|
rating: 3.5
|
|
},
|
|
unimpressed: {
|
|
shortDesc: "Moves used against this Pokemon don't receive STAB.",
|
|
onSourceModifyDamage(damage, source, target, move) {
|
|
if (source.hasType(move.type)) {
|
|
this.debug("Unimpressed weaken");
|
|
return this.chainModify(source.hasAbility("adaptability") ? 0.5 : 0.67);
|
|
}
|
|
},
|
|
name: "Unimpressed",
|
|
rating: 3.5
|
|
},
|
|
counterfeit: {
|
|
shortDesc: "On switch-in, identifies and copies the effect of the opponent's held item.",
|
|
onStart(pokemon) {
|
|
if (pokemon.foes().some(
|
|
(foeActive) => foeActive && foeActive.isAdjacent(pokemon) && !foeActive.item
|
|
)) {
|
|
this.effectState.gaveUp = true;
|
|
}
|
|
},
|
|
onUpdate(pokemon) {
|
|
if (!pokemon.isStarted || this.effectState.gaveUp)
|
|
return;
|
|
const possibleTargets = pokemon.foes().filter((foeActive) => foeActive && foeActive.isAdjacent(pokemon));
|
|
while (possibleTargets.length) {
|
|
let rand = 0;
|
|
if (possibleTargets.length > 1)
|
|
rand = this.random(possibleTargets.length);
|
|
const target = possibleTargets[rand];
|
|
const item = target.getItem();
|
|
const additionalBannedItems = [
|
|
// Zen Mode included here for compatability with Gen 5-6
|
|
"noability",
|
|
"flowergift",
|
|
"forecast",
|
|
"hungerswitch",
|
|
"illusion",
|
|
"imposter",
|
|
"neutralizinggas",
|
|
"powerofalchemy",
|
|
"receiver",
|
|
"trace",
|
|
"zenmode"
|
|
];
|
|
if (!this.singleEvent("TakeItem", item, target.itemState, target, pokemon, this.effect, item) || additionalBannedItems.includes(target.item)) {
|
|
possibleTargets.splice(rand, 1);
|
|
continue;
|
|
}
|
|
this.add("-ability", pokemon, item, "[from] ability: Counterfeit", "[of] " + target);
|
|
pokemon.setAbility(item);
|
|
return;
|
|
}
|
|
},
|
|
name: "Counterfeit",
|
|
rating: 3.5
|
|
},
|
|
optimistic: {
|
|
onTryBoost(boost, target, source, effect) {
|
|
if (source && target !== source)
|
|
return;
|
|
let showMsg = false;
|
|
let i;
|
|
for (i in boost) {
|
|
if (boost[i] < 0) {
|
|
delete boost[i];
|
|
showMsg = true;
|
|
}
|
|
}
|
|
if (showMsg && !effect.secondaries && effect.id !== "octolock") {
|
|
this.add("-fail", target, "unboost", "[from] ability: Optimistic", "[of] " + target);
|
|
}
|
|
},
|
|
shortDesc: "This Pokemon can't lower its own stats.",
|
|
name: "Optimistic",
|
|
rating: 5
|
|
},
|
|
rivalry: {
|
|
onBasePowerPriority: 24,
|
|
onBasePower(basePower, pokemon, target) {
|
|
if (target.hasType(pokemon.getTypes())) {
|
|
return this.chainModify(1.33);
|
|
}
|
|
},
|
|
name: "Rivalry",
|
|
rating: 0,
|
|
num: 79,
|
|
shortDesc: "This Pokemon's moves deal 1.33x damage to targets that share a type with it."
|
|
},
|
|
vaporcontrol: {
|
|
onUpdate(pokemon) {
|
|
if (["sunnyday", "desolateland"].includes(pokemon.effectiveWeather()) && !pokemon.side.getSideCondition("mist")) {
|
|
this.actions.useMove("Mist", pokemon);
|
|
}
|
|
},
|
|
onBasePowerPriority: 21,
|
|
onBasePower(basePower, attacker, defender, move) {
|
|
if ((this.field.isWeather("sunnyday") || this.field.isWeather("desolateland")) && move.type === "Water") {
|
|
this.debug("Vapor Control boost");
|
|
return this.chainModify(1.5);
|
|
}
|
|
},
|
|
shortDesc: "If Sun is active, 1.5x power Water moves and sets Mist; Ignores Sun Water drop.",
|
|
name: "Vapor Control",
|
|
rating: 3
|
|
},
|
|
// Edited by proxy
|
|
oblivious: {
|
|
onUpdate(pokemon) {
|
|
if (pokemon.volatiles["attract"]) {
|
|
this.add("-activate", pokemon, "ability: Oblivious");
|
|
pokemon.removeVolatile("attract");
|
|
this.add("-end", pokemon, "move: Attract", "[from] ability: Oblivious");
|
|
}
|
|
if (pokemon.volatiles["taunt"]) {
|
|
this.add("-activate", pokemon, "ability: Oblivious");
|
|
pokemon.removeVolatile("taunt");
|
|
}
|
|
if (pokemon.volatiles["trashtalk"]) {
|
|
this.add("-activate", pokemon, "ability: Oblivious");
|
|
pokemon.removeVolatile("trashtalk");
|
|
}
|
|
},
|
|
onImmunity(type, pokemon) {
|
|
if (type === "attract" || type === "trashtalk")
|
|
return false;
|
|
},
|
|
onTryHit(pokemon, target, move) {
|
|
if (move.id === "attract" || move.id === "captivate" || move.id === "taunt") {
|
|
this.add("-immune", pokemon, "[from] ability: Oblivious");
|
|
return null;
|
|
}
|
|
},
|
|
name: "Oblivious",
|
|
rating: 1.5,
|
|
num: 12
|
|
},
|
|
aromaveil: {
|
|
onAllyTryAddVolatile(status, target, source, effect) {
|
|
if (["attract", "disable", "encore", "healblock", "taunt", "torment", "trashtalk"].includes(status.id)) {
|
|
if (effect.effectType === "Move") {
|
|
const effectHolder = this.effectState.target;
|
|
this.add("-block", target, "ability: Aroma Veil", "[of] " + effectHolder);
|
|
}
|
|
return null;
|
|
}
|
|
},
|
|
name: "Aroma Veil",
|
|
rating: 2,
|
|
num: 165
|
|
},
|
|
trace: {
|
|
onStart(pokemon) {
|
|
if (pokemon.foes().some(
|
|
(foeActive) => foeActive && foeActive.isAdjacent(pokemon) && foeActive.ability === "noability"
|
|
)) {
|
|
this.effectState.gaveUp = true;
|
|
}
|
|
},
|
|
onUpdate(pokemon) {
|
|
if (!pokemon.isStarted || this.effectState.gaveUp)
|
|
return;
|
|
const possibleTargets = pokemon.foes().filter((foeActive) => foeActive && foeActive.isAdjacent(pokemon));
|
|
while (possibleTargets.length) {
|
|
let rand = 0;
|
|
if (possibleTargets.length > 1)
|
|
rand = this.random(possibleTargets.length);
|
|
const target = possibleTargets[rand];
|
|
const ability = target.getAbility();
|
|
const additionalBannedAbilities = [
|
|
// Zen Mode included here for compatability with Gen 5-6
|
|
"noability",
|
|
"flowergift",
|
|
"forecast",
|
|
"hungerswitch",
|
|
"illusion",
|
|
"imposter",
|
|
"neutralizinggas",
|
|
"powerofalchemy",
|
|
"receiver",
|
|
"trace",
|
|
"zenmode",
|
|
"wanderingspirit"
|
|
];
|
|
if (target.getAbility().isPermanent || additionalBannedAbilities.includes(target.ability)) {
|
|
possibleTargets.splice(rand, 1);
|
|
continue;
|
|
}
|
|
this.add("-ability", pokemon, ability, "[from] ability: Trace", "[of] " + target);
|
|
pokemon.setAbility(ability);
|
|
return;
|
|
}
|
|
},
|
|
name: "Trace",
|
|
rating: 2.5,
|
|
num: 36
|
|
},
|
|
concussion: {
|
|
name: "Concussion",
|
|
shortDesc: "While this Pokemon is active, the opponents' held items have no effect.",
|
|
onStart(source) {
|
|
let activated = false;
|
|
for (const pokemon of source.foes()) {
|
|
if (!activated) {
|
|
this.add("-ability", source, "Concussion");
|
|
}
|
|
activated = true;
|
|
if (!pokemon.volatiles["embargo"] && !pokemon.hasItem("morningblossom")) {
|
|
pokemon.addVolatile("embargo");
|
|
}
|
|
}
|
|
},
|
|
onAnySwitchIn(pokemon) {
|
|
const source = this.effectState.target;
|
|
if (pokemon === source)
|
|
return;
|
|
for (const target of source.foes()) {
|
|
if (!target.volatiles["embargo"] && !target.hasItem("morningblossom")) {
|
|
target.addVolatile("embargo");
|
|
}
|
|
}
|
|
},
|
|
onEnd(pokemon) {
|
|
for (const target of pokemon.foes()) {
|
|
target.removeVolatile("embargo");
|
|
}
|
|
},
|
|
rating: 4
|
|
},
|
|
gorillatactics: {
|
|
name: "Gorilla Tactics",
|
|
shortDesc: "While this Pokemon is active, the opponents' held items have no effect.",
|
|
onStart(source) {
|
|
let activated = false;
|
|
for (const pokemon of source.foes()) {
|
|
if (!activated) {
|
|
this.add("-ability", source, "Gorilla Tactics");
|
|
}
|
|
activated = true;
|
|
if (!pokemon.volatiles["embargo"] && !pokemon.hasItem("morningblossom")) {
|
|
pokemon.addVolatile("embargo");
|
|
}
|
|
}
|
|
},
|
|
onAnySwitchIn(pokemon) {
|
|
const source = this.effectState.target;
|
|
if (pokemon === source)
|
|
return;
|
|
for (const target of source.foes()) {
|
|
if (!target.volatiles["embargo"] && !target.hasItem("morningblossom")) {
|
|
target.addVolatile("embargo");
|
|
}
|
|
}
|
|
},
|
|
onEnd(pokemon) {
|
|
for (const target of pokemon.foes()) {
|
|
target.removeVolatile("embargo");
|
|
}
|
|
},
|
|
rating: 4,
|
|
num: 255
|
|
},
|
|
toxicboost: {
|
|
shortDesc: "1.5x Attack and Defense while poisoned; Immune to poison status damage.",
|
|
onBasePowerPriority: 19,
|
|
onBasePower(basePower, attacker, defender, move) {
|
|
if ((attacker.status === "psn" || attacker.status === "tox") && move.category === "Physical") {
|
|
return this.chainModify(1.5);
|
|
}
|
|
},
|
|
onModifyDefPriority: 6,
|
|
onModifyDef(def, pokemon) {
|
|
if (pokemon.status === "psn" || pokemon.status === "tox") {
|
|
return this.chainModify(1.5);
|
|
}
|
|
},
|
|
onDamagePriority: 1,
|
|
onDamage(damage, target, source, effect) {
|
|
if (effect.id === "psn" || effect.id === "tox") {
|
|
return false;
|
|
}
|
|
},
|
|
name: "Toxic Boost",
|
|
rating: 2.5,
|
|
num: 137
|
|
},
|
|
flareboost: {
|
|
shortDesc: "1.5x SpA and SpD while burned; Immune to burn damage.",
|
|
onBasePowerPriority: 19,
|
|
onBasePower(basePower, attacker, defender, move) {
|
|
if (attacker.status === "brn" && move.category === "Special") {
|
|
return this.chainModify(1.5);
|
|
}
|
|
},
|
|
onModifySpDPriority: 6,
|
|
onModifySpD(spd, pokemon) {
|
|
if (pokemon.status === "brn") {
|
|
return this.chainModify(1.5);
|
|
}
|
|
},
|
|
onDamagePriority: 1,
|
|
onDamage(damage, target, source, effect) {
|
|
if (effect.id === "brn") {
|
|
return false;
|
|
}
|
|
},
|
|
name: "Flare Boost",
|
|
rating: 2.5,
|
|
num: 138
|
|
},
|
|
// The other Power of Alchemies
|
|
powerofalchemyweezing: {
|
|
shortDesc: "All of this Pokemon's abilities are active at once.",
|
|
onPreStart(pokemon) {
|
|
this.add("-ability", pokemon, "Neutralizing Gas");
|
|
pokemon.abilityState.ending = false;
|
|
for (const target of this.getAllActive()) {
|
|
if (target.illusion) {
|
|
this.singleEvent("End", this.dex.abilities.get("Illusion"), target.abilityState, target, pokemon, "neutralizinggas");
|
|
}
|
|
if (target.volatiles["slowstart"]) {
|
|
delete target.volatiles["slowstart"];
|
|
this.add("-end", target, "Slow Start", "[silent]");
|
|
}
|
|
}
|
|
},
|
|
onEnd(source) {
|
|
source.abilityState.ending = true;
|
|
for (const pokemon of this.getAllActive()) {
|
|
if (pokemon !== source) {
|
|
this.singleEvent("Start", pokemon.getAbility(), pokemon.abilityState, pokemon);
|
|
}
|
|
}
|
|
},
|
|
isPermanent: true,
|
|
name: "Power of Alchemy (Weezing)",
|
|
rating: 5
|
|
},
|
|
powerofalchemyalcremie: {
|
|
shortDesc: "All of this Pokemon's abilities are active at once.",
|
|
onPreStart(pokemon) {
|
|
this.add("-ability", pokemon, "Power of Alchemy");
|
|
},
|
|
onTakeItem(item, pokemon, source) {
|
|
if (this.suppressingAbility(pokemon) || !pokemon.hp || pokemon.item === "stickybarb")
|
|
return;
|
|
if (!this.activeMove)
|
|
throw new Error("Battle.activeMove is null");
|
|
if (source && source !== pokemon || this.activeMove.id === "knockoff") {
|
|
this.add("-activate", pokemon, "ability: Sticky Hold");
|
|
return false;
|
|
}
|
|
},
|
|
onSourceModifyDamage(damage, source, target, move) {
|
|
if (move.name === "Knock Off") {
|
|
this.debug("Sticky Hold weaken");
|
|
return this.chainModify(0.67);
|
|
}
|
|
},
|
|
onTryHit(pokemon, target, move) {
|
|
if (move.name === "Poltergeist") {
|
|
this.add("-immune", pokemon, "[from] ability: Sticky Hold");
|
|
return null;
|
|
}
|
|
},
|
|
onAllySetStatus(status, target, source, effect) {
|
|
if (status.id === "slp") {
|
|
this.debug("Sweet Veil interrupts sleep");
|
|
const effectHolder = this.effectState.target;
|
|
this.add("-block", target, "ability: Sweet Veil", "[of] " + effectHolder);
|
|
return null;
|
|
}
|
|
},
|
|
onAllyTryAddVolatile(status, target) {
|
|
if (status.id === "yawn") {
|
|
this.debug("Sweet Veil blocking yawn");
|
|
const effectHolder = this.effectState.target;
|
|
this.add("-block", target, "ability: Sweet Veil", "[of] " + effectHolder);
|
|
return null;
|
|
}
|
|
},
|
|
onResidualOrder: 26,
|
|
onResidualSubOrder: 1,
|
|
onResidual(pokemon) {
|
|
if (pokemon.hasItem("honey")) {
|
|
this.heal(pokemon.baseMaxhp / 8);
|
|
}
|
|
},
|
|
isPermanent: true,
|
|
name: "Power of Alchemy (Alcremie)",
|
|
rating: 5
|
|
},
|
|
powerofalchemymismagius: {
|
|
shortDesc: "All of this Pokemon's abilities are active at once.",
|
|
onPreStart(pokemon) {
|
|
this.add("-ability", pokemon, "Power of Alchemy");
|
|
},
|
|
isPermanent: true,
|
|
name: "Power of Alchemy (Mismagius)",
|
|
rating: 5
|
|
},
|
|
powerofalchemyslowkinggalar: {
|
|
shortDesc: "All of this Pokemon's abilities are active at once.",
|
|
onPreStart(pokemon) {
|
|
this.add("-ability", pokemon, "Power of Alchemy");
|
|
},
|
|
onStart(pokemon) {
|
|
for (const ally of pokemon.allies()) {
|
|
ally.clearBoosts();
|
|
this.add("-clearboost", ally, "[from] ability: Curious Medicine", "[of] " + pokemon);
|
|
}
|
|
},
|
|
onSwitchOut(pokemon) {
|
|
pokemon.heal(pokemon.baseMaxhp / 3);
|
|
},
|
|
isPermanent: true,
|
|
name: "Power of Alchemy (Slowking-Galar)",
|
|
rating: 5
|
|
},
|
|
powerofalchemyditto: {
|
|
shortDesc: "All of this Pokemon's abilities are active at once.",
|
|
onPreStart(pokemon) {
|
|
this.add("-ability", pokemon, "Power of Alchemy");
|
|
},
|
|
onUpdate(pokemon) {
|
|
if (pokemon.status === "par") {
|
|
this.add("-activate", pokemon, "ability: Limber");
|
|
pokemon.cureStatus();
|
|
}
|
|
},
|
|
onSetStatus(status, target, source, effect) {
|
|
if (status.id !== "par")
|
|
return;
|
|
if (effect?.status) {
|
|
this.add("-immune", target, "[from] ability: Limber");
|
|
}
|
|
return false;
|
|
},
|
|
onSwitchIn(pokemon) {
|
|
this.effectState.switchingIn = true;
|
|
},
|
|
onStart(pokemon) {
|
|
if (!this.effectState.switchingIn)
|
|
return;
|
|
const target = pokemon.foes()[pokemon.foes().length - 1 - pokemon.position];
|
|
if (target) {
|
|
pokemon.transformInto(target, this.dex.abilities.get("powerofalchemyditto"));
|
|
}
|
|
this.effectState.switchingIn = false;
|
|
},
|
|
isPermanent: true,
|
|
name: "Power of Alchemy (Ditto)",
|
|
rating: 5
|
|
},
|
|
powerofalchemyvanillite: {
|
|
shortDesc: "All of this Pokemon's abilities are active at once.",
|
|
onPreStart(pokemon) {
|
|
this.add("-ability", pokemon, "Power of Alchemy");
|
|
},
|
|
onImmunity(type, pokemon) {
|
|
if (type === "hail")
|
|
return false;
|
|
},
|
|
onModifyDef(def, pokemon) {
|
|
if (this.field.isWeather("hail")) {
|
|
return this.chainModify(1.25);
|
|
}
|
|
},
|
|
onModifySpD(spd, pokemon) {
|
|
if (this.field.isWeather("hail")) {
|
|
return this.chainModify(1.25);
|
|
}
|
|
},
|
|
onResidualOrder: 5,
|
|
onResidualSubOrder: 2,
|
|
onResidual(pokemon) {
|
|
if (this.field.isWeather("hail"))
|
|
return;
|
|
this.heal(pokemon.maxhp / 16);
|
|
},
|
|
onWeather(target, source, effect) {
|
|
if (effect.id === "hail") {
|
|
this.heal(target.baseMaxhp / 8);
|
|
}
|
|
},
|
|
isPermanent: true,
|
|
name: "Power of Alchemy (Vanillite)",
|
|
rating: 5
|
|
},
|
|
powerofalchemyvanilluxe: {
|
|
shortDesc: "All of this Pokemon's abilities are active at once.",
|
|
onPreStart(pokemon) {
|
|
this.add("-ability", pokemon, "Power of Alchemy");
|
|
},
|
|
onStart(source) {
|
|
this.field.setWeather("hail");
|
|
},
|
|
onResidualOrder: 5,
|
|
onResidualSubOrder: 2,
|
|
onResidual(pokemon) {
|
|
if (this.field.isWeather("hail"))
|
|
return;
|
|
this.heal(pokemon.maxhp / 16);
|
|
},
|
|
onWeather(target, source, effect) {
|
|
if (effect.id === "hail") {
|
|
this.heal(target.baseMaxhp / 8);
|
|
}
|
|
},
|
|
isPermanent: true,
|
|
name: "Power of Alchemy (Vanilluxe)",
|
|
rating: 5
|
|
},
|
|
powerofalchemytypenull: {
|
|
shortDesc: "All of this Pokemon's abilities are active at once.",
|
|
onPreStart(pokemon) {
|
|
this.add("-ability", pokemon, "Power of Alchemy");
|
|
},
|
|
onStart(pokemon) {
|
|
this.add("-ability", pokemon, "Pressure");
|
|
},
|
|
onDeductPP(target, source) {
|
|
if (target.side === source.side)
|
|
return;
|
|
return 1;
|
|
},
|
|
onCriticalHit: false,
|
|
isPermanent: true,
|
|
name: "Power of Alchemy (Type: Null)",
|
|
rating: 5
|
|
},
|
|
powerofalchemysilvally: {
|
|
shortDesc: "All of this Pokemon's abilities are active at once.",
|
|
onPreStart(pokemon) {
|
|
this.add("-ability", pokemon, "Power of Alchemy");
|
|
},
|
|
onStart(pokemon) {
|
|
let totaldef = 0;
|
|
let totalspd = 0;
|
|
for (const target of pokemon.foes()) {
|
|
if (!target || target.fainted)
|
|
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 });
|
|
}
|
|
},
|
|
isPermanent: true,
|
|
name: "Power of Alchemy (Silvally)",
|
|
rating: 5
|
|
},
|
|
powerofalchemyvaporeon: {
|
|
shortDesc: "All of this Pokemon's abilities are active at once.",
|
|
onPreStart(pokemon) {
|
|
this.add("-ability", pokemon, "Power of Alchemy");
|
|
},
|
|
onResidualOrder: 5,
|
|
onResidualSubOrder: 4,
|
|
onResidual(pokemon) {
|
|
if (pokemon.status && ["raindance", "primordialsea"].includes(pokemon.effectiveWeather())) {
|
|
this.debug("hydration");
|
|
this.add("-activate", pokemon, "ability: Hydration");
|
|
this.add("-message", `Hydration activated!`);
|
|
pokemon.cureStatus();
|
|
}
|
|
},
|
|
onTryHit(target, source, move) {
|
|
if (target !== source && move.type === "Water") {
|
|
if (!this.heal(target.baseMaxhp / 2.667) || !target.cureStatus()) {
|
|
this.add("-immune", target, "[from] ability: Power of Alchemy (Vaporeon)");
|
|
}
|
|
return null;
|
|
}
|
|
},
|
|
isPermanent: true,
|
|
name: "Power of Alchemy (Vaporeon)",
|
|
rating: 5
|
|
},
|
|
powerofalchemyjolteon: {
|
|
shortDesc: "All of this Pokemon's abilities are active at once.",
|
|
onPreStart(pokemon) {
|
|
this.add("-ability", pokemon, "Power of Alchemy");
|
|
},
|
|
onTryHit(target, source, move) {
|
|
if (target !== source && move.type === "Electric") {
|
|
if (!this.heal(target.baseMaxhp / 4)) {
|
|
this.add("-immune", target, "[from] ability: Volt Absorb");
|
|
}
|
|
return null;
|
|
}
|
|
},
|
|
onDamagingHitOrder: 1,
|
|
onDamagingHit(damage, target, source, move) {
|
|
if (move.flags["contact"]) {
|
|
this.add("-ability", target, "Prickly Coat");
|
|
if (move.type === "Poison" || target.hasType("Poison")) {
|
|
target.side.foe.addSideCondition("toxicspikes");
|
|
} else {
|
|
target.side.foe.addSideCondition("spikes");
|
|
}
|
|
}
|
|
},
|
|
isPermanent: true,
|
|
name: "Power of Alchemy (Jolteon)",
|
|
rating: 5
|
|
},
|
|
powerofalchemyflareon: {
|
|
shortDesc: "All of this Pokemon's abilities are active at once.",
|
|
onPreStart(pokemon) {
|
|
this.add("-ability", pokemon, "Power of Alchemy");
|
|
},
|
|
onTryHit(target, source, move) {
|
|
if (target !== source && move.type === "Fire") {
|
|
move.accuracy = true;
|
|
if (!target.addVolatile("flashfire")) {
|
|
this.add("-immune", target, "[from] ability: Flash Fire");
|
|
}
|
|
return null;
|
|
}
|
|
},
|
|
onSourceModifyDamage(damage, source, target, move) {
|
|
let mod = 1;
|
|
if (move.type === "Fire")
|
|
mod *= 2;
|
|
if (move.flags["contact"])
|
|
mod /= 2;
|
|
return this.chainModify(mod);
|
|
},
|
|
isPermanent: true,
|
|
name: "Power of Alchemy (Flareon)",
|
|
rating: 5
|
|
},
|
|
powerofalchemyespeon: {
|
|
shortDesc: "All of this Pokemon's abilities are active at once.",
|
|
onPreStart(pokemon) {
|
|
this.add("-ability", pokemon, "Power of Alchemy");
|
|
},
|
|
onBasePowerPriority: 21,
|
|
onBasePower(basePower, pokemon) {
|
|
let boosted = true;
|
|
for (const target of this.getAllActive()) {
|
|
if (target === pokemon)
|
|
continue;
|
|
if (this.queue.willMove(target)) {
|
|
boosted = false;
|
|
break;
|
|
}
|
|
}
|
|
if (boosted) {
|
|
this.debug("Analytic boost");
|
|
return this.chainModify([5325, 4096]);
|
|
}
|
|
},
|
|
onTryHitPriority: 1,
|
|
onTryHit(target, source, move) {
|
|
if (target === source || move.hasBounced || !move.flags["reflectable"]) {
|
|
return;
|
|
}
|
|
const newMove = this.dex.getActiveMove(move.id);
|
|
newMove.hasBounced = true;
|
|
newMove.pranksterBoosted = false;
|
|
this.actions.useMove(newMove, target, source);
|
|
return null;
|
|
},
|
|
onAllyTryHitSide(target, source, move) {
|
|
if (target.side === source.side || move.hasBounced || !move.flags["reflectable"]) {
|
|
return;
|
|
}
|
|
const newMove = this.dex.getActiveMove(move.id);
|
|
newMove.hasBounced = true;
|
|
newMove.pranksterBoosted = false;
|
|
this.actions.useMove(newMove, this.effectState.target, source);
|
|
return null;
|
|
},
|
|
condition: {
|
|
duration: 1
|
|
},
|
|
isPermanent: true,
|
|
name: "Power of Alchemy (Espeon)",
|
|
rating: 5
|
|
},
|
|
powerofalchemyumbreon: {
|
|
shortDesc: "All of this Pokemon's abilities are active at once.",
|
|
onPreStart(pokemon) {
|
|
this.add("-ability", pokemon, "Power of Alchemy");
|
|
},
|
|
onModifyCritRatio(critRatio, source, target) {
|
|
if (target?.status)
|
|
return 5;
|
|
},
|
|
isPermanent: true,
|
|
name: "Power of Alchemy (Umbreon)",
|
|
rating: 5
|
|
},
|
|
powerofalchemyleafeon: {
|
|
shortDesc: "All of this Pokemon's abilities are active at once.",
|
|
onPreStart(pokemon) {
|
|
this.add("-ability", pokemon, "Power of Alchemy");
|
|
},
|
|
onSetStatus(status, target, source, effect) {
|
|
if (["sunnyday", "desolateland"].includes(target.effectiveWeather())) {
|
|
if (effect?.status) {
|
|
this.add("-immune", target, "[from] ability: Leaf Guard");
|
|
}
|
|
return false;
|
|
}
|
|
},
|
|
onTryAddVolatile(status, target) {
|
|
if ((status.id === "yawn" || status.id === "flinch") && ["sunnyday", "desolateland"].includes(target.effectiveWeather())) {
|
|
this.add("-immune", target, "[from] ability: Leaf Guard");
|
|
return null;
|
|
}
|
|
},
|
|
onSourceModifyAtkPriority: 6,
|
|
onSourceModifyAtk(atk, attacker, defender, move) {
|
|
if (move.type === "Flying" || move.type === "Bug") {
|
|
this.debug("Leaf Guard weaken");
|
|
return this.chainModify(0.5);
|
|
}
|
|
},
|
|
onSourceModifySpAPriority: 5,
|
|
onSourceModifySpA(atk, attacker, defender, move) {
|
|
if (move.type === "Flying" || move.type === "Bug") {
|
|
this.debug("Leaf Guard weaken");
|
|
return this.chainModify(0.5);
|
|
}
|
|
},
|
|
onModifySpe(spe, pokemon) {
|
|
if (["sunnyday", "desolateland"].includes(pokemon.effectiveWeather())) {
|
|
return this.chainModify(2);
|
|
}
|
|
},
|
|
isPermanent: true,
|
|
name: "Power of Alchemy (Leafeon)",
|
|
rating: 5
|
|
},
|
|
powerofalchemyglaceon: {
|
|
shortDesc: "All of this Pokemon's abilities are active at once.",
|
|
onPreStart(pokemon) {
|
|
this.add("-ability", pokemon, "Power of Alchemy");
|
|
},
|
|
onStart(source) {
|
|
this.field.setWeather("hail");
|
|
},
|
|
onImmunity(type, pokemon) {
|
|
if (type === "hail")
|
|
return false;
|
|
},
|
|
onBasePowerPriority: 21,
|
|
onBasePower(basePower, attacker, defender, move) {
|
|
if (this.field.isWeather("hail")) {
|
|
if (move.type === "Ice" || move.type === "Water" || move.type === "Fairy") {
|
|
this.debug("Snow Cloak boost");
|
|
return this.chainModify([5325, 4096]);
|
|
}
|
|
}
|
|
},
|
|
isPermanent: true,
|
|
name: "Power of Alchemy (Glaceon)",
|
|
rating: 5
|
|
},
|
|
powerofalchemysylveon: {
|
|
shortDesc: "All of this Pokemon's abilities are active at once.",
|
|
onPreStart(pokemon) {
|
|
this.add("-ability", pokemon, "Power of Alchemy");
|
|
},
|
|
onCheckShow(pokemon) {
|
|
if (pokemon.side.active.length === 1)
|
|
return;
|
|
if (pokemon.showCure === true || pokemon.showCure === false)
|
|
return;
|
|
const cureList = [];
|
|
let noCureCount = 0;
|
|
for (const curPoke of pokemon.side.active) {
|
|
if (!curPoke || !curPoke.status) {
|
|
continue;
|
|
}
|
|
if (curPoke.showCure) {
|
|
continue;
|
|
}
|
|
const species = curPoke.species;
|
|
if (!Object.values(species.abilities).includes("Natural Cure")) {
|
|
continue;
|
|
}
|
|
if (!species.abilities["1"] && !species.abilities["H"]) {
|
|
continue;
|
|
}
|
|
if (curPoke !== pokemon && !this.queue.willSwitch(curPoke)) {
|
|
continue;
|
|
}
|
|
if (curPoke.hasAbility("naturalcure")) {
|
|
cureList.push(curPoke);
|
|
} else {
|
|
noCureCount++;
|
|
}
|
|
}
|
|
if (!cureList.length || !noCureCount) {
|
|
for (const pkmn of cureList) {
|
|
pkmn.showCure = true;
|
|
}
|
|
} else {
|
|
this.add("-message", "(" + cureList.length + " of " + pokemon.side.name + "'s pokemon " + (cureList.length === 1 ? "was" : "were") + " cured by Natural Cure.)");
|
|
for (const pkmn of cureList) {
|
|
pkmn.showCure = false;
|
|
}
|
|
}
|
|
},
|
|
onSwitchOut(pokemon) {
|
|
if (!pokemon.status)
|
|
return;
|
|
if (pokemon.showCure === void 0)
|
|
pokemon.showCure = true;
|
|
if (pokemon.showCure)
|
|
this.add("-curestatus", pokemon, pokemon.status, "[from] ability: Natural Cure");
|
|
pokemon.setStatus("");
|
|
if (!pokemon.showCure)
|
|
pokemon.showCure = void 0;
|
|
},
|
|
onModifyTypePriority: -1,
|
|
onModifyType(move, pokemon) {
|
|
const noModifyType = [
|
|
"judgment",
|
|
"multiattack",
|
|
"naturalgift",
|
|
"revelationdance",
|
|
"technoblast",
|
|
"terrainpulse",
|
|
"weatherball"
|
|
];
|
|
if (move.type === "Normal" && !noModifyType.includes(move.id) && !(move.isZ && move.category !== "Status")) {
|
|
move.type = "Fairy";
|
|
move.typeChangerBoosted = this.effect;
|
|
}
|
|
},
|
|
onBasePowerPriority: 23,
|
|
onBasePower(basePower, pokemon, target, move) {
|
|
if (move.typeChangerBoosted === this.effect)
|
|
return this.chainModify([4915, 4096]);
|
|
},
|
|
isPermanent: true,
|
|
name: "Power of Alchemy (Sylveon)",
|
|
rating: 5
|
|
},
|
|
// Counterfeit Stuff, never ask me for anything ever again
|
|
lifeorb: {
|
|
onModifyDamage(damage, source, target, move) {
|
|
return this.chainModify(1.3);
|
|
},
|
|
onAfterMoveSecondarySelf(source, target, move) {
|
|
if (source && source !== target && move && move.category !== "Status") {
|
|
this.add("-ability", source, "Life Orb");
|
|
this.damage(source.baseMaxhp / 10, source, source);
|
|
}
|
|
},
|
|
name: "Life Orb"
|
|
},
|
|
assaultvest: {
|
|
onModifySpDPriority: 1,
|
|
onModifySpD(spd) {
|
|
return this.chainModify(1.5);
|
|
},
|
|
onDisableMove(pokemon) {
|
|
for (const moveSlot of pokemon.moveSlots) {
|
|
if (this.dex.moves.get(moveSlot.move).category === "Status") {
|
|
pokemon.disableMove(moveSlot.id);
|
|
}
|
|
}
|
|
},
|
|
name: "Assault Vest"
|
|
},
|
|
choiceband: {
|
|
onStart(pokemon) {
|
|
pokemon.abilityState.choiceLock = "";
|
|
},
|
|
onBeforeMove(pokemon, target, move) {
|
|
if (move.isZOrMaxPowered || move.id === "struggle")
|
|
return;
|
|
if (pokemon.abilityState.choiceLock && pokemon.abilityState.choiceLock !== move.id) {
|
|
this.addMove("move", pokemon, move.name);
|
|
this.attrLastMove("[still]");
|
|
this.debug("Disabled by Choice Band");
|
|
this.add("-fail", pokemon);
|
|
return false;
|
|
}
|
|
},
|
|
onModifyMove(move, pokemon) {
|
|
if (pokemon.abilityState.choiceLock || move.isZOrMaxPowered || move.id === "struggle")
|
|
return;
|
|
pokemon.abilityState.choiceLock = move.id;
|
|
},
|
|
onModifyAtkPriority: 1,
|
|
onModifyAtk(atk, pokemon) {
|
|
if (pokemon.volatiles["dynamax"])
|
|
return;
|
|
this.debug("Choice Band Atk Boost");
|
|
return this.chainModify(1.5);
|
|
},
|
|
onDisableMove(pokemon) {
|
|
if (!pokemon.abilityState.choiceLock)
|
|
return;
|
|
if (pokemon.volatiles["dynamax"])
|
|
return;
|
|
for (const moveSlot of pokemon.moveSlots) {
|
|
if (moveSlot.id !== pokemon.abilityState.choiceLock) {
|
|
pokemon.disableMove(moveSlot.id, false, this.effectState.sourceEffect);
|
|
}
|
|
}
|
|
},
|
|
onEnd(pokemon) {
|
|
pokemon.abilityState.choiceLock = "";
|
|
},
|
|
name: "Choice Band"
|
|
},
|
|
choicespecs: {
|
|
name: "Choice Specs",
|
|
shortDesc: "This Pokemon's Sp. Atk is 1.5x, but it can only select the first move it executes.",
|
|
onStart(pokemon) {
|
|
pokemon.abilityState.choiceLock = "";
|
|
},
|
|
onBeforeMove(pokemon, target, move) {
|
|
if (move.isZOrMaxPowered || move.id === "struggle")
|
|
return;
|
|
if (pokemon.abilityState.choiceLock && pokemon.abilityState.choiceLock !== move.id) {
|
|
this.addMove("move", pokemon, move.name);
|
|
this.attrLastMove("[still]");
|
|
this.debug("Disabled by Choice Specs");
|
|
this.add("-fail", pokemon);
|
|
return false;
|
|
}
|
|
},
|
|
onModifyMove(move, pokemon) {
|
|
if (pokemon.abilityState.choiceLock || move.isZOrMaxPowered || move.id === "struggle")
|
|
return;
|
|
pokemon.abilityState.choiceLock = move.id;
|
|
},
|
|
onModifySpAPriority: 5,
|
|
onModifySpA(atk, pokemon, move) {
|
|
if (pokemon.volatiles["dynamax"])
|
|
return;
|
|
this.debug("Choice Specs Sp. Atk Boost");
|
|
return this.chainModify(1.5);
|
|
},
|
|
onDisableMove(pokemon) {
|
|
if (!pokemon.abilityState.choiceLock)
|
|
return;
|
|
if (pokemon.volatiles["dynamax"])
|
|
return;
|
|
for (const moveSlot of pokemon.moveSlots) {
|
|
if (moveSlot.id !== pokemon.abilityState.choiceLock) {
|
|
pokemon.disableMove(moveSlot.id, false, this.effectState.sourceEffect);
|
|
}
|
|
}
|
|
},
|
|
onEnd(pokemon) {
|
|
pokemon.abilityState.choiceLock = "";
|
|
}
|
|
},
|
|
choicescarf: {
|
|
onStart(pokemon) {
|
|
pokemon.abilityState.choiceLock = "";
|
|
},
|
|
onBeforeMove(pokemon, target, move) {
|
|
if (move.isZOrMaxPowered || move.id === "struggle")
|
|
return;
|
|
if (pokemon.abilityState.choiceLock && pokemon.abilityState.choiceLock !== move.id) {
|
|
this.addMove("move", pokemon, move.name);
|
|
this.attrLastMove("[still]");
|
|
this.debug("Disabled by Choice Scarf");
|
|
this.add("-fail", pokemon);
|
|
return false;
|
|
}
|
|
},
|
|
onModifyMove(move, pokemon) {
|
|
if (pokemon.abilityState.choiceLock || move.isZOrMaxPowered || move.id === "struggle")
|
|
return;
|
|
pokemon.abilityState.choiceLock = move.id;
|
|
},
|
|
onModifySpe(spe, pokemon) {
|
|
if (pokemon.volatiles["dynamax"])
|
|
return;
|
|
this.debug("Choice Scarf Spe Boost");
|
|
return this.chainModify(1.5);
|
|
},
|
|
onDisableMove(pokemon) {
|
|
if (!pokemon.abilityState.choiceLock)
|
|
return;
|
|
if (pokemon.volatiles["dynamax"])
|
|
return;
|
|
for (const moveSlot of pokemon.moveSlots) {
|
|
if (moveSlot.id !== pokemon.abilityState.choiceLock) {
|
|
pokemon.disableMove(moveSlot.id, false, this.effectState.sourceEffect);
|
|
}
|
|
}
|
|
},
|
|
onEnd(pokemon) {
|
|
pokemon.abilityState.choiceLock = "";
|
|
},
|
|
name: "Choice Scarf"
|
|
},
|
|
eviolite: {
|
|
onModifyDefPriority: 2,
|
|
onModifyDef(def, pokemon) {
|
|
if (pokemon.baseSpecies.nfe) {
|
|
return this.chainModify(1.5);
|
|
}
|
|
},
|
|
onModifySpDPriority: 2,
|
|
onModifySpD(spd, pokemon) {
|
|
if (pokemon.baseSpecies.nfe) {
|
|
return this.chainModify(1.5);
|
|
}
|
|
},
|
|
name: "Eviolite"
|
|
},
|
|
eviolith: {
|
|
onModifyAtkPriority: 2,
|
|
onModifyAtk(atk, pokemon) {
|
|
if (pokemon.baseSpecies.nfe) {
|
|
return this.chainModify(1.5);
|
|
}
|
|
},
|
|
onModifySpAPriority: 2,
|
|
onModifySpA(spa, pokemon) {
|
|
if (pokemon.baseSpecies.nfe) {
|
|
return this.chainModify(1.5);
|
|
}
|
|
},
|
|
name: "Eviolith"
|
|
},
|
|
momentumarmor: {
|
|
onModifyAtkPriority: 1,
|
|
onModifyAtk(atk, pokemon) {
|
|
const def = pokemon.getStat("def", false, true);
|
|
const newAtk = atk + def / 4;
|
|
return newAtk;
|
|
},
|
|
name: "Momentum Armor"
|
|
},
|
|
shellbell: {
|
|
onAfterMoveSecondarySelfPriority: -1,
|
|
onAfterMoveSecondarySelf(pokemon, target, move) {
|
|
if (move.category !== "Status") {
|
|
this.heal(pokemon.baseMaxhp / 8);
|
|
}
|
|
},
|
|
name: "Shell Bell"
|
|
},
|
|
cursedbelt: {
|
|
onAfterMoveSecondarySelf(target, source, move) {
|
|
if (move.category === "Status") {
|
|
target.addVolatile("disable");
|
|
}
|
|
},
|
|
onModifyDamage(damage, source, target, move) {
|
|
if (source.volatiles["disable"]) {
|
|
return this.chainModify(1.2);
|
|
}
|
|
},
|
|
name: "Cursed Belt"
|
|
},
|
|
focussash: {
|
|
onStart(pokemon) {
|
|
pokemon.addVolatile("focussash");
|
|
},
|
|
condition: {
|
|
onDamagePriority: -100,
|
|
onDamage(damage, target, source, effect) {
|
|
if (target.hp === target.maxhp && damage >= target.hp && effect && effect.effectType === "Move") {
|
|
this.add("-ability", target, "Focus Sash");
|
|
target.removeVolatile("focussash");
|
|
return target.hp - 1;
|
|
}
|
|
}
|
|
},
|
|
name: "Focus Sash"
|
|
},
|
|
leftovers: {
|
|
onResidualOrder: 5,
|
|
onResidualSubOrder: 5,
|
|
onResidual(pokemon) {
|
|
this.heal(pokemon.baseMaxhp / 16);
|
|
},
|
|
name: "Leftovers"
|
|
},
|
|
rockyhelmet: {
|
|
onDamagingHitOrder: 2,
|
|
onDamagingHit(damage, target, source, move) {
|
|
if (move.flags["contact"]) {
|
|
this.damage(source.baseMaxhp / 6, source, target);
|
|
}
|
|
},
|
|
name: "Rocky Helmet"
|
|
},
|
|
blacksludge: {
|
|
onResidualOrder: 5,
|
|
onResidualSubOrder: 5,
|
|
onResidual(pokemon) {
|
|
if (pokemon.hasType("Poison")) {
|
|
this.heal(pokemon.baseMaxhp / 16);
|
|
} else {
|
|
this.damage(pokemon.baseMaxhp / 8);
|
|
}
|
|
},
|
|
name: "Black Sludge"
|
|
},
|
|
reapercloth: {
|
|
onResidualOrder: 5,
|
|
onResidualSubOrder: 5,
|
|
onResidual(pokemon) {
|
|
if (pokemon.hasType("Ghost")) {
|
|
this.heal(pokemon.baseMaxhp / 16);
|
|
}
|
|
},
|
|
onDisableMove(pokemon) {
|
|
if (!pokemon.hasType("Ghost") && pokemon.lastMove && pokemon.lastMove.id !== "struggle") {
|
|
pokemon.disableMove(pokemon.lastMove.id);
|
|
}
|
|
},
|
|
name: "Reaper Cloth"
|
|
},
|
|
flameorb: {
|
|
onResidualOrder: 26,
|
|
onResidualSubOrder: 2,
|
|
onResidual(pokemon) {
|
|
pokemon.trySetStatus("brn", pokemon);
|
|
},
|
|
name: "Flame Orb"
|
|
},
|
|
toxicorb: {
|
|
onResidualOrder: 26,
|
|
onResidualSubOrder: 2,
|
|
onResidual(pokemon) {
|
|
pokemon.trySetStatus("tox", pokemon);
|
|
},
|
|
name: "Toxic Orb"
|
|
},
|
|
widelens: {
|
|
onSourceModifyAccuracyPriority: 4,
|
|
onSourceModifyAccuracy(accuracy) {
|
|
if (typeof accuracy === "number") {
|
|
return accuracy * 1.2;
|
|
}
|
|
},
|
|
name: "Wide Lens"
|
|
},
|
|
zoomlens: {
|
|
onSourceModifyAccuracyPriority: 4,
|
|
onSourceModifyAccuracy(accuracy, target) {
|
|
if (typeof accuracy === "number" && (!this.queue.willMove(target) || target.newlySwitched)) {
|
|
this.debug("Zoom Lens boosting accuracy");
|
|
return accuracy * 1.5;
|
|
}
|
|
},
|
|
name: "Zoom Lens"
|
|
},
|
|
protector: {
|
|
onSourceModifyDamage(damage, source, target, move) {
|
|
if (target.getMoveHitData(move).typeMod > 0) {
|
|
this.debug("Protector neutralize");
|
|
return this.chainModify(0.75);
|
|
}
|
|
},
|
|
name: "Protector"
|
|
},
|
|
quickclaw: {
|
|
onFractionalPriorityPriority: -2,
|
|
onFractionalPriority(priority, pokemon) {
|
|
if (priority <= 0 && this.randomChance(1, 5)) {
|
|
this.add("-activate", pokemon, "ability: Quick Claw");
|
|
return 0.1;
|
|
}
|
|
},
|
|
name: "Quick Claw"
|
|
},
|
|
shedshell: {
|
|
onTrapPokemonPriority: -10,
|
|
onTrapPokemon(pokemon) {
|
|
pokemon.trapped = pokemon.maybeTrapped = false;
|
|
},
|
|
name: "Shed Shell"
|
|
},
|
|
scopelens: {
|
|
onModifyCritRatio(critRatio) {
|
|
return critRatio + 1;
|
|
},
|
|
name: "Scope Lens"
|
|
},
|
|
razorclaw: {
|
|
onModifyCritRatio(critRatio) {
|
|
return critRatio + 1;
|
|
},
|
|
name: "Razor Claw"
|
|
},
|
|
whippeddream: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Fairy") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Whipped Dream"
|
|
},
|
|
pixieplate: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Fairy") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Pixie Plate"
|
|
},
|
|
blackbelt: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Fighting") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Black Belt"
|
|
},
|
|
blackglasses: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Dark") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Black Glasses"
|
|
},
|
|
charcoal: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Fire") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Charcoal"
|
|
},
|
|
dragonfang: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Dragon") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Dragon Fang"
|
|
},
|
|
hardstone: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Rock") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Hard Stone"
|
|
},
|
|
magnet: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Electric") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Magnet"
|
|
},
|
|
metalcoat: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Steel") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Metal Coat"
|
|
},
|
|
miracleseed: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Grass") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Miracle Seed"
|
|
},
|
|
mysticwater: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Water") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Mystic Water"
|
|
},
|
|
nevermeltice: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Ice") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Never-Melt Ice"
|
|
},
|
|
poisonbarb: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Poison") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Poison Barb"
|
|
},
|
|
sharpbeak: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Flying") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Sharp Beak"
|
|
},
|
|
silkscarf: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Normal") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Silk Scarf"
|
|
},
|
|
softsand: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Ground") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Soft Sand"
|
|
},
|
|
spelltag: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Ghost") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Spell Tag"
|
|
},
|
|
twistedspoon: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Psychic") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Twisted Spoon"
|
|
},
|
|
silverpowder: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Bug") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Silver Powder"
|
|
},
|
|
protectivepads: {
|
|
onModifyMove(move) {
|
|
delete move.flags["contact"];
|
|
},
|
|
name: "Protective Pads"
|
|
},
|
|
safetygoggles: {
|
|
onImmunity(type, pokemon) {
|
|
if (type === "sandstorm" || type === "hail" || type === "powder")
|
|
return false;
|
|
},
|
|
onTryHit(pokemon, source, move) {
|
|
if (move.flags["powder"] && pokemon !== source && this.dex.getImmunity("powder", pokemon)) {
|
|
this.add("-activate", pokemon, "ability: Safety Goggles", move.name);
|
|
return null;
|
|
}
|
|
},
|
|
name: "Safety Goggles"
|
|
},
|
|
bigroot: {
|
|
onTryHealPriority: 1,
|
|
onTryHeal(damage, target, source, effect) {
|
|
const heals = ["drain", "leechseed", "ingrain", "aquaring", "strengthsap"];
|
|
if (heals.includes(effect.id)) {
|
|
return this.chainModify([5324, 4096]);
|
|
}
|
|
},
|
|
name: "Big Root"
|
|
},
|
|
utilityumbrella: {
|
|
onImmunity(type, pokemon) {
|
|
if (type === "sandstorm" || type === "hail")
|
|
return false;
|
|
},
|
|
onWeather(target, source, effect) {
|
|
if (this.field.isWeather(["sunnyday", "desolateland", "hail", "raindance", "primordialsea", "sandstorm"])) {
|
|
this.heal(target.baseMaxhp / 12);
|
|
}
|
|
},
|
|
name: "Utility Umbrella"
|
|
},
|
|
soulblade: {
|
|
onModifyDamage(damage, source, target, move) {
|
|
return this.chainModify([4505, 4096]);
|
|
},
|
|
name: "Soul Blade"
|
|
},
|
|
fistplate: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Fighting") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Fist Plate"
|
|
},
|
|
dreadplate: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Dark") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Dread Plate"
|
|
},
|
|
flameplate: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Fire") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Flame Plate"
|
|
},
|
|
dracoplate: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Dragon") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Draco Plate"
|
|
},
|
|
stoneplate: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Rock") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Stone Plate"
|
|
},
|
|
rockincense: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Rock") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Rock Incense"
|
|
},
|
|
zapplate: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Electric") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Zap Plate"
|
|
},
|
|
ironplate: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Steel") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Iron Plate"
|
|
},
|
|
meadowplate: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Grass") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Meadow Plate"
|
|
},
|
|
roseincense: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Grass") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Rose Incense"
|
|
},
|
|
splashplate: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Water") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Splash Plate"
|
|
},
|
|
seaincense: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Water") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Sea Incense"
|
|
},
|
|
waveincense: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Water") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Wave Incense"
|
|
},
|
|
icicleplate: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Ice") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Icicle Plate"
|
|
},
|
|
toxicplate: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Poison") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Toxic Plate"
|
|
},
|
|
skyplate: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Flying") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Sky Plate"
|
|
},
|
|
earthplate: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Ground") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Earth Plate"
|
|
},
|
|
spookyplate: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Ghost") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Spooky Plate"
|
|
},
|
|
mindplate: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Psychic") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Mind Plate"
|
|
},
|
|
oddincense: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Psychic") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Odd Incense"
|
|
},
|
|
insectplate: {
|
|
onBasePowerPriority: 15,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move && move.type === "Bug") {
|
|
return this.chainModify([4915, 4096]);
|
|
}
|
|
},
|
|
name: "Insect Plate"
|
|
},
|
|
fullincense: {
|
|
onFractionalPriority: -0.1,
|
|
name: "Full Incense"
|
|
},
|
|
laggingtail: {
|
|
onFractionalPriority: -0.1,
|
|
name: "Lagging Tail"
|
|
},
|
|
muscleband: {
|
|
onBasePowerPriority: 16,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move.category === "Physical") {
|
|
return this.chainModify([4505, 4096]);
|
|
}
|
|
},
|
|
name: "Muscle Band"
|
|
},
|
|
wiseglasses: {
|
|
onBasePowerPriority: 16,
|
|
onBasePower(basePower, user, target, move) {
|
|
if (move.category === "Special") {
|
|
return this.chainModify([4505, 4096]);
|
|
}
|
|
},
|
|
name: "Wise Glasses"
|
|
},
|
|
focusband: {
|
|
onDamage(damage, target, source, effect) {
|
|
if (this.randomChance(1, 10) && damage >= target.hp && effect && effect.effectType === "Move") {
|
|
this.add("-activate", target, "ability: Focus Band");
|
|
return target.hp - 1;
|
|
}
|
|
},
|
|
name: "Focus Band"
|
|
},
|
|
metronome: {
|
|
onStart(pokemon) {
|
|
pokemon.addVolatile("metronome");
|
|
},
|
|
condition: {
|
|
onStart(pokemon) {
|
|
this.effectState.lastMove = "";
|
|
this.effectState.numConsecutive = 0;
|
|
},
|
|
onTryMovePriority: -2,
|
|
onTryMove(pokemon, target, move) {
|
|
if (!pokemon.hasItem("metronome")) {
|
|
pokemon.removeVolatile("metronome");
|
|
return;
|
|
}
|
|
if (this.effectState.lastMove === move.id && pokemon.moveLastTurnResult) {
|
|
this.effectState.numConsecutive++;
|
|
} else if (pokemon.volatiles["twoturnmove"] && this.effectState.lastMove !== move.id) {
|
|
this.effectState.numConsecutive = 1;
|
|
} else {
|
|
this.effectState.numConsecutive = 0;
|
|
}
|
|
this.effectState.lastMove = move.id;
|
|
},
|
|
onModifyDamage(damage, source, target, move) {
|
|
const dmgMod = [4096, 4915, 5734, 6553, 7372, 8192];
|
|
const numConsecutive = this.effectState.numConsecutive > 5 ? 5 : this.effectState.numConsecutive;
|
|
return this.chainModify([dmgMod[numConsecutive], 4096]);
|
|
}
|
|
},
|
|
name: "Metronome"
|
|
}
|
|
};
|
|
//# sourceMappingURL=abilities.js.map
|