rocketjump: {
num: 999,
accuracy: 100,
basePower: 60,
category: "Special",
name: "Rocket Jump",
desc: "Causes the Flying type to be added to the user, effectively making it have two or three types, unless the user is already a Flying type. If Forest's Curse or Trick-or-Treat adds a type to the user, it replaces the type added by this move and vice versa.",
shortDesc: "Adds Flying to user's type(s).",
pp: 20,
priority: 0,
flags: {protect: 1, mirror: 1, allyanim: 1, metronome: 1},
onHit(pokemon) {
if (pokemon.hasType('Flying')) return false;
if (!pokemon.addType('Flying')) return false;
this.add('-start', pokemon, 'typeadd', 'Flying', '[from] move: Rocket Jump');
},
secondary: null,
target: "normal",
type: "Fire",
contestType: "Tough",
},
marketgarden: {
num: 999,
accuracy: 95,
basePower: 80,
category: "Physical",
name: "Market Garden",
desc: "Fails unless the user is a Flying type. If this move is successful and the user is not Terastallized, the user's Flying type becomes typeless as long as it remains active. This move is always a critical hit unless the target is under the effect of Lucky Chant or has the Battle Armor or Shell Armor Abilities.",
shortDesc: "User's Flying type becomes typeless; must be Flying. Always results in a critical hit.",
pp: 10,
priority: 0,
flags: {contact: 1, protect: 1, mirror: 1, metronome: 1},
onTryMove(pokemon, target, move) {
if (pokemon.hasType('Flying')) return;
this.add('-fail', pokemon, 'move: Market Garden');
this.attrLastMove('[still]');
return null;
},
self: {
onHit(pokemon) {
pokemon.setType(pokemon.getTypes(true).map(type => type === "Flying" ? "???" : type));
this.add('-start', pokemon, 'typechange', pokemon.getTypes().join('/'), '[from] move: Market Garden');
},
},
willCrit: true,
secondary: null,
target: "normal",
type: "Flying",
contestType: "Cool",
},
necksnap: {
num: 999,
accuracy: true,
basePower: 170,
category: "Physical",
name: "NECK SNAP!",
pp: 1,
priority: 0,
flags: {contact: 1},
isZ: "soldieriumz",
secondary: {
chance: 100,
volatileStatus: 'confusion',
},
target: "normal",
type: "Fighting",
contestType: "Tough",
},
Tsubaki Yayoi (F) @ Choice Scarf
Ability: Justified
EVs: 252 Atk / 4 SpD / 252 Spe
Jolly Nature
- Close Combat
- Lux Aeterna
- Stone Edge / Triple Axel
- U-turn / Teleport
Tsubaki Yayoi (F) @ Izayoium Z / White Herb
Ability: Justified
EVs: 252 Atk / 4 SpD / 252 Spe
Adamant Nature
- Swords Dance
- Lux Aeterna
- Stone Edge / Triple Axel
- Sacred Sword / Close Combat
Tsubaki Yayoi-Izayoi (F) @ Izayoium Z / Eject Pack
Ability: Mode Change
EVs: 252 HP / 4 Atk / 252 SpD
Careful Nature
- Crusade Seraphim
- Wish
- King's Shield
- Teleport
Blaze (F) @ Choice Scarf
Ability: Blaze / Flash Fire
EVs: 252 Atk / 4 SpA / 252 Spe
Jolly Nature
- Flare Blitz
- Flare Chainsaw
- Leaf Blade / Knock Off
- U-turn / Superpower
Blaze (F) @ Choice Band
Ability: Flash Fire
EVs: 4 HP / 252 Atk / 252 Spe
Adamant Nature
- Flare Blitz
- Flare Chainsaw
- Leaf Blade
- U-turn / Parting Shot
Blaze (F) @ Blazinium Z / Air Balloon
Ability: Blaze / Flash Fire
EVs: 248 HP / 252 Atk / 8 SpD
Adamant / Careful Nature
- Flare Blitz
- Flare Chainsaw / Superpower
- Leaf Blade
- Swords Dance / Fake Out
Highmore (F) @ Choice Band
Ability: Levitate
EVs: 252 Atk / 4 Def / 252 Spe
Jolly Nature
- Foam Scythe
- Liquidation
- Icicle Spear / Stone Edge
- Flip Turn / Shadow Sneak
Highmore (F) @ Leftovers / Colbur Berry
Ability: Reaper / Regenerator
EVs: 248 HP / 8 SpA / 252 Def
Bold / Impish Nature
- Foam Scythe / Liquidation / Scald
- Haze / Flip Turn
- Pain Split
- Will-o-Wisp / Toxic / Haze
Highmore (F) @ Focus Sash / Custap Berry
Ability: Reaper
EVs: 4 Def / 252 SpD / 252 Spe
Jolly Nature
- Stealth Rock
- Shadow Sneak / Foam Scythe
- Memento / Destiny Bond
- Haze / Imprison
Saria (F) @ Life Orb / Leftovers
Ability: Rhine Chargesuit
EVs: 252 Atk / 4 SpD / 252 Spe
Jolly Nature
- Outrage
- Earthquake
- Iron Tail / Stone Edge
- Dragon Dance
Saria (F) @ Leftovers / Yache Berry
Ability: Rhine Chargesuit
EVs: 252 HP / 4 Def / 252 SpD
Careful Nature
- Dragon Tail
- Earthquake
- Knock Off
- Stealth Rock
pristineweaponry: {
onPrepareHit(source, target, move) {
if (this.effectState.pristineweaponry) return;
if (move.hasBounced || move.flags['futuremove'] || move.sourceEffect === 'snatch') return;
const type = move.type;
if (type && type !== '???' && source.getTypes().join() !== type) {
if (!source.setType(type)) return;
this.effectState.pristineweaponry = true;
this.add('-start', source, 'typechange', type, '[from] ability: Pristine Weaponry');
}
},
onSwitchIn(pokemon) {
delete this.effectState.pristineweaponry;
},
// airborneness implemented in sim/pokemon.js:Pokemon#isGrounded
flags: {},
name: "Pristine Weaponry",
rating: 4,
num: 168,
},
isGrounded(negateImmunity = false) {
if ('gravity' in this.battle.field.pseudoWeather) return true;
if ('ingrain' in this.volatiles && this.battle.gen >= 4) return true;
if ('smackdown' in this.volatiles) return true;
const item = (this.ignoringItem() ? '' : this.item);
if (item === 'ironball') return true;
// If a Fire/Flying type uses Burn Up and Roost, it becomes ???/Flying-type, but it's still grounded.
if (!negateImmunity && this.hasType('Flying') && !(this.hasType('???') && 'roost' in this.volatiles)) return false;
if ((this.hasAbility('levitate') && !this.battle.suppressingAbility(this)) || this.hasAbility('pristineweaponry')) return null;
if ('magnetrise' in this.volatiles) return false;
if ('telekinesis' in this.volatiles) return false;
return item !== 'airballoon';
}
gibdowings: {
onModifyAtkPriority: 5,
onModifyAtk(atk, attacker, defender, move) {
if (move.type === 'Flying') {
return this.chainModify(1.5);
}
},
onModifySpAPriority: 5,
onModifySpA(atk, attacker, defender, move) {
if (move.type === 'Flying') {
return this.chainModify(1.5);
}
},
onEffectiveness(typeMod, target, type, move) {
if (!['Electric','Flying'].includes(move.type)) return typeMod;
if (type === target.types[0] && move.type === 'Electric') return typeMod+1;
return 0;
},
onNegateImmunity(pokemon, type) {
if (type === 'Electric') return false;
},
isPermanent: true,
isUnbreakable: true,
name: "Gibdo Wings",
desc: "This Pokemon's offensive stat is multiplied by 1.5 while using a Flying-type attack. This Pokemon is neutral to Flying and weak to Electric.",
shortDesc: "Offensive stat 1.5x with Flying attacks. Neutral to Flying, weak to Electric.",
rating: 3,
}
crusaderscrossbow: {
num: 676,
accuracy: 100,
basePower: 90,
category: "Special",
name: "Crusader's Crossbow",
pp: 15,
priority: 0,
flags: {protect: 1, mirror: 1, allyanim: 1, metronome: 1},
onTryHit(target, source, move) {
if (source.isAlly(target)) {
move.basePower = 0;
move.infiltrates = true;
}
},
onTryMove(source, target, move) {
if (source.isAlly(target) && source.volatiles['healblock']) {
this.attrLastMove('[still]');
this.add('cant', source, 'move: Heal Block', move);
return false;
}
},
onHit(target, source, move) {
if (source.isAlly(target)) {
if (!this.heal(Math.floor(target.baseMaxhp * 0.5))) {
if (target.volatiles['healblock'] && target.hp !== target.maxhp) {
this.attrLastMove('[still]');
// Wrong error message, correct one not supported yet
this.add('cant', source, 'move: Heal Block', move);
} else {
this.add('-immune', target);
}
return this.NOT_FAIL;
}
}
},
secondary: null,
target: "normal",
type: "Psychic",
contestType: "Clever",
},
bonesaw: {
num: 400,
accuracy: 90,
basePower: 70,
category: "Physical",
name: "Bonesaw",
pp: 15,
priority: 0,
flags: {contact: 1, protect: 1, mirror: 1, metronome: 1, slicing: 1},
critRatio: 3,
secondary: null,
target: "normal",
type: "Dark",
contestType: "Cool",
},
spinaltap: {
num: 999,
accuracy: true,
basePower: 160,
category: "Physical",
name: "Spinal Tap",
pp: 1,
priority: 0,
flags: {},
selfBoost: {
boosts: {
atk: +1,
spa: +1,
},
},
isZ: "mediciniumz",
secondary: {},
target: "normal",
type: "Dark",
contestType: "Cool",
},
dreameater: {
num: 138,
accuracy: 100,
basePower: 100,
category: "Special",
name: "Dream Eater",
pp: 15,
priority: 0,
flags: {protect: 1, mirror: 1, heal: 1, metronome: 1},
drain: [1, 2],
onTryImmunity(target, source) {
return target.status === 'slp' || target.hasAbility('comatose') || pokemon.hasAbility('dreamwielder');
},
secondary: null,
target: "normal",
type: "Psychic",
contestType: "Clever",
},
hex: {
num: 506,
accuracy: 100,
basePower: 65,
basePowerCallback(pokemon, target, move) {
if (target.status || target.hasAbility('comatose') || pokemon.hasAbility('dreamwielder')) {
this.debug('BP doubled from status condition');
return move.basePower * 2;
}
return move.basePower;
},
infernalparade: {
num: 844,
accuracy: 100,
basePower: 60,
basePowerCallback(pokemon, target, move) {
if (target.status || target.hasAbility('comatose') || pokemon.hasAbility('dreamwielder')) return move.basePower * 2;
return move.basePower;
},
category: "Special",
name: "Infernal Parade",
pp: 15,
priority: 0,
flags: {protect: 1, mirror: 1, metronome: 1},
secondary: {
chance: 30,
status: 'brn',
},
target: "normal",
type: "Ghost",
},
rest: {
num: 156,
accuracy: true,
basePower: 0,
category: "Status",
name: "Rest",
pp: 5,
priority: 0,
flags: {snatch: 1, heal: 1, metronome: 1},
onTry(source) {
if (source.status === 'slp' || source.hasAbility('comatose') || source.hasAbility('dreamwielder')) return false;
if (source.hp === source.maxhp) {
this.add('-fail', source, 'heal');
return null;
}
if (source.hasAbility(['insomnia', 'vitalspirit'])) {
this.add('-fail', source, '[from] ability: ' + source.getAbility().name, '[of] ' + source);
return null;
}
},
onHit(target, source, move) {
const result = target.setStatus('slp', source, move);
if (!result) return result;
target.statusState.time = 3;
target.statusState.startTime = 3;
this.heal(target.maxhp); // Aesthetic only as the healing happens after you fall asleep in-game
},
secondary: null,
target: "self",
type: "Psychic",
zMove: {effect: 'clearnegativeboost'},
contestType: "Cute",
},
sleeptalk: {
num: 214,
accuracy: true,
basePower: 0,
category: "Status",
name: "Sleep Talk",
pp: 10,
priority: 0,
flags: {failencore: 1, nosleeptalk: 1, noassist: 1, failcopycat: 1, failmimic: 1, failinstruct: 1},
sleepUsable: true,
onTry(source) {
return source.status === 'slp' || source.hasAbility('comatose') || source.hasAbility('dreamwielder');
},
onHit(pokemon) {
const moves = [];
for (const moveSlot of pokemon.moveSlots) {
const moveid = moveSlot.id;
if (!moveid) continue;
const move = this.dex.moves.get(moveid);
if (move.flags['nosleeptalk'] || move.flags['charge'] || (move.isZ && move.basePower !== 1) || move.isMax) {
continue;
}
moves.push(moveid);
}
let randomMove = '';
if (moves.length) randomMove = this.sample(moves);
if (!randomMove) {
return false;
}
this.actions.useMove(randomMove, pokemon);
},
secondary: null,
target: "self",
type: "Normal",
zMove: {effect: 'crit2'},
contestType: "Cute",
},
snore: {
num: 173,
accuracy: 100,
basePower: 50,
category: "Special",
name: "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') || source.hasAbility('dreamwielder');
},
secondary: {
chance: 30,
volatileStatus: 'flinch',
},
target: "normal",
type: "Normal",
contestType: "Cute",
},
wakeupslap: {
num: 358,
accuracy: 100,
basePower: 70,
basePowerCallback(pokemon, target, move) {
if (target.status === 'slp' || target.hasAbility('comatose') || source.hasAbility('dreamwielder')) {
this.debug('BP doubled on sleeping target');
return move.basePower * 2;
}
return move.basePower;
},
category: "Physical",
isNonstandard: "Past",
name: "Wake-Up Slap",
pp: 10,
priority: 0,
flags: {contact: 1, protect: 1, mirror: 1, metronome: 1},
onHit(target) {
if (target.status === 'slp') target.cureStatus();
},
secondary: null,
target: "normal",
type: "Fighting",
contestType: "Tough",
},
nightmare: {
num: 171,
accuracy: 100,
basePower: 0,
category: "Status",
isNonstandard: "Past",
name: "Nightmare",
pp: 15,
priority: 0,
flags: {protect: 1, mirror: 1, metronome: 1},
volatileStatus: 'nightmare',
onTryHit(target, source, move) {
if (source.hasAbility('dreamwielder')) {
delete move.volatileStatus;
},
},
onHit(target, source, move) {
if (source.hasAbility('dreamwielder')) {
target.addVolatile('curse');
},
},
condition: {
noCopy: true,
onStart(pokemon) {
if (pokemon.status !== 'slp' && !pokemon.hasAbility('comatose')) {
return false;
}
this.add('-start', pokemon, 'Nightmare');
},
onResidualOrder: 11,
onResidual(pokemon) {
this.damage(pokemon.baseMaxhp / 4);
},
},
secondary: null,
target: "normal",
type: "Ghost",
zMove: {boost: {spa: 1}},
contestType: "Clever",
},