Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* CAP Enabled/Modified Moves */
- appleacid: {
- inherit: true,
- isNonstandard: "CAP",
- },
- bodypress: {
- inherit: true,
- isNonstandard: "CAP",
- },
- behemothbash: {
- inherit: true,
- isNonstandard: "CAP",
- },
- behemothblade: {
- inherit: true,
- isNonstandard: "CAP",
- },
- boltbeak: {
- inherit: true,
- isNonstandard: "CAP",
- noSketch: true,
- },
- branchpoke: {
- inherit: true,
- isNonstandard: "CAP",
- },
- breakingswipe: {
- inherit: true,
- isNonstandard: "CAP",
- },
- burningjealousy: {
- inherit: true,
- isNonstandard: "CAP",
- },
- clangoroussoul: {
- inherit: true,
- isNonstandard: "CAP",
- },
- coaching: {
- inherit: true,
- isNonstandard: "CAP",
- },
- corrosivegas: {
- inherit: true,
- isNonstandard: "CAP",
- },
- decorate: {
- inherit: true,
- isNonstandard: "CAP",
- },
- dragondarts: {
- inherit: true,
- isNonstandard: "CAP",
- },
- dragonenergy: {
- inherit: true,
- isNonstandard: "CAP",
- noSketch: true,
- },
- drumbeating: {
- inherit: true,
- isNonstandard: "CAP",
- },
- dualwingbeat: {
- inherit: true,
- isNonstandard: "CAP",
- },
- dynamaxcannon: {
- inherit: true,
- isNonstandard: "CAP",
- },
- eeriespell: {
- inherit: true,
- isNonstandard: "CAP",
- },
- eternabeam: {
- inherit: true,
- isNonstandard: "CAP",
- },
- expandingforce: {
- inherit: true,
- isNonstandard: "CAP",
- },
- falsesurrender: {
- inherit: true,
- isNonstandard: "CAP",
- },
- fierywrath: {
- inherit: true,
- isNonstandard: "CAP",
- },
- fishiousrend: {
- inherit: true,
- isNonstandard: "CAP",
- noSketch: true,
- },
- floatyfall: {
- inherit: true,
- isNonstandard: "CAP",
- noSketch: true,
- },
- flipturn: {
- inherit: true,
- isNonstandard: "CAP",
- },
- freezingglare: {
- inherit: true,
- isNonstandard: "CAP",
- },
- glaciallance: {
- inherit: true,
- isNonstandard: "CAP",
- },
- grassyglide: {
- inherit: true,
- isNonstandard: "CAP",
- },
- gravapple: {
- inherit: true,
- isNonstandard: "CAP",
- },
- jawlock: {
- inherit: true,
- isNonstandard: "CAP",
- },
- judgment: {
- inherit: true,
- isNonstandard: "CAP",
- },
- junglehealing: {
- inherit: true,
- isNonstandard: "CAP",
- },
- lashout: {
- inherit: true,
- isNonstandard: "CAP",
- },
- lifedew: {
- inherit: true,
- isNonstandard: "CAP",
- },
- magicpowder: {
- inherit: true,
- isNonstandard: "CAP",
- },
- meteorassault: {
- inherit: true,
- isNonstandard: "CAP",
- },
- meteorbeam: {
- inherit: true,
- isNonstandard: "CAP",
- },
- mistyexplosion: {
- inherit: true,
- isNonstandard: "CAP",
- },
- multiattack: {
- inherit: true,
- isNonstandard: "CAP",
- },
- noretreat: {
- inherit: true,
- isNonstandard: "CAP",
- },
- obstruct: {
- inherit: true,
- isNonstandard: "CAP",
- },
- octolock: {
- inherit: true,
- isNonstandard: "CAP",
- },
- overdrive: {
- inherit: true,
- isNonstandard: "CAP",
- },
- pikapapow: {
- inherit: true,
- isNonstandard: "CAP",
- noSketch: true,
- },
- poltergeist: {
- inherit: true,
- isNonstandard: "CAP",
- },
- pyroball: {
- inherit: true,
- isNonstandard: "CAP",
- },
- risingvoltage: {
- inherit: true,
- isNonstandard: "CAP",
- },
- scaleshot: {
- inherit: true,
- isNonstandard: "CAP",
- },
- scorchingsands: {
- inherit: true,
- isNonstandard: "CAP",
- },
- shellsidearm: {
- inherit: true,
- isNonstandard: "CAP",
- },
- skittersmack: {
- inherit: true,
- isNonstandard: "CAP",
- },
- snaptrap: {
- inherit: true,
- isNonstandard: "CAP",
- },
- snipeshot: {
- inherit: true,
- isNonstandard: "CAP",
- },
- spiritbreak: {
- inherit: true,
- isNonstandard: "CAP",
- },
- splishysplash: {
- inherit: true,
- isNonstandard: "CAP",
- noSketch: true,
- },
- steelbeam: {
- inherit: true,
- isNonstandard: "CAP",
- },
- steelroller: {
- inherit: true,
- isNonstandard: "CAP",
- },
- strangesteam: {
- inherit: true,
- isNonstandard: "CAP",
- },
- stuffcheeks: {
- inherit: true,
- isNonstandard: "CAP",
- },
- surgingstrikes: {
- inherit: true,
- isNonstandard: "CAP",
- noSketch: true,
- },
- tarshot: {
- inherit: true,
- isNonstandard: "CAP",
- },
- teatime: {
- inherit: true,
- isNonstandard: "CAP",
- },
- terrainpulse: {
- inherit: true,
- isNonstandard: "CAP",
- },
- thundercage: {
- inherit: true,
- isNonstandard: "CAP",
- },
- thunderouskick: {
- inherit: true,
- isNonstandard: "CAP",
- flags: {contact: 1, protect: 1, mirror: 1, kick: 1},
- },
- tripleaxel: {
- inherit: true,
- isNonstandard: "CAP",
- flags: {contact: 1, protect: 1, mirror: 1, kick: 1},
- },
- wickedblow: {
- inherit: true,
- isNonstandard: "CAP",
- noSketch: true,
- },
- zippyzap: {
- inherit: true,
- basePower: 50,
- pp: 15,
- willCrit: true,
- secondary: null,
- noSketch: true,
- isNonstandard: "CAP",
- },
- /* Clover CAP Moves */
- crusadercrash: {
- num: 42001,
- accuracy: 100,
- basePower: 85,
- category: "Physical",
- name: "Crusader Crash",
- pp: 5,
- priority: 0,
- flags: {contact: 1, protect: 1, punch: 1, mirror: 1},
- willCrit: true,
- secondary: null,
- target: "normal",
- type: "Fighting",
- isNonstandard: "CAP",
- },
- moregun: {
- num: 42002,
- accuracy: 100,
- basePower: 16,
- category: "Special",
- name: "More Gun",
- pp: 10,
- priority: 0,
- flags: {protect: 1, mirror: 1},
- multihit: 6,
- target: "allAdjacent",
- type: "Normal",
- isNonstandard: "CAP",
- },
- psychofists: {
- num: 42003,
- accuracy: 100,
- basePower: 80,
- category: "Physical",
- name: "Psycho Fists",
- pp: 10,
- priority: 0,
- flags: {contact: 1, protect: 1, punch: 1, mirror: 1},
- secondary: {
- chance: 100,
- self: {
- onHit() {
- this.field.setTerrain('psychicterrain');
- },
- },
- },
- target: "normal",
- type: "Psychic",
- isNonstandard: "CAP",
- },
- faradaycage: {
- num: 275,
- accuracy: true,
- basePower: 0,
- category: "Status",
- name: "Faraday Cage",
- pp: 20,
- priority: 0,
- flags: {snatch: 1, nonsky: 1},
- volatileStatus: 'ingrain',
- condition: {
- onStart(pokemon) {
- this.add('-start', pokemon, 'move: Ingrain');
- },
- onResidualOrder: 7,
- onResidual(pokemon) {
- this.heal(pokemon.baseMaxhp / 8);
- },
- onTrapPokemon(pokemon) {
- pokemon.tryTrap();
- },
- // groundedness implemented in battle.engine.js:BattlePokemon#isGrounded
- onDragOut(pokemon) {
- this.add('-activate', pokemon, 'move: Ingrain');
- return null;
- },
- },
- secondary: null,
- target: "self",
- type: "Electric",
- isNonstandard: "CAP",
- },
- dragonburst: {
- num: 42005,
- accuracy: 100,
- basePower: 0,
- basePowerCallback(pokemon, target) {
- const ratio = pokemon.hp * 48 / pokemon.maxhp;
- if (ratio < 2) {
- return 200;
- }
- if (ratio < 5) {
- return 150;
- }
- if (ratio < 10) {
- return 120;
- }
- if (ratio < 17) {
- return 100;
- }
- if (ratio < 33) {
- return 90;
- }
- return 60;
- },
- category: "Special",
- name: "Dragon Burst",
- pp: 5,
- priority: 0,
- flags: {protect: 1, mirror: 1},
- secondary: null,
- target: "allAdjacentFoes",
- type: "Dragon",
- isNonstandard: "CAP",
- zMove: {basePower: 160},
- maxMove: {basePower: 130},
- contestType: "Cute",
- },
- rockclock: {
- num: 42006,
- accuracy: 100,
- basePower: 85,
- category: "Physical",
- isNonstandard: "CAP",
- name: "Rock Clock",
- pp: 20,
- priority: 0,
- flags: {contact: 1, protect: 1, punch: 1, mirror: 1},
- secondary: {
- chance: 20,
- volatileStatus: 'confusion',
- },
- target: "normal",
- type: "Rock",
- contestType: "Tough",
- },
- awaken: {
- num: 42007,
- accuracy: true,
- basePower: 0,
- category: "Status",
- isNonstandard: "CAP",
- name: "Awaken",
- pp: 10,
- priority: 0,
- flags: {charge: 1, nonsky: 1},
- 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;
- },
- boosts: {
- atk: 2,
- def: 2,
- spe: 2,
- },
- secondary: null,
- target: "self",
- type: "Fighting",
- zMove: {boost: {atk: 1, def: 1, spa: 1, spd: 1, spe: 1}},
- contestType: "Smart",
- },
- voltaiccyclone: {
- num: 42008,
- accuracy: 100,
- basePower: 75,
- category: "Special",
- isNonstandard: "CAP",
- name: "Voltaic Cyclone",
- pp: 10,
- priority: 0,
- flags: {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);
- }
- const sideConditions = ['spikes', 'toxicspikes', 'stealthrock', 'stickyweb', 'gmaxsteelsurge', 'sleazyspores'];
- 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);
- }
- const sideConditions = ['spikes', 'toxicspikes', 'stealthrock', 'stickyweb', 'gmaxsteelsurge', 'sleazyspores'];
- 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');
- }
- },
- target: "allAdjacent",
- type: "Electric",
- contestType: "Cool",
- },
- boilover: {
- num: 42009,
- accuracy: 100,
- basePower: 80,
- category: "Special",
- isNonstandard: "CAP",
- name: "Boil Over",
- pp: 10,
- priority: 0,
- flags: {protect: 1, mirror: 1},
- onModifyType(move, pokemon) {
- switch (pokemon.effectiveWeather()) {
- case 'sunnyday':
- case 'desolateland':
- move.type = 'Water';
- break;
- case 'raindance':
- case 'primordialsea':
- move.type = 'Fire';
- break;
- }
- },
- onModifyMove(move, pokemon) {
- switch (pokemon.effectiveWeather()) {
- case 'sunnyday':
- case 'desolateland':
- move.basePower *= 2;
- break;
- case 'raindance':
- case 'primordialsea':
- move.basePower *= 2;
- break;
- }
- },
- secondary: null,
- target: "normal",
- type: "Normal",
- zMove: {basePower: 200},
- maxMove: {basePower: 149},
- contestType: "Beautiful",
- },
- soulcrusher: {
- num: 42010,
- accuracy: 100,
- basePower: 10,
- category: "Special",
- isNonstandard: "CAP",
- name: "Soul Crusher",
- pp: 5,
- priority: 0,
- flags: {protect: 1, mirror: 1},
- drain: [1, 1],
- /* lol */
- onBasePower(basePower, pokemon, target) {
- if (target.hp * 2 <= target.maxhp) {
- return this.chainModify(999);
- }
- },
- secondary: null,
- target: "normal",
- type: "Normal",
- contestType: "Tough",
- },
- trickstab: {
- num: 42013,
- accuracy: 100,
- basePower: 90,
- category: "Physical",
- isNonstandard: "CAP",
- name: "Trick Stab",
- pp: 15,
- priority: 0,
- flags: {contact: 1, protect: 1, mirror: 1, blade: 1},
- beforeMoveCallback(source, target, move) {
- if (source.illusion) move.willCrit = true;
- },
- onHit(target, source) {
- this.singleEvent('End', this.dex.abilities.get('Illusion'), source.abilityState, source);
- },
- secondary: null,
- target: "normal",
- type: "Dark",
- contestType: "Cute",
- },
- tombstoner: {
- num: 42015,
- accuracy: 100,
- basePower: 300,
- category: "Physical",
- isNonstandard: "CAP",
- name: "Tombstoner",
- pp: 5,
- priority: 0,
- flags: {protect: 1, mirror: 1},
- selfdestruct: "always",
- overrideOffensiveStat: "def",
- secondary: null,
- target: "allAdjacent",
- type: "Rock",
- },
- fruitjuice: {
- num: 42016,
- accuracy: 100,
- basePower: 0,
- basePowerCallback(pokemon) {
- if (!pokemon.volatiles['stockpile'] || !pokemon.volatiles['stockpile'].layers) return false;
- return pokemon.volatiles['stockpile'].layers * 120;
- },
- category: "Special",
- isNonstandard: "CAP",
- name: "Fruit Juice",
- pp: 10,
- priority: 0,
- flags: {protect: 1},
- onAfterMove(pokemon) {
- pokemon.removeVolatile('stockpile');
- },
- secondary: {
- chance: 100,
- boosts: {
- spd: -2,
- },
- },
- target: "normal",
- type: "Fairy",
- },
- phantomfang: {
- num: 42017,
- accuracy: 100,
- basePower: 80,
- category: "Physical",
- isNonstandard: "CAP",
- name: "Phantom Fang",
- pp: 15,
- priority: 0,
- flags: {bite: 1, contact: 1, protect: 1, mirror: 1},
- secondary: {
- chance: 20,
- volatileStatus: 'curse',
- },
- self: {
- boosts: {
- spe: -1,
- },
- },
- target: "normal",
- type: "Ghost",
- },
- phasethrough: {
- num: 42018,
- accuracy: 100,
- basePower: 70,
- category: "Physical",
- isNonstandard: "CAP",
- name: "Phase Through",
- pp: 15,
- priority: 0,
- flags: {protect: 1, mirror: 1, blade: 1},
- selfSwitch: true,
- secondary: null,
- target: "normal",
- type: "Ghost",
- },
- coldcutter: {
- num: 42019,
- accuracy: 100,
- basePower: 90,
- category: "Physical",
- isNonstandard: "CAP",
- name: "Cold Cutter",
- pp: 15,
- priority: 0,
- flags: {contact: 1, protect: 1, mirror: 1, blade: 1},
- critRatio: 2,
- secondary: {
- chance: 20,
- status: 'frz',
- },
- target: "normal",
- type: "Ice",
- },
- shadowscales: {
- num: 42020,
- accuracy: 100,
- basePower: 110,
- category: "Special",
- isNonstandard: "CAP",
- name: "Shadow Scales",
- pp: 5,
- priority: 0,
- flags: {protect: 1, mirror: 1},
- selfBoost: {
- boosts: {
- def: -1,
- },
- },
- target: "normal",
- type: "Ghost",
- },
- wingsofcorrection: {
- accuracy: true,
- basePower: 100,
- category: "Special",
- isNonstandard: "CAP",
- name: "Wings Of Correction",
- pp: 5,
- priority: -6,
- flags: {protect: 1, mirror: 1, bypasssub: 1},
- forceSwitch: true,
- onHit(target, source, move) {
- let success = false;
- const removeAll = [
- 'reflect', 'lightscreen', 'auroraveil', 'safeguard', 'mist', 'spikes', 'toxicspikes', 'stealthrock', 'stickyweb', 'gmaxsteelsurge', 'sleazyspores', 'shattershard', 'fragments'];
- for (const sideCondition of removeAll) {
- if (target.side.removeSideCondition(sideCondition)) {
- if (!removeAll.includes(sideCondition)) continue;
- this.add('-sideend', target.side, this.dex.conditions.get(sideCondition).name, '[from] move: Defog', '[of] ' + source);
- success = true;
- }
- if (source.side.removeSideCondition(sideCondition)) {
- this.add('-sideend', source.side, this.dex.conditions.get(sideCondition).name, '[from] move: Defog', '[of] ' + source);
- success = true;
- }
- }
- this.field.clearTerrain();
- this.field.clearWeather();
- return success;
- },
- secondary: null,
- target: "normal",
- type: "Flying",
- },
- brutalpunishment: {
- accuracy: 100,
- basePower: 90,
- category: "Physical",
- isNonstandard: "CAP",
- name: "Brutal Punishment",
- pp: 10,
- priority: 0,
- flags: {protect: 1, mirror: 1},
- secondary: {
- chance: 100,
- self: {
- boosts: {
- atk: 1,
- spa: 1,
- },
- },
- },
- onTry(source) {
- if (source.species.baseSpecies === 'Disbeary') {
- return;
- }
- this.attrLastMove('[still]');
- this.add('-fail', source, 'move: Brutal Punishment');
- this.hint("Only a Pokemon whose form is Disbeary or Disbeary-Ebil can use this move.");
- return null;
- },
- onModifyType(move, pokemon) {
- if (pokemon.species.name === 'Disbeary-Ebil') {
- move.type = 'Dark';
- } else {
- move.type = 'Fairy';
- }
- },
- target: "normal",
- type: "Fairy",
- },
- cloudbreaker: {
- accuracy: 100,
- basePower: 90,
- category: "Special",
- isNonstandard: "CAP",
- name: "Cloud Breaker",
- pp: 10,
- priority: 0,
- flags: {protect: 1, mirror: 1},
- onHit() {
- this.field.clearWeather();
- },
- secondary: null,
- target: "normal",
- type: "Flying",
- contestType: "Beautiful",
- },
- gazerbeam: {
- accuracy: 100,
- basePower: 60,
- category: "Special",
- isNonstandard: "CAP",
- name: "Gazer Beam",
- pp: 20,
- priority: 0,
- flags: {protect: 1, mirror: 1},
- onEffectiveness(typeMod, target, type) {
- if (type === 'Steel') return 1;
- },
- secondary: {
- chance: 30,
- status: 'brn',
- },
- target: "normal",
- type: "Steel",
- contestType: "Cool",
- },
- memejr: {
- accuracy: 100,
- basePower: 60,
- category: "Physical",
- isNonstandard: "CAP",
- name: "Meme Jr.",
- pp: 15,
- priority: 0,
- flags: {contact: 1, protect: 1, mirror: 1},
- secondary: {
- chance: 100,
- onHit(target, source) {
- const boosts: StatsExceptHPTable = {
- atk: source.boosts.atk,
- def: source.boosts.def,
- spa: source.boosts.spa,
- spd: source.boosts.spd,
- spe: source.boosts.spe,
- };
- let minBoost = Infinity;
- let minBoosts: StatIDExceptHP[] = [];
- Object.entries(boosts).forEach(([statName, boostValue]) => {
- if (boostValue < minBoost) {
- minBoost = boostValue;
- minBoosts = [statName as StatIDExceptHP];
- } else if (boostValue === minBoost) {
- minBoosts.push(statName as StatIDExceptHP);
- }
- });
- if (minBoosts.length) {
- const randomStat = this.sample(minBoosts);
- const boost: SparseBoostsTable = {};
- boost[randomStat] = 1;
- this.boost(boost, source);
- } else {
- return false;
- }
- },
- },
- target: "normal",
- type: "???",
- contestType: "Cute",
- },
- shinestrike: {
- accuracy: 100,
- basePower: 30,
- category: "Physical",
- isNonstandard: "CAP",
- name: "Shine Strike",
- pp: 10,
- priority: 0,
- flags: {protect: 1, mirror: 1},
- onEffectiveness(typeMod, target, type) {
- if (type === 'Steel') return 0;
- },
- multihit: [2, 5],
- secondary: null,
- target: "normal",
- type: "Steel",
- },
- petrify: {
- isNonstandard: "CAP",
- accuracy: true,
- basePower: 0,
- category: "Status",
- name: "Petrify",
- pp: 10,
- priority: 4,
- flags: {},
- stallingMove: true,
- volatileStatus: 'protect',
- onPrepareHit(pokemon) {
- return !!this.queue.willAct() && this.runEvent('StallMove', pokemon);
- },
- onHit(pokemon) {
- pokemon.addVolatile('stall');
- },
- boosts: {
- def: 1,
- },
- secondary: null,
- target: "self",
- type: "Rock",
- },
- starseedblast: {
- accuracy: 100,
- basePower: 25,
- category: "Physical",
- name: "Starseed Blast",
- pp: 10,
- priority: 0,
- flags: {bullet: 1, protect: 1, mirror: 1},
- multihit: [2, 5],
- onModifyMove(move, pokemon) {
- if (pokemon.getStat('spa', false, true) > pokemon.getStat('atk', false, true)) move.category = 'Special';
- },
- secondary: null,
- target: "normal",
- type: "Fairy",
- isNonstandard: "CAP",
- },
- brandingblade: {
- accuracy: 100,
- basePower: 120,
- category: "Physical",
- name: "Branding Blade",
- pp: 5,
- priority: 0,
- flags: {contact: 1, protect: 1, mirror: 1, defrost: 1, blade: 1},
- onHit(target) {
- if (target.getAbility().isPermanent) return;
- target.addVolatile('gastroacid');
- },
- onAfterSubDamage(damage, target) {
- if (target.getAbility().isPermanent) return;
- target.addVolatile('gastroacid');
- },
- secondary: null,
- recoil: [33, 100],
- target: "normal",
- type: "Steel",
- isNonstandard: "CAP",
- },
- mudmaelstrom: {
- accuracy: 80,
- basePower: 100,
- category: "Special",
- name: "Mud Maelstrom",
- pp: 5,
- priority: 0,
- flags: {protect: 1, mirror: 1},
- volatileStatus: 'partiallytrapped',
- secondary: null,
- target: "allAdjacentFoes",
- type: "Ground",
- isNonstandard: "CAP",
- },
- finalhour: {
- accuracy: 100,
- basePower: 200,
- category: "Special",
- name: "Final Hour",
- pp: 5,
- priority: 0,
- flags: {},
- ignoreImmunity: true,
- isFutureMove: true,
- onTry(source, target) {
- if (!target.side.addSlotCondition(target, 'futuremove')) return false;
- Object.assign(target.side.slotConditions[target.position]['futuremove'], {
- duration: 4,
- move: 'finalhour',
- source: source,
- moveData: {
- id: 'finalhour',
- name: "Final Hour",
- accuracy: 100,
- basePower: 200,
- category: "Special",
- priority: 0,
- flags: {},
- ignoreImmunity: false,
- effectType: 'Move',
- isFutureMove: true,
- type: 'Dark',
- },
- });
- this.add('-start', source, 'move: Final Hour');
- return this.NOT_FAIL;
- },
- secondary: null,
- target: "normal",
- type: "Dark",
- isNonstandard: "CAP",
- },
- turnabout: {
- accuracy: 100,
- basePower: 0,
- category: "Status",
- name: "Turnabout",
- pp: 10,
- priority: 0,
- flags: {mirror: 1},
- volatileStatus: 'endure',
- onAfterMove(target, source) {
- const sourceSide = source.side;
- const targetSide = source.side.foe;
- const sideConditions = [
- 'mist', 'lightscreen', 'reflect', 'spikes', 'safeguard', 'tailwind', 'toxicspikes', 'stealthrock', 'waterpledge', 'firepledge', 'grasspledge', 'stickyweb', 'auroraveil', 'gmaxsteelsurge', 'gmaxcannonade', 'gmaxvinelash', 'gmaxwildfire', 'sleazyspores', 'shattershard',
- ];
- let success = false;
- for (const id of sideConditions) {
- const effectName = this.dex.conditions.get(id).name;
- if (sourceSide.sideConditions[id] && targetSide.sideConditions[id]) {
- [sourceSide.sideConditions[id], targetSide.sideConditions[id]] = [
- targetSide.sideConditions[id], sourceSide.sideConditions[id],
- ];
- this.add('-sideend', sourceSide, effectName, '[silent]');
- this.add('-sideend', targetSide, effectName, '[silent]');
- } else if (sourceSide.sideConditions[id] && !targetSide.sideConditions[id]) {
- targetSide.sideConditions[id] = sourceSide.sideConditions[id];
- delete sourceSide.sideConditions[id];
- this.add('-sideend', sourceSide, effectName, '[silent]');
- } else if (targetSide.sideConditions[id] && !sourceSide.sideConditions[id]) {
- sourceSide.sideConditions[id] = targetSide.sideConditions[id];
- delete targetSide.sideConditions[id];
- this.add('-sideend', targetSide, effectName, '[silent]');
- } else {
- continue;
- }
- let sourceLayers = sourceSide.sideConditions[id] ? (sourceSide.sideConditions[id].layers || 1) : 0;
- let targetLayers = targetSide.sideConditions[id] ? (targetSide.sideConditions[id].layers || 1) : 0;
- for (; sourceLayers > 0; sourceLayers--) {
- this.add('-sidestart', sourceSide, effectName, '[silent]');
- }
- for (; targetLayers > 0; targetLayers--) {
- this.add('-sidestart', targetSide, effectName, '[silent]');
- }
- success = true;
- }
- if (!success) return false;
- this.add('-activate', source, 'move: Turnabout');
- },
- onHit(target, source) {
- const targetBoosts: SparseBoostsTable = {};
- const sourceBoosts: SparseBoostsTable = {};
- let i: BoostID;
- for (i in target.boosts) {
- targetBoosts[i] = target.boosts[i];
- sourceBoosts[i] = source.boosts[i];
- }
- target.setBoost(sourceBoosts);
- source.setBoost(targetBoosts);
- this.add('-swapboost', source, target, '[from] move: Turnabout');
- },
- condition: {
- duration: 1,
- onStart(target) {
- this.add('-singleturn', target, 'move: Endure');
- },
- onDamagePriority: -10,
- onDamage(damage, target, source, effect) {
- if (effect?.effectType === 'Move' && damage >= target.hp) {
- this.add('-activate', target, 'move: Endure');
- return target.hp - 1;
- }
- },
- },
- secondary: null,
- target: "normal",
- type: "Ghost",
- isNonstandard: "CAP",
- },
- meddymeds: {
- accuracy: 100,
- basePower: 100,
- category: "Special",
- name: "Meddy Meds",
- pp: 10,
- priority: 0,
- flags: {bullet: 1, protect: 1, mirror: 1},
- onTryHit(target, source, move) {
- if (source.side === target.side) {
- move.basePower = 0;
- move.infiltrates = true;
- }
- },
- onHit(target, source) {
- if (source.side === target.side) {
- if (!this.heal(Math.floor(target.baseMaxhp * 0.75))) {
- this.add('-immune', target);
- }
- }
- },
- secondary: null,
- self: {
- sideCondition: 'lightscreen',
- },
- target: "normal",
- type: "Poison",
- isNonstandard: "CAP",
- },
- badeggs: {
- accuracy: 90,
- basePower: 20,
- basePowerCallback(pokemon, target, move) {
- return 20 * move.hit;
- },
- category: "Physical",
- name: "Bad Eggs",
- pp: 10,
- priority: 0,
- flags: {protect: 1, mirror: 1},
- multihit: 3,
- multiaccuracy: true,
- secondary: {
- chance: 20,
- status: 'psn',
- },
- target: "normal",
- type: "Dark",
- isNonstandard: "CAP",
- },
- backdraft: {
- num: 366,
- accuracy: true,
- basePower: 65,
- category: "Physical",
- name: "Backdraft",
- pp: 5,
- priority: 0,
- flags: {protect: 1, mirror: 1},
- self: {
- sideCondition: 'backdraft',
- },
- selfSwitch: true,
- secondary: null,
- target: "normal",
- type: "Flying",
- isNonstandard: "CAP",
- },
- /* :^) */
- skullcannon: {
- accuracy: 90,
- basePower: 150,
- category: "Special",
- isNonstandard: "CAP",
- name: "Skull Cannon",
- pp: 5,
- priority: 0,
- flags: {protect: 1, mirror: 1},
- onModifyMove(move, pokemon) {
- if (pokemon.getStat('atk', false, true) > pokemon.getStat('spa', false, true)) move.category = 'Physical';
- },
- ignoreAbility: true,
- secondary: {
- chance: 100,
- self: {
- boosts: {
- atk: 1,
- def: 1,
- spa: 1,
- spd: 1,
- spe: 1,
- },
- },
- boosts: {
- atk: -1,
- def: -1,
- spa: -1,
- spd: -1,
- spe: -1,
- },
- },
- onDamagePriority: -20,
- onDamage(damage, target, source, effect) {
- if (damage >= target.hp) return target.hp - 1;
- },
- noSketch: true,
- target: "normal",
- type: "Dark",
- contestType: "Cool",
- },
- itsover: {
- accuracy: true,
- basePower: 0,
- category: "Status",
- name: "It's Over",
- pp: 40,
- priority: 6,
- flags: {},
- onTryHit(target, source) {
- this.add('-nothing');
- },
- secondary: null,
- target: "self",
- type: "Bug",
- zMove: {boost: {atk: 6, def: 6, spa: 6, spd: 6, spe: 6, accuracy: 6, evasion: 6}},
- contestType: "Cute",
- isNonstandard: "CAP",
- },
- villify: {
- accuracy: true,
- basePower: 0,
- category: "Status",
- name: "Villify",
- pp: 20,
- priority: 1,
- flags: {protect: 1, reflectable: 1, mirror: 1, mystery: 1},
- onHit(target) {
- if (target.getTypes().join() === 'Dark' || !target.setType('Dark')) {
- // Soak should animate even when it fails.
- // Returning false would suppress the animation.
- this.add('-fail', target);
- return null;
- }
- this.add('-start', target, 'typechange', 'Dark');
- },
- secondary: null,
- target: "allAdjacentFoes",
- type: "Dark",
- contestType: "Cute",
- isNonstandard: "CAP",
- },
- nuclearwinter: {
- accuracy: 95,
- basePower: 90,
- category: "Special",
- name: "Nuclear Winter",
- pp: 10,
- priority: 0,
- flags: {protect: 1, mirror: 1},
- onEffectiveness(typeMod, target, type) {
- if (type === 'Ice') return 1;
- },
- secondary: {
- chance: 10,
- status: 'psn',
- },
- target: "allAdjacentFoes",
- type: "Ice",
- isNonstandard: "CAP",
- },
- shroomsnuggle: {
- accuracy: 95,
- basePower: 70,
- category: "Physical",
- name: "Shroom Snuggle",
- pp: 10,
- priority: 0,
- flags: {protect: 1, mirror: 1},
- secondary: null,
- drain: [1, 2],
- target: "allAdjacent",
- type: "Fairy",
- isNonstandard: "CAP",
- },
- closeblobmat: {
- accuracy: 100,
- basePower: 200,
- category: "Physical",
- name: "Close Blobmat",
- pp: 5,
- priority: 0,
- flags: {contact: 1, protect: 1, mirror: 1},
- self: {
- boosts: {
- def: -6,
- spd: -6,
- spe: -1,
- },
- },
- secondary: null,
- noSketch: true,
- target: "normal",
- type: "Fighting",
- contestType: "Cool",
- isNonstandard: "CAP",
- },
- behemothblob: {
- accuracy: 100,
- basePower: 100,
- category: "Physical",
- name: "Behemoth Blob",
- pp: 5,
- priority: 0,
- flags: {contact: 1, protect: 1, mirror: 1},
- secondary: null,
- target: "normal",
- type: "Poison",
- isNonstandard: "CAP",
- },
- sleppthatblobsthesky: {
- accuracy: true,
- basePower: 200,
- category: "Special",
- isNonstandard: "CAP",
- name: "Slepp That Blobs the Sky",
- pp: 1,
- priority: 0,
- flags: {},
- onModifyMove(move, pokemon) {
- if (pokemon.getStat('atk', false, true) > pokemon.getStat('spa', false, true)) move.category = 'Physical';
- },
- ignoreAbility: true,
- isZ: "ultrablobbosiumz",
- secondary: null,
- target: "normal",
- type: "Ice",
- contestType: "Cool",
- },
- strum: {
- num: 813,
- accuracy: 90,
- basePower: 15,
- basePowerCallback(pokemon, target, move) {
- if (move.hit === 4) return move.basePower * 4;
- return move.basePower;
- },
- onHit(target, source, move) {
- if (move.hit === 3) move.category = 'Physical';
- },
- category: "Special",
- name: "Strum",
- pp: 20,
- priority: 0,
- flags: {protect: 1, mirror: 1, sound: 1},
- multihit: 4,
- multiaccuracy: true,
- secondary: null,
- target: "normal",
- type: "Normal",
- isNonstandard: "CAP",
- },
- cope: {
- accuracy: true,
- basePower: 2,
- category: "Special",
- name: "Cope",
- pp: 10,
- priority: 0,
- flags: {},
- multihit: 69,
- target: "normal",
- type: "Bug",
- isNonstandard: "Future", // TODO: Meme move
- },
- matingpress: {
- accuracy: 100,
- basePower: 90,
- category: "Physical",
- name: "Mating Press",
- pp: 20,
- priority: 0,
- flags: {contact: 1, protect: 1},
- secondary: {
- chance: 100,
- onHit(target, source) {
- if (!source.speciesState['parent']) {
- this.add('-activate', source, 'move: Mating Press', '[of] ' + target);
- const sourceSide = source.side;
- const targetSet = target.set;
- const childName = [
- `${targetSet.species}, ${targetSet.gender === 'F' ? 'Daughter of' : targetSet.gender === 'M' ? 'Son of' : 'Offspring of'} ${source.name}`,
- `${targetSet.gender === 'F' ? 'Daughter of' : targetSet.gender === 'M' ? 'Son of' : 'Offspring of'} ${source.name}`,
- `${targetSet.gender === 'F' ? 'Daughter of' : targetSet.gender === 'M' ? 'Son of' : 'Offspring of'} ${source.species}`,
- ].find((name) => name.length <= 18) || 'A Mere Child';
- const baby = new Pokemon({
- ...targetSet,
- name: childName,
- moves: ['Metronome', 'Softboiled', 'Egg Bomb', 'Revelation Dance'],
- item: undefined,
- }, sourceSide);
- baby.position = sourceSide.pokemon.length;
- sourceSide.pokemon.push(baby);
- sourceSide.pokemonLeft += 1;
- this.add('teamsize', sourceSide.id, sourceSide.pokemon.length);
- source.speciesState['parent'] = true;
- } else {
- this.add('-fail', source, 'move: Mating Press');
- }
- },
- },
- target: "normal",
- type: "Fairy",
- isNonstandard: "CAP",
- },
- gunshot: {
- num: 441,
- accuracy: 80,
- basePower: 120,
- category: "Special",
- name: "Gun Shot",
- pp: 5,
- priority: 0,
- flags: {bullet: 1, protect: 1, mirror: 1},
- secondary: {
- chance: 10,
- boosts: {
- spd: -1,
- },
- },
- onModifyMove(move, pokemon, target) {
- if (target && target.baseSpecies.id === 'vandash') {
- move.accuracy = true;
- }
- },
- onBasePower(basePower, pokemon, target) {
- if (target && target.baseSpecies.id === 'vandash') {
- return this.chainModify(100);
- }
- },
- target: "normal",
- type: "Steel",
- contestType: "Tough",
- isNonstandard: "CAP",
- },
- leafshield: {
- accuracy: true,
- basePower: 0,
- category: "Status",
- name: "Leaf Shield",
- pp: 10,
- priority: 4,
- flags: {},
- stallingMove: true,
- volatileStatus: 'spikyshield',
- onPrepareHit(pokemon) {
- return !!this.queue.willAct() && this.runEvent('StallMove', pokemon);
- },
- onHit(pokemon) {
- pokemon.addVolatile('stall');
- },
- condition: {
- duration: 1,
- onStart(target) {
- this.add('-singleturn', target, 'move: Protect');
- },
- onTryHitPriority: 3,
- onTryHit(target, source, move) {
- if (!move.flags['protect']) {
- if (['gmaxoneblow', 'gmaxrapidflow'].includes(move.id)) return;
- if (move.isZ || move.isMax) target.getMoveHitData(move).zBrokeProtect = true;
- return;
- }
- if (move.smartTarget) {
- move.smartTarget = false;
- } else {
- this.add('-activate', target, 'move: Protect');
- }
- const lockedmove = source.getVolatile('lockedmove');
- if (lockedmove) {
- // Outrage counter is reset
- if (source.volatiles['lockedmove'].duration === 2) {
- delete source.volatiles['lockedmove'];
- }
- }
- if (this.checkMoveMakesContact(move, source, target)) {
- this.damage(source.baseMaxhp / 8, source, target);
- }
- return this.NOT_FAIL;
- },
- onHit(target, source, move) {
- if (move.isZOrMaxPowered && this.checkMoveMakesContact(move, source, target)) {
- this.damage(source.baseMaxhp / 8, source, target);
- }
- },
- },
- terrain: 'grassyterrain',
- secondary: null,
- target: "self",
- type: "Grass",
- zMove: {boost: {def: 1}},
- contestType: "Tough",
- isNonstandard: "CAP",
- },
- bilebite: {
- accuracy: 100,
- basePower: 70,
- category: "Physical",
- name: "Bile Bite",
- pp: 10,
- priority: 0,
- flags: {bite: 1, contact: 1, protect: 1, mirror: 1},
- secondaries: [
- {
- chance: 30,
- status: 'tox',
- }, {
- chance: 30,
- volatileStatus: 'flinch',
- },
- ],
- target: "normal",
- type: "Poison",
- contestType: "Cool",
- isNonstandard: "CAP",
- },
- frigidend: {
- accuracy: 100,
- basePower: 105,
- category: "Physical",
- name: "Frigid End",
- pp: 10,
- flags: {contact: 1, protect: 1, mirror: 1, blade: 1},
- onEffectiveness(typeMod, target, type, move) {
- return typeMod + this.dex.getEffectiveness('Ice', type);
- },
- breaksProtect: true,
- priority: 0,
- secondary: null,
- target: "normal",
- type: "Water",
- contestType: "Cool",
- isNonstandard: "CAP",
- },
- coinflip: {
- accuracy: 50,
- basePower: 0,
- category: "Special",
- name: "Coin Flip",
- pp: 5,
- priority: 0,
- flags: {},
- ohko: true,
- onMoveFail(target, source, move) {
- this.damage(source.baseMaxhp, source, source, this.dex.conditions.get('ouchie'));
- },
- secondary: null,
- ignoreAbility: true,
- target: "normal",
- type: "???",
- noSketch: true,
- isNonstandard: "CAP",
- },
- wrapd: {
- accuracy: 85,
- basePower: 15,
- category: "Physical",
- name: "Wrap-D",
- pp: 20,
- priority: 0,
- flags: {contact: 1, protect: 1, mirror: 1},
- volatileStatus: 'bound',
- self: {
- volatileStatus: 'partialtrappinglock',
- },
- noSketch: true,
- target: "normal",
- type: "Normal",
- isNonstandard: "CAP",
- // FIXME: onBeforeMove(pokemon, target) {target.removeVolatile('mustrecharge')}
- onHit(target, source) {
- /**
- * The duration of the partially trapped must be always renewed to 2
- * so target doesn't move on trapper switch out as happens in gen 1.
- * However, this won't happen if there's no switch and the trapper is
- * about to end its partial trapping.
- **/
- if (target.volatiles['bound']) {
- if (source.volatiles['partialtrappinglock'] && source.volatiles['partialtrappinglock'].duration > 1) {
- target.volatiles['bound'].duration = 2;
- }
- }
- },
- },
- blizzardd: {
- accuracy: 90,
- basePower: 120,
- category: "Special",
- name: "Blizzard-D",
- pp: 5,
- priority: 0,
- flags: {protect: 1, mirror: 1},
- secondary: {
- chance: 30,
- status: 'frz',
- },
- target: "allAdjacentFoes",
- type: "Ice",
- isNonstandard: "CAP",
- },
- amnesiad: {
- accuracy: true,
- basePower: 0,
- category: "Status",
- name: "Amnesia-D",
- pp: 20,
- priority: 0,
- flags: {snatch: 1},
- boosts: {
- spa: 2,
- spd: 2,
- },
- secondary: null,
- noSketch: true,
- target: "self",
- type: "Psychic",
- isNonstandard: "CAP",
- },
- hyperbeamd: {
- accuracy: 90,
- basePower: 150,
- category: "Physical",
- name: "Hyper Beam-D",
- pp: 5,
- priority: 0,
- flags: {recharge: 1, protect: 1, mirror: 1},
- onMoveFail(target, source, move) {
- source.addVolatile('mustrecharge');
- },
- secondary: null,
- noSketch: true,
- target: "normal",
- type: "Normal",
- contestType: "Cool",
- isNonstandard: "CAP",
- },
- darkening: {
- accuracy: 100,
- basePower: 135,
- category: "Special",
- name: "Darkening",
- pp: 10,
- priority: 0,
- flags: {protect: 1, mirror: 1, heal: 1},
- drain: [1, 1],
- secondary: null,
- noSketch: true,
- target: "allAdjacent",
- type: "Ghost",
- isNonstandard: "CAP",
- },
- blackbomb: {
- accuracy: 100,
- basePower: 110,
- category: "Special",
- name: "Black Bomb",
- pp: 5,
- priority: 0,
- flags: {protect: 1, mirror: 1},
- secondary: null,
- onTry(source, target) {
- if (!source.volatiles['buried']) {
- source.addVolatile('buried');
- } else {
- source.removeVolatile('buried');
- source.addVolatile('buried');
- }
- },
- target: "normal",
- type: "Dark",
- isNonstandard: "CAP",
- },
- beamblade: {
- accuracy: 80,
- basePower: 100,
- category: "Special",
- name: "Beam Blade",
- pp: 5,
- priority: 0,
- flags: {protect: 1, mirror: 1},
- critRatio: 2,
- secondary: null,
- target: "normal",
- type: "Dark",
- isNonstandard: "CAP",
- },
- bearhug: {
- accuracy: 100,
- basePower: 80,
- category: "Physical",
- name: "Bear Hug",
- pp: 15,
- priority: 0,
- flags: {contact: 1, protect: 1, mirror: 1},
- volatileStatus: 'temptrapped',
- onAfterHit(target, source, move) {
- const poisonContact = [
- 'poisonpoint', 'poisontouch',
- ];
- const toxicContact = [
- 'tetanus',
- ];
- const burnContact = [
- 'flamebody',
- ];
- const speedContact = [
- 'tanglinghair', 'gooey',
- ];
- const damageContact = [
- 'ironbarbs', 'roughskin',
- ];
- const rockyContact = [
- 'rockyhelmet',
- ];
- const stealContact = [
- 'pickpocket', 'magician',
- ];
- const paralyzeContact = [
- 'static',
- ];
- const infatuateContact = [
- 'cutecharm',
- ];
- const mummyContact = [
- 'mummy', 'woke',
- ];
- const randomContact = [
- 'effectspore',
- ];
- const random = this.random(3);
- if (poisonContact.includes(source.ability)) {
- if (random === 0) {
- target.trySetStatus('psn', source);
- }
- if (rockyContact.includes(source.item)) {
- this.damage(target.baseMaxhp / 6, target, source);
- }
- } else if (toxicContact.includes(source.ability)) {
- target.trySetStatus('tox', source);
- if (rockyContact.includes(source.item)) {
- this.damage(target.baseMaxhp / 6, target, source);
- }
- } else if (burnContact.includes(source.ability)) {
- if (random === 0) {
- target.trySetStatus('brn', source);
- }
- if (rockyContact.includes(source.item)) {
- this.damage(target.baseMaxhp / 6, target, source);
- }
- } else if (speedContact.includes(source.ability)) {
- this.boost({spe: -1}, target, source, this.dex.getActiveMove("Bear Hug"));
- if (rockyContact.includes(source.item)) {
- this.damage(target.baseMaxhp / 6, target, source);
- }
- } else if (damageContact.includes(source.ability)) {
- this.damage(target.baseMaxhp / 8, target, source);
- if (rockyContact.includes(source.item)) {
- this.damage(target.baseMaxhp / 6, target, source);
- }
- } else if (stealContact.includes(source.ability)) {
- if (source.item) {
- return;
- }
- const yourItem = target.takeItem(source);
- if (!yourItem) {
- return;
- }
- if (!this.singleEvent('TakeItem', yourItem, target.itemState, source, target, move, yourItem) ||
- !source.setItem(yourItem)) {
- target.item = yourItem.id; // bypass setItem so we don't break choicelock or anything
- return;
- }
- this.add('-enditem', target, yourItem, '[silent]', '[from] move: Thief', '[of] ' + source);
- this.add('-item', source, yourItem, '[from] move: Thief', '[of] ' + target);
- if (rockyContact.includes(source.item)) {
- this.damage(target.baseMaxhp / 6, target, source);
- }
- } else if (paralyzeContact.includes(source.ability)) {
- if (random === 0) {
- target.trySetStatus('par', source);
- }
- if (rockyContact.includes(source.item)) {
- this.damage(target.baseMaxhp / 6, target, source);
- }
- } else if (infatuateContact.includes(source.ability)) {
- if (random === 0) {
- if (source.isActive) target.addVolatile('attract', source, move, 'trapper');
- }
- if (rockyContact.includes(source.item)) {
- this.damage(target.baseMaxhp / 6, target, source);
- }
- } else if (mummyContact.includes(source.ability)) {
- const oldAbility = target.setAbility(source.ability);
- if (oldAbility) {
- this.add('-ability', target, target.getAbility().name, '[from] move: Bear Hug');
- if (!target.isAlly(source)) target.volatileStaleness = 'external';
- return;
- }
- if (rockyContact.includes(source.item)) {
- this.damage(target.baseMaxhp / 6, target, source);
- }
- return false;
- } else if (randomContact.includes(source.ability)) {
- if (random === 0) {
- const result = this.random(3);
- if (result === 0) {
- target.trySetStatus('psn', source);
- } else if (result === 1) {
- target.trySetStatus('par', source);
- } else {
- target.trySetStatus('slp', source);
- }
- if (rockyContact.includes(source.item)) {
- this.damage(target.baseMaxhp / 6, target, source);
- }
- }
- } else if (rockyContact.includes(source.item)) {
- this.damage(target.baseMaxhp / 6, target, source);
- }
- },
- target: "normal",
- type: "Normal",
- isNonstandard: "CAP",
- },
- chilipowder: {
- accuracy: 75,
- basePower: 0,
- category: "Status",
- name: "Chili Powder",
- pp: 15,
- priority: 0,
- flags: {powder: 1, protect: 1, reflectable: 1, mirror: 1},
- status: 'brn',
- secondary: null,
- target: "normal",
- type: "Fire",
- isNonstandard: "CAP",
- },
- thunderdrop: {
- accuracy: 100,
- basePower: 80,
- category: "Physical",
- name: "Thunder Drop",
- pp: 10,
- priority: 0,
- flags: {contact: 1, charge: 1, protect: 1, mirror: 1, gravity: 1, distance: 1},
- onModifyMove(move, source) {
- if (!source.volatiles['skydrop']) {
- move.accuracy = true;
- move.flags.contact = 0;
- }
- },
- onMoveFail(target, source) {
- if (source.volatiles['twoturnmove'] && source.volatiles['twoturnmove'].duration === 1) {
- source.removeVolatile('skydrop');
- source.removeVolatile('twoturnmove');
- if (target === this.effectState.target) {
- this.add('-end', target, 'Sky Drop', '[interrupt]');
- }
- }
- },
- onTry(source, target) {
- return !target.fainted;
- },
- onTryHit(target, source, move) {
- if (source.removeVolatile(move.id)) {
- if (target !== source.volatiles['twoturnmove'].source) return false;
- if (target.hasType('Flying')) {
- this.add('-immune', target);
- return null;
- }
- } else {
- if (target.volatiles['substitute'] || target.isAlly(source)) {
- return false;
- }
- if (target.getWeight() >= 2000) {
- this.add('-fail', target, 'move: Sky Drop', '[heavy]');
- return null;
- }
- this.add('-prepare', source, move.name, target);
- source.addVolatile('twoturnmove', target);
- return null;
- }
- },
- onHit(target, source) {
- if (target.hp) this.add('-end', target, 'Sky Drop');
- },
- condition: {
- duration: 2,
- onAnyDragOut(pokemon) {
- if (pokemon === this.effectState.target || pokemon === this.effectState.source) return false;
- },
- onFoeTrapPokemonPriority: -15,
- onFoeTrapPokemon(defender) {
- if (defender !== this.effectState.source) return;
- defender.trapped = true;
- },
- onFoeBeforeMovePriority: 12,
- onFoeBeforeMove(attacker, defender, move) {
- if (attacker === this.effectState.source) {
- attacker.activeMoveActions--;
- this.debug('Sky drop nullifying.');
- return null;
- }
- },
- onRedirectTargetPriority: 99,
- onRedirectTarget(target, source, source2) {
- if (source !== this.effectState.target) return;
- if (this.effectState.source.fainted) return;
- return this.effectState.source;
- },
- onAnyInvulnerability(target, source, move) {
- if (target !== this.effectState.target && target !== this.effectState.source) {
- return;
- }
- if (source === this.effectState.target && target === this.effectState.source) {
- return;
- }
- if (['gust', 'twister', 'skyuppercut', 'thunder', 'hurricane', 'smackdown', 'thousandarrows'].includes(move.id)) {
- return;
- }
- return false;
- },
- onAnyBasePower(basePower, target, source, move) {
- if (target !== this.effectState.target && target !== this.effectState.source) {
- return;
- }
- if (source === this.effectState.target && target === this.effectState.source) {
- return;
- }
- if (move.id === 'gust' || move.id === 'twister') {
- return this.chainModify(2);
- }
- },
- onFaint(target) {
- if (target.volatiles['skydrop'] && target.volatiles['twoturnmove'].source) {
- this.add('-end', target.volatiles['twoturnmove'].source, 'Sky Drop', '[interrupt]');
- }
- },
- },
- secondary: {
- chance: 20,
- status: 'par',
- },
- target: "any",
- type: "Electric",
- isNonstandard: "CAP",
- },
- faeblade: {
- accuracy: 100,
- basePower: 80,
- category: "Physical",
- overrideDefensiveStat: 'spd',
- name: "Faeblade",
- pp: 10,
- priority: 0,
- flags: {protect: 1, mirror: 1, blade: 1},
- secondary: null,
- target: "normal",
- type: "Fairy",
- isNonstandard: "CAP",
- },
- stickytongue: {
- accuracy: 100,
- basePower: 75,
- category: "Physical",
- name: "Sticky Tongue",
- 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) {
- return this.chainModify(1.5);
- }
- },
- onAfterHit(target, source) {
- if (source.hp) {
- const item = target.takeItem();
- const hurtItem = [
- 'stickybarb',
- ];
- const burnItem = [
- 'flameorb',
- ];
- const poisonItem = [
- 'poisonbarb',
- ];
- const toxicItem = [
- 'toxicorb',
- ];
- const paralyzeItem = [
- 'lightball',
- ];
- const whiteherbItem = [
- 'whiteherb',
- ];
- const mentalherbItem = [
- 'mentalherb',
- ];
- if (item) {
- if (source.hp && item.isBerry && target.takeItem(source)) {
- this.add('-enditem', target, item.name, '[from] stealeat', '[move] Sticky Tongue', '[of] ' + source);
- if (this.singleEvent('Eat', item, null, source, null, null)) {
- this.runEvent('EatItem', source, null, null, item);
- if (item.id === 'leppaberry') target.staleness = 'external';
- }
- if (item.onEat) source.ateBerry = true;
- } else if (hurtItem.includes(target.item)) {
- this.damage(source.baseMaxhp / 8);
- this.add('-enditem', target, item.name, '[from] move: Sticky Tongue', '[of] ' + source);
- } else if (burnItem.includes(target.item)) {
- source.trySetStatus('brn', target);
- this.add('-enditem', target, item.name, '[from] move: Sticky Tongue', '[of] ' + source);
- } else if (poisonItem.includes(target.item)) {
- source.trySetStatus('psn', target);
- this.add('-enditem', target, item.name, '[from] move: Sticky Tongue', '[of] ' + source);
- } else if (toxicItem.includes(target.item)) {
- source.trySetStatus('tox', target);
- this.add('-enditem', target, item.name, '[from] move: Sticky Tongue', '[of] ' + source);
- } else if (paralyzeItem.includes(target.item)) {
- source.trySetStatus('par', target);
- this.add('-enditem', target, item.name, '[from] move: Sticky Tongue', '[of] ' + source);
- } else if (whiteherbItem.includes(target.item)) {
- let activate = false;
- const boosts: SparseBoostsTable = {};
- let i: BoostID;
- for (i in source.boosts) {
- if (source.boosts[i] < 0) {
- activate = true;
- boosts[i] = 0;
- }
- }
- if (activate) {
- source.setBoost(boosts);
- this.add('-clearnegativeboost', source, '[silent]');
- }
- this.add('-enditem', target, item.name, '[from] move: Sticky Tongue', '[of] ' + source);
- } else if (mentalherbItem.includes(target.item)) {
- const conditions = ['attract', 'taunt', 'encore', 'torment', 'disable', 'healblock'];
- for (const firstCondition of conditions) {
- if (source.volatiles[firstCondition]) {
- for (const secondCondition of conditions) {
- source.removeVolatile(secondCondition);
- if (firstCondition === 'attract' && secondCondition === 'attract') {
- this.add('-end', source, 'move: Attract', '[from] item: Mental Herb');
- }
- }
- return;
- }
- }
- this.add('-enditem', target, item.name, '[from] move: Sticky Tongue', '[of] ' + source);
- } else {
- this.add('-enditem', target, item.name, '[from] move: Sticky Tongue', '[of] ' + source);
- }
- }
- }
- },
- secondary: null,
- target: "normal",
- type: "Poison",
- isNonstandard: "CAP",
- },
- rocketpunch: {
- accuracy: 100,
- basePower: 50,
- category: "Physical",
- name: "Rocket Punch",
- pp: 10,
- priority: 2,
- flags: {contact: 1, protect: 1, mirror: 1, punch: 1},
- onTry(source) {
- if (source.activeMoveActions > 1) {
- this.hint("Rocket Punch only works on your first turn out.");
- return false;
- }
- },
- willCrit: true,
- secondary: null,
- target: "normal",
- type: "Fighting",
- isNonstandard: "CAP",
- },
- powerwasher: {
- accuracy: 100,
- basePower: 100,
- category: "Special",
- name: "Power Washer",
- pp: 5,
- priority: -1,
- flags: {protect: 1, mirror: 1},
- secondary: {
- chance: 50,
- boosts: {
- spd: -1,
- },
- },
- target: "normal",
- type: "Water",
- isNonstandard: "CAP",
- },
- flakcannon: {
- accuracy: 100,
- basePower: 35,
- category: "Special",
- name: "Flak Cannon",
- pp: 5,
- priority: 0,
- flags: {protect: 1, pulse: 1, mirror: 1, mystery: 1},
- willCrit: true,
- multihit: 3,
- 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;
- 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('flakcannon');
- },
- condition: {
- onUpdate(pokemon) {
- const item = pokemon.getItem();
- pokemon.setItem('');
- pokemon.lastItem = item.id;
- pokemon.usedItemThisTurn = true;
- this.add('-enditem', pokemon, item.name, '[from] move: Flak Cannon');
- this.runEvent('AfterUseItem', pokemon, null, null, item);
- pokemon.removeVolatile('flakcannon');
- },
- },
- secondary: null,
- target: "normal",
- type: "Steel",
- isNonstandard: "CAP",
- },
- polysporin: {
- accuracy: 100,
- basePower: 0,
- category: "Status",
- name: "Polysporin",
- pp: 15,
- priority: 0,
- flags: {protect: 1, reflectable: 1, mirror: 1},
- status: 'slp',
- onHit(target, source) {
- let success = false;
- if (source.hasAbility('wonderskin')) {
- success = !!this.heal(this.modify(target.baseMaxhp, 1));
- } else {
- success = !!this.heal(Math.ceil(target.baseMaxhp * 0.5));
- }
- if (success && !target.isAlly(source)) {
- target.staleness = 'external';
- }
- return success;
- },
- secondary: null,
- target: "any",
- type: "Poison",
- isNonstandard: "CAP",
- },
- inverserush: {
- accuracy: 100,
- basePower: 80,
- category: "Physical",
- name: "Inverse Rush",
- pp: 20,
- priority: 0,
- flags: {protect: 1, mirror: 1},
- secondary: null,
- onBasePower(basePower, pokemon, target) {
- if (this.field.getPseudoWeather('inverseroom')) {
- return this.chainModify(2);
- }
- },
- noSketch: true,
- target: "normal",
- type: "Normal",
- isNonstandard: "CAP",
- maxMove: {basePower: 140},
- },
- faedozer: {
- accuracy: 100,
- basePower: 100,
- category: "Physical",
- name: "Fae Dozer",
- pp: 15,
- priority: 0,
- flags: {protect: 1, mirror: 1},
- secondary: {
- chance: 100,
- self: {
- onHit() {
- const rand = this.random(4);
- if (rand === 0) {
- this.field.setTerrain('psychicterrain');
- } else if (rand === 1) {
- this.field.setTerrain('electricterrain');
- } else if (rand === 2) {
- this.field.setTerrain('grassyterrain');
- } else {
- this.field.setTerrain('mistyterrain');
- }
- },
- },
- },
- noSketch: true,
- target: "normal",
- type: "Fairy",
- contestType: "Cute",
- isNonstandard: "CAP",
- },
- yiikout: {
- num: 69010,
- accuracy: 100,
- basePower: 60,
- category: "Special",
- name: "Yiik Out",
- pp: 10,
- priority: 3,
- flags: {sound: 1, protect: 1, mirror: 1, bypasssub: 1},
- onTry(pokemon, target) {
- if (pokemon.activeTurns > 1) {
- this.attrLastMove('[still]');
- this.add('-fail', pokemon);
- this.hint("Yiik is only fun for the first five minutes.");
- return null;
- }
- },
- onTryHit(target, source) {
- if (target === source || target.volatiles['dynamax']) return false;
- const additionalBannedSourceAbilities = [
- // Zen Mode included here for compatability with Gen 5-6
- 'flowergift', 'forecast', 'hungerswitch', 'illusion', 'imposter', 'neutralizinggas', 'powerofalchemy', 'receiver', 'trace', 'zenmode',
- ];
- if (
- target.getAbility().isPermanent || target.ability === 'truant' ||
- source.getAbility().isPermanent || additionalBannedSourceAbilities.includes(source.ability)
- ) {
- return false;
- }
- },
- onHit(target, source) {
- const oldAbility = target.setAbility(source.ability);
- if (oldAbility) {
- this.add('-ability', target, target.getAbility().name, '[from] move: Yiikout');
- if (!target.isAlly(source)) target.volatileStaleness = 'external';
- return;
- }
- return false;
- },
- secondary: {
- chance: 100,
- volatileStatus: 'flinch',
- },
- noSketch: true,
- target: "normal",
- type: "Fairy",
- zMove: {basePower: 120},
- contestType: "Cute",
- isNonstandard: "CAP",
- },
- roidflex: {
- num: 197,
- accuracy: true,
- basePower: 0,
- category: "Status",
- name: "Roid Flex",
- pp: 5,
- priority: 4,
- flags: {},
- stallingMove: true,
- volatileStatus: 'protect',
- boosts: {
- accuracy: 1,
- },
- onPrepareHit(pokemon) {
- return !!this.queue.willAct() && this.runEvent('StallMove', pokemon);
- },
- onHit(pokemon) {
- pokemon.addVolatile('stall');
- },
- onAfterMove(source) {
- source.trySetStatus('psn');
- },
- secondary: null,
- noSketch: true,
- target: "self",
- type: "Fighting",
- isNonstandard: "CAP",
- zMove: {boost: {evasion: 1}},
- contestType: "Cool",
- },
- genwunroom: {
- num: 1001,
- accuracy: true,
- basePower: 0,
- category: "Status",
- name: "Genwun Room",
- pp: 10,
- priority: 0,
- flags: {mirror: 1},
- pseudoWeather: 'genwunroom',
- condition: {
- duration: 5,
- durationCallback(source, effect) {
- if (source?.hasAbility(['persistent', 'moreroom'])) {
- this.add('-activate', source, `ability: ${source.ability}`, effect);
- return 7;
- }
- return 5;
- },
- onFieldStart(target, source) {
- this.add('-fieldstart', 'move: Genwun Room', '[of] ' + source);
- },
- onFieldRestart(target, source) {
- this.field.removePseudoWeather('genwunroom');
- },
- // Item suppression implemented in Pokemon.ignoringItem() within sim/pokemon.js
- onFieldResidualOrder: 27,
- onFieldResidualSubOrder: 6,
- onFieldEnd() {
- this.add('-fieldend', 'move: Genwun Room', '[of] ' + this.effectState.source);
- },
- },
- secondary: null,
- noSketch: true,
- target: "all",
- type: "Psychic",
- isNonstandard: "CAP",
- zMove: {boost: {spd: 1}},
- contestType: "Clever",
- },
- backroom: {
- num: 366,
- accuracy: true,
- basePower: 65,
- category: "Physical",
- name: "Backroom",
- pp: 16,
- priority: 0,
- flags: {protect: 1, mirror: 1},
- onHit() {
- this.field.addPseudoWeather('trickroom', null, this.activeMove);
- },
- secondary: null,
- noSketch: true,
- selfSwitch: true,
- target: "normal",
- type: "Ground",
- isNonstandard: "CAP",
- },
- charmerssong: {
- num: 273,
- accuracy: 100,
- basePower: 70,
- category: "Physical",
- name: "Charmer's Song",
- pp: 10,
- priority: -6,
- flags: {contact: 1, protect: 1, mirror: 1, sound: 1},
- forceSwitch: true,
- slotCondition: 'charmerssong',
- condition: {
- onSwap(target) {
- target.addVolatile('taunt');
- target.side.removeSlotCondition(target, 'charmerssong');
- },
- },
- noSketch: true,
- target: "normal",
- type: "Poison",
- isNonstandard: "CAP",
- zMove: {boost: {spd: 1}},
- contestType: "Clever",
- },
- psychospell: {
- num: 42003,
- accuracy: 100,
- basePower: 80,
- category: "Special",
- name: "Psycho Spell",
- pp: 10,
- priority: 0,
- flags: {protect: 1, mirror: 1},
- secondary: {
- chance: 100,
- self: {
- onHit() {
- this.field.setTerrain('psychicterrain');
- },
- },
- },
- noSketch: true,
- target: "normal",
- type: "Psychic",
- isNonstandard: "CAP",
- },
- wonderwand: {
- num: 42003,
- accuracy: 100,
- basePower: 80,
- category: "Special",
- name: "Wonder Wand",
- pp: 10,
- priority: 0,
- flags: {protect: 1, mirror: 1},
- secondary: {
- chance: 100,
- self: {
- onHit() {
- this.field.addPseudoWeather('wonderroom');
- },
- },
- },
- noSketch: true,
- target: "normal",
- type: "Fairy",
- isNonstandard: "CAP",
- },
- implosion: {
- num: 42003,
- accuracy: 100,
- basePower: 150,
- category: "Special",
- name: "Implosion",
- pp: 10,
- priority: 0,
- flags: {protect: 1, mirror: 1},
- secondary: {
- chance: 100,
- self: {
- onHit() {
- this.field.addPseudoWeather('inverseroom');
- },
- },
- },
- noSketch: true,
- target: "allAdjacent",
- type: "Fire",
- isNonstandard: "CAP",
- },
- portalgun: {
- num: 509,
- accuracy: 90,
- basePower: 90,
- category: "Special",
- name: "Portal Gun",
- pp: 10,
- priority: -6,
- flags: {bullet: 1, protect: 1, pulse: 1, mirror: 1, distance: 1},
- selfSwitch: true,
- forceSwitch: true,
- noSketch: true,
- target: "normal",
- type: "Steel",
- contestType: "Cool",
- isNonstandard: "CAP",
- },
- sportsball: {
- num: 42003,
- accuracy: 85,
- basePower: 60,
- category: "Physical",
- name: "Sportsball",
- pp: 10,
- priority: 0,
- multihit: 2,
- flags: {protect: 1, mirror: 1},
- secondary: {
- chance: 100,
- self: {
- onHit() {
- this.field.addPseudoWeather('mudsport');
- this.field.addPseudoWeather('watersport');
- },
- },
- },
- noSketch: true,
- target: "normal",
- type: "Fighting",
- isNonstandard: "CAP",
- },
- rainbowbeam: {
- num: 69048,
- accuracy: 100,
- basePower: 100,
- category: "Special",
- name: "Rainbow Beam",
- pp: 10,
- priority: 0,
- target: "normal",
- noSketch: true,
- type: "???",
- flags: {protect: 1, mirror: 1},
- onEffectiveness(typeMod, target, type, move) {
- return typeMod + this.dex.getEffectiveness('Ice', type) + this.dex.getEffectiveness('Normal', type) + this.dex.getEffectiveness('Fighting', type) +
- this.dex.getEffectiveness('Flying', type) + this.dex.getEffectiveness('Poison', type) + this.dex.getEffectiveness('Ground', type) + this.dex.getEffectiveness('Rock', type) +
- this.dex.getEffectiveness('Bug', type) + this.dex.getEffectiveness('Ghost', type) + this.dex.getEffectiveness('Steel', type) + this.dex.getEffectiveness('Fire', type) +
- this.dex.getEffectiveness('Water', type) + this.dex.getEffectiveness('Grass', type) + this.dex.getEffectiveness('Electric', type) + this.dex.getEffectiveness('Psychic', type) +
- this.dex.getEffectiveness('Dragon', type) + this.dex.getEffectiveness('Dark', type) + this.dex.getEffectiveness('Fairy', type);
- },
- isNonstandard: "CAP",
- },
- freikugel: {
- accuracy: 80,
- basePower: 150,
- category: "Physical",
- isNonstandard: "CAP",
- name: "Freikugel",
- pp: 20,
- priority: 0,
- flags: {contact: 1, protect: 1, mirror: 1},
- recoil: [1, 2],
- onModifyMove(move, pokemon, target) {
- if (this.field.getPseudoWeather('magicroom')) {
- move.accuracy = true;
- }
- },
- onDamage(damage, target, source, effect) {
- if (this.field.getPseudoWeather('magicroom')) {
- if (effect.id === 'recoil') {
- if (!this.activeMove) throw new Error("Battle.activeMove is null");
- if (this.activeMove.id !== 'struggle') return null;
- }
- }
- },
- secondary: null,
- noSketch: true,
- target: "normal",
- type: "Fighting",
- contestType: "Tough",
- maxMove: {basePower: 200},
- },
- confettigun: {
- accuracy: 100,
- basePower: 200,
- category: "Special",
- isNonstandard: "CAP",
- name: "Confetti Gun",
- pp: 15,
- priority: 0,
- flags: {distance: 1, protect: 1, mirror: 1, bullet: 1},
- secondary: {
- chance: 50,
- volatileStatus: 'confusion',
- },
- target: "normal",
- noSketch: true,
- type: "Normal",
- contestType: "Cute",
- },
- butterflykick: {
- accuracy: 100,
- basePower: 80,
- category: "Physical",
- name: "Butterfly Kick",
- pp: 10,
- priority: 0,
- target: "normal",
- noSketch: true,
- type: "Bug",
- flags: {contact: 1, protect: 1, mirror: 1, kick: 1},
- onEffectiveness(typeMod, target, type, move) {
- return typeMod + this.dex.getEffectiveness('Fighting', type);
- },
- isNonstandard: "CAP",
- },
- toxicbeam: {
- accuracy: 90,
- basePower: 110,
- category: "Special",
- name: "Toxic Beam",
- pp: 10,
- priority: 0,
- flags: {protect: 1, mirror: 1},
- secondary: {
- chance: 20,
- status: 'tox',
- },
- target: "normal",
- noSketch: true,
- type: "Poison",
- contestType: "Clever",
- isNonstandard: "CAP",
- },
- windwhip: {
- accuracy: 100,
- basePower: 80,
- category: "Special",
- name: "Wind Whip",
- pp: 15,
- priority: 0,
- flags: {contact: 1, protect: 1, mirror: 1},
- secondary: {
- chance: 100,
- boosts: {
- spd: -1,
- },
- },
- target: "normal",
- noSketch: true,
- type: "Flying",
- contestType: "Cute",
- isNonstandard: "CAP",
- },
- firewall: {
- accuracy: true,
- basePower: 0,
- category: "Status",
- name: "Firewall",
- pp: 10,
- priority: 4,
- flags: {},
- stallingMove: true,
- volatileStatus: 'firewall',
- onPrepareHit(pokemon) {
- return !!this.queue.willAct() && this.runEvent('StallMove', pokemon);
- },
- onHit(pokemon) {
- pokemon.addVolatile('stall');
- },
- condition: {
- duration: 1,
- onStart(target) {
- this.add('-singleturn', target, 'move: Protect');
- },
- onTryHitPriority: 3,
- onTryHit(target, source, move) {
- if (!move.flags['protect']) {
- if (['gmaxoneblow', 'gmaxrapidflow'].includes(move.id)) return;
- if (move.isZ || move.isMax) target.getMoveHitData(move).zBrokeProtect = true;
- return;
- }
- if (move.smartTarget) {
- move.smartTarget = false;
- } else {
- this.add('-activate', target, 'move: Protect');
- }
- const lockedmove = source.getVolatile('lockedmove');
- if (lockedmove) {
- // Outrage counter is reset
- if (source.volatiles['lockedmove'].duration === 2) {
- delete source.volatiles['lockedmove'];
- }
- }
- if (this.checkMoveMakesContact(move, source, target)) {
- source.trySetStatus('brn', target);
- }
- return this.NOT_FAIL;
- },
- onHit(target, source, move) {
- if (move.isZOrMaxPowered && this.checkMoveMakesContact(move, source, target)) {
- source.trySetStatus('brn', target);
- }
- },
- },
- secondary: null,
- target: "self",
- type: "Fire",
- noSketch: true,
- zMove: {boost: {def: 1}},
- contestType: "Tough",
- isNonstandard: "CAP",
- },
- maximize: {
- accuracy: 100,
- basePower: 300,
- category: "Physical",
- name: "Maximize",
- pp: 5,
- priority: 0,
- flags: {contact: 1, protect: 1, mirror: 1},
- self: {
- boosts: {
- evasion: -1,
- },
- },
- secondary: null,
- target: "normal",
- type: "Bug",
- noSketch: true,
- contestType: "Tough",
- isNonstandard: "CAP",
- },
- seaquake: {
- accuracy: 100,
- basePower: 100,
- category: "Physical",
- name: "Seaquake",
- pp: 10,
- priority: 0,
- target: "normal",
- noSketch: true,
- type: "Water",
- flags: {protect: 1, mirror: 1},
- onEffectiveness(typeMod, target, type, move) {
- return typeMod + this.dex.getEffectiveness('Ground', type);
- },
- isNonstandard: "CAP",
- },
- edgequake: {
- accuracy: 100,
- basePower: 100,
- category: "Physical",
- name: "Edgequake",
- pp: 10,
- priority: 0,
- target: "normal",
- noSketch: true,
- type: "Rock",
- flags: {protect: 1, mirror: 1},
- onEffectiveness(typeMod, target, type, move) {
- return typeMod + this.dex.getEffectiveness('Ground', type);
- },
- isNonstandard: "CAP",
- },
- sugarrush: {
- accuracy: true,
- basePower: 0,
- category: "Status",
- name: "Sugar Rush",
- pp: 10,
- priority: 0,
- flags: {snatch: 1},
- onHit(target) {
- if (target.hp <= target.maxhp / 2 || target.boosts.spa >= 6 || target.maxhp === 1) { // Shedinja clause
- return false;
- }
- this.directDamage(target.maxhp / 2);
- this.boost({spa: 12}, target);
- },
- secondary: null,
- target: "self",
- type: "Fairy",
- noSketch: true,
- zMove: {effect: 'heal'},
- contestType: "Cute",
- isNonstandard: "CAP",
- },
- sleepingsands: {
- accuracy: 100,
- basePower: 70,
- category: "Special",
- name: "Sleeping Sands",
- pp: 10,
- priority: 0,
- flags: {protect: 1, mirror: 1},
- secondary: {
- chance: 30,
- status: 'slp',
- },
- target: "normal",
- type: "Ground",
- noSketch: true,
- isNonstandard: "CAP",
- },
- fuckyou: {
- accuracy: 100,
- basePower: 0,
- category: "Status",
- name: "Fuck You",
- pp: 20,
- priority: 0,
- flags: {protect: 1, reflectable: 1, mirror: 1, sound: 1, bypasssub: 1},
- onHit(target, source, move) {
- const success = this.boost({atk: -6, def: -6, spa: -6, spd: -6, spe: -6, accuracy: -6, evasion: -6}, target, source);
- if (!success && !target.hasAbility('mirrorarmor')) {
- delete move.selfSwitch;
- }
- },
- selfSwitch: true,
- secondary: null,
- noSketch: true,
- target: "normal",
- type: "Fighting",
- zMove: {effect: 'healreplacement'},
- contestType: "Cool",
- isNonstandard: "CAP",
- },
- absolutezero: {
- accuracy: 100,
- basePower: 100,
- category: "Special",
- name: "Absolute Zero",
- pp: 10,
- priority: 0,
- flags: {protect: 1, mirror: 1},
- secondary: {
- chance: 100,
- status: 'frz',
- },
- target: "normal",
- noSketch: true,
- type: "Ice",
- contestType: "Beautiful",
- isNonstandard: "CAP",
- },
- poisonivy: {
- accuracy: 95,
- basePower: 90,
- category: "Physical",
- name: "Poison Ivy",
- pp: 5,
- priority: 0,
- flags: {protect: 1, mirror: 1, contact: 1},
- secondary: {
- chance: 30,
- onHit(target, source) {
- const result = this.random(3);
- if (result === 0) {
- target.trySetStatus('psn', source);
- } else if (result === 1) {
- target.trySetStatus('tox', source);
- } else {
- target.trySetStatus('par', source);
- }
- },
- },
- target: "normal",
- noSketch: true,
- type: "Grass",
- zMove: {basePower: 160},
- isNonstandard: "CAP",
- },
- doesthiswork: {
- accuracy: true,
- basePower: 60,
- category: "Status",
- name: "Does This Work",
- pp: 20,
- priority: 0,
- flags: {snatch: 1, dance: 1},
- boosts: {
- spa: 1,
- spe: 1,
- },
- secondary: null,
- noSketch: true,
- target: "self",
- type: "Psychic",
- zMove: {effect: 'clearnegativeboost'},
- contestType: "Beautiful",
- isNonstandard: "CAP",
- },
- telluriccurrent: {
- accuracy: 100,
- basePower: 90,
- category: "Physical",
- isNonstandard: "CAP",
- name: "Telluric Current",
- pp: 20,
- priority: 0,
- ignoreImmunity: {'Electric': true},
- flags: {protect: 1, mirror: 1},
- secondary: {
- chance: 10,
- status: 'par',
- },
- target: "normal",
- noSketch: true,
- type: "Electric",
- contestType: "Cool",
- },
- rockout: {
- num: 369,
- accuracy: 100,
- basePower: 70,
- category: "Physical",
- name: "Rock Out",
- pp: 20,
- priority: 0,
- flags: {contact: 1, protect: 1, sound: 1, mirror: 1},
- selfSwitch: true,
- secondary: null,
- noSketch: true,
- target: "normal",
- type: "Rock",
- contestType: "Clever",
- isNonstandard: "CAP",
- },
- twintowertumblingterror: {
- accuracy: true,
- basePower: 290,
- category: "Physical",
- isNonstandard: "CAP",
- name: "Twin Tower Tumbling Terror",
- pp: 1,
- priority: -7,
- flags: {contact: 1, hammer: 1},
- isZ: "sableviumz",
- onAfterMove(source) {
- source.trySetStatus('brn');
- },
- secondary: {
- chance: 100,
- status: 'brn',
- },
- onModifyType(move, pokemon) {
- let type = pokemon.getTypes()[0];
- if (type === "Bird") type = "???";
- move.type = type;
- },
- onModifyMove(move, pokemon) {
- if (pokemon.getStat('atk', false, true) > pokemon.getStat('spa', false, true)) move.category = 'Physical';
- },
- target: "normal",
- type: "Steel",
- contestType: "Smart",
- },
- toppingtoss: {
- accuracy: 100,
- basePower: 50,
- onHit(target, source, move) {
- if (move.hit === 1) { move.type = 'Ground'; } else if (move.hit === 2) { move.type = 'Grass'; }
- },
- category: "Special",
- name: "Topping Toss",
- isNonstandard: "CAP",
- pp: 10,
- priority: 0,
- flags: {protect: 1, mirror: 1},
- multihit: 3,
- secondary: null,
- target: "normal",
- type: "Fire",
- noSketch: true,
- contestType: "Cool",
- },
- heavensblessing: {
- num: 273,
- accuracy: true,
- basePower: 0,
- category: "Status",
- name: "Heaven's Blessing",
- pp: 10,
- priority: 0,
- flags: {snatch: 1, heal: 1},
- slotCondition: 'Wish',
- condition: {
- duration: 2,
- onStart(pokemon, source) {
- this.effectState.hp = source.maxhp / 2;
- },
- onResidualOrder: 4,
- onEnd(target) {
- if (target && !target.fainted) {
- const damage = this.heal(this.effectState.hp, target, target);
- if (damage) {
- this.add('-heal', target, target.getHealth, '[from] move: Wish', '[wisher] ' + this.effectState.source.name);
- }
- }
- },
- },
- onHit(pokemon) {
- const success = !!this.heal(this.modify(pokemon.maxhp, 0.25));
- return pokemon.cureStatus() || success;
- },
- secondary: null,
- noSketch: true,
- target: "self",
- type: "Normal",
- zMove: {boost: {spd: 1}},
- contestType: "Cute",
- isNonstandard: "CAP",
- },
- sandysnore: {
- num: 173,
- accuracy: 100,
- basePower: 120,
- category: "Physical",
- name: "Sandy Snore",
- pp: 15,
- priority: 0,
- flags: {protect: 1, mirror: 1, sound: 1, bypasssub: 1},
- sleepUsable: true,
- onTry(source) {
- return source.status === 'slp' || source.hasAbility('comatose');
- },
- self: {
- onHit(source) {
- this.field.setWeather('sandstorm');
- const oldAbility = source.setAbility('sandrush');
- if (oldAbility) {
- this.add('-ability', source, 'Sand Rush', '[from] move: Sandy Snore');
- return;
- }
- return false;
- },
- },
- noSketch: true,
- target: "normal",
- type: "Rock",
- contestType: "Cute",
- isNonstandard: "CAP",
- },
- amogus: {
- num: 1,
- accuracy: 100,
- basePower: 70,
- category: "Physical",
- name: "Amogus",
- pp: 35,
- priority: 0,
- flags: {contact: 1, protect: 1, mirror: 1},
- secondary: null,
- noSketch: true,
- target: "normal",
- type: "???",
- contestType: "Tough",
- isNonstandard: "CAP",
- },
- ninjutsu: {
- accuracy: 100,
- basePower: 15,
- category: "Special",
- name: "Ninjutsu",
- pp: 10,
- priority: 0,
- flags: {protect: 1, mirror: 1},
- multihit: 4,
- target: "normal",
- type: "Steel",
- isNonstandard: "CAP",
- noSketch: true,
- },
- groundbomb: {
- accuracy: 100,
- basePower: 250,
- category: "Special",
- name: "Ground Bomb",
- pp: 5,
- priority: 0,
- flags: {protect: 1, mirror: 1},
- selfdestruct: "always",
- secondary: {
- chance: 10,
- status: 'brn',
- },
- onBasePower(basePower, pokemon, target) {
- return this.chainModify(2);
- },
- target: "normal",
- type: "Ground",
- zMove: {basePower: 180},
- isNonstandard: "CAP",
- noSketch: true,
- },
- chernoboil: {
- accuracy: 100,
- basePower: 26,
- category: "Special",
- name: "Chernoboil",
- pp: 15,
- priority: 0,
- flags: {protect: 1, mirror: 1},
- secondary: {
- chance: 10,
- status: 'brn',
- },
- target: "normal",
- type: "Nuclear",
- contestType: "Tough",
- isNonstandard: "CAP",
- noSketch: true,
- },
- halflife: {
- accuracy: 100,
- basePower: 0,
- damageCallback(pokemon, target) {
- return this.clampIntRange(target.getUndynamaxedHP() / 2, 1);
- },
- category: "Special",
- name: "Half-Life",
- pp: 10,
- priority: 0,
- flags: {contact: 1, protect: 1, mirror: 1},
- secondary: null,
- target: "normal",
- type: "Nuclear",
- contestType: "Tough",
- isNonstandard: "CAP",
- noSketch: true,
- },
- obsidianhorn: {
- accuracy: 100,
- basePower: 100,
- category: "Physical",
- name: "Obsidian Horn",
- pp: 10,
- priority: 0,
- flags: {contact: 1, protect: 1, mirror: 1},
- secondary: {
- chance: 10,
- self: {
- boosts: {
- def: 1,
- spd: 1,
- },
- },
- },
- target: "normal",
- type: "Dark",
- isNonstandard: "CAP",
- contestType: "Cool",
- noSketch: true,
- },
- feudefee: {
- accuracy: 100,
- basePower: 80,
- category: "Special",
- name: "Feu de Fe\u0301e",
- pp: 10,
- priority: 0,
- flags: {protect: 1, mirror: 1},
- onModifyMove(move, pokemon) {
- if (pokemon.getStat('atk', false, true) > pokemon.getStat('spa', false, true)) move.category = 'Physical';
- },
- secondary: null,
- target: "normal",
- type: "Fire",
- contestType: "Cute",
- isNonstandard: "CAP",
- noSketch: true,
- },
- heavenpierce: {
- accuracy: true,
- basePower: 70,
- category: "Physical",
- name: "Heaven Pierce",
- pp: 5,
- priority: 0,
- flags: {mirror: 1, defrost: 1},
- onTryHit(pokemon) {
- // will shatter screens through sub, before you hit
- pokemon.side.removeSideCondition('reflect');
- pokemon.side.removeSideCondition('lightscreen');
- pokemon.side.removeSideCondition('auroraveil');
- },
- ignoreAbility: true,
- ignoreImmunity: {'Steel': true},
- breaksProtect: true,
- willCrit: true,
- secondary: null,
- noSketch: true,
- target: "normal",
- type: "Steel",
- contestType: "Cool",
- },
- fughamut: {
- accuracy: true,
- basePower: 90,
- category: "Status",
- name: "Fughamut",
- pp: 20,
- priority: 0,
- flags: {contact: 1, protect: 1},
- secondary: {
- chance: 100,
- onHit(target, source) {
- if (!source.speciesState['parent']) {
- this.add('-activate', source, 'move: Fughamut', '[of] ' + target);
- const sourceSide = source.side;
- const baby = new Pokemon({
- species: 'Rayquaza',
- name: "Fug",
- moves: ['Draco Meteor', 'Extreme Speed', 'Overheat', 'Dragon Ascent'],
- item: 'Life Orb',
- }, sourceSide);
- baby.position = sourceSide.pokemon.length;
- sourceSide.pokemon.push(baby);
- sourceSide.pokemonLeft += 1;
- this.add('teamsize', sourceSide.id, sourceSide.pokemon.length);
- source.speciesState['parent'] = true;
- } else {
- this.add('-fail', source, 'move: Fughamut');
- }
- },
- },
- target: "normal",
- type: "Dragon",
- isNonstandard: "CAP",
- },
- feedandseed: {
- num: 738,
- accuracy: 90,
- basePower: 100,
- category: "Physical",
- isNonstandard: "CAP",
- name: "Feed and Seed",
- pp: 10,
- priority: 0,
- flags: {protect: 1, reflectable: 1},
- onTryHit(target) {
- if (target.getAbility().isPermanent) {
- return false;
- }
- },
- onHit(target, source) {
- if (target.hasType('Grass')) return null;
- target.addVolatile('leechseed', source);
- const oldAbility = target.setAbility('insomnia');
- if (oldAbility) {
- this.add('-ability', target, 'Insomnia', '[from] move: Feed and Seed');
- if (target.status === 'slp') {
- target.cureStatus();
- }
- return;
- }
- },
- secondary: {
- chance: 100,
- self: {
- onHit() {
- this.field.setTerrain('grassyterrain');
- },
- },
- },
- target: "normal",
- type: "Grass",
- contestType: "Clever",
- },
- atombomb: {
- num: 69003,
- accuracy: 100,
- basePower: 150,
- category: "Special",
- name: "Atom Bomb",
- pp: 5,
- priority: 0,
- flags: {protect: 1, mirror: 1},
- selfdestruct: "always",
- secondary: null,
- target: "allAdjacent",
- type: "Nuclear",
- zMove: {basePower: 200},
- isNonstandard: "CAP",
- },
- radiation: {
- num: 487,
- accuracy: 100,
- basePower: 0,
- category: "Status",
- name: "Radiation",
- pp: 20,
- priority: 0,
- flags: {protect: 1, reflectable: 1, mirror: 1, mystery: 1},
- onHit(target) {
- if (target.getTypes().join() === 'Nuclear' || !target.setType('Nuclear')) {
- // Soak should animate even when it fails.
- // Returning false would suppress the animation.
- this.add('-fail', target);
- return null;
- }
- this.add('-start', target, 'typechange', 'Nuclear');
- },
- secondary: null,
- target: "normal",
- type: "Nuclear",
- zMove: {boost: {spa: 1}},
- contestType: "Cute",
- isNonstandard: "CAP",
- },
- meltdown: {
- num: 557,
- accuracy: 95,
- basePower: 35,
- category: "Physical",
- name: "Meltdown",
- pp: 5,
- priority: 0,
- flags: {contact: 1, protect: 1, mirror: 1},
- self: {
- boosts: {
- spe: -1,
- atk: -1,
- spa: -1,
- },
- },
- secondary: null,
- target: "normal",
- type: "Nuclear",
- zMove: {basePower: 220},
- contestType: "Cool",
- isNonstandard: "CAP",
- },
Add Comment
Please, Sign In to add comment