export const Conditions: {[k: string]: ModdedConditionData} = { frz: { name: 'frz', effectType: 'Status', onStart(target) { this.add('-status', target, 'frz'); }, duration: 2, onBeforeMovePriority: 2, onBeforeMove(pokemon, target, move) { if (move.flags['defrost']) { pokemon.cureStatus(); return; } this.add('cant', pokemon, 'frz'); return false; }, onHit(target, source, move) { if (move.type === 'Fire' && move.category !== 'Status' || move.flags['defrost']) { target.cureStatus(); } }, onEnd(target) { this.add('-curestatus', target, 'frz'); }, }, lockedmove: { // Outrage, Thrash, Petal Dance... name: 'lockedmove', durationCallback() { return this.random(2, 4); }, onResidual(target) { const move = target.lastMove as Move; if (!move.self || (move.self !== true && move.self.volatileStatus !== 'lockedmove')) { // don't lock, and bypass confusion for calming delete target.volatiles['lockedmove']; } else if (target.ability === 'owntempo') { // Own Tempo prevents locking delete target.volatiles['lockedmove']; } }, onEnd(target) { target.addVolatile('confusion'); }, onLockMove(pokemon) { return pokemon.lastMove!.id; }, }, confusion: { // this is a volatile status name: 'confusion', onStart(target, source, sourceEffect) { if (sourceEffect && sourceEffect.id === 'lockedmove') { this.add('-start', target, 'confusion', '[fatigue]'); } else { this.add('-start', target, 'confusion'); } this.effectState.time = this.random(3, 4); }, onEnd(target) { this.add('-end', target, 'confusion'); }, onBeforeMove(pokemon) { pokemon.volatiles['confusion'].time--; if (!pokemon.volatiles['confusion'].time) { pokemon.removeVolatile('confusion'); return; } const damage = this.actions.getDamage(pokemon, pokemon, 40); if (typeof damage !== 'number') throw new Error("Confusion damage not dealt"); this.directDamage(damage); }, }, // weather! raindance: { inherit: true, onBasePower(basePower, attacker, defender, move) { if (move.id === 'scald' || move.id === 'steameruption') { return; } if (move.type === 'Water') { this.debug('rain water boost'); return basePower * 1.5; } if (move.type === 'Fire') { this.debug('rain fire suppress'); return basePower * 0.5; } }, }, sunnyday: { inherit: true, onBasePower(basePower, attacker, defender, move) { if (move.id === 'scald' || move.id === 'steameruption') { return; } if (move.type === 'Fire') { this.debug('Sunny Day fire boost'); return basePower * 1.5; } if (move.type === 'Water') { this.debug('Sunny Day water suppress'); return basePower * 0.5; } }, }, // intrinsics! bidestall: { name: 'bidestall', duration: 3, }, unown: { // Unown: Shadow Tag onImmunity(type, pokemon) { if (type === 'Ground' && !this.suppressingAbility(pokemon)) return false; }, onStart(pokemon) { if (pokemon.ability === 'levitate') { pokemon.ability = 'shadowtag' as ID; pokemon.baseAbility = 'shadowtag' as ID; } if (pokemon.transformed) return; pokemon.setType(pokemon.hpType || 'Dark'); }, }, bronzong: { // Bronzong: Heatproof onImmunity(type, pokemon) { if (type === 'Ground' && !this.suppressingAbility(pokemon)) return false; }, onStart(pokemon) { if (pokemon.ability === 'levitate') { pokemon.ability = 'heatproof' as ID; pokemon.baseAbility = 'heatproof' as ID; } }, }, weezing: { // Weezing: Aftermath onImmunity(type, pokemon) { if (type === 'Ground' && !this.suppressingAbility(pokemon)) return false; }, onStart(pokemon) { if (pokemon.ability === 'levitate') { pokemon.ability = 'aftermath' as ID; pokemon.baseAbility = 'aftermath' as ID; } }, }, flygon: { // Flygon: Compoundeyes onImmunity(type, pokemon) { if (type === 'Ground' && !this.suppressingAbility(pokemon)) return false; }, onStart(pokemon) { if (pokemon.ability === 'levitate') { pokemon.ability = 'compoundeyes' as ID; pokemon.baseAbility = 'compoundeyes' as ID; } }, }, eelektross: { // Eelektross: Poison Heal onImmunity(type, pokemon) { if (type === 'Ground' && !this.suppressingAbility(pokemon)) return false; }, onStart(pokemon) { if (pokemon.ability === 'levitate') { pokemon.ability = 'poisonheal' as ID; pokemon.baseAbility = 'poisonheal' as ID; } }, }, claydol: { // Claydol: Filter onImmunity(type, pokemon) { if (type === 'Ground' && !this.suppressingAbility(pokemon)) return false; }, onStart(pokemon) { if (pokemon.ability === 'levitate') { pokemon.ability = 'filter' as ID; pokemon.baseAbility = 'filter' as ID; } }, }, gengar: { // Gengar: Cursed Body onImmunity(type, pokemon) { if (pokemon.species.id !== 'gengarmega' && type === 'Ground' && !this.suppressingAbility(pokemon)) return false; }, onStart(pokemon) { if (pokemon.ability === 'levitate') { pokemon.ability = 'cursedbody' as ID; pokemon.baseAbility = 'cursedbody' as ID; } }, }, mismagius: { // Mismagius: Cursed Body onImmunity(type, pokemon) { if (type === 'Ground' && !this.suppressingAbility(pokemon)) return false; }, onStart(pokemon) { if (pokemon.ability === 'levitate') { pokemon.ability = 'cursedbody' as ID; pokemon.baseAbility = 'cursedbody' as ID; } }, }, mesprit: { // Mesprit: Serene Grace onImmunity(type, pokemon) { if (type === 'Ground' && !this.suppressingAbility(pokemon)) return false; }, onStart(pokemon) { if (pokemon.ability === 'levitate') { pokemon.ability = 'serenegrace' as ID; pokemon.baseAbility = 'serenegrace' as ID; } }, }, uxie: { // Uxie: Synchronize onImmunity(type, pokemon) { if (type === 'Ground' && !this.suppressingAbility(pokemon)) return false; }, onStart(pokemon) { if (pokemon.ability === 'levitate') { pokemon.ability = 'synchronize' as ID; pokemon.baseAbility = 'synchronize' as ID; } }, }, azelf: { // Azelf: Steadfast onImmunity(type, pokemon) { if (type === 'Ground' && !this.suppressingAbility(pokemon)) return false; }, onStart(pokemon) { if (pokemon.ability === 'levitate') { pokemon.ability = 'steadfast' as ID; pokemon.baseAbility = 'steadfast' as ID; } }, }, hydreigon: { // Hydreigon: Sheer Force onImmunity(type, pokemon) { if (type === 'Ground' && !this.suppressingAbility(pokemon)) return false; }, onStart(pokemon) { if (pokemon.ability === 'levitate') { pokemon.ability = 'sheerforce' as ID; pokemon.baseAbility = 'sheerforce' as ID; } }, }, rotom: { // All Rotoms: Trace onImmunity(type, pokemon) { if (type === 'Ground' && !this.suppressingAbility(pokemon)) return false; }, onStart(pokemon) { if (pokemon.ability === 'levitate') { pokemon.ability = 'trace' as ID; pokemon.baseAbility = 'trace' as ID; } }, }, rotomheat: { // All Rotoms: Trace onImmunity(type, pokemon) { if (type === 'Ground' && !this.suppressingAbility(pokemon)) return false; }, onStart(pokemon) { if (pokemon.ability === 'levitate') { pokemon.ability = 'trace' as ID; pokemon.baseAbility = 'trace' as ID; } }, }, rotomwash: { // All Rotoms: Trace onImmunity(type, pokemon) { if (type === 'Ground' && !this.suppressingAbility(pokemon)) return false; }, onStart(pokemon) { if (pokemon.ability === 'levitate') { pokemon.ability = 'trace' as ID; pokemon.baseAbility = 'trace' as ID; } }, }, rotomfan: { // All Rotoms: Trace onImmunity(type, pokemon) { if (type === 'Ground' && !this.suppressingAbility(pokemon)) return false; }, onStart(pokemon) { if (pokemon.ability === 'levitate') { pokemon.ability = 'trace' as ID; pokemon.baseAbility = 'trace' as ID; } }, }, rotomfrost: { // All Rotoms: Trace onImmunity(type, pokemon) { if (type === 'Ground' && !this.suppressingAbility(pokemon)) return false; }, onStart(pokemon) { if (pokemon.ability === 'levitate') { pokemon.ability = 'trace' as ID; pokemon.baseAbility = 'trace' as ID; } }, }, rotommow: { // All Rotoms: Trace onImmunity(type, pokemon) { if (type === 'Ground' && !this.suppressingAbility(pokemon)) return false; }, onStart(pokemon) { if (pokemon.ability === 'levitate') { pokemon.ability = 'trace' as ID; pokemon.baseAbility = 'trace' as ID; } }, }, cryogonal: { // Cryogonal: infinite hail, Ice Body onModifyMove(move) { if (move.id === 'hail') { const weather = move.weather as string; move.weather = ''; move.onHit = function (target, source) { this.field.setWeather(weather, source, this.dex.abilities.get('snowwarning')); this.field.weatherState.duration = 0; }; move.target = 'self'; } }, onImmunity(type, pokemon) { if (type === 'Ground' && !this.suppressingAbility(pokemon)) return false; }, onStart(pokemon) { if (pokemon.ability === 'levitate') { pokemon.ability = 'icebody' as ID; pokemon.baseAbility = 'icebody' as ID; } }, }, probopass: { // Probopass: infinite sand onModifyMove(move) { if (move.id === 'sandstorm') { const weather = move.weather as string; move.weather = ''; move.onHit = function (target, source) { this.field.setWeather(weather, source, this.dex.abilities.get('sandstream')); this.field.weatherState.duration = 0; }; move.target = 'self'; } }, }, phione: { // Phione: infinite rain onModifyMove(move) { if (move.id === 'raindance') { const weather = move.weather as string; move.weather = ''; move.onHit = function (target, source) { this.field.setWeather(weather, source, this.dex.abilities.get('drizzle')); this.field.weatherState.duration = 0; }; move.target = 'self'; } }, }, };