@pkmn/mods 0.9.36 → 0.9.37

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.
@@ -606,7 +606,7 @@ var Scripts = {
606
606
  if (pokemon.fainted) {
607
607
  return false;
608
608
  }
609
- if (sourceEffect) attrs += `|[from]${this.battle.dex.conditions.get(sourceEffect)}`;
609
+ if (sourceEffect) attrs += `|[from] ${this.battle.dex.conditions.get(sourceEffect).name}`;
610
610
  this.battle.addMove("move", pokemon, move.name, `${target}${attrs}`);
611
611
  if (!this.battle.singleEvent("Try", move, null, pokemon, target, move)) {
612
612
  return true;
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kjs/Code/src/github.com/pkmn/ps/mods/build/gen1stadium/index.js","../../src/gen1stadium/conditions.ts","../../src/gen1stadium/rulesets.ts","../../src/gen1stadium/moves.ts","../../src/gen1stadium/scripts.ts"],"names":[],"mappings":"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","file":"/Users/kjs/Code/src/github.com/pkmn/ps/mods/build/gen1stadium/index.js","sourcesContent":[null,"import type {ModdedConditionDataTable} from '@pkmn/sim';\n\nexport const Conditions: ModdedConditionDataTable = {\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},\n\t\tonAfterMoveSelfPriority: 2,\n\t\tonAfterMoveSelf(pokemon) {\n\t\t\tthis.damage(this.clampIntRange(Math.floor(pokemon.maxhp / 16), 1));\n\t\t},\n\t\tonAfterSwitchInSelf(pokemon) {\n\t\t\tthis.damage(this.clampIntRange(Math.floor(pokemon.maxhp / 16), 1));\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},\n\t\tonBeforeMovePriority: 2,\n\t\tonBeforeMove(pokemon) {\n\t\t\tif (this.randomChance(63, 256)) {\n\t\t\t\tthis.add('cant', pokemon, 'par');\n\t\t\t\tpokemon.removeVolatile('bide');\n\t\t\t\tpokemon.removeVolatile('lockedmove');\n\t\t\t\tpokemon.removeVolatile('twoturnmove');\n\t\t\t\tpokemon.removeVolatile('invulnerability');\n\t\t\t\tpokemon.removeVolatile('partialtrappinglock');\n\t\t\t\treturn false;\n\t\t\t}\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-3 turns\n\t\t\tthis.effectState.startTime = this.random(1, 4);\n\t\t\tthis.effectState.time = this.effectState.startTime;\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: 2,\n\t\tonBeforeMove(pokemon, target, move) {\n\t\t\tpokemon.statusState.time--;\n\t\t\tthis.add('cant', pokemon, 'slp');\n\t\t\tpokemon.lastMove = null;\n\t\t\treturn false;\n\t\t},\n\t\tonAfterMoveSelf(pokemon) {\n\t\t\tif (pokemon.statusState.time <= 0) pokemon.cureStatus();\n\t\t},\n\t},\n\tfrz: {\n\t\tname: 'frz',\n\t\teffectType: 'Status',\n\t\tonStart(target) {\n\t\t\tthis.add('-status', target, 'frz');\n\t\t},\n\t\tonBeforeMovePriority: 2,\n\t\tonBeforeMove(pokemon, target, move) {\n\t\t\tthis.add('cant', pokemon, 'frz');\n\t\t\tpokemon.lastMove = null;\n\t\t\treturn false;\n\t\t},\n\t\tonHit(target, source, move) {\n\t\t\tif (move.type === 'Fire' && move.category !== 'Status') {\n\t\t\t\ttarget.cureStatus();\n\t\t\t}\n\t\t},\n\t},\n\tpsn: {\n\t\tname: 'psn',\n\t\teffectType: 'Status',\n\t\tonStart(target) {\n\t\t\tthis.add('-status', target, 'psn');\n\t\t},\n\t\tonAfterMoveSelfPriority: 2,\n\t\tonAfterMoveSelf(pokemon) {\n\t\t\tthis.damage(this.clampIntRange(Math.floor(pokemon.maxhp / 16), 1));\n\t\t},\n\t\tonAfterSwitchInSelf(pokemon) {\n\t\t\tthis.damage(this.clampIntRange(Math.floor(pokemon.maxhp / 16), 1));\n\t\t},\n\t},\n\tconfusion: {\n\t\tinherit: true,\n\t\tonStart(target) {\n\t\t\tthis.add('-start', target, 'confusion');\n\t\t\tthis.effectState.time = this.random(2, 6);\n\t\t},\n\t},\n\tflinch: {\n\t\tinherit: true,\n\t\tonStart() {},\n\t},\n\tpartiallytrapped: {\n\t\tname: 'partiallytrapped',\n\t\tduration: 2,\n\t\tonBeforeMovePriority: 1,\n\t\tonStart(target, source, effect) {\n\t\t\tthis.add('-activate', target, `move: ${effect}`, `[of] ${source}`);\n\t\t},\n\t\tonBeforeMove(pokemon) {\n\t\t\tif (this.effectState.source && (!this.effectState.source.isActive || this.effectState.source.hp <= 0)) {\n\t\t\t\tpokemon.removeVolatile('partiallytrapped');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.add('cant', pokemon, 'partiallytrapped');\n\t\t\treturn false;\n\t\t},\n\t\tonEnd(pokemon) {\n\t\t\tthis.add('-end', pokemon, this.effectState.sourceEffect, '[partiallytrapped]');\n\t\t},\n\t},\n};\n","import type {ModdedFormatDataTable} from '@pkmn/sim';\n\nexport const Rulesets: ModdedFormatDataTable = {\n\tstandard: {\n\t\teffectType: 'ValidatorRule',\n\t\tname: 'Standard',\n\t\truleset: ['Obtainable', 'Stadium Sleep Clause', 'Freeze Clause Mod', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Moves Clause', 'Exact HP Mod', 'Cancel Mod'],\n\t},\n};\n","import type {ActiveMove, ModdedMoveDataTable} from '@pkmn/sim';\n\nexport const Moves: ModdedMoveDataTable = {\n\tbide: {\n\t\tinherit: true,\n\t\tpriority: 0,\n\t\taccuracy: true,\n\t\tcondition: {\n\t\t\tdurationCallback(target, source, effect) {\n\t\t\t\treturn this.random(3, 5);\n\t\t\t},\n\t\t\tonStart(pokemon) {\n\t\t\t\tthis.effectState.totalDamage = 0;\n\t\t\t\tthis.effectState.lastDamage = 0;\n\t\t\t\tthis.add('-start', pokemon, 'Bide');\n\t\t\t},\n\t\t\tonHit(target, source, move) {\n\t\t\t\tif (source && source !== target && move.category !== 'Physical' && move.category !== 'Special') {\n\t\t\t\t\tconst damage = this.effectState.totalDamage;\n\t\t\t\t\tthis.effectState.totalDamage += damage;\n\t\t\t\t\tthis.effectState.lastDamage = damage;\n\t\t\t\t\tthis.effectState.sourceSlot = source.getSlot();\n\t\t\t\t}\n\t\t\t},\n\t\t\tonDamage(damage, target, source, move) {\n\t\t\t\tif (!source || source.isAlly(target)) return;\n\t\t\t\tif (!move || move.effectType !== 'Move') return;\n\t\t\t\tif (!damage && this.effectState.lastDamage > 0) {\n\t\t\t\t\tdamage = this.effectState.totalDamage;\n\t\t\t\t}\n\t\t\t\tthis.effectState.totalDamage += damage;\n\t\t\t\tthis.effectState.lastDamage = damage;\n\t\t\t\tthis.effectState.sourceSlot = source.getSlot();\n\t\t\t},\n\t\t\tonAfterSetStatus(status, pokemon) {\n\t\t\t\t// Sleep, freeze, and partial trap will just pause duration.\n\t\t\t\tif (pokemon.volatiles['flinch']) {\n\t\t\t\t\tthis.effectState.duration!++;\n\t\t\t\t} else if (pokemon.volatiles['partiallytrapped']) {\n\t\t\t\t\tthis.effectState.duration!++;\n\t\t\t\t} else {\n\t\t\t\t\tswitch (status.id) {\n\t\t\t\t\tcase 'slp':\n\t\t\t\t\tcase 'frz':\n\t\t\t\t\t\tthis.effectState.duration!++;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tonBeforeMove(pokemon, t, move) {\n\t\t\t\tif (this.effectState.duration === 1) {\n\t\t\t\t\tthis.add('-end', pokemon, 'Bide');\n\t\t\t\t\tif (!this.effectState.totalDamage) {\n\t\t\t\t\t\tthis.debug(\"Bide failed because no damage was taken\");\n\t\t\t\t\t\tthis.add('-fail', pokemon);\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tconst target = this.getAtSlot(this.effectState.sourceSlot);\n\t\t\t\t\tif (target.isSemiInvulnerable()) {\n\t\t\t\t\t\tthis.add('-message', 'The foe ' + target.name + ' can\\'t be hit while flying!');\n\t\t\t\t\t\tpokemon.removeVolatile('bide');\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tthis.actions.moveHit(target, pokemon, move, { damage: this.effectState.totalDamage * 2 } as ActiveMove);\n\t\t\t\t\tpokemon.removeVolatile('bide');\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tthis.add('-activate', pokemon, 'Bide');\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\tonDisableMove(pokemon) {\n\t\t\t\tif (!pokemon.hasMove('bide')) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tfor (const moveSlot of pokemon.moveSlots) {\n\t\t\t\t\tif (moveSlot.id !== 'bide') {\n\t\t\t\t\t\tpokemon.disableMove(moveSlot.id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\ttype: \"???\", // Will look as Normal but it's STAB-less\n\t},\n\tbind: {\n\t\tinherit: true,\n\t\t// FIXME: onBeforeMove() {},\n\t},\n\tclamp: {\n\t\tinherit: true,\n\t\t// FIXME: onBeforeMove() {},\n\t},\n\tcounter: {\n\t\tinherit: true,\n\t\tignoreImmunity: true,\n\t\twillCrit: false,\n\t\tbasePower: 1,\n\t\tdamageCallback(pokemon, target) {\n\t\t\t// Counter mechanics in Stadium 1:\n\t\t\t// - a move is Counterable if it is Normal or Fighting type, has nonzero Base Power, and is not Counter\n\t\t\t// - Counter succeeds if the target used a Counterable move earlier this turn\n\n\t\t\tconst lastMoveThisTurn = target.side.lastMove && target.side.lastMove.id === target.side.lastSelectedMove &&\n\t\t\t\t!this.queue.willMove(target) && this.dex.moves.get(target.side.lastMove.id);\n\t\t\tif (!lastMoveThisTurn) {\n\t\t\t\tthis.debug(\"Stadium 1 Counter: last move was not this turn\");\n\t\t\t\tthis.add('-fail', pokemon);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst lastMoveThisTurnIsCounterable = lastMoveThisTurn && lastMoveThisTurn.basePower > 0 &&\n\t\t\t\t['Normal', 'Fighting'].includes(lastMoveThisTurn.type) && lastMoveThisTurn.id !== 'counter';\n\t\t\tif (!lastMoveThisTurnIsCounterable) {\n\t\t\t\tthis.debug(`Stadium 1 Counter: last move ${lastMoveThisTurn.name} was not Counterable`);\n\t\t\t\tthis.add('-fail', pokemon);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (this.lastDamage <= 0) {\n\t\t\t\tthis.debug(\"Stadium 1 Counter: no previous damage exists\");\n\t\t\t\tthis.add('-fail', pokemon);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn 2 * this.lastDamage;\n\t\t},\n\t},\n\tfirespin: {\n\t\tinherit: true,\n\t\t// FIXME: onBeforeMove() {},\n\t},\n\thaze: {\n\t\tinherit: true,\n\t\tonHit(target, source) {\n\t\t\tthis.add('-activate', target, 'move: Haze');\n\t\t\tthis.add('-clearallboost', '[silent]');\n\t\t\tfor (const pokemon of this.getAllActive()) {\n\t\t\t\tpokemon.clearBoosts();\n\t\t\t\tpokemon.cureStatus(true);\n\t\t\t\tfor (const id of Object.keys(pokemon.volatiles)) {\n\t\t\t\t\tpokemon.removeVolatile(id);\n\t\t\t\t\tthis.add('-end', pokemon, id, '[silent]');\n\t\t\t\t}\n\t\t\t\tpokemon.recalculateStats!();\n\t\t\t}\n\t\t},\n\t},\n\thyperbeam: {\n\t\tinherit: true,\n\t\tonMoveFail(target, source, move) {\n\t\t\tsource.addVolatile('mustrecharge');\n\t\t},\n\t},\n\tpsywave: {\n\t\tinherit: true,\n\t\tbasePower: 1,\n\t\tdamageCallback(pokemon) {\n\t\t\treturn this.random(1, this.trunc(1.5 * pokemon.level));\n\t\t},\n\t},\n\trage: {\n\t\tinherit: true,\n\t\tself: {\n\t\t\tvolatileStatus: 'rage',\n\t\t},\n\t\tcondition: {\n\t\t\t// Rage lock\n\t\t\tonStart(target, source, effect) {\n\t\t\t\tthis.effectState.move = 'rage';\n\t\t\t},\n\t\t\tonLockMove: 'rage',\n\t\t\tonHit(target, source, move) {\n\t\t\t\tif (target.boosts.atk < 6 && (move.category !== 'Status' || move.id === 'disable')) {\n\t\t\t\t\tthis.boost({ atk: 1 });\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t},\n\trecover: {\n\t\tinherit: true,\n\t\theal: null,\n\t\tonHit(target) {\n\t\t\tif (target.hp === target.maxhp) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthis.heal(Math.floor(target.maxhp / 2), target, target);\n\t\t},\n\t},\n\trest: {\n\t\tinherit: true,\n\t\tonHit(target, source, move) {\n\t\t\t// Fails if the difference between\n\t\t\t// max HP and current HP is 0, 255, or 511\n\t\t\tif (target.hp >= target.maxhp) return false;\n\t\t\tif (!target.setStatus('slp', source, move)) return false;\n\t\t\ttarget.statusState.time = 2;\n\t\t\ttarget.statusState.startTime = 2;\n\t\t\ttarget.recalculateStats!(); // Stadium Rest removes statdrops given by Major Status Conditions.\n\t\t\tthis.heal(target.maxhp); // Aesthetic only as the healing happens after you fall asleep in-game\n\t\t},\n\t},\n\tsoftboiled: {\n\t\tinherit: true,\n\t\theal: null,\n\t\tonHit(target) {\n\t\t\t// Fail when health is 255 or 511 less than max\n\t\t\tif (target.hp === target.maxhp) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthis.heal(Math.floor(target.maxhp / 2), target, target);\n\t\t},\n\t},\n\tsubstitute: {\n\t\tinherit: true,\n\t\tonTryHit(target) {\n\t\t\tif (target.volatiles['substitute']) {\n\t\t\t\tthis.add('-fail', target, 'move: Substitute');\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\t// Stadium fixes the 25% = you die gag\n\t\t\tif (target.hp <= target.maxhp / 4) {\n\t\t\t\tthis.add('-fail', target, 'move: Substitute', '[weak]');\n\t\t\t\treturn null;\n\t\t\t}\n\t\t},\n\t\tcondition: {\n\t\t\tonStart(target) {\n\t\t\t\tthis.add('-start', target, 'Substitute');\n\t\t\t\tthis.effectState.hp = Math.floor(target.maxhp / 4);\n\t\t\t\tdelete target.volatiles['partiallytrapped'];\n\t\t\t},\n\t\t\tonTryHitPriority: -1,\n\t\t\tonTryHit(target, source, move) {\n\t\t\t\tif (target === source) {\n\t\t\t\t\tthis.debug('sub bypass: self hit');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (move.drain) {\n\t\t\t\t\tthis.add('-miss', source);\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tif (move.category === 'Status') {\n\t\t\t\t\tconst SubBlocked = ['leechseed', 'lockon', 'mindreader', 'nightmare'];\n\t\t\t\t\tif (move.status || move.boosts || move.volatileStatus === 'confusion' || SubBlocked.includes(move.id)) {\n\t\t\t\t\t\tthis.add('-activate', target, 'Substitute', '[block] ' + move.name);\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (move.volatileStatus && target === source) return;\n\t\t\t\tlet damage = this.actions.getDamage(source, target, move);\n\t\t\t\tif (damage && damage > target.volatiles['substitute'].hp) {\n\t\t\t\t\tdamage = target.volatiles['substitute'].hp;\n\t\t\t\t}\n\t\t\t\tif (!damage && damage !== 0) return null;\n\t\t\t\ttarget.volatiles['substitute'].hp -= damage;\n\t\t\t\tthis.lastDamage = damage;\n\t\t\t\tif (target.volatiles['substitute'].hp <= 0) {\n\t\t\t\t\tthis.debug('Substitute broke');\n\t\t\t\t\ttarget.removeVolatile('substitute');\n\t\t\t\t\ttarget.subFainted = true;\n\t\t\t\t} else {\n\t\t\t\t\tthis.add('-activate', target, 'Substitute', '[damage]');\n\t\t\t\t}\n\t\t\t\t// Drain/recoil does not happen if the substitute breaks\n\t\t\t\tif (target.volatiles['substitute']) {\n\t\t\t\t\tif (move.recoil) {\n\t\t\t\t\t\tthis.damage(this.clampIntRange(Math.floor(damage * move.recoil[0] / move.recoil[1]), 1), source, target, 'recoil');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.runEvent('AfterSubDamage', target, source, move, damage);\n\t\t\t\t// Add here counter damage\n\t\t\t\tconst lastAttackedBy = target.getLastAttackedBy();\n\t\t\t\tif (!lastAttackedBy) {\n\t\t\t\t\ttarget.attackedBy.push({ source, move: move.id, damage, slot: source.getSlot(), thisTurn: true });\n\t\t\t\t} else {\n\t\t\t\t\tlastAttackedBy.move = move.id;\n\t\t\t\t\tlastAttackedBy.damage = damage;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t},\n\t\t\tonEnd(target) {\n\t\t\t\tthis.add('-end', target, 'Substitute');\n\t\t\t},\n\t\t},\n\t\tsecondary: null,\n\t\ttarget: \"self\",\n\t\ttype: \"Normal\",\n\t},\n\tstruggle: {\n\t\tinherit: true,\n\t\tignoreImmunity: { 'Normal': true },\n\t},\n\twrap: {\n\t\tinherit: true,\n\t\t// FIXME: onBeforeMove() {},\n\t},\n};\n","import type {ActiveMove, BoostID, ModdedBattleScriptsData, StatIDExceptHP} from '@pkmn/sim';\n\n/**\n * Stadium mechanics inherit from gen 1 mechanics, but fixes some stuff.\n */\n\nconst SKIP_LASTDAMAGE = new Set([\n\t'confuseray', 'conversion', 'counter', 'focusenergy', 'glare', 'haze', 'leechseed', 'lightscreen',\n\t'mimic', 'mist', 'poisongas', 'poisonpowder', 'recover', 'reflect', 'rest', 'softboiled',\n\t'splash', 'stunspore', 'substitute', 'supersonic', 'teleport', 'thunderwave', 'toxic', 'transform',\n]);\n\nexport const Scripts: ModdedBattleScriptsData = {\n\tinherit: 'gen1',\n\tgen: 1,\n\t// BattlePokemon scripts. Stadium shares gen 1 code but it fixes some problems with it.\n\tpokemon: {\n\t\tinherit: true,\n\t\t// This is run on Stadium after boosts and status changes.\n\t\trecalculateStats() {\n\t\t\tlet statName: StatIDExceptHP;\n\t\t\tfor (statName in this.storedStats) {\n\t\t\t\tlet stat = this.species.baseStats[statName];\n\t\t\t\tstat = Math.floor(\n\t\t\t\t\tMath.floor(\n\t\t\t\t\t\t2 * stat + this.set.ivs[statName] + Math.floor(this.set.evs[statName] / 4)\n\t\t\t\t\t) * this.level / 100 + 5\n\t\t\t\t);\n\t\t\t\tthis.baseStoredStats[statName] = this.storedStats[statName] = Math.floor(stat);\n\t\t\t\tthis.modifiedStats![statName] = Math.floor(stat);\n\t\t\t\t// Re-apply drops, if necessary.\n\t\t\t\tif (this.status === 'par' && statName === 'spe') this.modifyStat!('spe', 0.25);\n\t\t\t\tif (this.status === 'brn' && statName === 'atk') this.modifyStat!('atk', 0.5);\n\t\t\t\tif (this.boosts[statName] !== 0) {\n\t\t\t\t\tif (this.boosts[statName] >= 0) {\n\t\t\t\t\t\tthis.modifyStat!(statName, [1, 1.5, 2, 2.5, 3, 3.5, 4][this.boosts[statName]]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.modifyStat!(statName, [100, 66, 50, 40, 33, 28, 25][-this.boosts[statName]] / 100);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (this.modifiedStats![statName] > 999) {\n\t\t\t\t\tthis.modifiedStats![statName] = 999;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// Stadium's fixed boosting function.\n\t\tboostBy(boost) {\n\t\t\tlet changed = false;\n\t\t\tlet i: BoostID;\n\t\t\tfor (i in boost) {\n\t\t\t\tlet delta = boost[i];\n\t\t\t\tif (delta === undefined) continue;\n\t\t\t\tthis.boosts[i] += delta;\n\t\t\t\tif (this.boosts[i] > 6) {\n\t\t\t\t\tdelta -= this.boosts[i] - 6;\n\t\t\t\t\tthis.boosts[i] = 6;\n\t\t\t\t}\n\t\t\t\tif (this.boosts[i] < -6) {\n\t\t\t\t\tdelta -= this.boosts[i] - (-6);\n\t\t\t\t\tthis.boosts[i] = -6;\n\t\t\t\t}\n\t\t\t\tif (delta) changed = true;\n\t\t\t}\n\t\t\tthis.recalculateStats!();\n\t\t\treturn changed;\n\t\t},\n\t\t// Remove stat recalculation logic from gen 1\n\t\tclearBoosts() {\n\t\t\tlet i: BoostID;\n\t\t\tfor (i in this.boosts) {\n\t\t\t\tthis.boosts[i] = 0;\n\t\t\t}\n\t\t},\n\t},\n\tactions: {\n\t\tinherit: true,\n\t\trunMove(moveOrMoveName, pokemon, targetLoc, options) {\n\t\t\tlet sourceEffect = options?.sourceEffect;\n\t\t\tconst move = this.dex.getActiveMove(moveOrMoveName);\n\t\t\tconst target = this.battle.getTarget(pokemon, move, targetLoc);\n\t\t\tif (target?.subFainted) target.subFainted = null;\n\n\t\t\tthis.battle.setActiveMove(move, pokemon, target);\n\n\t\t\tif (pokemon.moveThisTurn || !this.battle.runEvent('BeforeMove', pokemon, target, move)) {\n\t\t\t\tthis.battle.debug(`${pokemon.fullname} move interrupted; movedThisTurn: ${pokemon.moveThisTurn}`);\n\t\t\t\tthis.battle.clearActiveMove(true);\n\t\t\t\t// This is only run for sleep\n\t\t\t\tthis.battle.runEvent('AfterMoveSelf', pokemon, target, move);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (move.beforeMoveCallback) {\n\t\t\t\tif (move.beforeMoveCallback.call(this.battle, pokemon, target, move)) {\n\t\t\t\t\tthis.battle.clearActiveMove(true);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tlet lockedMove = this.battle.runEvent('LockMove', pokemon);\n\t\t\tif (lockedMove === true) lockedMove = false;\n\t\t\tif (\n\t\t\t\t!lockedMove &&\n\t\t\t\t(!pokemon.volatiles['partialtrappinglock'] || pokemon.volatiles['partialtrappinglock'].locked !== target)\n\t\t\t) {\n\t\t\t\tpokemon.deductPP(move, null, target);\n\t\t\t} else {\n\t\t\t\tsourceEffect = move;\n\t\t\t}\n\t\t\tthis.battle.actions.useMove(move, pokemon, { target, sourceEffect });\n\t\t},\n\t\t// This function deals with AfterMoveSelf events.\n\t\t// This leads with partial trapping moves shenanigans after the move has been used.\n\t\tuseMove(moveOrMoveName, pokemon, options) {\n\t\t\tlet sourceEffect = options?.sourceEffect;\n\t\t\tlet target = options?.target;\n\t\t\tconst moveResult = this.useMoveInner(moveOrMoveName, pokemon, { target, sourceEffect });\n\n\t\t\tif (!sourceEffect && this.battle.effect.id) sourceEffect = this.battle.effect;\n\t\t\tconst baseMove = this.battle.dex.moves.get(moveOrMoveName);\n\t\t\tlet move = this.battle.dex.getActiveMove(baseMove);\n\t\t\tif (target === undefined) target = this.battle.getRandomTarget(pokemon, move);\n\t\t\tif (move.target === 'self') {\n\t\t\t\ttarget = pokemon;\n\t\t\t}\n\t\t\tif (sourceEffect) move.sourceEffect = sourceEffect.id;\n\n\t\t\tthis.battle.singleEvent('ModifyMove', move, null, pokemon, target, move, move);\n\t\t\tif (baseMove.target !== move.target) {\n\t\t\t\t// Target changed in ModifyMove, so we must adjust it here\n\t\t\t\ttarget = this.battle.getRandomTarget(pokemon, move);\n\t\t\t}\n\t\t\tmove = this.battle.runEvent('ModifyMove', pokemon, target, move, move);\n\t\t\tif (baseMove.target !== move.target) {\n\t\t\t\t// Check again, this shouldn't ever happen on Gen 1.\n\t\t\t\ttarget = this.battle.getRandomTarget(pokemon, move);\n\t\t\t}\n\n\t\t\tif (move.id !== 'metronome') {\n\t\t\t\tif (move.id !== 'mirrormove' ||\n\t\t\t\t\t(!pokemon.side.foe.active[0]?.lastMove || pokemon.side.foe.active[0].lastMove?.id === 'mirrormove')) {\n\t\t\t\t\t// The move is our 'final' move (a failed Mirror Move, or any move that isn't Metronome or Mirror Move).\n\t\t\t\t\tpokemon.side.lastMove = move;\n\t\t\t\t\tpokemon.lastMove = move;\n\t\t\t\t\tthis.battle.singleEvent('AfterMove', move, null, pokemon, target, move);\n\n\t\t\t\t\t// If target fainted\n\t\t\t\t\tif (target && target.hp <= 0) {\n\t\t\t\t\t\tdelete pokemon.volatiles['partialtrappinglock'];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.battle.runEvent('AfterMoveSelf', pokemon, target, move);\n\t\t\t\t\t}\n\t\t\t\t\tif (pokemon.volatiles['mustrecharge']) this.battle.add('-mustrecharge', pokemon);\n\n\t\t\t\t\t// For partial trapping moves, we are saving the target.\n\t\t\t\t\tif (move.volatileStatus === 'partiallytrapped' && target && target.hp > 0) {\n\t\t\t\t\t\t// It hit, so let's remove must recharge volatile. Yup, this happens on Stadium.\n\t\t\t\t\t\ttarget.removeVolatile('mustrecharge');\n\t\t\t\t\t\t// Let's check if the lock exists\n\t\t\t\t\t\tif (pokemon.volatiles['partialtrappinglock'] && target.volatiles['partiallytrapped']) {\n\t\t\t\t\t\t\t// Here the partialtrappinglock volatile has been already applied\n\t\t\t\t\t\t\tif (!pokemon.volatiles['partialtrappinglock'].locked) {\n\t\t\t\t\t\t\t\t// If it's the first hit, we save the target\n\t\t\t\t\t\t\t\tpokemon.volatiles['partialtrappinglock'].locked = target;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} // If we move to here, the move failed and there's no partial trapping lock\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn moveResult;\n\t\t},\n\t\t// This is the function that actually uses the move, running ModifyMove events.\n\t\t// It uses the move and then deals with the effects after the move.\n\t\tuseMoveInner(moveOrMoveName, pokemon, options) {\n\t\t\tlet sourceEffect = options?.sourceEffect;\n\t\t\tlet target = options?.target;\n\t\t\tif (!sourceEffect && this.battle.effect.id) sourceEffect = this.battle.effect;\n\t\t\tconst baseMove = this.battle.dex.moves.get(moveOrMoveName);\n\t\t\tlet move = this.battle.dex.getActiveMove(baseMove);\n\t\t\tif (target === undefined) target = this.battle.getRandomTarget(pokemon, move);\n\t\t\tif (move.target === 'self') {\n\t\t\t\ttarget = pokemon;\n\t\t\t}\n\t\t\tif (sourceEffect) move.sourceEffect = sourceEffect.id;\n\n\t\t\tthis.battle.setActiveMove(move, pokemon, target);\n\n\t\t\tthis.battle.singleEvent('ModifyMove', move, null, pokemon, target, move, move);\n\t\t\tif (baseMove.target !== move.target) {\n\t\t\t\t// Target changed in ModifyMove, so we must adjust it here\n\t\t\t\ttarget = this.battle.getRandomTarget(pokemon, move);\n\t\t\t}\n\t\t\tmove = this.battle.runEvent('ModifyMove', pokemon, target, move, move);\n\t\t\tif (baseMove.target !== move.target) {\n\t\t\t\t// Check again, this shouldn't ever happen on Gen 1.\n\t\t\t\ttarget = this.battle.getRandomTarget(pokemon, move);\n\t\t\t\tthis.battle.debug('not a gen 1 mechanic');\n\t\t\t}\n\t\t\tif (!move) return false;\n\n\t\t\tlet attrs = '';\n\t\t\tif (pokemon.fainted) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (sourceEffect) attrs += `|[from]${this.battle.dex.conditions.get(sourceEffect)}`;\n\t\t\tthis.battle.addMove('move', pokemon, move.name, `${target}${attrs}`);\n\n\t\t\tif (!this.battle.singleEvent('Try', move, null, pokemon, target, move)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (!this.battle.singleEvent('TryMove', move, null, pokemon, target, move) ||\n\t\t\t\t!this.battle.runEvent('TryMove', pokemon, target, move)) {\n\t\t\t\treturn true;\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\tlet damage: number | undefined | false | '' = false;\n\t\t\tif (!target || target.fainted) {\n\t\t\t\tthis.battle.attrLastMove('[notarget]');\n\t\t\t\tthis.battle.add('-notarget');\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t// Store 0 damage for last damage if the move is not in the array.\n\t\t\tif (!SKIP_LASTDAMAGE.has(move.id)) this.battle.lastDamage = 0;\n\n\t\t\tdamage = this.tryMoveHit(target, pokemon, move);\n\n\t\t\t// Go ahead with results of the used move.\n\t\t\tif (damage === false) {\n\t\t\t\tthis.battle.singleEvent('MoveFail', move, null, target, pokemon, move);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tthis.battle.singleEvent('AfterMoveSecondarySelf', move, null, pokemon, target, move);\n\t\t\tthis.battle.runEvent('AfterMoveSecondarySelf', pokemon, target, move);\n\t\t\treturn true;\n\t\t},\n\t\ttryMoveHit(target, pokemon, move) {\n\t\t\tlet damage: number | false | undefined = 0;\n\n\t\t\t// First, check if the target is semi-invulnerable\n\t\t\tlet hitResult = 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\tif (move.selfdestruct) {\n\t\t\t\t\tthis.battle.faint(pokemon, pokemon, move);\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Then, check if the Pokemon is immune to this move.\n\t\t\tif (!target.runImmunity(move, true)) {\n\t\t\t\tif (move.selfdestruct) {\n\t\t\t\t\tthis.battle.faint(pokemon, pokemon, move);\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\thitResult = this.battle.singleEvent('TryImmunity', move, null, 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\t// Now, let's calculate the accuracy.\n\t\t\tlet accuracy = move.accuracy;\n\n\t\t\t// Partial trapping moves: true accuracy while it lasts\n\t\t\tif (pokemon.volatiles['partialtrappinglock']) {\n\t\t\t\tif (move.volatileStatus === 'partiallytrapped' && target === pokemon.volatiles['partialtrappinglock'].locked) {\n\t\t\t\t\taccuracy = true;\n\t\t\t\t} else if (pokemon.volatiles['partialtrappinglock'].locked !== target) {\n\t\t\t\t\t// The target switched, therefor, you fail using wrap.\n\t\t\t\t\tdelete pokemon.volatiles['partialtrappinglock'];\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// OHKO moves only have a chance to hit if the user is at least as fast as the target\n\t\t\tif (move.ohko) {\n\t\t\t\tif (target.speed > pokemon.speed) {\n\t\t\t\t\tthis.battle.add('-immune', target, '[ohko]');\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Calculate true accuracy for gen 1, which uses 0-255.\n\t\t\t// Stadium uses the Gen 2 boost table for accuracy and evasiveness, except for 1/3 instead of 0.33\n\t\t\tconst boostTable = [1 / 3, 0.36, 0.43, 0.5, 0.66, 0.75, 1, 1.33, 1.66, 2, 2.33, 2.66, 3];\n\t\t\tif (accuracy !== true) {\n\t\t\t\taccuracy = Math.floor(accuracy * 255 / 100);\n\t\t\t\t// Check also for accuracy modifiers.\n\t\t\t\tif (!move.ignoreAccuracy) {\n\t\t\t\t\taccuracy = Math.floor(accuracy * boostTable[pokemon.boosts.accuracy + 6]);\n\t\t\t\t}\n\t\t\t\tif (!move.ignoreEvasion) {\n\t\t\t\t\taccuracy = Math.floor(accuracy * boostTable[-target.boosts.evasion + 6]);\n\t\t\t\t}\n\t\t\t\taccuracy = Math.min(accuracy, 255);\n\t\t\t}\n\t\t\taccuracy = this.battle.runEvent('Accuracy', target, pokemon, move, accuracy);\n\n\t\t\t// Stadium attempts to fix the 1/256 miss by rerolling if the first value\n\t\t\t// would trigger the 1/256 miss.\n\t\t\tlet randomValue = this.battle.random(256);\n\t\t\tif (randomValue === 256) randomValue = this.battle.random(256);\n\t\t\tif (accuracy !== true && randomValue > accuracy) {\n\t\t\t\tthis.battle.attrLastMove('[miss]');\n\t\t\t\tthis.battle.add('-miss', pokemon);\n\t\t\t\tif (accuracy === 255) {\n\t\t\t\t\tthis.battle.hint(\"In Pokemon Stadium, moves with 100% accuracy can still miss 1/65536 of the time.\");\n\t\t\t\t}\n\t\t\t\tdamage = false;\n\t\t\t\tthis.battle.lastDamage = 0;\n\t\t\t}\n\n\t\t\t// If damage is 0 and not false it means it didn't miss, let's calc.\n\t\t\tif (damage !== false) {\n\t\t\t\tif (move.multihit) {\n\t\t\t\t\tlet hits = move.multihit;\n\t\t\t\t\tif (Array.isArray(hits)) {\n\t\t\t\t\t\t// Yes, it's hardcoded... meh\n\t\t\t\t\t\tif (hits[0] === 2 && hits[1] === 5) {\n\t\t\t\t\t\t\thits = this.battle.sample([2, 2, 2, 3, 3, 3, 4, 5]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\thits = this.battle.random(hits[0], hits[1] + 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\thits = Math.floor(hits);\n\t\t\t\t\t// In gen 1, all the hits have the same damage for multihits move\n\t\t\t\t\tlet moveDamage: number | false | undefined = 0;\n\t\t\t\t\tlet i: number;\n\t\t\t\t\tfor (i = 0; i < hits && target.hp && pokemon.hp; i++) {\n\t\t\t\t\t\tmove.hit = i + 1;\n\t\t\t\t\t\tif (move.hit === hits) move.lastHit = true;\n\t\t\t\t\t\tmoveDamage = this.moveHit(target, pokemon, move);\n\t\t\t\t\t\tif (moveDamage === false) break;\n\t\t\t\t\t\tdamage = (moveDamage || 0);\n\t\t\t\t\t\t// Move damage is fixed to be the first move's damage\n\t\t\t\t\t\tif (i === 0) move.damage = damage;\n\t\t\t\t\t\tif (target.subFainted) {\n\t\t\t\t\t\t\ti++;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tmove.damage = null;\n\t\t\t\t\tif (i === 0) return 1;\n\t\t\t\t\tthis.battle.add('-hitcount', target, i);\n\t\t\t\t} else {\n\t\t\t\t\tdamage = this.moveHit(target, pokemon, move);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (move.category !== 'Status') target.gotAttacked(move, damage, pokemon);\n\n\t\t\tif (move.selfdestruct) {\n\t\t\t\tthis.battle.faint(pokemon, pokemon, move);\n\t\t\t}\n\n\t\t\t// The move missed.\n\t\t\tif (damage === false) {\n\t\t\t\t// Delete the partial trap lock if necessary.\n\t\t\t\tdelete pokemon.volatiles['partialtrappinglock'];\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (move.ohko) this.battle.add('-ohko');\n\n\t\t\tthis.battle.singleEvent('AfterMoveSecondary', move, null, target, pokemon, move);\n\t\t\tthis.battle.runEvent('AfterMoveSecondary', target, pokemon, move);\n\n\t\t\treturn damage;\n\t\t},\n\t\tmoveHit(target, pokemon, moveOrMoveName, moveData, isSecondary, isSelf) {\n\t\t\tlet damage: number | false | null | undefined = 0;\n\t\t\tconst move = this.dex.getActiveMove(moveOrMoveName);\n\n\t\t\tif (!isSecondary && !isSelf) this.battle.setActiveMove(move, pokemon, target);\n\t\t\tlet hitResult: number | boolean = true;\n\t\t\tif (!moveData) moveData = move;\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 (target) {\n\t\t\t\thitResult = this.battle.singleEvent('TryHit', moveData, {}, target, pokemon, move);\n\n\t\t\t\t// Partial trapping moves still apply their volatile to Pokémon behind a Sub\n\t\t\t\tconst targetHadSub = !!target.volatiles['substitute'];\n\t\t\t\tif (targetHadSub && moveData.volatileStatus && moveData.volatileStatus === 'partiallytrapped') {\n\t\t\t\t\ttarget.addVolatile(moveData.volatileStatus, pokemon, move);\n\t\t\t\t\tif (!pokemon.volatiles['partialtrappinglock'] || pokemon.volatiles['partialtrappinglock'].duration! > 1) {\n\t\t\t\t\t\ttarget.volatiles[moveData.volatileStatus].duration = 2;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!hitResult) {\n\t\t\t\t\tif (hitResult === false) this.battle.add('-fail', target);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t// Only run the hit events for the hit itself, not the secondary or self hits\n\t\t\t\tif (!isSelf && !isSecondary) {\n\t\t\t\t\thitResult = this.battle.runEvent('TryHit', target, pokemon, move);\n\t\t\t\t\tif (!hitResult) {\n\t\t\t\t\t\tif (hitResult === false) this.battle.add('-fail', target);\n\t\t\t\t\t\t// Special Substitute hit flag\n\t\t\t\t\t\tif (hitResult !== 0) {\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (!this.battle.runEvent('TryFieldHit', target, pokemon, move)) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} else if (isSecondary && !moveData.self) {\n\t\t\t\t\thitResult = this.battle.runEvent('TrySecondaryHit', target, pokemon, moveData);\n\t\t\t\t}\n\n\t\t\t\tif (hitResult === 0) {\n\t\t\t\t\ttarget = null;\n\t\t\t\t} else if (!hitResult) {\n\t\t\t\t\tif (hitResult === false) this.battle.add('-fail', target);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (target) {\n\t\t\t\tlet didSomething = false;\n\n\t\t\t\tdamage = this.getDamage(pokemon, target, moveData);\n\t\t\t\tif (damage && damage > target.hp) {\n\t\t\t\t\tdamage = target.hp;\n\t\t\t\t}\n\t\t\t\tif ((damage || damage === 0) && !target.fainted) {\n\t\t\t\t\tdamage = this.battle.damage(damage, target, pokemon, move);\n\t\t\t\t\tif (!(damage || damage === 0)) return false;\n\t\t\t\t\tdidSomething = true;\n\t\t\t\t} else if (damage === false && typeof hitResult === 'undefined') {\n\t\t\t\t\tthis.battle.add('-fail', target);\n\t\t\t\t}\n\t\t\t\tif (damage === false || damage === null) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (moveData.boosts && !target.fainted) {\n\t\t\t\t\tthis.battle.boost(moveData.boosts, target, pokemon, move);\n\t\t\t\t}\n\t\t\t\tif (moveData.heal && !target.fainted) {\n\t\t\t\t\tconst d = target.heal(Math.floor(target.maxhp * moveData.heal[0] / moveData.heal[1]));\n\t\t\t\t\tif (!d) {\n\t\t\t\t\t\tthis.battle.add('-fail', target);\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tthis.battle.add('-heal', target, target.getHealth);\n\t\t\t\t\tdidSomething = true;\n\t\t\t\t}\n\t\t\t\tif (moveData.status) {\n\t\t\t\t\tif (!target.status) {\n\t\t\t\t\t\ttarget.setStatus(moveData.status, pokemon, move);\n\t\t\t\t\t\ttarget.recalculateStats!();\n\t\t\t\t\t} else if (!isSecondary) {\n\t\t\t\t\t\tif (target.status === moveData.status) {\n\t\t\t\t\t\t\tthis.battle.add('-fail', target, target.status);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.battle.add('-fail', target);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdidSomething = true;\n\t\t\t\t}\n\t\t\t\tif (moveData.forceStatus) {\n\t\t\t\t\tif (target.setStatus(moveData.forceStatus, pokemon, move)) {\n\t\t\t\t\t\ttarget.recalculateStats!();\n\t\t\t\t\t\tdidSomething = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (moveData.volatileStatus) {\n\t\t\t\t\tif (target.addVolatile(moveData.volatileStatus, pokemon, move)) {\n\t\t\t\t\t\tdidSomething = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (moveData.sideCondition) {\n\t\t\t\t\tif (target.side.addSideCondition(moveData.sideCondition, pokemon, move)) {\n\t\t\t\t\t\tdidSomething = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (moveData.pseudoWeather) {\n\t\t\t\t\tif (this.battle.field.addPseudoWeather(moveData.pseudoWeather, pokemon, move)) {\n\t\t\t\t\t\tdidSomething = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Hit events\n\t\t\t\thitResult = this.battle.singleEvent('Hit', moveData, {}, target, pokemon, move);\n\t\t\t\tif (!isSelf && !isSecondary) {\n\t\t\t\t\tthis.battle.runEvent('Hit', target, pokemon, move);\n\t\t\t\t}\n\t\t\t\tif (!hitResult && !didSomething) {\n\t\t\t\t\tif (hitResult === false) this.battle.add('-fail', target);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Here's where self effects are applied.\n\t\t\tif (moveData.self) {\n\t\t\t\tthis.moveHit(pokemon, pokemon, move, moveData.self, isSecondary, true);\n\t\t\t}\n\n\t\t\t// Now we can save the partial trapping damage.\n\t\t\tif (pokemon.volatiles['partialtrappinglock']) {\n\t\t\t\tpokemon.volatiles['partialtrappinglock'].damage = this.battle.lastDamage;\n\t\t\t}\n\n\t\t\t// Apply move secondaries.\n\t\t\tif (moveData.secondaries && target && target.hp > 0) {\n\t\t\t\tfor (const secondary of moveData.secondaries) {\n\t\t\t\t\t// Multi-hit moves only roll for status once\n\t\t\t\t\tif (!move.multihit || move.lastHit) {\n\t\t\t\t\t\t// We check here whether to negate the probable secondary status if it's para, burn, or freeze.\n\t\t\t\t\t\t// In the game, this is checked and if true, the random number generator is not called.\n\t\t\t\t\t\t// That means that a move that does not share the type of the target can status it.\n\t\t\t\t\t\t// If a move that was not fire-type would exist on Gen 1, it could burn a Pokémon.\n\t\t\t\t\t\tif (!(secondary.status && ['par', 'brn', 'frz'].includes(secondary.status) && target.hasType(move.type))) {\n\t\t\t\t\t\t\tconst effectChance = Math.floor((secondary.chance || 100) * 255 / 100);\n\t\t\t\t\t\t\tif (typeof secondary.chance === 'undefined' || this.battle.randomChance(effectChance + 1, 256)) {\n\t\t\t\t\t\t\t\tthis.moveHit(target, pokemon, move, secondary, true, isSelf);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (move.selfSwitch && pokemon.hp) {\n\t\t\t\tpokemon.switchFlag = move.selfSwitch === true ? true : this.dex.toID(move.selfSwitch);\n\t\t\t}\n\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 ActiveMove;\n\t\t\t}\n\n\t\t\t// Let's see if the target is immune to the move.\n\t\t\tif (!target.runImmunity(move, true)) {\n\t\t\t\treturn false;\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 65535;\n\t\t\t}\n\n\t\t\t// We edit the damage through move's damage callback if necessary.\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 (seismic toss).\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 return that.\n\t\t\tif (move.damage) {\n\t\t\t\treturn move.damage;\n\t\t\t}\n\n\t\t\t// If it's the first hit on a Normal-type partially trap move, it hits Ghosts anyways but damage is 0.\n\t\t\tif (move.volatileStatus === 'partiallytrapped' && move.type === 'Normal' && target.hasType('Ghost')) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\t// Let's check if we are in middle of a partial trap sequence to return the previous damage.\n\t\t\tif (source.volatiles['partialtrappinglock'] && (target === source.volatiles['partialtrappinglock'].locked)) {\n\t\t\t\treturn source.volatiles['partialtrappinglock'].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\tif (!move.category) move.category = 'Physical';\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 = 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\t\t\tif (!basePower) {\n\t\t\t\treturn basePower === 0 ? undefined : 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 possibility. We check if it's a 100% crit move, otherwise we calculate the chance.\n\t\t\tlet isCrit = move.willCrit || false;\n\t\t\tif (!isCrit) {\n\t\t\t\t// In Stadium, the critical chance is based on speed.\n\t\t\t\t// First, we get the base speed and store it. Then we add 76. This is our current crit chance.\n\t\t\t\tlet critChance = source.species.baseStats['spe'] + 76;\n\n\t\t\t\t// Now we right logical shift it two places, essentially dividing by 4 and flooring it.\n\t\t\t\tcritChance >>= 2;\n\n\t\t\t\t// Now we check for focus energy volatile.\n\t\t\t\tif (source.volatiles['focusenergy']) {\n\t\t\t\t\t// If it exists, crit chance is multiplied by 4 and floored with a logical left shift.\n\t\t\t\t\tcritChance <<= 2;\n\t\t\t\t\t// Then we add 160.\n\t\t\t\t\tcritChance += 160;\n\t\t\t\t} else {\n\t\t\t\t\t// If it is not active, we left shift it by 1.\n\t\t\t\t\tcritChance <<= 1;\n\t\t\t\t}\n\n\t\t\t\t// Now we check for the move's critical hit ratio.\n\t\t\t\tif (move.critRatio === 2) {\n\t\t\t\t\t// High crit ratio, we multiply the result so far by 4.\n\t\t\t\t\tcritChance <<= 2;\n\t\t\t\t} else if (move.critRatio === 1) {\n\t\t\t\t\t// Normal hit ratio, we divide the crit chance by 2 and floor the result again.\n\t\t\t\t\tcritChance >>= 1;\n\t\t\t\t}\n\n\t\t\t\t// Now we make sure it's a number between 1 and 255.\n\t\t\t\tcritChance = this.battle.clampIntRange(critChance, 1, 255);\n\n\t\t\t\t// Last, we check deppending on ratio if the move critical hits or not.\n\t\t\t\t// We compare our critical hit chance against a random number between 0 and 255.\n\t\t\t\t// If the random number is lower, we get a critical hit. This means there is always a 1/255 chance of not hitting critically.\n\t\t\t\tif (critChance > 0) {\n\t\t\t\t\tisCrit = this.battle.randomChance(critChance, 256);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// There is a critical hit.\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\tbasePower = this.battle.runEvent('BasePower', source, target, move, basePower);\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 attacker's and defender's stats.\n\t\t\tlet level = source.level;\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 attack = attacker.getStat(atkType);\n\t\t\tlet defense = defender.getStat(defType);\n\n\t\t\t// In gen 1, screen effect is applied here.\n\t\t\tif ((defType === 'def' && defender.volatiles['reflect']) || (defType === 'spd' && defender.volatiles['lightscreen'])) {\n\t\t\t\tthis.battle.debug('Screen doubling (Sp)Def');\n\t\t\t\tdefense *= 2;\n\t\t\t\tdefense = this.battle.clampIntRange(defense, 1, 1998);\n\t\t\t}\n\n\t\t\t// In the event of a critical hit, the offense and defense changes are ignored.\n\t\t\t// This includes both boosts and screens.\n\t\t\t// Also, level is doubled in damage calculation.\n\t\t\tif (isCrit) {\n\t\t\t\tmove.ignoreOffensive = true;\n\t\t\t\tmove.ignoreDefensive = true;\n\t\t\t\tlevel *= 2;\n\t\t\t\tif (!suppressMessages) this.battle.add('-crit', target);\n\t\t\t}\n\n\t\t\tif (move.ignoreOffensive) {\n\t\t\t\tthis.battle.debug('Negating (sp)atk boost/penalty.');\n\t\t\t\tattack = attacker.getStat(atkType, 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);\n\t\t\t}\n\n\t\t\t// When either attack or defense are higher than 256, they are both divided by 4 and moded by 256.\n\t\t\t// This is what causes the rollover bugs.\n\t\t\tif (attack >= 256 || defense >= 256) {\n\t\t\t\tattack = this.battle.clampIntRange(Math.floor(attack / 4) % 256, 1);\n\t\t\t\t// Defense isn't checked on the cartridge, but we don't want those / 0 bugs on the sim.\n\t\t\t\tdefense = this.battle.clampIntRange(Math.floor(defense / 4) % 256, 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 = this.battle.clampIntRange(Math.floor(damage / 50), 0, 997);\n\t\t\tdamage += 2;\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\t// In Gen 1, type effectiveness is applied against each of the target's types.\n\t\t\tfor (const targetType of target.types) {\n\t\t\t\tconst typeMod = this.battle.dex.getEffectiveness(type, targetType);\n\t\t\t\tif (typeMod > 0) {\n\t\t\t\t\t// Super effective against targetType\n\t\t\t\t\tdamage *= 20;\n\t\t\t\t\tdamage = Math.floor(damage / 10);\n\t\t\t\t}\n\t\t\t\tif (typeMod < 0) {\n\t\t\t\t\t// Not very effective against targetType\n\t\t\t\t\tdamage *= 5;\n\t\t\t\t\tdamage = Math.floor(damage / 10);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst totalTypeMod = target.runEffectiveness(move);\n\t\t\tif (totalTypeMod > 0) {\n\t\t\t\tif (!suppressMessages) this.battle.add('-supereffective', target);\n\t\t\t}\n\t\t\tif (totalTypeMod < 0) {\n\t\t\t\tif (!suppressMessages) this.battle.add('-resisted', target);\n\t\t\t}\n\n\t\t\t// If damage becomes 0, the move is made to miss.\n\t\t\t// This occurs when damage was either 2 or 3 prior to applying STAB/Type matchup, and target is 4x resistant to the move.\n\t\t\tif (damage === 0) return damage;\n\n\t\t\t// Apply random factor if damage is greater than 1\n\t\t\tif (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// We are done, this is the final damage.\n\t\t\treturn Math.floor(damage);\n\t\t},\n\t},\n};\n"]}
1
+ {"version":3,"sources":["/Users/kjs/Code/src/github.com/pkmn/ps/mods/build/gen1stadium/index.js","../../src/gen1stadium/conditions.ts","../../src/gen1stadium/rulesets.ts","../../src/gen1stadium/moves.ts","../../src/gen1stadium/scripts.ts"],"names":[],"mappings":"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","file":"/Users/kjs/Code/src/github.com/pkmn/ps/mods/build/gen1stadium/index.js","sourcesContent":[null,"import type {ModdedConditionDataTable} from '@pkmn/sim';\n\nexport const Conditions: ModdedConditionDataTable = {\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},\n\t\tonAfterMoveSelfPriority: 2,\n\t\tonAfterMoveSelf(pokemon) {\n\t\t\tthis.damage(this.clampIntRange(Math.floor(pokemon.maxhp / 16), 1));\n\t\t},\n\t\tonAfterSwitchInSelf(pokemon) {\n\t\t\tthis.damage(this.clampIntRange(Math.floor(pokemon.maxhp / 16), 1));\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},\n\t\tonBeforeMovePriority: 2,\n\t\tonBeforeMove(pokemon) {\n\t\t\tif (this.randomChance(63, 256)) {\n\t\t\t\tthis.add('cant', pokemon, 'par');\n\t\t\t\tpokemon.removeVolatile('bide');\n\t\t\t\tpokemon.removeVolatile('lockedmove');\n\t\t\t\tpokemon.removeVolatile('twoturnmove');\n\t\t\t\tpokemon.removeVolatile('invulnerability');\n\t\t\t\tpokemon.removeVolatile('partialtrappinglock');\n\t\t\t\treturn false;\n\t\t\t}\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-3 turns\n\t\t\tthis.effectState.startTime = this.random(1, 4);\n\t\t\tthis.effectState.time = this.effectState.startTime;\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: 2,\n\t\tonBeforeMove(pokemon, target, move) {\n\t\t\tpokemon.statusState.time--;\n\t\t\tthis.add('cant', pokemon, 'slp');\n\t\t\tpokemon.lastMove = null;\n\t\t\treturn false;\n\t\t},\n\t\tonAfterMoveSelf(pokemon) {\n\t\t\tif (pokemon.statusState.time <= 0) pokemon.cureStatus();\n\t\t},\n\t},\n\tfrz: {\n\t\tname: 'frz',\n\t\teffectType: 'Status',\n\t\tonStart(target) {\n\t\t\tthis.add('-status', target, 'frz');\n\t\t},\n\t\tonBeforeMovePriority: 2,\n\t\tonBeforeMove(pokemon, target, move) {\n\t\t\tthis.add('cant', pokemon, 'frz');\n\t\t\tpokemon.lastMove = null;\n\t\t\treturn false;\n\t\t},\n\t\tonHit(target, source, move) {\n\t\t\tif (move.type === 'Fire' && move.category !== 'Status') {\n\t\t\t\ttarget.cureStatus();\n\t\t\t}\n\t\t},\n\t},\n\tpsn: {\n\t\tname: 'psn',\n\t\teffectType: 'Status',\n\t\tonStart(target) {\n\t\t\tthis.add('-status', target, 'psn');\n\t\t},\n\t\tonAfterMoveSelfPriority: 2,\n\t\tonAfterMoveSelf(pokemon) {\n\t\t\tthis.damage(this.clampIntRange(Math.floor(pokemon.maxhp / 16), 1));\n\t\t},\n\t\tonAfterSwitchInSelf(pokemon) {\n\t\t\tthis.damage(this.clampIntRange(Math.floor(pokemon.maxhp / 16), 1));\n\t\t},\n\t},\n\tconfusion: {\n\t\tinherit: true,\n\t\tonStart(target) {\n\t\t\tthis.add('-start', target, 'confusion');\n\t\t\tthis.effectState.time = this.random(2, 6);\n\t\t},\n\t},\n\tflinch: {\n\t\tinherit: true,\n\t\tonStart() {},\n\t},\n\tpartiallytrapped: {\n\t\tname: 'partiallytrapped',\n\t\tduration: 2,\n\t\tonBeforeMovePriority: 1,\n\t\tonStart(target, source, effect) {\n\t\t\tthis.add('-activate', target, `move: ${effect}`, `[of] ${source}`);\n\t\t},\n\t\tonBeforeMove(pokemon) {\n\t\t\tif (this.effectState.source && (!this.effectState.source.isActive || this.effectState.source.hp <= 0)) {\n\t\t\t\tpokemon.removeVolatile('partiallytrapped');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.add('cant', pokemon, 'partiallytrapped');\n\t\t\treturn false;\n\t\t},\n\t\tonEnd(pokemon) {\n\t\t\tthis.add('-end', pokemon, this.effectState.sourceEffect, '[partiallytrapped]');\n\t\t},\n\t},\n};\n","import type {ModdedFormatDataTable} from '@pkmn/sim';\n\nexport const Rulesets: ModdedFormatDataTable = {\n\tstandard: {\n\t\teffectType: 'ValidatorRule',\n\t\tname: 'Standard',\n\t\truleset: ['Obtainable', 'Stadium Sleep Clause', 'Freeze Clause Mod', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Moves Clause', 'Exact HP Mod', 'Cancel Mod'],\n\t},\n};\n","import type {ActiveMove, ModdedMoveDataTable} from '@pkmn/sim';\n\nexport const Moves: ModdedMoveDataTable = {\n\tbide: {\n\t\tinherit: true,\n\t\tpriority: 0,\n\t\taccuracy: true,\n\t\tcondition: {\n\t\t\tdurationCallback(target, source, effect) {\n\t\t\t\treturn this.random(3, 5);\n\t\t\t},\n\t\t\tonStart(pokemon) {\n\t\t\t\tthis.effectState.totalDamage = 0;\n\t\t\t\tthis.effectState.lastDamage = 0;\n\t\t\t\tthis.add('-start', pokemon, 'Bide');\n\t\t\t},\n\t\t\tonHit(target, source, move) {\n\t\t\t\tif (source && source !== target && move.category !== 'Physical' && move.category !== 'Special') {\n\t\t\t\t\tconst damage = this.effectState.totalDamage;\n\t\t\t\t\tthis.effectState.totalDamage += damage;\n\t\t\t\t\tthis.effectState.lastDamage = damage;\n\t\t\t\t\tthis.effectState.sourceSlot = source.getSlot();\n\t\t\t\t}\n\t\t\t},\n\t\t\tonDamage(damage, target, source, move) {\n\t\t\t\tif (!source || source.isAlly(target)) return;\n\t\t\t\tif (!move || move.effectType !== 'Move') return;\n\t\t\t\tif (!damage && this.effectState.lastDamage > 0) {\n\t\t\t\t\tdamage = this.effectState.totalDamage;\n\t\t\t\t}\n\t\t\t\tthis.effectState.totalDamage += damage;\n\t\t\t\tthis.effectState.lastDamage = damage;\n\t\t\t\tthis.effectState.sourceSlot = source.getSlot();\n\t\t\t},\n\t\t\tonAfterSetStatus(status, pokemon) {\n\t\t\t\t// Sleep, freeze, and partial trap will just pause duration.\n\t\t\t\tif (pokemon.volatiles['flinch']) {\n\t\t\t\t\tthis.effectState.duration!++;\n\t\t\t\t} else if (pokemon.volatiles['partiallytrapped']) {\n\t\t\t\t\tthis.effectState.duration!++;\n\t\t\t\t} else {\n\t\t\t\t\tswitch (status.id) {\n\t\t\t\t\tcase 'slp':\n\t\t\t\t\tcase 'frz':\n\t\t\t\t\t\tthis.effectState.duration!++;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tonBeforeMove(pokemon, t, move) {\n\t\t\t\tif (this.effectState.duration === 1) {\n\t\t\t\t\tthis.add('-end', pokemon, 'Bide');\n\t\t\t\t\tif (!this.effectState.totalDamage) {\n\t\t\t\t\t\tthis.debug(\"Bide failed because no damage was taken\");\n\t\t\t\t\t\tthis.add('-fail', pokemon);\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tconst target = this.getAtSlot(this.effectState.sourceSlot);\n\t\t\t\t\tif (target.isSemiInvulnerable()) {\n\t\t\t\t\t\tthis.add('-message', 'The foe ' + target.name + ' can\\'t be hit while flying!');\n\t\t\t\t\t\tpokemon.removeVolatile('bide');\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tthis.actions.moveHit(target, pokemon, move, { damage: this.effectState.totalDamage * 2 } as ActiveMove);\n\t\t\t\t\tpokemon.removeVolatile('bide');\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tthis.add('-activate', pokemon, 'Bide');\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\tonDisableMove(pokemon) {\n\t\t\t\tif (!pokemon.hasMove('bide')) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tfor (const moveSlot of pokemon.moveSlots) {\n\t\t\t\t\tif (moveSlot.id !== 'bide') {\n\t\t\t\t\t\tpokemon.disableMove(moveSlot.id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\ttype: \"???\", // Will look as Normal but it's STAB-less\n\t},\n\tbind: {\n\t\tinherit: true,\n\t\t// FIXME: onBeforeMove() {},\n\t},\n\tclamp: {\n\t\tinherit: true,\n\t\t// FIXME: onBeforeMove() {},\n\t},\n\tcounter: {\n\t\tinherit: true,\n\t\tignoreImmunity: true,\n\t\twillCrit: false,\n\t\tbasePower: 1,\n\t\tdamageCallback(pokemon, target) {\n\t\t\t// Counter mechanics in Stadium 1:\n\t\t\t// - a move is Counterable if it is Normal or Fighting type, has nonzero Base Power, and is not Counter\n\t\t\t// - Counter succeeds if the target used a Counterable move earlier this turn\n\n\t\t\tconst lastMoveThisTurn = target.side.lastMove && target.side.lastMove.id === target.side.lastSelectedMove &&\n\t\t\t\t!this.queue.willMove(target) && this.dex.moves.get(target.side.lastMove.id);\n\t\t\tif (!lastMoveThisTurn) {\n\t\t\t\tthis.debug(\"Stadium 1 Counter: last move was not this turn\");\n\t\t\t\tthis.add('-fail', pokemon);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst lastMoveThisTurnIsCounterable = lastMoveThisTurn && lastMoveThisTurn.basePower > 0 &&\n\t\t\t\t['Normal', 'Fighting'].includes(lastMoveThisTurn.type) && lastMoveThisTurn.id !== 'counter';\n\t\t\tif (!lastMoveThisTurnIsCounterable) {\n\t\t\t\tthis.debug(`Stadium 1 Counter: last move ${lastMoveThisTurn.name} was not Counterable`);\n\t\t\t\tthis.add('-fail', pokemon);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (this.lastDamage <= 0) {\n\t\t\t\tthis.debug(\"Stadium 1 Counter: no previous damage exists\");\n\t\t\t\tthis.add('-fail', pokemon);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn 2 * this.lastDamage;\n\t\t},\n\t},\n\tfirespin: {\n\t\tinherit: true,\n\t\t// FIXME: onBeforeMove() {},\n\t},\n\thaze: {\n\t\tinherit: true,\n\t\tonHit(target, source) {\n\t\t\tthis.add('-activate', target, 'move: Haze');\n\t\t\tthis.add('-clearallboost', '[silent]');\n\t\t\tfor (const pokemon of this.getAllActive()) {\n\t\t\t\tpokemon.clearBoosts();\n\t\t\t\tpokemon.cureStatus(true);\n\t\t\t\tfor (const id of Object.keys(pokemon.volatiles)) {\n\t\t\t\t\tpokemon.removeVolatile(id);\n\t\t\t\t\tthis.add('-end', pokemon, id, '[silent]');\n\t\t\t\t}\n\t\t\t\tpokemon.recalculateStats!();\n\t\t\t}\n\t\t},\n\t},\n\thyperbeam: {\n\t\tinherit: true,\n\t\tonMoveFail(target, source, move) {\n\t\t\tsource.addVolatile('mustrecharge');\n\t\t},\n\t},\n\tpsywave: {\n\t\tinherit: true,\n\t\tbasePower: 1,\n\t\tdamageCallback(pokemon) {\n\t\t\treturn this.random(1, this.trunc(1.5 * pokemon.level));\n\t\t},\n\t},\n\trage: {\n\t\tinherit: true,\n\t\tself: {\n\t\t\tvolatileStatus: 'rage',\n\t\t},\n\t\tcondition: {\n\t\t\t// Rage lock\n\t\t\tonStart(target, source, effect) {\n\t\t\t\tthis.effectState.move = 'rage';\n\t\t\t},\n\t\t\tonLockMove: 'rage',\n\t\t\tonHit(target, source, move) {\n\t\t\t\tif (target.boosts.atk < 6 && (move.category !== 'Status' || move.id === 'disable')) {\n\t\t\t\t\tthis.boost({ atk: 1 });\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t},\n\trecover: {\n\t\tinherit: true,\n\t\theal: null,\n\t\tonHit(target) {\n\t\t\tif (target.hp === target.maxhp) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthis.heal(Math.floor(target.maxhp / 2), target, target);\n\t\t},\n\t},\n\trest: {\n\t\tinherit: true,\n\t\tonHit(target, source, move) {\n\t\t\t// Fails if the difference between\n\t\t\t// max HP and current HP is 0, 255, or 511\n\t\t\tif (target.hp >= target.maxhp) return false;\n\t\t\tif (!target.setStatus('slp', source, move)) return false;\n\t\t\ttarget.statusState.time = 2;\n\t\t\ttarget.statusState.startTime = 2;\n\t\t\ttarget.recalculateStats!(); // Stadium Rest removes statdrops given by Major Status Conditions.\n\t\t\tthis.heal(target.maxhp); // Aesthetic only as the healing happens after you fall asleep in-game\n\t\t},\n\t},\n\tsoftboiled: {\n\t\tinherit: true,\n\t\theal: null,\n\t\tonHit(target) {\n\t\t\t// Fail when health is 255 or 511 less than max\n\t\t\tif (target.hp === target.maxhp) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthis.heal(Math.floor(target.maxhp / 2), target, target);\n\t\t},\n\t},\n\tsubstitute: {\n\t\tinherit: true,\n\t\tonTryHit(target) {\n\t\t\tif (target.volatiles['substitute']) {\n\t\t\t\tthis.add('-fail', target, 'move: Substitute');\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\t// Stadium fixes the 25% = you die gag\n\t\t\tif (target.hp <= target.maxhp / 4) {\n\t\t\t\tthis.add('-fail', target, 'move: Substitute', '[weak]');\n\t\t\t\treturn null;\n\t\t\t}\n\t\t},\n\t\tcondition: {\n\t\t\tonStart(target) {\n\t\t\t\tthis.add('-start', target, 'Substitute');\n\t\t\t\tthis.effectState.hp = Math.floor(target.maxhp / 4);\n\t\t\t\tdelete target.volatiles['partiallytrapped'];\n\t\t\t},\n\t\t\tonTryHitPriority: -1,\n\t\t\tonTryHit(target, source, move) {\n\t\t\t\tif (target === source) {\n\t\t\t\t\tthis.debug('sub bypass: self hit');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (move.drain) {\n\t\t\t\t\tthis.add('-miss', source);\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tif (move.category === 'Status') {\n\t\t\t\t\tconst SubBlocked = ['leechseed', 'lockon', 'mindreader', 'nightmare'];\n\t\t\t\t\tif (move.status || move.boosts || move.volatileStatus === 'confusion' || SubBlocked.includes(move.id)) {\n\t\t\t\t\t\tthis.add('-activate', target, 'Substitute', '[block] ' + move.name);\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (move.volatileStatus && target === source) return;\n\t\t\t\tlet damage = this.actions.getDamage(source, target, move);\n\t\t\t\tif (damage && damage > target.volatiles['substitute'].hp) {\n\t\t\t\t\tdamage = target.volatiles['substitute'].hp;\n\t\t\t\t}\n\t\t\t\tif (!damage && damage !== 0) return null;\n\t\t\t\ttarget.volatiles['substitute'].hp -= damage;\n\t\t\t\tthis.lastDamage = damage;\n\t\t\t\tif (target.volatiles['substitute'].hp <= 0) {\n\t\t\t\t\tthis.debug('Substitute broke');\n\t\t\t\t\ttarget.removeVolatile('substitute');\n\t\t\t\t\ttarget.subFainted = true;\n\t\t\t\t} else {\n\t\t\t\t\tthis.add('-activate', target, 'Substitute', '[damage]');\n\t\t\t\t}\n\t\t\t\t// Drain/recoil does not happen if the substitute breaks\n\t\t\t\tif (target.volatiles['substitute']) {\n\t\t\t\t\tif (move.recoil) {\n\t\t\t\t\t\tthis.damage(this.clampIntRange(Math.floor(damage * move.recoil[0] / move.recoil[1]), 1), source, target, 'recoil');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.runEvent('AfterSubDamage', target, source, move, damage);\n\t\t\t\t// Add here counter damage\n\t\t\t\tconst lastAttackedBy = target.getLastAttackedBy();\n\t\t\t\tif (!lastAttackedBy) {\n\t\t\t\t\ttarget.attackedBy.push({ source, move: move.id, damage, slot: source.getSlot(), thisTurn: true });\n\t\t\t\t} else {\n\t\t\t\t\tlastAttackedBy.move = move.id;\n\t\t\t\t\tlastAttackedBy.damage = damage;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t},\n\t\t\tonEnd(target) {\n\t\t\t\tthis.add('-end', target, 'Substitute');\n\t\t\t},\n\t\t},\n\t\tsecondary: null,\n\t\ttarget: \"self\",\n\t\ttype: \"Normal\",\n\t},\n\tstruggle: {\n\t\tinherit: true,\n\t\tignoreImmunity: { 'Normal': true },\n\t},\n\twrap: {\n\t\tinherit: true,\n\t\t// FIXME: onBeforeMove() {},\n\t},\n};\n","import type {ActiveMove, BoostID, ModdedBattleScriptsData, StatIDExceptHP} from '@pkmn/sim';\n\n/**\n * Stadium mechanics inherit from gen 1 mechanics, but fixes some stuff.\n */\n\nconst SKIP_LASTDAMAGE = new Set([\n\t'confuseray', 'conversion', 'counter', 'focusenergy', 'glare', 'haze', 'leechseed', 'lightscreen',\n\t'mimic', 'mist', 'poisongas', 'poisonpowder', 'recover', 'reflect', 'rest', 'softboiled',\n\t'splash', 'stunspore', 'substitute', 'supersonic', 'teleport', 'thunderwave', 'toxic', 'transform',\n]);\n\nexport const Scripts: ModdedBattleScriptsData = {\n\tinherit: 'gen1',\n\tgen: 1,\n\t// BattlePokemon scripts. Stadium shares gen 1 code but it fixes some problems with it.\n\tpokemon: {\n\t\tinherit: true,\n\t\t// This is run on Stadium after boosts and status changes.\n\t\trecalculateStats() {\n\t\t\tlet statName: StatIDExceptHP;\n\t\t\tfor (statName in this.storedStats) {\n\t\t\t\tlet stat = this.species.baseStats[statName];\n\t\t\t\tstat = Math.floor(\n\t\t\t\t\tMath.floor(\n\t\t\t\t\t\t2 * stat + this.set.ivs[statName] + Math.floor(this.set.evs[statName] / 4)\n\t\t\t\t\t) * this.level / 100 + 5\n\t\t\t\t);\n\t\t\t\tthis.baseStoredStats[statName] = this.storedStats[statName] = Math.floor(stat);\n\t\t\t\tthis.modifiedStats![statName] = Math.floor(stat);\n\t\t\t\t// Re-apply drops, if necessary.\n\t\t\t\tif (this.status === 'par' && statName === 'spe') this.modifyStat!('spe', 0.25);\n\t\t\t\tif (this.status === 'brn' && statName === 'atk') this.modifyStat!('atk', 0.5);\n\t\t\t\tif (this.boosts[statName] !== 0) {\n\t\t\t\t\tif (this.boosts[statName] >= 0) {\n\t\t\t\t\t\tthis.modifyStat!(statName, [1, 1.5, 2, 2.5, 3, 3.5, 4][this.boosts[statName]]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.modifyStat!(statName, [100, 66, 50, 40, 33, 28, 25][-this.boosts[statName]] / 100);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (this.modifiedStats![statName] > 999) {\n\t\t\t\t\tthis.modifiedStats![statName] = 999;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// Stadium's fixed boosting function.\n\t\tboostBy(boost) {\n\t\t\tlet changed = false;\n\t\t\tlet i: BoostID;\n\t\t\tfor (i in boost) {\n\t\t\t\tlet delta = boost[i];\n\t\t\t\tif (delta === undefined) continue;\n\t\t\t\tthis.boosts[i] += delta;\n\t\t\t\tif (this.boosts[i] > 6) {\n\t\t\t\t\tdelta -= this.boosts[i] - 6;\n\t\t\t\t\tthis.boosts[i] = 6;\n\t\t\t\t}\n\t\t\t\tif (this.boosts[i] < -6) {\n\t\t\t\t\tdelta -= this.boosts[i] - (-6);\n\t\t\t\t\tthis.boosts[i] = -6;\n\t\t\t\t}\n\t\t\t\tif (delta) changed = true;\n\t\t\t}\n\t\t\tthis.recalculateStats!();\n\t\t\treturn changed;\n\t\t},\n\t\t// Remove stat recalculation logic from gen 1\n\t\tclearBoosts() {\n\t\t\tlet i: BoostID;\n\t\t\tfor (i in this.boosts) {\n\t\t\t\tthis.boosts[i] = 0;\n\t\t\t}\n\t\t},\n\t},\n\tactions: {\n\t\tinherit: true,\n\t\trunMove(moveOrMoveName, pokemon, targetLoc, options) {\n\t\t\tlet sourceEffect = options?.sourceEffect;\n\t\t\tconst move = this.dex.getActiveMove(moveOrMoveName);\n\t\t\tconst target = this.battle.getTarget(pokemon, move, targetLoc);\n\t\t\tif (target?.subFainted) target.subFainted = null;\n\n\t\t\tthis.battle.setActiveMove(move, pokemon, target);\n\n\t\t\tif (pokemon.moveThisTurn || !this.battle.runEvent('BeforeMove', pokemon, target, move)) {\n\t\t\t\tthis.battle.debug(`${pokemon.fullname} move interrupted; movedThisTurn: ${pokemon.moveThisTurn}`);\n\t\t\t\tthis.battle.clearActiveMove(true);\n\t\t\t\t// This is only run for sleep\n\t\t\t\tthis.battle.runEvent('AfterMoveSelf', pokemon, target, move);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (move.beforeMoveCallback) {\n\t\t\t\tif (move.beforeMoveCallback.call(this.battle, pokemon, target, move)) {\n\t\t\t\t\tthis.battle.clearActiveMove(true);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tlet lockedMove = this.battle.runEvent('LockMove', pokemon);\n\t\t\tif (lockedMove === true) lockedMove = false;\n\t\t\tif (\n\t\t\t\t!lockedMove &&\n\t\t\t\t(!pokemon.volatiles['partialtrappinglock'] || pokemon.volatiles['partialtrappinglock'].locked !== target)\n\t\t\t) {\n\t\t\t\tpokemon.deductPP(move, null, target);\n\t\t\t} else {\n\t\t\t\tsourceEffect = move;\n\t\t\t}\n\t\t\tthis.battle.actions.useMove(move, pokemon, { target, sourceEffect });\n\t\t},\n\t\t// This function deals with AfterMoveSelf events.\n\t\t// This leads with partial trapping moves shenanigans after the move has been used.\n\t\tuseMove(moveOrMoveName, pokemon, options) {\n\t\t\tlet sourceEffect = options?.sourceEffect;\n\t\t\tlet target = options?.target;\n\t\t\tconst moveResult = this.useMoveInner(moveOrMoveName, pokemon, { target, sourceEffect });\n\n\t\t\tif (!sourceEffect && this.battle.effect.id) sourceEffect = this.battle.effect;\n\t\t\tconst baseMove = this.battle.dex.moves.get(moveOrMoveName);\n\t\t\tlet move = this.battle.dex.getActiveMove(baseMove);\n\t\t\tif (target === undefined) target = this.battle.getRandomTarget(pokemon, move);\n\t\t\tif (move.target === 'self') {\n\t\t\t\ttarget = pokemon;\n\t\t\t}\n\t\t\tif (sourceEffect) move.sourceEffect = sourceEffect.id;\n\n\t\t\tthis.battle.singleEvent('ModifyMove', move, null, pokemon, target, move, move);\n\t\t\tif (baseMove.target !== move.target) {\n\t\t\t\t// Target changed in ModifyMove, so we must adjust it here\n\t\t\t\ttarget = this.battle.getRandomTarget(pokemon, move);\n\t\t\t}\n\t\t\tmove = this.battle.runEvent('ModifyMove', pokemon, target, move, move);\n\t\t\tif (baseMove.target !== move.target) {\n\t\t\t\t// Check again, this shouldn't ever happen on Gen 1.\n\t\t\t\ttarget = this.battle.getRandomTarget(pokemon, move);\n\t\t\t}\n\n\t\t\tif (move.id !== 'metronome') {\n\t\t\t\tif (move.id !== 'mirrormove' ||\n\t\t\t\t\t(!pokemon.side.foe.active[0]?.lastMove || pokemon.side.foe.active[0].lastMove?.id === 'mirrormove')) {\n\t\t\t\t\t// The move is our 'final' move (a failed Mirror Move, or any move that isn't Metronome or Mirror Move).\n\t\t\t\t\tpokemon.side.lastMove = move;\n\t\t\t\t\tpokemon.lastMove = move;\n\t\t\t\t\tthis.battle.singleEvent('AfterMove', move, null, pokemon, target, move);\n\n\t\t\t\t\t// If target fainted\n\t\t\t\t\tif (target && target.hp <= 0) {\n\t\t\t\t\t\tdelete pokemon.volatiles['partialtrappinglock'];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.battle.runEvent('AfterMoveSelf', pokemon, target, move);\n\t\t\t\t\t}\n\t\t\t\t\tif (pokemon.volatiles['mustrecharge']) this.battle.add('-mustrecharge', pokemon);\n\n\t\t\t\t\t// For partial trapping moves, we are saving the target.\n\t\t\t\t\tif (move.volatileStatus === 'partiallytrapped' && target && target.hp > 0) {\n\t\t\t\t\t\t// It hit, so let's remove must recharge volatile. Yup, this happens on Stadium.\n\t\t\t\t\t\ttarget.removeVolatile('mustrecharge');\n\t\t\t\t\t\t// Let's check if the lock exists\n\t\t\t\t\t\tif (pokemon.volatiles['partialtrappinglock'] && target.volatiles['partiallytrapped']) {\n\t\t\t\t\t\t\t// Here the partialtrappinglock volatile has been already applied\n\t\t\t\t\t\t\tif (!pokemon.volatiles['partialtrappinglock'].locked) {\n\t\t\t\t\t\t\t\t// If it's the first hit, we save the target\n\t\t\t\t\t\t\t\tpokemon.volatiles['partialtrappinglock'].locked = target;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} // If we move to here, the move failed and there's no partial trapping lock\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn moveResult;\n\t\t},\n\t\t// This is the function that actually uses the move, running ModifyMove events.\n\t\t// It uses the move and then deals with the effects after the move.\n\t\tuseMoveInner(moveOrMoveName, pokemon, options) {\n\t\t\tlet sourceEffect = options?.sourceEffect;\n\t\t\tlet target = options?.target;\n\t\t\tif (!sourceEffect && this.battle.effect.id) sourceEffect = this.battle.effect;\n\t\t\tconst baseMove = this.battle.dex.moves.get(moveOrMoveName);\n\t\t\tlet move = this.battle.dex.getActiveMove(baseMove);\n\t\t\tif (target === undefined) target = this.battle.getRandomTarget(pokemon, move);\n\t\t\tif (move.target === 'self') {\n\t\t\t\ttarget = pokemon;\n\t\t\t}\n\t\t\tif (sourceEffect) move.sourceEffect = sourceEffect.id;\n\n\t\t\tthis.battle.setActiveMove(move, pokemon, target);\n\n\t\t\tthis.battle.singleEvent('ModifyMove', move, null, pokemon, target, move, move);\n\t\t\tif (baseMove.target !== move.target) {\n\t\t\t\t// Target changed in ModifyMove, so we must adjust it here\n\t\t\t\ttarget = this.battle.getRandomTarget(pokemon, move);\n\t\t\t}\n\t\t\tmove = this.battle.runEvent('ModifyMove', pokemon, target, move, move);\n\t\t\tif (baseMove.target !== move.target) {\n\t\t\t\t// Check again, this shouldn't ever happen on Gen 1.\n\t\t\t\ttarget = this.battle.getRandomTarget(pokemon, move);\n\t\t\t\tthis.battle.debug('not a gen 1 mechanic');\n\t\t\t}\n\t\t\tif (!move) return false;\n\n\t\t\tlet attrs = '';\n\t\t\tif (pokemon.fainted) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (sourceEffect) attrs += `|[from] ${this.battle.dex.conditions.get(sourceEffect).name}`;\n\t\t\tthis.battle.addMove('move', pokemon, move.name, `${target}${attrs}`);\n\n\t\t\tif (!this.battle.singleEvent('Try', move, null, pokemon, target, move)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (!this.battle.singleEvent('TryMove', move, null, pokemon, target, move) ||\n\t\t\t\t!this.battle.runEvent('TryMove', pokemon, target, move)) {\n\t\t\t\treturn true;\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\tlet damage: number | undefined | false | '' = false;\n\t\t\tif (!target || target.fainted) {\n\t\t\t\tthis.battle.attrLastMove('[notarget]');\n\t\t\t\tthis.battle.add('-notarget');\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t// Store 0 damage for last damage if the move is not in the array.\n\t\t\tif (!SKIP_LASTDAMAGE.has(move.id)) this.battle.lastDamage = 0;\n\n\t\t\tdamage = this.tryMoveHit(target, pokemon, move);\n\n\t\t\t// Go ahead with results of the used move.\n\t\t\tif (damage === false) {\n\t\t\t\tthis.battle.singleEvent('MoveFail', move, null, target, pokemon, move);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tthis.battle.singleEvent('AfterMoveSecondarySelf', move, null, pokemon, target, move);\n\t\t\tthis.battle.runEvent('AfterMoveSecondarySelf', pokemon, target, move);\n\t\t\treturn true;\n\t\t},\n\t\ttryMoveHit(target, pokemon, move) {\n\t\t\tlet damage: number | false | undefined = 0;\n\n\t\t\t// First, check if the target is semi-invulnerable\n\t\t\tlet hitResult = 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\tif (move.selfdestruct) {\n\t\t\t\t\tthis.battle.faint(pokemon, pokemon, move);\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Then, check if the Pokemon is immune to this move.\n\t\t\tif (!target.runImmunity(move, true)) {\n\t\t\t\tif (move.selfdestruct) {\n\t\t\t\t\tthis.battle.faint(pokemon, pokemon, move);\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\thitResult = this.battle.singleEvent('TryImmunity', move, null, 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\t// Now, let's calculate the accuracy.\n\t\t\tlet accuracy = move.accuracy;\n\n\t\t\t// Partial trapping moves: true accuracy while it lasts\n\t\t\tif (pokemon.volatiles['partialtrappinglock']) {\n\t\t\t\tif (move.volatileStatus === 'partiallytrapped' && target === pokemon.volatiles['partialtrappinglock'].locked) {\n\t\t\t\t\taccuracy = true;\n\t\t\t\t} else if (pokemon.volatiles['partialtrappinglock'].locked !== target) {\n\t\t\t\t\t// The target switched, therefor, you fail using wrap.\n\t\t\t\t\tdelete pokemon.volatiles['partialtrappinglock'];\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// OHKO moves only have a chance to hit if the user is at least as fast as the target\n\t\t\tif (move.ohko) {\n\t\t\t\tif (target.speed > pokemon.speed) {\n\t\t\t\t\tthis.battle.add('-immune', target, '[ohko]');\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Calculate true accuracy for gen 1, which uses 0-255.\n\t\t\t// Stadium uses the Gen 2 boost table for accuracy and evasiveness, except for 1/3 instead of 0.33\n\t\t\tconst boostTable = [1 / 3, 0.36, 0.43, 0.5, 0.66, 0.75, 1, 1.33, 1.66, 2, 2.33, 2.66, 3];\n\t\t\tif (accuracy !== true) {\n\t\t\t\taccuracy = Math.floor(accuracy * 255 / 100);\n\t\t\t\t// Check also for accuracy modifiers.\n\t\t\t\tif (!move.ignoreAccuracy) {\n\t\t\t\t\taccuracy = Math.floor(accuracy * boostTable[pokemon.boosts.accuracy + 6]);\n\t\t\t\t}\n\t\t\t\tif (!move.ignoreEvasion) {\n\t\t\t\t\taccuracy = Math.floor(accuracy * boostTable[-target.boosts.evasion + 6]);\n\t\t\t\t}\n\t\t\t\taccuracy = Math.min(accuracy, 255);\n\t\t\t}\n\t\t\taccuracy = this.battle.runEvent('Accuracy', target, pokemon, move, accuracy);\n\n\t\t\t// Stadium attempts to fix the 1/256 miss by rerolling if the first value\n\t\t\t// would trigger the 1/256 miss.\n\t\t\tlet randomValue = this.battle.random(256);\n\t\t\tif (randomValue === 256) randomValue = this.battle.random(256);\n\t\t\tif (accuracy !== true && randomValue > accuracy) {\n\t\t\t\tthis.battle.attrLastMove('[miss]');\n\t\t\t\tthis.battle.add('-miss', pokemon);\n\t\t\t\tif (accuracy === 255) {\n\t\t\t\t\tthis.battle.hint(\"In Pokemon Stadium, moves with 100% accuracy can still miss 1/65536 of the time.\");\n\t\t\t\t}\n\t\t\t\tdamage = false;\n\t\t\t\tthis.battle.lastDamage = 0;\n\t\t\t}\n\n\t\t\t// If damage is 0 and not false it means it didn't miss, let's calc.\n\t\t\tif (damage !== false) {\n\t\t\t\tif (move.multihit) {\n\t\t\t\t\tlet hits = move.multihit;\n\t\t\t\t\tif (Array.isArray(hits)) {\n\t\t\t\t\t\t// Yes, it's hardcoded... meh\n\t\t\t\t\t\tif (hits[0] === 2 && hits[1] === 5) {\n\t\t\t\t\t\t\thits = this.battle.sample([2, 2, 2, 3, 3, 3, 4, 5]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\thits = this.battle.random(hits[0], hits[1] + 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\thits = Math.floor(hits);\n\t\t\t\t\t// In gen 1, all the hits have the same damage for multihits move\n\t\t\t\t\tlet moveDamage: number | false | undefined = 0;\n\t\t\t\t\tlet i: number;\n\t\t\t\t\tfor (i = 0; i < hits && target.hp && pokemon.hp; i++) {\n\t\t\t\t\t\tmove.hit = i + 1;\n\t\t\t\t\t\tif (move.hit === hits) move.lastHit = true;\n\t\t\t\t\t\tmoveDamage = this.moveHit(target, pokemon, move);\n\t\t\t\t\t\tif (moveDamage === false) break;\n\t\t\t\t\t\tdamage = (moveDamage || 0);\n\t\t\t\t\t\t// Move damage is fixed to be the first move's damage\n\t\t\t\t\t\tif (i === 0) move.damage = damage;\n\t\t\t\t\t\tif (target.subFainted) {\n\t\t\t\t\t\t\ti++;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tmove.damage = null;\n\t\t\t\t\tif (i === 0) return 1;\n\t\t\t\t\tthis.battle.add('-hitcount', target, i);\n\t\t\t\t} else {\n\t\t\t\t\tdamage = this.moveHit(target, pokemon, move);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (move.category !== 'Status') target.gotAttacked(move, damage, pokemon);\n\n\t\t\tif (move.selfdestruct) {\n\t\t\t\tthis.battle.faint(pokemon, pokemon, move);\n\t\t\t}\n\n\t\t\t// The move missed.\n\t\t\tif (damage === false) {\n\t\t\t\t// Delete the partial trap lock if necessary.\n\t\t\t\tdelete pokemon.volatiles['partialtrappinglock'];\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (move.ohko) this.battle.add('-ohko');\n\n\t\t\tthis.battle.singleEvent('AfterMoveSecondary', move, null, target, pokemon, move);\n\t\t\tthis.battle.runEvent('AfterMoveSecondary', target, pokemon, move);\n\n\t\t\treturn damage;\n\t\t},\n\t\tmoveHit(target, pokemon, moveOrMoveName, moveData, isSecondary, isSelf) {\n\t\t\tlet damage: number | false | null | undefined = 0;\n\t\t\tconst move = this.dex.getActiveMove(moveOrMoveName);\n\n\t\t\tif (!isSecondary && !isSelf) this.battle.setActiveMove(move, pokemon, target);\n\t\t\tlet hitResult: number | boolean = true;\n\t\t\tif (!moveData) moveData = move;\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 (target) {\n\t\t\t\thitResult = this.battle.singleEvent('TryHit', moveData, {}, target, pokemon, move);\n\n\t\t\t\t// Partial trapping moves still apply their volatile to Pokémon behind a Sub\n\t\t\t\tconst targetHadSub = !!target.volatiles['substitute'];\n\t\t\t\tif (targetHadSub && moveData.volatileStatus && moveData.volatileStatus === 'partiallytrapped') {\n\t\t\t\t\ttarget.addVolatile(moveData.volatileStatus, pokemon, move);\n\t\t\t\t\tif (!pokemon.volatiles['partialtrappinglock'] || pokemon.volatiles['partialtrappinglock'].duration! > 1) {\n\t\t\t\t\t\ttarget.volatiles[moveData.volatileStatus].duration = 2;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!hitResult) {\n\t\t\t\t\tif (hitResult === false) this.battle.add('-fail', target);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t// Only run the hit events for the hit itself, not the secondary or self hits\n\t\t\t\tif (!isSelf && !isSecondary) {\n\t\t\t\t\thitResult = this.battle.runEvent('TryHit', target, pokemon, move);\n\t\t\t\t\tif (!hitResult) {\n\t\t\t\t\t\tif (hitResult === false) this.battle.add('-fail', target);\n\t\t\t\t\t\t// Special Substitute hit flag\n\t\t\t\t\t\tif (hitResult !== 0) {\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (!this.battle.runEvent('TryFieldHit', target, pokemon, move)) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} else if (isSecondary && !moveData.self) {\n\t\t\t\t\thitResult = this.battle.runEvent('TrySecondaryHit', target, pokemon, moveData);\n\t\t\t\t}\n\n\t\t\t\tif (hitResult === 0) {\n\t\t\t\t\ttarget = null;\n\t\t\t\t} else if (!hitResult) {\n\t\t\t\t\tif (hitResult === false) this.battle.add('-fail', target);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (target) {\n\t\t\t\tlet didSomething = false;\n\n\t\t\t\tdamage = this.getDamage(pokemon, target, moveData);\n\t\t\t\tif (damage && damage > target.hp) {\n\t\t\t\t\tdamage = target.hp;\n\t\t\t\t}\n\t\t\t\tif ((damage || damage === 0) && !target.fainted) {\n\t\t\t\t\tdamage = this.battle.damage(damage, target, pokemon, move);\n\t\t\t\t\tif (!(damage || damage === 0)) return false;\n\t\t\t\t\tdidSomething = true;\n\t\t\t\t} else if (damage === false && typeof hitResult === 'undefined') {\n\t\t\t\t\tthis.battle.add('-fail', target);\n\t\t\t\t}\n\t\t\t\tif (damage === false || damage === null) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (moveData.boosts && !target.fainted) {\n\t\t\t\t\tthis.battle.boost(moveData.boosts, target, pokemon, move);\n\t\t\t\t}\n\t\t\t\tif (moveData.heal && !target.fainted) {\n\t\t\t\t\tconst d = target.heal(Math.floor(target.maxhp * moveData.heal[0] / moveData.heal[1]));\n\t\t\t\t\tif (!d) {\n\t\t\t\t\t\tthis.battle.add('-fail', target);\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tthis.battle.add('-heal', target, target.getHealth);\n\t\t\t\t\tdidSomething = true;\n\t\t\t\t}\n\t\t\t\tif (moveData.status) {\n\t\t\t\t\tif (!target.status) {\n\t\t\t\t\t\ttarget.setStatus(moveData.status, pokemon, move);\n\t\t\t\t\t\ttarget.recalculateStats!();\n\t\t\t\t\t} else if (!isSecondary) {\n\t\t\t\t\t\tif (target.status === moveData.status) {\n\t\t\t\t\t\t\tthis.battle.add('-fail', target, target.status);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.battle.add('-fail', target);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdidSomething = true;\n\t\t\t\t}\n\t\t\t\tif (moveData.forceStatus) {\n\t\t\t\t\tif (target.setStatus(moveData.forceStatus, pokemon, move)) {\n\t\t\t\t\t\ttarget.recalculateStats!();\n\t\t\t\t\t\tdidSomething = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (moveData.volatileStatus) {\n\t\t\t\t\tif (target.addVolatile(moveData.volatileStatus, pokemon, move)) {\n\t\t\t\t\t\tdidSomething = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (moveData.sideCondition) {\n\t\t\t\t\tif (target.side.addSideCondition(moveData.sideCondition, pokemon, move)) {\n\t\t\t\t\t\tdidSomething = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (moveData.pseudoWeather) {\n\t\t\t\t\tif (this.battle.field.addPseudoWeather(moveData.pseudoWeather, pokemon, move)) {\n\t\t\t\t\t\tdidSomething = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Hit events\n\t\t\t\thitResult = this.battle.singleEvent('Hit', moveData, {}, target, pokemon, move);\n\t\t\t\tif (!isSelf && !isSecondary) {\n\t\t\t\t\tthis.battle.runEvent('Hit', target, pokemon, move);\n\t\t\t\t}\n\t\t\t\tif (!hitResult && !didSomething) {\n\t\t\t\t\tif (hitResult === false) this.battle.add('-fail', target);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Here's where self effects are applied.\n\t\t\tif (moveData.self) {\n\t\t\t\tthis.moveHit(pokemon, pokemon, move, moveData.self, isSecondary, true);\n\t\t\t}\n\n\t\t\t// Now we can save the partial trapping damage.\n\t\t\tif (pokemon.volatiles['partialtrappinglock']) {\n\t\t\t\tpokemon.volatiles['partialtrappinglock'].damage = this.battle.lastDamage;\n\t\t\t}\n\n\t\t\t// Apply move secondaries.\n\t\t\tif (moveData.secondaries && target && target.hp > 0) {\n\t\t\t\tfor (const secondary of moveData.secondaries) {\n\t\t\t\t\t// Multi-hit moves only roll for status once\n\t\t\t\t\tif (!move.multihit || move.lastHit) {\n\t\t\t\t\t\t// We check here whether to negate the probable secondary status if it's para, burn, or freeze.\n\t\t\t\t\t\t// In the game, this is checked and if true, the random number generator is not called.\n\t\t\t\t\t\t// That means that a move that does not share the type of the target can status it.\n\t\t\t\t\t\t// If a move that was not fire-type would exist on Gen 1, it could burn a Pokémon.\n\t\t\t\t\t\tif (!(secondary.status && ['par', 'brn', 'frz'].includes(secondary.status) && target.hasType(move.type))) {\n\t\t\t\t\t\t\tconst effectChance = Math.floor((secondary.chance || 100) * 255 / 100);\n\t\t\t\t\t\t\tif (typeof secondary.chance === 'undefined' || this.battle.randomChance(effectChance + 1, 256)) {\n\t\t\t\t\t\t\t\tthis.moveHit(target, pokemon, move, secondary, true, isSelf);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (move.selfSwitch && pokemon.hp) {\n\t\t\t\tpokemon.switchFlag = move.selfSwitch === true ? true : this.dex.toID(move.selfSwitch);\n\t\t\t}\n\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 ActiveMove;\n\t\t\t}\n\n\t\t\t// Let's see if the target is immune to the move.\n\t\t\tif (!target.runImmunity(move, true)) {\n\t\t\t\treturn false;\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 65535;\n\t\t\t}\n\n\t\t\t// We edit the damage through move's damage callback if necessary.\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 (seismic toss).\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 return that.\n\t\t\tif (move.damage) {\n\t\t\t\treturn move.damage;\n\t\t\t}\n\n\t\t\t// If it's the first hit on a Normal-type partially trap move, it hits Ghosts anyways but damage is 0.\n\t\t\tif (move.volatileStatus === 'partiallytrapped' && move.type === 'Normal' && target.hasType('Ghost')) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\t// Let's check if we are in middle of a partial trap sequence to return the previous damage.\n\t\t\tif (source.volatiles['partialtrappinglock'] && (target === source.volatiles['partialtrappinglock'].locked)) {\n\t\t\t\treturn source.volatiles['partialtrappinglock'].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\tif (!move.category) move.category = 'Physical';\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 = 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\t\t\tif (!basePower) {\n\t\t\t\treturn basePower === 0 ? undefined : 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 possibility. We check if it's a 100% crit move, otherwise we calculate the chance.\n\t\t\tlet isCrit = move.willCrit || false;\n\t\t\tif (!isCrit) {\n\t\t\t\t// In Stadium, the critical chance is based on speed.\n\t\t\t\t// First, we get the base speed and store it. Then we add 76. This is our current crit chance.\n\t\t\t\tlet critChance = source.species.baseStats['spe'] + 76;\n\n\t\t\t\t// Now we right logical shift it two places, essentially dividing by 4 and flooring it.\n\t\t\t\tcritChance >>= 2;\n\n\t\t\t\t// Now we check for focus energy volatile.\n\t\t\t\tif (source.volatiles['focusenergy']) {\n\t\t\t\t\t// If it exists, crit chance is multiplied by 4 and floored with a logical left shift.\n\t\t\t\t\tcritChance <<= 2;\n\t\t\t\t\t// Then we add 160.\n\t\t\t\t\tcritChance += 160;\n\t\t\t\t} else {\n\t\t\t\t\t// If it is not active, we left shift it by 1.\n\t\t\t\t\tcritChance <<= 1;\n\t\t\t\t}\n\n\t\t\t\t// Now we check for the move's critical hit ratio.\n\t\t\t\tif (move.critRatio === 2) {\n\t\t\t\t\t// High crit ratio, we multiply the result so far by 4.\n\t\t\t\t\tcritChance <<= 2;\n\t\t\t\t} else if (move.critRatio === 1) {\n\t\t\t\t\t// Normal hit ratio, we divide the crit chance by 2 and floor the result again.\n\t\t\t\t\tcritChance >>= 1;\n\t\t\t\t}\n\n\t\t\t\t// Now we make sure it's a number between 1 and 255.\n\t\t\t\tcritChance = this.battle.clampIntRange(critChance, 1, 255);\n\n\t\t\t\t// Last, we check deppending on ratio if the move critical hits or not.\n\t\t\t\t// We compare our critical hit chance against a random number between 0 and 255.\n\t\t\t\t// If the random number is lower, we get a critical hit. This means there is always a 1/255 chance of not hitting critically.\n\t\t\t\tif (critChance > 0) {\n\t\t\t\t\tisCrit = this.battle.randomChance(critChance, 256);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// There is a critical hit.\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\tbasePower = this.battle.runEvent('BasePower', source, target, move, basePower);\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 attacker's and defender's stats.\n\t\t\tlet level = source.level;\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 attack = attacker.getStat(atkType);\n\t\t\tlet defense = defender.getStat(defType);\n\n\t\t\t// In gen 1, screen effect is applied here.\n\t\t\tif ((defType === 'def' && defender.volatiles['reflect']) || (defType === 'spd' && defender.volatiles['lightscreen'])) {\n\t\t\t\tthis.battle.debug('Screen doubling (Sp)Def');\n\t\t\t\tdefense *= 2;\n\t\t\t\tdefense = this.battle.clampIntRange(defense, 1, 1998);\n\t\t\t}\n\n\t\t\t// In the event of a critical hit, the offense and defense changes are ignored.\n\t\t\t// This includes both boosts and screens.\n\t\t\t// Also, level is doubled in damage calculation.\n\t\t\tif (isCrit) {\n\t\t\t\tmove.ignoreOffensive = true;\n\t\t\t\tmove.ignoreDefensive = true;\n\t\t\t\tlevel *= 2;\n\t\t\t\tif (!suppressMessages) this.battle.add('-crit', target);\n\t\t\t}\n\n\t\t\tif (move.ignoreOffensive) {\n\t\t\t\tthis.battle.debug('Negating (sp)atk boost/penalty.');\n\t\t\t\tattack = attacker.getStat(atkType, 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);\n\t\t\t}\n\n\t\t\t// When either attack or defense are higher than 256, they are both divided by 4 and moded by 256.\n\t\t\t// This is what causes the rollover bugs.\n\t\t\tif (attack >= 256 || defense >= 256) {\n\t\t\t\tattack = this.battle.clampIntRange(Math.floor(attack / 4) % 256, 1);\n\t\t\t\t// Defense isn't checked on the cartridge, but we don't want those / 0 bugs on the sim.\n\t\t\t\tdefense = this.battle.clampIntRange(Math.floor(defense / 4) % 256, 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 = this.battle.clampIntRange(Math.floor(damage / 50), 0, 997);\n\t\t\tdamage += 2;\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\t// In Gen 1, type effectiveness is applied against each of the target's types.\n\t\t\tfor (const targetType of target.types) {\n\t\t\t\tconst typeMod = this.battle.dex.getEffectiveness(type, targetType);\n\t\t\t\tif (typeMod > 0) {\n\t\t\t\t\t// Super effective against targetType\n\t\t\t\t\tdamage *= 20;\n\t\t\t\t\tdamage = Math.floor(damage / 10);\n\t\t\t\t}\n\t\t\t\tif (typeMod < 0) {\n\t\t\t\t\t// Not very effective against targetType\n\t\t\t\t\tdamage *= 5;\n\t\t\t\t\tdamage = Math.floor(damage / 10);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst totalTypeMod = target.runEffectiveness(move);\n\t\t\tif (totalTypeMod > 0) {\n\t\t\t\tif (!suppressMessages) this.battle.add('-supereffective', target);\n\t\t\t}\n\t\t\tif (totalTypeMod < 0) {\n\t\t\t\tif (!suppressMessages) this.battle.add('-resisted', target);\n\t\t\t}\n\n\t\t\t// If damage becomes 0, the move is made to miss.\n\t\t\t// This occurs when damage was either 2 or 3 prior to applying STAB/Type matchup, and target is 4x resistant to the move.\n\t\t\tif (damage === 0) return damage;\n\n\t\t\t// Apply random factor if damage is greater than 1\n\t\t\tif (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// We are done, this is the final damage.\n\t\t\treturn Math.floor(damage);\n\t\t},\n\t},\n};\n"]}
@@ -606,7 +606,7 @@ var Scripts = {
606
606
  if (pokemon.fainted) {
607
607
  return false;
608
608
  }
609
- if (sourceEffect) attrs += `|[from]${this.battle.dex.conditions.get(sourceEffect)}`;
609
+ if (sourceEffect) attrs += `|[from] ${this.battle.dex.conditions.get(sourceEffect).name}`;
610
610
  this.battle.addMove("move", pokemon, move.name, `${target}${attrs}`);
611
611
  if (!this.battle.singleEvent("Try", move, null, pokemon, target, move)) {
612
612
  return true;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/gen1stadium/conditions.ts","../../src/gen1stadium/rulesets.ts","../../src/gen1stadium/moves.ts","../../src/gen1stadium/scripts.ts"],"sourcesContent":["import type {ModdedConditionDataTable} from '@pkmn/sim';\n\nexport const Conditions: ModdedConditionDataTable = {\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},\n\t\tonAfterMoveSelfPriority: 2,\n\t\tonAfterMoveSelf(pokemon) {\n\t\t\tthis.damage(this.clampIntRange(Math.floor(pokemon.maxhp / 16), 1));\n\t\t},\n\t\tonAfterSwitchInSelf(pokemon) {\n\t\t\tthis.damage(this.clampIntRange(Math.floor(pokemon.maxhp / 16), 1));\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},\n\t\tonBeforeMovePriority: 2,\n\t\tonBeforeMove(pokemon) {\n\t\t\tif (this.randomChance(63, 256)) {\n\t\t\t\tthis.add('cant', pokemon, 'par');\n\t\t\t\tpokemon.removeVolatile('bide');\n\t\t\t\tpokemon.removeVolatile('lockedmove');\n\t\t\t\tpokemon.removeVolatile('twoturnmove');\n\t\t\t\tpokemon.removeVolatile('invulnerability');\n\t\t\t\tpokemon.removeVolatile('partialtrappinglock');\n\t\t\t\treturn false;\n\t\t\t}\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-3 turns\n\t\t\tthis.effectState.startTime = this.random(1, 4);\n\t\t\tthis.effectState.time = this.effectState.startTime;\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: 2,\n\t\tonBeforeMove(pokemon, target, move) {\n\t\t\tpokemon.statusState.time--;\n\t\t\tthis.add('cant', pokemon, 'slp');\n\t\t\tpokemon.lastMove = null;\n\t\t\treturn false;\n\t\t},\n\t\tonAfterMoveSelf(pokemon) {\n\t\t\tif (pokemon.statusState.time <= 0) pokemon.cureStatus();\n\t\t},\n\t},\n\tfrz: {\n\t\tname: 'frz',\n\t\teffectType: 'Status',\n\t\tonStart(target) {\n\t\t\tthis.add('-status', target, 'frz');\n\t\t},\n\t\tonBeforeMovePriority: 2,\n\t\tonBeforeMove(pokemon, target, move) {\n\t\t\tthis.add('cant', pokemon, 'frz');\n\t\t\tpokemon.lastMove = null;\n\t\t\treturn false;\n\t\t},\n\t\tonHit(target, source, move) {\n\t\t\tif (move.type === 'Fire' && move.category !== 'Status') {\n\t\t\t\ttarget.cureStatus();\n\t\t\t}\n\t\t},\n\t},\n\tpsn: {\n\t\tname: 'psn',\n\t\teffectType: 'Status',\n\t\tonStart(target) {\n\t\t\tthis.add('-status', target, 'psn');\n\t\t},\n\t\tonAfterMoveSelfPriority: 2,\n\t\tonAfterMoveSelf(pokemon) {\n\t\t\tthis.damage(this.clampIntRange(Math.floor(pokemon.maxhp / 16), 1));\n\t\t},\n\t\tonAfterSwitchInSelf(pokemon) {\n\t\t\tthis.damage(this.clampIntRange(Math.floor(pokemon.maxhp / 16), 1));\n\t\t},\n\t},\n\tconfusion: {\n\t\tinherit: true,\n\t\tonStart(target) {\n\t\t\tthis.add('-start', target, 'confusion');\n\t\t\tthis.effectState.time = this.random(2, 6);\n\t\t},\n\t},\n\tflinch: {\n\t\tinherit: true,\n\t\tonStart() {},\n\t},\n\tpartiallytrapped: {\n\t\tname: 'partiallytrapped',\n\t\tduration: 2,\n\t\tonBeforeMovePriority: 1,\n\t\tonStart(target, source, effect) {\n\t\t\tthis.add('-activate', target, `move: ${effect}`, `[of] ${source}`);\n\t\t},\n\t\tonBeforeMove(pokemon) {\n\t\t\tif (this.effectState.source && (!this.effectState.source.isActive || this.effectState.source.hp <= 0)) {\n\t\t\t\tpokemon.removeVolatile('partiallytrapped');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.add('cant', pokemon, 'partiallytrapped');\n\t\t\treturn false;\n\t\t},\n\t\tonEnd(pokemon) {\n\t\t\tthis.add('-end', pokemon, this.effectState.sourceEffect, '[partiallytrapped]');\n\t\t},\n\t},\n};\n","import type {ModdedFormatDataTable} from '@pkmn/sim';\n\nexport const Rulesets: ModdedFormatDataTable = {\n\tstandard: {\n\t\teffectType: 'ValidatorRule',\n\t\tname: 'Standard',\n\t\truleset: ['Obtainable', 'Stadium Sleep Clause', 'Freeze Clause Mod', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Moves Clause', 'Exact HP Mod', 'Cancel Mod'],\n\t},\n};\n","import type {ActiveMove, ModdedMoveDataTable} from '@pkmn/sim';\n\nexport const Moves: ModdedMoveDataTable = {\n\tbide: {\n\t\tinherit: true,\n\t\tpriority: 0,\n\t\taccuracy: true,\n\t\tcondition: {\n\t\t\tdurationCallback(target, source, effect) {\n\t\t\t\treturn this.random(3, 5);\n\t\t\t},\n\t\t\tonStart(pokemon) {\n\t\t\t\tthis.effectState.totalDamage = 0;\n\t\t\t\tthis.effectState.lastDamage = 0;\n\t\t\t\tthis.add('-start', pokemon, 'Bide');\n\t\t\t},\n\t\t\tonHit(target, source, move) {\n\t\t\t\tif (source && source !== target && move.category !== 'Physical' && move.category !== 'Special') {\n\t\t\t\t\tconst damage = this.effectState.totalDamage;\n\t\t\t\t\tthis.effectState.totalDamage += damage;\n\t\t\t\t\tthis.effectState.lastDamage = damage;\n\t\t\t\t\tthis.effectState.sourceSlot = source.getSlot();\n\t\t\t\t}\n\t\t\t},\n\t\t\tonDamage(damage, target, source, move) {\n\t\t\t\tif (!source || source.isAlly(target)) return;\n\t\t\t\tif (!move || move.effectType !== 'Move') return;\n\t\t\t\tif (!damage && this.effectState.lastDamage > 0) {\n\t\t\t\t\tdamage = this.effectState.totalDamage;\n\t\t\t\t}\n\t\t\t\tthis.effectState.totalDamage += damage;\n\t\t\t\tthis.effectState.lastDamage = damage;\n\t\t\t\tthis.effectState.sourceSlot = source.getSlot();\n\t\t\t},\n\t\t\tonAfterSetStatus(status, pokemon) {\n\t\t\t\t// Sleep, freeze, and partial trap will just pause duration.\n\t\t\t\tif (pokemon.volatiles['flinch']) {\n\t\t\t\t\tthis.effectState.duration!++;\n\t\t\t\t} else if (pokemon.volatiles['partiallytrapped']) {\n\t\t\t\t\tthis.effectState.duration!++;\n\t\t\t\t} else {\n\t\t\t\t\tswitch (status.id) {\n\t\t\t\t\tcase 'slp':\n\t\t\t\t\tcase 'frz':\n\t\t\t\t\t\tthis.effectState.duration!++;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tonBeforeMove(pokemon, t, move) {\n\t\t\t\tif (this.effectState.duration === 1) {\n\t\t\t\t\tthis.add('-end', pokemon, 'Bide');\n\t\t\t\t\tif (!this.effectState.totalDamage) {\n\t\t\t\t\t\tthis.debug(\"Bide failed because no damage was taken\");\n\t\t\t\t\t\tthis.add('-fail', pokemon);\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tconst target = this.getAtSlot(this.effectState.sourceSlot);\n\t\t\t\t\tif (target.isSemiInvulnerable()) {\n\t\t\t\t\t\tthis.add('-message', 'The foe ' + target.name + ' can\\'t be hit while flying!');\n\t\t\t\t\t\tpokemon.removeVolatile('bide');\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tthis.actions.moveHit(target, pokemon, move, { damage: this.effectState.totalDamage * 2 } as ActiveMove);\n\t\t\t\t\tpokemon.removeVolatile('bide');\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tthis.add('-activate', pokemon, 'Bide');\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\tonDisableMove(pokemon) {\n\t\t\t\tif (!pokemon.hasMove('bide')) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tfor (const moveSlot of pokemon.moveSlots) {\n\t\t\t\t\tif (moveSlot.id !== 'bide') {\n\t\t\t\t\t\tpokemon.disableMove(moveSlot.id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\ttype: \"???\", // Will look as Normal but it's STAB-less\n\t},\n\tbind: {\n\t\tinherit: true,\n\t\t// FIXME: onBeforeMove() {},\n\t},\n\tclamp: {\n\t\tinherit: true,\n\t\t// FIXME: onBeforeMove() {},\n\t},\n\tcounter: {\n\t\tinherit: true,\n\t\tignoreImmunity: true,\n\t\twillCrit: false,\n\t\tbasePower: 1,\n\t\tdamageCallback(pokemon, target) {\n\t\t\t// Counter mechanics in Stadium 1:\n\t\t\t// - a move is Counterable if it is Normal or Fighting type, has nonzero Base Power, and is not Counter\n\t\t\t// - Counter succeeds if the target used a Counterable move earlier this turn\n\n\t\t\tconst lastMoveThisTurn = target.side.lastMove && target.side.lastMove.id === target.side.lastSelectedMove &&\n\t\t\t\t!this.queue.willMove(target) && this.dex.moves.get(target.side.lastMove.id);\n\t\t\tif (!lastMoveThisTurn) {\n\t\t\t\tthis.debug(\"Stadium 1 Counter: last move was not this turn\");\n\t\t\t\tthis.add('-fail', pokemon);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst lastMoveThisTurnIsCounterable = lastMoveThisTurn && lastMoveThisTurn.basePower > 0 &&\n\t\t\t\t['Normal', 'Fighting'].includes(lastMoveThisTurn.type) && lastMoveThisTurn.id !== 'counter';\n\t\t\tif (!lastMoveThisTurnIsCounterable) {\n\t\t\t\tthis.debug(`Stadium 1 Counter: last move ${lastMoveThisTurn.name} was not Counterable`);\n\t\t\t\tthis.add('-fail', pokemon);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (this.lastDamage <= 0) {\n\t\t\t\tthis.debug(\"Stadium 1 Counter: no previous damage exists\");\n\t\t\t\tthis.add('-fail', pokemon);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn 2 * this.lastDamage;\n\t\t},\n\t},\n\tfirespin: {\n\t\tinherit: true,\n\t\t// FIXME: onBeforeMove() {},\n\t},\n\thaze: {\n\t\tinherit: true,\n\t\tonHit(target, source) {\n\t\t\tthis.add('-activate', target, 'move: Haze');\n\t\t\tthis.add('-clearallboost', '[silent]');\n\t\t\tfor (const pokemon of this.getAllActive()) {\n\t\t\t\tpokemon.clearBoosts();\n\t\t\t\tpokemon.cureStatus(true);\n\t\t\t\tfor (const id of Object.keys(pokemon.volatiles)) {\n\t\t\t\t\tpokemon.removeVolatile(id);\n\t\t\t\t\tthis.add('-end', pokemon, id, '[silent]');\n\t\t\t\t}\n\t\t\t\tpokemon.recalculateStats!();\n\t\t\t}\n\t\t},\n\t},\n\thyperbeam: {\n\t\tinherit: true,\n\t\tonMoveFail(target, source, move) {\n\t\t\tsource.addVolatile('mustrecharge');\n\t\t},\n\t},\n\tpsywave: {\n\t\tinherit: true,\n\t\tbasePower: 1,\n\t\tdamageCallback(pokemon) {\n\t\t\treturn this.random(1, this.trunc(1.5 * pokemon.level));\n\t\t},\n\t},\n\trage: {\n\t\tinherit: true,\n\t\tself: {\n\t\t\tvolatileStatus: 'rage',\n\t\t},\n\t\tcondition: {\n\t\t\t// Rage lock\n\t\t\tonStart(target, source, effect) {\n\t\t\t\tthis.effectState.move = 'rage';\n\t\t\t},\n\t\t\tonLockMove: 'rage',\n\t\t\tonHit(target, source, move) {\n\t\t\t\tif (target.boosts.atk < 6 && (move.category !== 'Status' || move.id === 'disable')) {\n\t\t\t\t\tthis.boost({ atk: 1 });\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t},\n\trecover: {\n\t\tinherit: true,\n\t\theal: null,\n\t\tonHit(target) {\n\t\t\tif (target.hp === target.maxhp) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthis.heal(Math.floor(target.maxhp / 2), target, target);\n\t\t},\n\t},\n\trest: {\n\t\tinherit: true,\n\t\tonHit(target, source, move) {\n\t\t\t// Fails if the difference between\n\t\t\t// max HP and current HP is 0, 255, or 511\n\t\t\tif (target.hp >= target.maxhp) return false;\n\t\t\tif (!target.setStatus('slp', source, move)) return false;\n\t\t\ttarget.statusState.time = 2;\n\t\t\ttarget.statusState.startTime = 2;\n\t\t\ttarget.recalculateStats!(); // Stadium Rest removes statdrops given by Major Status Conditions.\n\t\t\tthis.heal(target.maxhp); // Aesthetic only as the healing happens after you fall asleep in-game\n\t\t},\n\t},\n\tsoftboiled: {\n\t\tinherit: true,\n\t\theal: null,\n\t\tonHit(target) {\n\t\t\t// Fail when health is 255 or 511 less than max\n\t\t\tif (target.hp === target.maxhp) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthis.heal(Math.floor(target.maxhp / 2), target, target);\n\t\t},\n\t},\n\tsubstitute: {\n\t\tinherit: true,\n\t\tonTryHit(target) {\n\t\t\tif (target.volatiles['substitute']) {\n\t\t\t\tthis.add('-fail', target, 'move: Substitute');\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\t// Stadium fixes the 25% = you die gag\n\t\t\tif (target.hp <= target.maxhp / 4) {\n\t\t\t\tthis.add('-fail', target, 'move: Substitute', '[weak]');\n\t\t\t\treturn null;\n\t\t\t}\n\t\t},\n\t\tcondition: {\n\t\t\tonStart(target) {\n\t\t\t\tthis.add('-start', target, 'Substitute');\n\t\t\t\tthis.effectState.hp = Math.floor(target.maxhp / 4);\n\t\t\t\tdelete target.volatiles['partiallytrapped'];\n\t\t\t},\n\t\t\tonTryHitPriority: -1,\n\t\t\tonTryHit(target, source, move) {\n\t\t\t\tif (target === source) {\n\t\t\t\t\tthis.debug('sub bypass: self hit');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (move.drain) {\n\t\t\t\t\tthis.add('-miss', source);\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tif (move.category === 'Status') {\n\t\t\t\t\tconst SubBlocked = ['leechseed', 'lockon', 'mindreader', 'nightmare'];\n\t\t\t\t\tif (move.status || move.boosts || move.volatileStatus === 'confusion' || SubBlocked.includes(move.id)) {\n\t\t\t\t\t\tthis.add('-activate', target, 'Substitute', '[block] ' + move.name);\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (move.volatileStatus && target === source) return;\n\t\t\t\tlet damage = this.actions.getDamage(source, target, move);\n\t\t\t\tif (damage && damage > target.volatiles['substitute'].hp) {\n\t\t\t\t\tdamage = target.volatiles['substitute'].hp;\n\t\t\t\t}\n\t\t\t\tif (!damage && damage !== 0) return null;\n\t\t\t\ttarget.volatiles['substitute'].hp -= damage;\n\t\t\t\tthis.lastDamage = damage;\n\t\t\t\tif (target.volatiles['substitute'].hp <= 0) {\n\t\t\t\t\tthis.debug('Substitute broke');\n\t\t\t\t\ttarget.removeVolatile('substitute');\n\t\t\t\t\ttarget.subFainted = true;\n\t\t\t\t} else {\n\t\t\t\t\tthis.add('-activate', target, 'Substitute', '[damage]');\n\t\t\t\t}\n\t\t\t\t// Drain/recoil does not happen if the substitute breaks\n\t\t\t\tif (target.volatiles['substitute']) {\n\t\t\t\t\tif (move.recoil) {\n\t\t\t\t\t\tthis.damage(this.clampIntRange(Math.floor(damage * move.recoil[0] / move.recoil[1]), 1), source, target, 'recoil');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.runEvent('AfterSubDamage', target, source, move, damage);\n\t\t\t\t// Add here counter damage\n\t\t\t\tconst lastAttackedBy = target.getLastAttackedBy();\n\t\t\t\tif (!lastAttackedBy) {\n\t\t\t\t\ttarget.attackedBy.push({ source, move: move.id, damage, slot: source.getSlot(), thisTurn: true });\n\t\t\t\t} else {\n\t\t\t\t\tlastAttackedBy.move = move.id;\n\t\t\t\t\tlastAttackedBy.damage = damage;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t},\n\t\t\tonEnd(target) {\n\t\t\t\tthis.add('-end', target, 'Substitute');\n\t\t\t},\n\t\t},\n\t\tsecondary: null,\n\t\ttarget: \"self\",\n\t\ttype: \"Normal\",\n\t},\n\tstruggle: {\n\t\tinherit: true,\n\t\tignoreImmunity: { 'Normal': true },\n\t},\n\twrap: {\n\t\tinherit: true,\n\t\t// FIXME: onBeforeMove() {},\n\t},\n};\n","import type {ActiveMove, BoostID, ModdedBattleScriptsData, StatIDExceptHP} from '@pkmn/sim';\n\n/**\n * Stadium mechanics inherit from gen 1 mechanics, but fixes some stuff.\n */\n\nconst SKIP_LASTDAMAGE = new Set([\n\t'confuseray', 'conversion', 'counter', 'focusenergy', 'glare', 'haze', 'leechseed', 'lightscreen',\n\t'mimic', 'mist', 'poisongas', 'poisonpowder', 'recover', 'reflect', 'rest', 'softboiled',\n\t'splash', 'stunspore', 'substitute', 'supersonic', 'teleport', 'thunderwave', 'toxic', 'transform',\n]);\n\nexport const Scripts: ModdedBattleScriptsData = {\n\tinherit: 'gen1',\n\tgen: 1,\n\t// BattlePokemon scripts. Stadium shares gen 1 code but it fixes some problems with it.\n\tpokemon: {\n\t\tinherit: true,\n\t\t// This is run on Stadium after boosts and status changes.\n\t\trecalculateStats() {\n\t\t\tlet statName: StatIDExceptHP;\n\t\t\tfor (statName in this.storedStats) {\n\t\t\t\tlet stat = this.species.baseStats[statName];\n\t\t\t\tstat = Math.floor(\n\t\t\t\t\tMath.floor(\n\t\t\t\t\t\t2 * stat + this.set.ivs[statName] + Math.floor(this.set.evs[statName] / 4)\n\t\t\t\t\t) * this.level / 100 + 5\n\t\t\t\t);\n\t\t\t\tthis.baseStoredStats[statName] = this.storedStats[statName] = Math.floor(stat);\n\t\t\t\tthis.modifiedStats![statName] = Math.floor(stat);\n\t\t\t\t// Re-apply drops, if necessary.\n\t\t\t\tif (this.status === 'par' && statName === 'spe') this.modifyStat!('spe', 0.25);\n\t\t\t\tif (this.status === 'brn' && statName === 'atk') this.modifyStat!('atk', 0.5);\n\t\t\t\tif (this.boosts[statName] !== 0) {\n\t\t\t\t\tif (this.boosts[statName] >= 0) {\n\t\t\t\t\t\tthis.modifyStat!(statName, [1, 1.5, 2, 2.5, 3, 3.5, 4][this.boosts[statName]]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.modifyStat!(statName, [100, 66, 50, 40, 33, 28, 25][-this.boosts[statName]] / 100);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (this.modifiedStats![statName] > 999) {\n\t\t\t\t\tthis.modifiedStats![statName] = 999;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// Stadium's fixed boosting function.\n\t\tboostBy(boost) {\n\t\t\tlet changed = false;\n\t\t\tlet i: BoostID;\n\t\t\tfor (i in boost) {\n\t\t\t\tlet delta = boost[i];\n\t\t\t\tif (delta === undefined) continue;\n\t\t\t\tthis.boosts[i] += delta;\n\t\t\t\tif (this.boosts[i] > 6) {\n\t\t\t\t\tdelta -= this.boosts[i] - 6;\n\t\t\t\t\tthis.boosts[i] = 6;\n\t\t\t\t}\n\t\t\t\tif (this.boosts[i] < -6) {\n\t\t\t\t\tdelta -= this.boosts[i] - (-6);\n\t\t\t\t\tthis.boosts[i] = -6;\n\t\t\t\t}\n\t\t\t\tif (delta) changed = true;\n\t\t\t}\n\t\t\tthis.recalculateStats!();\n\t\t\treturn changed;\n\t\t},\n\t\t// Remove stat recalculation logic from gen 1\n\t\tclearBoosts() {\n\t\t\tlet i: BoostID;\n\t\t\tfor (i in this.boosts) {\n\t\t\t\tthis.boosts[i] = 0;\n\t\t\t}\n\t\t},\n\t},\n\tactions: {\n\t\tinherit: true,\n\t\trunMove(moveOrMoveName, pokemon, targetLoc, options) {\n\t\t\tlet sourceEffect = options?.sourceEffect;\n\t\t\tconst move = this.dex.getActiveMove(moveOrMoveName);\n\t\t\tconst target = this.battle.getTarget(pokemon, move, targetLoc);\n\t\t\tif (target?.subFainted) target.subFainted = null;\n\n\t\t\tthis.battle.setActiveMove(move, pokemon, target);\n\n\t\t\tif (pokemon.moveThisTurn || !this.battle.runEvent('BeforeMove', pokemon, target, move)) {\n\t\t\t\tthis.battle.debug(`${pokemon.fullname} move interrupted; movedThisTurn: ${pokemon.moveThisTurn}`);\n\t\t\t\tthis.battle.clearActiveMove(true);\n\t\t\t\t// This is only run for sleep\n\t\t\t\tthis.battle.runEvent('AfterMoveSelf', pokemon, target, move);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (move.beforeMoveCallback) {\n\t\t\t\tif (move.beforeMoveCallback.call(this.battle, pokemon, target, move)) {\n\t\t\t\t\tthis.battle.clearActiveMove(true);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tlet lockedMove = this.battle.runEvent('LockMove', pokemon);\n\t\t\tif (lockedMove === true) lockedMove = false;\n\t\t\tif (\n\t\t\t\t!lockedMove &&\n\t\t\t\t(!pokemon.volatiles['partialtrappinglock'] || pokemon.volatiles['partialtrappinglock'].locked !== target)\n\t\t\t) {\n\t\t\t\tpokemon.deductPP(move, null, target);\n\t\t\t} else {\n\t\t\t\tsourceEffect = move;\n\t\t\t}\n\t\t\tthis.battle.actions.useMove(move, pokemon, { target, sourceEffect });\n\t\t},\n\t\t// This function deals with AfterMoveSelf events.\n\t\t// This leads with partial trapping moves shenanigans after the move has been used.\n\t\tuseMove(moveOrMoveName, pokemon, options) {\n\t\t\tlet sourceEffect = options?.sourceEffect;\n\t\t\tlet target = options?.target;\n\t\t\tconst moveResult = this.useMoveInner(moveOrMoveName, pokemon, { target, sourceEffect });\n\n\t\t\tif (!sourceEffect && this.battle.effect.id) sourceEffect = this.battle.effect;\n\t\t\tconst baseMove = this.battle.dex.moves.get(moveOrMoveName);\n\t\t\tlet move = this.battle.dex.getActiveMove(baseMove);\n\t\t\tif (target === undefined) target = this.battle.getRandomTarget(pokemon, move);\n\t\t\tif (move.target === 'self') {\n\t\t\t\ttarget = pokemon;\n\t\t\t}\n\t\t\tif (sourceEffect) move.sourceEffect = sourceEffect.id;\n\n\t\t\tthis.battle.singleEvent('ModifyMove', move, null, pokemon, target, move, move);\n\t\t\tif (baseMove.target !== move.target) {\n\t\t\t\t// Target changed in ModifyMove, so we must adjust it here\n\t\t\t\ttarget = this.battle.getRandomTarget(pokemon, move);\n\t\t\t}\n\t\t\tmove = this.battle.runEvent('ModifyMove', pokemon, target, move, move);\n\t\t\tif (baseMove.target !== move.target) {\n\t\t\t\t// Check again, this shouldn't ever happen on Gen 1.\n\t\t\t\ttarget = this.battle.getRandomTarget(pokemon, move);\n\t\t\t}\n\n\t\t\tif (move.id !== 'metronome') {\n\t\t\t\tif (move.id !== 'mirrormove' ||\n\t\t\t\t\t(!pokemon.side.foe.active[0]?.lastMove || pokemon.side.foe.active[0].lastMove?.id === 'mirrormove')) {\n\t\t\t\t\t// The move is our 'final' move (a failed Mirror Move, or any move that isn't Metronome or Mirror Move).\n\t\t\t\t\tpokemon.side.lastMove = move;\n\t\t\t\t\tpokemon.lastMove = move;\n\t\t\t\t\tthis.battle.singleEvent('AfterMove', move, null, pokemon, target, move);\n\n\t\t\t\t\t// If target fainted\n\t\t\t\t\tif (target && target.hp <= 0) {\n\t\t\t\t\t\tdelete pokemon.volatiles['partialtrappinglock'];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.battle.runEvent('AfterMoveSelf', pokemon, target, move);\n\t\t\t\t\t}\n\t\t\t\t\tif (pokemon.volatiles['mustrecharge']) this.battle.add('-mustrecharge', pokemon);\n\n\t\t\t\t\t// For partial trapping moves, we are saving the target.\n\t\t\t\t\tif (move.volatileStatus === 'partiallytrapped' && target && target.hp > 0) {\n\t\t\t\t\t\t// It hit, so let's remove must recharge volatile. Yup, this happens on Stadium.\n\t\t\t\t\t\ttarget.removeVolatile('mustrecharge');\n\t\t\t\t\t\t// Let's check if the lock exists\n\t\t\t\t\t\tif (pokemon.volatiles['partialtrappinglock'] && target.volatiles['partiallytrapped']) {\n\t\t\t\t\t\t\t// Here the partialtrappinglock volatile has been already applied\n\t\t\t\t\t\t\tif (!pokemon.volatiles['partialtrappinglock'].locked) {\n\t\t\t\t\t\t\t\t// If it's the first hit, we save the target\n\t\t\t\t\t\t\t\tpokemon.volatiles['partialtrappinglock'].locked = target;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} // If we move to here, the move failed and there's no partial trapping lock\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn moveResult;\n\t\t},\n\t\t// This is the function that actually uses the move, running ModifyMove events.\n\t\t// It uses the move and then deals with the effects after the move.\n\t\tuseMoveInner(moveOrMoveName, pokemon, options) {\n\t\t\tlet sourceEffect = options?.sourceEffect;\n\t\t\tlet target = options?.target;\n\t\t\tif (!sourceEffect && this.battle.effect.id) sourceEffect = this.battle.effect;\n\t\t\tconst baseMove = this.battle.dex.moves.get(moveOrMoveName);\n\t\t\tlet move = this.battle.dex.getActiveMove(baseMove);\n\t\t\tif (target === undefined) target = this.battle.getRandomTarget(pokemon, move);\n\t\t\tif (move.target === 'self') {\n\t\t\t\ttarget = pokemon;\n\t\t\t}\n\t\t\tif (sourceEffect) move.sourceEffect = sourceEffect.id;\n\n\t\t\tthis.battle.setActiveMove(move, pokemon, target);\n\n\t\t\tthis.battle.singleEvent('ModifyMove', move, null, pokemon, target, move, move);\n\t\t\tif (baseMove.target !== move.target) {\n\t\t\t\t// Target changed in ModifyMove, so we must adjust it here\n\t\t\t\ttarget = this.battle.getRandomTarget(pokemon, move);\n\t\t\t}\n\t\t\tmove = this.battle.runEvent('ModifyMove', pokemon, target, move, move);\n\t\t\tif (baseMove.target !== move.target) {\n\t\t\t\t// Check again, this shouldn't ever happen on Gen 1.\n\t\t\t\ttarget = this.battle.getRandomTarget(pokemon, move);\n\t\t\t\tthis.battle.debug('not a gen 1 mechanic');\n\t\t\t}\n\t\t\tif (!move) return false;\n\n\t\t\tlet attrs = '';\n\t\t\tif (pokemon.fainted) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (sourceEffect) attrs += `|[from]${this.battle.dex.conditions.get(sourceEffect)}`;\n\t\t\tthis.battle.addMove('move', pokemon, move.name, `${target}${attrs}`);\n\n\t\t\tif (!this.battle.singleEvent('Try', move, null, pokemon, target, move)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (!this.battle.singleEvent('TryMove', move, null, pokemon, target, move) ||\n\t\t\t\t!this.battle.runEvent('TryMove', pokemon, target, move)) {\n\t\t\t\treturn true;\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\tlet damage: number | undefined | false | '' = false;\n\t\t\tif (!target || target.fainted) {\n\t\t\t\tthis.battle.attrLastMove('[notarget]');\n\t\t\t\tthis.battle.add('-notarget');\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t// Store 0 damage for last damage if the move is not in the array.\n\t\t\tif (!SKIP_LASTDAMAGE.has(move.id)) this.battle.lastDamage = 0;\n\n\t\t\tdamage = this.tryMoveHit(target, pokemon, move);\n\n\t\t\t// Go ahead with results of the used move.\n\t\t\tif (damage === false) {\n\t\t\t\tthis.battle.singleEvent('MoveFail', move, null, target, pokemon, move);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tthis.battle.singleEvent('AfterMoveSecondarySelf', move, null, pokemon, target, move);\n\t\t\tthis.battle.runEvent('AfterMoveSecondarySelf', pokemon, target, move);\n\t\t\treturn true;\n\t\t},\n\t\ttryMoveHit(target, pokemon, move) {\n\t\t\tlet damage: number | false | undefined = 0;\n\n\t\t\t// First, check if the target is semi-invulnerable\n\t\t\tlet hitResult = 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\tif (move.selfdestruct) {\n\t\t\t\t\tthis.battle.faint(pokemon, pokemon, move);\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Then, check if the Pokemon is immune to this move.\n\t\t\tif (!target.runImmunity(move, true)) {\n\t\t\t\tif (move.selfdestruct) {\n\t\t\t\t\tthis.battle.faint(pokemon, pokemon, move);\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\thitResult = this.battle.singleEvent('TryImmunity', move, null, 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\t// Now, let's calculate the accuracy.\n\t\t\tlet accuracy = move.accuracy;\n\n\t\t\t// Partial trapping moves: true accuracy while it lasts\n\t\t\tif (pokemon.volatiles['partialtrappinglock']) {\n\t\t\t\tif (move.volatileStatus === 'partiallytrapped' && target === pokemon.volatiles['partialtrappinglock'].locked) {\n\t\t\t\t\taccuracy = true;\n\t\t\t\t} else if (pokemon.volatiles['partialtrappinglock'].locked !== target) {\n\t\t\t\t\t// The target switched, therefor, you fail using wrap.\n\t\t\t\t\tdelete pokemon.volatiles['partialtrappinglock'];\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// OHKO moves only have a chance to hit if the user is at least as fast as the target\n\t\t\tif (move.ohko) {\n\t\t\t\tif (target.speed > pokemon.speed) {\n\t\t\t\t\tthis.battle.add('-immune', target, '[ohko]');\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Calculate true accuracy for gen 1, which uses 0-255.\n\t\t\t// Stadium uses the Gen 2 boost table for accuracy and evasiveness, except for 1/3 instead of 0.33\n\t\t\tconst boostTable = [1 / 3, 0.36, 0.43, 0.5, 0.66, 0.75, 1, 1.33, 1.66, 2, 2.33, 2.66, 3];\n\t\t\tif (accuracy !== true) {\n\t\t\t\taccuracy = Math.floor(accuracy * 255 / 100);\n\t\t\t\t// Check also for accuracy modifiers.\n\t\t\t\tif (!move.ignoreAccuracy) {\n\t\t\t\t\taccuracy = Math.floor(accuracy * boostTable[pokemon.boosts.accuracy + 6]);\n\t\t\t\t}\n\t\t\t\tif (!move.ignoreEvasion) {\n\t\t\t\t\taccuracy = Math.floor(accuracy * boostTable[-target.boosts.evasion + 6]);\n\t\t\t\t}\n\t\t\t\taccuracy = Math.min(accuracy, 255);\n\t\t\t}\n\t\t\taccuracy = this.battle.runEvent('Accuracy', target, pokemon, move, accuracy);\n\n\t\t\t// Stadium attempts to fix the 1/256 miss by rerolling if the first value\n\t\t\t// would trigger the 1/256 miss.\n\t\t\tlet randomValue = this.battle.random(256);\n\t\t\tif (randomValue === 256) randomValue = this.battle.random(256);\n\t\t\tif (accuracy !== true && randomValue > accuracy) {\n\t\t\t\tthis.battle.attrLastMove('[miss]');\n\t\t\t\tthis.battle.add('-miss', pokemon);\n\t\t\t\tif (accuracy === 255) {\n\t\t\t\t\tthis.battle.hint(\"In Pokemon Stadium, moves with 100% accuracy can still miss 1/65536 of the time.\");\n\t\t\t\t}\n\t\t\t\tdamage = false;\n\t\t\t\tthis.battle.lastDamage = 0;\n\t\t\t}\n\n\t\t\t// If damage is 0 and not false it means it didn't miss, let's calc.\n\t\t\tif (damage !== false) {\n\t\t\t\tif (move.multihit) {\n\t\t\t\t\tlet hits = move.multihit;\n\t\t\t\t\tif (Array.isArray(hits)) {\n\t\t\t\t\t\t// Yes, it's hardcoded... meh\n\t\t\t\t\t\tif (hits[0] === 2 && hits[1] === 5) {\n\t\t\t\t\t\t\thits = this.battle.sample([2, 2, 2, 3, 3, 3, 4, 5]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\thits = this.battle.random(hits[0], hits[1] + 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\thits = Math.floor(hits);\n\t\t\t\t\t// In gen 1, all the hits have the same damage for multihits move\n\t\t\t\t\tlet moveDamage: number | false | undefined = 0;\n\t\t\t\t\tlet i: number;\n\t\t\t\t\tfor (i = 0; i < hits && target.hp && pokemon.hp; i++) {\n\t\t\t\t\t\tmove.hit = i + 1;\n\t\t\t\t\t\tif (move.hit === hits) move.lastHit = true;\n\t\t\t\t\t\tmoveDamage = this.moveHit(target, pokemon, move);\n\t\t\t\t\t\tif (moveDamage === false) break;\n\t\t\t\t\t\tdamage = (moveDamage || 0);\n\t\t\t\t\t\t// Move damage is fixed to be the first move's damage\n\t\t\t\t\t\tif (i === 0) move.damage = damage;\n\t\t\t\t\t\tif (target.subFainted) {\n\t\t\t\t\t\t\ti++;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tmove.damage = null;\n\t\t\t\t\tif (i === 0) return 1;\n\t\t\t\t\tthis.battle.add('-hitcount', target, i);\n\t\t\t\t} else {\n\t\t\t\t\tdamage = this.moveHit(target, pokemon, move);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (move.category !== 'Status') target.gotAttacked(move, damage, pokemon);\n\n\t\t\tif (move.selfdestruct) {\n\t\t\t\tthis.battle.faint(pokemon, pokemon, move);\n\t\t\t}\n\n\t\t\t// The move missed.\n\t\t\tif (damage === false) {\n\t\t\t\t// Delete the partial trap lock if necessary.\n\t\t\t\tdelete pokemon.volatiles['partialtrappinglock'];\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (move.ohko) this.battle.add('-ohko');\n\n\t\t\tthis.battle.singleEvent('AfterMoveSecondary', move, null, target, pokemon, move);\n\t\t\tthis.battle.runEvent('AfterMoveSecondary', target, pokemon, move);\n\n\t\t\treturn damage;\n\t\t},\n\t\tmoveHit(target, pokemon, moveOrMoveName, moveData, isSecondary, isSelf) {\n\t\t\tlet damage: number | false | null | undefined = 0;\n\t\t\tconst move = this.dex.getActiveMove(moveOrMoveName);\n\n\t\t\tif (!isSecondary && !isSelf) this.battle.setActiveMove(move, pokemon, target);\n\t\t\tlet hitResult: number | boolean = true;\n\t\t\tif (!moveData) moveData = move;\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 (target) {\n\t\t\t\thitResult = this.battle.singleEvent('TryHit', moveData, {}, target, pokemon, move);\n\n\t\t\t\t// Partial trapping moves still apply their volatile to Pokémon behind a Sub\n\t\t\t\tconst targetHadSub = !!target.volatiles['substitute'];\n\t\t\t\tif (targetHadSub && moveData.volatileStatus && moveData.volatileStatus === 'partiallytrapped') {\n\t\t\t\t\ttarget.addVolatile(moveData.volatileStatus, pokemon, move);\n\t\t\t\t\tif (!pokemon.volatiles['partialtrappinglock'] || pokemon.volatiles['partialtrappinglock'].duration! > 1) {\n\t\t\t\t\t\ttarget.volatiles[moveData.volatileStatus].duration = 2;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!hitResult) {\n\t\t\t\t\tif (hitResult === false) this.battle.add('-fail', target);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t// Only run the hit events for the hit itself, not the secondary or self hits\n\t\t\t\tif (!isSelf && !isSecondary) {\n\t\t\t\t\thitResult = this.battle.runEvent('TryHit', target, pokemon, move);\n\t\t\t\t\tif (!hitResult) {\n\t\t\t\t\t\tif (hitResult === false) this.battle.add('-fail', target);\n\t\t\t\t\t\t// Special Substitute hit flag\n\t\t\t\t\t\tif (hitResult !== 0) {\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (!this.battle.runEvent('TryFieldHit', target, pokemon, move)) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} else if (isSecondary && !moveData.self) {\n\t\t\t\t\thitResult = this.battle.runEvent('TrySecondaryHit', target, pokemon, moveData);\n\t\t\t\t}\n\n\t\t\t\tif (hitResult === 0) {\n\t\t\t\t\ttarget = null;\n\t\t\t\t} else if (!hitResult) {\n\t\t\t\t\tif (hitResult === false) this.battle.add('-fail', target);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (target) {\n\t\t\t\tlet didSomething = false;\n\n\t\t\t\tdamage = this.getDamage(pokemon, target, moveData);\n\t\t\t\tif (damage && damage > target.hp) {\n\t\t\t\t\tdamage = target.hp;\n\t\t\t\t}\n\t\t\t\tif ((damage || damage === 0) && !target.fainted) {\n\t\t\t\t\tdamage = this.battle.damage(damage, target, pokemon, move);\n\t\t\t\t\tif (!(damage || damage === 0)) return false;\n\t\t\t\t\tdidSomething = true;\n\t\t\t\t} else if (damage === false && typeof hitResult === 'undefined') {\n\t\t\t\t\tthis.battle.add('-fail', target);\n\t\t\t\t}\n\t\t\t\tif (damage === false || damage === null) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (moveData.boosts && !target.fainted) {\n\t\t\t\t\tthis.battle.boost(moveData.boosts, target, pokemon, move);\n\t\t\t\t}\n\t\t\t\tif (moveData.heal && !target.fainted) {\n\t\t\t\t\tconst d = target.heal(Math.floor(target.maxhp * moveData.heal[0] / moveData.heal[1]));\n\t\t\t\t\tif (!d) {\n\t\t\t\t\t\tthis.battle.add('-fail', target);\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tthis.battle.add('-heal', target, target.getHealth);\n\t\t\t\t\tdidSomething = true;\n\t\t\t\t}\n\t\t\t\tif (moveData.status) {\n\t\t\t\t\tif (!target.status) {\n\t\t\t\t\t\ttarget.setStatus(moveData.status, pokemon, move);\n\t\t\t\t\t\ttarget.recalculateStats!();\n\t\t\t\t\t} else if (!isSecondary) {\n\t\t\t\t\t\tif (target.status === moveData.status) {\n\t\t\t\t\t\t\tthis.battle.add('-fail', target, target.status);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.battle.add('-fail', target);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdidSomething = true;\n\t\t\t\t}\n\t\t\t\tif (moveData.forceStatus) {\n\t\t\t\t\tif (target.setStatus(moveData.forceStatus, pokemon, move)) {\n\t\t\t\t\t\ttarget.recalculateStats!();\n\t\t\t\t\t\tdidSomething = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (moveData.volatileStatus) {\n\t\t\t\t\tif (target.addVolatile(moveData.volatileStatus, pokemon, move)) {\n\t\t\t\t\t\tdidSomething = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (moveData.sideCondition) {\n\t\t\t\t\tif (target.side.addSideCondition(moveData.sideCondition, pokemon, move)) {\n\t\t\t\t\t\tdidSomething = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (moveData.pseudoWeather) {\n\t\t\t\t\tif (this.battle.field.addPseudoWeather(moveData.pseudoWeather, pokemon, move)) {\n\t\t\t\t\t\tdidSomething = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Hit events\n\t\t\t\thitResult = this.battle.singleEvent('Hit', moveData, {}, target, pokemon, move);\n\t\t\t\tif (!isSelf && !isSecondary) {\n\t\t\t\t\tthis.battle.runEvent('Hit', target, pokemon, move);\n\t\t\t\t}\n\t\t\t\tif (!hitResult && !didSomething) {\n\t\t\t\t\tif (hitResult === false) this.battle.add('-fail', target);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Here's where self effects are applied.\n\t\t\tif (moveData.self) {\n\t\t\t\tthis.moveHit(pokemon, pokemon, move, moveData.self, isSecondary, true);\n\t\t\t}\n\n\t\t\t// Now we can save the partial trapping damage.\n\t\t\tif (pokemon.volatiles['partialtrappinglock']) {\n\t\t\t\tpokemon.volatiles['partialtrappinglock'].damage = this.battle.lastDamage;\n\t\t\t}\n\n\t\t\t// Apply move secondaries.\n\t\t\tif (moveData.secondaries && target && target.hp > 0) {\n\t\t\t\tfor (const secondary of moveData.secondaries) {\n\t\t\t\t\t// Multi-hit moves only roll for status once\n\t\t\t\t\tif (!move.multihit || move.lastHit) {\n\t\t\t\t\t\t// We check here whether to negate the probable secondary status if it's para, burn, or freeze.\n\t\t\t\t\t\t// In the game, this is checked and if true, the random number generator is not called.\n\t\t\t\t\t\t// That means that a move that does not share the type of the target can status it.\n\t\t\t\t\t\t// If a move that was not fire-type would exist on Gen 1, it could burn a Pokémon.\n\t\t\t\t\t\tif (!(secondary.status && ['par', 'brn', 'frz'].includes(secondary.status) && target.hasType(move.type))) {\n\t\t\t\t\t\t\tconst effectChance = Math.floor((secondary.chance || 100) * 255 / 100);\n\t\t\t\t\t\t\tif (typeof secondary.chance === 'undefined' || this.battle.randomChance(effectChance + 1, 256)) {\n\t\t\t\t\t\t\t\tthis.moveHit(target, pokemon, move, secondary, true, isSelf);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (move.selfSwitch && pokemon.hp) {\n\t\t\t\tpokemon.switchFlag = move.selfSwitch === true ? true : this.dex.toID(move.selfSwitch);\n\t\t\t}\n\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 ActiveMove;\n\t\t\t}\n\n\t\t\t// Let's see if the target is immune to the move.\n\t\t\tif (!target.runImmunity(move, true)) {\n\t\t\t\treturn false;\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 65535;\n\t\t\t}\n\n\t\t\t// We edit the damage through move's damage callback if necessary.\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 (seismic toss).\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 return that.\n\t\t\tif (move.damage) {\n\t\t\t\treturn move.damage;\n\t\t\t}\n\n\t\t\t// If it's the first hit on a Normal-type partially trap move, it hits Ghosts anyways but damage is 0.\n\t\t\tif (move.volatileStatus === 'partiallytrapped' && move.type === 'Normal' && target.hasType('Ghost')) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\t// Let's check if we are in middle of a partial trap sequence to return the previous damage.\n\t\t\tif (source.volatiles['partialtrappinglock'] && (target === source.volatiles['partialtrappinglock'].locked)) {\n\t\t\t\treturn source.volatiles['partialtrappinglock'].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\tif (!move.category) move.category = 'Physical';\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 = 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\t\t\tif (!basePower) {\n\t\t\t\treturn basePower === 0 ? undefined : 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 possibility. We check if it's a 100% crit move, otherwise we calculate the chance.\n\t\t\tlet isCrit = move.willCrit || false;\n\t\t\tif (!isCrit) {\n\t\t\t\t// In Stadium, the critical chance is based on speed.\n\t\t\t\t// First, we get the base speed and store it. Then we add 76. This is our current crit chance.\n\t\t\t\tlet critChance = source.species.baseStats['spe'] + 76;\n\n\t\t\t\t// Now we right logical shift it two places, essentially dividing by 4 and flooring it.\n\t\t\t\tcritChance >>= 2;\n\n\t\t\t\t// Now we check for focus energy volatile.\n\t\t\t\tif (source.volatiles['focusenergy']) {\n\t\t\t\t\t// If it exists, crit chance is multiplied by 4 and floored with a logical left shift.\n\t\t\t\t\tcritChance <<= 2;\n\t\t\t\t\t// Then we add 160.\n\t\t\t\t\tcritChance += 160;\n\t\t\t\t} else {\n\t\t\t\t\t// If it is not active, we left shift it by 1.\n\t\t\t\t\tcritChance <<= 1;\n\t\t\t\t}\n\n\t\t\t\t// Now we check for the move's critical hit ratio.\n\t\t\t\tif (move.critRatio === 2) {\n\t\t\t\t\t// High crit ratio, we multiply the result so far by 4.\n\t\t\t\t\tcritChance <<= 2;\n\t\t\t\t} else if (move.critRatio === 1) {\n\t\t\t\t\t// Normal hit ratio, we divide the crit chance by 2 and floor the result again.\n\t\t\t\t\tcritChance >>= 1;\n\t\t\t\t}\n\n\t\t\t\t// Now we make sure it's a number between 1 and 255.\n\t\t\t\tcritChance = this.battle.clampIntRange(critChance, 1, 255);\n\n\t\t\t\t// Last, we check deppending on ratio if the move critical hits or not.\n\t\t\t\t// We compare our critical hit chance against a random number between 0 and 255.\n\t\t\t\t// If the random number is lower, we get a critical hit. This means there is always a 1/255 chance of not hitting critically.\n\t\t\t\tif (critChance > 0) {\n\t\t\t\t\tisCrit = this.battle.randomChance(critChance, 256);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// There is a critical hit.\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\tbasePower = this.battle.runEvent('BasePower', source, target, move, basePower);\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 attacker's and defender's stats.\n\t\t\tlet level = source.level;\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 attack = attacker.getStat(atkType);\n\t\t\tlet defense = defender.getStat(defType);\n\n\t\t\t// In gen 1, screen effect is applied here.\n\t\t\tif ((defType === 'def' && defender.volatiles['reflect']) || (defType === 'spd' && defender.volatiles['lightscreen'])) {\n\t\t\t\tthis.battle.debug('Screen doubling (Sp)Def');\n\t\t\t\tdefense *= 2;\n\t\t\t\tdefense = this.battle.clampIntRange(defense, 1, 1998);\n\t\t\t}\n\n\t\t\t// In the event of a critical hit, the offense and defense changes are ignored.\n\t\t\t// This includes both boosts and screens.\n\t\t\t// Also, level is doubled in damage calculation.\n\t\t\tif (isCrit) {\n\t\t\t\tmove.ignoreOffensive = true;\n\t\t\t\tmove.ignoreDefensive = true;\n\t\t\t\tlevel *= 2;\n\t\t\t\tif (!suppressMessages) this.battle.add('-crit', target);\n\t\t\t}\n\n\t\t\tif (move.ignoreOffensive) {\n\t\t\t\tthis.battle.debug('Negating (sp)atk boost/penalty.');\n\t\t\t\tattack = attacker.getStat(atkType, 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);\n\t\t\t}\n\n\t\t\t// When either attack or defense are higher than 256, they are both divided by 4 and moded by 256.\n\t\t\t// This is what causes the rollover bugs.\n\t\t\tif (attack >= 256 || defense >= 256) {\n\t\t\t\tattack = this.battle.clampIntRange(Math.floor(attack / 4) % 256, 1);\n\t\t\t\t// Defense isn't checked on the cartridge, but we don't want those / 0 bugs on the sim.\n\t\t\t\tdefense = this.battle.clampIntRange(Math.floor(defense / 4) % 256, 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 = this.battle.clampIntRange(Math.floor(damage / 50), 0, 997);\n\t\t\tdamage += 2;\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\t// In Gen 1, type effectiveness is applied against each of the target's types.\n\t\t\tfor (const targetType of target.types) {\n\t\t\t\tconst typeMod = this.battle.dex.getEffectiveness(type, targetType);\n\t\t\t\tif (typeMod > 0) {\n\t\t\t\t\t// Super effective against targetType\n\t\t\t\t\tdamage *= 20;\n\t\t\t\t\tdamage = Math.floor(damage / 10);\n\t\t\t\t}\n\t\t\t\tif (typeMod < 0) {\n\t\t\t\t\t// Not very effective against targetType\n\t\t\t\t\tdamage *= 5;\n\t\t\t\t\tdamage = Math.floor(damage / 10);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst totalTypeMod = target.runEffectiveness(move);\n\t\t\tif (totalTypeMod > 0) {\n\t\t\t\tif (!suppressMessages) this.battle.add('-supereffective', target);\n\t\t\t}\n\t\t\tif (totalTypeMod < 0) {\n\t\t\t\tif (!suppressMessages) this.battle.add('-resisted', target);\n\t\t\t}\n\n\t\t\t// If damage becomes 0, the move is made to miss.\n\t\t\t// This occurs when damage was either 2 or 3 prior to applying STAB/Type matchup, and target is 4x resistant to the move.\n\t\t\tif (damage === 0) return damage;\n\n\t\t\t// Apply random factor if damage is greater than 1\n\t\t\tif (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// We are done, this is the final damage.\n\t\t\treturn Math.floor(damage);\n\t\t},\n\t},\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/gen1stadium/conditions.ts","../../src/gen1stadium/rulesets.ts","../../src/gen1stadium/moves.ts","../../src/gen1stadium/scripts.ts"],"sourcesContent":["import type {ModdedConditionDataTable} from '@pkmn/sim';\n\nexport const Conditions: ModdedConditionDataTable = {\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},\n\t\tonAfterMoveSelfPriority: 2,\n\t\tonAfterMoveSelf(pokemon) {\n\t\t\tthis.damage(this.clampIntRange(Math.floor(pokemon.maxhp / 16), 1));\n\t\t},\n\t\tonAfterSwitchInSelf(pokemon) {\n\t\t\tthis.damage(this.clampIntRange(Math.floor(pokemon.maxhp / 16), 1));\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},\n\t\tonBeforeMovePriority: 2,\n\t\tonBeforeMove(pokemon) {\n\t\t\tif (this.randomChance(63, 256)) {\n\t\t\t\tthis.add('cant', pokemon, 'par');\n\t\t\t\tpokemon.removeVolatile('bide');\n\t\t\t\tpokemon.removeVolatile('lockedmove');\n\t\t\t\tpokemon.removeVolatile('twoturnmove');\n\t\t\t\tpokemon.removeVolatile('invulnerability');\n\t\t\t\tpokemon.removeVolatile('partialtrappinglock');\n\t\t\t\treturn false;\n\t\t\t}\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-3 turns\n\t\t\tthis.effectState.startTime = this.random(1, 4);\n\t\t\tthis.effectState.time = this.effectState.startTime;\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: 2,\n\t\tonBeforeMove(pokemon, target, move) {\n\t\t\tpokemon.statusState.time--;\n\t\t\tthis.add('cant', pokemon, 'slp');\n\t\t\tpokemon.lastMove = null;\n\t\t\treturn false;\n\t\t},\n\t\tonAfterMoveSelf(pokemon) {\n\t\t\tif (pokemon.statusState.time <= 0) pokemon.cureStatus();\n\t\t},\n\t},\n\tfrz: {\n\t\tname: 'frz',\n\t\teffectType: 'Status',\n\t\tonStart(target) {\n\t\t\tthis.add('-status', target, 'frz');\n\t\t},\n\t\tonBeforeMovePriority: 2,\n\t\tonBeforeMove(pokemon, target, move) {\n\t\t\tthis.add('cant', pokemon, 'frz');\n\t\t\tpokemon.lastMove = null;\n\t\t\treturn false;\n\t\t},\n\t\tonHit(target, source, move) {\n\t\t\tif (move.type === 'Fire' && move.category !== 'Status') {\n\t\t\t\ttarget.cureStatus();\n\t\t\t}\n\t\t},\n\t},\n\tpsn: {\n\t\tname: 'psn',\n\t\teffectType: 'Status',\n\t\tonStart(target) {\n\t\t\tthis.add('-status', target, 'psn');\n\t\t},\n\t\tonAfterMoveSelfPriority: 2,\n\t\tonAfterMoveSelf(pokemon) {\n\t\t\tthis.damage(this.clampIntRange(Math.floor(pokemon.maxhp / 16), 1));\n\t\t},\n\t\tonAfterSwitchInSelf(pokemon) {\n\t\t\tthis.damage(this.clampIntRange(Math.floor(pokemon.maxhp / 16), 1));\n\t\t},\n\t},\n\tconfusion: {\n\t\tinherit: true,\n\t\tonStart(target) {\n\t\t\tthis.add('-start', target, 'confusion');\n\t\t\tthis.effectState.time = this.random(2, 6);\n\t\t},\n\t},\n\tflinch: {\n\t\tinherit: true,\n\t\tonStart() {},\n\t},\n\tpartiallytrapped: {\n\t\tname: 'partiallytrapped',\n\t\tduration: 2,\n\t\tonBeforeMovePriority: 1,\n\t\tonStart(target, source, effect) {\n\t\t\tthis.add('-activate', target, `move: ${effect}`, `[of] ${source}`);\n\t\t},\n\t\tonBeforeMove(pokemon) {\n\t\t\tif (this.effectState.source && (!this.effectState.source.isActive || this.effectState.source.hp <= 0)) {\n\t\t\t\tpokemon.removeVolatile('partiallytrapped');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.add('cant', pokemon, 'partiallytrapped');\n\t\t\treturn false;\n\t\t},\n\t\tonEnd(pokemon) {\n\t\t\tthis.add('-end', pokemon, this.effectState.sourceEffect, '[partiallytrapped]');\n\t\t},\n\t},\n};\n","import type {ModdedFormatDataTable} from '@pkmn/sim';\n\nexport const Rulesets: ModdedFormatDataTable = {\n\tstandard: {\n\t\teffectType: 'ValidatorRule',\n\t\tname: 'Standard',\n\t\truleset: ['Obtainable', 'Stadium Sleep Clause', 'Freeze Clause Mod', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Moves Clause', 'Exact HP Mod', 'Cancel Mod'],\n\t},\n};\n","import type {ActiveMove, ModdedMoveDataTable} from '@pkmn/sim';\n\nexport const Moves: ModdedMoveDataTable = {\n\tbide: {\n\t\tinherit: true,\n\t\tpriority: 0,\n\t\taccuracy: true,\n\t\tcondition: {\n\t\t\tdurationCallback(target, source, effect) {\n\t\t\t\treturn this.random(3, 5);\n\t\t\t},\n\t\t\tonStart(pokemon) {\n\t\t\t\tthis.effectState.totalDamage = 0;\n\t\t\t\tthis.effectState.lastDamage = 0;\n\t\t\t\tthis.add('-start', pokemon, 'Bide');\n\t\t\t},\n\t\t\tonHit(target, source, move) {\n\t\t\t\tif (source && source !== target && move.category !== 'Physical' && move.category !== 'Special') {\n\t\t\t\t\tconst damage = this.effectState.totalDamage;\n\t\t\t\t\tthis.effectState.totalDamage += damage;\n\t\t\t\t\tthis.effectState.lastDamage = damage;\n\t\t\t\t\tthis.effectState.sourceSlot = source.getSlot();\n\t\t\t\t}\n\t\t\t},\n\t\t\tonDamage(damage, target, source, move) {\n\t\t\t\tif (!source || source.isAlly(target)) return;\n\t\t\t\tif (!move || move.effectType !== 'Move') return;\n\t\t\t\tif (!damage && this.effectState.lastDamage > 0) {\n\t\t\t\t\tdamage = this.effectState.totalDamage;\n\t\t\t\t}\n\t\t\t\tthis.effectState.totalDamage += damage;\n\t\t\t\tthis.effectState.lastDamage = damage;\n\t\t\t\tthis.effectState.sourceSlot = source.getSlot();\n\t\t\t},\n\t\t\tonAfterSetStatus(status, pokemon) {\n\t\t\t\t// Sleep, freeze, and partial trap will just pause duration.\n\t\t\t\tif (pokemon.volatiles['flinch']) {\n\t\t\t\t\tthis.effectState.duration!++;\n\t\t\t\t} else if (pokemon.volatiles['partiallytrapped']) {\n\t\t\t\t\tthis.effectState.duration!++;\n\t\t\t\t} else {\n\t\t\t\t\tswitch (status.id) {\n\t\t\t\t\tcase 'slp':\n\t\t\t\t\tcase 'frz':\n\t\t\t\t\t\tthis.effectState.duration!++;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tonBeforeMove(pokemon, t, move) {\n\t\t\t\tif (this.effectState.duration === 1) {\n\t\t\t\t\tthis.add('-end', pokemon, 'Bide');\n\t\t\t\t\tif (!this.effectState.totalDamage) {\n\t\t\t\t\t\tthis.debug(\"Bide failed because no damage was taken\");\n\t\t\t\t\t\tthis.add('-fail', pokemon);\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tconst target = this.getAtSlot(this.effectState.sourceSlot);\n\t\t\t\t\tif (target.isSemiInvulnerable()) {\n\t\t\t\t\t\tthis.add('-message', 'The foe ' + target.name + ' can\\'t be hit while flying!');\n\t\t\t\t\t\tpokemon.removeVolatile('bide');\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tthis.actions.moveHit(target, pokemon, move, { damage: this.effectState.totalDamage * 2 } as ActiveMove);\n\t\t\t\t\tpokemon.removeVolatile('bide');\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tthis.add('-activate', pokemon, 'Bide');\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\tonDisableMove(pokemon) {\n\t\t\t\tif (!pokemon.hasMove('bide')) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tfor (const moveSlot of pokemon.moveSlots) {\n\t\t\t\t\tif (moveSlot.id !== 'bide') {\n\t\t\t\t\t\tpokemon.disableMove(moveSlot.id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\ttype: \"???\", // Will look as Normal but it's STAB-less\n\t},\n\tbind: {\n\t\tinherit: true,\n\t\t// FIXME: onBeforeMove() {},\n\t},\n\tclamp: {\n\t\tinherit: true,\n\t\t// FIXME: onBeforeMove() {},\n\t},\n\tcounter: {\n\t\tinherit: true,\n\t\tignoreImmunity: true,\n\t\twillCrit: false,\n\t\tbasePower: 1,\n\t\tdamageCallback(pokemon, target) {\n\t\t\t// Counter mechanics in Stadium 1:\n\t\t\t// - a move is Counterable if it is Normal or Fighting type, has nonzero Base Power, and is not Counter\n\t\t\t// - Counter succeeds if the target used a Counterable move earlier this turn\n\n\t\t\tconst lastMoveThisTurn = target.side.lastMove && target.side.lastMove.id === target.side.lastSelectedMove &&\n\t\t\t\t!this.queue.willMove(target) && this.dex.moves.get(target.side.lastMove.id);\n\t\t\tif (!lastMoveThisTurn) {\n\t\t\t\tthis.debug(\"Stadium 1 Counter: last move was not this turn\");\n\t\t\t\tthis.add('-fail', pokemon);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst lastMoveThisTurnIsCounterable = lastMoveThisTurn && lastMoveThisTurn.basePower > 0 &&\n\t\t\t\t['Normal', 'Fighting'].includes(lastMoveThisTurn.type) && lastMoveThisTurn.id !== 'counter';\n\t\t\tif (!lastMoveThisTurnIsCounterable) {\n\t\t\t\tthis.debug(`Stadium 1 Counter: last move ${lastMoveThisTurn.name} was not Counterable`);\n\t\t\t\tthis.add('-fail', pokemon);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (this.lastDamage <= 0) {\n\t\t\t\tthis.debug(\"Stadium 1 Counter: no previous damage exists\");\n\t\t\t\tthis.add('-fail', pokemon);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn 2 * this.lastDamage;\n\t\t},\n\t},\n\tfirespin: {\n\t\tinherit: true,\n\t\t// FIXME: onBeforeMove() {},\n\t},\n\thaze: {\n\t\tinherit: true,\n\t\tonHit(target, source) {\n\t\t\tthis.add('-activate', target, 'move: Haze');\n\t\t\tthis.add('-clearallboost', '[silent]');\n\t\t\tfor (const pokemon of this.getAllActive()) {\n\t\t\t\tpokemon.clearBoosts();\n\t\t\t\tpokemon.cureStatus(true);\n\t\t\t\tfor (const id of Object.keys(pokemon.volatiles)) {\n\t\t\t\t\tpokemon.removeVolatile(id);\n\t\t\t\t\tthis.add('-end', pokemon, id, '[silent]');\n\t\t\t\t}\n\t\t\t\tpokemon.recalculateStats!();\n\t\t\t}\n\t\t},\n\t},\n\thyperbeam: {\n\t\tinherit: true,\n\t\tonMoveFail(target, source, move) {\n\t\t\tsource.addVolatile('mustrecharge');\n\t\t},\n\t},\n\tpsywave: {\n\t\tinherit: true,\n\t\tbasePower: 1,\n\t\tdamageCallback(pokemon) {\n\t\t\treturn this.random(1, this.trunc(1.5 * pokemon.level));\n\t\t},\n\t},\n\trage: {\n\t\tinherit: true,\n\t\tself: {\n\t\t\tvolatileStatus: 'rage',\n\t\t},\n\t\tcondition: {\n\t\t\t// Rage lock\n\t\t\tonStart(target, source, effect) {\n\t\t\t\tthis.effectState.move = 'rage';\n\t\t\t},\n\t\t\tonLockMove: 'rage',\n\t\t\tonHit(target, source, move) {\n\t\t\t\tif (target.boosts.atk < 6 && (move.category !== 'Status' || move.id === 'disable')) {\n\t\t\t\t\tthis.boost({ atk: 1 });\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t},\n\trecover: {\n\t\tinherit: true,\n\t\theal: null,\n\t\tonHit(target) {\n\t\t\tif (target.hp === target.maxhp) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthis.heal(Math.floor(target.maxhp / 2), target, target);\n\t\t},\n\t},\n\trest: {\n\t\tinherit: true,\n\t\tonHit(target, source, move) {\n\t\t\t// Fails if the difference between\n\t\t\t// max HP and current HP is 0, 255, or 511\n\t\t\tif (target.hp >= target.maxhp) return false;\n\t\t\tif (!target.setStatus('slp', source, move)) return false;\n\t\t\ttarget.statusState.time = 2;\n\t\t\ttarget.statusState.startTime = 2;\n\t\t\ttarget.recalculateStats!(); // Stadium Rest removes statdrops given by Major Status Conditions.\n\t\t\tthis.heal(target.maxhp); // Aesthetic only as the healing happens after you fall asleep in-game\n\t\t},\n\t},\n\tsoftboiled: {\n\t\tinherit: true,\n\t\theal: null,\n\t\tonHit(target) {\n\t\t\t// Fail when health is 255 or 511 less than max\n\t\t\tif (target.hp === target.maxhp) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthis.heal(Math.floor(target.maxhp / 2), target, target);\n\t\t},\n\t},\n\tsubstitute: {\n\t\tinherit: true,\n\t\tonTryHit(target) {\n\t\t\tif (target.volatiles['substitute']) {\n\t\t\t\tthis.add('-fail', target, 'move: Substitute');\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\t// Stadium fixes the 25% = you die gag\n\t\t\tif (target.hp <= target.maxhp / 4) {\n\t\t\t\tthis.add('-fail', target, 'move: Substitute', '[weak]');\n\t\t\t\treturn null;\n\t\t\t}\n\t\t},\n\t\tcondition: {\n\t\t\tonStart(target) {\n\t\t\t\tthis.add('-start', target, 'Substitute');\n\t\t\t\tthis.effectState.hp = Math.floor(target.maxhp / 4);\n\t\t\t\tdelete target.volatiles['partiallytrapped'];\n\t\t\t},\n\t\t\tonTryHitPriority: -1,\n\t\t\tonTryHit(target, source, move) {\n\t\t\t\tif (target === source) {\n\t\t\t\t\tthis.debug('sub bypass: self hit');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (move.drain) {\n\t\t\t\t\tthis.add('-miss', source);\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tif (move.category === 'Status') {\n\t\t\t\t\tconst SubBlocked = ['leechseed', 'lockon', 'mindreader', 'nightmare'];\n\t\t\t\t\tif (move.status || move.boosts || move.volatileStatus === 'confusion' || SubBlocked.includes(move.id)) {\n\t\t\t\t\t\tthis.add('-activate', target, 'Substitute', '[block] ' + move.name);\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (move.volatileStatus && target === source) return;\n\t\t\t\tlet damage = this.actions.getDamage(source, target, move);\n\t\t\t\tif (damage && damage > target.volatiles['substitute'].hp) {\n\t\t\t\t\tdamage = target.volatiles['substitute'].hp;\n\t\t\t\t}\n\t\t\t\tif (!damage && damage !== 0) return null;\n\t\t\t\ttarget.volatiles['substitute'].hp -= damage;\n\t\t\t\tthis.lastDamage = damage;\n\t\t\t\tif (target.volatiles['substitute'].hp <= 0) {\n\t\t\t\t\tthis.debug('Substitute broke');\n\t\t\t\t\ttarget.removeVolatile('substitute');\n\t\t\t\t\ttarget.subFainted = true;\n\t\t\t\t} else {\n\t\t\t\t\tthis.add('-activate', target, 'Substitute', '[damage]');\n\t\t\t\t}\n\t\t\t\t// Drain/recoil does not happen if the substitute breaks\n\t\t\t\tif (target.volatiles['substitute']) {\n\t\t\t\t\tif (move.recoil) {\n\t\t\t\t\t\tthis.damage(this.clampIntRange(Math.floor(damage * move.recoil[0] / move.recoil[1]), 1), source, target, 'recoil');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.runEvent('AfterSubDamage', target, source, move, damage);\n\t\t\t\t// Add here counter damage\n\t\t\t\tconst lastAttackedBy = target.getLastAttackedBy();\n\t\t\t\tif (!lastAttackedBy) {\n\t\t\t\t\ttarget.attackedBy.push({ source, move: move.id, damage, slot: source.getSlot(), thisTurn: true });\n\t\t\t\t} else {\n\t\t\t\t\tlastAttackedBy.move = move.id;\n\t\t\t\t\tlastAttackedBy.damage = damage;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t},\n\t\t\tonEnd(target) {\n\t\t\t\tthis.add('-end', target, 'Substitute');\n\t\t\t},\n\t\t},\n\t\tsecondary: null,\n\t\ttarget: \"self\",\n\t\ttype: \"Normal\",\n\t},\n\tstruggle: {\n\t\tinherit: true,\n\t\tignoreImmunity: { 'Normal': true },\n\t},\n\twrap: {\n\t\tinherit: true,\n\t\t// FIXME: onBeforeMove() {},\n\t},\n};\n","import type {ActiveMove, BoostID, ModdedBattleScriptsData, StatIDExceptHP} from '@pkmn/sim';\n\n/**\n * Stadium mechanics inherit from gen 1 mechanics, but fixes some stuff.\n */\n\nconst SKIP_LASTDAMAGE = new Set([\n\t'confuseray', 'conversion', 'counter', 'focusenergy', 'glare', 'haze', 'leechseed', 'lightscreen',\n\t'mimic', 'mist', 'poisongas', 'poisonpowder', 'recover', 'reflect', 'rest', 'softboiled',\n\t'splash', 'stunspore', 'substitute', 'supersonic', 'teleport', 'thunderwave', 'toxic', 'transform',\n]);\n\nexport const Scripts: ModdedBattleScriptsData = {\n\tinherit: 'gen1',\n\tgen: 1,\n\t// BattlePokemon scripts. Stadium shares gen 1 code but it fixes some problems with it.\n\tpokemon: {\n\t\tinherit: true,\n\t\t// This is run on Stadium after boosts and status changes.\n\t\trecalculateStats() {\n\t\t\tlet statName: StatIDExceptHP;\n\t\t\tfor (statName in this.storedStats) {\n\t\t\t\tlet stat = this.species.baseStats[statName];\n\t\t\t\tstat = Math.floor(\n\t\t\t\t\tMath.floor(\n\t\t\t\t\t\t2 * stat + this.set.ivs[statName] + Math.floor(this.set.evs[statName] / 4)\n\t\t\t\t\t) * this.level / 100 + 5\n\t\t\t\t);\n\t\t\t\tthis.baseStoredStats[statName] = this.storedStats[statName] = Math.floor(stat);\n\t\t\t\tthis.modifiedStats![statName] = Math.floor(stat);\n\t\t\t\t// Re-apply drops, if necessary.\n\t\t\t\tif (this.status === 'par' && statName === 'spe') this.modifyStat!('spe', 0.25);\n\t\t\t\tif (this.status === 'brn' && statName === 'atk') this.modifyStat!('atk', 0.5);\n\t\t\t\tif (this.boosts[statName] !== 0) {\n\t\t\t\t\tif (this.boosts[statName] >= 0) {\n\t\t\t\t\t\tthis.modifyStat!(statName, [1, 1.5, 2, 2.5, 3, 3.5, 4][this.boosts[statName]]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.modifyStat!(statName, [100, 66, 50, 40, 33, 28, 25][-this.boosts[statName]] / 100);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (this.modifiedStats![statName] > 999) {\n\t\t\t\t\tthis.modifiedStats![statName] = 999;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// Stadium's fixed boosting function.\n\t\tboostBy(boost) {\n\t\t\tlet changed = false;\n\t\t\tlet i: BoostID;\n\t\t\tfor (i in boost) {\n\t\t\t\tlet delta = boost[i];\n\t\t\t\tif (delta === undefined) continue;\n\t\t\t\tthis.boosts[i] += delta;\n\t\t\t\tif (this.boosts[i] > 6) {\n\t\t\t\t\tdelta -= this.boosts[i] - 6;\n\t\t\t\t\tthis.boosts[i] = 6;\n\t\t\t\t}\n\t\t\t\tif (this.boosts[i] < -6) {\n\t\t\t\t\tdelta -= this.boosts[i] - (-6);\n\t\t\t\t\tthis.boosts[i] = -6;\n\t\t\t\t}\n\t\t\t\tif (delta) changed = true;\n\t\t\t}\n\t\t\tthis.recalculateStats!();\n\t\t\treturn changed;\n\t\t},\n\t\t// Remove stat recalculation logic from gen 1\n\t\tclearBoosts() {\n\t\t\tlet i: BoostID;\n\t\t\tfor (i in this.boosts) {\n\t\t\t\tthis.boosts[i] = 0;\n\t\t\t}\n\t\t},\n\t},\n\tactions: {\n\t\tinherit: true,\n\t\trunMove(moveOrMoveName, pokemon, targetLoc, options) {\n\t\t\tlet sourceEffect = options?.sourceEffect;\n\t\t\tconst move = this.dex.getActiveMove(moveOrMoveName);\n\t\t\tconst target = this.battle.getTarget(pokemon, move, targetLoc);\n\t\t\tif (target?.subFainted) target.subFainted = null;\n\n\t\t\tthis.battle.setActiveMove(move, pokemon, target);\n\n\t\t\tif (pokemon.moveThisTurn || !this.battle.runEvent('BeforeMove', pokemon, target, move)) {\n\t\t\t\tthis.battle.debug(`${pokemon.fullname} move interrupted; movedThisTurn: ${pokemon.moveThisTurn}`);\n\t\t\t\tthis.battle.clearActiveMove(true);\n\t\t\t\t// This is only run for sleep\n\t\t\t\tthis.battle.runEvent('AfterMoveSelf', pokemon, target, move);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (move.beforeMoveCallback) {\n\t\t\t\tif (move.beforeMoveCallback.call(this.battle, pokemon, target, move)) {\n\t\t\t\t\tthis.battle.clearActiveMove(true);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tlet lockedMove = this.battle.runEvent('LockMove', pokemon);\n\t\t\tif (lockedMove === true) lockedMove = false;\n\t\t\tif (\n\t\t\t\t!lockedMove &&\n\t\t\t\t(!pokemon.volatiles['partialtrappinglock'] || pokemon.volatiles['partialtrappinglock'].locked !== target)\n\t\t\t) {\n\t\t\t\tpokemon.deductPP(move, null, target);\n\t\t\t} else {\n\t\t\t\tsourceEffect = move;\n\t\t\t}\n\t\t\tthis.battle.actions.useMove(move, pokemon, { target, sourceEffect });\n\t\t},\n\t\t// This function deals with AfterMoveSelf events.\n\t\t// This leads with partial trapping moves shenanigans after the move has been used.\n\t\tuseMove(moveOrMoveName, pokemon, options) {\n\t\t\tlet sourceEffect = options?.sourceEffect;\n\t\t\tlet target = options?.target;\n\t\t\tconst moveResult = this.useMoveInner(moveOrMoveName, pokemon, { target, sourceEffect });\n\n\t\t\tif (!sourceEffect && this.battle.effect.id) sourceEffect = this.battle.effect;\n\t\t\tconst baseMove = this.battle.dex.moves.get(moveOrMoveName);\n\t\t\tlet move = this.battle.dex.getActiveMove(baseMove);\n\t\t\tif (target === undefined) target = this.battle.getRandomTarget(pokemon, move);\n\t\t\tif (move.target === 'self') {\n\t\t\t\ttarget = pokemon;\n\t\t\t}\n\t\t\tif (sourceEffect) move.sourceEffect = sourceEffect.id;\n\n\t\t\tthis.battle.singleEvent('ModifyMove', move, null, pokemon, target, move, move);\n\t\t\tif (baseMove.target !== move.target) {\n\t\t\t\t// Target changed in ModifyMove, so we must adjust it here\n\t\t\t\ttarget = this.battle.getRandomTarget(pokemon, move);\n\t\t\t}\n\t\t\tmove = this.battle.runEvent('ModifyMove', pokemon, target, move, move);\n\t\t\tif (baseMove.target !== move.target) {\n\t\t\t\t// Check again, this shouldn't ever happen on Gen 1.\n\t\t\t\ttarget = this.battle.getRandomTarget(pokemon, move);\n\t\t\t}\n\n\t\t\tif (move.id !== 'metronome') {\n\t\t\t\tif (move.id !== 'mirrormove' ||\n\t\t\t\t\t(!pokemon.side.foe.active[0]?.lastMove || pokemon.side.foe.active[0].lastMove?.id === 'mirrormove')) {\n\t\t\t\t\t// The move is our 'final' move (a failed Mirror Move, or any move that isn't Metronome or Mirror Move).\n\t\t\t\t\tpokemon.side.lastMove = move;\n\t\t\t\t\tpokemon.lastMove = move;\n\t\t\t\t\tthis.battle.singleEvent('AfterMove', move, null, pokemon, target, move);\n\n\t\t\t\t\t// If target fainted\n\t\t\t\t\tif (target && target.hp <= 0) {\n\t\t\t\t\t\tdelete pokemon.volatiles['partialtrappinglock'];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.battle.runEvent('AfterMoveSelf', pokemon, target, move);\n\t\t\t\t\t}\n\t\t\t\t\tif (pokemon.volatiles['mustrecharge']) this.battle.add('-mustrecharge', pokemon);\n\n\t\t\t\t\t// For partial trapping moves, we are saving the target.\n\t\t\t\t\tif (move.volatileStatus === 'partiallytrapped' && target && target.hp > 0) {\n\t\t\t\t\t\t// It hit, so let's remove must recharge volatile. Yup, this happens on Stadium.\n\t\t\t\t\t\ttarget.removeVolatile('mustrecharge');\n\t\t\t\t\t\t// Let's check if the lock exists\n\t\t\t\t\t\tif (pokemon.volatiles['partialtrappinglock'] && target.volatiles['partiallytrapped']) {\n\t\t\t\t\t\t\t// Here the partialtrappinglock volatile has been already applied\n\t\t\t\t\t\t\tif (!pokemon.volatiles['partialtrappinglock'].locked) {\n\t\t\t\t\t\t\t\t// If it's the first hit, we save the target\n\t\t\t\t\t\t\t\tpokemon.volatiles['partialtrappinglock'].locked = target;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} // If we move to here, the move failed and there's no partial trapping lock\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn moveResult;\n\t\t},\n\t\t// This is the function that actually uses the move, running ModifyMove events.\n\t\t// It uses the move and then deals with the effects after the move.\n\t\tuseMoveInner(moveOrMoveName, pokemon, options) {\n\t\t\tlet sourceEffect = options?.sourceEffect;\n\t\t\tlet target = options?.target;\n\t\t\tif (!sourceEffect && this.battle.effect.id) sourceEffect = this.battle.effect;\n\t\t\tconst baseMove = this.battle.dex.moves.get(moveOrMoveName);\n\t\t\tlet move = this.battle.dex.getActiveMove(baseMove);\n\t\t\tif (target === undefined) target = this.battle.getRandomTarget(pokemon, move);\n\t\t\tif (move.target === 'self') {\n\t\t\t\ttarget = pokemon;\n\t\t\t}\n\t\t\tif (sourceEffect) move.sourceEffect = sourceEffect.id;\n\n\t\t\tthis.battle.setActiveMove(move, pokemon, target);\n\n\t\t\tthis.battle.singleEvent('ModifyMove', move, null, pokemon, target, move, move);\n\t\t\tif (baseMove.target !== move.target) {\n\t\t\t\t// Target changed in ModifyMove, so we must adjust it here\n\t\t\t\ttarget = this.battle.getRandomTarget(pokemon, move);\n\t\t\t}\n\t\t\tmove = this.battle.runEvent('ModifyMove', pokemon, target, move, move);\n\t\t\tif (baseMove.target !== move.target) {\n\t\t\t\t// Check again, this shouldn't ever happen on Gen 1.\n\t\t\t\ttarget = this.battle.getRandomTarget(pokemon, move);\n\t\t\t\tthis.battle.debug('not a gen 1 mechanic');\n\t\t\t}\n\t\t\tif (!move) return false;\n\n\t\t\tlet attrs = '';\n\t\t\tif (pokemon.fainted) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (sourceEffect) attrs += `|[from] ${this.battle.dex.conditions.get(sourceEffect).name}`;\n\t\t\tthis.battle.addMove('move', pokemon, move.name, `${target}${attrs}`);\n\n\t\t\tif (!this.battle.singleEvent('Try', move, null, pokemon, target, move)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (!this.battle.singleEvent('TryMove', move, null, pokemon, target, move) ||\n\t\t\t\t!this.battle.runEvent('TryMove', pokemon, target, move)) {\n\t\t\t\treturn true;\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\tlet damage: number | undefined | false | '' = false;\n\t\t\tif (!target || target.fainted) {\n\t\t\t\tthis.battle.attrLastMove('[notarget]');\n\t\t\t\tthis.battle.add('-notarget');\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t// Store 0 damage for last damage if the move is not in the array.\n\t\t\tif (!SKIP_LASTDAMAGE.has(move.id)) this.battle.lastDamage = 0;\n\n\t\t\tdamage = this.tryMoveHit(target, pokemon, move);\n\n\t\t\t// Go ahead with results of the used move.\n\t\t\tif (damage === false) {\n\t\t\t\tthis.battle.singleEvent('MoveFail', move, null, target, pokemon, move);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tthis.battle.singleEvent('AfterMoveSecondarySelf', move, null, pokemon, target, move);\n\t\t\tthis.battle.runEvent('AfterMoveSecondarySelf', pokemon, target, move);\n\t\t\treturn true;\n\t\t},\n\t\ttryMoveHit(target, pokemon, move) {\n\t\t\tlet damage: number | false | undefined = 0;\n\n\t\t\t// First, check if the target is semi-invulnerable\n\t\t\tlet hitResult = 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\tif (move.selfdestruct) {\n\t\t\t\t\tthis.battle.faint(pokemon, pokemon, move);\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Then, check if the Pokemon is immune to this move.\n\t\t\tif (!target.runImmunity(move, true)) {\n\t\t\t\tif (move.selfdestruct) {\n\t\t\t\t\tthis.battle.faint(pokemon, pokemon, move);\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\thitResult = this.battle.singleEvent('TryImmunity', move, null, 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\t// Now, let's calculate the accuracy.\n\t\t\tlet accuracy = move.accuracy;\n\n\t\t\t// Partial trapping moves: true accuracy while it lasts\n\t\t\tif (pokemon.volatiles['partialtrappinglock']) {\n\t\t\t\tif (move.volatileStatus === 'partiallytrapped' && target === pokemon.volatiles['partialtrappinglock'].locked) {\n\t\t\t\t\taccuracy = true;\n\t\t\t\t} else if (pokemon.volatiles['partialtrappinglock'].locked !== target) {\n\t\t\t\t\t// The target switched, therefor, you fail using wrap.\n\t\t\t\t\tdelete pokemon.volatiles['partialtrappinglock'];\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// OHKO moves only have a chance to hit if the user is at least as fast as the target\n\t\t\tif (move.ohko) {\n\t\t\t\tif (target.speed > pokemon.speed) {\n\t\t\t\t\tthis.battle.add('-immune', target, '[ohko]');\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Calculate true accuracy for gen 1, which uses 0-255.\n\t\t\t// Stadium uses the Gen 2 boost table for accuracy and evasiveness, except for 1/3 instead of 0.33\n\t\t\tconst boostTable = [1 / 3, 0.36, 0.43, 0.5, 0.66, 0.75, 1, 1.33, 1.66, 2, 2.33, 2.66, 3];\n\t\t\tif (accuracy !== true) {\n\t\t\t\taccuracy = Math.floor(accuracy * 255 / 100);\n\t\t\t\t// Check also for accuracy modifiers.\n\t\t\t\tif (!move.ignoreAccuracy) {\n\t\t\t\t\taccuracy = Math.floor(accuracy * boostTable[pokemon.boosts.accuracy + 6]);\n\t\t\t\t}\n\t\t\t\tif (!move.ignoreEvasion) {\n\t\t\t\t\taccuracy = Math.floor(accuracy * boostTable[-target.boosts.evasion + 6]);\n\t\t\t\t}\n\t\t\t\taccuracy = Math.min(accuracy, 255);\n\t\t\t}\n\t\t\taccuracy = this.battle.runEvent('Accuracy', target, pokemon, move, accuracy);\n\n\t\t\t// Stadium attempts to fix the 1/256 miss by rerolling if the first value\n\t\t\t// would trigger the 1/256 miss.\n\t\t\tlet randomValue = this.battle.random(256);\n\t\t\tif (randomValue === 256) randomValue = this.battle.random(256);\n\t\t\tif (accuracy !== true && randomValue > accuracy) {\n\t\t\t\tthis.battle.attrLastMove('[miss]');\n\t\t\t\tthis.battle.add('-miss', pokemon);\n\t\t\t\tif (accuracy === 255) {\n\t\t\t\t\tthis.battle.hint(\"In Pokemon Stadium, moves with 100% accuracy can still miss 1/65536 of the time.\");\n\t\t\t\t}\n\t\t\t\tdamage = false;\n\t\t\t\tthis.battle.lastDamage = 0;\n\t\t\t}\n\n\t\t\t// If damage is 0 and not false it means it didn't miss, let's calc.\n\t\t\tif (damage !== false) {\n\t\t\t\tif (move.multihit) {\n\t\t\t\t\tlet hits = move.multihit;\n\t\t\t\t\tif (Array.isArray(hits)) {\n\t\t\t\t\t\t// Yes, it's hardcoded... meh\n\t\t\t\t\t\tif (hits[0] === 2 && hits[1] === 5) {\n\t\t\t\t\t\t\thits = this.battle.sample([2, 2, 2, 3, 3, 3, 4, 5]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\thits = this.battle.random(hits[0], hits[1] + 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\thits = Math.floor(hits);\n\t\t\t\t\t// In gen 1, all the hits have the same damage for multihits move\n\t\t\t\t\tlet moveDamage: number | false | undefined = 0;\n\t\t\t\t\tlet i: number;\n\t\t\t\t\tfor (i = 0; i < hits && target.hp && pokemon.hp; i++) {\n\t\t\t\t\t\tmove.hit = i + 1;\n\t\t\t\t\t\tif (move.hit === hits) move.lastHit = true;\n\t\t\t\t\t\tmoveDamage = this.moveHit(target, pokemon, move);\n\t\t\t\t\t\tif (moveDamage === false) break;\n\t\t\t\t\t\tdamage = (moveDamage || 0);\n\t\t\t\t\t\t// Move damage is fixed to be the first move's damage\n\t\t\t\t\t\tif (i === 0) move.damage = damage;\n\t\t\t\t\t\tif (target.subFainted) {\n\t\t\t\t\t\t\ti++;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tmove.damage = null;\n\t\t\t\t\tif (i === 0) return 1;\n\t\t\t\t\tthis.battle.add('-hitcount', target, i);\n\t\t\t\t} else {\n\t\t\t\t\tdamage = this.moveHit(target, pokemon, move);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (move.category !== 'Status') target.gotAttacked(move, damage, pokemon);\n\n\t\t\tif (move.selfdestruct) {\n\t\t\t\tthis.battle.faint(pokemon, pokemon, move);\n\t\t\t}\n\n\t\t\t// The move missed.\n\t\t\tif (damage === false) {\n\t\t\t\t// Delete the partial trap lock if necessary.\n\t\t\t\tdelete pokemon.volatiles['partialtrappinglock'];\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (move.ohko) this.battle.add('-ohko');\n\n\t\t\tthis.battle.singleEvent('AfterMoveSecondary', move, null, target, pokemon, move);\n\t\t\tthis.battle.runEvent('AfterMoveSecondary', target, pokemon, move);\n\n\t\t\treturn damage;\n\t\t},\n\t\tmoveHit(target, pokemon, moveOrMoveName, moveData, isSecondary, isSelf) {\n\t\t\tlet damage: number | false | null | undefined = 0;\n\t\t\tconst move = this.dex.getActiveMove(moveOrMoveName);\n\n\t\t\tif (!isSecondary && !isSelf) this.battle.setActiveMove(move, pokemon, target);\n\t\t\tlet hitResult: number | boolean = true;\n\t\t\tif (!moveData) moveData = move;\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 (target) {\n\t\t\t\thitResult = this.battle.singleEvent('TryHit', moveData, {}, target, pokemon, move);\n\n\t\t\t\t// Partial trapping moves still apply their volatile to Pokémon behind a Sub\n\t\t\t\tconst targetHadSub = !!target.volatiles['substitute'];\n\t\t\t\tif (targetHadSub && moveData.volatileStatus && moveData.volatileStatus === 'partiallytrapped') {\n\t\t\t\t\ttarget.addVolatile(moveData.volatileStatus, pokemon, move);\n\t\t\t\t\tif (!pokemon.volatiles['partialtrappinglock'] || pokemon.volatiles['partialtrappinglock'].duration! > 1) {\n\t\t\t\t\t\ttarget.volatiles[moveData.volatileStatus].duration = 2;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!hitResult) {\n\t\t\t\t\tif (hitResult === false) this.battle.add('-fail', target);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t// Only run the hit events for the hit itself, not the secondary or self hits\n\t\t\t\tif (!isSelf && !isSecondary) {\n\t\t\t\t\thitResult = this.battle.runEvent('TryHit', target, pokemon, move);\n\t\t\t\t\tif (!hitResult) {\n\t\t\t\t\t\tif (hitResult === false) this.battle.add('-fail', target);\n\t\t\t\t\t\t// Special Substitute hit flag\n\t\t\t\t\t\tif (hitResult !== 0) {\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (!this.battle.runEvent('TryFieldHit', target, pokemon, move)) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} else if (isSecondary && !moveData.self) {\n\t\t\t\t\thitResult = this.battle.runEvent('TrySecondaryHit', target, pokemon, moveData);\n\t\t\t\t}\n\n\t\t\t\tif (hitResult === 0) {\n\t\t\t\t\ttarget = null;\n\t\t\t\t} else if (!hitResult) {\n\t\t\t\t\tif (hitResult === false) this.battle.add('-fail', target);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (target) {\n\t\t\t\tlet didSomething = false;\n\n\t\t\t\tdamage = this.getDamage(pokemon, target, moveData);\n\t\t\t\tif (damage && damage > target.hp) {\n\t\t\t\t\tdamage = target.hp;\n\t\t\t\t}\n\t\t\t\tif ((damage || damage === 0) && !target.fainted) {\n\t\t\t\t\tdamage = this.battle.damage(damage, target, pokemon, move);\n\t\t\t\t\tif (!(damage || damage === 0)) return false;\n\t\t\t\t\tdidSomething = true;\n\t\t\t\t} else if (damage === false && typeof hitResult === 'undefined') {\n\t\t\t\t\tthis.battle.add('-fail', target);\n\t\t\t\t}\n\t\t\t\tif (damage === false || damage === null) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (moveData.boosts && !target.fainted) {\n\t\t\t\t\tthis.battle.boost(moveData.boosts, target, pokemon, move);\n\t\t\t\t}\n\t\t\t\tif (moveData.heal && !target.fainted) {\n\t\t\t\t\tconst d = target.heal(Math.floor(target.maxhp * moveData.heal[0] / moveData.heal[1]));\n\t\t\t\t\tif (!d) {\n\t\t\t\t\t\tthis.battle.add('-fail', target);\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tthis.battle.add('-heal', target, target.getHealth);\n\t\t\t\t\tdidSomething = true;\n\t\t\t\t}\n\t\t\t\tif (moveData.status) {\n\t\t\t\t\tif (!target.status) {\n\t\t\t\t\t\ttarget.setStatus(moveData.status, pokemon, move);\n\t\t\t\t\t\ttarget.recalculateStats!();\n\t\t\t\t\t} else if (!isSecondary) {\n\t\t\t\t\t\tif (target.status === moveData.status) {\n\t\t\t\t\t\t\tthis.battle.add('-fail', target, target.status);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.battle.add('-fail', target);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdidSomething = true;\n\t\t\t\t}\n\t\t\t\tif (moveData.forceStatus) {\n\t\t\t\t\tif (target.setStatus(moveData.forceStatus, pokemon, move)) {\n\t\t\t\t\t\ttarget.recalculateStats!();\n\t\t\t\t\t\tdidSomething = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (moveData.volatileStatus) {\n\t\t\t\t\tif (target.addVolatile(moveData.volatileStatus, pokemon, move)) {\n\t\t\t\t\t\tdidSomething = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (moveData.sideCondition) {\n\t\t\t\t\tif (target.side.addSideCondition(moveData.sideCondition, pokemon, move)) {\n\t\t\t\t\t\tdidSomething = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (moveData.pseudoWeather) {\n\t\t\t\t\tif (this.battle.field.addPseudoWeather(moveData.pseudoWeather, pokemon, move)) {\n\t\t\t\t\t\tdidSomething = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Hit events\n\t\t\t\thitResult = this.battle.singleEvent('Hit', moveData, {}, target, pokemon, move);\n\t\t\t\tif (!isSelf && !isSecondary) {\n\t\t\t\t\tthis.battle.runEvent('Hit', target, pokemon, move);\n\t\t\t\t}\n\t\t\t\tif (!hitResult && !didSomething) {\n\t\t\t\t\tif (hitResult === false) this.battle.add('-fail', target);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Here's where self effects are applied.\n\t\t\tif (moveData.self) {\n\t\t\t\tthis.moveHit(pokemon, pokemon, move, moveData.self, isSecondary, true);\n\t\t\t}\n\n\t\t\t// Now we can save the partial trapping damage.\n\t\t\tif (pokemon.volatiles['partialtrappinglock']) {\n\t\t\t\tpokemon.volatiles['partialtrappinglock'].damage = this.battle.lastDamage;\n\t\t\t}\n\n\t\t\t// Apply move secondaries.\n\t\t\tif (moveData.secondaries && target && target.hp > 0) {\n\t\t\t\tfor (const secondary of moveData.secondaries) {\n\t\t\t\t\t// Multi-hit moves only roll for status once\n\t\t\t\t\tif (!move.multihit || move.lastHit) {\n\t\t\t\t\t\t// We check here whether to negate the probable secondary status if it's para, burn, or freeze.\n\t\t\t\t\t\t// In the game, this is checked and if true, the random number generator is not called.\n\t\t\t\t\t\t// That means that a move that does not share the type of the target can status it.\n\t\t\t\t\t\t// If a move that was not fire-type would exist on Gen 1, it could burn a Pokémon.\n\t\t\t\t\t\tif (!(secondary.status && ['par', 'brn', 'frz'].includes(secondary.status) && target.hasType(move.type))) {\n\t\t\t\t\t\t\tconst effectChance = Math.floor((secondary.chance || 100) * 255 / 100);\n\t\t\t\t\t\t\tif (typeof secondary.chance === 'undefined' || this.battle.randomChance(effectChance + 1, 256)) {\n\t\t\t\t\t\t\t\tthis.moveHit(target, pokemon, move, secondary, true, isSelf);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (move.selfSwitch && pokemon.hp) {\n\t\t\t\tpokemon.switchFlag = move.selfSwitch === true ? true : this.dex.toID(move.selfSwitch);\n\t\t\t}\n\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 ActiveMove;\n\t\t\t}\n\n\t\t\t// Let's see if the target is immune to the move.\n\t\t\tif (!target.runImmunity(move, true)) {\n\t\t\t\treturn false;\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 65535;\n\t\t\t}\n\n\t\t\t// We edit the damage through move's damage callback if necessary.\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 (seismic toss).\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 return that.\n\t\t\tif (move.damage) {\n\t\t\t\treturn move.damage;\n\t\t\t}\n\n\t\t\t// If it's the first hit on a Normal-type partially trap move, it hits Ghosts anyways but damage is 0.\n\t\t\tif (move.volatileStatus === 'partiallytrapped' && move.type === 'Normal' && target.hasType('Ghost')) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\t// Let's check if we are in middle of a partial trap sequence to return the previous damage.\n\t\t\tif (source.volatiles['partialtrappinglock'] && (target === source.volatiles['partialtrappinglock'].locked)) {\n\t\t\t\treturn source.volatiles['partialtrappinglock'].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\tif (!move.category) move.category = 'Physical';\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 = 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\t\t\tif (!basePower) {\n\t\t\t\treturn basePower === 0 ? undefined : 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 possibility. We check if it's a 100% crit move, otherwise we calculate the chance.\n\t\t\tlet isCrit = move.willCrit || false;\n\t\t\tif (!isCrit) {\n\t\t\t\t// In Stadium, the critical chance is based on speed.\n\t\t\t\t// First, we get the base speed and store it. Then we add 76. This is our current crit chance.\n\t\t\t\tlet critChance = source.species.baseStats['spe'] + 76;\n\n\t\t\t\t// Now we right logical shift it two places, essentially dividing by 4 and flooring it.\n\t\t\t\tcritChance >>= 2;\n\n\t\t\t\t// Now we check for focus energy volatile.\n\t\t\t\tif (source.volatiles['focusenergy']) {\n\t\t\t\t\t// If it exists, crit chance is multiplied by 4 and floored with a logical left shift.\n\t\t\t\t\tcritChance <<= 2;\n\t\t\t\t\t// Then we add 160.\n\t\t\t\t\tcritChance += 160;\n\t\t\t\t} else {\n\t\t\t\t\t// If it is not active, we left shift it by 1.\n\t\t\t\t\tcritChance <<= 1;\n\t\t\t\t}\n\n\t\t\t\t// Now we check for the move's critical hit ratio.\n\t\t\t\tif (move.critRatio === 2) {\n\t\t\t\t\t// High crit ratio, we multiply the result so far by 4.\n\t\t\t\t\tcritChance <<= 2;\n\t\t\t\t} else if (move.critRatio === 1) {\n\t\t\t\t\t// Normal hit ratio, we divide the crit chance by 2 and floor the result again.\n\t\t\t\t\tcritChance >>= 1;\n\t\t\t\t}\n\n\t\t\t\t// Now we make sure it's a number between 1 and 255.\n\t\t\t\tcritChance = this.battle.clampIntRange(critChance, 1, 255);\n\n\t\t\t\t// Last, we check deppending on ratio if the move critical hits or not.\n\t\t\t\t// We compare our critical hit chance against a random number between 0 and 255.\n\t\t\t\t// If the random number is lower, we get a critical hit. This means there is always a 1/255 chance of not hitting critically.\n\t\t\t\tif (critChance > 0) {\n\t\t\t\t\tisCrit = this.battle.randomChance(critChance, 256);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// There is a critical hit.\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\tbasePower = this.battle.runEvent('BasePower', source, target, move, basePower);\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 attacker's and defender's stats.\n\t\t\tlet level = source.level;\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 attack = attacker.getStat(atkType);\n\t\t\tlet defense = defender.getStat(defType);\n\n\t\t\t// In gen 1, screen effect is applied here.\n\t\t\tif ((defType === 'def' && defender.volatiles['reflect']) || (defType === 'spd' && defender.volatiles['lightscreen'])) {\n\t\t\t\tthis.battle.debug('Screen doubling (Sp)Def');\n\t\t\t\tdefense *= 2;\n\t\t\t\tdefense = this.battle.clampIntRange(defense, 1, 1998);\n\t\t\t}\n\n\t\t\t// In the event of a critical hit, the offense and defense changes are ignored.\n\t\t\t// This includes both boosts and screens.\n\t\t\t// Also, level is doubled in damage calculation.\n\t\t\tif (isCrit) {\n\t\t\t\tmove.ignoreOffensive = true;\n\t\t\t\tmove.ignoreDefensive = true;\n\t\t\t\tlevel *= 2;\n\t\t\t\tif (!suppressMessages) this.battle.add('-crit', target);\n\t\t\t}\n\n\t\t\tif (move.ignoreOffensive) {\n\t\t\t\tthis.battle.debug('Negating (sp)atk boost/penalty.');\n\t\t\t\tattack = attacker.getStat(atkType, 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);\n\t\t\t}\n\n\t\t\t// When either attack or defense are higher than 256, they are both divided by 4 and moded by 256.\n\t\t\t// This is what causes the rollover bugs.\n\t\t\tif (attack >= 256 || defense >= 256) {\n\t\t\t\tattack = this.battle.clampIntRange(Math.floor(attack / 4) % 256, 1);\n\t\t\t\t// Defense isn't checked on the cartridge, but we don't want those / 0 bugs on the sim.\n\t\t\t\tdefense = this.battle.clampIntRange(Math.floor(defense / 4) % 256, 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 = this.battle.clampIntRange(Math.floor(damage / 50), 0, 997);\n\t\t\tdamage += 2;\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\t// In Gen 1, type effectiveness is applied against each of the target's types.\n\t\t\tfor (const targetType of target.types) {\n\t\t\t\tconst typeMod = this.battle.dex.getEffectiveness(type, targetType);\n\t\t\t\tif (typeMod > 0) {\n\t\t\t\t\t// Super effective against targetType\n\t\t\t\t\tdamage *= 20;\n\t\t\t\t\tdamage = Math.floor(damage / 10);\n\t\t\t\t}\n\t\t\t\tif (typeMod < 0) {\n\t\t\t\t\t// Not very effective against targetType\n\t\t\t\t\tdamage *= 5;\n\t\t\t\t\tdamage = Math.floor(damage / 10);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst totalTypeMod = target.runEffectiveness(move);\n\t\t\tif (totalTypeMod > 0) {\n\t\t\t\tif (!suppressMessages) this.battle.add('-supereffective', target);\n\t\t\t}\n\t\t\tif (totalTypeMod < 0) {\n\t\t\t\tif (!suppressMessages) this.battle.add('-resisted', target);\n\t\t\t}\n\n\t\t\t// If damage becomes 0, the move is made to miss.\n\t\t\t// This occurs when damage was either 2 or 3 prior to applying STAB/Type matchup, and target is 4x resistant to the move.\n\t\t\tif (damage === 0) return damage;\n\n\t\t\t// Apply random factor if damage is greater than 1\n\t\t\tif (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// We are done, this is the final damage.\n\t\t\treturn Math.floor(damage);\n\t\t},\n\t},\n};\n"],"mappings":";AAEO,IAAM,aAAuC;AAAA,EACnD,KAAK;AAAA,IACJ,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,QAAQ,QAAQ;AACf,WAAK,IAAI,WAAW,QAAQ,KAAK;AAAA,IAClC;AAAA,IACA,yBAAyB;AAAA,IACzB,gBAAgB,SAAS;AACxB,WAAK,OAAO,KAAK,cAAc,KAAK,MAAM,QAAQ,QAAQ,EAAE,GAAG,CAAC,CAAC;AAAA,IAClE;AAAA,IACA,oBAAoB,SAAS;AAC5B,WAAK,OAAO,KAAK,cAAc,KAAK,MAAM,QAAQ,QAAQ,EAAE,GAAG,CAAC,CAAC;AAAA,IAClE;AAAA,EACD;AAAA,EACA,KAAK;AAAA,IACJ,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,QAAQ,QAAQ;AACf,WAAK,IAAI,WAAW,QAAQ,KAAK;AAAA,IAClC;AAAA,IACA,sBAAsB;AAAA,IACtB,aAAa,SAAS;AACrB,UAAI,KAAK,aAAa,IAAI,GAAG,GAAG;AAC/B,aAAK,IAAI,QAAQ,SAAS,KAAK;AAC/B,gBAAQ,eAAe,MAAM;AAC7B,gBAAQ,eAAe,YAAY;AACnC,gBAAQ,eAAe,aAAa;AACpC,gBAAQ,eAAe,iBAAiB;AACxC,gBAAQ,eAAe,qBAAqB;AAC5C,eAAO;AAAA,MACR;AAAA,IACD;AAAA,EACD;AAAA,EACA,KAAK;AAAA,IACJ,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,QAAQ,QAAQ,QAAQ,cAAc;AACrC,UAAI,gBAAgB,aAAa,eAAe,QAAQ;AACvD,aAAK,IAAI,WAAW,QAAQ,OAAO,gBAAgB,aAAa,IAAI,EAAE;AAAA,MACvE,OAAO;AACN,aAAK,IAAI,WAAW,QAAQ,KAAK;AAAA,MAClC;AAEA,WAAK,YAAY,YAAY,KAAK,OAAO,GAAG,CAAC;AAC7C,WAAK,YAAY,OAAO,KAAK,YAAY;AAEzC,UAAI,OAAO,eAAe,WAAW,GAAG;AACvC,aAAK,IAAI,QAAQ,QAAQ,aAAa,UAAU;AAAA,MACjD;AAAA,IACD;AAAA,IACA,sBAAsB;AAAA,IACtB,aAAa,SAAS,QAAQ,MAAM;AACnC,cAAQ,YAAY;AACpB,WAAK,IAAI,QAAQ,SAAS,KAAK;AAC/B,cAAQ,WAAW;AACnB,aAAO;AAAA,IACR;AAAA,IACA,gBAAgB,SAAS;AACxB,UAAI,QAAQ,YAAY,QAAQ,EAAG,SAAQ,WAAW;AAAA,IACvD;AAAA,EACD;AAAA,EACA,KAAK;AAAA,IACJ,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,QAAQ,QAAQ;AACf,WAAK,IAAI,WAAW,QAAQ,KAAK;AAAA,IAClC;AAAA,IACA,sBAAsB;AAAA,IACtB,aAAa,SAAS,QAAQ,MAAM;AACnC,WAAK,IAAI,QAAQ,SAAS,KAAK;AAC/B,cAAQ,WAAW;AACnB,aAAO;AAAA,IACR;AAAA,IACA,MAAM,QAAQ,QAAQ,MAAM;AAC3B,UAAI,KAAK,SAAS,UAAU,KAAK,aAAa,UAAU;AACvD,eAAO,WAAW;AAAA,MACnB;AAAA,IACD;AAAA,EACD;AAAA,EACA,KAAK;AAAA,IACJ,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,QAAQ,QAAQ;AACf,WAAK,IAAI,WAAW,QAAQ,KAAK;AAAA,IAClC;AAAA,IACA,yBAAyB;AAAA,IACzB,gBAAgB,SAAS;AACxB,WAAK,OAAO,KAAK,cAAc,KAAK,MAAM,QAAQ,QAAQ,EAAE,GAAG,CAAC,CAAC;AAAA,IAClE;AAAA,IACA,oBAAoB,SAAS;AAC5B,WAAK,OAAO,KAAK,cAAc,KAAK,MAAM,QAAQ,QAAQ,EAAE,GAAG,CAAC,CAAC;AAAA,IAClE;AAAA,EACD;AAAA,EACA,WAAW;AAAA,IACV,SAAS;AAAA,IACT,QAAQ,QAAQ;AACf,WAAK,IAAI,UAAU,QAAQ,WAAW;AACtC,WAAK,YAAY,OAAO,KAAK,OAAO,GAAG,CAAC;AAAA,IACzC;AAAA,EACD;AAAA,EACA,QAAQ;AAAA,IACP,SAAS;AAAA,IACT,UAAU;AAAA,IAAC;AAAA,EACZ;AAAA,EACA,kBAAkB;AAAA,IACjB,MAAM;AAAA,IACN,UAAU;AAAA,IACV,sBAAsB;AAAA,IACtB,QAAQ,QAAQ,QAAQ,QAAQ;AAC/B,WAAK,IAAI,aAAa,QAAQ,SAAS,MAAM,IAAI,QAAQ,MAAM,EAAE;AAAA,IAClE;AAAA,IACA,aAAa,SAAS;AACrB,UAAI,KAAK,YAAY,WAAW,CAAC,KAAK,YAAY,OAAO,YAAY,KAAK,YAAY,OAAO,MAAM,IAAI;AACtG,gBAAQ,eAAe,kBAAkB;AACzC;AAAA,MACD;AACA,WAAK,IAAI,QAAQ,SAAS,kBAAkB;AAC5C,aAAO;AAAA,IACR;AAAA,IACA,MAAM,SAAS;AACd,WAAK,IAAI,QAAQ,SAAS,KAAK,YAAY,cAAc,oBAAoB;AAAA,IAC9E;AAAA,EACD;AACD;;;AC5HO,IAAM,WAAkC;AAAA,EAC9C,UAAU;AAAA,IACT,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,SAAS,CAAC,cAAc,wBAAwB,qBAAqB,kBAAkB,mBAAmB,eAAe,wBAAwB,gBAAgB,YAAY;AAAA,EAC9K;AACD;;;ACNO,IAAM,QAA6B;AAAA,EACzC,MAAM;AAAA,IACL,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,IACV,WAAW;AAAA,MACV,iBAAiB,QAAQ,QAAQ,QAAQ;AACxC,eAAO,KAAK,OAAO,GAAG,CAAC;AAAA,MACxB;AAAA,MACA,QAAQ,SAAS;AAChB,aAAK,YAAY,cAAc;AAC/B,aAAK,YAAY,aAAa;AAC9B,aAAK,IAAI,UAAU,SAAS,MAAM;AAAA,MACnC;AAAA,MACA,MAAM,QAAQ,QAAQ,MAAM;AAC3B,YAAI,UAAU,WAAW,UAAU,KAAK,aAAa,cAAc,KAAK,aAAa,WAAW;AAC/F,gBAAM,SAAS,KAAK,YAAY;AAChC,eAAK,YAAY,eAAe;AAChC,eAAK,YAAY,aAAa;AAC9B,eAAK,YAAY,aAAa,OAAO,QAAQ;AAAA,QAC9C;AAAA,MACD;AAAA,MACA,SAAS,QAAQ,QAAQ,QAAQ,MAAM;AACtC,YAAI,CAAC,UAAU,OAAO,OAAO,MAAM,EAAG;AACtC,YAAI,CAAC,QAAQ,KAAK,eAAe,OAAQ;AACzC,YAAI,CAAC,UAAU,KAAK,YAAY,aAAa,GAAG;AAC/C,mBAAS,KAAK,YAAY;AAAA,QAC3B;AACA,aAAK,YAAY,eAAe;AAChC,aAAK,YAAY,aAAa;AAC9B,aAAK,YAAY,aAAa,OAAO,QAAQ;AAAA,MAC9C;AAAA,MACA,iBAAiB,QAAQ,SAAS;AAEjC,YAAI,QAAQ,UAAU,QAAQ,GAAG;AAChC,eAAK,YAAY;AAAA,QAClB,WAAW,QAAQ,UAAU,kBAAkB,GAAG;AACjD,eAAK,YAAY;AAAA,QAClB,OAAO;AACN,kBAAQ,OAAO,IAAI;AAAA,YACnB,KAAK;AAAA,YACL,KAAK;AACJ,mBAAK,YAAY;AACjB;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,MACA,aAAa,SAAS,GAAG,MAAM;AAC9B,YAAI,KAAK,YAAY,aAAa,GAAG;AACpC,eAAK,IAAI,QAAQ,SAAS,MAAM;AAChC,cAAI,CAAC,KAAK,YAAY,aAAa;AAClC,iBAAK,MAAM,yCAAyC;AACpD,iBAAK,IAAI,SAAS,OAAO;AACzB,mBAAO;AAAA,UACR;AACA,gBAAM,SAAS,KAAK,UAAU,KAAK,YAAY,UAAU;AACzD,cAAI,OAAO,mBAAmB,GAAG;AAChC,iBAAK,IAAI,YAAY,aAAa,OAAO,OAAO,6BAA8B;AAC9E,oBAAQ,eAAe,MAAM;AAC7B,mBAAO;AAAA,UACR;AACA,eAAK,QAAQ,QAAQ,QAAQ,SAAS,MAAM,EAAE,QAAQ,KAAK,YAAY,cAAc,EAAE,CAAe;AACtG,kBAAQ,eAAe,MAAM;AAC7B,iBAAO;AAAA,QACR;AACA,aAAK,IAAI,aAAa,SAAS,MAAM;AACrC,eAAO;AAAA,MACR;AAAA,MACA,cAAc,SAAS;AACtB,YAAI,CAAC,QAAQ,QAAQ,MAAM,GAAG;AAC7B;AAAA,QACD;AACA,mBAAW,YAAY,QAAQ,WAAW;AACzC,cAAI,SAAS,OAAO,QAAQ;AAC3B,oBAAQ,YAAY,SAAS,EAAE;AAAA,UAChC;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,IACA,MAAM;AAAA;AAAA,EACP;AAAA,EACA,MAAM;AAAA,IACL,SAAS;AAAA;AAAA,EAEV;AAAA,EACA,OAAO;AAAA,IACN,SAAS;AAAA;AAAA,EAEV;AAAA,EACA,SAAS;AAAA,IACR,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,UAAU;AAAA,IACV,WAAW;AAAA,IACX,eAAe,SAAS,QAAQ;AAK/B,YAAM,mBAAmB,OAAO,KAAK,YAAY,OAAO,KAAK,SAAS,OAAO,OAAO,KAAK,oBACxF,CAAC,KAAK,MAAM,SAAS,MAAM,KAAK,KAAK,IAAI,MAAM,IAAI,OAAO,KAAK,SAAS,EAAE;AAC3E,UAAI,CAAC,kBAAkB;AACtB,aAAK,MAAM,gDAAgD;AAC3D,aAAK,IAAI,SAAS,OAAO;AACzB,eAAO;AAAA,MACR;AAEA,YAAM,gCAAgC,oBAAoB,iBAAiB,YAAY,KACtF,CAAC,UAAU,UAAU,EAAE,SAAS,iBAAiB,IAAI,KAAK,iBAAiB,OAAO;AACnF,UAAI,CAAC,+BAA+B;AACnC,aAAK,MAAM,gCAAgC,iBAAiB,IAAI,sBAAsB;AACtF,aAAK,IAAI,SAAS,OAAO;AACzB,eAAO;AAAA,MACR;AACA,UAAI,KAAK,cAAc,GAAG;AACzB,aAAK,MAAM,8CAA8C;AACzD,aAAK,IAAI,SAAS,OAAO;AACzB,eAAO;AAAA,MACR;AAEA,aAAO,IAAI,KAAK;AAAA,IACjB;AAAA,EACD;AAAA,EACA,UAAU;AAAA,IACT,SAAS;AAAA;AAAA,EAEV;AAAA,EACA,MAAM;AAAA,IACL,SAAS;AAAA,IACT,MAAM,QAAQ,QAAQ;AACrB,WAAK,IAAI,aAAa,QAAQ,YAAY;AAC1C,WAAK,IAAI,kBAAkB,UAAU;AACrC,iBAAW,WAAW,KAAK,aAAa,GAAG;AAC1C,gBAAQ,YAAY;AACpB,gBAAQ,WAAW,IAAI;AACvB,mBAAW,MAAM,OAAO,KAAK,QAAQ,SAAS,GAAG;AAChD,kBAAQ,eAAe,EAAE;AACzB,eAAK,IAAI,QAAQ,SAAS,IAAI,UAAU;AAAA,QACzC;AACA,gBAAQ,iBAAkB;AAAA,MAC3B;AAAA,IACD;AAAA,EACD;AAAA,EACA,WAAW;AAAA,IACV,SAAS;AAAA,IACT,WAAW,QAAQ,QAAQ,MAAM;AAChC,aAAO,YAAY,cAAc;AAAA,IAClC;AAAA,EACD;AAAA,EACA,SAAS;AAAA,IACR,SAAS;AAAA,IACT,WAAW;AAAA,IACX,eAAe,SAAS;AACvB,aAAO,KAAK,OAAO,GAAG,KAAK,MAAM,MAAM,QAAQ,KAAK,CAAC;AAAA,IACtD;AAAA,EACD;AAAA,EACA,MAAM;AAAA,IACL,SAAS;AAAA,IACT,MAAM;AAAA,MACL,gBAAgB;AAAA,IACjB;AAAA,IACA,WAAW;AAAA;AAAA,MAEV,QAAQ,QAAQ,QAAQ,QAAQ;AAC/B,aAAK,YAAY,OAAO;AAAA,MACzB;AAAA,MACA,YAAY;AAAA,MACZ,MAAM,QAAQ,QAAQ,MAAM;AAC3B,YAAI,OAAO,OAAO,MAAM,MAAM,KAAK,aAAa,YAAY,KAAK,OAAO,YAAY;AACnF,eAAK,MAAM,EAAE,KAAK,EAAE,CAAC;AAAA,QACtB;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EACA,SAAS;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,MAAM,QAAQ;AACb,UAAI,OAAO,OAAO,OAAO,OAAO;AAC/B,eAAO;AAAA,MACR;AACA,WAAK,KAAK,KAAK,MAAM,OAAO,QAAQ,CAAC,GAAG,QAAQ,MAAM;AAAA,IACvD;AAAA,EACD;AAAA,EACA,MAAM;AAAA,IACL,SAAS;AAAA,IACT,MAAM,QAAQ,QAAQ,MAAM;AAG3B,UAAI,OAAO,MAAM,OAAO,MAAO,QAAO;AACtC,UAAI,CAAC,OAAO,UAAU,OAAO,QAAQ,IAAI,EAAG,QAAO;AACnD,aAAO,YAAY,OAAO;AAC1B,aAAO,YAAY,YAAY;AAC/B,aAAO,iBAAkB;AACzB,WAAK,KAAK,OAAO,KAAK;AAAA,IACvB;AAAA,EACD;AAAA,EACA,YAAY;AAAA,IACX,SAAS;AAAA,IACT,MAAM;AAAA,IACN,MAAM,QAAQ;AAEb,UAAI,OAAO,OAAO,OAAO,OAAO;AAC/B,eAAO;AAAA,MACR;AACA,WAAK,KAAK,KAAK,MAAM,OAAO,QAAQ,CAAC,GAAG,QAAQ,MAAM;AAAA,IACvD;AAAA,EACD;AAAA,EACA,YAAY;AAAA,IACX,SAAS;AAAA,IACT,SAAS,QAAQ;AAChB,UAAI,OAAO,UAAU,YAAY,GAAG;AACnC,aAAK,IAAI,SAAS,QAAQ,kBAAkB;AAC5C,eAAO;AAAA,MACR;AAEA,UAAI,OAAO,MAAM,OAAO,QAAQ,GAAG;AAClC,aAAK,IAAI,SAAS,QAAQ,oBAAoB,QAAQ;AACtD,eAAO;AAAA,MACR;AAAA,IACD;AAAA,IACA,WAAW;AAAA,MACV,QAAQ,QAAQ;AACf,aAAK,IAAI,UAAU,QAAQ,YAAY;AACvC,aAAK,YAAY,KAAK,KAAK,MAAM,OAAO,QAAQ,CAAC;AACjD,eAAO,OAAO,UAAU,kBAAkB;AAAA,MAC3C;AAAA,MACA,kBAAkB;AAAA,MAClB,SAAS,QAAQ,QAAQ,MAAM;AAC9B,YAAI,WAAW,QAAQ;AACtB,eAAK,MAAM,sBAAsB;AACjC;AAAA,QACD;AACA,YAAI,KAAK,OAAO;AACf,eAAK,IAAI,SAAS,MAAM;AACxB,iBAAO;AAAA,QACR;AACA,YAAI,KAAK,aAAa,UAAU;AAC/B,gBAAM,aAAa,CAAC,aAAa,UAAU,cAAc,WAAW;AACpE,cAAI,KAAK,UAAU,KAAK,UAAU,KAAK,mBAAmB,eAAe,WAAW,SAAS,KAAK,EAAE,GAAG;AACtG,iBAAK,IAAI,aAAa,QAAQ,cAAc,aAAa,KAAK,IAAI;AAClE,mBAAO;AAAA,UACR;AACA;AAAA,QACD;AACA,YAAI,KAAK,kBAAkB,WAAW,OAAQ;AAC9C,YAAI,SAAS,KAAK,QAAQ,UAAU,QAAQ,QAAQ,IAAI;AACxD,YAAI,UAAU,SAAS,OAAO,UAAU,YAAY,EAAE,IAAI;AACzD,mBAAS,OAAO,UAAU,YAAY,EAAE;AAAA,QACzC;AACA,YAAI,CAAC,UAAU,WAAW,EAAG,QAAO;AACpC,eAAO,UAAU,YAAY,EAAE,MAAM;AACrC,aAAK,aAAa;AAClB,YAAI,OAAO,UAAU,YAAY,EAAE,MAAM,GAAG;AAC3C,eAAK,MAAM,kBAAkB;AAC7B,iBAAO,eAAe,YAAY;AAClC,iBAAO,aAAa;AAAA,QACrB,OAAO;AACN,eAAK,IAAI,aAAa,QAAQ,cAAc,UAAU;AAAA,QACvD;AAEA,YAAI,OAAO,UAAU,YAAY,GAAG;AACnC,cAAI,KAAK,QAAQ;AAChB,iBAAK,OAAO,KAAK,cAAc,KAAK,MAAM,SAAS,KAAK,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,QAAQ,QAAQ,QAAQ;AAAA,UAClH;AAAA,QACD;AACA,aAAK,SAAS,kBAAkB,QAAQ,QAAQ,MAAM,MAAM;AAE5D,cAAM,iBAAiB,OAAO,kBAAkB;AAChD,YAAI,CAAC,gBAAgB;AACpB,iBAAO,WAAW,KAAK,EAAE,QAAQ,MAAM,KAAK,IAAI,QAAQ,MAAM,OAAO,QAAQ,GAAG,UAAU,KAAK,CAAC;AAAA,QACjG,OAAO;AACN,yBAAe,OAAO,KAAK;AAC3B,yBAAe,SAAS;AAAA,QACzB;AACA,eAAO;AAAA,MACR;AAAA,MACA,MAAM,QAAQ;AACb,aAAK,IAAI,QAAQ,QAAQ,YAAY;AAAA,MACtC;AAAA,IACD;AAAA,IACA,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,MAAM;AAAA,EACP;AAAA,EACA,UAAU;AAAA,IACT,SAAS;AAAA,IACT,gBAAgB,EAAE,UAAU,KAAK;AAAA,EAClC;AAAA,EACA,MAAM;AAAA,IACL,SAAS;AAAA;AAAA,EAEV;AACD;;;ACjSA,IAAM,kBAAkB,oBAAI,IAAI;AAAA,EAC/B;AAAA,EAAc;AAAA,EAAc;AAAA,EAAW;AAAA,EAAe;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAa;AAAA,EACpF;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAa;AAAA,EAAgB;AAAA,EAAW;AAAA,EAAW;AAAA,EAAQ;AAAA,EAC5E;AAAA,EAAU;AAAA,EAAa;AAAA,EAAc;AAAA,EAAc;AAAA,EAAY;AAAA,EAAe;AAAA,EAAS;AACxF,CAAC;AAEM,IAAM,UAAmC;AAAA,EAC/C,SAAS;AAAA,EACT,KAAK;AAAA;AAAA,EAEL,SAAS;AAAA,IACR,SAAS;AAAA;AAAA,IAET,mBAAmB;AAClB,UAAI;AACJ,WAAK,YAAY,KAAK,aAAa;AAClC,YAAI,OAAO,KAAK,QAAQ,UAAU,QAAQ;AAC1C,eAAO,KAAK;AAAA,UACX,KAAK;AAAA,YACJ,IAAI,OAAO,KAAK,IAAI,IAAI,QAAQ,IAAI,KAAK,MAAM,KAAK,IAAI,IAAI,QAAQ,IAAI,CAAC;AAAA,UAC1E,IAAI,KAAK,QAAQ,MAAM;AAAA,QACxB;AACA,aAAK,gBAAgB,QAAQ,IAAI,KAAK,YAAY,QAAQ,IAAI,KAAK,MAAM,IAAI;AAC7E,aAAK,cAAe,QAAQ,IAAI,KAAK,MAAM,IAAI;AAE/C,YAAI,KAAK,WAAW,SAAS,aAAa,MAAO,MAAK,WAAY,OAAO,IAAI;AAC7E,YAAI,KAAK,WAAW,SAAS,aAAa,MAAO,MAAK,WAAY,OAAO,GAAG;AAC5E,YAAI,KAAK,OAAO,QAAQ,MAAM,GAAG;AAChC,cAAI,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC/B,iBAAK,WAAY,UAAU,CAAC,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC,EAAE,KAAK,OAAO,QAAQ,CAAC,CAAC;AAAA,UAC9E,OAAO;AACN,iBAAK,WAAY,UAAU,CAAC,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC,KAAK,OAAO,QAAQ,CAAC,IAAI,GAAG;AAAA,UACvF;AAAA,QACD;AACA,YAAI,KAAK,cAAe,QAAQ,IAAI,KAAK;AACxC,eAAK,cAAe,QAAQ,IAAI;AAAA,QACjC;AAAA,MACD;AAAA,IACD;AAAA;AAAA,IAEA,QAAQ,OAAO;AACd,UAAI,UAAU;AACd,UAAI;AACJ,WAAK,KAAK,OAAO;AAChB,YAAI,QAAQ,MAAM,CAAC;AACnB,YAAI,UAAU,OAAW;AACzB,aAAK,OAAO,CAAC,KAAK;AAClB,YAAI,KAAK,OAAO,CAAC,IAAI,GAAG;AACvB,mBAAS,KAAK,OAAO,CAAC,IAAI;AAC1B,eAAK,OAAO,CAAC,IAAI;AAAA,QAClB;AACA,YAAI,KAAK,OAAO,CAAC,IAAI,IAAI;AACxB,mBAAS,KAAK,OAAO,CAAC,IAAK;AAC3B,eAAK,OAAO,CAAC,IAAI;AAAA,QAClB;AACA,YAAI,MAAO,WAAU;AAAA,MACtB;AACA,WAAK,iBAAkB;AACvB,aAAO;AAAA,IACR;AAAA;AAAA,IAEA,cAAc;AACb,UAAI;AACJ,WAAK,KAAK,KAAK,QAAQ;AACtB,aAAK,OAAO,CAAC,IAAI;AAAA,MAClB;AAAA,IACD;AAAA,EACD;AAAA,EACA,SAAS;AAAA,IACR,SAAS;AAAA,IACT,QAAQ,gBAAgB,SAAS,WAAW,SAAS;AACpD,UAAI,eAAe,mCAAS;AAC5B,YAAM,OAAO,KAAK,IAAI,cAAc,cAAc;AAClD,YAAM,SAAS,KAAK,OAAO,UAAU,SAAS,MAAM,SAAS;AAC7D,UAAI,iCAAQ,WAAY,QAAO,aAAa;AAE5C,WAAK,OAAO,cAAc,MAAM,SAAS,MAAM;AAE/C,UAAI,QAAQ,gBAAgB,CAAC,KAAK,OAAO,SAAS,cAAc,SAAS,QAAQ,IAAI,GAAG;AACvF,aAAK,OAAO,MAAM,GAAG,QAAQ,QAAQ,qCAAqC,QAAQ,YAAY,EAAE;AAChG,aAAK,OAAO,gBAAgB,IAAI;AAEhC,aAAK,OAAO,SAAS,iBAAiB,SAAS,QAAQ,IAAI;AAC3D;AAAA,MACD;AACA,UAAI,KAAK,oBAAoB;AAC5B,YAAI,KAAK,mBAAmB,KAAK,KAAK,QAAQ,SAAS,QAAQ,IAAI,GAAG;AACrE,eAAK,OAAO,gBAAgB,IAAI;AAChC;AAAA,QACD;AAAA,MACD;AACA,UAAI,aAAa,KAAK,OAAO,SAAS,YAAY,OAAO;AACzD,UAAI,eAAe,KAAM,cAAa;AACtC,UACC,CAAC,eACA,CAAC,QAAQ,UAAU,qBAAqB,KAAK,QAAQ,UAAU,qBAAqB,EAAE,WAAW,SACjG;AACD,gBAAQ,SAAS,MAAM,MAAM,MAAM;AAAA,MACpC,OAAO;AACN,uBAAe;AAAA,MAChB;AACA,WAAK,OAAO,QAAQ,QAAQ,MAAM,SAAS,EAAE,QAAQ,aAAa,CAAC;AAAA,IACpE;AAAA;AAAA;AAAA,IAGA,QAAQ,gBAAgB,SAAS,SAAS;AA/G5C;AAgHG,UAAI,eAAe,mCAAS;AAC5B,UAAI,SAAS,mCAAS;AACtB,YAAM,aAAa,KAAK,aAAa,gBAAgB,SAAS,EAAE,QAAQ,aAAa,CAAC;AAEtF,UAAI,CAAC,gBAAgB,KAAK,OAAO,OAAO,GAAI,gBAAe,KAAK,OAAO;AACvE,YAAM,WAAW,KAAK,OAAO,IAAI,MAAM,IAAI,cAAc;AACzD,UAAI,OAAO,KAAK,OAAO,IAAI,cAAc,QAAQ;AACjD,UAAI,WAAW,OAAW,UAAS,KAAK,OAAO,gBAAgB,SAAS,IAAI;AAC5E,UAAI,KAAK,WAAW,QAAQ;AAC3B,iBAAS;AAAA,MACV;AACA,UAAI,aAAc,MAAK,eAAe,aAAa;AAEnD,WAAK,OAAO,YAAY,cAAc,MAAM,MAAM,SAAS,QAAQ,MAAM,IAAI;AAC7E,UAAI,SAAS,WAAW,KAAK,QAAQ;AAEpC,iBAAS,KAAK,OAAO,gBAAgB,SAAS,IAAI;AAAA,MACnD;AACA,aAAO,KAAK,OAAO,SAAS,cAAc,SAAS,QAAQ,MAAM,IAAI;AACrE,UAAI,SAAS,WAAW,KAAK,QAAQ;AAEpC,iBAAS,KAAK,OAAO,gBAAgB,SAAS,IAAI;AAAA,MACnD;AAEA,UAAI,KAAK,OAAO,aAAa;AAC5B,YAAI,KAAK,OAAO,iBACd,GAAC,aAAQ,KAAK,IAAI,OAAO,CAAC,MAAzB,mBAA4B,eAAY,aAAQ,KAAK,IAAI,OAAO,CAAC,EAAE,aAA3B,mBAAqC,QAAO,eAAe;AAErG,kBAAQ,KAAK,WAAW;AACxB,kBAAQ,WAAW;AACnB,eAAK,OAAO,YAAY,aAAa,MAAM,MAAM,SAAS,QAAQ,IAAI;AAGtE,cAAI,UAAU,OAAO,MAAM,GAAG;AAC7B,mBAAO,QAAQ,UAAU,qBAAqB;AAAA,UAC/C,OAAO;AACN,iBAAK,OAAO,SAAS,iBAAiB,SAAS,QAAQ,IAAI;AAAA,UAC5D;AACA,cAAI,QAAQ,UAAU,cAAc,EAAG,MAAK,OAAO,IAAI,iBAAiB,OAAO;AAG/E,cAAI,KAAK,mBAAmB,sBAAsB,UAAU,OAAO,KAAK,GAAG;AAE1E,mBAAO,eAAe,cAAc;AAEpC,gBAAI,QAAQ,UAAU,qBAAqB,KAAK,OAAO,UAAU,kBAAkB,GAAG;AAErF,kBAAI,CAAC,QAAQ,UAAU,qBAAqB,EAAE,QAAQ;AAErD,wBAAQ,UAAU,qBAAqB,EAAE,SAAS;AAAA,cACnD;AAAA,YACD;AAAA,UACD;AAAA,QACD;AAAA,MACD;AACA,aAAO;AAAA,IACR;AAAA;AAAA;AAAA,IAGA,aAAa,gBAAgB,SAAS,SAAS;AAC9C,UAAI,eAAe,mCAAS;AAC5B,UAAI,SAAS,mCAAS;AACtB,UAAI,CAAC,gBAAgB,KAAK,OAAO,OAAO,GAAI,gBAAe,KAAK,OAAO;AACvE,YAAM,WAAW,KAAK,OAAO,IAAI,MAAM,IAAI,cAAc;AACzD,UAAI,OAAO,KAAK,OAAO,IAAI,cAAc,QAAQ;AACjD,UAAI,WAAW,OAAW,UAAS,KAAK,OAAO,gBAAgB,SAAS,IAAI;AAC5E,UAAI,KAAK,WAAW,QAAQ;AAC3B,iBAAS;AAAA,MACV;AACA,UAAI,aAAc,MAAK,eAAe,aAAa;AAEnD,WAAK,OAAO,cAAc,MAAM,SAAS,MAAM;AAE/C,WAAK,OAAO,YAAY,cAAc,MAAM,MAAM,SAAS,QAAQ,MAAM,IAAI;AAC7E,UAAI,SAAS,WAAW,KAAK,QAAQ;AAEpC,iBAAS,KAAK,OAAO,gBAAgB,SAAS,IAAI;AAAA,MACnD;AACA,aAAO,KAAK,OAAO,SAAS,cAAc,SAAS,QAAQ,MAAM,IAAI;AACrE,UAAI,SAAS,WAAW,KAAK,QAAQ;AAEpC,iBAAS,KAAK,OAAO,gBAAgB,SAAS,IAAI;AAClD,aAAK,OAAO,MAAM,sBAAsB;AAAA,MACzC;AACA,UAAI,CAAC,KAAM,QAAO;AAElB,UAAI,QAAQ;AACZ,UAAI,QAAQ,SAAS;AACpB,eAAO;AAAA,MACR;AAEA,UAAI,aAAc,UAAS,WAAW,KAAK,OAAO,IAAI,WAAW,IAAI,YAAY,EAAE,IAAI;AACvF,WAAK,OAAO,QAAQ,QAAQ,SAAS,KAAK,MAAM,GAAG,MAAM,GAAG,KAAK,EAAE;AAEnE,UAAI,CAAC,KAAK,OAAO,YAAY,OAAO,MAAM,MAAM,SAAS,QAAQ,IAAI,GAAG;AACvE,eAAO;AAAA,MACR;AACA,UAAI,CAAC,KAAK,OAAO,YAAY,WAAW,MAAM,MAAM,SAAS,QAAQ,IAAI,KACxE,CAAC,KAAK,OAAO,SAAS,WAAW,SAAS,QAAQ,IAAI,GAAG;AACzD,eAAO;AAAA,MACR;AAEA,UAAI,KAAK,mBAAmB,QAAW;AACtC,aAAK,iBAAkB,KAAK,aAAa;AAAA,MAC1C;AAEA,UAAI,SAA0C;AAC9C,UAAI,CAAC,UAAU,OAAO,SAAS;AAC9B,aAAK,OAAO,aAAa,YAAY;AACrC,aAAK,OAAO,IAAI,WAAW;AAC3B,eAAO;AAAA,MACR;AAEA,UAAI,CAAC,gBAAgB,IAAI,KAAK,EAAE,EAAG,MAAK,OAAO,aAAa;AAE5D,eAAS,KAAK,WAAW,QAAQ,SAAS,IAAI;AAG9C,UAAI,WAAW,OAAO;AACrB,aAAK,OAAO,YAAY,YAAY,MAAM,MAAM,QAAQ,SAAS,IAAI;AACrE,eAAO;AAAA,MACR;AAEA,WAAK,OAAO,YAAY,0BAA0B,MAAM,MAAM,SAAS,QAAQ,IAAI;AACnF,WAAK,OAAO,SAAS,0BAA0B,SAAS,QAAQ,IAAI;AACpE,aAAO;AAAA,IACR;AAAA,IACA,WAAW,QAAQ,SAAS,MAAM;AACjC,UAAI,SAAqC;AAGzC,UAAI,YAAY,KAAK,OAAO,SAAS,mBAAmB,QAAQ,SAAS,IAAI;AAC7E,UAAI,cAAc,OAAO;AACxB,aAAK,OAAO,aAAa,QAAQ;AACjC,aAAK,OAAO,IAAI,SAAS,OAAO;AAChC,YAAI,KAAK,cAAc;AACtB,eAAK,OAAO,MAAM,SAAS,SAAS,IAAI;AAAA,QACzC;AACA,eAAO;AAAA,MACR;AAGA,UAAI,CAAC,OAAO,YAAY,MAAM,IAAI,GAAG;AACpC,YAAI,KAAK,cAAc;AACtB,eAAK,OAAO,MAAM,SAAS,SAAS,IAAI;AAAA,QACzC;AACA,eAAO;AAAA,MACR;AACA,kBAAY,KAAK,OAAO,YAAY,eAAe,MAAM,MAAM,QAAQ,SAAS,IAAI;AACpF,UAAI,cAAc,OAAO;AACxB,aAAK,OAAO,IAAI,WAAW,MAAM;AACjC,eAAO;AAAA,MACR;AAGA,UAAI,WAAW,KAAK;AAGpB,UAAI,QAAQ,UAAU,qBAAqB,GAAG;AAC7C,YAAI,KAAK,mBAAmB,sBAAsB,WAAW,QAAQ,UAAU,qBAAqB,EAAE,QAAQ;AAC7G,qBAAW;AAAA,QACZ,WAAW,QAAQ,UAAU,qBAAqB,EAAE,WAAW,QAAQ;AAEtE,iBAAO,QAAQ,UAAU,qBAAqB;AAC9C,iBAAO;AAAA,QACR;AAAA,MACD;AAGA,UAAI,KAAK,MAAM;AACd,YAAI,OAAO,QAAQ,QAAQ,OAAO;AACjC,eAAK,OAAO,IAAI,WAAW,QAAQ,QAAQ;AAC3C,iBAAO;AAAA,QACR;AAAA,MACD;AAIA,YAAM,aAAa,CAAC,IAAI,GAAG,MAAM,MAAM,KAAK,MAAM,MAAM,GAAG,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC;AACvF,UAAI,aAAa,MAAM;AACtB,mBAAW,KAAK,MAAM,WAAW,MAAM,GAAG;AAE1C,YAAI,CAAC,KAAK,gBAAgB;AACzB,qBAAW,KAAK,MAAM,WAAW,WAAW,QAAQ,OAAO,WAAW,CAAC,CAAC;AAAA,QACzE;AACA,YAAI,CAAC,KAAK,eAAe;AACxB,qBAAW,KAAK,MAAM,WAAW,WAAW,CAAC,OAAO,OAAO,UAAU,CAAC,CAAC;AAAA,QACxE;AACA,mBAAW,KAAK,IAAI,UAAU,GAAG;AAAA,MAClC;AACA,iBAAW,KAAK,OAAO,SAAS,YAAY,QAAQ,SAAS,MAAM,QAAQ;AAI3E,UAAI,cAAc,KAAK,OAAO,OAAO,GAAG;AACxC,UAAI,gBAAgB,IAAK,eAAc,KAAK,OAAO,OAAO,GAAG;AAC7D,UAAI,aAAa,QAAQ,cAAc,UAAU;AAChD,aAAK,OAAO,aAAa,QAAQ;AACjC,aAAK,OAAO,IAAI,SAAS,OAAO;AAChC,YAAI,aAAa,KAAK;AACrB,eAAK,OAAO,KAAK,kFAAkF;AAAA,QACpG;AACA,iBAAS;AACT,aAAK,OAAO,aAAa;AAAA,MAC1B;AAGA,UAAI,WAAW,OAAO;AACrB,YAAI,KAAK,UAAU;AAClB,cAAI,OAAO,KAAK;AAChB,cAAI,MAAM,QAAQ,IAAI,GAAG;AAExB,gBAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,GAAG;AACnC,qBAAO,KAAK,OAAO,OAAO,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;AAAA,YACnD,OAAO;AACN,qBAAO,KAAK,OAAO,OAAO,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC;AAAA,YAC/C;AAAA,UACD;AACA,iBAAO,KAAK,MAAM,IAAI;AAEtB,cAAI,aAAyC;AAC7C,cAAI;AACJ,eAAK,IAAI,GAAG,IAAI,QAAQ,OAAO,MAAM,QAAQ,IAAI,KAAK;AACrD,iBAAK,MAAM,IAAI;AACf,gBAAI,KAAK,QAAQ,KAAM,MAAK,UAAU;AACtC,yBAAa,KAAK,QAAQ,QAAQ,SAAS,IAAI;AAC/C,gBAAI,eAAe,MAAO;AAC1B,qBAAU,cAAc;AAExB,gBAAI,MAAM,EAAG,MAAK,SAAS;AAC3B,gBAAI,OAAO,YAAY;AACtB;AACA;AAAA,YACD;AAAA,UACD;AACA,eAAK,SAAS;AACd,cAAI,MAAM,EAAG,QAAO;AACpB,eAAK,OAAO,IAAI,aAAa,QAAQ,CAAC;AAAA,QACvC,OAAO;AACN,mBAAS,KAAK,QAAQ,QAAQ,SAAS,IAAI;AAAA,QAC5C;AAAA,MACD;AAEA,UAAI,KAAK,aAAa,SAAU,QAAO,YAAY,MAAM,QAAQ,OAAO;AAExE,UAAI,KAAK,cAAc;AACtB,aAAK,OAAO,MAAM,SAAS,SAAS,IAAI;AAAA,MACzC;AAGA,UAAI,WAAW,OAAO;AAErB,eAAO,QAAQ,UAAU,qBAAqB;AAC9C,eAAO;AAAA,MACR;AAEA,UAAI,KAAK,KAAM,MAAK,OAAO,IAAI,OAAO;AAEtC,WAAK,OAAO,YAAY,sBAAsB,MAAM,MAAM,QAAQ,SAAS,IAAI;AAC/E,WAAK,OAAO,SAAS,sBAAsB,QAAQ,SAAS,IAAI;AAEhE,aAAO;AAAA,IACR;AAAA,IACA,QAAQ,QAAQ,SAAS,gBAAgB,UAAU,aAAa,QAAQ;AACvE,UAAI,SAA4C;AAChD,YAAM,OAAO,KAAK,IAAI,cAAc,cAAc;AAElD,UAAI,CAAC,eAAe,CAAC,OAAQ,MAAK,OAAO,cAAc,MAAM,SAAS,MAAM;AAC5E,UAAI,YAA8B;AAClC,UAAI,CAAC,SAAU,YAAW;AAE1B,UAAI,KAAK,mBAAmB,QAAW;AACtC,aAAK,iBAAkB,KAAK,aAAa;AAAA,MAC1C;AAEA,UAAI,QAAQ;AACX,oBAAY,KAAK,OAAO,YAAY,UAAU,UAAU,CAAC,GAAG,QAAQ,SAAS,IAAI;AAGjF,cAAM,eAAe,CAAC,CAAC,OAAO,UAAU,YAAY;AACpD,YAAI,gBAAgB,SAAS,kBAAkB,SAAS,mBAAmB,oBAAoB;AAC9F,iBAAO,YAAY,SAAS,gBAAgB,SAAS,IAAI;AACzD,cAAI,CAAC,QAAQ,UAAU,qBAAqB,KAAK,QAAQ,UAAU,qBAAqB,EAAE,WAAY,GAAG;AACxG,mBAAO,UAAU,SAAS,cAAc,EAAE,WAAW;AAAA,UACtD;AAAA,QACD;AAEA,YAAI,CAAC,WAAW;AACf,cAAI,cAAc,MAAO,MAAK,OAAO,IAAI,SAAS,MAAM;AACxD,iBAAO;AAAA,QACR;AAGA,YAAI,CAAC,UAAU,CAAC,aAAa;AAC5B,sBAAY,KAAK,OAAO,SAAS,UAAU,QAAQ,SAAS,IAAI;AAChE,cAAI,CAAC,WAAW;AACf,gBAAI,cAAc,MAAO,MAAK,OAAO,IAAI,SAAS,MAAM;AAExD,gBAAI,cAAc,GAAG;AACpB,qBAAO;AAAA,YACR;AAAA,UACD;AACA,cAAI,CAAC,KAAK,OAAO,SAAS,eAAe,QAAQ,SAAS,IAAI,GAAG;AAChE,mBAAO;AAAA,UACR;AAAA,QACD,WAAW,eAAe,CAAC,SAAS,MAAM;AACzC,sBAAY,KAAK,OAAO,SAAS,mBAAmB,QAAQ,SAAS,QAAQ;AAAA,QAC9E;AAEA,YAAI,cAAc,GAAG;AACpB,mBAAS;AAAA,QACV,WAAW,CAAC,WAAW;AACtB,cAAI,cAAc,MAAO,MAAK,OAAO,IAAI,SAAS,MAAM;AACxD,iBAAO;AAAA,QACR;AAAA,MACD;AAEA,UAAI,QAAQ;AACX,YAAI,eAAe;AAEnB,iBAAS,KAAK,UAAU,SAAS,QAAQ,QAAQ;AACjD,YAAI,UAAU,SAAS,OAAO,IAAI;AACjC,mBAAS,OAAO;AAAA,QACjB;AACA,aAAK,UAAU,WAAW,MAAM,CAAC,OAAO,SAAS;AAChD,mBAAS,KAAK,OAAO,OAAO,QAAQ,QAAQ,SAAS,IAAI;AACzD,cAAI,EAAE,UAAU,WAAW,GAAI,QAAO;AACtC,yBAAe;AAAA,QAChB,WAAW,WAAW,SAAS,OAAO,cAAc,aAAa;AAChE,eAAK,OAAO,IAAI,SAAS,MAAM;AAAA,QAChC;AACA,YAAI,WAAW,SAAS,WAAW,MAAM;AACxC,iBAAO;AAAA,QACR;AACA,YAAI,SAAS,UAAU,CAAC,OAAO,SAAS;AACvC,eAAK,OAAO,MAAM,SAAS,QAAQ,QAAQ,SAAS,IAAI;AAAA,QACzD;AACA,YAAI,SAAS,QAAQ,CAAC,OAAO,SAAS;AACrC,gBAAM,IAAI,OAAO,KAAK,KAAK,MAAM,OAAO,QAAQ,SAAS,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC,CAAC,CAAC;AACpF,cAAI,CAAC,GAAG;AACP,iBAAK,OAAO,IAAI,SAAS,MAAM;AAC/B,mBAAO;AAAA,UACR;AACA,eAAK,OAAO,IAAI,SAAS,QAAQ,OAAO,SAAS;AACjD,yBAAe;AAAA,QAChB;AACA,YAAI,SAAS,QAAQ;AACpB,cAAI,CAAC,OAAO,QAAQ;AACnB,mBAAO,UAAU,SAAS,QAAQ,SAAS,IAAI;AAC/C,mBAAO,iBAAkB;AAAA,UAC1B,WAAW,CAAC,aAAa;AACxB,gBAAI,OAAO,WAAW,SAAS,QAAQ;AACtC,mBAAK,OAAO,IAAI,SAAS,QAAQ,OAAO,MAAM;AAAA,YAC/C,OAAO;AACN,mBAAK,OAAO,IAAI,SAAS,MAAM;AAAA,YAChC;AAAA,UACD;AACA,yBAAe;AAAA,QAChB;AACA,YAAI,SAAS,aAAa;AACzB,cAAI,OAAO,UAAU,SAAS,aAAa,SAAS,IAAI,GAAG;AAC1D,mBAAO,iBAAkB;AACzB,2BAAe;AAAA,UAChB;AAAA,QACD;AACA,YAAI,SAAS,gBAAgB;AAC5B,cAAI,OAAO,YAAY,SAAS,gBAAgB,SAAS,IAAI,GAAG;AAC/D,2BAAe;AAAA,UAChB;AAAA,QACD;AACA,YAAI,SAAS,eAAe;AAC3B,cAAI,OAAO,KAAK,iBAAiB,SAAS,eAAe,SAAS,IAAI,GAAG;AACxE,2BAAe;AAAA,UAChB;AAAA,QACD;AACA,YAAI,SAAS,eAAe;AAC3B,cAAI,KAAK,OAAO,MAAM,iBAAiB,SAAS,eAAe,SAAS,IAAI,GAAG;AAC9E,2BAAe;AAAA,UAChB;AAAA,QACD;AAEA,oBAAY,KAAK,OAAO,YAAY,OAAO,UAAU,CAAC,GAAG,QAAQ,SAAS,IAAI;AAC9E,YAAI,CAAC,UAAU,CAAC,aAAa;AAC5B,eAAK,OAAO,SAAS,OAAO,QAAQ,SAAS,IAAI;AAAA,QAClD;AACA,YAAI,CAAC,aAAa,CAAC,cAAc;AAChC,cAAI,cAAc,MAAO,MAAK,OAAO,IAAI,SAAS,MAAM;AACxD,iBAAO;AAAA,QACR;AAAA,MACD;AAGA,UAAI,SAAS,MAAM;AAClB,aAAK,QAAQ,SAAS,SAAS,MAAM,SAAS,MAAM,aAAa,IAAI;AAAA,MACtE;AAGA,UAAI,QAAQ,UAAU,qBAAqB,GAAG;AAC7C,gBAAQ,UAAU,qBAAqB,EAAE,SAAS,KAAK,OAAO;AAAA,MAC/D;AAGA,UAAI,SAAS,eAAe,UAAU,OAAO,KAAK,GAAG;AACpD,mBAAW,aAAa,SAAS,aAAa;AAE7C,cAAI,CAAC,KAAK,YAAY,KAAK,SAAS;AAKnC,gBAAI,EAAE,UAAU,UAAU,CAAC,OAAO,OAAO,KAAK,EAAE,SAAS,UAAU,MAAM,KAAK,OAAO,QAAQ,KAAK,IAAI,IAAI;AACzG,oBAAM,eAAe,KAAK,OAAO,UAAU,UAAU,OAAO,MAAM,GAAG;AACrE,kBAAI,OAAO,UAAU,WAAW,eAAe,KAAK,OAAO,aAAa,eAAe,GAAG,GAAG,GAAG;AAC/F,qBAAK,QAAQ,QAAQ,SAAS,MAAM,WAAW,MAAM,MAAM;AAAA,cAC5D;AAAA,YACD;AAAA,UACD;AAAA,QACD;AAAA,MACD;AACA,UAAI,KAAK,cAAc,QAAQ,IAAI;AAClC,gBAAQ,aAAa,KAAK,eAAe,OAAO,OAAO,KAAK,IAAI,KAAK,KAAK,UAAU;AAAA,MACrF;AAEA,aAAO;AAAA,IACR;AAAA,IACA,UAAU,QAAQ,QAAQ,MAAM,kBAAkB;AAEjD,UAAI,OAAO,SAAS,UAAU;AAC7B,eAAO,KAAK,IAAI,cAAc,IAAI;AAAA,MACnC,WAAW,OAAO,SAAS,UAAU;AACpC,eAAO;AAAA,UACN,WAAW;AAAA,UACX,MAAM;AAAA,UACN,UAAU;AAAA,UACV,UAAU;AAAA,UACV,OAAO,CAAC;AAAA,QACT;AAAA,MACD;AAGA,UAAI,CAAC,OAAO,YAAY,MAAM,IAAI,GAAG;AACpC,eAAO;AAAA,MACR;AAGA,UAAI,KAAK,MAAM;AACd,eAAO;AAAA,MACR;AAGA,UAAI,KAAK,gBAAgB;AACxB,eAAO,KAAK,eAAe,KAAK,KAAK,QAAQ,QAAQ,MAAM;AAAA,MAC5D;AAGA,UAAI,KAAK,WAAW,SAAS;AAC5B,eAAO,OAAO;AAAA,MACf;AAGA,UAAI,KAAK,QAAQ;AAChB,eAAO,KAAK;AAAA,MACb;AAGA,UAAI,KAAK,mBAAmB,sBAAsB,KAAK,SAAS,YAAY,OAAO,QAAQ,OAAO,GAAG;AACpG,eAAO;AAAA,MACR;AAGA,UAAI,OAAO,UAAU,qBAAqB,KAAM,WAAW,OAAO,UAAU,qBAAqB,EAAE,QAAS;AAC3G,eAAO,OAAO,UAAU,qBAAqB,EAAE;AAAA,MAChD;AAGA,UAAI,CAAC,KAAK,SAAU,MAAK,WAAW;AAEpC,UAAI,CAAC,KAAK,KAAM,MAAK,OAAO;AAC5B,YAAM,OAAO,KAAK;AAGlB,UAAI,YAAmC,KAAK;AAC5C,UAAI,KAAK,mBAAmB;AAC3B,oBAAY,KAAK,kBAAkB,KAAK,KAAK,QAAQ,QAAQ,QAAQ,IAAI;AAAA,MAC1E;AACA,UAAI,CAAC,WAAW;AACf,eAAO,cAAc,IAAI,SAAY;AAAA,MACtC;AACA,kBAAY,KAAK,OAAO,cAAc,WAAW,CAAC;AAGlD,UAAI,SAAS,KAAK,YAAY;AAC9B,UAAI,CAAC,QAAQ;AAGZ,YAAI,aAAa,OAAO,QAAQ,UAAU,KAAK,IAAI;AAGnD,uBAAe;AAGf,YAAI,OAAO,UAAU,aAAa,GAAG;AAEpC,yBAAe;AAEf,wBAAc;AAAA,QACf,OAAO;AAEN,yBAAe;AAAA,QAChB;AAGA,YAAI,KAAK,cAAc,GAAG;AAEzB,yBAAe;AAAA,QAChB,WAAW,KAAK,cAAc,GAAG;AAEhC,yBAAe;AAAA,QAChB;AAGA,qBAAa,KAAK,OAAO,cAAc,YAAY,GAAG,GAAG;AAKzD,YAAI,aAAa,GAAG;AACnB,mBAAS,KAAK,OAAO,aAAa,YAAY,GAAG;AAAA,QAClD;AAAA,MACD;AAEA,UAAI,UAAU,KAAK,OAAO,SAAS,eAAe,QAAQ,MAAM,IAAI,GAAG;AACtE,eAAO,eAAe,IAAI,EAAE,OAAO;AAAA,MACpC;AAGA,UAAI,WAAW;AACd,oBAAY,KAAK,OAAO,SAAS,aAAa,QAAQ,QAAQ,MAAM,SAAS;AAC7E,YAAI,aAAa,KAAK,mBAAmB;AACxC,uBAAa,KAAK;AAAA,QACnB;AAAA,MACD;AACA,UAAI,CAAC,UAAW,QAAO;AACvB,kBAAY,KAAK,OAAO,cAAc,WAAW,CAAC;AAGlD,UAAI,QAAQ,OAAO;AACnB,YAAM,WAAW,KAAK,6BAA6B,WAAW,SAAS;AACvE,YAAM,WAAW,KAAK,6BAA6B,WAAW,SAAS;AAEvE,YAAM,aAAa,KAAK,aAAa;AACrC,YAAM,UAA0B,KAAK,0BAA0B,aAAa,QAAQ;AACpF,YAAM,UAA0B,KAAK,0BAA0B,aAAa,QAAQ;AAEpF,UAAI,SAAS,SAAS,QAAQ,OAAO;AACrC,UAAI,UAAU,SAAS,QAAQ,OAAO;AAGtC,UAAK,YAAY,SAAS,SAAS,UAAU,SAAS,KAAO,YAAY,SAAS,SAAS,UAAU,aAAa,GAAI;AACrH,aAAK,OAAO,MAAM,yBAAyB;AAC3C,mBAAW;AACX,kBAAU,KAAK,OAAO,cAAc,SAAS,GAAG,IAAI;AAAA,MACrD;AAKA,UAAI,QAAQ;AACX,aAAK,kBAAkB;AACvB,aAAK,kBAAkB;AACvB,iBAAS;AACT,YAAI,CAAC,iBAAkB,MAAK,OAAO,IAAI,SAAS,MAAM;AAAA,MACvD;AAEA,UAAI,KAAK,iBAAiB;AACzB,aAAK,OAAO,MAAM,iCAAiC;AACnD,iBAAS,SAAS,QAAQ,SAAS,IAAI;AAAA,MACxC;AAEA,UAAI,KAAK,iBAAiB;AACzB,aAAK,OAAO,MAAM,iCAAiC;AACnD,kBAAU,OAAO,QAAQ,SAAS,IAAI;AAAA,MACvC;AAIA,UAAI,UAAU,OAAO,WAAW,KAAK;AACpC,iBAAS,KAAK,OAAO,cAAc,KAAK,MAAM,SAAS,CAAC,IAAI,KAAK,CAAC;AAElE,kBAAU,KAAK,OAAO,cAAc,KAAK,MAAM,UAAU,CAAC,IAAI,KAAK,CAAC;AAAA,MACrE;AAGA,UAAI,KAAK,gBAAgB,YAAY,OAAO;AAC3C,kBAAU,KAAK,OAAO,cAAc,KAAK,MAAM,UAAU,CAAC,GAAG,CAAC;AAAA,MAC/D;AAIA,UAAI,SAAS,QAAQ;AACrB,eAAS,KAAK,MAAM,SAAS,CAAC;AAC9B,gBAAU;AACV,gBAAU;AACV,gBAAU;AACV,eAAS,KAAK,MAAM,SAAS,OAAO;AACpC,eAAS,KAAK,OAAO,cAAc,KAAK,MAAM,SAAS,EAAE,GAAG,GAAG,GAAG;AAClE,gBAAU;AAGV,UAAI,SAAS,SAAS,OAAO,QAAQ,IAAI,GAAG;AAC3C,kBAAU,KAAK,MAAM,SAAS,CAAC;AAAA,MAChC;AAIA,iBAAW,cAAc,OAAO,OAAO;AACtC,cAAM,UAAU,KAAK,OAAO,IAAI,iBAAiB,MAAM,UAAU;AACjE,YAAI,UAAU,GAAG;AAEhB,oBAAU;AACV,mBAAS,KAAK,MAAM,SAAS,EAAE;AAAA,QAChC;AACA,YAAI,UAAU,GAAG;AAEhB,oBAAU;AACV,mBAAS,KAAK,MAAM,SAAS,EAAE;AAAA,QAChC;AAAA,MACD;AACA,YAAM,eAAe,OAAO,iBAAiB,IAAI;AACjD,UAAI,eAAe,GAAG;AACrB,YAAI,CAAC,iBAAkB,MAAK,OAAO,IAAI,mBAAmB,MAAM;AAAA,MACjE;AACA,UAAI,eAAe,GAAG;AACrB,YAAI,CAAC,iBAAkB,MAAK,OAAO,IAAI,aAAa,MAAM;AAAA,MAC3D;AAIA,UAAI,WAAW,EAAG,QAAO;AAGzB,UAAI,SAAS,GAAG;AACf,kBAAU,KAAK,OAAO,OAAO,KAAK,GAAG;AACrC,iBAAS,KAAK,MAAM,SAAS,GAAG;AAAA,MACjC;AAGA,aAAO,KAAK,MAAM,MAAM;AAAA,IACzB;AAAA,EACD;AACD;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pkmn/mods",
3
- "version": "0.9.36",
3
+ "version": "0.9.37",
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)",
@@ -121,11 +121,11 @@
121
121
  "build"
122
122
  ],
123
123
  "dependencies": {
124
- "@pkmn/dex-types": "^0.9.36"
124
+ "@pkmn/dex-types": "^0.9.37"
125
125
  },
126
126
  "devDependencies": {
127
- "@pkmn/dex": "^0.9.36",
128
- "@pkmn/sim": "^0.9.36"
127
+ "@pkmn/dex": "^0.9.37",
128
+ "@pkmn/sim": "^0.9.37"
129
129
  },
130
130
  "scripts": {
131
131
  "lint": "eslint --cache src",