Jofthomas's picture
Jofthomas HF staff
Upload 4781 files
5c2ed06 verified
export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = {
gastroacid: {
inherit: true,
condition: {
// Ability suppression implemented in Pokemon.ignoringAbility() within sim/pokemon.js
onStart(pokemon) {
if (pokemon.hasItem('Ability Shield')) return false;
this.add('-endability', pokemon);
this.singleEvent('End', pokemon.getAbility(), pokemon.abilityState, pokemon, pokemon, 'gastroacid');
const keys = Object.keys(pokemon.volatiles).filter(x => x.startsWith("ability:"));
if (keys.length) {
for (const abil of keys) {
pokemon.removeVolatile(abil);
}
}
},
},
},
grudge: {
inherit: true,
condition: {
onStart(pokemon) {
this.add('-singlemove', pokemon, 'Grudge');
},
onFaint(target, source, effect) {
if (!source || source.fainted || !effect) return;
if (effect.effectType === 'Move' && !effect.flags['futuremove'] && source.lastMove) {
let move: Move = source.lastMove;
if (move.isMax && move.baseMove) move = this.dex.moves.get(move.baseMove);
for (const moveSlot of source.moveSlots) {
if (moveSlot.id === move.id) {
moveSlot.pp = 0;
if (!source.m.curMoves.includes(moveSlot.id) && source.m.trackPP.get(moveSlot.id)) {
source.m.trackPP.set(moveSlot.id, moveSlot.maxpp - moveSlot.pp);
}
this.add('-activate', source, 'move: Grudge', move.name);
}
}
}
},
onBeforeMovePriority: 100,
onBeforeMove(pokemon) {
this.debug('removing Grudge before attack');
pokemon.removeVolatile('grudge');
},
},
},
lunardance: {
inherit: true,
condition: {
onSwitchIn(target) {
this.singleEvent('Swap', this.effect, this.effectState, target);
},
onSwap(target) {
if (
!target.fainted && (
target.hp < target.maxhp ||
target.status ||
target.moveSlots.some(moveSlot => moveSlot.pp < moveSlot.maxpp)
)
) {
target.heal(target.maxhp);
target.clearStatus();
for (const moveSlot of target.moveSlots) {
moveSlot.pp = moveSlot.maxpp;
}
for (const key of target.m.trackPP.keys()) {
target.m.trackPP.set(key, 0);
}
this.add('-heal', target, target.getHealth, '[from] move: Lunar Dance');
target.side.removeSlotCondition(target, 'lunardance');
}
},
},
},
mimic: {
inherit: true,
onHit(target, source) {
const move = target.lastMove;
if (source.transformed || !move || move.flags['failmimic'] || source.moves.includes(move.id)) {
return false;
}
if (move.isZ || move.isMax) return false;
const mimicIndex = source.moves.indexOf('mimic');
if (mimicIndex < 0) return false;
if (!source.m.curMoves.includes('mimic')) return false;
const mimickedMove = {
move: move.name,
id: move.id,
pp: move.pp,
maxpp: move.pp,
target: move.target,
disabled: false,
used: false,
virtual: true,
};
source.moveSlots[mimicIndex] = mimickedMove;
source.m.curMoves[mimicIndex] = mimickedMove.id;
this.add('-start', source, 'Mimic', move.name);
},
},
sketch: {
inherit: true,
onHit(target, source) {
const disallowedMoves = ['chatter', 'sketch', 'struggle'];
const move = target.lastMove;
if (source.transformed || !move || source.moves.includes(move.id)) return false;
if (disallowedMoves.includes(move.id) || move.isZ || move.isMax) return false;
const sketchIndex = source.moves.indexOf('sketch');
if (sketchIndex < 0) return false;
if (!source.m.curMoves.includes('sketch')) return false;
const sketchedMove = {
move: move.name,
id: move.id,
pp: move.pp,
maxpp: move.pp,
target: move.target,
disabled: false,
used: false,
};
source.moveSlots[sketchIndex] = sketchedMove;
source.baseMoveSlots[sketchIndex] = sketchedMove;
source.m.curMoves[sketchIndex] = sketchedMove.id;
this.add('-activate', source, 'move: Sketch', move.name);
},
},
skillswap: {
inherit: true,
onHit(target, source, move) {
const targetAbility = target.getAbility();
const sourceAbility = source.getAbility();
const ally = source.side.active.find(mon => mon && mon !== source && !mon.fainted);
const foeAlly = target.side.active.find(mon => mon && mon !== target && !mon.fainted);
if (target.isAlly(source)) {
this.add('-activate', source, 'move: Skill Swap', '', '', `[of] ${target}`);
} else {
this.add('-activate', source, 'move: Skill Swap', targetAbility, sourceAbility, `[of] ${target}`);
}
this.singleEvent('End', sourceAbility, source.abilityState, source);
if (ally?.m.innate) {
ally.removeVolatile(ally.m.innate);
delete ally.m.innate;
}
this.singleEvent('End', targetAbility, target.abilityState, target);
if (foeAlly?.m.innate) {
foeAlly.removeVolatile(foeAlly.m.innate);
delete foeAlly.m.innate;
}
source.ability = targetAbility.id;
source.abilityState = this.initEffectState({ id: this.toID(source.ability), target: source });
if (source.m.innate?.endsWith(targetAbility.id)) {
source.removeVolatile(source.m.innate);
delete source.m.innate;
}
if (ally && ally.ability !== targetAbility.id) {
if (!source.m.innate) {
source.m.innate = 'ability:' + ally.getAbility().id;
source.addVolatile(source.m.innate);
}
ally.m.innate = 'ability:' + targetAbility.id;
ally.addVolatile(ally.m.innate);
}
target.ability = sourceAbility.id;
target.abilityState = this.initEffectState({ id: this.toID(target.ability), target });
if (target.m.innate?.endsWith(sourceAbility.id)) {
target.removeVolatile(target.m.innate);
delete target.m.innate;
}
if (foeAlly && foeAlly.ability !== sourceAbility.id) {
if (!target.m.innate) {
target.m.innate = 'ability:' + foeAlly.getAbility().id;
target.addVolatile(target.m.innate);
}
foeAlly.m.innate = 'ability:' + sourceAbility.id;
foeAlly.addVolatile(foeAlly.m.innate);
}
if (!target.isAlly(source)) target.volatileStaleness = 'external';
this.singleEvent('Start', targetAbility, source.abilityState, source);
this.singleEvent('Start', sourceAbility, target.abilityState, target);
},
},
};