{ "version": 3, "sources": ["../../sim/battle-actions.ts"], "sourcesContent": ["import { Dex, toID } from './dex';\n\nconst CHOOSABLE_TARGETS = new Set(['normal', 'any', 'adjacentAlly', 'adjacentAllyOrSelf', 'adjacentFoe']);\n\nexport class BattleActions {\n\tbattle: Battle;\n\tdex: ModdedDex;\n\n\treadonly MAX_MOVES: { readonly [k: string]: string } = {\n\t\tFlying: 'Max Airstream',\n\t\tDark: 'Max Darkness',\n\t\tFire: 'Max Flare',\n\t\tBug: 'Max Flutterby',\n\t\tWater: 'Max Geyser',\n\t\tStatus: 'Max Guard',\n\t\tIce: 'Max Hailstorm',\n\t\tFighting: 'Max Knuckle',\n\t\tElectric: 'Max Lightning',\n\t\tPsychic: 'Max Mindstorm',\n\t\tPoison: 'Max Ooze',\n\t\tGrass: 'Max Overgrowth',\n\t\tGhost: 'Max Phantasm',\n\t\tGround: 'Max Quake',\n\t\tRock: 'Max Rockfall',\n\t\tFairy: 'Max Starfall',\n\t\tSteel: 'Max Steelspike',\n\t\tNormal: 'Max Strike',\n\t\tDragon: 'Max Wyrmwind',\n\t};\n\n\treadonly Z_MOVES: { readonly [k: string]: string } = {\n\t\tPoison: \"Acid Downpour\",\n\t\tFighting: \"All-Out Pummeling\",\n\t\tDark: \"Black Hole Eclipse\",\n\t\tGrass: \"Bloom Doom\",\n\t\tNormal: \"Breakneck Blitz\",\n\t\tRock: \"Continental Crush\",\n\t\tSteel: \"Corkscrew Crash\",\n\t\tDragon: \"Devastating Drake\",\n\t\tElectric: \"Gigavolt Havoc\",\n\t\tWater: \"Hydro Vortex\",\n\t\tFire: \"Inferno Overdrive\",\n\t\tGhost: \"Never-Ending Nightmare\",\n\t\tBug: \"Savage Spin-Out\",\n\t\tPsychic: \"Shattered Psyche\",\n\t\tIce: \"Subzero Slammer\",\n\t\tFlying: \"Supersonic Skystrike\",\n\t\tGround: \"Tectonic Rage\",\n\t\tFairy: \"Twinkle Tackle\",\n\t};\n\n\tconstructor(battle: Battle) {\n\t\tthis.battle = battle;\n\t\tthis.dex = battle.dex;\n\t\tif (this.dex.data.Scripts.actions) Object.assign(this, this.dex.data.Scripts.actions);\n\t\tif (battle.format.actions) Object.assign(this, battle.format.actions);\n\t}\n\n\t// #region SWITCH\n\t// ==================================================================\n\n\tswitchIn(pokemon: Pokemon, pos: number, sourceEffect: Effect | null = null, isDrag?: boolean) {\n\t\tif (!pokemon || pokemon.isActive) {\n\t\t\tthis.battle.hint(\"A switch failed because the Pok\u00E9mon trying to switch in is already in.\");\n\t\t\treturn false;\n\t\t}\n\n\t\tconst side = pokemon.side;\n\t\tif (pos >= side.active.length) {\n\t\t\tthrow new Error(`Invalid switch position ${pos} / ${side.active.length}`);\n\t\t}\n\t\tconst oldActive = side.active[pos];\n\t\tconst unfaintedActive = oldActive?.hp ? oldActive : null;\n\t\tif (unfaintedActive) {\n\t\t\toldActive.beingCalledBack = true;\n\t\t\tlet switchCopyFlag: 'copyvolatile' | 'shedtail' | boolean = false;\n\t\t\tif (sourceEffect && typeof (sourceEffect as Move).selfSwitch === 'string') {\n\t\t\t\tswitchCopyFlag = (sourceEffect as Move).selfSwitch!;\n\t\t\t}\n\t\t\tif (!oldActive.skipBeforeSwitchOutEventFlag && !isDrag) {\n\t\t\t\tthis.battle.runEvent('BeforeSwitchOut', oldActive);\n\t\t\t\tif (this.battle.gen >= 5) {\n\t\t\t\t\tthis.battle.eachEvent('Update');\n\t\t\t\t}\n\t\t\t}\n\t\t\toldActive.skipBeforeSwitchOutEventFlag = false;\n\t\t\tif (!this.battle.runEvent('SwitchOut', oldActive)) {\n\t\t\t\t// Warning: DO NOT interrupt a switch-out if you just want to trap a pokemon.\n\t\t\t\t// To trap a pokemon and prevent it from switching out, (e.g. Mean Look, Magnet Pull)\n\t\t\t\t// use the 'trapped' flag instead.\n\n\t\t\t\t// Note: Nothing in the real games can interrupt a switch-out (except Pursuit KOing,\n\t\t\t\t// which is handled elsewhere); this is just for custom formats.\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (!oldActive.hp) {\n\t\t\t\t// a pokemon fainted from Pursuit before it could switch\n\t\t\t\treturn 'pursuitfaint';\n\t\t\t}\n\n\t\t\t// will definitely switch out at this point\n\n\t\t\toldActive.illusion = null;\n\t\t\tthis.battle.singleEvent('End', oldActive.getAbility(), oldActive.abilityState, oldActive);\n\t\t\tthis.battle.singleEvent('End', oldActive.getItem(), oldActive.itemState, oldActive);\n\n\t\t\t// if a pokemon is forced out by Whirlwind/etc or Eject Button/Pack, it can't use its chosen move\n\t\t\tthis.battle.queue.cancelAction(oldActive);\n\n\t\t\tlet newMove = null;\n\t\t\tif (this.battle.gen === 4 && sourceEffect) {\n\t\t\t\tnewMove = oldActive.lastMove;\n\t\t\t}\n\t\t\tif (switchCopyFlag) {\n\t\t\t\tpokemon.copyVolatileFrom(oldActive, switchCopyFlag);\n\t\t\t}\n\t\t\tif (newMove) pokemon.lastMove = newMove;\n\t\t\toldActive.clearVolatile();\n\t\t}\n\t\tif (oldActive) {\n\t\t\toldActive.isActive = false;\n\t\t\toldActive.isStarted = false;\n\t\t\toldActive.usedItemThisTurn = false;\n\t\t\toldActive.statsRaisedThisTurn = false;\n\t\t\toldActive.statsLoweredThisTurn = false;\n\t\t\toldActive.position = pokemon.position;\n\t\t\tpokemon.position = pos;\n\t\t\tside.pokemon[pokemon.position] = pokemon;\n\t\t\tside.pokemon[oldActive.position] = oldActive;\n\t\t}\n\t\tpokemon.isActive = true;\n\t\tside.active[pos] = pokemon;\n\t\tpokemon.activeTurns = 0;\n\t\tpokemon.activeMoveActions = 0;\n\t\tfor (const moveSlot of pokemon.moveSlots) {\n\t\t\tmoveSlot.used = false;\n\t\t}\n\t\tpokemon.abilityState.effectOrder = this.battle.effectOrder++;\n\t\tpokemon.itemState.effectOrder = this.battle.effectOrder++;\n\t\tthis.battle.runEvent('BeforeSwitchIn', pokemon);\n\t\tif (sourceEffect) {\n\t\t\tthis.battle.add(isDrag ? 'drag' : 'switch', pokemon, pokemon.getFullDetails, `[from] ${sourceEffect}`);\n\t\t} else {\n\t\t\tthis.battle.add(isDrag ? 'drag' : 'switch', pokemon, pokemon.getFullDetails);\n\t\t}\n\t\tif (isDrag && this.battle.gen === 2) pokemon.draggedIn = this.battle.turn;\n\t\tpokemon.previouslySwitchedIn++;\n\n\t\tif (isDrag && this.battle.gen >= 5) {\n\t\t\t// runSwitch happens immediately so that Mold Breaker can make hazards bypass Clear Body and Levitate\n\t\t\tthis.runSwitch(pokemon);\n\t\t} else {\n\t\t\tthis.battle.queue.insertChoice({ choice: 'runSwitch', pokemon });\n\t\t}\n\n\t\treturn true;\n\t}\n\tdragIn(side: Side, pos: number) {\n\t\tconst pokemon = this.battle.getRandomSwitchable(side);\n\t\tif (!pokemon || pokemon.isActive) return false;\n\t\tconst oldActive = side.active[pos];\n\t\tif (!oldActive) throw new Error(`nothing to drag out`);\n\t\tif (!oldActive.hp) return false;\n\n\t\tif (!this.battle.runEvent('DragOut', oldActive)) {\n\t\t\treturn false;\n\t\t}\n\t\tif (!this.switchIn(pokemon, pos, null, true)) return false;\n\t\treturn true;\n\t}\n\trunSwitch(pokemon: Pokemon) {\n\t\tconst switchersIn = [pokemon];\n\t\twhile (this.battle.queue.peek()?.choice === 'runSwitch') {\n\t\t\tconst nextSwitch = this.battle.queue.shift();\n\t\t\tswitchersIn.push(nextSwitch!.pokemon!);\n\t\t}\n\t\tconst allActive = this.battle.getAllActive(true);\n\t\tthis.battle.speedSort(allActive);\n\t\tthis.battle.speedOrder = allActive.map(a => a.side.n * a.battle.sides.length + a.position);\n\t\tthis.battle.fieldEvent('SwitchIn', switchersIn);\n\n\t\tfor (const poke of switchersIn) {\n\t\t\tif (!poke.hp) continue;\n\t\t\tpoke.isStarted = true;\n\t\t\tpoke.draggedIn = null;\n\t\t}\n\t\treturn true;\n\t}\n\n\t// #endregion\n\n\t// #region MOVES\n\t// ==================================================================\n\n\t/**\n\t * runMove is the \"outside\" move caller. It handles deducting PP,\n\t * flinching, full paralysis, etc. All the stuff up to and including\n\t * the \"POKEMON used MOVE\" message.\n\t *\n\t * For details of the difference between runMove and useMove, see\n\t * useMove's info.\n\t *\n\t * externalMove skips LockMove and PP deduction, mostly for use by\n\t * Dancer.\n\t */\n\trunMove(\n\t\tmoveOrMoveName: Move | string, pokemon: Pokemon, targetLoc: number,\n\t\toptions?: {\n\t\t\tsourceEffect?: Effect | null, zMove?: string, externalMove?: boolean,\n\t\t\tmaxMove?: string, originalTarget?: Pokemon,\n\t\t}\n\t) {\n\t\tpokemon.activeMoveActions++;\n\t\tconst zMove = options?.zMove;\n\t\tconst maxMove = options?.maxMove;\n\t\tconst externalMove = options?.externalMove;\n\t\tconst originalTarget = options?.originalTarget;\n\t\tlet sourceEffect = options?.sourceEffect;\n\t\tlet target = this.battle.getTarget(pokemon, maxMove || zMove || moveOrMoveName, targetLoc, originalTarget);\n\t\tlet baseMove = this.dex.getActiveMove(moveOrMoveName);\n\t\tconst priority = baseMove.priority;\n\t\tconst pranksterBoosted = baseMove.pranksterBoosted;\n\t\tif (baseMove.id !== 'struggle' && !zMove && !maxMove && !externalMove) {\n\t\t\tconst changedMove = this.battle.runEvent('OverrideAction', pokemon, target, baseMove);\n\t\t\tif (changedMove && changedMove !== true) {\n\t\t\t\tbaseMove = this.dex.getActiveMove(changedMove);\n\t\t\t\tbaseMove.priority = priority;\n\t\t\t\tif (pranksterBoosted) baseMove.pranksterBoosted = pranksterBoosted;\n\t\t\t\ttarget = this.battle.getRandomTarget(pokemon, baseMove);\n\t\t\t}\n\t\t}\n\t\tlet move = baseMove;\n\t\tif (zMove) {\n\t\t\tmove = this.getActiveZMove(baseMove, pokemon);\n\t\t} else if (maxMove) {\n\t\t\tmove = this.getActiveMaxMove(baseMove, pokemon);\n\t\t}\n\n\t\tmove.isExternal = externalMove;\n\n\t\tthis.battle.setActiveMove(move, pokemon, target);\n\n\t\t/* if (pokemon.moveThisTurn) {\n\t\t\t// THIS IS PURELY A SANITY CHECK\n\t\t\t// DO NOT TAKE ADVANTAGE OF THIS TO PREVENT A POKEMON FROM MOVING;\n\t\t\t// USE this.queue.cancelMove INSTEAD\n\t\t\tthis.battle.debug(`${pokemon.id} INCONSISTENT STATE, ALREADY MOVED: ${pokemon.moveThisTurn}`);\n\t\t\tthis.battle.clearActiveMove(true);\n\t\t\treturn;\n\t\t} */\n\t\tconst willTryMove = this.battle.runEvent('BeforeMove', pokemon, target, move);\n\t\tif (!willTryMove) {\n\t\t\tthis.battle.runEvent('MoveAborted', pokemon, target, move);\n\t\t\tthis.battle.clearActiveMove(true);\n\t\t\t// The event 'BeforeMove' could have returned false or null\n\t\t\t// false indicates that this counts as a move failing for the purpose of calculating Stomping Tantrum's base power\n\t\t\t// null indicates the opposite, as the Pokemon didn't have an option to choose anything\n\t\t\tpokemon.moveThisTurnResult = willTryMove;\n\t\t\treturn;\n\t\t}\n\n\t\t// Used exclusively for a hint later\n\t\tif (move.flags['cantusetwice'] && pokemon.lastMove?.id === move.id) {\n\t\t\tpokemon.addVolatile(move.id);\n\t\t}\n\n\t\tif (move.beforeMoveCallback) {\n\t\t\tif (move.beforeMoveCallback.call(this.battle, pokemon, target, move)) {\n\t\t\t\tthis.battle.clearActiveMove(true);\n\t\t\t\tpokemon.moveThisTurnResult = false;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tpokemon.lastDamage = 0;\n\t\tlet lockedMove;\n\t\tif (!externalMove) {\n\t\t\tlockedMove = this.battle.runEvent('LockMove', pokemon);\n\t\t\tif (lockedMove === true) lockedMove = false;\n\t\t\tif (!lockedMove) {\n\t\t\t\tif (!pokemon.deductPP(baseMove, null, target) && (move.id !== 'struggle')) {\n\t\t\t\t\tthis.battle.add('cant', pokemon, 'nopp', move);\n\t\t\t\t\tthis.battle.clearActiveMove(true);\n\t\t\t\t\tpokemon.moveThisTurnResult = false;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsourceEffect = this.dex.conditions.get('lockedmove');\n\t\t\t}\n\t\t\tpokemon.moveUsed(move, targetLoc);\n\t\t}\n\n\t\t// Dancer Petal Dance hack\n\t\t// TODO: implement properly\n\t\tconst noLock = externalMove && !pokemon.volatiles['lockedmove'];\n\n\t\tif (zMove) {\n\t\t\tif (pokemon.illusion) {\n\t\t\t\tthis.battle.singleEvent('End', this.dex.abilities.get('Illusion'), pokemon.abilityState, pokemon);\n\t\t\t}\n\t\t\tthis.battle.add('-zpower', pokemon);\n\t\t\tpokemon.side.zMoveUsed = true;\n\t\t}\n\n\t\tconst oldActiveMove = move;\n\n\t\tconst moveDidSomething = this.useMove(baseMove, pokemon, { target, sourceEffect, zMove, maxMove });\n\t\tthis.battle.lastSuccessfulMoveThisTurn = moveDidSomething ? this.battle.activeMove && this.battle.activeMove.id : null;\n\t\tif (this.battle.activeMove) move = this.battle.activeMove;\n\t\tthis.battle.singleEvent('AfterMove', move, null, pokemon, target, move);\n\t\tthis.battle.runEvent('AfterMove', pokemon, target, move);\n\t\tif (move.flags['cantusetwice'] && pokemon.removeVolatile(move.id)) {\n\t\t\tthis.battle.add('-hint', `Some effects can force a Pokemon to use ${move.name} again in a row.`);\n\t\t}\n\n\t\t// TODO: Refactor to use BattleQueue#prioritizeAction in onAnyAfterMove handlers\n\t\t// Dancer's activation order is completely different from any other event, so it's handled separately\n\t\tif (move.flags['dance'] && moveDidSomething && !move.isExternal) {\n\t\t\tconst dancers = [];\n\t\t\tfor (const currentPoke of this.battle.getAllActive()) {\n\t\t\t\tif (pokemon === currentPoke) continue;\n\t\t\t\tif (currentPoke.hasAbility('dancer') && !currentPoke.isSemiInvulnerable()) {\n\t\t\t\t\tdancers.push(currentPoke);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Dancer activates in order of lowest speed stat to highest\n\t\t\t// Note that the speed stat used is after any volatile replacements like Speed Swap,\n\t\t\t// but before any multipliers like Agility or Choice Scarf\n\t\t\t// Ties go to whichever Pokemon has had the ability for the least amount of time\n\t\t\tdancers.sort(\n\t\t\t\t(a, b) => -(b.storedStats['spe'] - a.storedStats['spe']) || b.abilityState.effectOrder - a.abilityState.effectOrder\n\t\t\t);\n\t\t\tconst targetOf1stDance = this.battle.activeTarget!;\n\t\t\tfor (const dancer of dancers) {\n\t\t\t\tif (this.battle.faintMessages()) break;\n\t\t\t\tif (dancer.fainted) continue;\n\t\t\t\tthis.battle.add('-activate', dancer, 'ability: Dancer');\n\t\t\t\tconst dancersTarget = !targetOf1stDance.isAlly(dancer) && pokemon.isAlly(dancer) ?\n\t\t\t\t\ttargetOf1stDance :\n\t\t\t\t\tpokemon;\n\t\t\t\tconst dancersTargetLoc = dancer.getLocOf(dancersTarget);\n\t\t\t\tthis.runMove(move.id, dancer, dancersTargetLoc, { sourceEffect: this.dex.abilities.get('dancer'), externalMove: true });\n\t\t\t}\n\t\t}\n\t\tif (noLock && pokemon.volatiles['lockedmove']) delete pokemon.volatiles['lockedmove'];\n\t\tthis.battle.faintMessages();\n\t\tthis.battle.checkWin();\n\n\t\tif (this.battle.gen <= 4) {\n\t\t\t// In gen 4, the outermost move is considered the last move for Copycat\n\t\t\tthis.battle.activeMove = oldActiveMove;\n\t\t}\n\t}\n\t/**\n\t * useMove is the \"inside\" move caller. It handles effects of the\n\t * move itself, but not the idea of using the move.\n\t *\n\t * Most caller effects, like Sleep Talk, Nature Power, Magic Bounce,\n\t * etc use useMove.\n\t *\n\t * The only ones that use runMove are Instruct, Pursuit, and\n\t * Dancer.\n\t */\n\tuseMove(\n\t\tmove: Move | string, pokemon: Pokemon, options?: {\n\t\t\ttarget?: Pokemon | null, sourceEffect?: Effect | null,\n\t\t\tzMove?: string, maxMove?: string,\n\t\t}\n\t) {\n\t\tpokemon.moveThisTurnResult = undefined;\n\t\tconst oldMoveResult: boolean | null | undefined = pokemon.moveThisTurnResult;\n\t\tconst moveResult = this.useMoveInner(move, pokemon, options);\n\t\tif (oldMoveResult === pokemon.moveThisTurnResult) pokemon.moveThisTurnResult = moveResult;\n\t\treturn moveResult;\n\t}\n\tuseMoveInner(\n\t\tmoveOrMoveName: Move | string, pokemon: Pokemon, options?: {\n\t\t\ttarget?: Pokemon | null, sourceEffect?: Effect | null,\n\t\t\tzMove?: string, maxMove?: string,\n\t\t},\n\t) {\n\t\tlet target = options?.target;\n\t\tlet sourceEffect = options?.sourceEffect;\n\t\tconst zMove = options?.zMove;\n\t\tconst maxMove = options?.maxMove;\n\t\tif (!sourceEffect && this.battle.effect.id) sourceEffect = this.battle.effect;\n\t\tif (sourceEffect && ['instruct', 'custapberry'].includes(sourceEffect.id)) sourceEffect = null;\n\n\t\tlet move = this.dex.getActiveMove(moveOrMoveName);\n\t\tpokemon.lastMoveUsed = move;\n\t\tif (move.id === 'weatherball' && zMove) {\n\t\t\t// Z-Weather Ball only changes types if it's used directly,\n\t\t\t// not if it's called by Z-Sleep Talk or something.\n\t\t\tthis.battle.singleEvent('ModifyType', move, null, pokemon, target, move, move);\n\t\t\tif (move.type !== 'Normal') sourceEffect = move;\n\t\t}\n\t\tif (zMove || (move.category !== 'Status' && sourceEffect && (sourceEffect as ActiveMove).isZ)) {\n\t\t\tmove = this.getActiveZMove(move, pokemon);\n\t\t}\n\t\tif (maxMove && move.category !== 'Status') {\n\t\t\t// Max move outcome is dependent on the move type after type modifications from ability and the move itself\n\t\t\tthis.battle.singleEvent('ModifyType', move, null, pokemon, target, move, move);\n\t\t\tthis.battle.runEvent('ModifyType', pokemon, target, move, move);\n\t\t}\n\t\tif (maxMove || (move.category !== 'Status' && sourceEffect && (sourceEffect as ActiveMove).isMax)) {\n\t\t\tmove = this.getActiveMaxMove(move, pokemon);\n\t\t}\n\n\t\tif (this.battle.activeMove) {\n\t\t\tmove.priority = this.battle.activeMove.priority;\n\t\t\tif (!move.hasBounced) move.pranksterBoosted = this.battle.activeMove.pranksterBoosted;\n\t\t}\n\t\tconst baseTarget = move.target;\n\t\tlet targetRelayVar = { target };\n\t\ttargetRelayVar = this.battle.runEvent('ModifyTarget', pokemon, target, move, targetRelayVar, true);\n\t\tif (targetRelayVar.target !== undefined) target = targetRelayVar.target;\n\t\tif (target === undefined) target = this.battle.getRandomTarget(pokemon, move);\n\t\tif (move.target === 'self' || move.target === 'allies') {\n\t\t\ttarget = pokemon;\n\t\t}\n\t\tif (sourceEffect) {\n\t\t\tmove.sourceEffect = sourceEffect.id;\n\t\t\tmove.ignoreAbility = (sourceEffect as ActiveMove).ignoreAbility;\n\t\t}\n\t\tlet moveResult = false;\n\n\t\tthis.battle.setActiveMove(move, pokemon, target);\n\n\t\tthis.battle.singleEvent('ModifyType', move, null, pokemon, target, move, move);\n\t\tthis.battle.singleEvent('ModifyMove', move, null, pokemon, target, move, move);\n\t\tif (baseTarget !== move.target) {\n\t\t\t// Target changed in ModifyMove, so we must adjust it here\n\t\t\t// Adjust before the next event so the correct target is passed to the\n\t\t\t// event\n\t\t\ttarget = this.battle.getRandomTarget(pokemon, move);\n\t\t}\n\t\tmove = this.battle.runEvent('ModifyType', pokemon, target, move, move);\n\t\tmove = this.battle.runEvent('ModifyMove', pokemon, target, move, move);\n\t\tif (baseTarget !== move.target) {\n\t\t\t// Adjust again\n\t\t\ttarget = this.battle.getRandomTarget(pokemon, move);\n\t\t}\n\t\tif (!move || pokemon.fainted) {\n\t\t\treturn false;\n\t\t}\n\n\t\tlet attrs = '';\n\n\t\tlet movename = move.name;\n\t\tif (move.id === 'hiddenpower') movename = 'Hidden Power';\n\t\tif (sourceEffect) attrs += `|[from] ${sourceEffect.fullname}`;\n\t\tif (zMove && move.isZ === true) {\n\t\t\tattrs = `|[anim]${movename}${attrs}`;\n\t\t\tmovename = `Z-${movename}`;\n\t\t}\n\t\tthis.battle.addMove('move', pokemon, movename, `${target}${attrs}`);\n\n\t\tif (zMove) this.runZPower(move, pokemon);\n\n\t\tif (!target) {\n\t\t\tthis.battle.attrLastMove('[notarget]');\n\t\t\tthis.battle.add(this.battle.gen >= 5 ? '-fail' : '-notarget', pokemon);\n\t\t\treturn false;\n\t\t}\n\n\t\tconst { targets, pressureTargets } = pokemon.getMoveTargets(move, target);\n\t\tif (targets.length) {\n\t\t\ttarget = targets[targets.length - 1]; // in case of redirection\n\t\t}\n\n\t\tconst callerMoveForPressure = sourceEffect && (sourceEffect as ActiveMove).pp ? sourceEffect as ActiveMove : null;\n\t\tif (!sourceEffect || callerMoveForPressure || sourceEffect.id === 'pursuit') {\n\t\t\tlet extraPP = 0;\n\t\t\tfor (const source of pressureTargets) {\n\t\t\t\tconst ppDrop = this.battle.runEvent('DeductPP', source, pokemon, move);\n\t\t\t\tif (ppDrop !== true) {\n\t\t\t\t\textraPP += ppDrop || 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (extraPP > 0) {\n\t\t\t\tpokemon.deductPP(callerMoveForPressure || moveOrMoveName, extraPP);\n\t\t\t}\n\t\t}\n\n\t\tif (!this.battle.singleEvent('TryMove', move, null, pokemon, target, move) ||\n\t\t\t!this.battle.runEvent('TryMove', pokemon, target, move)) {\n\t\t\tmove.mindBlownRecoil = false;\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.battle.singleEvent('UseMoveMessage', move, null, pokemon, target, move);\n\n\t\tif (move.ignoreImmunity === undefined) {\n\t\t\tmove.ignoreImmunity = (move.category === 'Status');\n\t\t}\n\n\t\tif (this.battle.gen !== 4 && move.selfdestruct === 'always') {\n\t\t\tthis.battle.faint(pokemon, pokemon, move);\n\t\t}\n\n\t\tlet damage: number | false | undefined | '' = false;\n\t\tif (move.target === 'all' || move.target === 'foeSide' || move.target === 'allySide' || move.target === 'allyTeam') {\n\t\t\tdamage = this.tryMoveHit(targets, pokemon, move);\n\t\t\tif (damage === this.battle.NOT_FAIL) pokemon.moveThisTurnResult = null;\n\t\t\tif (damage || damage === 0 || damage === undefined) moveResult = true;\n\t\t} else {\n\t\t\tif (!targets.length) {\n\t\t\t\tthis.battle.attrLastMove('[notarget]');\n\t\t\t\tthis.battle.add(this.battle.gen >= 5 ? '-fail' : '-notarget', pokemon);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (this.battle.gen === 4 && move.selfdestruct === 'always') {\n\t\t\t\tthis.battle.faint(pokemon, pokemon, move);\n\t\t\t}\n\t\t\tmoveResult = this.trySpreadMoveHit(targets, pokemon, move);\n\t\t}\n\t\tif (move.selfBoost && moveResult) this.moveHit(pokemon, pokemon, move, move.selfBoost, false, true);\n\t\tif (!pokemon.hp) {\n\t\t\tthis.battle.faint(pokemon, pokemon, move);\n\t\t}\n\n\t\tif (!moveResult) {\n\t\t\tthis.battle.singleEvent('MoveFail', move, null, target, pokemon, move);\n\t\t\treturn false;\n\t\t}\n\n\t\tif (\n\t\t\t!move.negateSecondary &&\n\t\t\t!(move.hasSheerForce && pokemon.hasAbility('sheerforce')) &&\n\t\t\t!move.flags['futuremove']\n\t\t) {\n\t\t\tconst originalHp = pokemon.hp;\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\tif (pokemon && pokemon !== target && move.category !== 'Status') {\n\t\t\t\tif (pokemon.hp <= pokemon.maxhp / 2 && originalHp > pokemon.maxhp / 2) {\n\t\t\t\t\tthis.battle.runEvent('EmergencyExit', pokemon, pokemon);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\t/** NOTE: includes single-target moves */\n\ttrySpreadMoveHit(targets: Pokemon[], pokemon: Pokemon, move: ActiveMove, notActive?: boolean) {\n\t\tif (targets.length > 1 && !move.smartTarget) move.spreadHit = true;\n\n\t\tconst moveSteps: ((targets: Pokemon[], pokemon: Pokemon, move: ActiveMove) =>\n\t\t(number | boolean | \"\" | undefined)[] | undefined)[] = [\n\t\t\t// 0. check for semi invulnerability\n\t\t\tthis.hitStepInvulnerabilityEvent,\n\n\t\t\t// 1. run the 'TryHit' event (Protect, Magic Bounce, Volt Absorb, etc.) (this is step 2 in gens 5 & 6, and step 4 in gen 4)\n\t\t\tthis.hitStepTryHitEvent,\n\n\t\t\t// 2. check for type immunity (this is step 1 in gens 4-6)\n\t\t\tthis.hitStepTypeImmunity,\n\n\t\t\t// 3. check for various move-specific immunities\n\t\t\tthis.hitStepTryImmunity,\n\n\t\t\t// 4. check accuracy\n\t\t\tthis.hitStepAccuracy,\n\n\t\t\t// 5. break protection effects\n\t\t\tthis.hitStepBreakProtect,\n\n\t\t\t// 6. steal positive boosts (Spectral Thief)\n\t\t\tthis.hitStepStealBoosts,\n\n\t\t\t// 7. loop that processes each hit of the move (has its own steps per iteration)\n\t\t\tthis.hitStepMoveHitLoop,\n\t\t];\n\t\tif (this.battle.gen <= 6) {\n\t\t\t// Swap step 1 with step 2\n\t\t\t[moveSteps[1], moveSteps[2]] = [moveSteps[2], moveSteps[1]];\n\t\t}\n\t\tif (this.battle.gen === 4) {\n\t\t\t// Swap step 4 with new step 2 (old step 1)\n\t\t\t[moveSteps[2], moveSteps[4]] = [moveSteps[4], moveSteps[2]];\n\t\t}\n\n\t\tif (notActive) this.battle.setActiveMove(move, pokemon, targets[0]);\n\n\t\tconst hitResult = this.battle.singleEvent('Try', move, null, pokemon, targets[0], move) &&\n\t\t\tthis.battle.singleEvent('PrepareHit', move, {}, targets[0], pokemon, move) &&\n\t\t\tthis.battle.runEvent('PrepareHit', pokemon, targets[0], move);\n\t\tif (!hitResult) {\n\t\t\tif (hitResult === false) {\n\t\t\t\tthis.battle.add('-fail', pokemon);\n\t\t\t\tthis.battle.attrLastMove('[still]');\n\t\t\t}\n\t\t\treturn hitResult === this.battle.NOT_FAIL;\n\t\t}\n\n\t\tlet atLeastOneFailure = false;\n\t\tfor (const step of moveSteps) {\n\t\t\tconst hitResults: (number | boolean | \"\" | undefined)[] | undefined = step.call(this, targets, pokemon, move);\n\t\t\tif (!hitResults) continue;\n\t\t\ttargets = targets.filter((val, i) => hitResults[i] || hitResults[i] === 0);\n\t\t\tatLeastOneFailure = atLeastOneFailure || hitResults.some(val => val === false);\n\t\t\tif (move.smartTarget && atLeastOneFailure) move.smartTarget = false;\n\t\t\tif (!targets.length) {\n\t\t\t\t// console.log(step.name);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tconst moveResult = !!targets.length;\n\t\tif (!moveResult && !atLeastOneFailure) pokemon.moveThisTurnResult = null;\n\t\tconst hitSlot = targets.map(p => p.getSlot());\n\t\tif (move.spreadHit) this.battle.attrLastMove('[spread] ' + hitSlot.join(','));\n\t\treturn moveResult;\n\t}\n\thitStepInvulnerabilityEvent(targets: Pokemon[], pokemon: Pokemon, move: ActiveMove) {\n\t\tif (move.id === 'helpinghand') return new Array(targets.length).fill(true);\n\t\tconst hitResults: boolean[] = [];\n\t\tfor (const [i, target] of targets.entries()) {\n\t\t\tif (target.volatiles['commanding']) {\n\t\t\t\thitResults[i] = false;\n\t\t\t} else if (this.battle.gen >= 8 && move.id === 'toxic' && pokemon.hasType('Poison')) {\n\t\t\t\thitResults[i] = true;\n\t\t\t} else {\n\t\t\t\thitResults[i] = this.battle.runEvent('Invulnerability', target, pokemon, move);\n\t\t\t}\n\t\t\tif (hitResults[i] === false) {\n\t\t\t\tif (move.smartTarget) {\n\t\t\t\t\tmove.smartTarget = false;\n\t\t\t\t} else {\n\t\t\t\t\tif (!move.spreadHit) this.battle.attrLastMove('[miss]');\n\t\t\t\t\tthis.battle.add('-miss', pokemon, target);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn hitResults;\n\t}\n\thitStepTryHitEvent(targets: Pokemon[], pokemon: Pokemon, move: ActiveMove) {\n\t\tconst hitResults = this.battle.runEvent('TryHit', targets, pokemon, move);\n\t\tif (!hitResults.includes(true) && hitResults.includes(false)) {\n\t\t\tthis.battle.add('-fail', pokemon);\n\t\t\tthis.battle.attrLastMove('[still]');\n\t\t}\n\t\tfor (const i of targets.keys()) {\n\t\t\tif (hitResults[i] !== this.battle.NOT_FAIL) hitResults[i] = hitResults[i] || false;\n\t\t}\n\t\treturn hitResults;\n\t}\n\thitStepTypeImmunity(targets: Pokemon[], pokemon: Pokemon, move: ActiveMove) {\n\t\tif (move.ignoreImmunity === undefined) {\n\t\t\tmove.ignoreImmunity = (move.category === 'Status');\n\t\t}\n\n\t\tconst hitResults = [];\n\t\tfor (const i of targets.keys()) {\n\t\t\thitResults[i] = (move.ignoreImmunity && (move.ignoreImmunity === true || move.ignoreImmunity[move.type])) ||\n\t\t\t\ttargets[i].runImmunity(move.type, !move.smartTarget);\n\t\t}\n\n\t\treturn hitResults;\n\t}\n\thitStepTryImmunity(targets: Pokemon[], pokemon: Pokemon, move: ActiveMove) {\n\t\tconst hitResults = [];\n\t\tfor (const [i, target] of targets.entries()) {\n\t\t\tif (this.battle.gen >= 6 && move.flags['powder'] && target !== pokemon && !this.dex.getImmunity('powder', target)) {\n\t\t\t\tthis.battle.debug('natural powder immunity');\n\t\t\t\tthis.battle.add('-immune', target);\n\t\t\t\thitResults[i] = false;\n\t\t\t} else if (!this.battle.singleEvent('TryImmunity', move, {}, target, pokemon, move)) {\n\t\t\t\tthis.battle.add('-immune', target);\n\t\t\t\thitResults[i] = false;\n\t\t\t} else if (this.battle.gen >= 7 && move.pranksterBoosted && pokemon.hasAbility('prankster') &&\n\t\t\t\t!targets[i].isAlly(pokemon) && !this.dex.getImmunity('prankster', target)) {\n\t\t\t\tthis.battle.debug('natural prankster immunity');\n\t\t\t\tif (target.illusion || !(move.status && !this.dex.getImmunity(move.status, target))) {\n\t\t\t\t\tthis.battle.hint(\"Since gen 7, Dark is immune to Prankster moves.\");\n\t\t\t\t}\n\t\t\t\tthis.battle.add('-immune', target);\n\t\t\t\thitResults[i] = false;\n\t\t\t} else {\n\t\t\t\thitResults[i] = true;\n\t\t\t}\n\t\t}\n\t\treturn hitResults;\n\t}\n\thitStepAccuracy(targets: Pokemon[], pokemon: Pokemon, move: ActiveMove) {\n\t\tconst hitResults = [];\n\t\tfor (const [i, target] of targets.entries()) {\n\t\t\tthis.battle.activeTarget = target;\n\t\t\t// calculate true accuracy\n\t\t\tlet accuracy = move.accuracy;\n\t\t\tif (move.ohko) { // bypasses accuracy modifiers\n\t\t\t\tif (!target.isSemiInvulnerable()) {\n\t\t\t\t\taccuracy = 30;\n\t\t\t\t\tif (move.ohko === 'Ice' && this.battle.gen >= 7 && !pokemon.hasType('Ice')) {\n\t\t\t\t\t\taccuracy = 20;\n\t\t\t\t\t}\n\t\t\t\t\tif (!target.volatiles['dynamax'] && pokemon.level >= target.level &&\n\t\t\t\t\t\t(move.ohko === true || !target.hasType(move.ohko))) {\n\t\t\t\t\t\taccuracy += (pokemon.level - target.level);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.battle.add('-immune', target, '[ohko]');\n\t\t\t\t\t\thitResults[i] = false;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\taccuracy = this.battle.runEvent('ModifyAccuracy', target, pokemon, move, accuracy);\n\t\t\t\tif (accuracy !== true) {\n\t\t\t\t\tlet boost = 0;\n\t\t\t\t\tif (!move.ignoreAccuracy) {\n\t\t\t\t\t\tconst boosts = this.battle.runEvent('ModifyBoost', pokemon, null, null, { ...pokemon.boosts });\n\t\t\t\t\t\tboost = this.battle.clampIntRange(boosts['accuracy'], -6, 6);\n\t\t\t\t\t}\n\t\t\t\t\tif (!move.ignoreEvasion) {\n\t\t\t\t\t\tconst boosts = this.battle.runEvent('ModifyBoost', target, null, null, { ...target.boosts });\n\t\t\t\t\t\tboost = this.battle.clampIntRange(boost - boosts['evasion'], -6, 6);\n\t\t\t\t\t}\n\t\t\t\t\tif (boost > 0) {\n\t\t\t\t\t\taccuracy = this.battle.trunc(accuracy * (3 + boost) / 3);\n\t\t\t\t\t} else if (boost < 0) {\n\t\t\t\t\t\taccuracy = this.battle.trunc(accuracy * 3 / (3 - boost));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (\n\t\t\t\tmove.alwaysHit || (move.id === 'toxic' && this.battle.gen >= 8 && pokemon.hasType('Poison')) ||\n\t\t\t\t(move.target === 'self' && move.category === 'Status' && !target.isSemiInvulnerable())\n\t\t\t) {\n\t\t\t\taccuracy = true; // bypasses ohko accuracy modifiers\n\t\t\t} else {\n\t\t\t\taccuracy = this.battle.runEvent('Accuracy', target, pokemon, move, accuracy);\n\t\t\t}\n\t\t\tif (accuracy !== true && !this.battle.randomChance(accuracy, 100)) {\n\t\t\t\tif (move.smartTarget) {\n\t\t\t\t\tmove.smartTarget = false;\n\t\t\t\t} else {\n\t\t\t\t\tif (!move.spreadHit) this.battle.attrLastMove('[miss]');\n\t\t\t\t\tthis.battle.add('-miss', pokemon, target);\n\t\t\t\t}\n\t\t\t\tif (!move.ohko && pokemon.hasItem('blunderpolicy') && pokemon.useItem()) {\n\t\t\t\t\tthis.battle.boost({ spe: 2 }, pokemon);\n\t\t\t\t}\n\t\t\t\thitResults[i] = false;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\thitResults[i] = true;\n\t\t}\n\t\treturn hitResults;\n\t}\n\thitStepBreakProtect(targets: Pokemon[], pokemon: Pokemon, move: ActiveMove) {\n\t\tif (move.breaksProtect) {\n\t\t\tfor (const target of targets) {\n\t\t\t\tlet broke = false;\n\t\t\t\tfor (const effectid of [\n\t\t\t\t\t'banefulbunker', 'burningbulwark', 'kingsshield', 'obstruct', 'protect', 'silktrap', 'spikyshield',\n\t\t\t\t]) {\n\t\t\t\t\tif (target.removeVolatile(effectid)) broke = true;\n\t\t\t\t}\n\t\t\t\tif (this.battle.gen >= 6 || !target.isAlly(pokemon)) {\n\t\t\t\t\tfor (const effectid of ['craftyshield', 'matblock', 'quickguard', 'wideguard']) {\n\t\t\t\t\t\tif (target.side.removeSideCondition(effectid)) broke = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (broke) {\n\t\t\t\t\tif (move.id === 'feint') {\n\t\t\t\t\t\tthis.battle.add('-activate', target, 'move: Feint');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.battle.add('-activate', target, `move: ${move.name}`, '[broken]');\n\t\t\t\t\t}\n\t\t\t\t\tif (this.battle.gen >= 6) delete target.volatiles['stall'];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\thitStepStealBoosts(targets: Pokemon[], pokemon: Pokemon, move: ActiveMove) {\n\t\tconst target = targets[0]; // hardcoded\n\t\tif (move.stealsBoosts) {\n\t\t\tconst boosts: SparseBoostsTable = {};\n\t\t\tlet stolen = false;\n\t\t\tlet statName: BoostID;\n\t\t\tfor (statName in target.boosts) {\n\t\t\t\tconst stage = target.boosts[statName];\n\t\t\t\tif (stage > 0) {\n\t\t\t\t\tboosts[statName] = stage;\n\t\t\t\t\tstolen = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (stolen) {\n\t\t\t\tthis.battle.attrLastMove('[still]');\n\t\t\t\tthis.battle.add('-clearpositiveboost', target, pokemon, 'move: ' + move.name);\n\t\t\t\tthis.battle.boost(boosts, pokemon, pokemon);\n\n\t\t\t\tlet statName2: BoostID;\n\t\t\t\tfor (statName2 in boosts) {\n\t\t\t\t\tboosts[statName2] = 0;\n\t\t\t\t}\n\t\t\t\ttarget.setBoost(boosts);\n\t\t\t\tif (move.id === \"spectralthief\") {\n\t\t\t\t\tthis.battle.addMove('-anim', pokemon, \"Spectral Thief\", target);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\tafterMoveSecondaryEvent(targets: Pokemon[], pokemon: Pokemon, move: ActiveMove) {\n\t\t// console.log(`${targets}, ${pokemon}, ${move}`)\n\t\tif (!move.negateSecondary && !(move.hasSheerForce && pokemon.hasAbility('sheerforce'))) {\n\t\t\tthis.battle.singleEvent('AfterMoveSecondary', move, null, targets[0], pokemon, move);\n\t\t\tthis.battle.runEvent('AfterMoveSecondary', targets, pokemon, move);\n\t\t}\n\t\treturn undefined;\n\t}\n\t/** NOTE: used only for moves that target sides/fields rather than pokemon */\n\ttryMoveHit(targetOrTargets: Pokemon | Pokemon[], pokemon: Pokemon, move: ActiveMove): number | undefined | false | '' {\n\t\tconst target = Array.isArray(targetOrTargets) ? targetOrTargets[0] : targetOrTargets;\n\t\tconst targets = Array.isArray(targetOrTargets) ? targetOrTargets : [target];\n\n\t\tthis.battle.setActiveMove(move, pokemon, targets[0]);\n\n\t\tlet hitResult = this.battle.singleEvent('Try', move, null, pokemon, target, move) &&\n\t\t\tthis.battle.singleEvent('PrepareHit', move, {}, target, pokemon, move) &&\n\t\t\tthis.battle.runEvent('PrepareHit', pokemon, target, move);\n\t\tif (!hitResult) {\n\t\t\tif (hitResult === false) {\n\t\t\t\tthis.battle.add('-fail', pokemon);\n\t\t\t\tthis.battle.attrLastMove('[still]');\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\tconst isFFAHazard = move.target === 'foeSide' && this.battle.gameType === 'freeforall';\n\t\tif (move.target === 'all') {\n\t\t\thitResult = this.battle.runEvent('TryHitField', target, pokemon, move);\n\t\t} else if (isFFAHazard) {\n\t\t\tconst hitResults: any[] = this.battle.runEvent('TryHitSide', targets, pokemon, move);\n\t\t\t// if some side blocked the move, prevent the move from executing against any other sides\n\t\t\tif (hitResults.some(result => !result)) return false;\n\t\t\thitResult = true;\n\t\t} else {\n\t\t\thitResult = this.battle.runEvent('TryHitSide', target, pokemon, move);\n\t\t}\n\t\tif (!hitResult) {\n\t\t\tif (hitResult === false) {\n\t\t\t\tthis.battle.add('-fail', pokemon);\n\t\t\t\tthis.battle.attrLastMove('[still]');\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\treturn this.moveHit(isFFAHazard ? targets : target, pokemon, move);\n\t}\n\thitStepMoveHitLoop(targets: Pokemon[], pokemon: Pokemon, move: ActiveMove) { // Temporary name\n\t\tlet damage: (number | boolean | undefined)[] = [];\n\t\tfor (const i of targets.keys()) {\n\t\t\tdamage[i] = 0;\n\t\t}\n\t\tmove.totalDamage = 0;\n\t\tpokemon.lastDamage = 0;\n\t\tlet targetHits = move.multihit || 1;\n\t\tif (Array.isArray(targetHits)) {\n\t\t\t// yes, it's hardcoded... meh\n\t\t\tif (targetHits[0] === 2 && targetHits[1] === 5) {\n\t\t\t\tif (this.battle.gen >= 5) {\n\t\t\t\t\t// 35-35-15-15 out of 100 for 2-3-4-5 hits\n\t\t\t\t\ttargetHits = this.battle.sample([2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5]);\n\t\t\t\t\tif (targetHits < 4 && pokemon.hasItem('loadeddice')) {\n\t\t\t\t\t\ttargetHits = 5 - this.battle.random(2);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\ttargetHits = this.battle.sample([2, 2, 2, 3, 3, 3, 4, 5]);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttargetHits = this.battle.random(targetHits[0], targetHits[1] + 1);\n\t\t\t}\n\t\t}\n\t\tif (targetHits === 10 && pokemon.hasItem('loadeddice')) targetHits -= this.battle.random(7);\n\t\ttargetHits = Math.floor(targetHits);\n\t\tlet nullDamage = true;\n\t\tlet moveDamage: (number | boolean | undefined)[] = [];\n\t\t// There is no need to recursively check the \u00B4sleepUsable\u00B4 flag as Sleep Talk can only be used while asleep.\n\t\tconst isSleepUsable = move.sleepUsable || this.dex.moves.get(move.sourceEffect).sleepUsable;\n\n\t\tlet targetsCopy: (Pokemon | false | null)[] = targets.slice(0);\n\t\tlet hit: number;\n\t\tfor (hit = 1; hit <= targetHits; hit++) {\n\t\t\tif (damage.includes(false)) break;\n\t\t\tif (hit > 1 && pokemon.status === 'slp' && (!isSleepUsable || this.battle.gen === 4)) break;\n\t\t\tif (targets.every(target => !target?.hp)) break;\n\t\t\tmove.hit = hit;\n\t\t\tif (move.smartTarget && targets.length > 1) {\n\t\t\t\ttargetsCopy = [targets[hit - 1]];\n\t\t\t\tdamage = [damage[hit - 1]];\n\t\t\t} else {\n\t\t\t\ttargetsCopy = targets.slice(0);\n\t\t\t}\n\t\t\tconst target = targetsCopy[0]; // some relevant-to-single-target-moves-only things are hardcoded\n\t\t\tif (target && typeof move.smartTarget === 'boolean') {\n\t\t\t\tif (hit > 1) {\n\t\t\t\t\tthis.battle.addMove('-anim', pokemon, move.name, target);\n\t\t\t\t} else {\n\t\t\t\t\tthis.battle.retargetLastMove(target);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// like this (Triple Kick)\n\t\t\tif (target && move.multiaccuracy && hit > 1) {\n\t\t\t\tlet accuracy = move.accuracy;\n\t\t\t\tconst boostTable = [1, 4 / 3, 5 / 3, 2, 7 / 3, 8 / 3, 3];\n\t\t\t\tif (accuracy !== true) {\n\t\t\t\t\tif (!move.ignoreAccuracy) {\n\t\t\t\t\t\tconst boosts = this.battle.runEvent('ModifyBoost', pokemon, null, null, { ...pokemon.boosts });\n\t\t\t\t\t\tconst boost = this.battle.clampIntRange(boosts['accuracy'], -6, 6);\n\t\t\t\t\t\tif (boost > 0) {\n\t\t\t\t\t\t\taccuracy *= boostTable[boost];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\taccuracy /= boostTable[-boost];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (!move.ignoreEvasion) {\n\t\t\t\t\t\tconst boosts = this.battle.runEvent('ModifyBoost', target, null, null, { ...target.boosts });\n\t\t\t\t\t\tconst boost = this.battle.clampIntRange(boosts['evasion'], -6, 6);\n\t\t\t\t\t\tif (boost > 0) {\n\t\t\t\t\t\t\taccuracy /= boostTable[boost];\n\t\t\t\t\t\t} else if (boost < 0) {\n\t\t\t\t\t\t\taccuracy *= boostTable[-boost];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\taccuracy = this.battle.runEvent('ModifyAccuracy', target, pokemon, move, accuracy);\n\t\t\t\tif (!move.alwaysHit) {\n\t\t\t\t\taccuracy = this.battle.runEvent('Accuracy', target, pokemon, move, accuracy);\n\t\t\t\t\tif (accuracy !== true && !this.battle.randomChance(accuracy, 100)) break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst moveData = move;\n\t\t\tif (!moveData.flags) moveData.flags = {};\n\n\t\t\tlet moveDamageThisHit;\n\t\t\t// Modifies targetsCopy (which is why it's a copy)\n\t\t\t[moveDamageThisHit, targetsCopy] = this.spreadMoveHit(targetsCopy, pokemon, move, moveData);\n\t\t\t// When Dragon Darts targets two different pokemon, targetsCopy is a length 1 array each hit\n\t\t\t// so spreadMoveHit returns a length 1 damage array\n\t\t\tif (move.smartTarget) {\n\t\t\t\tmoveDamage.push(...moveDamageThisHit);\n\t\t\t} else {\n\t\t\t\tmoveDamage = moveDamageThisHit;\n\t\t\t}\n\n\t\t\tif (!moveDamage.some(val => val !== false)) break;\n\t\t\tnullDamage = false;\n\n\t\t\tfor (const [i, md] of moveDamage.entries()) {\n\t\t\t\tif (move.smartTarget && i !== hit - 1) continue;\n\t\t\t\t// Damage from each hit is individually counted for the\n\t\t\t\t// purposes of Counter, Metal Burst, and Mirror Coat.\n\t\t\t\tdamage[i] = md === true || !md ? 0 : md;\n\t\t\t\t// Total damage dealt is accumulated for the purposes of recoil (Parental Bond).\n\t\t\t\tmove.totalDamage += damage[i];\n\t\t\t}\n\t\t\tif (move.mindBlownRecoil) {\n\t\t\t\tconst hpBeforeRecoil = pokemon.hp;\n\t\t\t\tthis.battle.damage(Math.round(pokemon.maxhp / 2), pokemon, pokemon, this.dex.conditions.get(move.id), true);\n\t\t\t\tmove.mindBlownRecoil = false;\n\t\t\t\tif (pokemon.hp <= pokemon.maxhp / 2 && hpBeforeRecoil > pokemon.maxhp / 2) {\n\t\t\t\t\tthis.battle.runEvent('EmergencyExit', pokemon, pokemon);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.battle.eachEvent('Update');\n\t\t\tif (!pokemon.hp && targets.length === 1) {\n\t\t\t\thit++; // report the correct number of hits for multihit moves\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t// hit is 1 higher than the actual hit count\n\t\tif (hit === 1) return damage.fill(false);\n\t\tif (nullDamage) damage.fill(false);\n\t\tthis.battle.faintMessages(false, false, !pokemon.hp);\n\t\tif (move.multihit && typeof move.smartTarget !== 'boolean') {\n\t\t\tthis.battle.add('-hitcount', targets[0], hit - 1);\n\t\t}\n\n\t\tif ((move.recoil || move.id === 'chloroblast') && move.totalDamage) {\n\t\t\tconst hpBeforeRecoil = pokemon.hp;\n\t\t\tthis.battle.damage(this.calcRecoilDamage(move.totalDamage, move, pokemon), pokemon, pokemon, 'recoil');\n\t\t\tif (pokemon.hp <= pokemon.maxhp / 2 && hpBeforeRecoil > pokemon.maxhp / 2) {\n\t\t\t\tthis.battle.runEvent('EmergencyExit', pokemon, pokemon);\n\t\t\t}\n\t\t}\n\n\t\tif (move.struggleRecoil) {\n\t\t\tconst hpBeforeRecoil = pokemon.hp;\n\t\t\tlet recoilDamage;\n\t\t\tif (this.dex.gen >= 5) {\n\t\t\t\trecoilDamage = this.battle.clampIntRange(Math.round(pokemon.baseMaxhp / 4), 1);\n\t\t\t} else {\n\t\t\t\trecoilDamage = this.battle.clampIntRange(this.battle.trunc(pokemon.maxhp / 4), 1);\n\t\t\t}\n\t\t\tthis.battle.directDamage(recoilDamage, pokemon, pokemon, { id: 'strugglerecoil' } as Condition);\n\t\t\tif (pokemon.hp <= pokemon.maxhp / 2 && hpBeforeRecoil > pokemon.maxhp / 2) {\n\t\t\t\tthis.battle.runEvent('EmergencyExit', pokemon, pokemon);\n\t\t\t}\n\t\t}\n\n\t\t// smartTarget messes up targetsCopy, but smartTarget should in theory ensure that targets will never fail, anyway\n\t\tif (move.smartTarget) {\n\t\t\ttargetsCopy = targets.slice(0);\n\t\t}\n\n\t\tfor (const [i, target] of targetsCopy.entries()) {\n\t\t\tif (target && pokemon !== target) {\n\t\t\t\ttarget.gotAttacked(move, moveDamage[i] as number | false | undefined, pokemon);\n\t\t\t\tif (typeof moveDamage[i] === 'number') {\n\t\t\t\t\ttarget.timesAttacked += move.smartTarget ? 1 : hit - 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (move.ohko && !targets[0].hp) this.battle.add('-ohko');\n\n\t\tif (!damage.some(val => !!val || val === 0)) return damage;\n\n\t\tthis.battle.eachEvent('Update');\n\n\t\tthis.afterMoveSecondaryEvent(targetsCopy.filter(val => !!val), pokemon, move);\n\n\t\tif (!move.negateSecondary && !(move.hasSheerForce && pokemon.hasAbility('sheerforce'))) {\n\t\t\tfor (const [i, d] of damage.entries()) {\n\t\t\t\t// There are no multihit spread moves, so it's safe to use move.totalDamage for multihit moves\n\t\t\t\t// The previous check was for `move.multihit`, but that fails for Dragon Darts\n\t\t\t\tconst curDamage = targets.length === 1 ? move.totalDamage : d;\n\t\t\t\tif (typeof curDamage === 'number' && targets[i].hp) {\n\t\t\t\t\tconst targetHPBeforeDamage = (targets[i].hurtThisTurn || 0) + curDamage;\n\t\t\t\t\tif (targets[i].hp <= targets[i].maxhp / 2 && targetHPBeforeDamage > targets[i].maxhp / 2) {\n\t\t\t\t\t\tthis.battle.runEvent('EmergencyExit', targets[i], pokemon);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn damage;\n\t}\n\tspreadMoveHit(\n\t\ttargets: SpreadMoveTargets, pokemon: Pokemon, moveOrMoveName: ActiveMove,\n\t\thitEffect?: Dex.HitEffect, isSecondary?: boolean, isSelf?: boolean\n\t): [SpreadMoveDamage, SpreadMoveTargets] {\n\t\t// Hardcoded for single-target purposes\n\t\t// (no spread moves have any kind of onTryHit handler)\n\t\tconst target = targets[0];\n\t\tlet damage: (number | boolean | undefined)[] = [];\n\t\tfor (const i of targets.keys()) {\n\t\t\tdamage[i] = true;\n\t\t}\n\t\tconst move = this.dex.getActiveMove(moveOrMoveName);\n\t\tlet hitResult: boolean | number | null = true;\n\t\tlet moveData = hitEffect as ActiveMove;\n\t\tif (!moveData) moveData = move;\n\t\tif (!moveData.flags) moveData.flags = {};\n\t\tif (move.target === 'all' && !isSelf) {\n\t\t\thitResult = this.battle.singleEvent('TryHitField', moveData, {}, target || null, pokemon, move);\n\t\t} else if ((move.target === 'foeSide' || move.target === 'allySide' || move.target === 'allyTeam') && !isSelf) {\n\t\t\thitResult = this.battle.singleEvent('TryHitSide', moveData, {}, target || null, pokemon, move);\n\t\t} else if (target) {\n\t\t\thitResult = this.battle.singleEvent('TryHit', moveData, {}, target, pokemon, move);\n\t\t}\n\t\tif (!hitResult) {\n\t\t\tif (hitResult === false) {\n\t\t\t\tthis.battle.add('-fail', pokemon);\n\t\t\t\tthis.battle.attrLastMove('[still]');\n\t\t\t}\n\t\t\treturn [[false], targets]; // single-target only\n\t\t}\n\n\t\t// 0. check for substitute\n\t\tif (!isSecondary && !isSelf) {\n\t\t\tif (move.target !== 'all' && move.target !== 'allyTeam' && move.target !== 'allySide' && move.target !== 'foeSide') {\n\t\t\t\tdamage = this.tryPrimaryHitEvent(damage, targets, pokemon, move, moveData, isSecondary);\n\t\t\t}\n\t\t}\n\n\t\tfor (const i of targets.keys()) {\n\t\t\tif (damage[i] === this.battle.HIT_SUBSTITUTE) {\n\t\t\t\tdamage[i] = true;\n\t\t\t\ttargets[i] = null;\n\t\t\t}\n\t\t\tif (targets[i] && isSecondary && !moveData.self) {\n\t\t\t\tdamage[i] = true;\n\t\t\t}\n\t\t\tif (!damage[i]) targets[i] = false;\n\t\t}\n\t\t// 1. call to this.battle.getDamage\n\t\tdamage = this.getSpreadDamage(damage, targets, pokemon, move, moveData, isSecondary, isSelf);\n\n\t\tfor (const i of targets.keys()) {\n\t\t\tif (damage[i] === false) targets[i] = false;\n\t\t}\n\n\t\t// 2. call to this.battle.spreadDamage\n\t\tdamage = this.battle.spreadDamage(damage, targets, pokemon, move);\n\n\t\tfor (const i of targets.keys()) {\n\t\t\tif (damage[i] === false) targets[i] = false;\n\t\t}\n\n\t\t// 3. onHit event happens here\n\t\tdamage = this.runMoveEffects(damage, targets, pokemon, move, moveData, isSecondary, isSelf);\n\n\t\tfor (const i of targets.keys()) {\n\t\t\tif (!damage[i] && damage[i] !== 0) targets[i] = false;\n\t\t}\n\n\t\t// steps 4 and 5 can mess with this.battle.activeTarget, which needs to be preserved for Dancer\n\t\tconst activeTarget = this.battle.activeTarget;\n\n\t\t// 4. self drops (start checking for targets[i] === false here)\n\t\tif (moveData.self && !move.selfDropped) this.selfDrops(targets, pokemon, move, moveData, isSecondary);\n\n\t\t// 5. secondary effects\n\t\tif (moveData.secondaries) this.secondaries(targets, pokemon, move, moveData, isSelf);\n\n\t\tthis.battle.activeTarget = activeTarget;\n\n\t\t// 6. force switch\n\t\tif (moveData.forceSwitch) damage = this.forceSwitch(damage, targets, pokemon, move);\n\n\t\tfor (const i of targets.keys()) {\n\t\t\tif (!damage[i] && damage[i] !== 0) targets[i] = false;\n\t\t}\n\n\t\tconst damagedTargets: Pokemon[] = [];\n\t\tconst damagedDamage = [];\n\t\tfor (const [i, t] of targets.entries()) {\n\t\t\tif (typeof damage[i] === 'number' && t) {\n\t\t\t\tdamagedTargets.push(t);\n\t\t\t\tdamagedDamage.push(damage[i]);\n\t\t\t}\n\t\t}\n\t\tconst pokemonOriginalHP = pokemon.hp;\n\t\tif (damagedDamage.length && !isSecondary && !isSelf) {\n\t\t\tthis.battle.runEvent('DamagingHit', damagedTargets, pokemon, move, damagedDamage);\n\t\t\tif (moveData.onAfterHit) {\n\t\t\t\tfor (const t of damagedTargets) {\n\t\t\t\t\tthis.battle.singleEvent('AfterHit', moveData, {}, t, pokemon, move);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pokemon.hp && pokemon.hp <= pokemon.maxhp / 2 && pokemonOriginalHP > pokemon.maxhp / 2) {\n\t\t\t\tthis.battle.runEvent('EmergencyExit', pokemon);\n\t\t\t}\n\t\t}\n\n\t\treturn [damage, targets];\n\t}\n\ttryPrimaryHitEvent(\n\t\tdamage: SpreadMoveDamage, targets: SpreadMoveTargets, pokemon: Pokemon,\n\t\tmove: ActiveMove, moveData: ActiveMove, isSecondary?: boolean\n\t): SpreadMoveDamage {\n\t\tfor (const [i, target] of targets.entries()) {\n\t\t\tif (!target) continue;\n\t\t\tdamage[i] = this.battle.runEvent('TryPrimaryHit', target, pokemon, moveData);\n\t\t}\n\t\treturn damage;\n\t}\n\tgetSpreadDamage(\n\t\tdamage: SpreadMoveDamage, targets: SpreadMoveTargets, source: Pokemon,\n\t\tmove: ActiveMove, moveData: ActiveMove, isSecondary?: boolean, isSelf?: boolean\n\t): SpreadMoveDamage {\n\t\tfor (const [i, target] of targets.entries()) {\n\t\t\tif (!target) continue;\n\t\t\tthis.battle.activeTarget = target;\n\t\t\tdamage[i] = undefined;\n\t\t\tconst curDamage = this.getDamage(source, target, moveData);\n\t\t\t// getDamage has several possible return values:\n\t\t\t//\n\t\t\t// a number:\n\t\t\t// means that much damage is dealt (0 damage still counts as dealing\n\t\t\t// damage for the purposes of things like Static)\n\t\t\t// false:\n\t\t\t// gives error message: \"But it failed!\" and move ends\n\t\t\t// null:\n\t\t\t// the move ends, with no message (usually, a custom fail message\n\t\t\t// was already output by an event handler)\n\t\t\t// undefined:\n\t\t\t// means no damage is dealt and the move continues\n\t\t\t//\n\t\t\t// basically, these values have the same meanings as they do for event\n\t\t\t// handlers.\n\n\t\t\tif (curDamage === false || curDamage === null) {\n\t\t\t\tif (damage[i] === false && !isSecondary && !isSelf) {\n\t\t\t\t\tthis.battle.add('-fail', source);\n\t\t\t\t\tthis.battle.attrLastMove('[still]');\n\t\t\t\t}\n\t\t\t\tthis.battle.debug('damage calculation interrupted');\n\t\t\t\tdamage[i] = false;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tdamage[i] = curDamage;\n\t\t}\n\t\treturn damage;\n\t}\n\trunMoveEffects(\n\t\tdamage: SpreadMoveDamage, targets: SpreadMoveTargets, source: Pokemon,\n\t\tmove: ActiveMove, moveData: ActiveMove, isSecondary?: boolean, isSelf?: boolean\n\t) {\n\t\tlet didAnything: number | boolean | null | undefined = damage.reduce(this.combineResults);\n\t\tfor (const [i, target] of targets.entries()) {\n\t\t\tif (target === false) continue;\n\t\t\tlet hitResult;\n\t\t\tlet didSomething: number | boolean | null | undefined = undefined;\n\n\t\t\tif (target) {\n\t\t\t\tif (moveData.boosts && !target.fainted) {\n\t\t\t\t\thitResult = this.battle.boost(moveData.boosts, target, source, move, isSecondary, isSelf);\n\t\t\t\t\tdidSomething = this.combineResults(didSomething, hitResult);\n\t\t\t\t}\n\t\t\t\tif (moveData.heal && !target.fainted) {\n\t\t\t\t\tif (target.hp >= target.maxhp) {\n\t\t\t\t\t\tthis.battle.add('-fail', target, 'heal');\n\t\t\t\t\t\tthis.battle.attrLastMove('[still]');\n\t\t\t\t\t\tdamage[i] = this.combineResults(damage[i], false);\n\t\t\t\t\t\tdidAnything = this.combineResults(didAnything, null);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tconst amount = target.baseMaxhp * moveData.heal[0] / moveData.heal[1];\n\t\t\t\t\tconst d = target.heal((this.battle.gen < 5 ? Math.floor : Math.round)(amount));\n\t\t\t\t\tif (!d && d !== 0) {\n\t\t\t\t\t\tthis.battle.add('-fail', source);\n\t\t\t\t\t\tthis.battle.attrLastMove('[still]');\n\t\t\t\t\t\tthis.battle.debug('heal interrupted');\n\t\t\t\t\t\tdamage[i] = this.combineResults(damage[i], false);\n\t\t\t\t\t\tdidAnything = this.combineResults(didAnything, null);\n\t\t\t\t\t\tcontinue;\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\thitResult = target.trySetStatus(moveData.status, source, moveData.ability ? moveData.ability : move);\n\t\t\t\t\tif (!hitResult && move.status) {\n\t\t\t\t\t\tdamage[i] = this.combineResults(damage[i], false);\n\t\t\t\t\t\tdidAnything = this.combineResults(didAnything, null);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tdidSomething = this.combineResults(didSomething, hitResult);\n\t\t\t\t}\n\t\t\t\tif (moveData.forceStatus) {\n\t\t\t\t\thitResult = target.setStatus(moveData.forceStatus, source, move);\n\t\t\t\t\tdidSomething = this.combineResults(didSomething, hitResult);\n\t\t\t\t}\n\t\t\t\tif (moveData.volatileStatus) {\n\t\t\t\t\thitResult = target.addVolatile(moveData.volatileStatus, source, move);\n\t\t\t\t\tdidSomething = this.combineResults(didSomething, hitResult);\n\t\t\t\t}\n\t\t\t\tif (moveData.sideCondition) {\n\t\t\t\t\thitResult = target.side.addSideCondition(moveData.sideCondition, source, move);\n\t\t\t\t\tdidSomething = this.combineResults(didSomething, hitResult);\n\t\t\t\t}\n\t\t\t\tif (moveData.slotCondition) {\n\t\t\t\t\thitResult = target.side.addSlotCondition(target, moveData.slotCondition, source, move);\n\t\t\t\t\tdidSomething = this.combineResults(didSomething, hitResult);\n\t\t\t\t}\n\t\t\t\tif (moveData.weather) {\n\t\t\t\t\thitResult = this.battle.field.setWeather(moveData.weather, source, move);\n\t\t\t\t\tdidSomething = this.combineResults(didSomething, hitResult);\n\t\t\t\t}\n\t\t\t\tif (moveData.terrain) {\n\t\t\t\t\thitResult = this.battle.field.setTerrain(moveData.terrain, source, move);\n\t\t\t\t\tdidSomething = this.combineResults(didSomething, hitResult);\n\t\t\t\t}\n\t\t\t\tif (moveData.pseudoWeather) {\n\t\t\t\t\thitResult = this.battle.field.addPseudoWeather(moveData.pseudoWeather, source, move);\n\t\t\t\t\tdidSomething = this.combineResults(didSomething, hitResult);\n\t\t\t\t}\n\t\t\t\tif (moveData.forceSwitch) {\n\t\t\t\t\thitResult = !!this.battle.canSwitch(target.side);\n\t\t\t\t\tdidSomething = this.combineResults(didSomething, hitResult);\n\t\t\t\t}\n\t\t\t\t// Hit events\n\t\t\t\t// These are like the TryHit events, except we don't need a FieldHit event.\n\t\t\t\t// Scroll up for the TryHit event documentation, and just ignore the \"Try\" part. ;)\n\t\t\t\tif (move.target === 'all' && !isSelf) {\n\t\t\t\t\tif (moveData.onHitField) {\n\t\t\t\t\t\thitResult = this.battle.singleEvent('HitField', moveData, {}, target, source, move);\n\t\t\t\t\t\tdidSomething = this.combineResults(didSomething, hitResult);\n\t\t\t\t\t}\n\t\t\t\t} else if ((move.target === 'foeSide' || move.target === 'allySide') && !isSelf) {\n\t\t\t\t\tif (moveData.onHitSide) {\n\t\t\t\t\t\thitResult = this.battle.singleEvent('HitSide', moveData, {}, target.side, source, move);\n\t\t\t\t\t\tdidSomething = this.combineResults(didSomething, hitResult);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (moveData.onHit) {\n\t\t\t\t\t\thitResult = this.battle.singleEvent('Hit', moveData, {}, target, source, move);\n\t\t\t\t\t\tdidSomething = this.combineResults(didSomething, hitResult);\n\t\t\t\t\t}\n\t\t\t\t\tif (!isSelf && !isSecondary) {\n\t\t\t\t\t\tthis.battle.runEvent('Hit', target, source, move);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (moveData.selfdestruct === 'ifHit' && damage[i] !== false) {\n\t\t\t\tthis.battle.faint(source, source, move);\n\t\t\t}\n\t\t\tif (moveData.selfSwitch) {\n\t\t\t\tif (this.battle.canSwitch(source.side) && !source.volatiles['commanded']) {\n\t\t\t\t\tdidSomething = true;\n\t\t\t\t} else {\n\t\t\t\t\tdidSomething = this.combineResults(didSomething, false);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Move didn't fail because it didn't try to do anything\n\t\t\tif (didSomething === undefined) didSomething = true;\n\t\t\tdamage[i] = this.combineResults(damage[i], didSomething === null ? false : didSomething);\n\t\t\tdidAnything = this.combineResults(didAnything, didSomething);\n\t\t}\n\n\t\tif (!didAnything && didAnything !== 0 && !moveData.self && !moveData.selfdestruct) {\n\t\t\tif (!isSelf && !isSecondary) {\n\t\t\t\tif (didAnything === false) {\n\t\t\t\t\tthis.battle.add('-fail', source);\n\t\t\t\t\tthis.battle.attrLastMove('[still]');\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.battle.debug('move failed because it did nothing');\n\t\t} else if (move.selfSwitch && source.hp && !source.volatiles['commanded']) {\n\t\t\tsource.switchFlag = move.id;\n\t\t}\n\n\t\treturn damage;\n\t}\n\tselfDrops(\n\t\ttargets: SpreadMoveTargets, source: Pokemon,\n\t\tmove: ActiveMove, moveData: ActiveMove, isSecondary?: boolean\n\t) {\n\t\tfor (const target of targets) {\n\t\t\tif (target === false) continue;\n\t\t\tif (moveData.self && !move.selfDropped) {\n\t\t\t\tif (!isSecondary && moveData.self.boosts) {\n\t\t\t\t\tconst secondaryRoll = this.battle.random(100);\n\t\t\t\t\tif (typeof moveData.self.chance === 'undefined' || secondaryRoll < moveData.self.chance) {\n\t\t\t\t\t\tthis.moveHit(source, source, move, moveData.self, isSecondary, true);\n\t\t\t\t\t}\n\t\t\t\t\tif (!move.multihit) move.selfDropped = true;\n\t\t\t\t} else {\n\t\t\t\t\tthis.moveHit(source, source, move, moveData.self, isSecondary, true);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tsecondaries(targets: SpreadMoveTargets, source: Pokemon, move: ActiveMove, moveData: ActiveMove, isSelf?: boolean) {\n\t\tif (!moveData.secondaries) return;\n\t\tfor (const target of targets) {\n\t\t\tif (target === false) continue;\n\t\t\tconst secondaries: Dex.SecondaryEffect[] =\n\t\t\t\tthis.battle.runEvent('ModifySecondaries', target, source, moveData, moveData.secondaries.slice());\n\t\t\tfor (const secondary of secondaries) {\n\t\t\t\tconst secondaryRoll = this.battle.random(100);\n\t\t\t\t// User stat boosts or target stat drops can possibly overflow if it goes beyond 256 in Gen 8 or prior\n\t\t\t\tconst secondaryOverflow = (secondary.boosts || secondary.self) && this.battle.gen <= 8;\n\t\t\t\tif (typeof secondary.chance === 'undefined' ||\n\t\t\t\t\tsecondaryRoll < (secondaryOverflow ? secondary.chance % 256 : secondary.chance)) {\n\t\t\t\t\tthis.moveHit(target, source, move, secondary, true, isSelf);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tforceSwitch(\n\t\tdamage: SpreadMoveDamage, targets: SpreadMoveTargets, source: Pokemon, move: ActiveMove\n\t) {\n\t\tfor (const [i, target] of targets.entries()) {\n\t\t\tif (target && target.hp > 0 && source.hp > 0 && this.battle.canSwitch(target.side)) {\n\t\t\t\tconst hitResult = this.battle.runEvent('DragOut', target, source, move);\n\t\t\t\tif (hitResult) {\n\t\t\t\t\ttarget.forceSwitchFlag = true;\n\t\t\t\t} else if (hitResult === false && move.category === 'Status') {\n\t\t\t\t\tthis.battle.add('-fail', source);\n\t\t\t\t\tthis.battle.attrLastMove('[still]');\n\t\t\t\t\tdamage[i] = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn damage;\n\t}\n\tmoveHit(\n\t\ttargets: Pokemon | null | (Pokemon | null)[], pokemon: Pokemon, moveOrMoveName: ActiveMove,\n\t\tmoveData?: Dex.HitEffect, isSecondary?: boolean, isSelf?: boolean\n\t): number | undefined | false {\n\t\tif (!Array.isArray(targets)) targets = [targets];\n\t\tconst retVal = this.spreadMoveHit(targets, pokemon, moveOrMoveName, moveData, isSecondary, isSelf)[0][0];\n\t\treturn retVal === true ? undefined : retVal;\n\t}\n\n\tcalcRecoilDamage(damageDealt: number, move: Move, pokemon: Pokemon): number {\n\t\tif (move.id === 'chloroblast') return Math.round(pokemon.maxhp / 2);\n\t\treturn this.battle.clampIntRange(Math.round(damageDealt * move.recoil![0] / move.recoil![1]), 1);\n\t}\n\n\tgetZMove(move: Move, pokemon: Pokemon, skipChecks?: boolean): string | undefined {\n\t\tconst item = pokemon.getItem();\n\t\tif (!skipChecks) {\n\t\t\tif (pokemon.side.zMoveUsed) return;\n\t\t\tif (!item.zMove) return;\n\t\t\tif (item.itemUser && !item.itemUser.includes(pokemon.species.name)) return;\n\t\t\tconst moveData = pokemon.getMoveData(move);\n\t\t\t// Draining the PP of the base move prevents the corresponding Z-move from being used.\n\t\t\tif (!moveData?.pp) return;\n\t\t}\n\n\t\tif (item.zMoveFrom) {\n\t\t\tif (move.name === item.zMoveFrom) return item.zMove as string;\n\t\t} else if (item.zMove === true) {\n\t\t\tif (move.type === item.zMoveType) {\n\t\t\t\tif (move.category === \"Status\") {\n\t\t\t\t\treturn move.name;\n\t\t\t\t} else if (move.zMove?.basePower) {\n\t\t\t\t\treturn this.Z_MOVES[move.type];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tgetActiveZMove(move: Move, pokemon: Pokemon): ActiveMove {\n\t\tif (pokemon) {\n\t\t\tconst item = pokemon.getItem();\n\t\t\tif (move.name === item.zMoveFrom) {\n\t\t\t\tconst zMove = this.dex.getActiveMove(item.zMove as string);\n\t\t\t\tzMove.isZOrMaxPowered = true;\n\t\t\t\treturn zMove;\n\t\t\t}\n\t\t}\n\n\t\tif (move.category === 'Status') {\n\t\t\tconst zMove = this.dex.getActiveMove(move);\n\t\t\tzMove.isZ = true;\n\t\t\tzMove.isZOrMaxPowered = true;\n\t\t\treturn zMove;\n\t\t}\n\t\tconst zMove = this.dex.getActiveMove(this.Z_MOVES[move.type]);\n\t\tzMove.basePower = move.zMove!.basePower!;\n\t\tzMove.category = move.category;\n\t\t// copy the priority for Quick Guard\n\t\tzMove.priority = move.priority;\n\t\tzMove.isZOrMaxPowered = true;\n\t\treturn zMove;\n\t}\n\n\tcanZMove(pokemon: Pokemon) {\n\t\tif (pokemon.side.zMoveUsed ||\n\t\t\t(pokemon.transformed &&\n\t\t\t\t(pokemon.species.isMega || pokemon.species.isPrimal || pokemon.species.forme === \"Ultra\"))\n\t\t) return;\n\t\tconst item = pokemon.getItem();\n\t\tif (!item.zMove) return;\n\t\tif (item.itemUser && !item.itemUser.includes(pokemon.species.name)) return;\n\t\tlet atLeastOne = false;\n\t\tlet mustStruggle = true;\n\t\tconst zMoves: ZMoveOptions = [];\n\t\tfor (const moveSlot of pokemon.moveSlots) {\n\t\t\tif (moveSlot.pp <= 0) {\n\t\t\t\tzMoves.push(null);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!moveSlot.disabled) {\n\t\t\t\tmustStruggle = false;\n\t\t\t}\n\t\t\tconst move = this.dex.moves.get(moveSlot.move);\n\t\t\tlet zMoveName = this.getZMove(move, pokemon, true) || '';\n\t\t\tif (zMoveName) {\n\t\t\t\tconst zMove = this.dex.moves.get(zMoveName);\n\t\t\t\tif (!zMove.isZ && zMove.category === 'Status') zMoveName = \"Z-\" + zMoveName;\n\t\t\t\tzMoves.push({ move: zMoveName, target: zMove.target });\n\t\t\t} else {\n\t\t\t\tzMoves.push(null);\n\t\t\t}\n\t\t\tif (zMoveName) atLeastOne = true;\n\t\t}\n\t\tif (atLeastOne && !mustStruggle) return zMoves;\n\t}\n\n\tgetMaxMove(move: Move, pokemon: Pokemon) {\n\t\tif (typeof move === 'string') move = this.dex.moves.get(move);\n\t\tif (move.name === 'Struggle') return move;\n\t\tif (pokemon.gigantamax && pokemon.canGigantamax && move.category !== 'Status') {\n\t\t\tconst gMaxMove = this.dex.moves.get(pokemon.canGigantamax);\n\t\t\tif (gMaxMove.exists && gMaxMove.type === move.type) return gMaxMove;\n\t\t}\n\t\tconst maxMove = this.dex.moves.get(this.MAX_MOVES[move.category === 'Status' ? move.category : move.type]);\n\t\tif (maxMove.exists) return maxMove;\n\t}\n\n\tgetActiveMaxMove(move: Move, pokemon: Pokemon) {\n\t\tif (typeof move === 'string') move = this.dex.getActiveMove(move);\n\t\tif (move.name === 'Struggle') return this.dex.getActiveMove(move);\n\t\tlet maxMove = this.dex.getActiveMove(this.MAX_MOVES[move.category === 'Status' ? move.category : move.type]);\n\t\tif (move.category !== 'Status') {\n\t\t\tif (pokemon.gigantamax && pokemon.canGigantamax) {\n\t\t\t\tconst gMaxMove = this.dex.getActiveMove(pokemon.canGigantamax);\n\t\t\t\tif (gMaxMove.exists && gMaxMove.type === move.type) maxMove = gMaxMove;\n\t\t\t}\n\t\t\tif (!move.maxMove?.basePower) throw new Error(`${move.name} doesn't have a maxMove basePower`);\n\t\t\tif (!['gmaxdrumsolo', 'gmaxfireball', 'gmaxhydrosnipe'].includes(maxMove.id)) {\n\t\t\t\tmaxMove.basePower = move.maxMove.basePower;\n\t\t\t}\n\t\t\tmaxMove.category = move.category;\n\t\t}\n\t\tmaxMove.baseMove = move.id;\n\t\t// copy the priority for Psychic Terrain, Quick Guard\n\t\tmaxMove.priority = move.priority;\n\t\tmaxMove.isZOrMaxPowered = true;\n\t\treturn maxMove;\n\t}\n\n\trunZPower(move: ActiveMove, pokemon: Pokemon) {\n\t\tconst zPower = this.dex.conditions.get('zpower');\n\t\tif (move.category !== 'Status') {\n\t\t\tthis.battle.attrLastMove('[zeffect]');\n\t\t} else if (move.zMove?.boost) {\n\t\t\tthis.battle.boost(move.zMove.boost, pokemon, pokemon, zPower);\n\t\t} else if (move.zMove?.effect) {\n\t\t\tswitch (move.zMove.effect) {\n\t\t\tcase 'heal':\n\t\t\t\tthis.battle.heal(pokemon.maxhp, pokemon, pokemon, zPower);\n\t\t\t\tbreak;\n\t\t\tcase 'healreplacement':\n\t\t\t\tpokemon.side.addSlotCondition(pokemon, 'healreplacement', pokemon, move);\n\t\t\t\tbreak;\n\t\t\tcase 'clearnegativeboost':\n\t\t\t\tconst boosts: SparseBoostsTable = {};\n\t\t\t\tlet i: BoostID;\n\t\t\t\tfor (i in pokemon.boosts) {\n\t\t\t\t\tif (pokemon.boosts[i] < 0) {\n\t\t\t\t\t\tboosts[i] = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tpokemon.setBoost(boosts);\n\t\t\t\tthis.battle.add('-clearnegativeboost', pokemon, '[zeffect]');\n\t\t\t\tbreak;\n\t\t\tcase 'redirect':\n\t\t\t\tpokemon.addVolatile('followme', pokemon, zPower);\n\t\t\t\tbreak;\n\t\t\tcase 'crit2':\n\t\t\t\tpokemon.addVolatile('focusenergy', pokemon, zPower);\n\t\t\t\tbreak;\n\t\t\tcase 'curse':\n\t\t\t\tif (pokemon.hasType('Ghost')) {\n\t\t\t\t\tthis.battle.heal(pokemon.maxhp, pokemon, pokemon, zPower);\n\t\t\t\t} else {\n\t\t\t\t\tthis.battle.boost({ atk: 1 }, pokemon, pokemon, zPower);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\ttargetTypeChoices(targetType: string) {\n\t\treturn CHOOSABLE_TARGETS.has(targetType);\n\t}\n\n\tcombineResults(\n\t\tleft: T, right: U\n\t): T | U {\n\t\tconst NOT_FAILURE = 'string';\n\t\tconst NULL = 'object';\n\t\tconst resultsPriorities = ['undefined', NOT_FAILURE, NULL, 'boolean', 'number'];\n\t\tif (resultsPriorities.indexOf(typeof left) > resultsPriorities.indexOf(typeof right)) {\n\t\t\treturn left;\n\t\t} else if (left && !right && right !== 0) {\n\t\t\treturn left;\n\t\t} else if (typeof left === 'number' && typeof right === 'number') {\n\t\t\treturn (left + right) as T;\n\t\t} else {\n\t\t\treturn right;\n\t\t}\n\t}\n\n\t/**\n\t * 0 is a success dealing 0 damage, such as from False Swipe at 1 HP.\n\t *\n\t * Normal PS return value rules apply:\n\t * undefined = success, null = silent failure, false = loud failure\n\t */\n\tgetDamage(\n\t\tsource: Pokemon, target: Pokemon, move: string | number | ActiveMove,\n\t\tsuppressMessages = false\n\t): number | undefined | null | false {\n\t\tif (typeof move === 'string') move = this.dex.getActiveMove(move);\n\n\t\tif (typeof move === 'number') {\n\t\t\tconst basePower = move;\n\t\t\tmove = new Dex.Move({\n\t\t\t\tbasePower,\n\t\t\t\ttype: '???',\n\t\t\t\tcategory: 'Physical',\n\t\t\t\twillCrit: false,\n\t\t\t}) as ActiveMove;\n\t\t\tmove.hit = 0;\n\t\t}\n\n\t\tif (!move.ignoreImmunity || (move.ignoreImmunity !== true && !move.ignoreImmunity[move.type])) {\n\t\t\tif (!target.runImmunity(move.type, !suppressMessages)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tif (move.ohko) return target.maxhp;\n\t\tif (move.damageCallback) return move.damageCallback.call(this.battle, source, target);\n\t\tif (move.damage === 'level') {\n\t\t\treturn source.level;\n\t\t} else if (move.damage) {\n\t\t\treturn move.damage;\n\t\t}\n\n\t\tconst category = this.battle.getCategory(move);\n\n\t\tlet basePower: number | false | null = move.basePower;\n\t\tif (move.basePowerCallback) {\n\t\t\tbasePower = move.basePowerCallback.call(this.battle, source, target, move);\n\t\t}\n\t\tif (!basePower) return basePower === 0 ? undefined : basePower;\n\t\tbasePower = this.battle.clampIntRange(basePower, 1);\n\n\t\tlet critMult;\n\t\tlet critRatio = this.battle.runEvent('ModifyCritRatio', source, target, move, move.critRatio || 0);\n\t\tif (this.battle.gen <= 5) {\n\t\t\tcritRatio = this.battle.clampIntRange(critRatio, 0, 5);\n\t\t\tcritMult = [0, 16, 8, 4, 3, 2];\n\t\t} else {\n\t\t\tcritRatio = this.battle.clampIntRange(critRatio, 0, 4);\n\t\t\tif (this.battle.gen === 6) {\n\t\t\t\tcritMult = [0, 16, 8, 2, 1];\n\t\t\t} else {\n\t\t\t\tcritMult = [0, 24, 8, 2, 1];\n\t\t\t}\n\t\t}\n\n\t\tconst moveHit = target.getMoveHitData(move);\n\t\tmoveHit.crit = move.willCrit || false;\n\t\tif (move.willCrit === undefined) {\n\t\t\tif (critRatio) {\n\t\t\t\tmoveHit.crit = this.battle.randomChance(1, critMult[critRatio]);\n\t\t\t}\n\t\t}\n\n\t\tif (moveHit.crit) {\n\t\t\tmoveHit.crit = this.battle.runEvent('CriticalHit', target, null, move);\n\t\t}\n\n\t\t// happens after crit calculation\n\t\tbasePower = this.battle.runEvent('BasePower', source, target, move, basePower, true);\n\n\t\tif (!basePower) return 0;\n\t\tbasePower = this.battle.clampIntRange(basePower, 1);\n\t\t// Hacked Max Moves have 0 base power, even if you Dynamax\n\t\tif ((!source.volatiles['dynamax'] && move.isMax) || (move.isMax && this.dex.moves.get(move.baseMove).isMax)) {\n\t\t\tbasePower = 0;\n\t\t}\n\n\t\tconst dexMove = this.dex.moves.get(move.id);\n\t\tif (\n\t\t\tbasePower < 60 && source.getTypes(true).includes(move.type) && source.terastallized &&\n\t\t\tdexMove.priority <= 0 && !dexMove.multihit &&\n\t\t\t// Hard move.basePower check for moves like Dragon Energy that have variable BP\n\t\t\t!((move.basePower === 0 || move.basePower === 150) && move.basePowerCallback)\n\t\t) {\n\t\t\tbasePower = 60;\n\t\t}\n\n\t\tconst level = source.level;\n\n\t\tconst attacker = move.overrideOffensivePokemon === 'target' ? target : source;\n\t\tconst defender = move.overrideDefensivePokemon === 'source' ? source : target;\n\n\t\tconst isPhysical = move.category === 'Physical';\n\t\tlet attackStat: StatIDExceptHP = move.overrideOffensiveStat || (isPhysical ? 'atk' : 'spa');\n\t\tconst defenseStat: StatIDExceptHP = move.overrideDefensiveStat || (isPhysical ? 'def' : 'spd');\n\n\t\tconst statTable = { atk: 'Atk', def: 'Def', spa: 'SpA', spd: 'SpD', spe: 'Spe' };\n\n\t\tlet atkBoosts = attacker.boosts[attackStat];\n\t\tlet defBoosts = defender.boosts[defenseStat];\n\n\t\tlet ignoreNegativeOffensive = !!move.ignoreNegativeOffensive;\n\t\tlet ignorePositiveDefensive = !!move.ignorePositiveDefensive;\n\n\t\tif (moveHit.crit) {\n\t\t\tignoreNegativeOffensive = true;\n\t\t\tignorePositiveDefensive = true;\n\t\t}\n\t\tconst ignoreOffensive = !!(move.ignoreOffensive || (ignoreNegativeOffensive && atkBoosts < 0));\n\t\tconst ignoreDefensive = !!(move.ignoreDefensive || (ignorePositiveDefensive && defBoosts > 0));\n\n\t\tif (ignoreOffensive) {\n\t\t\tthis.battle.debug('Negating (sp)atk boost/penalty.');\n\t\t\tatkBoosts = 0;\n\t\t}\n\t\tif (ignoreDefensive) {\n\t\t\tthis.battle.debug('Negating (sp)def boost/penalty.');\n\t\t\tdefBoosts = 0;\n\t\t}\n\n\t\tlet attack = attacker.calculateStat(attackStat, atkBoosts, 1, source);\n\t\tlet defense = defender.calculateStat(defenseStat, defBoosts, 1, target);\n\n\t\tattackStat = (category === 'Physical' ? 'atk' : 'spa');\n\n\t\t// Apply Stat Modifiers\n\t\tattack = this.battle.runEvent('Modify' + statTable[attackStat], source, target, move, attack);\n\t\tdefense = this.battle.runEvent('Modify' + statTable[defenseStat], target, source, move, defense);\n\n\t\tif (this.battle.gen <= 4 && ['explosion', 'selfdestruct'].includes(move.id) && defenseStat === 'def') {\n\t\t\tdefense = this.battle.clampIntRange(Math.floor(defense / 2), 1);\n\t\t}\n\n\t\tconst tr = this.battle.trunc;\n\n\t\t// int(int(int(2 * L / 5 + 2) * A * P / D) / 50);\n\t\tconst baseDamage = tr(tr(tr(tr(2 * level / 5 + 2) * basePower * attack) / defense) / 50);\n\n\t\t// Calculate damage modifiers separately (order differs between generations)\n\t\treturn this.modifyDamage(baseDamage, source, target, move, suppressMessages);\n\t}\n\n\tmodifyDamage(\n\t\tbaseDamage: number, pokemon: Pokemon, target: Pokemon, move: ActiveMove, suppressMessages = false\n\t) {\n\t\tconst tr = this.battle.trunc;\n\t\tif (!move.type) move.type = '???';\n\t\tconst type = move.type;\n\n\t\tbaseDamage += 2;\n\n\t\tif (move.spreadHit) {\n\t\t\t// multi-target modifier (doubles only)\n\t\t\tconst spreadModifier = move.spreadModifier || (this.battle.gameType === 'freeforall' ? 0.5 : 0.75);\n\t\t\tthis.battle.debug(`Spread modifier: ${spreadModifier}`);\n\t\t\tbaseDamage = this.battle.modify(baseDamage, spreadModifier);\n\t\t} else if (move.multihitType === 'parentalbond' && move.hit > 1) {\n\t\t\t// Parental Bond modifier\n\t\t\tconst bondModifier = this.battle.gen > 6 ? 0.25 : 0.5;\n\t\t\tthis.battle.debug(`Parental Bond modifier: ${bondModifier}`);\n\t\t\tbaseDamage = this.battle.modify(baseDamage, bondModifier);\n\t\t}\n\n\t\t// weather modifier\n\t\tbaseDamage = this.battle.runEvent('WeatherModifyDamage', pokemon, target, move, baseDamage);\n\n\t\t// crit - not a modifier\n\t\tconst isCrit = target.getMoveHitData(move).crit;\n\t\tif (isCrit) {\n\t\t\tbaseDamage = tr(baseDamage * (move.critModifier || (this.battle.gen >= 6 ? 1.5 : 2)));\n\t\t}\n\n\t\t// random factor - also not a modifier\n\t\tbaseDamage = this.battle.randomizer(baseDamage);\n\n\t\t// STAB\n\t\t// The \"???\" type never gets STAB\n\t\t// Not even if you Roost in Gen 4 and somehow manage to use\n\t\t// Struggle in the same turn.\n\t\t// (On second thought, it might be easier to get a MissingNo.)\n\t\tif (type !== '???') {\n\t\t\tlet stab: number | [number, number] = 1;\n\n\t\t\tconst isSTAB = move.forceSTAB || pokemon.hasType(type) || pokemon.getTypes(false, true).includes(type);\n\t\t\tif (isSTAB) {\n\t\t\t\tstab = 1.5;\n\t\t\t}\n\n\t\t\t// The Stellar tera type makes this incredibly confusing\n\t\t\t// If the move's type does not match one of the user's base types,\n\t\t\t// the Stellar tera type applies a one-time 1.2x damage boost for that type.\n\t\t\t//\n\t\t\t// If the move's type does match one of the user's base types,\n\t\t\t// then the Stellar tera type applies a one-time 2x STAB boost for that type,\n\t\t\t// and then goes back to using the regular 1.5x STAB boost for those types.\n\t\t\tif (pokemon.terastallized === 'Stellar') {\n\t\t\t\tif (!pokemon.stellarBoostedTypes.includes(type) || move.stellarBoosted) {\n\t\t\t\t\tstab = isSTAB ? 2 : [4915, 4096];\n\t\t\t\t\tmove.stellarBoosted = true;\n\t\t\t\t\tif (pokemon.species.name !== 'Terapagos-Stellar') {\n\t\t\t\t\t\tpokemon.stellarBoostedTypes.push(type);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (pokemon.terastallized === type && pokemon.getTypes(false, true).includes(type)) {\n\t\t\t\t\tstab = 2;\n\t\t\t\t}\n\t\t\t\tstab = this.battle.runEvent('ModifySTAB', pokemon, target, move, stab);\n\t\t\t}\n\n\t\t\tbaseDamage = this.battle.modify(baseDamage, stab);\n\t\t}\n\n\t\t// types\n\t\tlet typeMod = target.runEffectiveness(move);\n\t\ttypeMod = this.battle.clampIntRange(typeMod, -6, 6);\n\t\ttarget.getMoveHitData(move).typeMod = typeMod;\n\t\tif (typeMod > 0) {\n\t\t\tif (!suppressMessages) this.battle.add('-supereffective', target);\n\n\t\t\tfor (let i = 0; i < typeMod; i++) {\n\t\t\t\tbaseDamage *= 2;\n\t\t\t}\n\t\t}\n\t\tif (typeMod < 0) {\n\t\t\tif (!suppressMessages) this.battle.add('-resisted', target);\n\n\t\t\tfor (let i = 0; i > typeMod; i--) {\n\t\t\t\tbaseDamage = tr(baseDamage / 2);\n\t\t\t}\n\t\t}\n\n\t\tif (isCrit && !suppressMessages) this.battle.add('-crit', target);\n\n\t\tif (pokemon.status === 'brn' && move.category === 'Physical' && !pokemon.hasAbility('guts')) {\n\t\t\tif (this.battle.gen < 6 || move.id !== 'facade') {\n\t\t\t\tbaseDamage = this.battle.modify(baseDamage, 0.5);\n\t\t\t}\n\t\t}\n\n\t\t// Generation 5, but nothing later, sets damage to 1 before the final damage modifiers\n\t\tif (this.battle.gen === 5 && !baseDamage) baseDamage = 1;\n\n\t\t// Final modifier. Modifiers that modify damage after min damage check, such as Life Orb.\n\t\tbaseDamage = this.battle.runEvent('ModifyDamage', pokemon, target, move, baseDamage);\n\n\t\tif (move.isZOrMaxPowered && target.getMoveHitData(move).zBrokeProtect) {\n\t\t\tbaseDamage = this.battle.modify(baseDamage, 0.25);\n\t\t\tthis.battle.add('-zbroken', target);\n\t\t}\n\n\t\t// Generation 6-7 moves the check for minimum 1 damage after the final modifier...\n\t\tif (this.battle.gen !== 5 && !baseDamage) return 1;\n\n\t\t// ...but 16-bit truncation happens even later, and can truncate to 0\n\t\treturn tr(baseDamage, 16);\n\t}\n\n\t/**\n\t * Confusion damage is unique - most typical modifiers that get run when calculating\n\t * damage (e.g. Huge Power, Life Orb, critical hits) don't apply. It also uses a 16-bit\n\t * context for its damage, unlike the regular damage formula (though this only comes up\n\t * for base damage).\n\t */\n\tgetConfusionDamage(pokemon: Pokemon, basePower: number) {\n\t\tconst tr = this.battle.trunc;\n\n\t\tconst attack = pokemon.calculateStat('atk', pokemon.boosts['atk']);\n\t\tconst defense = pokemon.calculateStat('def', pokemon.boosts['def']);\n\t\tconst level = pokemon.level;\n\t\tconst baseDamage = tr(tr(tr(tr(2 * level / 5 + 2) * basePower * attack) / defense) / 50) + 2;\n\n\t\t// Damage is 16-bit context in self-hit confusion damage\n\t\tlet damage = tr(baseDamage, 16);\n\t\tdamage = this.battle.randomizer(damage);\n\t\treturn Math.max(1, damage);\n\t}\n\n\t// #endregion\n\n\t// #region MEGA EVOLUTION\n\t// ==================================================================\n\n\tcanMegaEvo(pokemon: Pokemon) {\n\t\tconst species = pokemon.baseSpecies;\n\t\tconst altForme = species.otherFormes && this.dex.species.get(species.otherFormes[0]);\n\t\tconst item = pokemon.getItem();\n\t\t// Mega Rayquaza\n\t\tif ((this.battle.gen <= 7 || this.battle.ruleTable.has('+pokemontag:past')) &&\n\t\t\taltForme?.isMega && altForme?.requiredMove &&\n\t\t\tpokemon.baseMoves.includes(toID(altForme.requiredMove)) && !item.zMove) {\n\t\t\treturn altForme.name;\n\t\t}\n\t\t// a hacked-in Megazard X can mega evolve into Megazard Y, but not into Megazard X\n\t\tif (item.megaEvolves === species.baseSpecies && item.megaStone !== species.name) {\n\t\t\treturn item.megaStone;\n\t\t}\n\t\treturn null;\n\t}\n\n\tcanUltraBurst(pokemon: Pokemon) {\n\t\tif (['Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane'].includes(pokemon.baseSpecies.name) &&\n\t\t\tpokemon.getItem().id === 'ultranecroziumz') {\n\t\t\treturn \"Necrozma-Ultra\";\n\t\t}\n\t\treturn null;\n\t}\n\n\trunMegaEvo(pokemon: Pokemon) {\n\t\tconst speciesid = pokemon.canMegaEvo || pokemon.canUltraBurst;\n\t\tif (!speciesid) return false;\n\n\t\tpokemon.formeChange(speciesid, pokemon.getItem(), true);\n\n\t\t// Limit one mega evolution\n\t\tconst wasMega = pokemon.canMegaEvo;\n\t\tfor (const ally of pokemon.side.pokemon) {\n\t\t\tif (wasMega) {\n\t\t\t\tally.canMegaEvo = null;\n\t\t\t} else {\n\t\t\t\tally.canUltraBurst = null;\n\t\t\t}\n\t\t}\n\n\t\tthis.battle.runEvent('AfterMega', pokemon);\n\t\treturn true;\n\t}\n\n\t// Let's Go\n\tcanMegaEvoX?: (this: BattleActions, pokemon: Pokemon) => string | null;\n\tcanMegaEvoY?: (this: BattleActions, pokemon: Pokemon) => string | null;\n\trunMegaEvoX?: (this: BattleActions, pokemon: Pokemon) => boolean;\n\trunMegaEvoY?: (this: BattleActions, pokemon: Pokemon) => boolean;\n\n\tcanTerastallize(pokemon: Pokemon) {\n\t\tif (pokemon.getItem().zMove || pokemon.canMegaEvo || this.dex.gen !== 9) {\n\t\t\treturn null;\n\t\t}\n\t\treturn pokemon.teraType;\n\t}\n\n\tterastallize(pokemon: Pokemon) {\n\t\tif (pokemon.illusion && ['Ogerpon', 'Terapagos'].includes(pokemon.illusion.species.baseSpecies)) {\n\t\t\tthis.battle.singleEvent('End', this.dex.abilities.get('Illusion'), pokemon.abilityState, pokemon);\n\t\t}\n\n\t\tconst type = pokemon.teraType;\n\t\tthis.battle.add('-terastallize', pokemon, type);\n\t\tpokemon.terastallized = type;\n\t\tfor (const ally of pokemon.side.pokemon) {\n\t\t\tally.canTerastallize = null;\n\t\t}\n\t\tpokemon.addedType = '';\n\t\tpokemon.knownType = true;\n\t\tpokemon.apparentType = type;\n\t\tif (pokemon.species.baseSpecies === 'Ogerpon') {\n\t\t\tconst tera = pokemon.species.id === 'ogerpon' ? 'tealtera' : 'tera';\n\t\t\tpokemon.formeChange(pokemon.species.id + tera, null, true);\n\t\t}\n\t\tif (pokemon.species.name === 'Terapagos-Terastal' && type === 'Stellar') {\n\t\t\tpokemon.formeChange('Terapagos-Stellar', null, true);\n\t\t\tpokemon.baseMaxhp = Math.floor(Math.floor(\n\t\t\t\t2 * pokemon.species.baseStats['hp'] + pokemon.set.ivs['hp'] + Math.floor(pokemon.set.evs['hp'] / 4) + 100\n\t\t\t) * pokemon.level / 100 + 10);\n\t\t\tconst newMaxHP = pokemon.baseMaxhp;\n\t\t\tpokemon.hp = newMaxHP - (pokemon.maxhp - pokemon.hp);\n\t\t\tpokemon.maxhp = newMaxHP;\n\t\t\tthis.battle.add('-heal', pokemon, pokemon.getHealth, '[silent]');\n\t\t}\n\t\tif (pokemon.species.baseSpecies === 'Morpeko' && !pokemon.transformed &&\n\t\t\tpokemon.baseSpecies.id !== pokemon.species.id\n\t\t) {\n\t\t\tpokemon.regressionForme = true;\n\t\t\tpokemon.baseSpecies = pokemon.species;\n\t\t\tpokemon.details = pokemon.getUpdatedDetails();\n\t\t}\n\t\tthis.battle.runEvent('AfterTerastallization', pokemon);\n\t}\n\n\t// #endregion\n}\n"], "mappings": "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", "names": ["target", "zMove", "basePower"] }