mirror of
https://github.com/smogon/pokemon-showdown.git
synced 2026-04-25 07:22:09 -05:00
SSB4: Bugfixes and balance changes (#7838)
This commit is contained in:
parent
4acb83acc7
commit
b73efd84ab
|
|
@ -113,17 +113,18 @@ export const Abilities: {[k: string]: ModdedAbilityData} = {
|
|||
this.add('-ability', source, 'Scyphozoa');
|
||||
this.add('-clearallboost');
|
||||
for (const pokemon of this.getAllActive()) {
|
||||
const boostTotal = Object.values(pokemon.boosts).reduce((num, add) => num + add);
|
||||
if (boostTotal !== 0) successes++;
|
||||
pokemon.clearBoosts();
|
||||
successes++;
|
||||
if (pokemon.removeVolatile('substitute')) successes++;
|
||||
}
|
||||
const target = source.side.foe.active[0];
|
||||
|
||||
const removeAll = [
|
||||
'reflect', 'lightscreen', 'auroraveil', 'safeguard', 'mist', 'gmaxsteelsurge', 'ferrofluid',
|
||||
'spikes', 'toxicspikes', 'stealthrock', 'shiftingrocks', 'stickyweb',
|
||||
'reflect', 'lightscreen', 'auroraveil', 'safeguard', 'mist', 'gmaxsteelsurge',
|
||||
'spikes', 'toxicspikes', 'stealthrock', 'stickyweb',
|
||||
];
|
||||
const silentRemove = ['reflect', 'lightscreen', 'auroraveil', 'safeguard', 'mist', 'shiftingrocks', 'ferrofluid'];
|
||||
const silentRemove = ['reflect', 'lightscreen', 'auroraveil', 'safeguard', 'mist'];
|
||||
for (const sideCondition of removeAll) {
|
||||
if (target.side.removeSideCondition(sideCondition)) {
|
||||
if (!silentRemove.includes(sideCondition)) {
|
||||
|
|
@ -681,6 +682,7 @@ export const Abilities: {[k: string]: ModdedAbilityData} = {
|
|||
name: "Bipolar",
|
||||
isPermanent: true,
|
||||
onSwitchIn(pokemon) {
|
||||
if (pokemon.species.baseSpecies !== 'Kartana') return;
|
||||
const typeMap: {[key: string]: string} = {
|
||||
Normal: "Return",
|
||||
Fighting: "Sacred Sword",
|
||||
|
|
@ -809,7 +811,7 @@ export const Abilities: {[k: string]: ModdedAbilityData} = {
|
|||
desc: "If this Pokemon uses a status move or a custom move, it changes its typing and boosts one of its stats by 1 stage randomly between four options: Bug/Fire type with a Special Attack boost, Bug/Steel type with a Defense boost, Bug/Rock type with a Special Defense boost, and Bug/Electric type with a Speed boost.",
|
||||
shortDesc: "On use of status or custom, this Pokemon changes type and gets a boost.",
|
||||
isPermanent: true,
|
||||
onPrepareHit(source, target, move) {
|
||||
onBeforeMove(source, target, move) {
|
||||
if (move.category !== "Status" && move.isNonstandard !== "Custom") return;
|
||||
const types = ['Fire', 'Steel', 'Rock', 'Electric'];
|
||||
const type = ['Bug', this.sample(types)];
|
||||
|
|
@ -914,10 +916,22 @@ export const Abilities: {[k: string]: ModdedAbilityData} = {
|
|||
},
|
||||
|
||||
// grimAuxiliatrix
|
||||
biosteel: {
|
||||
desc: "This Pokemon restores 1/3 of its maximum HP, rounded down, when it switches out, and other Pokemon cannot lower this Pokemon's stat stages.",
|
||||
shortDesc: "Regenerator + Clear Body.",
|
||||
name: "Bio-steel",
|
||||
aluminumalloy: {
|
||||
desc: "This Pokemon restores 1/3 of its maximum HP, rounded down, when it switches out, and other Pokemon cannot lower this Pokemon's stat stages. -1 Speed, +1 Def/Sp.Def when hit with a Water-type attacking move or switching into rain.",
|
||||
shortDesc: "Regenerator+Clear Body.+1 def/spd,-1 spe in rain/hit by water",
|
||||
name: "Aluminum Alloy",
|
||||
onSwitchIn(pokemon) {
|
||||
if (['raindance', 'primordialsea'].includes(pokemon.effectiveWeather())) {
|
||||
this.boost({def: 1, spd: 1, spe: -1}, pokemon, pokemon);
|
||||
this.add('-message', `grimAuxiliatrix is rusting...`);
|
||||
}
|
||||
},
|
||||
onDamagingHit(damage, target, source, move) {
|
||||
if (move.type === 'Water') {
|
||||
this.boost({def: 1, spd: 1, spe: -1}, target, target);
|
||||
this.add('-message', `grimAuxiliatrix is rusting...`);
|
||||
}
|
||||
},
|
||||
onSwitchOut(pokemon) {
|
||||
pokemon.heal(pokemon.baseMaxhp / 3);
|
||||
},
|
||||
|
|
@ -932,7 +946,7 @@ export const Abilities: {[k: string]: ModdedAbilityData} = {
|
|||
}
|
||||
}
|
||||
if (showMsg && !(effect as ActiveMove).secondaries && effect.id !== 'octolock') {
|
||||
this.add("-fail", target, "unboost", "[from] ability: Bio-steel", "[of] " + target);
|
||||
this.add("-fail", target, "unboost", "[from] ability: Aluminum Alloy", "[of] " + target);
|
||||
}
|
||||
},
|
||||
isNonstandard: "Custom",
|
||||
|
|
@ -1227,7 +1241,8 @@ export const Abilities: {[k: string]: ModdedAbilityData} = {
|
|||
for (const source of this.effectData.sources) {
|
||||
if (!source.hp || source.volatiles['gastroacid']) continue;
|
||||
if (!alreadyAdded) {
|
||||
this.add('-activate', pokemon, 'ability: Degenerator');
|
||||
const foe = pokemon.side.foe.active[0];
|
||||
if (foe) this.add('-activate', foe, 'ability: Degenerator');
|
||||
alreadyAdded = true;
|
||||
}
|
||||
this.damage((pokemon.baseMaxhp * 33) / 100, pokemon);
|
||||
|
|
@ -1621,16 +1636,12 @@ export const Abilities: {[k: string]: ModdedAbilityData} = {
|
|||
},
|
||||
onResidual(pokemon) {
|
||||
if (!pokemon.hp) return;
|
||||
const moves = Object.values(pokemon.getMoves()).map(move => move.id);
|
||||
const types: string[] = [];
|
||||
for (const move of moves) {
|
||||
types.push(this.dex.getMove(move).type);
|
||||
const types = pokemon.moveSlots.map(slot => this.dex.getMove(slot.id).type);
|
||||
const type = types.length ? this.sample(types) : '???';
|
||||
if (pokemon.setType(type)) {
|
||||
this.add('-ability', pokemon, 'Wild Magic Surge');
|
||||
this.add('-start', pokemon, 'typechange', type);
|
||||
}
|
||||
let type = this.sample(types);
|
||||
while (!pokemon.setType(type)) {
|
||||
type = this.sample(types);
|
||||
}
|
||||
this.add('-start', pokemon, 'typechange', type);
|
||||
},
|
||||
isNonstandard: "Custom",
|
||||
gen: 8,
|
||||
|
|
@ -2328,4 +2339,22 @@ export const Abilities: {[k: string]: ModdedAbilityData} = {
|
|||
}
|
||||
},
|
||||
},
|
||||
// Modified Stakeout for Hubriz to have a failsafe
|
||||
stakeout: {
|
||||
inherit: true,
|
||||
onModifyAtkPriority: 5,
|
||||
onModifyAtk(atk, attacker, defender) {
|
||||
if (!defender?.activeTurns) {
|
||||
this.debug('Stakeout boost');
|
||||
return this.chainModify(2);
|
||||
}
|
||||
},
|
||||
onModifySpAPriority: 5,
|
||||
onModifySpA(atk, attacker, defender) {
|
||||
if (!defender?.activeTurns) {
|
||||
this.debug('Stakeout boost');
|
||||
return this.chainModify(2);
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
|
|
|
|||
|
|
@ -2181,7 +2181,7 @@ export const Conditions: {[k: string]: ModdedConditionData & {innateName?: strin
|
|||
if (this.field.terrain) {
|
||||
this.add(`-message`, 'The Turbulence blew away the terrain!');
|
||||
}
|
||||
const silentRemove = ['reflect', 'lightscreen', 'auroraveil', 'safeguard', 'mist', 'shiftingrocks', 'ferrofluid'];
|
||||
const silentRemove = ['reflect', 'lightscreen', 'auroraveil', 'safeguard', 'mist'];
|
||||
for (const side of this.sides) {
|
||||
const keys = Object.keys(side.sideConditions);
|
||||
for (const key of keys) {
|
||||
|
|
|
|||
|
|
@ -147,7 +147,7 @@ export const Moves: {[k: string]: ModdedMoveData} = {
|
|||
this.add('-end', pokemon, 'Leech Seed', '[from] move: Skystriker', '[of] ' + pokemon);
|
||||
}
|
||||
const sideConditions = [
|
||||
'spikes', 'toxicspikes', 'stealthrock', 'shiftingrocks', 'stickyweb', 'ferrofluid', 'gmaxsteelsurge',
|
||||
'spikes', 'toxicspikes', 'stealthrock', 'stickyweb', 'gmaxsteelsurge',
|
||||
];
|
||||
for (const condition of sideConditions) {
|
||||
if (pokemon.hp && pokemon.side.removeSideCondition(condition)) {
|
||||
|
|
@ -163,7 +163,7 @@ export const Moves: {[k: string]: ModdedMoveData} = {
|
|||
this.add('-end', pokemon, 'Leech Seed', '[from] move: Skystriker', '[of] ' + pokemon);
|
||||
}
|
||||
const sideConditions = [
|
||||
'spikes', 'toxicspikes', 'stealthrock', 'shiftingrocks', 'stickyweb', 'ferrofluid', 'gmaxsteelsurge',
|
||||
'spikes', 'toxicspikes', 'stealthrock', 'stickyweb', 'gmaxsteelsurge',
|
||||
];
|
||||
for (const condition of sideConditions) {
|
||||
if (pokemon.hp && pokemon.side.removeSideCondition(condition)) {
|
||||
|
|
@ -448,10 +448,10 @@ export const Moves: {[k: string]: ModdedMoveData} = {
|
|||
},
|
||||
onHit(target, source, move) {
|
||||
const removeAll = [
|
||||
'reflect', 'lightscreen', 'auroraveil', 'ferrofluid', 'safeguard', 'mist',
|
||||
'spikes', 'toxicspikes', 'stealthrock', 'shiftingrocks', 'stickyweb',
|
||||
'reflect', 'lightscreen', 'auroraveil', 'safeguard', 'mist',
|
||||
'spikes', 'toxicspikes', 'stealthrock', 'stickyweb',
|
||||
];
|
||||
const silentRemove = ['reflect', 'lightscreen', 'auroraveil', 'safeguard', 'mist', 'shiftingrocks', 'ferrofluid'];
|
||||
const silentRemove = ['reflect', 'lightscreen', 'auroraveil', 'safeguard', 'mist'];
|
||||
for (const sideCondition of removeAll) {
|
||||
if (target.side.removeSideCondition(sideCondition)) {
|
||||
if (!silentRemove.includes(sideCondition)) {
|
||||
|
|
@ -612,10 +612,10 @@ export const Moves: {[k: string]: ModdedMoveData} = {
|
|||
}
|
||||
this.add('-message', 'The battlefield suddenly flooded!');
|
||||
const removeAll = [
|
||||
'reflect', 'lightscreen', 'auroraveil', 'safeguard', 'mist', 'spikes', 'shiftingrocks',
|
||||
'toxicspikes', 'stealthrock', 'stickyweb', 'ferrofluid', 'gmaxsteelsurge',
|
||||
'reflect', 'lightscreen', 'auroraveil', 'safeguard', 'mist', 'spikes',
|
||||
'toxicspikes', 'stealthrock', 'stickyweb', 'gmaxsteelsurge',
|
||||
];
|
||||
const silentRemove = ['reflect', 'lightscreen', 'auroraveil', 'safeguard', 'mist', 'shiftingrocks', 'ferrofluid'];
|
||||
const silentRemove = ['reflect', 'lightscreen', 'auroraveil', 'safeguard', 'mist'];
|
||||
for (const sideCondition of removeAll) {
|
||||
if (source.side.foe.removeSideCondition(sideCondition)) {
|
||||
if (!silentRemove.includes(sideCondition)) {
|
||||
|
|
@ -1971,90 +1971,34 @@ export const Moves: {[k: string]: ModdedMoveData} = {
|
|||
},
|
||||
|
||||
// grimAuxiliatrix
|
||||
fuelleak: {
|
||||
accuracy: true,
|
||||
basePower: 50,
|
||||
skyscrapersuplex: {
|
||||
accuracy: 100,
|
||||
basePower: 75,
|
||||
onBasePower(basePower, pokemon, target) {
|
||||
if (target?.statsRaisedThisTurn) {
|
||||
return this.chainModify(2);
|
||||
}
|
||||
},
|
||||
category: "Special",
|
||||
desc: "Summons ferrofluid to the user's side, which is a positive entry hazard that heals Pokemon by 25% of their maximum HP when they switch in.",
|
||||
shortDesc: "Sets Ferrofluid on user's side.",
|
||||
name: "Fuel Leak",
|
||||
desc: "Power doubles if the target had a stat stage raised this turn.",
|
||||
shortDesc: "2x power if the target that had a stat rise this turn.",
|
||||
name: "Skyscraper Suplex",
|
||||
isNonstandard: "Custom",
|
||||
gen: 8,
|
||||
pp: 10,
|
||||
pp: 15,
|
||||
priority: 0,
|
||||
flags: {protect: 1, mirror: 1},
|
||||
onTryMove(target) {
|
||||
onTryMove() {
|
||||
this.attrLastMove('[still]');
|
||||
},
|
||||
onPrepareHit(target, source) {
|
||||
this.add('-anim', source, 'Steel Beam', target);
|
||||
},
|
||||
onAfterMoveSecondarySelf(source, target) {
|
||||
source.side.addSideCondition('ferrofluid');
|
||||
},
|
||||
secondary: null,
|
||||
target: "normal",
|
||||
type: "Steel",
|
||||
},
|
||||
|
||||
// for grimAuxiliatrix's move
|
||||
ferrofluid: {
|
||||
accuracy: true,
|
||||
basePower: 0,
|
||||
category: "Status",
|
||||
desc: "Positive entry hazard that heals Pokemon by 25% of their maximum HP when they switch in.",
|
||||
shortDesc: "Heals 25% on switch in.",
|
||||
name: "Ferrofluid",
|
||||
isNonstandard: "Custom",
|
||||
gen: 8,
|
||||
pp: 15,
|
||||
priority: 0,
|
||||
flags: {reflectable: 1},
|
||||
onTryMove() {
|
||||
this.attrLastMove('[still]');
|
||||
},
|
||||
onPrepareHit(target, source) {
|
||||
this.add('-anim', source, 'Acid Downpour', target);
|
||||
},
|
||||
sideCondition: 'ferrofluid',
|
||||
condition: {
|
||||
// this is a side condition
|
||||
onStart(side) {
|
||||
if (this.field.isTerrain('waveterrain')) {
|
||||
this.add('-message', `Wave Terrain prevented Ferrofluid from starting!`);
|
||||
return null;
|
||||
}
|
||||
this.add('-sidestart', side, 'Ferrofluid');
|
||||
this.add("-message", `Ferrofluid was spilled!`);
|
||||
this.effectData.layers = 1;
|
||||
},
|
||||
onRestart(side) {
|
||||
if (this.effectData.layers >= 3) return false;
|
||||
this.add('-sidestart', side, 'Ferrofluid');
|
||||
this.effectData.layers++;
|
||||
},
|
||||
onSwitchIn(pokemon) {
|
||||
// Can be used by pokemon with boots.
|
||||
if (this.heal(pokemon.baseMaxhp / 4)) {
|
||||
this.add("-message", `Magnetized particles mend your wounds!`);
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
this.effectData.layers--;
|
||||
if (this.effectData.layers < 1) {
|
||||
pokemon.side.removeSideCondition(`ferrofluid`);
|
||||
}
|
||||
},
|
||||
onEnd(side) {
|
||||
this.add('-sideend', side, 'move: Ferrofluid');
|
||||
this.add('-message', `The Ferrofuild disappeared.`);
|
||||
},
|
||||
},
|
||||
secondary: null,
|
||||
target: "foeSide",
|
||||
type: "Steel",
|
||||
},
|
||||
|
||||
// HoeenHero
|
||||
landfall: {
|
||||
accuracy: 100,
|
||||
|
|
@ -2665,6 +2609,7 @@ export const Moves: {[k: string]: ModdedMoveData} = {
|
|||
this.add('-anim', source, 'Focus Energy', source);
|
||||
},
|
||||
onHit(target, pokemon, move) {
|
||||
if (pokemon.volatiles['kipup']) return false;
|
||||
pokemon.addVolatile('kipup');
|
||||
},
|
||||
condition: {
|
||||
|
|
@ -2673,6 +2618,7 @@ export const Moves: {[k: string]: ModdedMoveData} = {
|
|||
this.add('-message', 'This Pokémon prepares itself to be knocked down!');
|
||||
},
|
||||
onHit(pokemon, source, move) {
|
||||
if (!pokemon.hp) return;
|
||||
if (this.effectData.gotHit) return;
|
||||
if (pokemon.side !== source.side && move.category !== 'Status') {
|
||||
this.effectData.gotHit = true;
|
||||
|
|
@ -2700,8 +2646,8 @@ export const Moves: {[k: string]: ModdedMoveData} = {
|
|||
accuracy: true,
|
||||
basePower: 100,
|
||||
category: "Special",
|
||||
desc: "The user changes into a random Pokemon with a first name letter that matches the forme Unown is currently in (A -> Alakazam, etc) that has base stats that would benefit from Unown's EV/IV/Nature spread and moves. Using it while in a forme that is not Unown will make it revert back to the Unown forme it transformed in (If an Unown transforms into Alakazam, it'll transform back to Unown-A when used again). Light of Ruin becomes Strange Steam, Psystrike becomes Psyshock, Secret Sword becomes Aura Sphere, Mind Blown becomes Flamethrower, and Seed Flare becomes Apple Acid while in a non-Unown forme.",
|
||||
shortDesc: "Transform into Unown. Unown: Transform to mon.",
|
||||
desc: "The user changes into a random Pokemon with a first name letter that matches the forme Unown is currently in (A -> Alakazam, etc) that has base stats that would benefit from Unown's EV/IV/Nature spread and moves. Using it while in a forme that is not Unown will make it revert back to the Unown forme it transformed in (If an Unown transforms into Alakazam, it'll transform back to Unown-A when used again). Light of Ruin becomes Strange Steam, Psystrike becomes Psyshock, Secret Sword becomes Aura Sphere, Mind Blown becomes Flamethrower, and Seed Flare becomes Apple Acid while in a non-Unown forme. This move's type varies based on the user's primary type.",
|
||||
shortDesc: "Transform into Unown/mon. Type=user 1st type.",
|
||||
name: "Alphabet Soup",
|
||||
isNonstandard: "Custom",
|
||||
gen: 8,
|
||||
|
|
@ -2862,10 +2808,10 @@ export const Moves: {[k: string]: ModdedMoveData} = {
|
|||
onHit(target, source, move) {
|
||||
let success = false;
|
||||
const removeAll = [
|
||||
'reflect', 'lightscreen', 'auroraveil', 'ferrofluid', 'safeguard', 'mist',
|
||||
'spikes', 'toxicspikes', 'stealthrock', 'shiftingrocks', 'stickyweb',
|
||||
'reflect', 'lightscreen', 'auroraveil', 'safeguard', 'mist',
|
||||
'spikes', 'toxicspikes', 'stealthrock', 'stickyweb',
|
||||
];
|
||||
const silentRemove = ['reflect', 'lightscreen', 'auroraveil', 'safeguard', 'mist', 'shiftingrocks', 'ferrofluid'];
|
||||
const silentRemove = ['reflect', 'lightscreen', 'auroraveil', 'safeguard', 'mist'];
|
||||
for (const sideCondition of removeAll) {
|
||||
if (target.side.removeSideCondition(sideCondition)) {
|
||||
if (!silentRemove.includes(sideCondition)) {
|
||||
|
|
@ -2895,8 +2841,8 @@ export const Moves: {[k: string]: ModdedMoveData} = {
|
|||
accuracy: true,
|
||||
basePower: 0,
|
||||
category: "Status",
|
||||
desc: "If this Pokemon does not take damage this turn, it switches out to another Pokemon in the party and gives it the Download boost. Fails otherwise.",
|
||||
shortDesc: "Focus: switch out, next Pokemon Downloads.",
|
||||
desc: "If this Pokemon does not take damage this turn, it switches out to another Pokemon in the party and gives it a boost corresponding to its highest stat. Fails otherwise.",
|
||||
shortDesc: "Focus: switch out, next Pokemon Beast Boosts.",
|
||||
name: "/nexthunt",
|
||||
pp: 10,
|
||||
priority: -6,
|
||||
|
|
@ -3355,7 +3301,7 @@ export const Moves: {[k: string]: ModdedMoveData} = {
|
|||
this.add('-anim', source, 'Parting Shot', target);
|
||||
},
|
||||
onHit(target, source) {
|
||||
target.setStatus('brn', source, null, true);
|
||||
target.trySetStatus('brn', source);
|
||||
},
|
||||
self: {
|
||||
sideCondition: 'givewistfulthinking',
|
||||
|
|
@ -3399,7 +3345,7 @@ export const Moves: {[k: string]: ModdedMoveData} = {
|
|||
},
|
||||
onAfterHit(target, pokemon) {
|
||||
const sideConditions = [
|
||||
'spikes', 'toxicspikes', 'stealthrock', 'shiftingrocks', 'stickyweb', 'ferrofluid', 'gmaxsteelsurge',
|
||||
'spikes', 'toxicspikes', 'stealthrock', 'stickyweb', 'gmaxsteelsurge',
|
||||
];
|
||||
for (const condition of sideConditions) {
|
||||
if (pokemon.hp && pokemon.side.removeSideCondition(condition)) {
|
||||
|
|
@ -3412,7 +3358,7 @@ export const Moves: {[k: string]: ModdedMoveData} = {
|
|||
},
|
||||
onAfterSubDamage(damage, target, pokemon) {
|
||||
const sideConditions = [
|
||||
'spikes', 'toxicspikes', 'stealthrock', 'shiftingrocks', 'stickyweb', 'ferrofluid', 'gmaxsteelsurge',
|
||||
'spikes', 'toxicspikes', 'stealthrock', 'stickyweb', 'gmaxsteelsurge',
|
||||
];
|
||||
for (const condition of sideConditions) {
|
||||
if (pokemon.hp && pokemon.side.removeSideCondition(condition)) {
|
||||
|
|
@ -3502,69 +3448,42 @@ export const Moves: {[k: string]: ModdedMoveData} = {
|
|||
},
|
||||
|
||||
// Perish Song
|
||||
shiftingrocks: {
|
||||
accuracy: true,
|
||||
basePower: 0,
|
||||
category: "Status",
|
||||
desc: "Entry Hazard. The damage is static for all types, (doesn't factor type effectiveness of rock) and is equal to (7+n)%, n being the number of times a Pokemon takes damage from the hazard. Starts at 0 and caps at 10. After 10 turns, (when the damage reaches 17%) Shifting Rocks explode (disappear) and deal 80-Base Power Rock-type damage to the foe.",
|
||||
shortDesc: "Hazard: ramps up damage then explodes.",
|
||||
name: "Shifting Rocks",
|
||||
trickery: {
|
||||
accuracy: 85,
|
||||
basePower: 100,
|
||||
category: "Physical",
|
||||
desc: "Changes the target's item to something random.",
|
||||
shortDesc: "Changes the target's item to something random.",
|
||||
name: "Trickery",
|
||||
isNonstandard: "Custom",
|
||||
gen: 8,
|
||||
pp: 15,
|
||||
pp: 10,
|
||||
priority: 0,
|
||||
flags: {reflectable: 1},
|
||||
flags: {protect: 1, mirror: 1},
|
||||
onTryMove() {
|
||||
this.attrLastMove('[still]');
|
||||
},
|
||||
onPrepareHit(target, source) {
|
||||
this.add('-anim', source, 'Stealth Rock', target);
|
||||
this.add('-anim', source, 'Stealth Rock', target);
|
||||
this.add('-anim', source, "Amnesia", source);
|
||||
this.add('-anim', source, "Trick", target);
|
||||
},
|
||||
sideCondition: 'shiftingrocks',
|
||||
condition: {
|
||||
// this is a side condition
|
||||
onStart(side) {
|
||||
if (this.field.isTerrain('waveterrain')) {
|
||||
this.add('-message', `Wave Terrain prevented Shifting Rocks from starting!`);
|
||||
return null;
|
||||
onHit(target, source, effect) {
|
||||
const item = target.takeItem(source);
|
||||
if (!target.item) {
|
||||
if (item) this.add('-enditem', target, item.name, '[from] move: Trickery', '[of] ' + source);
|
||||
const items = Object.keys(this.dex.data.Items).map(obj => this.dex.getItem(obj).name);
|
||||
let randomItem = '';
|
||||
if (items.length) randomItem = this.sample(items);
|
||||
if (!randomItem) {
|
||||
return;
|
||||
}
|
||||
this.add('-sidestart', side, 'Shifting Rocks');
|
||||
this.add("-message", `Shifting Rocks were set!`);
|
||||
this.effectData.damage = 7;
|
||||
},
|
||||
onSwitchIn(pokemon) {
|
||||
if (pokemon.hasItem('heavydutyboots')) return;
|
||||
if (this.effectData.damage >= 17) {
|
||||
const activeMove = {
|
||||
id: 'rocks' as ID,
|
||||
basePower: 80,
|
||||
type: 'Rock',
|
||||
category: 'Physical',
|
||||
willCrit: false,
|
||||
};
|
||||
const damage = this.getDamage(pokemon, pokemon, activeMove as ActiveMove);
|
||||
if (typeof damage !== 'number') throw new Error("Shifting Rocks damage not dealt");
|
||||
if (this.damage(damage)) {
|
||||
this.add('-message', `${pokemon.name} was hurt by the shifting rocks!`);
|
||||
}
|
||||
this.effectData.damage = 7;
|
||||
pokemon.side.removeSideCondition(`shiftingrocks`);
|
||||
return false;
|
||||
if (target.setItem(randomItem)) {
|
||||
this.add('-item', target, randomItem, '[from] move: Trickery', '[of] ' + source);
|
||||
}
|
||||
if (this.damage(this.effectData.damage * pokemon.maxhp / 100)) {
|
||||
this.add('-message', `${pokemon.name} was hurt by the shifting rocks!`);
|
||||
}
|
||||
this.effectData.damage++;
|
||||
},
|
||||
onEnd(side) {
|
||||
this.add('-sideend', side, 'move: Shifting Rocks');
|
||||
this.add("-message", `The Shifting Rocks were removed!`);
|
||||
},
|
||||
}
|
||||
},
|
||||
secondary: null,
|
||||
target: "foeSide",
|
||||
type: "Rock",
|
||||
target: "normal",
|
||||
type: "Ground",
|
||||
},
|
||||
|
||||
// phiwings99
|
||||
|
|
@ -4471,7 +4390,7 @@ export const Moves: {[k: string]: ModdedMoveData} = {
|
|||
},
|
||||
category: "Physical",
|
||||
desc: "If the move hits, the user gains +1 Speed. This move deals not very effective damage to Flying-type Pokemon. This move fails if the target does not intend to attack.",
|
||||
shortDesc: "+1 Spe on hit. Fails if target doesnt attack.",
|
||||
shortDesc: "+1 Spe on hit. Fails if target doesn't attack.",
|
||||
name: "Legendary Swordsman",
|
||||
isNonstandard: "Custom",
|
||||
gen: 8,
|
||||
|
|
@ -4805,7 +4724,7 @@ export const Moves: {[k: string]: ModdedMoveData} = {
|
|||
accuracy: true,
|
||||
basePower: 0,
|
||||
category: "Status",
|
||||
desc: "25% chance of setting up a layer of spikes. 25% chance of using Heal Bell. 25% chance of using Leech Seed. 25% chance of using Tailwind. 25% chance of using Octolock.",
|
||||
desc: "40% chance of setting up a layer of spikes. 40% chance of using Heal Bell. 40% chance of using Leech Seed. 40% chance of using Tailwind. 40% chance of using Octolock.",
|
||||
shortDesc: "5 independent chances of rolling different effects.",
|
||||
name: "Right. On. Cue!",
|
||||
isNonstandard: "Custom",
|
||||
|
|
@ -5495,139 +5414,6 @@ export const Moves: {[k: string]: ModdedMoveData} = {
|
|||
inherit: true,
|
||||
desc: "Deals damage two turns after this move is used. At the end of that turn, the damage is calculated at that time and dealt to the Pokemon at the position the target had when the move was used. If the user is no longer active at the time, damage is calculated based on the user's natural Special Attack stat, types, and level, with no boosts from its held item or Ability. Fails if this move, Doom Desire, or Disconnect is already in effect for the target's position.",
|
||||
},
|
||||
// For shifting rocks compatibility
|
||||
defog: {
|
||||
inherit: true,
|
||||
onHit(target, source, move) {
|
||||
let success = false;
|
||||
if (!target.volatiles['substitute'] || move.infiltrates) success = !!this.boost({evasion: -1});
|
||||
const removeTarget = [
|
||||
'reflect', 'lightscreen', 'auroraveil', 'safeguard', 'mist', 'spikes', 'toxicspikes', 'stealthrock', 'shiftingrocks', 'stickyweb', 'ferrofluid', 'gmaxsteelsurge',
|
||||
];
|
||||
const removeAll = [
|
||||
'spikes', 'toxicspikes', 'stealthrock', 'shiftingrocks', 'stickyweb', 'ferrofluid', 'gmaxsteelsurge',
|
||||
];
|
||||
for (const targetCondition of removeTarget) {
|
||||
if (target.side.removeSideCondition(targetCondition)) {
|
||||
if (!removeAll.includes(targetCondition)) continue;
|
||||
this.add('-sideend', target.side, this.dex.getEffect(targetCondition).name, '[from] move: Defog', '[of] ' + source);
|
||||
success = true;
|
||||
}
|
||||
}
|
||||
for (const sideCondition of removeAll) {
|
||||
if (source.side.removeSideCondition(sideCondition)) {
|
||||
this.add('-sideend', source.side, this.dex.getEffect(sideCondition).name, '[from] move: Defog', '[of] ' + source);
|
||||
success = true;
|
||||
}
|
||||
}
|
||||
this.field.clearTerrain();
|
||||
return success;
|
||||
},
|
||||
},
|
||||
rapidspin: {
|
||||
inherit: true,
|
||||
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',
|
||||
'shiftingrocks', 'stickyweb', 'ferrofluid', 'gmaxsteelsurge'];
|
||||
for (const condition of sideConditions) {
|
||||
if (pokemon.hp && pokemon.side.removeSideCondition(condition)) {
|
||||
this.add('-sideend', pokemon.side, this.dex.getEffect(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',
|
||||
'shiftingrocks', 'stickyweb', 'ferrofluid', 'gmaxsteelsurge'];
|
||||
for (const condition of sideConditions) {
|
||||
if (pokemon.hp && pokemon.side.removeSideCondition(condition)) {
|
||||
this.add('-sideend', pokemon.side, this.dex.getEffect(condition).name, '[from] move: Rapid Spin', '[of] ' + pokemon);
|
||||
}
|
||||
}
|
||||
if (pokemon.hp && pokemon.volatiles['partiallytrapped']) {
|
||||
pokemon.removeVolatile('partiallytrapped');
|
||||
}
|
||||
},
|
||||
},
|
||||
courtchange: {
|
||||
inherit: true,
|
||||
onHitField(target, source) {
|
||||
const sourceSide = source.side;
|
||||
const targetSide = source.side.foe;
|
||||
const sideConditions = [
|
||||
'mist', 'lightscreen', 'reflect', 'spikes', 'safeguard', 'tailwind', 'toxicspikes', 'stealthrock', 'shiftingrocks', 'waterpledge', 'firepledge', 'grasspledge', 'stickyweb', 'ferrofluid', 'auroraveil', 'gmaxsteelsurge', 'gmaxcannonade', 'gmaxvinelash', 'gmaxwildfire',
|
||||
];
|
||||
let success = false;
|
||||
for (const id of sideConditions) {
|
||||
const effectName = this.dex.getEffect(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: Court Change');
|
||||
},
|
||||
},
|
||||
gmaxwindrage: {
|
||||
inherit: true,
|
||||
self: {
|
||||
onHit(source) {
|
||||
let success = false;
|
||||
const removeTarget = [
|
||||
'reflect', 'lightscreen', 'auroraveil', 'safeguard', 'mist', 'spikes', 'toxicspikes', 'stealthrock', 'shiftingrocks', 'stickyweb', 'ferrofluid', 'gmaxsteelsurge',
|
||||
];
|
||||
const removeAll = [
|
||||
'spikes', 'toxicspikes', 'stealthrock', 'shiftingrocks', 'stickyweb', 'ferrofluid', 'gmaxsteelsurge',
|
||||
];
|
||||
for (const targetCondition of removeTarget) {
|
||||
if (source.side.foe.removeSideCondition(targetCondition)) {
|
||||
if (!removeAll.includes(targetCondition)) continue;
|
||||
this.add('-sideend', source.side.foe, this.dex.getEffect(targetCondition).name, '[from] move: G-Max Wind Rage', '[of] ' + source);
|
||||
success = true;
|
||||
}
|
||||
}
|
||||
for (const sideCondition of removeAll) {
|
||||
if (source.side.removeSideCondition(sideCondition)) {
|
||||
this.add('-sideend', source.side, this.dex.getEffect(sideCondition).name, '[from] move: G-Max Wind Rage', '[of] ' + source);
|
||||
success = true;
|
||||
}
|
||||
}
|
||||
this.field.clearTerrain();
|
||||
return success;
|
||||
},
|
||||
},
|
||||
},
|
||||
// Terrain Pulse for consistency
|
||||
terrainpulse: {
|
||||
inherit: true,
|
||||
|
|
|
|||
|
|
@ -330,9 +330,9 @@ export const ssbSets: SSBSets = {
|
|||
evs: {hp: 68, atk: 252, spe: 188}, nature: 'Adamant',
|
||||
},
|
||||
grimAuxiliatrix: {
|
||||
species: 'Duraludon', ability: 'Bio-steel', item: 'Assault Vest', gender: '',
|
||||
moves: [['Core Enforcer', 'Draco Meteor'], 'Flash Cannon', ['Thunderbolt', 'Fire Blast']],
|
||||
signatureMove: 'Fuel Leak',
|
||||
species: 'Duraludon', ability: 'Aluminum Alloy', item: 'Assault Vest', gender: '',
|
||||
moves: [['Core Enforcer', 'Draco Meteor'], 'Fire Blast', ['Thunderbolt', 'Earth Power']],
|
||||
signatureMove: 'Skyscraper Suplex',
|
||||
evs: {spa: 252, spd: 4, spe: 252}, nature: 'Timid',
|
||||
},
|
||||
HoeenHero: {
|
||||
|
|
@ -342,7 +342,7 @@ export const ssbSets: SSBSets = {
|
|||
evs: {spa: 252, spd: 4, spe: 252}, ivs: {atk: 0}, nature: 'Modest',
|
||||
},
|
||||
Hubriz: {
|
||||
species: 'Roserade', ability: 'Run Away', item: 'Rose Incense', gender: 'F',
|
||||
species: 'Roserade', ability: 'Stakeout', item: 'Rose Incense', gender: 'F',
|
||||
moves: [['Toxic Spikes', 'Spikes'], 'Leaf Storm', 'Sludge Bomb'],
|
||||
signatureMove: 'Steroid Anaphylaxia',
|
||||
evs: {def: 4, spa: 252, spe: 252}, ivs: {atk: 0}, nature: 'Timid',
|
||||
|
|
@ -571,8 +571,8 @@ export const ssbSets: SSBSets = {
|
|||
},
|
||||
'Perish Song': {
|
||||
species: 'Rhydon', ability: 'Soup Sipper', item: 'Rocky Helmet', gender: 'M',
|
||||
moves: ['Swords Dance', 'Rock Blast', 'Earthquake'],
|
||||
signatureMove: 'Shifting Rocks',
|
||||
moves: ['Swords Dance', 'Stealth Rock', 'Rock Blast'],
|
||||
signatureMove: 'Trickery',
|
||||
evs: {hp: 252, atk: 4, def: 252}, nature: 'Impish',
|
||||
},
|
||||
phiwings99: {
|
||||
|
|
@ -863,7 +863,7 @@ export const ssbSets: SSBSets = {
|
|||
species: 'Azelf', ability: 'Magic Bounce', item: ['Life Orb', 'Expert Belt'], gender: 'M',
|
||||
moves: ['Photon Geyser', 'Knock Off', ['U-turn', 'Play Rough', 'Close Combat']],
|
||||
signatureMove: 'Luck of the Draw',
|
||||
evs: {atk: 252, def: 4, spe: 252}, nature: 'Timid',
|
||||
evs: {atk: 252, def: 4, spe: 252}, nature: 'Jolly',
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user