Minecraft-STC-Modpack/showdown/data/mods/gen8joltemons/moves.js
2023-08-14 21:45:09 -04:00

1527 lines
41 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 moves_exports = {};
__export(moves_exports, {
Moves: () => Moves
});
module.exports = __toCommonJS(moves_exports);
const Moves = {
toxicthread: {
num: 672,
accuracy: 100,
basePower: 0,
category: "Status",
shortDesc: "Badly poisons and lowers the target's Speed by 2",
name: "Toxic Thread",
pp: 20,
priority: 0,
flags: { protect: 1, reflectable: 1, mirror: 1 },
status: "tox",
boosts: {
spe: -2
},
secondary: null,
target: "normal",
type: "Poison",
zMove: { boost: { spe: 1 } },
contestType: "Tough"
},
meltingpoint: {
accuracy: 100,
basePower: 80,
category: "Special",
shortDesc: "Replaces the user's Ice-type with Water. 1.5x power when used by Ice-types. Soaks foe.",
name: "Melting Point",
pp: 10,
priority: 0,
flags: { protect: 1, mirror: 1, defrost: 1 },
onPrepareHit(target, source, move) {
this.attrLastMove("[still]");
this.add("-anim", source, "Scald", target);
this.add("-anim", source, "Acid Armor", target);
},
onBasePower(basePower, pokemon, target) {
if (pokemon.hasType("Ice")) {
return this.chainModify(1.5);
}
},
onHit(target) {
if (target.getTypes().join() === "Water" || !target.setType("Water")) {
this.add("-fail", target);
return null;
}
this.add("-start", target, "typechange", "Water");
},
self: {
onHit(pokemon) {
if (pokemon.hasType("Water")) {
pokemon.setType(pokemon.getTypes(true).map((type) => type === "Ice" ? "???" : type));
this.add("-start", pokemon, "typechange", pokemon.types.join("/"), "[from] move: Melting Point");
} else {
pokemon.setType(pokemon.getTypes(true).map((type) => type === "Ice" ? "Water" : type));
this.add("-start", pokemon, "typechange", pokemon.types.join("/"), "[from] move: Melting Point");
}
}
},
secondary: null,
target: "normal",
type: "Water",
contestType: "Clever"
},
/*
reconstruct: {
accuracy: true,
basePower: 0,
category: "Status",
shortDesc: "(Bugged) Charges turn 1. Heals 50% and resets lowered stats turn 2.",
name: "Reconstruct",
pp: 10,
priority: 0,
flags: {charge: 1, heal: 1},
heal: [1, 2],
beforeTurnCallback(pokemon) {
pokemon.addVolatile('reconstruct');
},
condition: {
duration: 2,
onStart(pokemon) {
this.add('-start', pokemon, 'move: Reconstruct');
},
onSourceModifyDamage(damage, source, target, move) {
if (move.category === 'Special' || move.category === 'Physical') {
return this.chainModify(0.5);
}
},
onTryMove(attacker, defender, move) {
if (attacker.removeVolatile(move.id)) return;
this.add('-prepare', attacker, move.name);
if (!this.runEvent('ChargeMove', attacker, defender, move)) return;
attacker.addVolatile('twoturnmove', defender);
return null;
},
},
onAfterMove(pokemon) {
pokemon.removeVolatile('reconstruct');
},
self: {
onHit(pokemon) {
const boosts: SparseBoostsTable = {};
let i: BoostName;
for (i in pokemon.boosts) {
if (pokemon.boosts[i] < 0) {
boosts[i] = 0;
}
}
pokemon.setBoost(boosts);
this.add('-clearnegativeboost', pokemon, '[silent]');
this.add('-message', pokemon.name + "'s negative stat changes were removed!");
},
},
secondary: null,
target: "self",
type: "Steel",
},
reconstruct: {
accuracy: true,
basePower: 0,
category: "Status",
shortDesc: "Charges turn 1. Heals 50% and resets lowered stats turn 2.",
name: "Reconstruct",
pp: 10,
priority: 0,
flags: {charge: 1, heal: 1},
heal: [1, 2],
onTryMove(attacker, defender, move) {
if (attacker.removeVolatile(move.id)) {
return;
}
this.add('-prepare', attacker, move.name);
if (!this.runEvent('ChargeMove', attacker, defender, move)) {
return;
}
attacker.addVolatile('twoturnmove', defender);
return null;
},
self: {
onHit(pokemon) {
const boosts: SparseBoostsTable = {};
let i: BoostName;
for (i in pokemon.boosts) {
if (pokemon.boosts[i] < 0) {
boosts[i] = 0;
}
}
pokemon.setBoost(boosts);
this.add('-clearnegativeboost', pokemon, '[silent]');
this.add('-message', pokemon.name + "'s negative stat changes were removed!");
},
},
secondary: null,
target: "self",
type: "Steel",
},
*/
reconstruct: {
accuracy: true,
basePower: 0,
category: "Status",
shortDesc: "Charges turn 1. Heals 50% and resets lowered stats turn 2.",
name: "Reconstruct",
pp: 10,
priority: 5,
flags: { charge: 1, heal: 1 },
volatileStatus: "reconstruct",
onPrepareHit(target, source, move) {
this.attrLastMove("[still]");
this.add("-anim", source, "Recover", target);
},
beforeMoveCallback(pokemon) {
if (pokemon.volatiles["reconstruct"])
return true;
},
condition: {
duration: 2,
onLockMove: "reconstruct",
onStart(pokemon) {
this.effectState.totalDamage = 0;
this.add("-start", pokemon, "move: Reconstruct");
},
onSourceModifyDamage(damage, source, target, move) {
if (move.category === "Special" || move.category === "Physical") {
return this.chainModify(0.5);
}
},
onBeforeMove(pokemon, target, move) {
if (this.effectState.duration === 1) {
this.add("-end", pokemon, "move: Reconstruct");
const moveData = {
id: "reconstruct",
name: "Reconstruct",
accuracy: true,
category: "Status",
priority: 0,
flags: { charge: 1, heal: 1 },
heal: [1, 2],
effectType: "Move",
type: "Steel"
};
this.actions.tryMoveHit(target, pokemon, moveData);
return false;
}
this.add("-activate", pokemon, "move: Reconstruct");
},
onMoveAborted(pokemon) {
pokemon.removeVolatile("reconstruct");
},
onEnd(pokemon) {
this.add("-end", pokemon, "move: Reconstruct", "[silent]");
}
},
self: {
onHit(pokemon) {
const boosts = {};
let i;
for (i in pokemon.boosts) {
if (pokemon.boosts[i] < 0) {
boosts[i] = 0;
}
}
pokemon.setBoost(boosts);
this.add("-clearnegativeboost", pokemon, "[silent]");
this.add("-message", pokemon.name + "'s negative stat changes were removed!");
}
},
secondary: null,
target: "self",
type: "Steel",
contestType: "Tough"
},
focusblast: {
num: 411,
accuracy: 70,
basePower: 120,
category: "Special",
shortDesc: "10% chance to lower the foe's SpD. Never misses if the user moves last.",
name: "Focus Blast",
pp: 5,
priority: 0,
flags: { bullet: 1, protect: 1, mirror: 1 },
onModifyMove(move, source, target) {
if (target && (target.newlySwitched || !this.queue.willMove(target)))
move.accuracy = true;
},
secondary: {
chance: 10,
boosts: {
spd: -1
}
},
target: "normal",
type: "Fighting",
contestType: "Cool"
},
/*
aridabsorption: {
accuracy: true,
basePower: 0,
category: "Status",
shortDesc: "(Placeholder, Currently a Life Dew clone)",
name: "Arid Absorption",
pp: 10,
priority: 0,
flags: {snatch: 1, heal: 1},
onPrepareHit(target, source, move) {
this.attrLastMove('[still]');
this.add('-anim', source, "Shore Up", target);
},
heal: [1, 4],
secondary: null,
target: "self",
type: "Ground",
},
*/
aridabsorption: {
accuracy: true,
basePower: 0,
category: "Status",
shortDesc: "Heals by 33% of its max HP +33% and +1 Atk for every active Water-type.",
name: "Arid Absorption",
pp: 10,
priority: 0,
flags: { snatch: 1, heal: 1 },
onPrepareHit(target, source, move) {
this.attrLastMove("[still]");
this.add("-anim", source, "Shore Up", target);
},
self: {
onHit(pokemon, source, move) {
this.heal(source.baseMaxhp / 3, source, pokemon);
}
},
onHitField(target, source) {
if (target.hasType("Water")) {
this.heal(source.baseMaxhp / 3, source, target);
this.boost({ atk: 1 }, source);
}
if (source.hasType("Water")) {
this.heal(source.baseMaxhp / 3, source, target);
this.boost({ atk: 1 }, source);
this.damage(source.baseMaxhp / 3, source, target);
}
},
secondary: null,
target: "all",
type: "Ground"
},
rototiller: {
num: 563,
accuracy: true,
basePower: 0,
category: "Status",
shortDesc: "Raises Atk/Def of grounded Grass types by 1, sets Grassy Terrain.",
name: "Rototiller",
pp: 10,
priority: 0,
flags: { distance: 1, nonsky: 1 },
onHitField(target, source) {
this.field.setTerrain("grassyterrain");
const targets = [];
let anyAirborne = false;
for (const pokemon of this.getAllActive()) {
if (!pokemon.runImmunity("Ground")) {
this.add("-immune", pokemon);
anyAirborne = true;
continue;
}
if (pokemon.hasType("Grass")) {
targets.push(pokemon);
}
}
if (!targets.length && !anyAirborne)
return false;
for (const pokemon of targets) {
this.boost({ atk: 1, def: 1 }, pokemon, source);
}
},
secondary: null,
target: "all",
type: "Ground",
zMove: { boost: { atk: 1 } },
contestType: "Tough"
},
armthrust: {
num: 292,
accuracy: 100,
basePower: 25,
category: "Physical",
name: "Arm Thrust",
pp: 20,
priority: 0,
flags: { contact: 1, protect: 1, mirror: 1, punch: 1 },
multihit: [2, 5],
secondary: null,
target: "normal",
type: "Fighting",
contestType: "Tough"
},
counterspell: {
accuracy: 100,
basePower: 110,
category: "Special",
shortDesc: "Uses target's SpA stat in damage calculation. -1 priority.",
name: "Counterspell",
pp: 15,
priority: -1,
flags: { protect: 1, mirror: 1 },
onPrepareHit(target, source, move) {
this.attrLastMove("[still]");
this.add("-anim", source, "Psybeam", target);
},
overrideOffensivePokemon: "target",
secondary: null,
target: "normal",
type: "Fairy",
contestType: "Clever"
},
lightninglance: {
accuracy: 100,
basePower: 110,
category: "Physical",
shortDesc: "Lowers the user's Attack and Sp. Def by 1.",
name: "Lightning Lance",
pp: 10,
priority: 0,
flags: { contact: 1, protect: 1, mirror: 1, defrost: 1 },
onPrepareHit(target, source, move) {
this.attrLastMove("[still]");
this.add("-anim", source, "Charge", target);
this.add("-anim", source, "Sacred Sword", target);
},
self: {
boosts: {
atk: -1,
spd: -1
}
},
secondary: null,
target: "normal",
type: "Electric",
contestType: "Cool"
},
lifedew: {
num: 791,
accuracy: true,
basePower: 0,
category: "Status",
shortDesc: "Heals the user by 50% of its max HP; 66% in Rain.",
name: "Life Dew",
pp: 10,
priority: 0,
flags: { snatch: 1, heal: 1, bypasssub: 1 },
onHit(pokemon) {
let factor = 0.5;
if (this.field.isWeather("raindance")) {
factor = 0.667;
}
return !!this.heal(this.modify(pokemon.maxhp, factor));
},
secondary: null,
target: "allies",
type: "Water"
},
trashtalk: {
accuracy: 100,
basePower: 85,
category: "Special",
shortDesc: "Prevents the target from using status moves for 1 turn.",
name: "Trash Talk",
pp: 15,
priority: 0,
flags: { protect: 1, mirror: 1, sound: 1, bypasssub: 1 },
onPrepareHit(target, source, move) {
this.attrLastMove("[still]");
this.add("-anim", source, "Confide", target);
this.add("-anim", source, "Gunk Shot", target);
},
volatileStatus: "trashtalk",
condition: {
duration: 1,
onStart(target) {
this.add("-singleturn", target, "move: Trash Talk");
},
onResidualOrder: 12,
onEnd(target) {
this.add("-end", target, "move: Trash Talk");
},
onBeforeMovePriority: 5,
onBeforeMove(attacker, defender, move) {
if (!move.isZ && !move.isMax && move.category === "Status" && move.id !== "mefirst") {
this.add("cant", attacker, "move: Trash Talk", move);
return false;
}
}
},
secondary: null,
target: "normal",
type: "Poison",
contestType: "Cool"
},
deafeningshriek: {
accuracy: 100,
basePower: 100,
category: "Special",
shortDesc: "Target becomes immune to sound moves after being hit.",
name: "Deafening Shriek",
pp: 5,
priority: 0,
flags: { protect: 1, mirror: 1, sound: 1, bypasssub: 1 },
onPrepareHit(target, source, move) {
this.attrLastMove("[still]");
this.add("-anim", source, "Hyper Voice", target);
this.add("-anim", source, "Boomburst", target);
},
volatileStatus: "deafeningshriek",
condition: {
onStart(target) {
this.add("-start", target, "move: Deafening Shriek");
},
onTryHitPriority: 3,
onTryHit(target, source, move) {
if (move.target !== "self" && move.flags["sound"]) {
this.add("-immune", target, "[from] move: Deafening Shriek");
return null;
}
}
},
target: "normal",
type: "Ghost",
contestType: "Cool"
},
enchantedpunch: {
accuracy: 100,
basePower: 80,
category: "Physical",
overrideDefensiveStat: "spd",
shortDesc: "Damages target based on Sp. Def, not Defense.",
name: "Enchanted Punch",
pp: 10,
priority: 0,
flags: { protect: 1, mirror: 1, contact: 1, punch: 1 },
onPrepareHit(target, source, move) {
this.attrLastMove("[still]");
this.add("-anim", source, "Meteor Mash", target);
},
secondary: null,
target: "normal",
type: "Fairy",
contestType: "Beautiful"
},
electroball: {
num: 486,
accuracy: 100,
basePower: 80,
category: "Special",
name: "Electro Ball",
pp: 10,
priority: 0,
flags: { bullet: 1, protect: 1, mirror: 1 },
overrideOffensiveStat: "spe",
secondary: null,
target: "normal",
type: "Electric",
contestType: "Clever",
shortDesc: "Uses user's Spe stat as SpA in damage calculation."
},
firepunch: {
num: 7,
accuracy: 100,
basePower: 85,
category: "Physical",
name: "Fire Punch",
pp: 15,
priority: 0,
flags: { contact: 1, protect: 1, mirror: 1, punch: 1 },
secondary: {
chance: 10,
status: "brn"
},
target: "normal",
type: "Fire",
contestType: "Tough"
},
icepunch: {
num: 8,
accuracy: 100,
basePower: 85,
category: "Physical",
name: "Ice Punch",
pp: 15,
priority: 0,
flags: { contact: 1, protect: 1, mirror: 1, punch: 1 },
secondary: {
chance: 10,
status: "frz"
},
target: "normal",
type: "Ice",
contestType: "Beautiful"
},
thunderpunch: {
num: 9,
accuracy: 100,
basePower: 85,
category: "Physical",
name: "Thunder Punch",
pp: 15,
priority: 0,
flags: { contact: 1, protect: 1, mirror: 1, punch: 1 },
secondary: {
chance: 10,
status: "par"
},
target: "normal",
type: "Electric",
contestType: "Cool"
},
skyuppercut: {
num: 327,
accuracy: 100,
basePower: 70,
category: "Physical",
shortDesc: "Hits Flying-types super effectively. Can hit Pokemon using Bounce, Fly, or Sky Drop.",
name: "Sky Uppercut",
pp: 15,
priority: 0,
flags: { contact: 1, protect: 1, mirror: 1, punch: 1 },
onEffectiveness(typeMod, target, type) {
if (type === "Flying")
return 1;
},
secondary: null,
target: "normal",
type: "Fighting",
contestType: "Cool"
},
crushclaw: {
inherit: true,
accuracy: 100,
basePower: 20,
shortDesc: "Hits twice. Lowers the target's Def after each hit.",
pp: 20,
multihit: 2,
secondary: {
chance: 100,
boosts: {
def: -1
}
},
type: "Dark",
maxMove: { basePower: 100 }
},
poisondart: {
accuracy: true,
basePower: 40,
category: "Physical",
shortDesc: "Usually goes first. 10% chance to poison foe.",
name: "Poison Dart",
pp: 30,
priority: 1,
flags: { protect: 1, mirror: 1 },
onPrepareHit(target, source, move) {
this.attrLastMove("[still]");
this.add("-anim", source, "Poison Sting", target);
},
secondary: {
chance: 10,
status: "psn"
},
target: "normal",
type: "Poison",
contestType: "Cool"
},
acidicfists: {
accuracy: 100,
basePower: 90,
category: "Physical",
shortDesc: "Destroys screens, unless the target is immune. 10% poison chance.",
name: "Acidic Fists",
pp: 10,
priority: 0,
flags: { punch: 1, contact: 1, protect: 1, mirror: 1 },
onPrepareHit(target, source, move) {
this.attrLastMove("[still]");
this.add("-anim", source, "Poison Jab", target);
this.add("-anim", source, "Corrosive Gas", target);
},
onTryHit(pokemon) {
if (pokemon.runImmunity("Poison")) {
pokemon.side.removeSideCondition("reflect");
pokemon.side.removeSideCondition("lightscreen");
pokemon.side.removeSideCondition("auroraveil");
}
},
secondary: {
chance: 10,
status: "psn"
},
target: "normal",
type: "Poison",
contestType: "Cool"
},
mudspike: {
num: 398,
accuracy: 100,
basePower: 85,
category: "Physical",
shortDesc: "10% poison chance, 30% if the user is a Poison-type",
name: "Mud Spike",
pp: 10,
priority: 0,
flags: { protect: 1, mirror: 1 },
onPrepareHit(target, source, move) {
this.attrLastMove("[still]");
this.add("-anim", source, "Muddy Water", target);
this.add("-anim", source, "Corrosive Gas", target);
},
onModifyMove(move, pokemon) {
if (!pokemon.hasType("Poison"))
return;
if (!move.secondaries)
move.secondaries = [];
move.secondaries = move.secondaries.filter((s) => s.chance !== 10 && s.status !== "psn");
move.secondaries.push({
chance: 30,
status: "psn"
});
},
secondary: {
chance: 10,
status: "psn"
},
target: "normal",
type: "Ground",
contestType: "Tough"
},
bonemerang: {
num: 155,
accuracy: 100,
basePower: 50,
category: "Physical",
shortDesc: "(Bugged) First hit has +1 priority, second hit has -1 priority.",
name: "Bonemerang",
pp: 10,
priority: 1,
flags: { protect: 1, mirror: 1 },
onModifyMove(move) {
if (move.hit !== 1)
move.priority = -1;
},
secondary: null,
target: "normal",
type: "Ground",
maxMove: { basePower: 130 },
contestType: "Tough"
},
rashpowder: {
accuracy: 75,
basePower: 0,
category: "Status",
shortDesc: "Burns the target.",
name: "Rash Powder",
pp: 30,
priority: 0,
flags: { powder: 1, protect: 1, reflectable: 1, mirror: 1 },
onPrepareHit(target, source, move) {
this.attrLastMove("[still]");
this.add("-anim", source, "Spore", target);
},
status: "brn",
secondary: null,
target: "normal",
type: "Grass",
zMove: { boost: { def: 1 } },
contestType: "Clever"
},
payback: {
num: 371,
accuracy: 100,
basePower: 50,
basePowerCallback(pokemon, target, move) {
if (this.queue.willMove(target)) {
this.debug("Payback NOT boosted");
return move.basePower;
}
this.debug("Payback damage boost");
return move.basePower * 2;
},
category: "Physical",
shortDesc: "Power doubles if the user moves last or the foe switches.",
name: "Payback",
pp: 10,
priority: 0,
flags: { contact: 1, protect: 1, mirror: 1 },
secondary: null,
target: "normal",
type: "Dark",
contestType: "Tough"
},
revenge: {
num: 279,
accuracy: 100,
basePower: 50,
basePowerCallback(pokemon, target, move) {
if (this.queue.willMove(target)) {
this.debug("Revenge NOT boosted");
return move.basePower;
}
this.debug("Revenge damage boost");
return move.basePower * 2;
},
category: "Physical",
shortDesc: "Power doubles if the user moves last or the foe switches.",
name: "Revenge",
pp: 10,
priority: 0,
flags: { contact: 1, protect: 1, mirror: 1 },
secondary: null,
target: "normal",
type: "Fighting",
contestType: "Tough"
},
avalanche: {
num: 419,
accuracy: 100,
basePower: 50,
basePowerCallback(pokemon, target, move) {
if (this.queue.willMove(target)) {
this.debug("Avalanche NOT boosted");
return move.basePower;
}
this.debug("Avalanche damage boost");
return move.basePower * 2;
},
category: "Physical",
shortDesc: "Power doubles if the user moves last or the foe switches.",
name: "Avalanche",
pp: 10,
priority: 0,
flags: { contact: 1, protect: 1, mirror: 1 },
secondary: null,
target: "normal",
type: "Ice",
contestType: "Beautiful"
},
technoblast: {
num: 546,
accuracy: 100,
basePower: 90,
onBasePower(basePower, source) {
if (source.hasItem(["burndrive", "dousedrive", "chilldrive", "shockdrive"])) {
return this.chainModify(1.2);
}
},
category: "Special",
shortDesc: "Type varies based on the held Drive. 1.2x power when holding a Drive.",
name: "Techno Blast",
pp: 10,
priority: 0,
flags: { protect: 1, mirror: 1, pulse: 1, bullet: 1 },
onModifyType(move, pokemon) {
if (pokemon.ignoringItem())
return;
move.type = this.runEvent("Drive", pokemon, null, move, "Normal");
},
secondary: null,
target: "normal",
type: "Normal",
contestType: "Cool"
},
aggravate: {
accuracy: 100,
basePower: 85,
category: "Physical",
shortDesc: "If the target is statused, applies Taunt.",
name: "Aggravate",
pp: 10,
priority: 0,
flags: { contact: 1, protect: 1, mirror: 1 },
onPrepareHit(target, source, move) {
this.attrLastMove("[still]");
this.add("-anim", source, "Power Trip", target);
},
secondary: {
chance: 100,
onHit(target, source, move) {
if (target.status) {
return !!target.addVolatile("taunt");
}
return false;
}
},
target: "normal",
type: "Dark",
contestType: "Clever"
},
curse: {
num: 174,
accuracy: true,
basePower: 0,
category: "Status",
shortDesc: "Curses if Ghost, else -1 Spe, +2 Atk, +1 Def.",
name: "Curse",
pp: 10,
priority: 0,
flags: {},
volatileStatus: "curse",
onModifyMove(move, source, target) {
if (!source.hasType("Ghost")) {
move.target = move.nonGhostTarget;
}
},
onTryHit(target, source, move) {
if (!source.hasType("Ghost")) {
delete move.volatileStatus;
move.self = { boosts: { spe: -1, atk: 2, def: 1 } };
} else if (move.volatileStatus && target.volatiles["curse"] || target.hasType(["Normal", "Ghost"]) || target.volatiles["protect"] || target.volatiles["spikyshield"] || target.volatiles["banefulbunker"]) {
return false;
}
},
condition: {
onStart(target) {
this.add("-start", target, "move: Curse");
},
onResidualOrder: 8,
onResidual(pokemon) {
const target = this.effectState.source.side.active[pokemon.volatiles["curse"].sourcePosition];
if (!target || target.fainted || target.hp <= 0) {
this.debug("Nothing to curse");
return;
}
const damage = this.damage(pokemon.baseMaxhp / 8, pokemon, target);
if (damage) {
this.heal(damage, target, pokemon);
}
}
},
onTryImmunity(target) {
return !target.hasType("Normal") || !target.hasType("Ghost");
},
secondary: null,
target: "randomNormal",
nonGhostTarget: "self",
type: "Ghost",
zMove: { effect: "curse" },
contestType: "Tough"
},
octazooka: {
num: 190,
accuracy: 100,
basePower: 75,
category: "Special",
shortDesc: "100% chance to lower the target's Evasion by 1.",
name: "Octazooka",
pp: 10,
priority: 0,
flags: { protect: 1, mirror: 1, pulse: 1, bullet: 1 },
secondary: {
chance: 100,
boosts: {
evasion: -1
}
},
target: "normal",
type: "Water",
contestType: "Tough"
},
signalbeam: {
num: 324,
accuracy: 100,
basePower: 75,
category: "Special",
shortDesc: "100% chance to lower the target's Speed by 1.",
name: "Signal Beam",
pp: 10,
priority: 0,
flags: { protect: 1, mirror: 1 },
secondary: {
chance: 100,
boosts: {
spe: -1
}
},
target: "normal",
type: "Bug",
contestType: "Tough"
},
aurorabeam: {
num: 62,
accuracy: 100,
basePower: 75,
category: "Special",
shortDesc: "100% chance to lower the target's Attack by 1.",
name: "Aurora Beam",
pp: 10,
priority: 0,
flags: { protect: 1, mirror: 1 },
secondary: {
chance: 100,
boosts: {
atk: -1
}
},
target: "normal",
type: "Ice",
contestType: "Tough"
},
venoshock: {
num: 474,
accuracy: 100,
basePower: 65,
basePowerCallback(pokemon, target, move) {
if (target.status || target.hasAbility("comatose"))
return move.basePower * 2;
return move.basePower;
},
category: "Special",
shortDesc: "Power doubles if the target has a status ailment.",
name: "Venoshock",
pp: 10,
priority: 0,
flags: { protect: 1, mirror: 1 },
secondary: null,
target: "normal",
type: "Poison",
contestType: "Beautiful"
},
attackorder: {
num: 454,
accuracy: 100,
basePower: 75,
basePowerCallback(pokemon, target, move) {
if (target.status || target.hasAbility("comatose"))
return move.basePower * 2;
return move.basePower;
},
category: "Physical",
shortDesc: "Power doubles if the target has a status ailment.",
name: "Attack Order",
pp: 15,
priority: 0,
flags: { protect: 1, mirror: 1 },
secondary: null,
target: "normal",
type: "Flying",
contestType: "Clever"
},
smother: {
accuracy: 100,
basePower: 65,
basePowerCallback(pokemon, target, move) {
if (target.newlySwitched || this.queue.willMove(target)) {
this.debug("Smother damage boost");
return move.basePower * 1.5;
}
this.debug("Smother NOT boosted");
return move.basePower;
},
category: "Physical",
shortDesc: "The target must move last next turn. 1.5x if the user moves first.",
name: "Smother",
pp: 10,
priority: 0,
flags: { contact: 1, protect: 1, mirror: 1 },
onPrepareHit(target, source, move) {
this.attrLastMove("[still]");
this.add("-anim", source, "Wrap", target);
},
onHit(target, source) {
target.addVolatile("smother", source);
},
condition: {
duration: 2,
onStart(target) {
this.add("-start", target, "Smother", "[silent]");
},
onFractionalPriority: -0.1,
onResidualOrder: 22,
onEnd(target) {
this.add("-end", target, "Smother", "[silent]");
}
},
secondary: null,
target: "normal",
type: "Fairy",
contestType: "Clever"
},
fierydance: {
num: 552,
accuracy: 100,
basePower: 85,
category: "Special",
name: "Fiery Dance",
pp: 10,
priority: 0,
flags: { protect: 1, mirror: 1, dance: 1 },
secondary: {
chance: 50,
self: {
boosts: {
spa: 1
}
}
},
target: "normal",
type: "Fire",
contestType: "Beautiful"
},
snowmanjazz: {
accuracy: 100,
basePower: 85,
category: "Special",
shortDesc: "50% chance to raise the user's Sp. Atk by 1.",
name: "Snowman Jazz",
pp: 10,
priority: 0,
flags: { protect: 1, mirror: 1, dance: 1 },
onPrepareHit(target, source, move) {
this.attrLastMove("[still]");
this.add("-anim", source, "Quiver Dance", target);
this.add("-anim", source, "Ice Beam", target);
},
secondary: {
chance: 50,
self: {
boosts: {
spa: 1
}
}
},
target: "normal",
type: "Ice",
contestType: "Beautiful"
},
moonlitwaltz: {
accuracy: 100,
basePower: 85,
category: "Special",
shortDesc: "50% chance to raise the user's Sp. Atk by 1.",
name: "Moonlit Waltz",
pp: 10,
priority: 0,
flags: { protect: 1, mirror: 1, dance: 1 },
onPrepareHit(target, source, move) {
this.attrLastMove("[still]");
this.add("-anim", source, "Quiver Dance", target);
this.add("-anim", source, "Dark Pulse", target);
},
secondary: {
chance: 50,
self: {
boosts: {
spa: 1
}
}
},
target: "normal",
type: "Dark",
contestType: "Beautiful"
},
petaldance: {
num: 80,
accuracy: 100,
basePower: 85,
category: "Special",
shortDesc: "50% chance to raise the user's Sp. Atk by 1.",
name: "Petal Dance",
pp: 10,
priority: 0,
flags: { protect: 1, mirror: 1, dance: 1 },
secondary: {
chance: 50,
self: {
boosts: {
spa: 1
}
}
},
target: "normal",
type: "Grass",
contestType: "Beautiful"
},
skysoiree: {
accuracy: 100,
basePower: 85,
category: "Special",
shortDesc: "50% chance to raise the user's Sp. Atk by 1.",
name: "Sky Soiree",
pp: 10,
priority: 0,
flags: { protect: 1, mirror: 1, dance: 1 },
onPrepareHit(target, source, move) {
this.attrLastMove("[still]");
this.add("-anim", source, "Quiver Dance", target);
this.add("-anim", source, "Gust", target);
},
secondary: {
chance: 50,
self: {
boosts: {
spa: 1
}
}
},
target: "normal",
type: "Flying",
contestType: "Beautiful"
},
shadowpunch: {
num: 325,
accuracy: true,
basePower: 80,
category: "Physical",
shortDesc: "Ignores burn, screens, and Substitute.",
name: "Shadow Punch",
pp: 20,
priority: 0,
flags: { protect: 1, mirror: 1, punch: 1 },
onBasePower(basePower, pokemon) {
if (pokemon.status === "brn") {
return this.chainModify(2);
}
},
infiltrates: true,
secondary: null,
target: "normal",
type: "Ghost",
contestType: "Clever"
},
bouncybubble: {
inherit: true,
isNonstandard: null,
onPrepareHit(target, source, move) {
this.attrLastMove("[still]");
this.add("-anim", source, "Bubble", target);
}
},
buzzybuzz: {
inherit: true,
isNonstandard: null,
onPrepareHit(target, source, move) {
this.attrLastMove("[still]");
this.add("-anim", source, "Discharge", target);
}
},
sizzlyslide: {
inherit: true,
isNonstandard: null,
onPrepareHit(target, source, move) {
this.attrLastMove("[still]");
this.add("-anim", source, "Flame Charge", target);
}
},
glitzyglow: {
inherit: true,
isNonstandard: null,
onPrepareHit(target, source, move) {
this.attrLastMove("[still]");
this.add("-anim", source, "Psychic", target);
}
},
baddybad: {
inherit: true,
isNonstandard: null,
onPrepareHit(target, source, move) {
this.attrLastMove("[still]");
this.add("-anim", source, "Photon Geyser", target);
}
},
freezyfrost: {
inherit: true,
isNonstandard: null,
onPrepareHit(target, source, move) {
this.attrLastMove("[still]");
this.add("-anim", source, "Blizzard", target);
}
},
sappyseed: {
inherit: true,
isNonstandard: null,
onPrepareHit(target, source, move) {
this.attrLastMove("[still]");
this.add("-anim", source, "Horn Leech", target);
}
},
sparklyswirl: {
inherit: true,
isNonstandard: null,
onPrepareHit(target, source, move) {
this.attrLastMove("[still]");
this.add("-anim", source, "Dazzling Gleam", target);
}
},
// stuff that needs to be edited because of other stuff
fling: {
num: 374,
accuracy: 100,
basePower: 0,
category: "Physical",
name: "Fling",
pp: 10,
priority: 0,
flags: { protect: 1, mirror: 1, allyanim: 1 },
onPrepareHit(target, source, move) {
if (source.ignoringItem())
return false;
const item = source.getItem();
if (!this.singleEvent("TakeItem", item, source.itemState, source, source, move, item))
return false;
if (!item.fling)
return false;
move.basePower = item.fling.basePower;
if (item.isBerry) {
move.onHit = function(foe) {
if (this.singleEvent("Eat", item, null, foe, null, null)) {
this.runEvent("EatItem", foe, null, null, item);
if (item.id === "leppaberry")
foe.staleness = "external";
}
if (item.onEat)
foe.ateBerry = true;
};
} else if (item.fling.effect) {
move.onHit = item.fling.effect;
} else {
if (!move.secondaries)
move.secondaries = [];
if (item.fling.status) {
move.secondaries.push({ status: item.fling.status });
} else if (item.fling.volatileStatus) {
move.secondaries.push({ volatileStatus: item.fling.volatileStatus });
}
}
source.addVolatile("fling");
if (item.id === "boomerang") {
source.removeVolatile("fling");
}
},
condition: {
onUpdate(pokemon) {
const item = pokemon.getItem();
pokemon.setItem("");
pokemon.lastItem = item.id;
pokemon.usedItemThisTurn = true;
this.add("-enditem", pokemon, item.name, "[from] move: Fling");
this.runEvent("AfterUseItem", pokemon, null, null, item);
pokemon.removeVolatile("fling");
}
},
secondary: null,
target: "normal",
type: "Dark",
contestType: "Cute"
},
knockoff: {
num: 282,
accuracy: 100,
basePower: 65,
category: "Physical",
name: "Knock Off",
pp: 20,
priority: 0,
flags: { contact: 1, protect: 1, mirror: 1 },
onBasePower(basePower, source, target, move) {
const item = target.getItem();
if (!this.singleEvent("TakeItem", item, target.itemState, target, target, move, item))
return;
if (item.id && item.id !== "boomerang") {
return this.chainModify(1.5);
}
},
onAfterHit(target, source) {
if (source.hp) {
const item = target.takeItem();
if (item) {
this.add("-enditem", target, item.name, "[from] move: Knock Off", "[of] " + source);
if (item.id === "boomerang") {
this.add("-item", target, this.dex.items.get(item), "[from] item: Boomerang");
target.setItem(item);
}
}
}
},
secondary: null,
target: "normal",
type: "Dark",
contestType: "Clever"
},
stealthrock: {
inherit: true,
condition: {
// this is a side condition
onStart(side) {
this.add("-sidestart", side, "move: Stealth Rock");
},
onSwitchIn(pokemon) {
if (pokemon.hasItem("heavydutyboots") || pokemon.hasItem("coalengine"))
return;
const typeMod = this.clampIntRange(pokemon.runEffectiveness(this.dex.getActiveMove("stealthrock")), -6, 6);
this.damage(pokemon.maxhp * Math.pow(2, typeMod) / 8);
}
}
},
gravity: {
num: 356,
accuracy: true,
basePower: 0,
category: "Status",
name: "Gravity",
pp: 5,
priority: 0,
flags: { nonsky: 1 },
pseudoWeather: "gravity",
condition: {
duration: 5,
durationCallback(source, effect) {
if (source?.hasAbility("persistent")) {
this.add("-activate", source, "ability: Persistent", effect);
return 7;
} else if (source && source.hasItem("ironball")) {
return 8;
}
return 5;
},
onStart() {
this.add("-fieldstart", "move: Gravity");
for (const pokemon of this.getAllActive()) {
let applies = false;
if (pokemon.removeVolatile("bounce") || pokemon.removeVolatile("fly")) {
applies = true;
this.queue.cancelMove(pokemon);
pokemon.removeVolatile("twoturnmove");
}
if (pokemon.volatiles["skydrop"]) {
applies = true;
this.queue.cancelMove(pokemon);
if (pokemon.volatiles["skydrop"].source) {
this.add("-end", pokemon.volatiles["twoturnmove"].source, "Sky Drop", "[interrupt]");
}
pokemon.removeVolatile("skydrop");
pokemon.removeVolatile("twoturnmove");
}
if (pokemon.volatiles["magnetrise"]) {
applies = true;
delete pokemon.volatiles["magnetrise"];
}
if (pokemon.volatiles["telekinesis"]) {
applies = true;
delete pokemon.volatiles["telekinesis"];
}
if (applies)
this.add("-activate", pokemon, "move: Gravity");
}
},
onModifyAccuracy(accuracy) {
if (typeof accuracy !== "number")
return;
return accuracy * 5 / 3;
},
onDisableMove(pokemon) {
for (const moveSlot of pokemon.moveSlots) {
if (this.dex.moves.get(moveSlot.id).flags["gravity"]) {
pokemon.disableMove(moveSlot.id);
}
}
},
// groundedness implemented in battle.engine.js:BattlePokemon#isGrounded
onBeforeMovePriority: 6,
onBeforeMove(pokemon, target, move) {
if (move.flags["gravity"]) {
this.add("cant", pokemon, "move: Gravity", move);
return false;
}
},
onResidualOrder: 22,
onEnd() {
this.add("-fieldend", "move: Gravity");
}
},
secondary: null,
target: "all",
type: "Psychic",
zMove: { boost: { spa: 1 } },
contestType: "Clever"
},
rapidspin: {
num: 229,
accuracy: 100,
basePower: 50,
category: "Physical",
name: "Rapid Spin",
pp: 40,
priority: 0,
flags: { contact: 1, protect: 1, mirror: 1 },
onAfterHit(target, pokemon) {
if (pokemon.hp && pokemon.removeVolatile("leechseed")) {
this.add("-end", pokemon, "Leech Seed", "[from] move: Rapid Spin", "[of] " + pokemon);
}
if (pokemon.hp && pokemon.removeVolatile("curse")) {
this.add("-end", pokemon, "Curse", "[from] move: Rapid Spin", "[of] " + pokemon);
}
const sideConditions = ["spikes", "toxicspikes", "stealthrock", "stickyweb", "gmaxsteelsurge"];
for (const condition of sideConditions) {
if (pokemon.hp && pokemon.side.removeSideCondition(condition)) {
this.add("-sideend", pokemon.side, this.dex.conditions.get(condition).name, "[from] move: Rapid Spin", "[of] " + pokemon);
}
}
if (pokemon.hp && pokemon.volatiles["partiallytrapped"]) {
pokemon.removeVolatile("partiallytrapped");
}
},
onAfterSubDamage(damage, target, pokemon) {
if (pokemon.hp && pokemon.removeVolatile("leechseed")) {
this.add("-end", pokemon, "Leech Seed", "[from] move: Rapid Spin", "[of] " + pokemon);
}
if (pokemon.hp && pokemon.removeVolatile("curse")) {
this.add("-end", pokemon, "Curse", "[from] move: Rapid Spin", "[of] " + pokemon);
}
const sideConditions = ["spikes", "toxicspikes", "stealthrock", "stickyweb", "gmaxsteelsurge"];
for (const condition of sideConditions) {
if (pokemon.hp && pokemon.side.removeSideCondition(condition)) {
this.add("-sideend", pokemon.side, this.dex.conditions.get(condition).name, "[from] move: Rapid Spin", "[of] " + pokemon);
}
}
if (pokemon.hp && pokemon.volatiles["partiallytrapped"]) {
pokemon.removeVolatile("partiallytrapped");
}
},
secondary: {
chance: 100,
self: {
boosts: {
spe: 1
}
}
},
target: "normal",
type: "Normal",
contestType: "Cool"
}
};
//# sourceMappingURL=moves.js.map