Spaces:
Running
Running
/** | |
* Since Stadium 2 ignores stat drops while recalculating stats due to boosting moves, haze, | |
* or stat-lowering moves. The status conditions which affect a targets stats (brn and par) have | |
* a volatile along with them to keep track of if their respective stat changes should be factored | |
* in during stat calculations or not. | |
*/ | |
export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDataTable = { | |
brn: { | |
name: 'brn', | |
effectType: 'Status', | |
onStart(target) { | |
this.add('-status', target, 'brn'); | |
target.addVolatile('brnattackdrop'); | |
}, | |
onAfterMoveSelfPriority: 3, | |
onAfterMoveSelf(pokemon) { | |
residualdmg(this, pokemon); | |
}, | |
onSwitchIn(pokemon) { | |
pokemon.addVolatile('brnattackdrop'); | |
}, | |
onAfterSwitchInSelf(pokemon) { | |
residualdmg(this, pokemon); | |
}, | |
}, | |
par: { | |
name: 'par', | |
effectType: 'Status', | |
onStart(target) { | |
this.add('-status', target, 'par'); | |
target.addVolatile('parspeeddrop'); | |
}, | |
onBeforeMovePriority: 2, | |
onBeforeMove(pokemon) { | |
if (this.randomChance(1, 4)) { | |
this.add('cant', pokemon, 'par'); | |
return false; | |
} | |
}, | |
onSwitchIn(pokemon) { | |
pokemon.addVolatile('parspeeddrop'); | |
}, | |
}, | |
slp: { | |
name: 'slp', | |
effectType: 'Status', | |
onStart(target, source, sourceEffect) { | |
if (sourceEffect && sourceEffect.effectType === 'Move') { | |
this.add('-status', target, 'slp', `[from] move: ${sourceEffect.name}`); | |
} else { | |
this.add('-status', target, 'slp'); | |
} | |
// 1-4 turns, guaranteed 1 turn of sleep. | |
this.effectState.time = this.random(2, 5); | |
if (target.removeVolatile('nightmare')) { | |
this.add('-end', target, 'Nightmare', '[silent]'); | |
} | |
}, | |
onBeforeMovePriority: 10, | |
onBeforeMove(pokemon, target, move) { | |
pokemon.statusState.time--; | |
if (pokemon.statusState.time <= 0) { | |
pokemon.cureStatus(); | |
return; | |
} | |
this.add('cant', pokemon, 'slp'); | |
if (move.sleepUsable) { | |
return; | |
} | |
return false; | |
}, | |
}, | |
confusion: { | |
inherit: true, | |
// Stadium 2 fixed Berserk Gene afflicting Confusion for 255 turns. | |
onStart(target, source, sourceEffect) { | |
if (sourceEffect && sourceEffect.id === 'lockedmove') { | |
this.add('-start', target, 'confusion', '[silent]'); | |
} else { | |
this.add('-start', target, 'confusion'); | |
} | |
this.effectState.time = this.random(2, 6); | |
}, | |
onBeforeMove(pokemon, target, move) { | |
pokemon.volatiles['confusion'].time--; | |
if (!pokemon.volatiles['confusion'].time) { | |
pokemon.removeVolatile('confusion'); | |
return; | |
} | |
this.add('-activate', pokemon, 'confusion'); | |
if (this.randomChance(1, 2)) { | |
return; | |
} | |
move = { | |
basePower: 40, | |
type: '???', | |
baseMoveType: move.type, | |
category: 'Physical', | |
willCrit: false, | |
isConfusionSelfHit: true, | |
noDamageVariance: true, | |
flags: {}, | |
selfdestruct: move.selfdestruct, | |
} as unknown as ActiveMove; | |
const damage = this.actions.getDamage(pokemon, pokemon, move); | |
if (typeof damage !== 'number') throw new Error("Confusion damage not dealt"); | |
this.directDamage(damage); | |
return false; | |
}, | |
}, | |
residualdmg: { | |
name: 'residualdmg', | |
onStart(target) { | |
target.volatiles['residualdmg'].counter = 0; | |
}, | |
onAfterMoveSelfPriority: 100, | |
onAfterMoveSelf(pokemon) { | |
if (['brn', 'psn', 'tox'].includes(pokemon.status)) pokemon.volatiles['residualdmg'].counter++; | |
}, | |
onAfterSwitchInSelf(pokemon) { | |
if (['brn', 'psn', 'tox'].includes(pokemon.status)) pokemon.volatiles['residualdmg'].counter++; | |
}, | |
}, | |
}; | |
function residualdmg(battle: Battle, pokemon: Pokemon) { | |
if (pokemon.volatiles['residualdmg']) { | |
const residualDmg = battle.clampIntRange( | |
Math.floor(pokemon.maxhp / 16) * pokemon.volatiles['residualdmg'].counter, 1 | |
); | |
battle.damage(residualDmg, pokemon); | |
battle.hint("In Gen 2, Toxic's counter is retained through Baton Pass/Heal Bell and applies to PSN/BRN.", true); | |
} else { | |
battle.damage(battle.clampIntRange(Math.floor(pokemon.maxhp / 8), 1), pokemon); | |
} | |
} | |