export const Moves: {[k: string]: ModdedMoveData} = { attract: { inherit: true, condition: { noCopy: true, // doesn't get copied by Baton Pass onStart(pokemon, source, effect) { if (!(pokemon.gender === 'M' && source.gender === 'F') && !(pokemon.gender === 'F' && source.gender === 'M')) { this.debug('incompatible gender'); return false; } if (!this.runEvent('Attract', pokemon, source)) { this.debug('Attract event failed'); return false; } if (effect.id === 'cutecharm' || effect.id === 'ability:cutecharm') { this.add('-start', pokemon, 'Attract', '[from] ability: Cute Charm', '[of] ' + source); } else if (effect.id === 'destinyknot') { this.add('-start', pokemon, 'Attract', '[from] item: Destiny Knot', '[of] ' + source); } else { this.add('-start', pokemon, 'Attract'); } }, onUpdate(pokemon) { if (this.effectState.source && !this.effectState.source.isActive && pokemon.volatiles['attract']) { this.debug('Removing Attract volatile on ' + pokemon); pokemon.removeVolatile('attract'); } }, onBeforeMovePriority: 2, onBeforeMove(pokemon, target, move) { this.add('-activate', pokemon, 'move: Attract', '[of] ' + this.effectState.source); if (this.randomChance(1, 2)) { this.add('cant', pokemon, 'Attract'); return false; } }, onEnd(pokemon) { this.add('-end', pokemon, 'Attract', '[silent]'); }, }, }, gastroacid: { inherit: true, condition: { // Ability suppression implemented in Pokemon.ignoringAbility() within sim/pokemon.js onStart(pokemon) { 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); } } }, }, }, safeguard: { inherit: true, condition: { duration: 5, durationCallback(target, source, effect) { if (source?.hasAbility('persistent')) { this.add('-activate', source, 'ability: Persistent', effect); return 7; } return 5; }, onSetStatus(status, target, source, effect) { if (!effect || !source) return; if (effect.id === 'yawn') return; if (effect.effectType === 'Move' && effect.infiltrates && !target.isAlly(source)) return; if (target !== source) { this.debug('interrupting setStatus'); if (effect.id.endsWith('synchronize') || (effect.effectType === 'Move' && !effect.secondaries)) { this.add('-activate', target, 'move: Safeguard'); } return null; } }, onTryAddVolatile(status, target, source, effect) { if (!effect || !source) return; if (effect.effectType === 'Move' && effect.infiltrates && !target.isAlly(source)) return; if ((status.id === 'confusion' || status.id === 'yawn') && target !== source) { if (effect.effectType === 'Move' && !effect.secondaries) this.add('-activate', target, 'move: Safeguard'); return null; } }, onSideStart(side) { this.add('-sidestart', side, 'Safeguard'); }, onSideResidualOrder: 21, onSideResidualSubOrder: 2, onSideEnd(side) { this.add('-sideend', side, 'Safeguard'); }, }, }, };