@pkmn/mods 0.7.46 → 0.7.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -444,7 +444,7 @@ var Scripts = {
|
|
|
444
444
|
this.battle.runEvent("AfterMoveSecondary", target, pokemon, move);
|
|
445
445
|
}
|
|
446
446
|
if (move.recoil && move.totalDamage && (pokemon.side.pokemonLeft > 1 || target.side.pokemonLeft > 1 || target.hp)) {
|
|
447
|
-
this.battle.damage(this.calcRecoilDamage(move.totalDamage, move), pokemon, target, "recoil");
|
|
447
|
+
this.battle.damage(this.calcRecoilDamage(move.totalDamage, move, pokemon), pokemon, target, "recoil");
|
|
448
448
|
}
|
|
449
449
|
return damage;
|
|
450
450
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/gen2stadium2/conditions.ts","../../src/gen2stadium2/items.ts","../../src/gen2stadium2/moves.ts","../../src/gen2stadium2/rulesets.ts","../../src/gen2stadium2/scripts.ts"],"names":[],"mappings":"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","sourcesContent":["import type {ActiveMove, Battle, ModdedConditionData, Pokemon} from '@pkmn/sim';\n\n/**\n * Since Stadium 2 ignores stat drops while recalculating stats due to boosting moves, haze,\n * or stat-lowering moves. The status conditions which affect a targets stats (brn and par) have\n * a volatile along with them to keep track of if their respective stat changes should be factored\n * in during stat calculations or not.\n */\nexport const Conditions: {[k: string]: ModdedConditionData} = {\n\tbrn: {\n\t\tname: 'brn',\n\t\teffectType: 'Status',\n\t\tonStart(target) {\n\t\t\tthis.add('-status', target, 'brn');\n\t\t\ttarget.addVolatile('brnattackdrop');\n\t\t},\n\t\tonAfterMoveSelfPriority: 3,\n\t\tonAfterMoveSelf(pokemon) {\n\t\t\tresidualdmg(this, pokemon);\n\t\t},\n\t\tonSwitchIn(pokemon) {\n\t\t\tpokemon.addVolatile('brnattackdrop');\n\t\t},\n\t\tonAfterSwitchInSelf(pokemon) {\n\t\t\tresidualdmg(this, pokemon);\n\t\t},\n\t},\n\tpar: {\n\t\tname: 'par',\n\t\teffectType: 'Status',\n\t\tonStart(target) {\n\t\t\tthis.add('-status', target, 'par');\n\t\t\ttarget.addVolatile('parspeeddrop');\n\t\t},\n\t\tonBeforeMovePriority: 2,\n\t\tonBeforeMove(pokemon) {\n\t\t\tif (this.randomChance(1, 4)) {\n\t\t\t\tthis.add('cant', pokemon, 'par');\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tonSwitchIn(pokemon) {\n\t\t\tpokemon.addVolatile('parspeeddrop');\n\t\t},\n\t},\n\tslp: {\n\t\tname: 'slp',\n\t\teffectType: 'Status',\n\t\tonStart(target, source, sourceEffect) {\n\t\t\tif (sourceEffect && sourceEffect.effectType === 'Move') {\n\t\t\t\tthis.add('-status', target, 'slp', '[from] move: ' + sourceEffect.name);\n\t\t\t} else {\n\t\t\t\tthis.add('-status', target, 'slp');\n\t\t\t}\n\t\t\t// 1-4 turns, guaranteed 1 turn of sleep.\n\t\t\tthis.effectState.time = this.random(2, 5);\n\n\t\t\tif (target.removeVolatile('nightmare')) {\n\t\t\t\tthis.add('-end', target, 'Nightmare', '[silent]');\n\t\t\t}\n\t\t},\n\t\tonBeforeMovePriority: 10,\n\t\tonBeforeMove(pokemon, target, move) {\n\t\t\tpokemon.statusState.time--;\n\t\t\tif (pokemon.statusState.time <= 0) {\n\t\t\t\tpokemon.cureStatus();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.add('cant', pokemon, 'slp');\n\t\t\tif (move.sleepUsable) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t},\n\tconfusion: {\n\t\tinherit: true,\n\t\t// Stadium 2 fixed Berserk Gene afflicting Confusion for 255 turns.\n\t\tonStart(target, source, sourceEffect) {\n\t\t\tif (sourceEffect && sourceEffect.id === 'lockedmove') {\n\t\t\t\tthis.add('-start', target, 'confusion', '[silent]');\n\t\t\t} else {\n\t\t\t\tthis.add('-start', target, 'confusion');\n\t\t\t}\n\t\t\tthis.effectState.time = this.random(2, 6);\n\t\t},\n\t\tonBeforeMove(pokemon, target, move) {\n\t\t\tpokemon.volatiles['confusion'].time--;\n\t\t\tif (!pokemon.volatiles['confusion'].time) {\n\t\t\t\tpokemon.removeVolatile('confusion');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.add('-activate', pokemon, 'confusion');\n\t\t\tif (this.randomChance(1, 2)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tmove = {\n\t\t\t\tbasePower: 40,\n\t\t\t\ttype: '???',\n\t\t\t\tbaseMoveType: move.type,\n\t\t\t\tcategory: 'Physical',\n\t\t\t\twillCrit: false,\n\t\t\t\tisConfusionSelfHit: true,\n\t\t\t\tnoDamageVariance: true,\n\t\t\t\tflags: {},\n\t\t\t\tselfdestruct: move.selfdestruct,\n\t\t\t} as unknown as ActiveMove;\n\t\t\tconst damage = this.actions.getDamage(pokemon, pokemon, move);\n\t\t\tif (typeof damage !== 'number') throw new Error(\"Confusion damage not dealt\");\n\t\t\tthis.directDamage(damage);\n\t\t\treturn false;\n\t\t},\n\t},\n\tresidualdmg: {\n\t\tname: 'residualdmg',\n\t\tonStart(target) {\n\t\t\ttarget.volatiles['residualdmg'].counter = 0;\n\t\t},\n\t\tonAfterMoveSelfPriority: 100,\n\t\tonAfterMoveSelf(pokemon) {\n\t\t\tif (['brn', 'psn', 'tox'].includes(pokemon.status)) pokemon.volatiles['residualdmg'].counter++;\n\t\t},\n\t\tonAfterSwitchInSelf(pokemon) {\n\t\t\tif (['brn', 'psn', 'tox'].includes(pokemon.status)) pokemon.volatiles['residualdmg'].counter++;\n\t\t},\n\t},\n};\n\nfunction residualdmg(battle: Battle, pokemon: Pokemon) {\n\tif (pokemon.volatiles['residualdmg']) {\n\t\tconst residualDmg = battle.clampIntRange(\n\t\t\tMath.floor(pokemon.maxhp / 16) * pokemon.volatiles['residualdmg'].counter, 1\n\t\t);\n\t\tbattle.damage(residualDmg, pokemon);\n\t\tbattle.hint(\"In Gen 2, Toxic's counter is retained through Baton Pass/Heal Bell and applies to PSN/BRN.\", true);\n\t} else {\n\t\tbattle.damage(battle.clampIntRange(Math.floor(pokemon.maxhp / 8), 1), pokemon);\n\t}\n}\n","import type {ModdedItemData} from '@pkmn/sim';\n\n// Gen 2 Stadium fixes Dragon Fang and Dragon Scale having the wrong effects.\nexport const Items: {[k: string]: ModdedItemData} = {\n\tdragonfang: {\n\t\tinherit: true,\n\t\tonModifyDamage(damage, source, target, move) {\n\t\t\tif (move?.type === 'Dragon') {\n\t\t\t\treturn damage * 1.1;\n\t\t\t}\n\t\t},\n\t},\n\tdragonscale: {\n\t\tinherit: true,\n\t\tonModifyDamage() {},\n\t},\n};\n","import type {ModdedMoveData} from '@pkmn/sim';\n\nexport const Moves: {[k: string]: ModdedMoveData} = {\n\t// Belly Drum no longer boosts attack by 2 stages if under 50% health.\n\tbellydrum: {\n\t\tinherit: true,\n\t\tonHit(target) {\n\t\t\tif (target.boosts.atk >= 6 || target.hp <= target.maxhp / 2) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthis.directDamage(target.maxhp / 2);\n\t\t\tconst originalStage = target.boosts.atk;\n\t\t\tlet currentStage = originalStage;\n\t\t\tlet boosts = 0;\n\t\t\tlet loopStage = 0;\n\t\t\twhile (currentStage < 6) {\n\t\t\t\tloopStage = currentStage;\n\t\t\t\tcurrentStage++;\n\t\t\t\tif (currentStage < 6) currentStage++;\n\t\t\t\ttarget.boosts.atk = loopStage;\n\t\t\t\tif (target.getStat('atk', false, true) < 999) {\n\t\t\t\t\ttarget.boosts.atk = currentStage;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\ttarget.boosts.atk = currentStage - 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tboosts = target.boosts.atk - originalStage;\n\t\t\ttarget.boosts.atk = originalStage;\n\t\t\tthis.boost({atk: boosts});\n\t\t},\n\t},\n\tdestinybond: {\n\t\tinherit: true,\n\t\tonPrepareHit(pokemon) {\n\t\t\tif (pokemon.side.pokemonLeft === 1) {\n\t\t\t\tthis.hint(\"In Pokemon Stadium 2, Destiny Bond fails if it is being used by your last Pokemon.\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t},\n\t/**\n\t * In Stadium 2, moves which affect the stat stages of a Pokemon, such as moves which boost ones own stats,\n\t * lower the targets stats, or Haze, causes the afflicted stat to be re-calculated without factoring in\n\t * status aliments, thus if a Pokemon is burned or paralyzed and either active Pokemon uses Haze, then their\n\t * attack and speed are re-calculated while ignoring their status ailments, so their attack would go from 50% to normal\n\t */\n\thaze: {\n\t\tinherit: true,\n\t\tonHitField() {\n\t\t\tthis.add('-clearallboost');\n\t\t\tfor (const pokemon of this.getAllActive()) {\n\t\t\t\tpokemon.clearBoosts();\n\t\t\t\tpokemon.removeVolatile('brnattackdrop');\n\t\t\t\tpokemon.removeVolatile('parspeeddrop');\n\t\t\t}\n\t\t},\n\t},\n\tperishsong: {\n\t\tinherit: true,\n\t\tonPrepareHit(pokemon) {\n\t\t\tif (pokemon.side.pokemonLeft === 1) {\n\t\t\t\tthis.hint(\"In Pokemon Stadium 2, Perish Song fails if it is being used by your last Pokemon.\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t},\n};\n","import type {ModdedFormatData} from '@pkmn/sim';\n\nexport const Rulesets: {[k: string]: ModdedFormatData} = {\n\tstandard: {\n\t\teffectType: 'ValidatorRule',\n\t\tname: 'Standard',\n\t\truleset: ['Obtainable', 'Team Preview', 'Stadium Sleep Clause', 'Freeze Clause Mod', 'Self-KO Clause', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Moves Clause', 'Exact HP Mod', 'Cancel Mod', 'Stadium Items Clause'],\n\t},\n\tselfkoclause: {\n\t\teffectType: 'Rule',\n\t\tname: 'Self-KO Clause',\n\t\tdesc: \"If a player's last Pokemon uses Self-Destruct or Explosion, they automatically lose the battle.\",\n\t\tonBegin() {\n\t\t\tthis.add('rule', 'Self-KO Clause: If a player\\'s last Pokemon uses Self-Destruct/Explosion, they automatically lose');\n\t\t},\n\t},\n};\n","import type {\n\tActiveMove,\n\tBoostID,\n\tModdedBattleScriptsData,\n\tPokemon,\n\tSparseBoostsTable,\n\tStatIDExceptHP,\n} from '@pkmn/sim';\n\n/**\n * Stadium 2 mechanics inherit from gen 2 mechanics, but fixes some bugs.\n */\nexport const Scripts: ModdedBattleScriptsData = {\n\tinherit: 'gen2',\n\tgen: 2,\n\tpokemon: {\n\t\tinherit: true,\n\t\tgetStat(statName, unboosted, unmodified, fastReturn) {\n\t\t\t// @ts-ignore - type checking prevents 'hp' from being passed, but we're paranoid\n\t\t\tif (statName === 'hp') throw new Error(\"Please read `maxhp` directly\");\n\n\t\t\t// base stat\n\t\t\tlet stat = this.storedStats[statName];\n\n\t\t\t// Stat boosts.\n\t\t\tif (!unboosted) {\n\t\t\t\tlet boost = this.boosts[statName];\n\t\t\t\tif (boost > 6) boost = 6;\n\t\t\t\tif (boost < -6) boost = -6;\n\t\t\t\tif (boost >= 0) {\n\t\t\t\t\tconst boostTable = [1, 1.5, 2, 2.5, 3, 3.5, 4];\n\t\t\t\t\tstat = Math.floor(stat * boostTable[boost]);\n\t\t\t\t} else {\n\t\t\t\t\tconst numerators = [100, 66, 50, 40, 33, 28, 25];\n\t\t\t\t\tstat = Math.floor(stat * numerators[-boost] / 100);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.status === 'par' && statName === 'spe' && this.volatiles['parspeeddrop']) {\n\t\t\t\tstat = Math.floor(stat / 4);\n\t\t\t}\n\t\t\tif (!unmodified) {\n\t\t\t\tif (this.status === 'brn' && statName === 'atk' && this.volatiles['brnattackdrop']) {\n\t\t\t\t\tstat = Math.floor(stat / 2);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Gen 2 caps stats at 999 and min is 1.\n\t\t\tstat = this.battle.clampIntRange(stat, 1, 999);\n\t\t\tif (fastReturn) return stat;\n\n\t\t\t// Screens\n\t\t\tif (!unboosted) {\n\t\t\t\tif (\n\t\t\t\t\t(statName === 'def' && this.side.sideConditions['reflect']) ||\n\t\t\t\t\t(statName === 'spd' && this.side.sideConditions['lightscreen'])\n\t\t\t\t) {\n\t\t\t\t\tstat *= 2;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Handle boosting items\n\t\t\tif (\n\t\t\t\t(['Cubone', 'Marowak'].includes(this.species.name) && this.item === 'thickclub' && statName === 'atk') ||\n\t\t\t\t(this.species.name === 'Pikachu' && this.item === 'lightball' && statName === 'spa')\n\t\t\t) {\n\t\t\t\tstat *= 2;\n\t\t\t} else if (this.species.name === 'Ditto' && this.item === 'metalpowder' && ['def', 'spd'].includes(statName)) {\n\t\t\t\tstat = Math.floor(stat * 1.5);\n\t\t\t}\n\n\t\t\treturn stat;\n\t\t},\n\t},\n\t// Stadium 2 shares gen 2 code but it fixes some problems with it.\n\tactions: {\n\t\tinherit: true,\n\t\ttryMoveHit(target, pokemon, move) {\n\t\t\tconst positiveBoostTable = [1, 1.33, 1.66, 2, 2.33, 2.66, 3];\n\t\t\tconst negativeBoostTable = [1, 0.75, 0.6, 0.5, 0.43, 0.36, 0.33];\n\t\t\tconst doSelfDestruct = true;\n\t\t\tlet damage: number | false | undefined = 0;\n\n\t\t\tif (move.selfdestruct && doSelfDestruct) {\n\t\t\t\tthis.battle.faint(pokemon, pokemon, move);\n\t\t\t\t/**\n\t\t\t\t * Keeping track of the last move used for self-ko clause,\n\t\t\t\t * making sure to clear the opponents last move so that self-destruct and explosion\n\t\t\t\t * does not persist between Pokemon, preventing problems caused by situations,\n\t\t\t\t * such as a player from blowing up both they and their opponents second last Pokemon\n\t\t\t\t * and their opponent blowing up their last Pokemon. If we did not clear here, there would be a problem.\n\t\t\t\t */\n\t\t\t\ttarget.side.lastMove = null;\n\t\t\t\tpokemon.side.lastMove = move;\n\t\t\t}\n\n\t\t\tlet hitResult = this.battle.singleEvent('PrepareHit', move, {}, target, pokemon, move);\n\t\t\tif (!hitResult) {\n\t\t\t\tif (hitResult === false) this.battle.add('-fail', target);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthis.battle.runEvent('PrepareHit', pokemon, target, move);\n\n\t\t\tif (!this.battle.singleEvent('Try', move, null, pokemon, target, move)) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (move.target === 'all' || move.target === 'foeSide' || move.target === 'allySide' || move.target === 'allyTeam') {\n\t\t\t\tif (move.target === 'all') {\n\t\t\t\t\thitResult = this.battle.runEvent('TryHitField', target, pokemon, move);\n\t\t\t\t} else {\n\t\t\t\t\thitResult = this.battle.runEvent('TryHitSide', target, pokemon, move);\n\t\t\t\t}\n\t\t\t\tif (!hitResult) {\n\t\t\t\t\tif (hitResult === false) {\n\t\t\t\t\t\tthis.battle.add('-fail', pokemon);\n\t\t\t\t\t\tthis.battle.attrLastMove('[still]');\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn this.moveHit(target, pokemon, move);\n\t\t\t}\n\n\t\t\thitResult = this.battle.runEvent('Invulnerability', target, pokemon, move);\n\t\t\tif (hitResult === false) {\n\t\t\t\tthis.battle.attrLastMove('[miss]');\n\t\t\t\tthis.battle.add('-miss', pokemon);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (move.ignoreImmunity === undefined) {\n\t\t\t\tmove.ignoreImmunity = (move.category === 'Status');\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t(!move.ignoreImmunity || (move.ignoreImmunity !== true && !move.ignoreImmunity[move.type])) &&\n\t\t\t\t!target.runImmunity(move.type, true)\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\thitResult = this.battle.singleEvent('TryImmunity', move, {}, target, pokemon, move);\n\t\t\tif (hitResult === false) {\n\t\t\t\tthis.battle.add('-immune', target);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\thitResult = this.battle.runEvent('TryHit', target, pokemon, move);\n\t\t\tif (!hitResult) {\n\t\t\t\tif (hitResult === false) this.battle.add('-fail', target);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tlet accuracy = move.accuracy;\n\t\t\tif (move.alwaysHit) {\n\t\t\t\taccuracy = true;\n\t\t\t} else {\n\t\t\t\taccuracy = this.battle.runEvent('Accuracy', target, pokemon, move, accuracy);\n\t\t\t}\n\t\t\t// Now, let's calculate the accuracy.\n\t\t\tif (accuracy !== true) {\n\t\t\t\taccuracy = Math.floor(accuracy * 255 / 100);\n\t\t\t\tif (move.ohko) {\n\t\t\t\t\tif (pokemon.level >= target.level) {\n\t\t\t\t\t\taccuracy += (pokemon.level - target.level) * 2;\n\t\t\t\t\t\taccuracy = Math.min(accuracy, 255);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.battle.add('-immune', target, '[ohko]');\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!move.ignoreAccuracy) {\n\t\t\t\t\tif (pokemon.boosts.accuracy > 0) {\n\t\t\t\t\t\taccuracy *= positiveBoostTable[pokemon.boosts.accuracy];\n\t\t\t\t\t} else {\n\t\t\t\t\t\taccuracy *= negativeBoostTable[-pokemon.boosts.accuracy];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!move.ignoreEvasion) {\n\t\t\t\t\tif (target.boosts.evasion > 0 && !move.ignorePositiveEvasion) {\n\t\t\t\t\t\taccuracy *= negativeBoostTable[target.boosts.evasion];\n\t\t\t\t\t} else if (target.boosts.evasion < 0) {\n\t\t\t\t\t\taccuracy *= positiveBoostTable[-target.boosts.evasion];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\taccuracy = Math.min(Math.floor(accuracy), 255);\n\t\t\t\taccuracy = Math.max(accuracy, 1);\n\t\t\t} else {\n\t\t\t\taccuracy = this.battle.runEvent('Accuracy', target, pokemon, move, accuracy);\n\t\t\t}\n\t\t\taccuracy = this.battle.runEvent('ModifyAccuracy', target, pokemon, move, accuracy);\n\t\t\tif (accuracy !== true) accuracy = Math.max(accuracy, 0);\n\t\t\tif (move.alwaysHit) {\n\t\t\t\taccuracy = true;\n\t\t\t} else {\n\t\t\t\taccuracy = this.battle.runEvent('Accuracy', target, pokemon, move, accuracy);\n\t\t\t}\n\t\t\tif (accuracy !== true && accuracy !== 255 && !this.battle.randomChance(accuracy, 256)) {\n\t\t\t\tthis.battle.attrLastMove('[miss]');\n\t\t\t\tthis.battle.add('-miss', pokemon);\n\t\t\t\tdamage = false;\n\t\t\t\treturn damage;\n\t\t\t}\n\t\t\tmove.totalDamage = 0;\n\t\t\tpokemon.lastDamage = 0;\n\t\t\tif (move.multihit) {\n\t\t\t\tlet hits = move.multihit;\n\t\t\t\tif (Array.isArray(hits)) {\n\t\t\t\t\tif (hits[0] === 2 && hits[1] === 5) {\n\t\t\t\t\t\thits = this.battle.sample([2, 2, 2, 3, 3, 3, 4, 5]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\thits = this.battle.random(hits[0], hits[1] + 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\thits = Math.floor(hits);\n\t\t\t\tlet nullDamage = true;\n\t\t\t\tlet moveDamage: number | undefined | false;\n\n\t\t\t\tconst isSleepUsable = move.sleepUsable || this.dex.moves.get(move.sourceEffect).sleepUsable;\n\t\t\t\tlet i: number;\n\t\t\t\tfor (i = 0; i < hits && target.hp && pokemon.hp; i++) {\n\t\t\t\t\tif (pokemon.status === 'slp' && !isSleepUsable) break;\n\t\t\t\t\tmove.hit = i + 1;\n\t\t\t\t\tif (move.hit === hits) move.lastHit = true;\n\t\t\t\t\tmoveDamage = this.moveHit(target, pokemon, move);\n\t\t\t\t\tif (moveDamage === false) break;\n\t\t\t\t\tif (nullDamage && (moveDamage || moveDamage === 0 || moveDamage === undefined)) nullDamage = false;\n\t\t\t\t\tdamage = (moveDamage || 0);\n\t\t\t\t\tmove.totalDamage += damage;\n\t\t\t\t\tthis.battle.eachEvent('Update');\n\t\t\t\t}\n\t\t\t\tif (i === 0) return 1;\n\t\t\t\tif (nullDamage) damage = false;\n\t\t\t\tthis.battle.add('-hitcount', target, i);\n\t\t\t} else {\n\t\t\t\tdamage = this.moveHit(target, pokemon, move);\n\t\t\t\tmove.totalDamage = damage;\n\t\t\t}\n\t\t\tif (move.category !== 'Status') {\n\t\t\t\ttarget.gotAttacked(move, damage, pokemon);\n\t\t\t}\n\t\t\tif (move.ohko) this.battle.add('-ohko');\n\n\t\t\tif (!move.negateSecondary) {\n\t\t\t\tthis.battle.singleEvent('AfterMoveSecondary', move, null, target, pokemon, move);\n\t\t\t\tthis.battle.runEvent('AfterMoveSecondary', target, pokemon, move);\n\t\t\t}\n\t\t\t// Implementing Recoil mechanics from Stadium 2.\n\t\t\t// If a pokemon caused the other to faint with a recoil move and only one pokemon remains on both sides,\n\t\t\t// recoil damage will not be taken.\n\t\t\tif (move.recoil && move.totalDamage && (pokemon.side.pokemonLeft > 1 || target.side.pokemonLeft > 1 || target.hp)) {\n\t\t\t\tthis.battle.damage(this.calcRecoilDamage(move.totalDamage, move), pokemon, target, 'recoil');\n\t\t\t}\n\t\t\treturn damage;\n\t\t},\n\t\tgetDamage(source, target, move, suppressMessages) {\n\t\t\t// First of all, we get the move.\n\t\t\tif (typeof move === 'string') {\n\t\t\t\tmove = this.dex.getActiveMove(move);\n\t\t\t} else if (typeof move === 'number') {\n\t\t\t\tmove = {\n\t\t\t\t\tbasePower: move,\n\t\t\t\t\ttype: '???',\n\t\t\t\t\tcategory: 'Physical',\n\t\t\t\t\twillCrit: false,\n\t\t\t\t\tflags: {},\n\t\t\t\t} as unknown as ActiveMove;\n\t\t\t}\n\n\t\t\t// Let's test for immunities.\n\t\t\tif (!move.ignoreImmunity || (move.ignoreImmunity !== true && !move.ignoreImmunity[move.type])) {\n\t\t\t\tif (!target.runImmunity(move.type, true)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Is it an OHKO move?\n\t\t\tif (move.ohko) {\n\t\t\t\treturn target.maxhp;\n\t\t\t}\n\n\t\t\t// We edit the damage through move's damage callback\n\t\t\tif (move.damageCallback) {\n\t\t\t\treturn move.damageCallback.call(this.battle, source, target);\n\t\t\t}\n\n\t\t\t// We take damage from damage=level moves\n\t\t\tif (move.damage === 'level') {\n\t\t\t\treturn source.level;\n\t\t\t}\n\n\t\t\t// If there's a fix move damage, we run it\n\t\t\tif (move.damage) {\n\t\t\t\treturn move.damage;\n\t\t\t}\n\n\t\t\t// We check the category and typing to calculate later on the damage\n\t\t\tmove.category = this.battle.getCategory(move);\n\t\t\t// '???' is typeless damage: used for Struggle and Confusion etc\n\t\t\tif (!move.type) move.type = '???';\n\t\t\tconst type = move.type;\n\n\t\t\t// We get the base power and apply basePowerCallback if necessary\n\t\t\tlet basePower: number | false | null | undefined = move.basePower;\n\t\t\tif (move.basePowerCallback) {\n\t\t\t\tbasePower = move.basePowerCallback.call(this.battle, source, target, move);\n\t\t\t}\n\n\t\t\t// We check for Base Power\n\t\t\tif (!basePower) {\n\t\t\t\tif (basePower === 0) return; // Returning undefined means not dealing damage\n\t\t\t\treturn basePower;\n\t\t\t}\n\t\t\tbasePower = this.battle.clampIntRange(basePower, 1);\n\n\t\t\t// Checking for the move's Critical Hit ratio\n\t\t\tlet critRatio = this.battle.runEvent('ModifyCritRatio', source, target, move, move.critRatio || 0);\n\t\t\tcritRatio = this.battle.clampIntRange(critRatio, 0, 5);\n\t\t\tconst critMult = [0, 16, 8, 4, 3, 2];\n\t\t\tlet isCrit = move.willCrit || false;\n\t\t\tif (typeof move.willCrit === 'undefined') {\n\t\t\t\tif (critRatio) {\n\t\t\t\t\tisCrit = this.battle.randomChance(1, critMult[critRatio]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (isCrit && this.battle.runEvent('CriticalHit', target, null, move)) {\n\t\t\t\ttarget.getMoveHitData(move).crit = true;\n\t\t\t}\n\n\t\t\t// Happens after crit calculation\n\t\t\tif (basePower) {\n\t\t\t\t// confusion damage\n\t\t\t\tif (move.isConfusionSelfHit) {\n\t\t\t\t\tmove.type = move.baseMoveType!;\n\t\t\t\t\tbasePower = this.battle.runEvent('BasePower', source, target, move, basePower, true);\n\t\t\t\t\tmove.type = '???';\n\t\t\t\t} else {\n\t\t\t\t\tbasePower = this.battle.runEvent('BasePower', source, target, move, basePower, true);\n\t\t\t\t}\n\t\t\t\tif (basePower && move.basePowerModifier) {\n\t\t\t\t\tbasePower *= move.basePowerModifier;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!basePower) return 0;\n\t\t\tbasePower = this.battle.clampIntRange(basePower, 1);\n\n\t\t\t// We now check for attacker and defender\n\t\t\tlet level = source.level;\n\n\t\t\t// Using Beat Up\n\t\t\tif (move.allies) {\n\t\t\t\tthis.battle.add('-activate', source, 'move: Beat Up', '[of] ' + move.allies[0].name);\n\t\t\t\tlevel = move.allies[0].level;\n\t\t\t}\n\n\t\t\tconst attacker = move.overrideOffensivePokemon === 'target' ? target : source;\n\t\t\tconst defender = move.overrideDefensivePokemon === 'source' ? source : target;\n\n\t\t\tconst isPhysical = move.category === 'Physical';\n\t\t\tconst atkType: StatIDExceptHP = move.overrideOffensiveStat || (isPhysical ? 'atk' : 'spa');\n\t\t\tconst defType: StatIDExceptHP = move.overrideDefensiveStat || (isPhysical ? 'def' : 'spd');\n\n\t\t\tlet unboosted = false;\n\t\t\tlet noburndrop = false;\n\n\t\t\tif (isCrit) {\n\t\t\t\tif (!suppressMessages) this.battle.add('-crit', target);\n\t\t\t\t// Stat level modifications are ignored if they are neutral to or favour the defender.\n\t\t\t\t// Reflect and Light Screen defensive boosts are only ignored if stat level modifications were also ignored as a result of that.\n\t\t\t\tif (attacker.boosts[atkType] <= defender.boosts[defType]) {\n\t\t\t\t\tunboosted = true;\n\t\t\t\t\tnoburndrop = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet attack = attacker.getStat(atkType, unboosted, noburndrop);\n\t\t\tlet defense = defender.getStat(defType, unboosted);\n\n\t\t\t// Using Beat Up\n\t\t\tif (move.allies) {\n\t\t\t\tattack = move.allies[0].species.baseStats.atk;\n\t\t\t\tmove.allies.shift();\n\t\t\t\tdefense = defender.species.baseStats.def;\n\t\t\t}\n\n\t\t\t// Moves that ignore offense and defense respectively.\n\t\t\tif (move.ignoreOffensive) {\n\t\t\t\tthis.battle.debug('Negating (sp)atk boost/penalty.');\n\t\t\t\t// The attack drop from the burn is only applied when attacker's attack level is higher than defender's defense level.\n\t\t\t\tattack = attacker.getStat(atkType, true, true);\n\t\t\t}\n\n\t\t\tif (move.ignoreDefensive) {\n\t\t\t\tthis.battle.debug('Negating (sp)def boost/penalty.');\n\t\t\t\tdefense = target.getStat(defType, true, true);\n\t\t\t}\n\n\t\t\tif (attack >= 256 || defense >= 256) {\n\t\t\t\tattack = this.battle.clampIntRange(Math.floor(this.battle.clampIntRange(attack, 1, 999) / 4), 1);\n\t\t\t\tdefense = this.battle.clampIntRange(Math.floor(this.battle.clampIntRange(defense, 1, 999) / 4), 1);\n\t\t\t}\n\n\t\t\t// Self destruct moves halve defense at this point.\n\t\t\tif (move.selfdestruct && defType === 'def') {\n\t\t\t\tdefense = this.battle.clampIntRange(Math.floor(defense / 2), 1);\n\t\t\t}\n\n\t\t\t// Let's go with the calculation now that we have what we need.\n\t\t\t// We do it step by step just like the game does.\n\t\t\tlet damage = level * 2;\n\t\t\tdamage = Math.floor(damage / 5);\n\t\t\tdamage += 2;\n\t\t\tdamage *= basePower;\n\t\t\tdamage *= attack;\n\t\t\tdamage = Math.floor(damage / defense);\n\t\t\tdamage = Math.floor(damage / 50);\n\t\t\tif (isCrit) damage *= 2;\n\t\t\tdamage = Math.floor(this.battle.runEvent('ModifyDamage', attacker, defender, move, damage));\n\t\t\tdamage = this.battle.clampIntRange(damage, 1, 997);\n\t\t\tdamage += 2;\n\n\t\t\t// Weather modifiers\n\t\t\tif (\n\t\t\t\t(type === 'Water' && this.battle.field.isWeather('raindance')) ||\n\t\t\t\t(type === 'Fire' && this.battle.field.isWeather('sunnyday'))\n\t\t\t) {\n\t\t\t\tdamage = Math.floor(damage * 1.5);\n\t\t\t} else if (\n\t\t\t\t((type === 'Fire' || move.id === 'solarbeam') && this.battle.field.isWeather('raindance')) ||\n\t\t\t\t(type === 'Water' && this.battle.field.isWeather('sunnyday'))\n\t\t\t) {\n\t\t\t\tdamage = Math.floor(damage / 2);\n\t\t\t}\n\n\t\t\t// STAB damage bonus, the \"???\" type never gets STAB\n\t\t\tif (type !== '???' && source.hasType(type)) {\n\t\t\t\tdamage += Math.floor(damage / 2);\n\t\t\t}\n\n\t\t\t// Type effectiveness\n\t\t\tconst totalTypeMod = target.runEffectiveness(move);\n\t\t\t// Super effective attack\n\t\t\tif (totalTypeMod > 0) {\n\t\t\t\tif (!suppressMessages) this.battle.add('-supereffective', target);\n\t\t\t\tdamage *= 2;\n\t\t\t\tif (totalTypeMod >= 2) {\n\t\t\t\t\tdamage *= 2;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Resisted attack\n\t\t\tif (totalTypeMod < 0) {\n\t\t\t\tif (!suppressMessages) this.battle.add('-resisted', target);\n\t\t\t\tdamage = Math.floor(damage / 2);\n\t\t\t\tif (totalTypeMod <= -2) {\n\t\t\t\t\tdamage = Math.floor(damage / 2);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Apply random factor if damage is greater than 1, except for Flail and Reversal\n\t\t\tif (!move.noDamageVariance && damage > 1) {\n\t\t\t\tdamage *= this.battle.random(217, 256);\n\t\t\t\tdamage = Math.floor(damage / 255);\n\t\t\t}\n\n\t\t\t// If damage is less than 1, we return 1\n\t\t\tif (basePower && !Math.floor(damage)) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// We are done, this is the final damage\n\t\t\treturn damage;\n\t\t},\n\t},\n\t/**\n\t * Stadium 2 ignores stat drops due to status ailments upon boosting the dropped stat.\n\t * For example: if a burned Snorlax uses Curse then it will ignore the attack drop from\n\t * burn when it is recalculating its attack stat. This is why volatiles are added to status\n\t * conditions, so that we can keep track of whether or not to apply the stat drop from\n\t * statuses.\n\t */\n\tboost(boost, target, source = null, effect = null) {\n\t\tif (this.event) {\n\t\t\tif (!target) target = this.event.target;\n\t\t\tif (!source) source = this.event.source;\n\t\t\tif (!effect) effect = this.effect;\n\t\t}\n\t\tif (typeof effect === 'string') effect = this.dex.conditions.get(effect);\n\t\tif (!target?.hp) return 0;\n\t\tlet success = null;\n\t\tboost = this.runEvent('TryBoost', target, source, effect, {...boost});\n\t\tlet i: BoostID;\n\t\tfor (i in boost) {\n\t\t\tconst currentBoost: SparseBoostsTable = {};\n\t\t\tcurrentBoost[i] = boost[i];\n\t\t\tlet boostBy = target.boostBy(currentBoost);\n\t\t\tlet msg = '-boost';\n\t\t\tif (boost[i]! < 0) {\n\t\t\t\tmsg = '-unboost';\n\t\t\t\tboostBy = -boostBy;\n\t\t\t}\n\t\t\tif (boostBy) {\n\t\t\t\tsuccess = true;\n\t\t\t\t// Check for boost increases deleting attack or speed drops\n\t\t\t\tif (i === 'atk' && target.status === 'brn' && target.volatiles['brnattackdrop']) {\n\t\t\t\t\ttarget.removeVolatile('brnattackdrop');\n\t\t\t\t}\n\t\t\t\tif (i === 'spe' && target.status === 'par' && target.volatiles['parspeeddrop']) {\n\t\t\t\t\ttarget.removeVolatile('parspeeddrop');\n\t\t\t\t}\n\t\t\t\tif (!effect || effect.effectType === 'Move') {\n\t\t\t\t\tthis.add(msg, target, i, boostBy);\n\t\t\t\t} else {\n\t\t\t\t\tthis.add(msg, target, i, boostBy, '[from] ' + effect.fullname);\n\t\t\t\t}\n\t\t\t\tthis.runEvent('AfterEachBoost', target, source, effect, currentBoost);\n\t\t\t}\n\t\t}\n\t\tthis.runEvent('AfterBoost', target, source, effect, boost);\n\t\treturn success;\n\t},\n\t/**\n\t * Implementing Self-KO Clause by having it check what the last move used by the players were\n\t * in the case both Pokemon faint. Since the only way this can happen in Stadium 2 is if a player\n\t * uses self-destruct or explosion, I can use this to determine who should win.\n\t */\n\tfaintMessages(lastFirst) {\n\t\tif (this.ended) return;\n\t\tconst length = this.faintQueue.length;\n\t\tif (!length) return false;\n\t\tif (lastFirst) {\n\t\t\tthis.faintQueue.unshift(this.faintQueue[this.faintQueue.length - 1]);\n\t\t\tthis.faintQueue.pop();\n\t\t}\n\t\tlet faintData;\n\t\twhile (this.faintQueue.length) {\n\t\t\tfaintData = this.faintQueue.shift()!;\n\t\t\tconst pokemon: Pokemon = faintData.target;\n\t\t\tif (!pokemon.fainted &&\n\t\t\t\tthis.runEvent('BeforeFaint', pokemon, faintData.source, faintData.effect)) {\n\t\t\t\tthis.add('faint', pokemon);\n\t\t\t\tpokemon.side.pokemonLeft--;\n\t\t\t\tif (pokemon.side.totalFainted < 100) pokemon.side.totalFainted++;\n\t\t\t\tthis.runEvent('Faint', pokemon, faintData.source, faintData.effect);\n\t\t\t\tthis.singleEvent('End', pokemon.getAbility(), pokemon.abilityState, pokemon);\n\t\t\t\tpokemon.clearVolatile(false);\n\t\t\t\tpokemon.fainted = true;\n\t\t\t\tpokemon.isActive = false;\n\t\t\t\tpokemon.isStarted = false;\n\t\t\t\tpokemon.side.faintedThisTurn = pokemon;\n\t\t\t}\n\t\t}\n\n\t\tif (this.gen <= 1) {\n\t\t\t// in gen 1, fainting skips the rest of the turn\n\t\t\t// residuals don't exist in gen 1\n\t\t\tthis.queue.clear();\n\t\t\t// Fainting clears accumulated Bide damage\n\t\t\tfor (const pokemon of this.getAllActive()) {\n\t\t\t\tif (pokemon.volatiles['bide'] && pokemon.volatiles['bide'].damage) {\n\t\t\t\t\tpokemon.volatiles['bide'].damage = 0;\n\t\t\t\t\tthis.hint(\"Desync Clause Mod activated!\");\n\t\t\t\t\tthis.hint(\"In Gen 1, Bide's accumulated damage is reset to 0 when a Pokemon faints.\");\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (this.gen <= 3 && this.gameType === 'singles') {\n\t\t\t// in gen 3 or earlier, fainting in singles skips to residuals\n\t\t\tfor (const pokemon of this.getAllActive()) {\n\t\t\t\tif (this.gen <= 2) {\n\t\t\t\t\t// in gen 2, fainting skips moves only\n\t\t\t\t\tthis.queue.cancelMove(pokemon);\n\t\t\t\t} else {\n\t\t\t\t\t// in gen 3, fainting skips all moves and switches\n\t\t\t\t\tthis.queue.cancelAction(pokemon);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!this.p1.pokemonLeft && !this.p2.pokemonLeft) {\n\t\t\tif (this.p1.lastMove !== null && this.p2.lastMove === null) {\n\t\t\t\tthis.win(this.p2);\n\t\t\t\treturn true;\n\t\t\t} else if (this.p2.lastMove !== null && this.p1.lastMove === null) {\n\t\t\t\tthis.win(this.p1);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tthis.win(faintData ? faintData.target.side.foe : null);\n\t\t\treturn true;\n\t\t}\n\t\tif (!this.p1.pokemonLeft) {\n\t\t\tthis.win(this.p2);\n\t\t\treturn true;\n\t\t}\n\t\tif (!this.p2.pokemonLeft) {\n\t\t\tthis.win(this.p1);\n\t\t\treturn true;\n\t\t}\n\t\tif (faintData) {\n\t\t\tthis.runEvent('AfterFaint', faintData.target, faintData.source, faintData.effect, length);\n\t\t}\n\t\treturn false;\n\t},\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/gen2stadium2/conditions.ts","../../src/gen2stadium2/items.ts","../../src/gen2stadium2/moves.ts","../../src/gen2stadium2/rulesets.ts","../../src/gen2stadium2/scripts.ts"],"names":[],"mappings":"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","sourcesContent":["import type {ActiveMove, Battle, ModdedConditionData, Pokemon} from '@pkmn/sim';\n\n/**\n * Since Stadium 2 ignores stat drops while recalculating stats due to boosting moves, haze,\n * or stat-lowering moves. The status conditions which affect a targets stats (brn and par) have\n * a volatile along with them to keep track of if their respective stat changes should be factored\n * in during stat calculations or not.\n */\nexport const Conditions: {[k: string]: ModdedConditionData} = {\n\tbrn: {\n\t\tname: 'brn',\n\t\teffectType: 'Status',\n\t\tonStart(target) {\n\t\t\tthis.add('-status', target, 'brn');\n\t\t\ttarget.addVolatile('brnattackdrop');\n\t\t},\n\t\tonAfterMoveSelfPriority: 3,\n\t\tonAfterMoveSelf(pokemon) {\n\t\t\tresidualdmg(this, pokemon);\n\t\t},\n\t\tonSwitchIn(pokemon) {\n\t\t\tpokemon.addVolatile('brnattackdrop');\n\t\t},\n\t\tonAfterSwitchInSelf(pokemon) {\n\t\t\tresidualdmg(this, pokemon);\n\t\t},\n\t},\n\tpar: {\n\t\tname: 'par',\n\t\teffectType: 'Status',\n\t\tonStart(target) {\n\t\t\tthis.add('-status', target, 'par');\n\t\t\ttarget.addVolatile('parspeeddrop');\n\t\t},\n\t\tonBeforeMovePriority: 2,\n\t\tonBeforeMove(pokemon) {\n\t\t\tif (this.randomChance(1, 4)) {\n\t\t\t\tthis.add('cant', pokemon, 'par');\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tonSwitchIn(pokemon) {\n\t\t\tpokemon.addVolatile('parspeeddrop');\n\t\t},\n\t},\n\tslp: {\n\t\tname: 'slp',\n\t\teffectType: 'Status',\n\t\tonStart(target, source, sourceEffect) {\n\t\t\tif (sourceEffect && sourceEffect.effectType === 'Move') {\n\t\t\t\tthis.add('-status', target, 'slp', '[from] move: ' + sourceEffect.name);\n\t\t\t} else {\n\t\t\t\tthis.add('-status', target, 'slp');\n\t\t\t}\n\t\t\t// 1-4 turns, guaranteed 1 turn of sleep.\n\t\t\tthis.effectState.time = this.random(2, 5);\n\n\t\t\tif (target.removeVolatile('nightmare')) {\n\t\t\t\tthis.add('-end', target, 'Nightmare', '[silent]');\n\t\t\t}\n\t\t},\n\t\tonBeforeMovePriority: 10,\n\t\tonBeforeMove(pokemon, target, move) {\n\t\t\tpokemon.statusState.time--;\n\t\t\tif (pokemon.statusState.time <= 0) {\n\t\t\t\tpokemon.cureStatus();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.add('cant', pokemon, 'slp');\n\t\t\tif (move.sleepUsable) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t},\n\tconfusion: {\n\t\tinherit: true,\n\t\t// Stadium 2 fixed Berserk Gene afflicting Confusion for 255 turns.\n\t\tonStart(target, source, sourceEffect) {\n\t\t\tif (sourceEffect && sourceEffect.id === 'lockedmove') {\n\t\t\t\tthis.add('-start', target, 'confusion', '[silent]');\n\t\t\t} else {\n\t\t\t\tthis.add('-start', target, 'confusion');\n\t\t\t}\n\t\t\tthis.effectState.time = this.random(2, 6);\n\t\t},\n\t\tonBeforeMove(pokemon, target, move) {\n\t\t\tpokemon.volatiles['confusion'].time--;\n\t\t\tif (!pokemon.volatiles['confusion'].time) {\n\t\t\t\tpokemon.removeVolatile('confusion');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.add('-activate', pokemon, 'confusion');\n\t\t\tif (this.randomChance(1, 2)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tmove = {\n\t\t\t\tbasePower: 40,\n\t\t\t\ttype: '???',\n\t\t\t\tbaseMoveType: move.type,\n\t\t\t\tcategory: 'Physical',\n\t\t\t\twillCrit: false,\n\t\t\t\tisConfusionSelfHit: true,\n\t\t\t\tnoDamageVariance: true,\n\t\t\t\tflags: {},\n\t\t\t\tselfdestruct: move.selfdestruct,\n\t\t\t} as unknown as ActiveMove;\n\t\t\tconst damage = this.actions.getDamage(pokemon, pokemon, move);\n\t\t\tif (typeof damage !== 'number') throw new Error(\"Confusion damage not dealt\");\n\t\t\tthis.directDamage(damage);\n\t\t\treturn false;\n\t\t},\n\t},\n\tresidualdmg: {\n\t\tname: 'residualdmg',\n\t\tonStart(target) {\n\t\t\ttarget.volatiles['residualdmg'].counter = 0;\n\t\t},\n\t\tonAfterMoveSelfPriority: 100,\n\t\tonAfterMoveSelf(pokemon) {\n\t\t\tif (['brn', 'psn', 'tox'].includes(pokemon.status)) pokemon.volatiles['residualdmg'].counter++;\n\t\t},\n\t\tonAfterSwitchInSelf(pokemon) {\n\t\t\tif (['brn', 'psn', 'tox'].includes(pokemon.status)) pokemon.volatiles['residualdmg'].counter++;\n\t\t},\n\t},\n};\n\nfunction residualdmg(battle: Battle, pokemon: Pokemon) {\n\tif (pokemon.volatiles['residualdmg']) {\n\t\tconst residualDmg = battle.clampIntRange(\n\t\t\tMath.floor(pokemon.maxhp / 16) * pokemon.volatiles['residualdmg'].counter, 1\n\t\t);\n\t\tbattle.damage(residualDmg, pokemon);\n\t\tbattle.hint(\"In Gen 2, Toxic's counter is retained through Baton Pass/Heal Bell and applies to PSN/BRN.\", true);\n\t} else {\n\t\tbattle.damage(battle.clampIntRange(Math.floor(pokemon.maxhp / 8), 1), pokemon);\n\t}\n}\n","import type {ModdedItemData} from '@pkmn/sim';\n\n// Gen 2 Stadium fixes Dragon Fang and Dragon Scale having the wrong effects.\nexport const Items: {[k: string]: ModdedItemData} = {\n\tdragonfang: {\n\t\tinherit: true,\n\t\tonModifyDamage(damage, source, target, move) {\n\t\t\tif (move?.type === 'Dragon') {\n\t\t\t\treturn damage * 1.1;\n\t\t\t}\n\t\t},\n\t},\n\tdragonscale: {\n\t\tinherit: true,\n\t\tonModifyDamage() {},\n\t},\n};\n","import type {ModdedMoveData} from '@pkmn/sim';\n\nexport const Moves: {[k: string]: ModdedMoveData} = {\n\t// Belly Drum no longer boosts attack by 2 stages if under 50% health.\n\tbellydrum: {\n\t\tinherit: true,\n\t\tonHit(target) {\n\t\t\tif (target.boosts.atk >= 6 || target.hp <= target.maxhp / 2) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthis.directDamage(target.maxhp / 2);\n\t\t\tconst originalStage = target.boosts.atk;\n\t\t\tlet currentStage = originalStage;\n\t\t\tlet boosts = 0;\n\t\t\tlet loopStage = 0;\n\t\t\twhile (currentStage < 6) {\n\t\t\t\tloopStage = currentStage;\n\t\t\t\tcurrentStage++;\n\t\t\t\tif (currentStage < 6) currentStage++;\n\t\t\t\ttarget.boosts.atk = loopStage;\n\t\t\t\tif (target.getStat('atk', false, true) < 999) {\n\t\t\t\t\ttarget.boosts.atk = currentStage;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\ttarget.boosts.atk = currentStage - 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tboosts = target.boosts.atk - originalStage;\n\t\t\ttarget.boosts.atk = originalStage;\n\t\t\tthis.boost({atk: boosts});\n\t\t},\n\t},\n\tdestinybond: {\n\t\tinherit: true,\n\t\tonPrepareHit(pokemon) {\n\t\t\tif (pokemon.side.pokemonLeft === 1) {\n\t\t\t\tthis.hint(\"In Pokemon Stadium 2, Destiny Bond fails if it is being used by your last Pokemon.\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t},\n\t/**\n\t * In Stadium 2, moves which affect the stat stages of a Pokemon, such as moves which boost ones own stats,\n\t * lower the targets stats, or Haze, causes the afflicted stat to be re-calculated without factoring in\n\t * status aliments, thus if a Pokemon is burned or paralyzed and either active Pokemon uses Haze, then their\n\t * attack and speed are re-calculated while ignoring their status ailments, so their attack would go from 50% to normal\n\t */\n\thaze: {\n\t\tinherit: true,\n\t\tonHitField() {\n\t\t\tthis.add('-clearallboost');\n\t\t\tfor (const pokemon of this.getAllActive()) {\n\t\t\t\tpokemon.clearBoosts();\n\t\t\t\tpokemon.removeVolatile('brnattackdrop');\n\t\t\t\tpokemon.removeVolatile('parspeeddrop');\n\t\t\t}\n\t\t},\n\t},\n\tperishsong: {\n\t\tinherit: true,\n\t\tonPrepareHit(pokemon) {\n\t\t\tif (pokemon.side.pokemonLeft === 1) {\n\t\t\t\tthis.hint(\"In Pokemon Stadium 2, Perish Song fails if it is being used by your last Pokemon.\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t},\n};\n","import type {ModdedFormatData} from '@pkmn/sim';\n\nexport const Rulesets: {[k: string]: ModdedFormatData} = {\n\tstandard: {\n\t\teffectType: 'ValidatorRule',\n\t\tname: 'Standard',\n\t\truleset: ['Obtainable', 'Team Preview', 'Stadium Sleep Clause', 'Freeze Clause Mod', 'Self-KO Clause', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Moves Clause', 'Exact HP Mod', 'Cancel Mod', 'Stadium Items Clause'],\n\t},\n\tselfkoclause: {\n\t\teffectType: 'Rule',\n\t\tname: 'Self-KO Clause',\n\t\tdesc: \"If a player's last Pokemon uses Self-Destruct or Explosion, they automatically lose the battle.\",\n\t\tonBegin() {\n\t\t\tthis.add('rule', 'Self-KO Clause: If a player\\'s last Pokemon uses Self-Destruct/Explosion, they automatically lose');\n\t\t},\n\t},\n};\n","import type {\n\tActiveMove,\n\tBoostID,\n\tModdedBattleScriptsData,\n\tPokemon,\n\tSparseBoostsTable,\n\tStatIDExceptHP,\n} from '@pkmn/sim';\n\n/**\n * Stadium 2 mechanics inherit from gen 2 mechanics, but fixes some bugs.\n */\nexport const Scripts: ModdedBattleScriptsData = {\n\tinherit: 'gen2',\n\tgen: 2,\n\tpokemon: {\n\t\tinherit: true,\n\t\tgetStat(statName, unboosted, unmodified, fastReturn) {\n\t\t\t// @ts-ignore - type checking prevents 'hp' from being passed, but we're paranoid\n\t\t\tif (statName === 'hp') throw new Error(\"Please read `maxhp` directly\");\n\n\t\t\t// base stat\n\t\t\tlet stat = this.storedStats[statName];\n\n\t\t\t// Stat boosts.\n\t\t\tif (!unboosted) {\n\t\t\t\tlet boost = this.boosts[statName];\n\t\t\t\tif (boost > 6) boost = 6;\n\t\t\t\tif (boost < -6) boost = -6;\n\t\t\t\tif (boost >= 0) {\n\t\t\t\t\tconst boostTable = [1, 1.5, 2, 2.5, 3, 3.5, 4];\n\t\t\t\t\tstat = Math.floor(stat * boostTable[boost]);\n\t\t\t\t} else {\n\t\t\t\t\tconst numerators = [100, 66, 50, 40, 33, 28, 25];\n\t\t\t\t\tstat = Math.floor(stat * numerators[-boost] / 100);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.status === 'par' && statName === 'spe' && this.volatiles['parspeeddrop']) {\n\t\t\t\tstat = Math.floor(stat / 4);\n\t\t\t}\n\t\t\tif (!unmodified) {\n\t\t\t\tif (this.status === 'brn' && statName === 'atk' && this.volatiles['brnattackdrop']) {\n\t\t\t\t\tstat = Math.floor(stat / 2);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Gen 2 caps stats at 999 and min is 1.\n\t\t\tstat = this.battle.clampIntRange(stat, 1, 999);\n\t\t\tif (fastReturn) return stat;\n\n\t\t\t// Screens\n\t\t\tif (!unboosted) {\n\t\t\t\tif (\n\t\t\t\t\t(statName === 'def' && this.side.sideConditions['reflect']) ||\n\t\t\t\t\t(statName === 'spd' && this.side.sideConditions['lightscreen'])\n\t\t\t\t) {\n\t\t\t\t\tstat *= 2;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Handle boosting items\n\t\t\tif (\n\t\t\t\t(['Cubone', 'Marowak'].includes(this.species.name) && this.item === 'thickclub' && statName === 'atk') ||\n\t\t\t\t(this.species.name === 'Pikachu' && this.item === 'lightball' && statName === 'spa')\n\t\t\t) {\n\t\t\t\tstat *= 2;\n\t\t\t} else if (this.species.name === 'Ditto' && this.item === 'metalpowder' && ['def', 'spd'].includes(statName)) {\n\t\t\t\tstat = Math.floor(stat * 1.5);\n\t\t\t}\n\n\t\t\treturn stat;\n\t\t},\n\t},\n\t// Stadium 2 shares gen 2 code but it fixes some problems with it.\n\tactions: {\n\t\tinherit: true,\n\t\ttryMoveHit(target, pokemon, move) {\n\t\t\tconst positiveBoostTable = [1, 1.33, 1.66, 2, 2.33, 2.66, 3];\n\t\t\tconst negativeBoostTable = [1, 0.75, 0.6, 0.5, 0.43, 0.36, 0.33];\n\t\t\tconst doSelfDestruct = true;\n\t\t\tlet damage: number | false | undefined = 0;\n\n\t\t\tif (move.selfdestruct && doSelfDestruct) {\n\t\t\t\tthis.battle.faint(pokemon, pokemon, move);\n\t\t\t\t/**\n\t\t\t\t * Keeping track of the last move used for self-ko clause,\n\t\t\t\t * making sure to clear the opponents last move so that self-destruct and explosion\n\t\t\t\t * does not persist between Pokemon, preventing problems caused by situations,\n\t\t\t\t * such as a player from blowing up both they and their opponents second last Pokemon\n\t\t\t\t * and their opponent blowing up their last Pokemon. If we did not clear here, there would be a problem.\n\t\t\t\t */\n\t\t\t\ttarget.side.lastMove = null;\n\t\t\t\tpokemon.side.lastMove = move;\n\t\t\t}\n\n\t\t\tlet hitResult = this.battle.singleEvent('PrepareHit', move, {}, target, pokemon, move);\n\t\t\tif (!hitResult) {\n\t\t\t\tif (hitResult === false) this.battle.add('-fail', target);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthis.battle.runEvent('PrepareHit', pokemon, target, move);\n\n\t\t\tif (!this.battle.singleEvent('Try', move, null, pokemon, target, move)) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (move.target === 'all' || move.target === 'foeSide' || move.target === 'allySide' || move.target === 'allyTeam') {\n\t\t\t\tif (move.target === 'all') {\n\t\t\t\t\thitResult = this.battle.runEvent('TryHitField', target, pokemon, move);\n\t\t\t\t} else {\n\t\t\t\t\thitResult = this.battle.runEvent('TryHitSide', target, pokemon, move);\n\t\t\t\t}\n\t\t\t\tif (!hitResult) {\n\t\t\t\t\tif (hitResult === false) {\n\t\t\t\t\t\tthis.battle.add('-fail', pokemon);\n\t\t\t\t\t\tthis.battle.attrLastMove('[still]');\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn this.moveHit(target, pokemon, move);\n\t\t\t}\n\n\t\t\thitResult = this.battle.runEvent('Invulnerability', target, pokemon, move);\n\t\t\tif (hitResult === false) {\n\t\t\t\tthis.battle.attrLastMove('[miss]');\n\t\t\t\tthis.battle.add('-miss', pokemon);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (move.ignoreImmunity === undefined) {\n\t\t\t\tmove.ignoreImmunity = (move.category === 'Status');\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t(!move.ignoreImmunity || (move.ignoreImmunity !== true && !move.ignoreImmunity[move.type])) &&\n\t\t\t\t!target.runImmunity(move.type, true)\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\thitResult = this.battle.singleEvent('TryImmunity', move, {}, target, pokemon, move);\n\t\t\tif (hitResult === false) {\n\t\t\t\tthis.battle.add('-immune', target);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\thitResult = this.battle.runEvent('TryHit', target, pokemon, move);\n\t\t\tif (!hitResult) {\n\t\t\t\tif (hitResult === false) this.battle.add('-fail', target);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tlet accuracy = move.accuracy;\n\t\t\tif (move.alwaysHit) {\n\t\t\t\taccuracy = true;\n\t\t\t} else {\n\t\t\t\taccuracy = this.battle.runEvent('Accuracy', target, pokemon, move, accuracy);\n\t\t\t}\n\t\t\t// Now, let's calculate the accuracy.\n\t\t\tif (accuracy !== true) {\n\t\t\t\taccuracy = Math.floor(accuracy * 255 / 100);\n\t\t\t\tif (move.ohko) {\n\t\t\t\t\tif (pokemon.level >= target.level) {\n\t\t\t\t\t\taccuracy += (pokemon.level - target.level) * 2;\n\t\t\t\t\t\taccuracy = Math.min(accuracy, 255);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.battle.add('-immune', target, '[ohko]');\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!move.ignoreAccuracy) {\n\t\t\t\t\tif (pokemon.boosts.accuracy > 0) {\n\t\t\t\t\t\taccuracy *= positiveBoostTable[pokemon.boosts.accuracy];\n\t\t\t\t\t} else {\n\t\t\t\t\t\taccuracy *= negativeBoostTable[-pokemon.boosts.accuracy];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!move.ignoreEvasion) {\n\t\t\t\t\tif (target.boosts.evasion > 0 && !move.ignorePositiveEvasion) {\n\t\t\t\t\t\taccuracy *= negativeBoostTable[target.boosts.evasion];\n\t\t\t\t\t} else if (target.boosts.evasion < 0) {\n\t\t\t\t\t\taccuracy *= positiveBoostTable[-target.boosts.evasion];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\taccuracy = Math.min(Math.floor(accuracy), 255);\n\t\t\t\taccuracy = Math.max(accuracy, 1);\n\t\t\t} else {\n\t\t\t\taccuracy = this.battle.runEvent('Accuracy', target, pokemon, move, accuracy);\n\t\t\t}\n\t\t\taccuracy = this.battle.runEvent('ModifyAccuracy', target, pokemon, move, accuracy);\n\t\t\tif (accuracy !== true) accuracy = Math.max(accuracy, 0);\n\t\t\tif (move.alwaysHit) {\n\t\t\t\taccuracy = true;\n\t\t\t} else {\n\t\t\t\taccuracy = this.battle.runEvent('Accuracy', target, pokemon, move, accuracy);\n\t\t\t}\n\t\t\tif (accuracy !== true && accuracy !== 255 && !this.battle.randomChance(accuracy, 256)) {\n\t\t\t\tthis.battle.attrLastMove('[miss]');\n\t\t\t\tthis.battle.add('-miss', pokemon);\n\t\t\t\tdamage = false;\n\t\t\t\treturn damage;\n\t\t\t}\n\t\t\tmove.totalDamage = 0;\n\t\t\tpokemon.lastDamage = 0;\n\t\t\tif (move.multihit) {\n\t\t\t\tlet hits = move.multihit;\n\t\t\t\tif (Array.isArray(hits)) {\n\t\t\t\t\tif (hits[0] === 2 && hits[1] === 5) {\n\t\t\t\t\t\thits = this.battle.sample([2, 2, 2, 3, 3, 3, 4, 5]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\thits = this.battle.random(hits[0], hits[1] + 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\thits = Math.floor(hits);\n\t\t\t\tlet nullDamage = true;\n\t\t\t\tlet moveDamage: number | undefined | false;\n\n\t\t\t\tconst isSleepUsable = move.sleepUsable || this.dex.moves.get(move.sourceEffect).sleepUsable;\n\t\t\t\tlet i: number;\n\t\t\t\tfor (i = 0; i < hits && target.hp && pokemon.hp; i++) {\n\t\t\t\t\tif (pokemon.status === 'slp' && !isSleepUsable) break;\n\t\t\t\t\tmove.hit = i + 1;\n\t\t\t\t\tif (move.hit === hits) move.lastHit = true;\n\t\t\t\t\tmoveDamage = this.moveHit(target, pokemon, move);\n\t\t\t\t\tif (moveDamage === false) break;\n\t\t\t\t\tif (nullDamage && (moveDamage || moveDamage === 0 || moveDamage === undefined)) nullDamage = false;\n\t\t\t\t\tdamage = (moveDamage || 0);\n\t\t\t\t\tmove.totalDamage += damage;\n\t\t\t\t\tthis.battle.eachEvent('Update');\n\t\t\t\t}\n\t\t\t\tif (i === 0) return 1;\n\t\t\t\tif (nullDamage) damage = false;\n\t\t\t\tthis.battle.add('-hitcount', target, i);\n\t\t\t} else {\n\t\t\t\tdamage = this.moveHit(target, pokemon, move);\n\t\t\t\tmove.totalDamage = damage;\n\t\t\t}\n\t\t\tif (move.category !== 'Status') {\n\t\t\t\ttarget.gotAttacked(move, damage, pokemon);\n\t\t\t}\n\t\t\tif (move.ohko) this.battle.add('-ohko');\n\n\t\t\tif (!move.negateSecondary) {\n\t\t\t\tthis.battle.singleEvent('AfterMoveSecondary', move, null, target, pokemon, move);\n\t\t\t\tthis.battle.runEvent('AfterMoveSecondary', target, pokemon, move);\n\t\t\t}\n\t\t\t// Implementing Recoil mechanics from Stadium 2.\n\t\t\t// If a pokemon caused the other to faint with a recoil move and only one pokemon remains on both sides,\n\t\t\t// recoil damage will not be taken.\n\t\t\tif (move.recoil && move.totalDamage && (pokemon.side.pokemonLeft > 1 || target.side.pokemonLeft > 1 || target.hp)) {\n\t\t\t\tthis.battle.damage(this.calcRecoilDamage(move.totalDamage, move, pokemon), pokemon, target, 'recoil');\n\t\t\t}\n\t\t\treturn damage;\n\t\t},\n\t\tgetDamage(source, target, move, suppressMessages) {\n\t\t\t// First of all, we get the move.\n\t\t\tif (typeof move === 'string') {\n\t\t\t\tmove = this.dex.getActiveMove(move);\n\t\t\t} else if (typeof move === 'number') {\n\t\t\t\tmove = {\n\t\t\t\t\tbasePower: move,\n\t\t\t\t\ttype: '???',\n\t\t\t\t\tcategory: 'Physical',\n\t\t\t\t\twillCrit: false,\n\t\t\t\t\tflags: {},\n\t\t\t\t} as unknown as ActiveMove;\n\t\t\t}\n\n\t\t\t// Let's test for immunities.\n\t\t\tif (!move.ignoreImmunity || (move.ignoreImmunity !== true && !move.ignoreImmunity[move.type])) {\n\t\t\t\tif (!target.runImmunity(move.type, true)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Is it an OHKO move?\n\t\t\tif (move.ohko) {\n\t\t\t\treturn target.maxhp;\n\t\t\t}\n\n\t\t\t// We edit the damage through move's damage callback\n\t\t\tif (move.damageCallback) {\n\t\t\t\treturn move.damageCallback.call(this.battle, source, target);\n\t\t\t}\n\n\t\t\t// We take damage from damage=level moves\n\t\t\tif (move.damage === 'level') {\n\t\t\t\treturn source.level;\n\t\t\t}\n\n\t\t\t// If there's a fix move damage, we run it\n\t\t\tif (move.damage) {\n\t\t\t\treturn move.damage;\n\t\t\t}\n\n\t\t\t// We check the category and typing to calculate later on the damage\n\t\t\tmove.category = this.battle.getCategory(move);\n\t\t\t// '???' is typeless damage: used for Struggle and Confusion etc\n\t\t\tif (!move.type) move.type = '???';\n\t\t\tconst type = move.type;\n\n\t\t\t// We get the base power and apply basePowerCallback if necessary\n\t\t\tlet basePower: number | false | null | undefined = move.basePower;\n\t\t\tif (move.basePowerCallback) {\n\t\t\t\tbasePower = move.basePowerCallback.call(this.battle, source, target, move);\n\t\t\t}\n\n\t\t\t// We check for Base Power\n\t\t\tif (!basePower) {\n\t\t\t\tif (basePower === 0) return; // Returning undefined means not dealing damage\n\t\t\t\treturn basePower;\n\t\t\t}\n\t\t\tbasePower = this.battle.clampIntRange(basePower, 1);\n\n\t\t\t// Checking for the move's Critical Hit ratio\n\t\t\tlet critRatio = this.battle.runEvent('ModifyCritRatio', source, target, move, move.critRatio || 0);\n\t\t\tcritRatio = this.battle.clampIntRange(critRatio, 0, 5);\n\t\t\tconst critMult = [0, 16, 8, 4, 3, 2];\n\t\t\tlet isCrit = move.willCrit || false;\n\t\t\tif (typeof move.willCrit === 'undefined') {\n\t\t\t\tif (critRatio) {\n\t\t\t\t\tisCrit = this.battle.randomChance(1, critMult[critRatio]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (isCrit && this.battle.runEvent('CriticalHit', target, null, move)) {\n\t\t\t\ttarget.getMoveHitData(move).crit = true;\n\t\t\t}\n\n\t\t\t// Happens after crit calculation\n\t\t\tif (basePower) {\n\t\t\t\t// confusion damage\n\t\t\t\tif (move.isConfusionSelfHit) {\n\t\t\t\t\tmove.type = move.baseMoveType!;\n\t\t\t\t\tbasePower = this.battle.runEvent('BasePower', source, target, move, basePower, true);\n\t\t\t\t\tmove.type = '???';\n\t\t\t\t} else {\n\t\t\t\t\tbasePower = this.battle.runEvent('BasePower', source, target, move, basePower, true);\n\t\t\t\t}\n\t\t\t\tif (basePower && move.basePowerModifier) {\n\t\t\t\t\tbasePower *= move.basePowerModifier;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!basePower) return 0;\n\t\t\tbasePower = this.battle.clampIntRange(basePower, 1);\n\n\t\t\t// We now check for attacker and defender\n\t\t\tlet level = source.level;\n\n\t\t\t// Using Beat Up\n\t\t\tif (move.allies) {\n\t\t\t\tthis.battle.add('-activate', source, 'move: Beat Up', '[of] ' + move.allies[0].name);\n\t\t\t\tlevel = move.allies[0].level;\n\t\t\t}\n\n\t\t\tconst attacker = move.overrideOffensivePokemon === 'target' ? target : source;\n\t\t\tconst defender = move.overrideDefensivePokemon === 'source' ? source : target;\n\n\t\t\tconst isPhysical = move.category === 'Physical';\n\t\t\tconst atkType: StatIDExceptHP = move.overrideOffensiveStat || (isPhysical ? 'atk' : 'spa');\n\t\t\tconst defType: StatIDExceptHP = move.overrideDefensiveStat || (isPhysical ? 'def' : 'spd');\n\n\t\t\tlet unboosted = false;\n\t\t\tlet noburndrop = false;\n\n\t\t\tif (isCrit) {\n\t\t\t\tif (!suppressMessages) this.battle.add('-crit', target);\n\t\t\t\t// Stat level modifications are ignored if they are neutral to or favour the defender.\n\t\t\t\t// Reflect and Light Screen defensive boosts are only ignored if stat level modifications were also ignored as a result of that.\n\t\t\t\tif (attacker.boosts[atkType] <= defender.boosts[defType]) {\n\t\t\t\t\tunboosted = true;\n\t\t\t\t\tnoburndrop = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet attack = attacker.getStat(atkType, unboosted, noburndrop);\n\t\t\tlet defense = defender.getStat(defType, unboosted);\n\n\t\t\t// Using Beat Up\n\t\t\tif (move.allies) {\n\t\t\t\tattack = move.allies[0].species.baseStats.atk;\n\t\t\t\tmove.allies.shift();\n\t\t\t\tdefense = defender.species.baseStats.def;\n\t\t\t}\n\n\t\t\t// Moves that ignore offense and defense respectively.\n\t\t\tif (move.ignoreOffensive) {\n\t\t\t\tthis.battle.debug('Negating (sp)atk boost/penalty.');\n\t\t\t\t// The attack drop from the burn is only applied when attacker's attack level is higher than defender's defense level.\n\t\t\t\tattack = attacker.getStat(atkType, true, true);\n\t\t\t}\n\n\t\t\tif (move.ignoreDefensive) {\n\t\t\t\tthis.battle.debug('Negating (sp)def boost/penalty.');\n\t\t\t\tdefense = target.getStat(defType, true, true);\n\t\t\t}\n\n\t\t\tif (attack >= 256 || defense >= 256) {\n\t\t\t\tattack = this.battle.clampIntRange(Math.floor(this.battle.clampIntRange(attack, 1, 999) / 4), 1);\n\t\t\t\tdefense = this.battle.clampIntRange(Math.floor(this.battle.clampIntRange(defense, 1, 999) / 4), 1);\n\t\t\t}\n\n\t\t\t// Self destruct moves halve defense at this point.\n\t\t\tif (move.selfdestruct && defType === 'def') {\n\t\t\t\tdefense = this.battle.clampIntRange(Math.floor(defense / 2), 1);\n\t\t\t}\n\n\t\t\t// Let's go with the calculation now that we have what we need.\n\t\t\t// We do it step by step just like the game does.\n\t\t\tlet damage = level * 2;\n\t\t\tdamage = Math.floor(damage / 5);\n\t\t\tdamage += 2;\n\t\t\tdamage *= basePower;\n\t\t\tdamage *= attack;\n\t\t\tdamage = Math.floor(damage / defense);\n\t\t\tdamage = Math.floor(damage / 50);\n\t\t\tif (isCrit) damage *= 2;\n\t\t\tdamage = Math.floor(this.battle.runEvent('ModifyDamage', attacker, defender, move, damage));\n\t\t\tdamage = this.battle.clampIntRange(damage, 1, 997);\n\t\t\tdamage += 2;\n\n\t\t\t// Weather modifiers\n\t\t\tif (\n\t\t\t\t(type === 'Water' && this.battle.field.isWeather('raindance')) ||\n\t\t\t\t(type === 'Fire' && this.battle.field.isWeather('sunnyday'))\n\t\t\t) {\n\t\t\t\tdamage = Math.floor(damage * 1.5);\n\t\t\t} else if (\n\t\t\t\t((type === 'Fire' || move.id === 'solarbeam') && this.battle.field.isWeather('raindance')) ||\n\t\t\t\t(type === 'Water' && this.battle.field.isWeather('sunnyday'))\n\t\t\t) {\n\t\t\t\tdamage = Math.floor(damage / 2);\n\t\t\t}\n\n\t\t\t// STAB damage bonus, the \"???\" type never gets STAB\n\t\t\tif (type !== '???' && source.hasType(type)) {\n\t\t\t\tdamage += Math.floor(damage / 2);\n\t\t\t}\n\n\t\t\t// Type effectiveness\n\t\t\tconst totalTypeMod = target.runEffectiveness(move);\n\t\t\t// Super effective attack\n\t\t\tif (totalTypeMod > 0) {\n\t\t\t\tif (!suppressMessages) this.battle.add('-supereffective', target);\n\t\t\t\tdamage *= 2;\n\t\t\t\tif (totalTypeMod >= 2) {\n\t\t\t\t\tdamage *= 2;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Resisted attack\n\t\t\tif (totalTypeMod < 0) {\n\t\t\t\tif (!suppressMessages) this.battle.add('-resisted', target);\n\t\t\t\tdamage = Math.floor(damage / 2);\n\t\t\t\tif (totalTypeMod <= -2) {\n\t\t\t\t\tdamage = Math.floor(damage / 2);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Apply random factor if damage is greater than 1, except for Flail and Reversal\n\t\t\tif (!move.noDamageVariance && damage > 1) {\n\t\t\t\tdamage *= this.battle.random(217, 256);\n\t\t\t\tdamage = Math.floor(damage / 255);\n\t\t\t}\n\n\t\t\t// If damage is less than 1, we return 1\n\t\t\tif (basePower && !Math.floor(damage)) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// We are done, this is the final damage\n\t\t\treturn damage;\n\t\t},\n\t},\n\t/**\n\t * Stadium 2 ignores stat drops due to status ailments upon boosting the dropped stat.\n\t * For example: if a burned Snorlax uses Curse then it will ignore the attack drop from\n\t * burn when it is recalculating its attack stat. This is why volatiles are added to status\n\t * conditions, so that we can keep track of whether or not to apply the stat drop from\n\t * statuses.\n\t */\n\tboost(boost, target, source = null, effect = null) {\n\t\tif (this.event) {\n\t\t\tif (!target) target = this.event.target;\n\t\t\tif (!source) source = this.event.source;\n\t\t\tif (!effect) effect = this.effect;\n\t\t}\n\t\tif (typeof effect === 'string') effect = this.dex.conditions.get(effect);\n\t\tif (!target?.hp) return 0;\n\t\tlet success = null;\n\t\tboost = this.runEvent('TryBoost', target, source, effect, {...boost});\n\t\tlet i: BoostID;\n\t\tfor (i in boost) {\n\t\t\tconst currentBoost: SparseBoostsTable = {};\n\t\t\tcurrentBoost[i] = boost[i];\n\t\t\tlet boostBy = target.boostBy(currentBoost);\n\t\t\tlet msg = '-boost';\n\t\t\tif (boost[i]! < 0) {\n\t\t\t\tmsg = '-unboost';\n\t\t\t\tboostBy = -boostBy;\n\t\t\t}\n\t\t\tif (boostBy) {\n\t\t\t\tsuccess = true;\n\t\t\t\t// Check for boost increases deleting attack or speed drops\n\t\t\t\tif (i === 'atk' && target.status === 'brn' && target.volatiles['brnattackdrop']) {\n\t\t\t\t\ttarget.removeVolatile('brnattackdrop');\n\t\t\t\t}\n\t\t\t\tif (i === 'spe' && target.status === 'par' && target.volatiles['parspeeddrop']) {\n\t\t\t\t\ttarget.removeVolatile('parspeeddrop');\n\t\t\t\t}\n\t\t\t\tif (!effect || effect.effectType === 'Move') {\n\t\t\t\t\tthis.add(msg, target, i, boostBy);\n\t\t\t\t} else {\n\t\t\t\t\tthis.add(msg, target, i, boostBy, '[from] ' + effect.fullname);\n\t\t\t\t}\n\t\t\t\tthis.runEvent('AfterEachBoost', target, source, effect, currentBoost);\n\t\t\t}\n\t\t}\n\t\tthis.runEvent('AfterBoost', target, source, effect, boost);\n\t\treturn success;\n\t},\n\t/**\n\t * Implementing Self-KO Clause by having it check what the last move used by the players were\n\t * in the case both Pokemon faint. Since the only way this can happen in Stadium 2 is if a player\n\t * uses self-destruct or explosion, I can use this to determine who should win.\n\t */\n\tfaintMessages(lastFirst) {\n\t\tif (this.ended) return;\n\t\tconst length = this.faintQueue.length;\n\t\tif (!length) return false;\n\t\tif (lastFirst) {\n\t\t\tthis.faintQueue.unshift(this.faintQueue[this.faintQueue.length - 1]);\n\t\t\tthis.faintQueue.pop();\n\t\t}\n\t\tlet faintData;\n\t\twhile (this.faintQueue.length) {\n\t\t\tfaintData = this.faintQueue.shift()!;\n\t\t\tconst pokemon: Pokemon = faintData.target;\n\t\t\tif (!pokemon.fainted &&\n\t\t\t\tthis.runEvent('BeforeFaint', pokemon, faintData.source, faintData.effect)) {\n\t\t\t\tthis.add('faint', pokemon);\n\t\t\t\tpokemon.side.pokemonLeft--;\n\t\t\t\tif (pokemon.side.totalFainted < 100) pokemon.side.totalFainted++;\n\t\t\t\tthis.runEvent('Faint', pokemon, faintData.source, faintData.effect);\n\t\t\t\tthis.singleEvent('End', pokemon.getAbility(), pokemon.abilityState, pokemon);\n\t\t\t\tpokemon.clearVolatile(false);\n\t\t\t\tpokemon.fainted = true;\n\t\t\t\tpokemon.isActive = false;\n\t\t\t\tpokemon.isStarted = false;\n\t\t\t\tpokemon.side.faintedThisTurn = pokemon;\n\t\t\t}\n\t\t}\n\n\t\tif (this.gen <= 1) {\n\t\t\t// in gen 1, fainting skips the rest of the turn\n\t\t\t// residuals don't exist in gen 1\n\t\t\tthis.queue.clear();\n\t\t\t// Fainting clears accumulated Bide damage\n\t\t\tfor (const pokemon of this.getAllActive()) {\n\t\t\t\tif (pokemon.volatiles['bide'] && pokemon.volatiles['bide'].damage) {\n\t\t\t\t\tpokemon.volatiles['bide'].damage = 0;\n\t\t\t\t\tthis.hint(\"Desync Clause Mod activated!\");\n\t\t\t\t\tthis.hint(\"In Gen 1, Bide's accumulated damage is reset to 0 when a Pokemon faints.\");\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (this.gen <= 3 && this.gameType === 'singles') {\n\t\t\t// in gen 3 or earlier, fainting in singles skips to residuals\n\t\t\tfor (const pokemon of this.getAllActive()) {\n\t\t\t\tif (this.gen <= 2) {\n\t\t\t\t\t// in gen 2, fainting skips moves only\n\t\t\t\t\tthis.queue.cancelMove(pokemon);\n\t\t\t\t} else {\n\t\t\t\t\t// in gen 3, fainting skips all moves and switches\n\t\t\t\t\tthis.queue.cancelAction(pokemon);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!this.p1.pokemonLeft && !this.p2.pokemonLeft) {\n\t\t\tif (this.p1.lastMove !== null && this.p2.lastMove === null) {\n\t\t\t\tthis.win(this.p2);\n\t\t\t\treturn true;\n\t\t\t} else if (this.p2.lastMove !== null && this.p1.lastMove === null) {\n\t\t\t\tthis.win(this.p1);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tthis.win(faintData ? faintData.target.side.foe : null);\n\t\t\treturn true;\n\t\t}\n\t\tif (!this.p1.pokemonLeft) {\n\t\t\tthis.win(this.p2);\n\t\t\treturn true;\n\t\t}\n\t\tif (!this.p2.pokemonLeft) {\n\t\t\tthis.win(this.p1);\n\t\t\treturn true;\n\t\t}\n\t\tif (faintData) {\n\t\t\tthis.runEvent('AfterFaint', faintData.target, faintData.source, faintData.effect, length);\n\t\t}\n\t\treturn false;\n\t},\n};\n"]}
|
|
@@ -444,7 +444,7 @@ var Scripts = {
|
|
|
444
444
|
this.battle.runEvent("AfterMoveSecondary", target, pokemon, move);
|
|
445
445
|
}
|
|
446
446
|
if (move.recoil && move.totalDamage && (pokemon.side.pokemonLeft > 1 || target.side.pokemonLeft > 1 || target.hp)) {
|
|
447
|
-
this.battle.damage(this.calcRecoilDamage(move.totalDamage, move), pokemon, target, "recoil");
|
|
447
|
+
this.battle.damage(this.calcRecoilDamage(move.totalDamage, move, pokemon), pokemon, target, "recoil");
|
|
448
448
|
}
|
|
449
449
|
return damage;
|
|
450
450
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/gen2stadium2/conditions.ts","../../src/gen2stadium2/items.ts","../../src/gen2stadium2/moves.ts","../../src/gen2stadium2/rulesets.ts","../../src/gen2stadium2/scripts.ts"],"sourcesContent":["import type {ActiveMove, Battle, ModdedConditionData, Pokemon} from '@pkmn/sim';\n\n/**\n * Since Stadium 2 ignores stat drops while recalculating stats due to boosting moves, haze,\n * or stat-lowering moves. The status conditions which affect a targets stats (brn and par) have\n * a volatile along with them to keep track of if their respective stat changes should be factored\n * in during stat calculations or not.\n */\nexport const Conditions: {[k: string]: ModdedConditionData} = {\n\tbrn: {\n\t\tname: 'brn',\n\t\teffectType: 'Status',\n\t\tonStart(target) {\n\t\t\tthis.add('-status', target, 'brn');\n\t\t\ttarget.addVolatile('brnattackdrop');\n\t\t},\n\t\tonAfterMoveSelfPriority: 3,\n\t\tonAfterMoveSelf(pokemon) {\n\t\t\tresidualdmg(this, pokemon);\n\t\t},\n\t\tonSwitchIn(pokemon) {\n\t\t\tpokemon.addVolatile('brnattackdrop');\n\t\t},\n\t\tonAfterSwitchInSelf(pokemon) {\n\t\t\tresidualdmg(this, pokemon);\n\t\t},\n\t},\n\tpar: {\n\t\tname: 'par',\n\t\teffectType: 'Status',\n\t\tonStart(target) {\n\t\t\tthis.add('-status', target, 'par');\n\t\t\ttarget.addVolatile('parspeeddrop');\n\t\t},\n\t\tonBeforeMovePriority: 2,\n\t\tonBeforeMove(pokemon) {\n\t\t\tif (this.randomChance(1, 4)) {\n\t\t\t\tthis.add('cant', pokemon, 'par');\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tonSwitchIn(pokemon) {\n\t\t\tpokemon.addVolatile('parspeeddrop');\n\t\t},\n\t},\n\tslp: {\n\t\tname: 'slp',\n\t\teffectType: 'Status',\n\t\tonStart(target, source, sourceEffect) {\n\t\t\tif (sourceEffect && sourceEffect.effectType === 'Move') {\n\t\t\t\tthis.add('-status', target, 'slp', '[from] move: ' + sourceEffect.name);\n\t\t\t} else {\n\t\t\t\tthis.add('-status', target, 'slp');\n\t\t\t}\n\t\t\t// 1-4 turns, guaranteed 1 turn of sleep.\n\t\t\tthis.effectState.time = this.random(2, 5);\n\n\t\t\tif (target.removeVolatile('nightmare')) {\n\t\t\t\tthis.add('-end', target, 'Nightmare', '[silent]');\n\t\t\t}\n\t\t},\n\t\tonBeforeMovePriority: 10,\n\t\tonBeforeMove(pokemon, target, move) {\n\t\t\tpokemon.statusState.time--;\n\t\t\tif (pokemon.statusState.time <= 0) {\n\t\t\t\tpokemon.cureStatus();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.add('cant', pokemon, 'slp');\n\t\t\tif (move.sleepUsable) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t},\n\tconfusion: {\n\t\tinherit: true,\n\t\t// Stadium 2 fixed Berserk Gene afflicting Confusion for 255 turns.\n\t\tonStart(target, source, sourceEffect) {\n\t\t\tif (sourceEffect && sourceEffect.id === 'lockedmove') {\n\t\t\t\tthis.add('-start', target, 'confusion', '[silent]');\n\t\t\t} else {\n\t\t\t\tthis.add('-start', target, 'confusion');\n\t\t\t}\n\t\t\tthis.effectState.time = this.random(2, 6);\n\t\t},\n\t\tonBeforeMove(pokemon, target, move) {\n\t\t\tpokemon.volatiles['confusion'].time--;\n\t\t\tif (!pokemon.volatiles['confusion'].time) {\n\t\t\t\tpokemon.removeVolatile('confusion');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.add('-activate', pokemon, 'confusion');\n\t\t\tif (this.randomChance(1, 2)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tmove = {\n\t\t\t\tbasePower: 40,\n\t\t\t\ttype: '???',\n\t\t\t\tbaseMoveType: move.type,\n\t\t\t\tcategory: 'Physical',\n\t\t\t\twillCrit: false,\n\t\t\t\tisConfusionSelfHit: true,\n\t\t\t\tnoDamageVariance: true,\n\t\t\t\tflags: {},\n\t\t\t\tselfdestruct: move.selfdestruct,\n\t\t\t} as unknown as ActiveMove;\n\t\t\tconst damage = this.actions.getDamage(pokemon, pokemon, move);\n\t\t\tif (typeof damage !== 'number') throw new Error(\"Confusion damage not dealt\");\n\t\t\tthis.directDamage(damage);\n\t\t\treturn false;\n\t\t},\n\t},\n\tresidualdmg: {\n\t\tname: 'residualdmg',\n\t\tonStart(target) {\n\t\t\ttarget.volatiles['residualdmg'].counter = 0;\n\t\t},\n\t\tonAfterMoveSelfPriority: 100,\n\t\tonAfterMoveSelf(pokemon) {\n\t\t\tif (['brn', 'psn', 'tox'].includes(pokemon.status)) pokemon.volatiles['residualdmg'].counter++;\n\t\t},\n\t\tonAfterSwitchInSelf(pokemon) {\n\t\t\tif (['brn', 'psn', 'tox'].includes(pokemon.status)) pokemon.volatiles['residualdmg'].counter++;\n\t\t},\n\t},\n};\n\nfunction residualdmg(battle: Battle, pokemon: Pokemon) {\n\tif (pokemon.volatiles['residualdmg']) {\n\t\tconst residualDmg = battle.clampIntRange(\n\t\t\tMath.floor(pokemon.maxhp / 16) * pokemon.volatiles['residualdmg'].counter, 1\n\t\t);\n\t\tbattle.damage(residualDmg, pokemon);\n\t\tbattle.hint(\"In Gen 2, Toxic's counter is retained through Baton Pass/Heal Bell and applies to PSN/BRN.\", true);\n\t} else {\n\t\tbattle.damage(battle.clampIntRange(Math.floor(pokemon.maxhp / 8), 1), pokemon);\n\t}\n}\n","import type {ModdedItemData} from '@pkmn/sim';\n\n// Gen 2 Stadium fixes Dragon Fang and Dragon Scale having the wrong effects.\nexport const Items: {[k: string]: ModdedItemData} = {\n\tdragonfang: {\n\t\tinherit: true,\n\t\tonModifyDamage(damage, source, target, move) {\n\t\t\tif (move?.type === 'Dragon') {\n\t\t\t\treturn damage * 1.1;\n\t\t\t}\n\t\t},\n\t},\n\tdragonscale: {\n\t\tinherit: true,\n\t\tonModifyDamage() {},\n\t},\n};\n","import type {ModdedMoveData} from '@pkmn/sim';\n\nexport const Moves: {[k: string]: ModdedMoveData} = {\n\t// Belly Drum no longer boosts attack by 2 stages if under 50% health.\n\tbellydrum: {\n\t\tinherit: true,\n\t\tonHit(target) {\n\t\t\tif (target.boosts.atk >= 6 || target.hp <= target.maxhp / 2) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthis.directDamage(target.maxhp / 2);\n\t\t\tconst originalStage = target.boosts.atk;\n\t\t\tlet currentStage = originalStage;\n\t\t\tlet boosts = 0;\n\t\t\tlet loopStage = 0;\n\t\t\twhile (currentStage < 6) {\n\t\t\t\tloopStage = currentStage;\n\t\t\t\tcurrentStage++;\n\t\t\t\tif (currentStage < 6) currentStage++;\n\t\t\t\ttarget.boosts.atk = loopStage;\n\t\t\t\tif (target.getStat('atk', false, true) < 999) {\n\t\t\t\t\ttarget.boosts.atk = currentStage;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\ttarget.boosts.atk = currentStage - 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tboosts = target.boosts.atk - originalStage;\n\t\t\ttarget.boosts.atk = originalStage;\n\t\t\tthis.boost({atk: boosts});\n\t\t},\n\t},\n\tdestinybond: {\n\t\tinherit: true,\n\t\tonPrepareHit(pokemon) {\n\t\t\tif (pokemon.side.pokemonLeft === 1) {\n\t\t\t\tthis.hint(\"In Pokemon Stadium 2, Destiny Bond fails if it is being used by your last Pokemon.\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t},\n\t/**\n\t * In Stadium 2, moves which affect the stat stages of a Pokemon, such as moves which boost ones own stats,\n\t * lower the targets stats, or Haze, causes the afflicted stat to be re-calculated without factoring in\n\t * status aliments, thus if a Pokemon is burned or paralyzed and either active Pokemon uses Haze, then their\n\t * attack and speed are re-calculated while ignoring their status ailments, so their attack would go from 50% to normal\n\t */\n\thaze: {\n\t\tinherit: true,\n\t\tonHitField() {\n\t\t\tthis.add('-clearallboost');\n\t\t\tfor (const pokemon of this.getAllActive()) {\n\t\t\t\tpokemon.clearBoosts();\n\t\t\t\tpokemon.removeVolatile('brnattackdrop');\n\t\t\t\tpokemon.removeVolatile('parspeeddrop');\n\t\t\t}\n\t\t},\n\t},\n\tperishsong: {\n\t\tinherit: true,\n\t\tonPrepareHit(pokemon) {\n\t\t\tif (pokemon.side.pokemonLeft === 1) {\n\t\t\t\tthis.hint(\"In Pokemon Stadium 2, Perish Song fails if it is being used by your last Pokemon.\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t},\n};\n","import type {ModdedFormatData} from '@pkmn/sim';\n\nexport const Rulesets: {[k: string]: ModdedFormatData} = {\n\tstandard: {\n\t\teffectType: 'ValidatorRule',\n\t\tname: 'Standard',\n\t\truleset: ['Obtainable', 'Team Preview', 'Stadium Sleep Clause', 'Freeze Clause Mod', 'Self-KO Clause', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Moves Clause', 'Exact HP Mod', 'Cancel Mod', 'Stadium Items Clause'],\n\t},\n\tselfkoclause: {\n\t\teffectType: 'Rule',\n\t\tname: 'Self-KO Clause',\n\t\tdesc: \"If a player's last Pokemon uses Self-Destruct or Explosion, they automatically lose the battle.\",\n\t\tonBegin() {\n\t\t\tthis.add('rule', 'Self-KO Clause: If a player\\'s last Pokemon uses Self-Destruct/Explosion, they automatically lose');\n\t\t},\n\t},\n};\n","import type {\n\tActiveMove,\n\tBoostID,\n\tModdedBattleScriptsData,\n\tPokemon,\n\tSparseBoostsTable,\n\tStatIDExceptHP,\n} from '@pkmn/sim';\n\n/**\n * Stadium 2 mechanics inherit from gen 2 mechanics, but fixes some bugs.\n */\nexport const Scripts: ModdedBattleScriptsData = {\n\tinherit: 'gen2',\n\tgen: 2,\n\tpokemon: {\n\t\tinherit: true,\n\t\tgetStat(statName, unboosted, unmodified, fastReturn) {\n\t\t\t// @ts-ignore - type checking prevents 'hp' from being passed, but we're paranoid\n\t\t\tif (statName === 'hp') throw new Error(\"Please read `maxhp` directly\");\n\n\t\t\t// base stat\n\t\t\tlet stat = this.storedStats[statName];\n\n\t\t\t// Stat boosts.\n\t\t\tif (!unboosted) {\n\t\t\t\tlet boost = this.boosts[statName];\n\t\t\t\tif (boost > 6) boost = 6;\n\t\t\t\tif (boost < -6) boost = -6;\n\t\t\t\tif (boost >= 0) {\n\t\t\t\t\tconst boostTable = [1, 1.5, 2, 2.5, 3, 3.5, 4];\n\t\t\t\t\tstat = Math.floor(stat * boostTable[boost]);\n\t\t\t\t} else {\n\t\t\t\t\tconst numerators = [100, 66, 50, 40, 33, 28, 25];\n\t\t\t\t\tstat = Math.floor(stat * numerators[-boost] / 100);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.status === 'par' && statName === 'spe' && this.volatiles['parspeeddrop']) {\n\t\t\t\tstat = Math.floor(stat / 4);\n\t\t\t}\n\t\t\tif (!unmodified) {\n\t\t\t\tif (this.status === 'brn' && statName === 'atk' && this.volatiles['brnattackdrop']) {\n\t\t\t\t\tstat = Math.floor(stat / 2);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Gen 2 caps stats at 999 and min is 1.\n\t\t\tstat = this.battle.clampIntRange(stat, 1, 999);\n\t\t\tif (fastReturn) return stat;\n\n\t\t\t// Screens\n\t\t\tif (!unboosted) {\n\t\t\t\tif (\n\t\t\t\t\t(statName === 'def' && this.side.sideConditions['reflect']) ||\n\t\t\t\t\t(statName === 'spd' && this.side.sideConditions['lightscreen'])\n\t\t\t\t) {\n\t\t\t\t\tstat *= 2;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Handle boosting items\n\t\t\tif (\n\t\t\t\t(['Cubone', 'Marowak'].includes(this.species.name) && this.item === 'thickclub' && statName === 'atk') ||\n\t\t\t\t(this.species.name === 'Pikachu' && this.item === 'lightball' && statName === 'spa')\n\t\t\t) {\n\t\t\t\tstat *= 2;\n\t\t\t} else if (this.species.name === 'Ditto' && this.item === 'metalpowder' && ['def', 'spd'].includes(statName)) {\n\t\t\t\tstat = Math.floor(stat * 1.5);\n\t\t\t}\n\n\t\t\treturn stat;\n\t\t},\n\t},\n\t// Stadium 2 shares gen 2 code but it fixes some problems with it.\n\tactions: {\n\t\tinherit: true,\n\t\ttryMoveHit(target, pokemon, move) {\n\t\t\tconst positiveBoostTable = [1, 1.33, 1.66, 2, 2.33, 2.66, 3];\n\t\t\tconst negativeBoostTable = [1, 0.75, 0.6, 0.5, 0.43, 0.36, 0.33];\n\t\t\tconst doSelfDestruct = true;\n\t\t\tlet damage: number | false | undefined = 0;\n\n\t\t\tif (move.selfdestruct && doSelfDestruct) {\n\t\t\t\tthis.battle.faint(pokemon, pokemon, move);\n\t\t\t\t/**\n\t\t\t\t * Keeping track of the last move used for self-ko clause,\n\t\t\t\t * making sure to clear the opponents last move so that self-destruct and explosion\n\t\t\t\t * does not persist between Pokemon, preventing problems caused by situations,\n\t\t\t\t * such as a player from blowing up both they and their opponents second last Pokemon\n\t\t\t\t * and their opponent blowing up their last Pokemon. If we did not clear here, there would be a problem.\n\t\t\t\t */\n\t\t\t\ttarget.side.lastMove = null;\n\t\t\t\tpokemon.side.lastMove = move;\n\t\t\t}\n\n\t\t\tlet hitResult = this.battle.singleEvent('PrepareHit', move, {}, target, pokemon, move);\n\t\t\tif (!hitResult) {\n\t\t\t\tif (hitResult === false) this.battle.add('-fail', target);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthis.battle.runEvent('PrepareHit', pokemon, target, move);\n\n\t\t\tif (!this.battle.singleEvent('Try', move, null, pokemon, target, move)) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (move.target === 'all' || move.target === 'foeSide' || move.target === 'allySide' || move.target === 'allyTeam') {\n\t\t\t\tif (move.target === 'all') {\n\t\t\t\t\thitResult = this.battle.runEvent('TryHitField', target, pokemon, move);\n\t\t\t\t} else {\n\t\t\t\t\thitResult = this.battle.runEvent('TryHitSide', target, pokemon, move);\n\t\t\t\t}\n\t\t\t\tif (!hitResult) {\n\t\t\t\t\tif (hitResult === false) {\n\t\t\t\t\t\tthis.battle.add('-fail', pokemon);\n\t\t\t\t\t\tthis.battle.attrLastMove('[still]');\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn this.moveHit(target, pokemon, move);\n\t\t\t}\n\n\t\t\thitResult = this.battle.runEvent('Invulnerability', target, pokemon, move);\n\t\t\tif (hitResult === false) {\n\t\t\t\tthis.battle.attrLastMove('[miss]');\n\t\t\t\tthis.battle.add('-miss', pokemon);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (move.ignoreImmunity === undefined) {\n\t\t\t\tmove.ignoreImmunity = (move.category === 'Status');\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t(!move.ignoreImmunity || (move.ignoreImmunity !== true && !move.ignoreImmunity[move.type])) &&\n\t\t\t\t!target.runImmunity(move.type, true)\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\thitResult = this.battle.singleEvent('TryImmunity', move, {}, target, pokemon, move);\n\t\t\tif (hitResult === false) {\n\t\t\t\tthis.battle.add('-immune', target);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\thitResult = this.battle.runEvent('TryHit', target, pokemon, move);\n\t\t\tif (!hitResult) {\n\t\t\t\tif (hitResult === false) this.battle.add('-fail', target);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tlet accuracy = move.accuracy;\n\t\t\tif (move.alwaysHit) {\n\t\t\t\taccuracy = true;\n\t\t\t} else {\n\t\t\t\taccuracy = this.battle.runEvent('Accuracy', target, pokemon, move, accuracy);\n\t\t\t}\n\t\t\t// Now, let's calculate the accuracy.\n\t\t\tif (accuracy !== true) {\n\t\t\t\taccuracy = Math.floor(accuracy * 255 / 100);\n\t\t\t\tif (move.ohko) {\n\t\t\t\t\tif (pokemon.level >= target.level) {\n\t\t\t\t\t\taccuracy += (pokemon.level - target.level) * 2;\n\t\t\t\t\t\taccuracy = Math.min(accuracy, 255);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.battle.add('-immune', target, '[ohko]');\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!move.ignoreAccuracy) {\n\t\t\t\t\tif (pokemon.boosts.accuracy > 0) {\n\t\t\t\t\t\taccuracy *= positiveBoostTable[pokemon.boosts.accuracy];\n\t\t\t\t\t} else {\n\t\t\t\t\t\taccuracy *= negativeBoostTable[-pokemon.boosts.accuracy];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!move.ignoreEvasion) {\n\t\t\t\t\tif (target.boosts.evasion > 0 && !move.ignorePositiveEvasion) {\n\t\t\t\t\t\taccuracy *= negativeBoostTable[target.boosts.evasion];\n\t\t\t\t\t} else if (target.boosts.evasion < 0) {\n\t\t\t\t\t\taccuracy *= positiveBoostTable[-target.boosts.evasion];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\taccuracy = Math.min(Math.floor(accuracy), 255);\n\t\t\t\taccuracy = Math.max(accuracy, 1);\n\t\t\t} else {\n\t\t\t\taccuracy = this.battle.runEvent('Accuracy', target, pokemon, move, accuracy);\n\t\t\t}\n\t\t\taccuracy = this.battle.runEvent('ModifyAccuracy', target, pokemon, move, accuracy);\n\t\t\tif (accuracy !== true) accuracy = Math.max(accuracy, 0);\n\t\t\tif (move.alwaysHit) {\n\t\t\t\taccuracy = true;\n\t\t\t} else {\n\t\t\t\taccuracy = this.battle.runEvent('Accuracy', target, pokemon, move, accuracy);\n\t\t\t}\n\t\t\tif (accuracy !== true && accuracy !== 255 && !this.battle.randomChance(accuracy, 256)) {\n\t\t\t\tthis.battle.attrLastMove('[miss]');\n\t\t\t\tthis.battle.add('-miss', pokemon);\n\t\t\t\tdamage = false;\n\t\t\t\treturn damage;\n\t\t\t}\n\t\t\tmove.totalDamage = 0;\n\t\t\tpokemon.lastDamage = 0;\n\t\t\tif (move.multihit) {\n\t\t\t\tlet hits = move.multihit;\n\t\t\t\tif (Array.isArray(hits)) {\n\t\t\t\t\tif (hits[0] === 2 && hits[1] === 5) {\n\t\t\t\t\t\thits = this.battle.sample([2, 2, 2, 3, 3, 3, 4, 5]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\thits = this.battle.random(hits[0], hits[1] + 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\thits = Math.floor(hits);\n\t\t\t\tlet nullDamage = true;\n\t\t\t\tlet moveDamage: number | undefined | false;\n\n\t\t\t\tconst isSleepUsable = move.sleepUsable || this.dex.moves.get(move.sourceEffect).sleepUsable;\n\t\t\t\tlet i: number;\n\t\t\t\tfor (i = 0; i < hits && target.hp && pokemon.hp; i++) {\n\t\t\t\t\tif (pokemon.status === 'slp' && !isSleepUsable) break;\n\t\t\t\t\tmove.hit = i + 1;\n\t\t\t\t\tif (move.hit === hits) move.lastHit = true;\n\t\t\t\t\tmoveDamage = this.moveHit(target, pokemon, move);\n\t\t\t\t\tif (moveDamage === false) break;\n\t\t\t\t\tif (nullDamage && (moveDamage || moveDamage === 0 || moveDamage === undefined)) nullDamage = false;\n\t\t\t\t\tdamage = (moveDamage || 0);\n\t\t\t\t\tmove.totalDamage += damage;\n\t\t\t\t\tthis.battle.eachEvent('Update');\n\t\t\t\t}\n\t\t\t\tif (i === 0) return 1;\n\t\t\t\tif (nullDamage) damage = false;\n\t\t\t\tthis.battle.add('-hitcount', target, i);\n\t\t\t} else {\n\t\t\t\tdamage = this.moveHit(target, pokemon, move);\n\t\t\t\tmove.totalDamage = damage;\n\t\t\t}\n\t\t\tif (move.category !== 'Status') {\n\t\t\t\ttarget.gotAttacked(move, damage, pokemon);\n\t\t\t}\n\t\t\tif (move.ohko) this.battle.add('-ohko');\n\n\t\t\tif (!move.negateSecondary) {\n\t\t\t\tthis.battle.singleEvent('AfterMoveSecondary', move, null, target, pokemon, move);\n\t\t\t\tthis.battle.runEvent('AfterMoveSecondary', target, pokemon, move);\n\t\t\t}\n\t\t\t// Implementing Recoil mechanics from Stadium 2.\n\t\t\t// If a pokemon caused the other to faint with a recoil move and only one pokemon remains on both sides,\n\t\t\t// recoil damage will not be taken.\n\t\t\tif (move.recoil && move.totalDamage && (pokemon.side.pokemonLeft > 1 || target.side.pokemonLeft > 1 || target.hp)) {\n\t\t\t\tthis.battle.damage(this.calcRecoilDamage(move.totalDamage, move), pokemon, target, 'recoil');\n\t\t\t}\n\t\t\treturn damage;\n\t\t},\n\t\tgetDamage(source, target, move, suppressMessages) {\n\t\t\t// First of all, we get the move.\n\t\t\tif (typeof move === 'string') {\n\t\t\t\tmove = this.dex.getActiveMove(move);\n\t\t\t} else if (typeof move === 'number') {\n\t\t\t\tmove = {\n\t\t\t\t\tbasePower: move,\n\t\t\t\t\ttype: '???',\n\t\t\t\t\tcategory: 'Physical',\n\t\t\t\t\twillCrit: false,\n\t\t\t\t\tflags: {},\n\t\t\t\t} as unknown as ActiveMove;\n\t\t\t}\n\n\t\t\t// Let's test for immunities.\n\t\t\tif (!move.ignoreImmunity || (move.ignoreImmunity !== true && !move.ignoreImmunity[move.type])) {\n\t\t\t\tif (!target.runImmunity(move.type, true)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Is it an OHKO move?\n\t\t\tif (move.ohko) {\n\t\t\t\treturn target.maxhp;\n\t\t\t}\n\n\t\t\t// We edit the damage through move's damage callback\n\t\t\tif (move.damageCallback) {\n\t\t\t\treturn move.damageCallback.call(this.battle, source, target);\n\t\t\t}\n\n\t\t\t// We take damage from damage=level moves\n\t\t\tif (move.damage === 'level') {\n\t\t\t\treturn source.level;\n\t\t\t}\n\n\t\t\t// If there's a fix move damage, we run it\n\t\t\tif (move.damage) {\n\t\t\t\treturn move.damage;\n\t\t\t}\n\n\t\t\t// We check the category and typing to calculate later on the damage\n\t\t\tmove.category = this.battle.getCategory(move);\n\t\t\t// '???' is typeless damage: used for Struggle and Confusion etc\n\t\t\tif (!move.type) move.type = '???';\n\t\t\tconst type = move.type;\n\n\t\t\t// We get the base power and apply basePowerCallback if necessary\n\t\t\tlet basePower: number | false | null | undefined = move.basePower;\n\t\t\tif (move.basePowerCallback) {\n\t\t\t\tbasePower = move.basePowerCallback.call(this.battle, source, target, move);\n\t\t\t}\n\n\t\t\t// We check for Base Power\n\t\t\tif (!basePower) {\n\t\t\t\tif (basePower === 0) return; // Returning undefined means not dealing damage\n\t\t\t\treturn basePower;\n\t\t\t}\n\t\t\tbasePower = this.battle.clampIntRange(basePower, 1);\n\n\t\t\t// Checking for the move's Critical Hit ratio\n\t\t\tlet critRatio = this.battle.runEvent('ModifyCritRatio', source, target, move, move.critRatio || 0);\n\t\t\tcritRatio = this.battle.clampIntRange(critRatio, 0, 5);\n\t\t\tconst critMult = [0, 16, 8, 4, 3, 2];\n\t\t\tlet isCrit = move.willCrit || false;\n\t\t\tif (typeof move.willCrit === 'undefined') {\n\t\t\t\tif (critRatio) {\n\t\t\t\t\tisCrit = this.battle.randomChance(1, critMult[critRatio]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (isCrit && this.battle.runEvent('CriticalHit', target, null, move)) {\n\t\t\t\ttarget.getMoveHitData(move).crit = true;\n\t\t\t}\n\n\t\t\t// Happens after crit calculation\n\t\t\tif (basePower) {\n\t\t\t\t// confusion damage\n\t\t\t\tif (move.isConfusionSelfHit) {\n\t\t\t\t\tmove.type = move.baseMoveType!;\n\t\t\t\t\tbasePower = this.battle.runEvent('BasePower', source, target, move, basePower, true);\n\t\t\t\t\tmove.type = '???';\n\t\t\t\t} else {\n\t\t\t\t\tbasePower = this.battle.runEvent('BasePower', source, target, move, basePower, true);\n\t\t\t\t}\n\t\t\t\tif (basePower && move.basePowerModifier) {\n\t\t\t\t\tbasePower *= move.basePowerModifier;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!basePower) return 0;\n\t\t\tbasePower = this.battle.clampIntRange(basePower, 1);\n\n\t\t\t// We now check for attacker and defender\n\t\t\tlet level = source.level;\n\n\t\t\t// Using Beat Up\n\t\t\tif (move.allies) {\n\t\t\t\tthis.battle.add('-activate', source, 'move: Beat Up', '[of] ' + move.allies[0].name);\n\t\t\t\tlevel = move.allies[0].level;\n\t\t\t}\n\n\t\t\tconst attacker = move.overrideOffensivePokemon === 'target' ? target : source;\n\t\t\tconst defender = move.overrideDefensivePokemon === 'source' ? source : target;\n\n\t\t\tconst isPhysical = move.category === 'Physical';\n\t\t\tconst atkType: StatIDExceptHP = move.overrideOffensiveStat || (isPhysical ? 'atk' : 'spa');\n\t\t\tconst defType: StatIDExceptHP = move.overrideDefensiveStat || (isPhysical ? 'def' : 'spd');\n\n\t\t\tlet unboosted = false;\n\t\t\tlet noburndrop = false;\n\n\t\t\tif (isCrit) {\n\t\t\t\tif (!suppressMessages) this.battle.add('-crit', target);\n\t\t\t\t// Stat level modifications are ignored if they are neutral to or favour the defender.\n\t\t\t\t// Reflect and Light Screen defensive boosts are only ignored if stat level modifications were also ignored as a result of that.\n\t\t\t\tif (attacker.boosts[atkType] <= defender.boosts[defType]) {\n\t\t\t\t\tunboosted = true;\n\t\t\t\t\tnoburndrop = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet attack = attacker.getStat(atkType, unboosted, noburndrop);\n\t\t\tlet defense = defender.getStat(defType, unboosted);\n\n\t\t\t// Using Beat Up\n\t\t\tif (move.allies) {\n\t\t\t\tattack = move.allies[0].species.baseStats.atk;\n\t\t\t\tmove.allies.shift();\n\t\t\t\tdefense = defender.species.baseStats.def;\n\t\t\t}\n\n\t\t\t// Moves that ignore offense and defense respectively.\n\t\t\tif (move.ignoreOffensive) {\n\t\t\t\tthis.battle.debug('Negating (sp)atk boost/penalty.');\n\t\t\t\t// The attack drop from the burn is only applied when attacker's attack level is higher than defender's defense level.\n\t\t\t\tattack = attacker.getStat(atkType, true, true);\n\t\t\t}\n\n\t\t\tif (move.ignoreDefensive) {\n\t\t\t\tthis.battle.debug('Negating (sp)def boost/penalty.');\n\t\t\t\tdefense = target.getStat(defType, true, true);\n\t\t\t}\n\n\t\t\tif (attack >= 256 || defense >= 256) {\n\t\t\t\tattack = this.battle.clampIntRange(Math.floor(this.battle.clampIntRange(attack, 1, 999) / 4), 1);\n\t\t\t\tdefense = this.battle.clampIntRange(Math.floor(this.battle.clampIntRange(defense, 1, 999) / 4), 1);\n\t\t\t}\n\n\t\t\t// Self destruct moves halve defense at this point.\n\t\t\tif (move.selfdestruct && defType === 'def') {\n\t\t\t\tdefense = this.battle.clampIntRange(Math.floor(defense / 2), 1);\n\t\t\t}\n\n\t\t\t// Let's go with the calculation now that we have what we need.\n\t\t\t// We do it step by step just like the game does.\n\t\t\tlet damage = level * 2;\n\t\t\tdamage = Math.floor(damage / 5);\n\t\t\tdamage += 2;\n\t\t\tdamage *= basePower;\n\t\t\tdamage *= attack;\n\t\t\tdamage = Math.floor(damage / defense);\n\t\t\tdamage = Math.floor(damage / 50);\n\t\t\tif (isCrit) damage *= 2;\n\t\t\tdamage = Math.floor(this.battle.runEvent('ModifyDamage', attacker, defender, move, damage));\n\t\t\tdamage = this.battle.clampIntRange(damage, 1, 997);\n\t\t\tdamage += 2;\n\n\t\t\t// Weather modifiers\n\t\t\tif (\n\t\t\t\t(type === 'Water' && this.battle.field.isWeather('raindance')) ||\n\t\t\t\t(type === 'Fire' && this.battle.field.isWeather('sunnyday'))\n\t\t\t) {\n\t\t\t\tdamage = Math.floor(damage * 1.5);\n\t\t\t} else if (\n\t\t\t\t((type === 'Fire' || move.id === 'solarbeam') && this.battle.field.isWeather('raindance')) ||\n\t\t\t\t(type === 'Water' && this.battle.field.isWeather('sunnyday'))\n\t\t\t) {\n\t\t\t\tdamage = Math.floor(damage / 2);\n\t\t\t}\n\n\t\t\t// STAB damage bonus, the \"???\" type never gets STAB\n\t\t\tif (type !== '???' && source.hasType(type)) {\n\t\t\t\tdamage += Math.floor(damage / 2);\n\t\t\t}\n\n\t\t\t// Type effectiveness\n\t\t\tconst totalTypeMod = target.runEffectiveness(move);\n\t\t\t// Super effective attack\n\t\t\tif (totalTypeMod > 0) {\n\t\t\t\tif (!suppressMessages) this.battle.add('-supereffective', target);\n\t\t\t\tdamage *= 2;\n\t\t\t\tif (totalTypeMod >= 2) {\n\t\t\t\t\tdamage *= 2;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Resisted attack\n\t\t\tif (totalTypeMod < 0) {\n\t\t\t\tif (!suppressMessages) this.battle.add('-resisted', target);\n\t\t\t\tdamage = Math.floor(damage / 2);\n\t\t\t\tif (totalTypeMod <= -2) {\n\t\t\t\t\tdamage = Math.floor(damage / 2);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Apply random factor if damage is greater than 1, except for Flail and Reversal\n\t\t\tif (!move.noDamageVariance && damage > 1) {\n\t\t\t\tdamage *= this.battle.random(217, 256);\n\t\t\t\tdamage = Math.floor(damage / 255);\n\t\t\t}\n\n\t\t\t// If damage is less than 1, we return 1\n\t\t\tif (basePower && !Math.floor(damage)) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// We are done, this is the final damage\n\t\t\treturn damage;\n\t\t},\n\t},\n\t/**\n\t * Stadium 2 ignores stat drops due to status ailments upon boosting the dropped stat.\n\t * For example: if a burned Snorlax uses Curse then it will ignore the attack drop from\n\t * burn when it is recalculating its attack stat. This is why volatiles are added to status\n\t * conditions, so that we can keep track of whether or not to apply the stat drop from\n\t * statuses.\n\t */\n\tboost(boost, target, source = null, effect = null) {\n\t\tif (this.event) {\n\t\t\tif (!target) target = this.event.target;\n\t\t\tif (!source) source = this.event.source;\n\t\t\tif (!effect) effect = this.effect;\n\t\t}\n\t\tif (typeof effect === 'string') effect = this.dex.conditions.get(effect);\n\t\tif (!target?.hp) return 0;\n\t\tlet success = null;\n\t\tboost = this.runEvent('TryBoost', target, source, effect, {...boost});\n\t\tlet i: BoostID;\n\t\tfor (i in boost) {\n\t\t\tconst currentBoost: SparseBoostsTable = {};\n\t\t\tcurrentBoost[i] = boost[i];\n\t\t\tlet boostBy = target.boostBy(currentBoost);\n\t\t\tlet msg = '-boost';\n\t\t\tif (boost[i]! < 0) {\n\t\t\t\tmsg = '-unboost';\n\t\t\t\tboostBy = -boostBy;\n\t\t\t}\n\t\t\tif (boostBy) {\n\t\t\t\tsuccess = true;\n\t\t\t\t// Check for boost increases deleting attack or speed drops\n\t\t\t\tif (i === 'atk' && target.status === 'brn' && target.volatiles['brnattackdrop']) {\n\t\t\t\t\ttarget.removeVolatile('brnattackdrop');\n\t\t\t\t}\n\t\t\t\tif (i === 'spe' && target.status === 'par' && target.volatiles['parspeeddrop']) {\n\t\t\t\t\ttarget.removeVolatile('parspeeddrop');\n\t\t\t\t}\n\t\t\t\tif (!effect || effect.effectType === 'Move') {\n\t\t\t\t\tthis.add(msg, target, i, boostBy);\n\t\t\t\t} else {\n\t\t\t\t\tthis.add(msg, target, i, boostBy, '[from] ' + effect.fullname);\n\t\t\t\t}\n\t\t\t\tthis.runEvent('AfterEachBoost', target, source, effect, currentBoost);\n\t\t\t}\n\t\t}\n\t\tthis.runEvent('AfterBoost', target, source, effect, boost);\n\t\treturn success;\n\t},\n\t/**\n\t * Implementing Self-KO Clause by having it check what the last move used by the players were\n\t * in the case both Pokemon faint. Since the only way this can happen in Stadium 2 is if a player\n\t * uses self-destruct or explosion, I can use this to determine who should win.\n\t */\n\tfaintMessages(lastFirst) {\n\t\tif (this.ended) return;\n\t\tconst length = this.faintQueue.length;\n\t\tif (!length) return false;\n\t\tif (lastFirst) {\n\t\t\tthis.faintQueue.unshift(this.faintQueue[this.faintQueue.length - 1]);\n\t\t\tthis.faintQueue.pop();\n\t\t}\n\t\tlet faintData;\n\t\twhile (this.faintQueue.length) {\n\t\t\tfaintData = this.faintQueue.shift()!;\n\t\t\tconst pokemon: Pokemon = faintData.target;\n\t\t\tif (!pokemon.fainted &&\n\t\t\t\tthis.runEvent('BeforeFaint', pokemon, faintData.source, faintData.effect)) {\n\t\t\t\tthis.add('faint', pokemon);\n\t\t\t\tpokemon.side.pokemonLeft--;\n\t\t\t\tif (pokemon.side.totalFainted < 100) pokemon.side.totalFainted++;\n\t\t\t\tthis.runEvent('Faint', pokemon, faintData.source, faintData.effect);\n\t\t\t\tthis.singleEvent('End', pokemon.getAbility(), pokemon.abilityState, pokemon);\n\t\t\t\tpokemon.clearVolatile(false);\n\t\t\t\tpokemon.fainted = true;\n\t\t\t\tpokemon.isActive = false;\n\t\t\t\tpokemon.isStarted = false;\n\t\t\t\tpokemon.side.faintedThisTurn = pokemon;\n\t\t\t}\n\t\t}\n\n\t\tif (this.gen <= 1) {\n\t\t\t// in gen 1, fainting skips the rest of the turn\n\t\t\t// residuals don't exist in gen 1\n\t\t\tthis.queue.clear();\n\t\t\t// Fainting clears accumulated Bide damage\n\t\t\tfor (const pokemon of this.getAllActive()) {\n\t\t\t\tif (pokemon.volatiles['bide'] && pokemon.volatiles['bide'].damage) {\n\t\t\t\t\tpokemon.volatiles['bide'].damage = 0;\n\t\t\t\t\tthis.hint(\"Desync Clause Mod activated!\");\n\t\t\t\t\tthis.hint(\"In Gen 1, Bide's accumulated damage is reset to 0 when a Pokemon faints.\");\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (this.gen <= 3 && this.gameType === 'singles') {\n\t\t\t// in gen 3 or earlier, fainting in singles skips to residuals\n\t\t\tfor (const pokemon of this.getAllActive()) {\n\t\t\t\tif (this.gen <= 2) {\n\t\t\t\t\t// in gen 2, fainting skips moves only\n\t\t\t\t\tthis.queue.cancelMove(pokemon);\n\t\t\t\t} else {\n\t\t\t\t\t// in gen 3, fainting skips all moves and switches\n\t\t\t\t\tthis.queue.cancelAction(pokemon);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!this.p1.pokemonLeft && !this.p2.pokemonLeft) {\n\t\t\tif (this.p1.lastMove !== null && this.p2.lastMove === null) {\n\t\t\t\tthis.win(this.p2);\n\t\t\t\treturn true;\n\t\t\t} else if (this.p2.lastMove !== null && this.p1.lastMove === null) {\n\t\t\t\tthis.win(this.p1);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tthis.win(faintData ? faintData.target.side.foe : null);\n\t\t\treturn true;\n\t\t}\n\t\tif (!this.p1.pokemonLeft) {\n\t\t\tthis.win(this.p2);\n\t\t\treturn true;\n\t\t}\n\t\tif (!this.p2.pokemonLeft) {\n\t\t\tthis.win(this.p1);\n\t\t\treturn true;\n\t\t}\n\t\tif (faintData) {\n\t\t\tthis.runEvent('AfterFaint', faintData.target, faintData.source, faintData.effect, length);\n\t\t}\n\t\treturn false;\n\t},\n};\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/gen2stadium2/conditions.ts","../../src/gen2stadium2/items.ts","../../src/gen2stadium2/moves.ts","../../src/gen2stadium2/rulesets.ts","../../src/gen2stadium2/scripts.ts"],"sourcesContent":["import type {ActiveMove, Battle, ModdedConditionData, Pokemon} from '@pkmn/sim';\n\n/**\n * Since Stadium 2 ignores stat drops while recalculating stats due to boosting moves, haze,\n * or stat-lowering moves. The status conditions which affect a targets stats (brn and par) have\n * a volatile along with them to keep track of if their respective stat changes should be factored\n * in during stat calculations or not.\n */\nexport const Conditions: {[k: string]: ModdedConditionData} = {\n\tbrn: {\n\t\tname: 'brn',\n\t\teffectType: 'Status',\n\t\tonStart(target) {\n\t\t\tthis.add('-status', target, 'brn');\n\t\t\ttarget.addVolatile('brnattackdrop');\n\t\t},\n\t\tonAfterMoveSelfPriority: 3,\n\t\tonAfterMoveSelf(pokemon) {\n\t\t\tresidualdmg(this, pokemon);\n\t\t},\n\t\tonSwitchIn(pokemon) {\n\t\t\tpokemon.addVolatile('brnattackdrop');\n\t\t},\n\t\tonAfterSwitchInSelf(pokemon) {\n\t\t\tresidualdmg(this, pokemon);\n\t\t},\n\t},\n\tpar: {\n\t\tname: 'par',\n\t\teffectType: 'Status',\n\t\tonStart(target) {\n\t\t\tthis.add('-status', target, 'par');\n\t\t\ttarget.addVolatile('parspeeddrop');\n\t\t},\n\t\tonBeforeMovePriority: 2,\n\t\tonBeforeMove(pokemon) {\n\t\t\tif (this.randomChance(1, 4)) {\n\t\t\t\tthis.add('cant', pokemon, 'par');\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tonSwitchIn(pokemon) {\n\t\t\tpokemon.addVolatile('parspeeddrop');\n\t\t},\n\t},\n\tslp: {\n\t\tname: 'slp',\n\t\teffectType: 'Status',\n\t\tonStart(target, source, sourceEffect) {\n\t\t\tif (sourceEffect && sourceEffect.effectType === 'Move') {\n\t\t\t\tthis.add('-status', target, 'slp', '[from] move: ' + sourceEffect.name);\n\t\t\t} else {\n\t\t\t\tthis.add('-status', target, 'slp');\n\t\t\t}\n\t\t\t// 1-4 turns, guaranteed 1 turn of sleep.\n\t\t\tthis.effectState.time = this.random(2, 5);\n\n\t\t\tif (target.removeVolatile('nightmare')) {\n\t\t\t\tthis.add('-end', target, 'Nightmare', '[silent]');\n\t\t\t}\n\t\t},\n\t\tonBeforeMovePriority: 10,\n\t\tonBeforeMove(pokemon, target, move) {\n\t\t\tpokemon.statusState.time--;\n\t\t\tif (pokemon.statusState.time <= 0) {\n\t\t\t\tpokemon.cureStatus();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.add('cant', pokemon, 'slp');\n\t\t\tif (move.sleepUsable) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t},\n\tconfusion: {\n\t\tinherit: true,\n\t\t// Stadium 2 fixed Berserk Gene afflicting Confusion for 255 turns.\n\t\tonStart(target, source, sourceEffect) {\n\t\t\tif (sourceEffect && sourceEffect.id === 'lockedmove') {\n\t\t\t\tthis.add('-start', target, 'confusion', '[silent]');\n\t\t\t} else {\n\t\t\t\tthis.add('-start', target, 'confusion');\n\t\t\t}\n\t\t\tthis.effectState.time = this.random(2, 6);\n\t\t},\n\t\tonBeforeMove(pokemon, target, move) {\n\t\t\tpokemon.volatiles['confusion'].time--;\n\t\t\tif (!pokemon.volatiles['confusion'].time) {\n\t\t\t\tpokemon.removeVolatile('confusion');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.add('-activate', pokemon, 'confusion');\n\t\t\tif (this.randomChance(1, 2)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tmove = {\n\t\t\t\tbasePower: 40,\n\t\t\t\ttype: '???',\n\t\t\t\tbaseMoveType: move.type,\n\t\t\t\tcategory: 'Physical',\n\t\t\t\twillCrit: false,\n\t\t\t\tisConfusionSelfHit: true,\n\t\t\t\tnoDamageVariance: true,\n\t\t\t\tflags: {},\n\t\t\t\tselfdestruct: move.selfdestruct,\n\t\t\t} as unknown as ActiveMove;\n\t\t\tconst damage = this.actions.getDamage(pokemon, pokemon, move);\n\t\t\tif (typeof damage !== 'number') throw new Error(\"Confusion damage not dealt\");\n\t\t\tthis.directDamage(damage);\n\t\t\treturn false;\n\t\t},\n\t},\n\tresidualdmg: {\n\t\tname: 'residualdmg',\n\t\tonStart(target) {\n\t\t\ttarget.volatiles['residualdmg'].counter = 0;\n\t\t},\n\t\tonAfterMoveSelfPriority: 100,\n\t\tonAfterMoveSelf(pokemon) {\n\t\t\tif (['brn', 'psn', 'tox'].includes(pokemon.status)) pokemon.volatiles['residualdmg'].counter++;\n\t\t},\n\t\tonAfterSwitchInSelf(pokemon) {\n\t\t\tif (['brn', 'psn', 'tox'].includes(pokemon.status)) pokemon.volatiles['residualdmg'].counter++;\n\t\t},\n\t},\n};\n\nfunction residualdmg(battle: Battle, pokemon: Pokemon) {\n\tif (pokemon.volatiles['residualdmg']) {\n\t\tconst residualDmg = battle.clampIntRange(\n\t\t\tMath.floor(pokemon.maxhp / 16) * pokemon.volatiles['residualdmg'].counter, 1\n\t\t);\n\t\tbattle.damage(residualDmg, pokemon);\n\t\tbattle.hint(\"In Gen 2, Toxic's counter is retained through Baton Pass/Heal Bell and applies to PSN/BRN.\", true);\n\t} else {\n\t\tbattle.damage(battle.clampIntRange(Math.floor(pokemon.maxhp / 8), 1), pokemon);\n\t}\n}\n","import type {ModdedItemData} from '@pkmn/sim';\n\n// Gen 2 Stadium fixes Dragon Fang and Dragon Scale having the wrong effects.\nexport const Items: {[k: string]: ModdedItemData} = {\n\tdragonfang: {\n\t\tinherit: true,\n\t\tonModifyDamage(damage, source, target, move) {\n\t\t\tif (move?.type === 'Dragon') {\n\t\t\t\treturn damage * 1.1;\n\t\t\t}\n\t\t},\n\t},\n\tdragonscale: {\n\t\tinherit: true,\n\t\tonModifyDamage() {},\n\t},\n};\n","import type {ModdedMoveData} from '@pkmn/sim';\n\nexport const Moves: {[k: string]: ModdedMoveData} = {\n\t// Belly Drum no longer boosts attack by 2 stages if under 50% health.\n\tbellydrum: {\n\t\tinherit: true,\n\t\tonHit(target) {\n\t\t\tif (target.boosts.atk >= 6 || target.hp <= target.maxhp / 2) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthis.directDamage(target.maxhp / 2);\n\t\t\tconst originalStage = target.boosts.atk;\n\t\t\tlet currentStage = originalStage;\n\t\t\tlet boosts = 0;\n\t\t\tlet loopStage = 0;\n\t\t\twhile (currentStage < 6) {\n\t\t\t\tloopStage = currentStage;\n\t\t\t\tcurrentStage++;\n\t\t\t\tif (currentStage < 6) currentStage++;\n\t\t\t\ttarget.boosts.atk = loopStage;\n\t\t\t\tif (target.getStat('atk', false, true) < 999) {\n\t\t\t\t\ttarget.boosts.atk = currentStage;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\ttarget.boosts.atk = currentStage - 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tboosts = target.boosts.atk - originalStage;\n\t\t\ttarget.boosts.atk = originalStage;\n\t\t\tthis.boost({atk: boosts});\n\t\t},\n\t},\n\tdestinybond: {\n\t\tinherit: true,\n\t\tonPrepareHit(pokemon) {\n\t\t\tif (pokemon.side.pokemonLeft === 1) {\n\t\t\t\tthis.hint(\"In Pokemon Stadium 2, Destiny Bond fails if it is being used by your last Pokemon.\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t},\n\t/**\n\t * In Stadium 2, moves which affect the stat stages of a Pokemon, such as moves which boost ones own stats,\n\t * lower the targets stats, or Haze, causes the afflicted stat to be re-calculated without factoring in\n\t * status aliments, thus if a Pokemon is burned or paralyzed and either active Pokemon uses Haze, then their\n\t * attack and speed are re-calculated while ignoring their status ailments, so their attack would go from 50% to normal\n\t */\n\thaze: {\n\t\tinherit: true,\n\t\tonHitField() {\n\t\t\tthis.add('-clearallboost');\n\t\t\tfor (const pokemon of this.getAllActive()) {\n\t\t\t\tpokemon.clearBoosts();\n\t\t\t\tpokemon.removeVolatile('brnattackdrop');\n\t\t\t\tpokemon.removeVolatile('parspeeddrop');\n\t\t\t}\n\t\t},\n\t},\n\tperishsong: {\n\t\tinherit: true,\n\t\tonPrepareHit(pokemon) {\n\t\t\tif (pokemon.side.pokemonLeft === 1) {\n\t\t\t\tthis.hint(\"In Pokemon Stadium 2, Perish Song fails if it is being used by your last Pokemon.\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t},\n};\n","import type {ModdedFormatData} from '@pkmn/sim';\n\nexport const Rulesets: {[k: string]: ModdedFormatData} = {\n\tstandard: {\n\t\teffectType: 'ValidatorRule',\n\t\tname: 'Standard',\n\t\truleset: ['Obtainable', 'Team Preview', 'Stadium Sleep Clause', 'Freeze Clause Mod', 'Self-KO Clause', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Moves Clause', 'Exact HP Mod', 'Cancel Mod', 'Stadium Items Clause'],\n\t},\n\tselfkoclause: {\n\t\teffectType: 'Rule',\n\t\tname: 'Self-KO Clause',\n\t\tdesc: \"If a player's last Pokemon uses Self-Destruct or Explosion, they automatically lose the battle.\",\n\t\tonBegin() {\n\t\t\tthis.add('rule', 'Self-KO Clause: If a player\\'s last Pokemon uses Self-Destruct/Explosion, they automatically lose');\n\t\t},\n\t},\n};\n","import type {\n\tActiveMove,\n\tBoostID,\n\tModdedBattleScriptsData,\n\tPokemon,\n\tSparseBoostsTable,\n\tStatIDExceptHP,\n} from '@pkmn/sim';\n\n/**\n * Stadium 2 mechanics inherit from gen 2 mechanics, but fixes some bugs.\n */\nexport const Scripts: ModdedBattleScriptsData = {\n\tinherit: 'gen2',\n\tgen: 2,\n\tpokemon: {\n\t\tinherit: true,\n\t\tgetStat(statName, unboosted, unmodified, fastReturn) {\n\t\t\t// @ts-ignore - type checking prevents 'hp' from being passed, but we're paranoid\n\t\t\tif (statName === 'hp') throw new Error(\"Please read `maxhp` directly\");\n\n\t\t\t// base stat\n\t\t\tlet stat = this.storedStats[statName];\n\n\t\t\t// Stat boosts.\n\t\t\tif (!unboosted) {\n\t\t\t\tlet boost = this.boosts[statName];\n\t\t\t\tif (boost > 6) boost = 6;\n\t\t\t\tif (boost < -6) boost = -6;\n\t\t\t\tif (boost >= 0) {\n\t\t\t\t\tconst boostTable = [1, 1.5, 2, 2.5, 3, 3.5, 4];\n\t\t\t\t\tstat = Math.floor(stat * boostTable[boost]);\n\t\t\t\t} else {\n\t\t\t\t\tconst numerators = [100, 66, 50, 40, 33, 28, 25];\n\t\t\t\t\tstat = Math.floor(stat * numerators[-boost] / 100);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.status === 'par' && statName === 'spe' && this.volatiles['parspeeddrop']) {\n\t\t\t\tstat = Math.floor(stat / 4);\n\t\t\t}\n\t\t\tif (!unmodified) {\n\t\t\t\tif (this.status === 'brn' && statName === 'atk' && this.volatiles['brnattackdrop']) {\n\t\t\t\t\tstat = Math.floor(stat / 2);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Gen 2 caps stats at 999 and min is 1.\n\t\t\tstat = this.battle.clampIntRange(stat, 1, 999);\n\t\t\tif (fastReturn) return stat;\n\n\t\t\t// Screens\n\t\t\tif (!unboosted) {\n\t\t\t\tif (\n\t\t\t\t\t(statName === 'def' && this.side.sideConditions['reflect']) ||\n\t\t\t\t\t(statName === 'spd' && this.side.sideConditions['lightscreen'])\n\t\t\t\t) {\n\t\t\t\t\tstat *= 2;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Handle boosting items\n\t\t\tif (\n\t\t\t\t(['Cubone', 'Marowak'].includes(this.species.name) && this.item === 'thickclub' && statName === 'atk') ||\n\t\t\t\t(this.species.name === 'Pikachu' && this.item === 'lightball' && statName === 'spa')\n\t\t\t) {\n\t\t\t\tstat *= 2;\n\t\t\t} else if (this.species.name === 'Ditto' && this.item === 'metalpowder' && ['def', 'spd'].includes(statName)) {\n\t\t\t\tstat = Math.floor(stat * 1.5);\n\t\t\t}\n\n\t\t\treturn stat;\n\t\t},\n\t},\n\t// Stadium 2 shares gen 2 code but it fixes some problems with it.\n\tactions: {\n\t\tinherit: true,\n\t\ttryMoveHit(target, pokemon, move) {\n\t\t\tconst positiveBoostTable = [1, 1.33, 1.66, 2, 2.33, 2.66, 3];\n\t\t\tconst negativeBoostTable = [1, 0.75, 0.6, 0.5, 0.43, 0.36, 0.33];\n\t\t\tconst doSelfDestruct = true;\n\t\t\tlet damage: number | false | undefined = 0;\n\n\t\t\tif (move.selfdestruct && doSelfDestruct) {\n\t\t\t\tthis.battle.faint(pokemon, pokemon, move);\n\t\t\t\t/**\n\t\t\t\t * Keeping track of the last move used for self-ko clause,\n\t\t\t\t * making sure to clear the opponents last move so that self-destruct and explosion\n\t\t\t\t * does not persist between Pokemon, preventing problems caused by situations,\n\t\t\t\t * such as a player from blowing up both they and their opponents second last Pokemon\n\t\t\t\t * and their opponent blowing up their last Pokemon. If we did not clear here, there would be a problem.\n\t\t\t\t */\n\t\t\t\ttarget.side.lastMove = null;\n\t\t\t\tpokemon.side.lastMove = move;\n\t\t\t}\n\n\t\t\tlet hitResult = this.battle.singleEvent('PrepareHit', move, {}, target, pokemon, move);\n\t\t\tif (!hitResult) {\n\t\t\t\tif (hitResult === false) this.battle.add('-fail', target);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthis.battle.runEvent('PrepareHit', pokemon, target, move);\n\n\t\t\tif (!this.battle.singleEvent('Try', move, null, pokemon, target, move)) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (move.target === 'all' || move.target === 'foeSide' || move.target === 'allySide' || move.target === 'allyTeam') {\n\t\t\t\tif (move.target === 'all') {\n\t\t\t\t\thitResult = this.battle.runEvent('TryHitField', target, pokemon, move);\n\t\t\t\t} else {\n\t\t\t\t\thitResult = this.battle.runEvent('TryHitSide', target, pokemon, move);\n\t\t\t\t}\n\t\t\t\tif (!hitResult) {\n\t\t\t\t\tif (hitResult === false) {\n\t\t\t\t\t\tthis.battle.add('-fail', pokemon);\n\t\t\t\t\t\tthis.battle.attrLastMove('[still]');\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn this.moveHit(target, pokemon, move);\n\t\t\t}\n\n\t\t\thitResult = this.battle.runEvent('Invulnerability', target, pokemon, move);\n\t\t\tif (hitResult === false) {\n\t\t\t\tthis.battle.attrLastMove('[miss]');\n\t\t\t\tthis.battle.add('-miss', pokemon);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (move.ignoreImmunity === undefined) {\n\t\t\t\tmove.ignoreImmunity = (move.category === 'Status');\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t(!move.ignoreImmunity || (move.ignoreImmunity !== true && !move.ignoreImmunity[move.type])) &&\n\t\t\t\t!target.runImmunity(move.type, true)\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\thitResult = this.battle.singleEvent('TryImmunity', move, {}, target, pokemon, move);\n\t\t\tif (hitResult === false) {\n\t\t\t\tthis.battle.add('-immune', target);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\thitResult = this.battle.runEvent('TryHit', target, pokemon, move);\n\t\t\tif (!hitResult) {\n\t\t\t\tif (hitResult === false) this.battle.add('-fail', target);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tlet accuracy = move.accuracy;\n\t\t\tif (move.alwaysHit) {\n\t\t\t\taccuracy = true;\n\t\t\t} else {\n\t\t\t\taccuracy = this.battle.runEvent('Accuracy', target, pokemon, move, accuracy);\n\t\t\t}\n\t\t\t// Now, let's calculate the accuracy.\n\t\t\tif (accuracy !== true) {\n\t\t\t\taccuracy = Math.floor(accuracy * 255 / 100);\n\t\t\t\tif (move.ohko) {\n\t\t\t\t\tif (pokemon.level >= target.level) {\n\t\t\t\t\t\taccuracy += (pokemon.level - target.level) * 2;\n\t\t\t\t\t\taccuracy = Math.min(accuracy, 255);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.battle.add('-immune', target, '[ohko]');\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!move.ignoreAccuracy) {\n\t\t\t\t\tif (pokemon.boosts.accuracy > 0) {\n\t\t\t\t\t\taccuracy *= positiveBoostTable[pokemon.boosts.accuracy];\n\t\t\t\t\t} else {\n\t\t\t\t\t\taccuracy *= negativeBoostTable[-pokemon.boosts.accuracy];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!move.ignoreEvasion) {\n\t\t\t\t\tif (target.boosts.evasion > 0 && !move.ignorePositiveEvasion) {\n\t\t\t\t\t\taccuracy *= negativeBoostTable[target.boosts.evasion];\n\t\t\t\t\t} else if (target.boosts.evasion < 0) {\n\t\t\t\t\t\taccuracy *= positiveBoostTable[-target.boosts.evasion];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\taccuracy = Math.min(Math.floor(accuracy), 255);\n\t\t\t\taccuracy = Math.max(accuracy, 1);\n\t\t\t} else {\n\t\t\t\taccuracy = this.battle.runEvent('Accuracy', target, pokemon, move, accuracy);\n\t\t\t}\n\t\t\taccuracy = this.battle.runEvent('ModifyAccuracy', target, pokemon, move, accuracy);\n\t\t\tif (accuracy !== true) accuracy = Math.max(accuracy, 0);\n\t\t\tif (move.alwaysHit) {\n\t\t\t\taccuracy = true;\n\t\t\t} else {\n\t\t\t\taccuracy = this.battle.runEvent('Accuracy', target, pokemon, move, accuracy);\n\t\t\t}\n\t\t\tif (accuracy !== true && accuracy !== 255 && !this.battle.randomChance(accuracy, 256)) {\n\t\t\t\tthis.battle.attrLastMove('[miss]');\n\t\t\t\tthis.battle.add('-miss', pokemon);\n\t\t\t\tdamage = false;\n\t\t\t\treturn damage;\n\t\t\t}\n\t\t\tmove.totalDamage = 0;\n\t\t\tpokemon.lastDamage = 0;\n\t\t\tif (move.multihit) {\n\t\t\t\tlet hits = move.multihit;\n\t\t\t\tif (Array.isArray(hits)) {\n\t\t\t\t\tif (hits[0] === 2 && hits[1] === 5) {\n\t\t\t\t\t\thits = this.battle.sample([2, 2, 2, 3, 3, 3, 4, 5]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\thits = this.battle.random(hits[0], hits[1] + 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\thits = Math.floor(hits);\n\t\t\t\tlet nullDamage = true;\n\t\t\t\tlet moveDamage: number | undefined | false;\n\n\t\t\t\tconst isSleepUsable = move.sleepUsable || this.dex.moves.get(move.sourceEffect).sleepUsable;\n\t\t\t\tlet i: number;\n\t\t\t\tfor (i = 0; i < hits && target.hp && pokemon.hp; i++) {\n\t\t\t\t\tif (pokemon.status === 'slp' && !isSleepUsable) break;\n\t\t\t\t\tmove.hit = i + 1;\n\t\t\t\t\tif (move.hit === hits) move.lastHit = true;\n\t\t\t\t\tmoveDamage = this.moveHit(target, pokemon, move);\n\t\t\t\t\tif (moveDamage === false) break;\n\t\t\t\t\tif (nullDamage && (moveDamage || moveDamage === 0 || moveDamage === undefined)) nullDamage = false;\n\t\t\t\t\tdamage = (moveDamage || 0);\n\t\t\t\t\tmove.totalDamage += damage;\n\t\t\t\t\tthis.battle.eachEvent('Update');\n\t\t\t\t}\n\t\t\t\tif (i === 0) return 1;\n\t\t\t\tif (nullDamage) damage = false;\n\t\t\t\tthis.battle.add('-hitcount', target, i);\n\t\t\t} else {\n\t\t\t\tdamage = this.moveHit(target, pokemon, move);\n\t\t\t\tmove.totalDamage = damage;\n\t\t\t}\n\t\t\tif (move.category !== 'Status') {\n\t\t\t\ttarget.gotAttacked(move, damage, pokemon);\n\t\t\t}\n\t\t\tif (move.ohko) this.battle.add('-ohko');\n\n\t\t\tif (!move.negateSecondary) {\n\t\t\t\tthis.battle.singleEvent('AfterMoveSecondary', move, null, target, pokemon, move);\n\t\t\t\tthis.battle.runEvent('AfterMoveSecondary', target, pokemon, move);\n\t\t\t}\n\t\t\t// Implementing Recoil mechanics from Stadium 2.\n\t\t\t// If a pokemon caused the other to faint with a recoil move and only one pokemon remains on both sides,\n\t\t\t// recoil damage will not be taken.\n\t\t\tif (move.recoil && move.totalDamage && (pokemon.side.pokemonLeft > 1 || target.side.pokemonLeft > 1 || target.hp)) {\n\t\t\t\tthis.battle.damage(this.calcRecoilDamage(move.totalDamage, move, pokemon), pokemon, target, 'recoil');\n\t\t\t}\n\t\t\treturn damage;\n\t\t},\n\t\tgetDamage(source, target, move, suppressMessages) {\n\t\t\t// First of all, we get the move.\n\t\t\tif (typeof move === 'string') {\n\t\t\t\tmove = this.dex.getActiveMove(move);\n\t\t\t} else if (typeof move === 'number') {\n\t\t\t\tmove = {\n\t\t\t\t\tbasePower: move,\n\t\t\t\t\ttype: '???',\n\t\t\t\t\tcategory: 'Physical',\n\t\t\t\t\twillCrit: false,\n\t\t\t\t\tflags: {},\n\t\t\t\t} as unknown as ActiveMove;\n\t\t\t}\n\n\t\t\t// Let's test for immunities.\n\t\t\tif (!move.ignoreImmunity || (move.ignoreImmunity !== true && !move.ignoreImmunity[move.type])) {\n\t\t\t\tif (!target.runImmunity(move.type, true)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Is it an OHKO move?\n\t\t\tif (move.ohko) {\n\t\t\t\treturn target.maxhp;\n\t\t\t}\n\n\t\t\t// We edit the damage through move's damage callback\n\t\t\tif (move.damageCallback) {\n\t\t\t\treturn move.damageCallback.call(this.battle, source, target);\n\t\t\t}\n\n\t\t\t// We take damage from damage=level moves\n\t\t\tif (move.damage === 'level') {\n\t\t\t\treturn source.level;\n\t\t\t}\n\n\t\t\t// If there's a fix move damage, we run it\n\t\t\tif (move.damage) {\n\t\t\t\treturn move.damage;\n\t\t\t}\n\n\t\t\t// We check the category and typing to calculate later on the damage\n\t\t\tmove.category = this.battle.getCategory(move);\n\t\t\t// '???' is typeless damage: used for Struggle and Confusion etc\n\t\t\tif (!move.type) move.type = '???';\n\t\t\tconst type = move.type;\n\n\t\t\t// We get the base power and apply basePowerCallback if necessary\n\t\t\tlet basePower: number | false | null | undefined = move.basePower;\n\t\t\tif (move.basePowerCallback) {\n\t\t\t\tbasePower = move.basePowerCallback.call(this.battle, source, target, move);\n\t\t\t}\n\n\t\t\t// We check for Base Power\n\t\t\tif (!basePower) {\n\t\t\t\tif (basePower === 0) return; // Returning undefined means not dealing damage\n\t\t\t\treturn basePower;\n\t\t\t}\n\t\t\tbasePower = this.battle.clampIntRange(basePower, 1);\n\n\t\t\t// Checking for the move's Critical Hit ratio\n\t\t\tlet critRatio = this.battle.runEvent('ModifyCritRatio', source, target, move, move.critRatio || 0);\n\t\t\tcritRatio = this.battle.clampIntRange(critRatio, 0, 5);\n\t\t\tconst critMult = [0, 16, 8, 4, 3, 2];\n\t\t\tlet isCrit = move.willCrit || false;\n\t\t\tif (typeof move.willCrit === 'undefined') {\n\t\t\t\tif (critRatio) {\n\t\t\t\t\tisCrit = this.battle.randomChance(1, critMult[critRatio]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (isCrit && this.battle.runEvent('CriticalHit', target, null, move)) {\n\t\t\t\ttarget.getMoveHitData(move).crit = true;\n\t\t\t}\n\n\t\t\t// Happens after crit calculation\n\t\t\tif (basePower) {\n\t\t\t\t// confusion damage\n\t\t\t\tif (move.isConfusionSelfHit) {\n\t\t\t\t\tmove.type = move.baseMoveType!;\n\t\t\t\t\tbasePower = this.battle.runEvent('BasePower', source, target, move, basePower, true);\n\t\t\t\t\tmove.type = '???';\n\t\t\t\t} else {\n\t\t\t\t\tbasePower = this.battle.runEvent('BasePower', source, target, move, basePower, true);\n\t\t\t\t}\n\t\t\t\tif (basePower && move.basePowerModifier) {\n\t\t\t\t\tbasePower *= move.basePowerModifier;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!basePower) return 0;\n\t\t\tbasePower = this.battle.clampIntRange(basePower, 1);\n\n\t\t\t// We now check for attacker and defender\n\t\t\tlet level = source.level;\n\n\t\t\t// Using Beat Up\n\t\t\tif (move.allies) {\n\t\t\t\tthis.battle.add('-activate', source, 'move: Beat Up', '[of] ' + move.allies[0].name);\n\t\t\t\tlevel = move.allies[0].level;\n\t\t\t}\n\n\t\t\tconst attacker = move.overrideOffensivePokemon === 'target' ? target : source;\n\t\t\tconst defender = move.overrideDefensivePokemon === 'source' ? source : target;\n\n\t\t\tconst isPhysical = move.category === 'Physical';\n\t\t\tconst atkType: StatIDExceptHP = move.overrideOffensiveStat || (isPhysical ? 'atk' : 'spa');\n\t\t\tconst defType: StatIDExceptHP = move.overrideDefensiveStat || (isPhysical ? 'def' : 'spd');\n\n\t\t\tlet unboosted = false;\n\t\t\tlet noburndrop = false;\n\n\t\t\tif (isCrit) {\n\t\t\t\tif (!suppressMessages) this.battle.add('-crit', target);\n\t\t\t\t// Stat level modifications are ignored if they are neutral to or favour the defender.\n\t\t\t\t// Reflect and Light Screen defensive boosts are only ignored if stat level modifications were also ignored as a result of that.\n\t\t\t\tif (attacker.boosts[atkType] <= defender.boosts[defType]) {\n\t\t\t\t\tunboosted = true;\n\t\t\t\t\tnoburndrop = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet attack = attacker.getStat(atkType, unboosted, noburndrop);\n\t\t\tlet defense = defender.getStat(defType, unboosted);\n\n\t\t\t// Using Beat Up\n\t\t\tif (move.allies) {\n\t\t\t\tattack = move.allies[0].species.baseStats.atk;\n\t\t\t\tmove.allies.shift();\n\t\t\t\tdefense = defender.species.baseStats.def;\n\t\t\t}\n\n\t\t\t// Moves that ignore offense and defense respectively.\n\t\t\tif (move.ignoreOffensive) {\n\t\t\t\tthis.battle.debug('Negating (sp)atk boost/penalty.');\n\t\t\t\t// The attack drop from the burn is only applied when attacker's attack level is higher than defender's defense level.\n\t\t\t\tattack = attacker.getStat(atkType, true, true);\n\t\t\t}\n\n\t\t\tif (move.ignoreDefensive) {\n\t\t\t\tthis.battle.debug('Negating (sp)def boost/penalty.');\n\t\t\t\tdefense = target.getStat(defType, true, true);\n\t\t\t}\n\n\t\t\tif (attack >= 256 || defense >= 256) {\n\t\t\t\tattack = this.battle.clampIntRange(Math.floor(this.battle.clampIntRange(attack, 1, 999) / 4), 1);\n\t\t\t\tdefense = this.battle.clampIntRange(Math.floor(this.battle.clampIntRange(defense, 1, 999) / 4), 1);\n\t\t\t}\n\n\t\t\t// Self destruct moves halve defense at this point.\n\t\t\tif (move.selfdestruct && defType === 'def') {\n\t\t\t\tdefense = this.battle.clampIntRange(Math.floor(defense / 2), 1);\n\t\t\t}\n\n\t\t\t// Let's go with the calculation now that we have what we need.\n\t\t\t// We do it step by step just like the game does.\n\t\t\tlet damage = level * 2;\n\t\t\tdamage = Math.floor(damage / 5);\n\t\t\tdamage += 2;\n\t\t\tdamage *= basePower;\n\t\t\tdamage *= attack;\n\t\t\tdamage = Math.floor(damage / defense);\n\t\t\tdamage = Math.floor(damage / 50);\n\t\t\tif (isCrit) damage *= 2;\n\t\t\tdamage = Math.floor(this.battle.runEvent('ModifyDamage', attacker, defender, move, damage));\n\t\t\tdamage = this.battle.clampIntRange(damage, 1, 997);\n\t\t\tdamage += 2;\n\n\t\t\t// Weather modifiers\n\t\t\tif (\n\t\t\t\t(type === 'Water' && this.battle.field.isWeather('raindance')) ||\n\t\t\t\t(type === 'Fire' && this.battle.field.isWeather('sunnyday'))\n\t\t\t) {\n\t\t\t\tdamage = Math.floor(damage * 1.5);\n\t\t\t} else if (\n\t\t\t\t((type === 'Fire' || move.id === 'solarbeam') && this.battle.field.isWeather('raindance')) ||\n\t\t\t\t(type === 'Water' && this.battle.field.isWeather('sunnyday'))\n\t\t\t) {\n\t\t\t\tdamage = Math.floor(damage / 2);\n\t\t\t}\n\n\t\t\t// STAB damage bonus, the \"???\" type never gets STAB\n\t\t\tif (type !== '???' && source.hasType(type)) {\n\t\t\t\tdamage += Math.floor(damage / 2);\n\t\t\t}\n\n\t\t\t// Type effectiveness\n\t\t\tconst totalTypeMod = target.runEffectiveness(move);\n\t\t\t// Super effective attack\n\t\t\tif (totalTypeMod > 0) {\n\t\t\t\tif (!suppressMessages) this.battle.add('-supereffective', target);\n\t\t\t\tdamage *= 2;\n\t\t\t\tif (totalTypeMod >= 2) {\n\t\t\t\t\tdamage *= 2;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Resisted attack\n\t\t\tif (totalTypeMod < 0) {\n\t\t\t\tif (!suppressMessages) this.battle.add('-resisted', target);\n\t\t\t\tdamage = Math.floor(damage / 2);\n\t\t\t\tif (totalTypeMod <= -2) {\n\t\t\t\t\tdamage = Math.floor(damage / 2);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Apply random factor if damage is greater than 1, except for Flail and Reversal\n\t\t\tif (!move.noDamageVariance && damage > 1) {\n\t\t\t\tdamage *= this.battle.random(217, 256);\n\t\t\t\tdamage = Math.floor(damage / 255);\n\t\t\t}\n\n\t\t\t// If damage is less than 1, we return 1\n\t\t\tif (basePower && !Math.floor(damage)) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// We are done, this is the final damage\n\t\t\treturn damage;\n\t\t},\n\t},\n\t/**\n\t * Stadium 2 ignores stat drops due to status ailments upon boosting the dropped stat.\n\t * For example: if a burned Snorlax uses Curse then it will ignore the attack drop from\n\t * burn when it is recalculating its attack stat. This is why volatiles are added to status\n\t * conditions, so that we can keep track of whether or not to apply the stat drop from\n\t * statuses.\n\t */\n\tboost(boost, target, source = null, effect = null) {\n\t\tif (this.event) {\n\t\t\tif (!target) target = this.event.target;\n\t\t\tif (!source) source = this.event.source;\n\t\t\tif (!effect) effect = this.effect;\n\t\t}\n\t\tif (typeof effect === 'string') effect = this.dex.conditions.get(effect);\n\t\tif (!target?.hp) return 0;\n\t\tlet success = null;\n\t\tboost = this.runEvent('TryBoost', target, source, effect, {...boost});\n\t\tlet i: BoostID;\n\t\tfor (i in boost) {\n\t\t\tconst currentBoost: SparseBoostsTable = {};\n\t\t\tcurrentBoost[i] = boost[i];\n\t\t\tlet boostBy = target.boostBy(currentBoost);\n\t\t\tlet msg = '-boost';\n\t\t\tif (boost[i]! < 0) {\n\t\t\t\tmsg = '-unboost';\n\t\t\t\tboostBy = -boostBy;\n\t\t\t}\n\t\t\tif (boostBy) {\n\t\t\t\tsuccess = true;\n\t\t\t\t// Check for boost increases deleting attack or speed drops\n\t\t\t\tif (i === 'atk' && target.status === 'brn' && target.volatiles['brnattackdrop']) {\n\t\t\t\t\ttarget.removeVolatile('brnattackdrop');\n\t\t\t\t}\n\t\t\t\tif (i === 'spe' && target.status === 'par' && target.volatiles['parspeeddrop']) {\n\t\t\t\t\ttarget.removeVolatile('parspeeddrop');\n\t\t\t\t}\n\t\t\t\tif (!effect || effect.effectType === 'Move') {\n\t\t\t\t\tthis.add(msg, target, i, boostBy);\n\t\t\t\t} else {\n\t\t\t\t\tthis.add(msg, target, i, boostBy, '[from] ' + effect.fullname);\n\t\t\t\t}\n\t\t\t\tthis.runEvent('AfterEachBoost', target, source, effect, currentBoost);\n\t\t\t}\n\t\t}\n\t\tthis.runEvent('AfterBoost', target, source, effect, boost);\n\t\treturn success;\n\t},\n\t/**\n\t * Implementing Self-KO Clause by having it check what the last move used by the players were\n\t * in the case both Pokemon faint. Since the only way this can happen in Stadium 2 is if a player\n\t * uses self-destruct or explosion, I can use this to determine who should win.\n\t */\n\tfaintMessages(lastFirst) {\n\t\tif (this.ended) return;\n\t\tconst length = this.faintQueue.length;\n\t\tif (!length) return false;\n\t\tif (lastFirst) {\n\t\t\tthis.faintQueue.unshift(this.faintQueue[this.faintQueue.length - 1]);\n\t\t\tthis.faintQueue.pop();\n\t\t}\n\t\tlet faintData;\n\t\twhile (this.faintQueue.length) {\n\t\t\tfaintData = this.faintQueue.shift()!;\n\t\t\tconst pokemon: Pokemon = faintData.target;\n\t\t\tif (!pokemon.fainted &&\n\t\t\t\tthis.runEvent('BeforeFaint', pokemon, faintData.source, faintData.effect)) {\n\t\t\t\tthis.add('faint', pokemon);\n\t\t\t\tpokemon.side.pokemonLeft--;\n\t\t\t\tif (pokemon.side.totalFainted < 100) pokemon.side.totalFainted++;\n\t\t\t\tthis.runEvent('Faint', pokemon, faintData.source, faintData.effect);\n\t\t\t\tthis.singleEvent('End', pokemon.getAbility(), pokemon.abilityState, pokemon);\n\t\t\t\tpokemon.clearVolatile(false);\n\t\t\t\tpokemon.fainted = true;\n\t\t\t\tpokemon.isActive = false;\n\t\t\t\tpokemon.isStarted = false;\n\t\t\t\tpokemon.side.faintedThisTurn = pokemon;\n\t\t\t}\n\t\t}\n\n\t\tif (this.gen <= 1) {\n\t\t\t// in gen 1, fainting skips the rest of the turn\n\t\t\t// residuals don't exist in gen 1\n\t\t\tthis.queue.clear();\n\t\t\t// Fainting clears accumulated Bide damage\n\t\t\tfor (const pokemon of this.getAllActive()) {\n\t\t\t\tif (pokemon.volatiles['bide'] && pokemon.volatiles['bide'].damage) {\n\t\t\t\t\tpokemon.volatiles['bide'].damage = 0;\n\t\t\t\t\tthis.hint(\"Desync Clause Mod activated!\");\n\t\t\t\t\tthis.hint(\"In Gen 1, Bide's accumulated damage is reset to 0 when a Pokemon faints.\");\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (this.gen <= 3 && this.gameType === 'singles') {\n\t\t\t// in gen 3 or earlier, fainting in singles skips to residuals\n\t\t\tfor (const pokemon of this.getAllActive()) {\n\t\t\t\tif (this.gen <= 2) {\n\t\t\t\t\t// in gen 2, fainting skips moves only\n\t\t\t\t\tthis.queue.cancelMove(pokemon);\n\t\t\t\t} else {\n\t\t\t\t\t// in gen 3, fainting skips all moves and switches\n\t\t\t\t\tthis.queue.cancelAction(pokemon);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!this.p1.pokemonLeft && !this.p2.pokemonLeft) {\n\t\t\tif (this.p1.lastMove !== null && this.p2.lastMove === null) {\n\t\t\t\tthis.win(this.p2);\n\t\t\t\treturn true;\n\t\t\t} else if (this.p2.lastMove !== null && this.p1.lastMove === null) {\n\t\t\t\tthis.win(this.p1);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tthis.win(faintData ? faintData.target.side.foe : null);\n\t\t\treturn true;\n\t\t}\n\t\tif (!this.p1.pokemonLeft) {\n\t\t\tthis.win(this.p2);\n\t\t\treturn true;\n\t\t}\n\t\tif (!this.p2.pokemonLeft) {\n\t\t\tthis.win(this.p1);\n\t\t\treturn true;\n\t\t}\n\t\tif (faintData) {\n\t\t\tthis.runEvent('AfterFaint', faintData.target, faintData.source, faintData.effect, length);\n\t\t}\n\t\treturn false;\n\t},\n};\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pkmn/mods",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.47",
|
|
4
4
|
"description": "Support for non-standard mods to @pkmn/sim and @pkmn/dex",
|
|
5
5
|
"repository": "github:pkmn/ps",
|
|
6
6
|
"author": "Guangcong Luo <guangcongluo@gmail.com> (http://guangcongluo.com)",
|
|
@@ -100,11 +100,11 @@
|
|
|
100
100
|
"build"
|
|
101
101
|
],
|
|
102
102
|
"dependencies": {
|
|
103
|
-
"@pkmn/dex-types": "^0.7.
|
|
103
|
+
"@pkmn/dex-types": "^0.7.47"
|
|
104
104
|
},
|
|
105
105
|
"devDependencies": {
|
|
106
|
-
"@pkmn/dex": "^0.7.
|
|
107
|
-
"@pkmn/sim": "^0.7.
|
|
106
|
+
"@pkmn/dex": "^0.7.47",
|
|
107
|
+
"@pkmn/sim": "^0.7.47"
|
|
108
108
|
},
|
|
109
109
|
"scripts": {
|
|
110
110
|
"lint": "eslint --cache src --ext ts",
|
|
@@ -150,6 +150,7 @@
|
|
|
150
150
|
],
|
|
151
151
|
"@typescript-eslint/no-unused-vars": "off",
|
|
152
152
|
"@typescript-eslint/prefer-optional-chain": "off",
|
|
153
|
+
"@typescript-eslint/no-base-to-string": "off",
|
|
153
154
|
"max-len": "off",
|
|
154
155
|
"operator-linebreak": "off"
|
|
155
156
|
}
|