"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var conditions_exports = {}; __export(conditions_exports, { Conditions: () => Conditions }); module.exports = __toCommonJS(conditions_exports); const Conditions = { brn: { name: "brn", effectType: "Status", onStart(target) { this.add("-status", target, "brn"); }, onAfterMoveSelfPriority: 3, onAfterMoveSelf(pokemon) { residualdmg(this, pokemon); }, onAfterSwitchInSelf(pokemon) { residualdmg(this, pokemon); } }, par: { name: "par", inherit: true, onBeforeMovePriority: 2, onBeforeMove(pokemon) { if (this.randomChance(1, 4)) { this.add("cant", pokemon, "par"); return false; } } }, 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"); } this.effectState.time = this.random(2, 8); 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; } }, frz: { name: "frz", inherit: true, onBeforeMove(pokemon, target, move) { if (move.flags["defrost"]) return; this.add("cant", pokemon, "frz"); return false; }, onModifyMove() { }, onDamagingHit() { }, onAfterMoveSecondary(target, source, move) { if (move.secondary && move.secondary.status === "brn" || move.statusRoll === "brn") { target.cureStatus(); } }, onAfterMoveSecondarySelf(pokemon, target, move) { if (move.flags["defrost"]) pokemon.cureStatus(); }, onResidualOrder: 7, onResidual(pokemon) { if (this.randomChance(25, 256)) pokemon.cureStatus(); } }, psn: { name: "psn", effectType: "Status", onStart(target) { this.add("-status", target, "psn"); }, onAfterMoveSelfPriority: 3, onAfterMoveSelf(pokemon) { residualdmg(this, pokemon); }, onAfterSwitchInSelf(pokemon) { residualdmg(this, pokemon); } }, tox: { name: "tox", effectType: "Status", onStart(target) { this.add("-status", target, "tox"); if (!target.volatiles["residualdmg"]) target.addVolatile("residualdmg"); target.volatiles["residualdmg"].counter = 0; }, onAfterMoveSelfPriority: 3, onAfterMoveSelf(pokemon) { const damage = this.clampIntRange(Math.floor(pokemon.maxhp / 16), 1) * pokemon.volatiles["residualdmg"].counter; this.damage(damage, pokemon, pokemon); }, onSwitchIn(pokemon) { pokemon.status = "psn"; this.add("-status", pokemon, "psn", "[silent]"); }, onAfterSwitchInSelf(pokemon) { this.damage(this.clampIntRange(Math.floor(pokemon.maxhp / 16), 1)); } }, confusion: { inherit: true, onStart(target, source, sourceEffect) { if (sourceEffect && sourceEffect.id === "lockedmove") { this.add("-start", target, "confusion", "[silent]"); } else { this.add("-start", target, "confusion"); } if (sourceEffect && sourceEffect.id === "berserkgene") { this.effectState.time = 256; } else { 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 }; const damage = this.actions.getDamage(pokemon, pokemon, move); if (typeof damage !== "number") throw new Error("Confusion damage not dealt"); this.directDamage(damage); return false; } }, partiallytrapped: { inherit: true, durationCallback(target, source) { return this.random(3, 6); }, onResidualOrder: 3, onResidualSubOrder: 1 }, lockedmove: { name: "lockedmove", // Outrage, Thrash, Petal Dance... durationCallback() { return this.random(2, 4); }, onResidual(target) { if (target.lastMove && target.lastMove.id === "struggle" || target.status === "slp") { delete target.volatiles["lockedmove"]; } }, onStart(target, source, effect) { this.effectState.move = effect.id; }, onEnd(target) { delete target.volatiles["confusion"]; if (!target.side.getSideCondition("safeguard")) target.addVolatile("confusion"); }, onLockMove(pokemon) { return this.effectState.move; }, onMoveAborted(pokemon) { delete pokemon.volatiles["lockedmove"]; }, onBeforeTurn(pokemon) { const move = this.dex.moves.get(this.effectState.move); if (move.id) { this.debug("Forcing into " + move.id); this.queue.changeAction(pokemon, { choice: "move", moveid: move.id }); } } }, futuremove: { inherit: true, onResidualOrder: 1 }, raindance: { inherit: true, onFieldResidualOrder: 2 }, sunnyday: { inherit: true, onFieldResidualOrder: 2 }, sandstorm: { inherit: true, onFieldResidualOrder: 2, onWeather(target) { this.damage(target.baseMaxhp / 8); } }, stall: { name: "stall", duration: 2, onStart() { this.effectState.counter = 127; }, onStallMove() { const counter = Math.floor(this.effectState.counter) || 127; this.debug(`Success chance: ${Math.round(counter * 1e3 / 255) / 10}% (${counter}/255)`); return this.randomChance(counter, 255); }, onRestart() { this.effectState.counter /= 2; this.effectState.duration = 2; } }, 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, 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); } } //# sourceMappingURL=conditions.js.map