export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = { neutralizinggas: { inherit: true, // Ability suppression implemented in sim/pokemon.ts:Pokemon#ignoringAbility onSwitchIn(pokemon) { this.add('-ability', pokemon, 'Neutralizing Gas'); pokemon.abilityState.ending = false; // Remove setter's innates before the ability starts for (const target of this.getAllActive()) { if (target.hasItem('Ability Shield')) { this.add('-block', target, 'item: Ability Shield'); continue; } if (target.illusion) { this.singleEvent('End', this.dex.abilities.get('Illusion'), target.abilityState, target, pokemon, 'neutralizinggas'); } if (target.volatiles['slowstart']) { delete target.volatiles['slowstart']; this.add('-end', target, 'Slow Start', '[silent]'); } if (target.m.innate) { if (!this.dex.abilities.get(target.m.innate.slice(8)).flags['cantsuppress']) { target.removeVolatile(target.m.innate); } } } }, onEnd(source) { this.add('-end', source, 'ability: Neutralizing Gas'); // FIXME this happens before the pokemon switches out, should be the opposite order. // Not an easy fix since we cant use a supported event. Would need some kind of special event that // gathers events to run after the switch and then runs them when the ability is no longer accessible. // (If you're tackling this, do note extreme weathers have the same issue) // Mark this pokemon's ability as ending so Pokemon#ignoringAbility skips it if (source.abilityState.ending) return; source.abilityState.ending = true; const sortedActive = this.getAllActive(); this.speedSort(sortedActive); for (const pokemon of sortedActive) { if (pokemon.m.innate) { if (!pokemon.volatiles[pokemon.m.innate]) pokemon.addVolatile(pokemon.m.innate, pokemon); } if (pokemon !== source) { // Will be suppressed by Pokemon#ignoringAbility if needed this.singleEvent('Start', pokemon.getAbility(), pokemon.abilityState, pokemon); } } }, }, trace: { inherit: true, onUpdate(pokemon) { if (!this.effectState.seek) return; const isAbility = pokemon.ability === 'trace'; const possibleTargets = pokemon.adjacentFoes().filter( target => !target.getAbility().flags['notrace'] && target.ability !== 'noability' ); if (!possibleTargets.length) return; const target = this.sample(possibleTargets); const ability = target.getAbility(); this.add('-ability', pokemon, ability, '[from] ability: Trace', `[of] ${target}`); if (isAbility) { pokemon.setAbility(ability); } else { pokemon.removeVolatile('ability:trace'); pokemon.addVolatile('ability:' + ability.id, pokemon); } }, }, };