Pokemon_server / dist /sim /pokemon.js.map
Jofthomas's picture
Jofthomas HF staff
Upload 4781 files
5c2ed06 verified
{
"version": 3,
"sources": ["../../sim/pokemon.ts"],
"sourcesContent": ["/**\n * Simulator Pokemon\n * Pokemon Showdown - http://pokemonshowdown.com/\n *\n * @license MIT license\n */\n\nimport { State } from './state';\nimport { toID } from './dex';\nimport type { DynamaxOptions, PokemonMoveRequestData, PokemonSwitchRequestData } from './side';\n\n/** A Pokemon's move slot. */\ninterface MoveSlot {\n\tid: ID;\n\tmove: string;\n\tpp: number;\n\tmaxpp: number;\n\ttarget?: string;\n\tdisabled: boolean | string;\n\tdisabledSource?: string;\n\tused: boolean;\n\tvirtual?: boolean;\n}\n\ninterface Attacker {\n\tsource: Pokemon;\n\tdamage: number;\n\tthisTurn: boolean;\n\tmove?: ID;\n\tslot: PokemonSlot;\n\tdamageValue?: (number | boolean | undefined);\n}\n\nexport interface EffectState {\n\tid: string;\n\teffectOrder: number;\n\tduration?: number;\n\t[k: string]: any;\n}\n\n// Berries which restore PP/HP and thus inflict external staleness when given to an opponent as\n// there are very few non-malicious competitive reasons to do so\nexport const RESTORATIVE_BERRIES = new Set([\n\t'leppaberry', 'aguavberry', 'enigmaberry', 'figyberry', 'iapapaberry', 'magoberry', 'sitrusberry', 'wikiberry', 'oranberry',\n] as ID[]);\n\nexport class Pokemon {\n\treadonly side: Side;\n\treadonly battle: Battle;\n\n\treadonly set: PokemonSet;\n\treadonly name: string;\n\t/** `` `${sideid}: ${name}` `` - used to refer to pokemon in the protocol */\n\treadonly fullname: string;\n\treadonly level: number;\n\treadonly gender: GenderName;\n\treadonly happiness: number;\n\treadonly pokeball: ID;\n\treadonly dynamaxLevel: number;\n\treadonly gigantamax: boolean;\n\n\t/** Transform keeps the original pre-transformed Hidden Power in Gen 2-4. */\n\treadonly baseHpType: string;\n\treadonly baseHpPower: number;\n\n\treadonly baseMoveSlots: MoveSlot[];\n\tmoveSlots: MoveSlot[];\n\n\thpType: string;\n\thpPower: number;\n\n\t/**\n\t * Index of `pokemon.side.pokemon` and `pokemon.side.active`, which are\n\t * guaranteed to be the same for active pokemon. Note that this isn't\n\t * its field position in multi battles - use `getSlot()` for that.\n\t */\n\tposition: number;\n\t/**\n\t * Information about this pokemon visible to opponents when in battle\n\t * (species, gender, level, shininess, tera state).\n\t * @see https://github.com/smogon/pokemon-showdown/blob/master/sim/SIM-PROTOCOL.md#identifying-pok%C3%A9mon\n\t */\n\tdetails: string;\n\n\tbaseSpecies: Species;\n\tspecies: Species;\n\tspeciesState: EffectState;\n\n\tstatus: ID;\n\tstatusState: EffectState;\n\tvolatiles: { [id: string]: EffectState };\n\tshowCure?: boolean;\n\n\t/**\n\t * These are the basic stats that appear on the in-game stats screen:\n\t * calculated purely from the species base stats, level, IVs, EVs,\n\t * and Nature, before modifications from item, ability, etc.\n\t *\n\t * Forme changes affect these, but Transform doesn't.\n\t */\n\tbaseStoredStats: StatsTable;\n\t/**\n\t * These are pre-modification stored stats in-battle. At switch-in,\n\t * they're identical to `baseStoredStats`, but can be temporarily changed\n\t * until switch-out by effects such as Power Trick and Transform.\n\t *\n\t * Stat multipliers from abilities, items, and volatiles, such as\n\t * Solar Power, Choice Band, or Swords Dance, are not stored in\n\t * `storedStats`, but applied on top and accessed by `pokemon.getStat`.\n\t *\n\t * (Except in Gen 1, where stat multipliers are stored, leading\n\t * to several famous glitches.)\n\t */\n\tstoredStats: StatsExceptHPTable;\n\tboosts: BoostsTable;\n\n\tbaseAbility: ID;\n\tability: ID;\n\tabilityState: EffectState;\n\n\titem: ID;\n\titemState: EffectState;\n\tlastItem: ID;\n\tusedItemThisTurn: boolean;\n\tateBerry: boolean;\n\n\ttrapped: boolean | \"hidden\";\n\tmaybeTrapped: boolean;\n\tmaybeDisabled: boolean;\n\n\tillusion: Pokemon | null;\n\ttransformed: boolean;\n\n\tmaxhp: number;\n\t/** This is the max HP before Dynamaxing; it's updated for Power Construct etc */\n\tbaseMaxhp: number;\n\thp: number;\n\tfainted: boolean;\n\tfaintQueued: boolean;\n\tsubFainted: boolean | null;\n\n\t/** If this Pokemon should revert to its set species when it faints */\n\tregressionForme: boolean;\n\n\ttypes: string[];\n\taddedType: string;\n\tknownType: boolean;\n\t/** Keeps track of what type the client sees for this Pokemon. */\n\tapparentType: string;\n\n\t/**\n\t * If the switch is called by an effect with a special switch\n\t * message, like U-turn or Baton Pass, this will be the ID of\n\t * the calling effect.\n\t */\n\tswitchFlag: ID | boolean;\n\tforceSwitchFlag: boolean;\n\tskipBeforeSwitchOutEventFlag: boolean;\n\tdraggedIn: number | null;\n\tnewlySwitched: boolean;\n\tbeingCalledBack: boolean;\n\n\tlastMove: ActiveMove | null;\n\t// Gen 2 only\n\tlastMoveEncore?: ActiveMove | null;\n\tlastMoveUsed: ActiveMove | null;\n\tlastMoveTargetLoc?: number;\n\tmoveThisTurn: string | boolean;\n\tstatsRaisedThisTurn: boolean;\n\tstatsLoweredThisTurn: boolean;\n\t/**\n\t * The result of the last move used on the previous turn by this\n\t * Pokemon. Stomping Tantrum checks this property for a value of false\n\t * when determine whether to double its power, but it has four\n\t * possible values:\n\t *\n\t * undefined indicates this Pokemon was not active last turn. It should\n\t * not be used to indicate that a move was attempted and failed, either\n\t * in a way that boosts Stomping Tantrum or not.\n\t *\n\t * null indicates that the Pokemon's move was skipped in such a way\n\t * that does not boost Stomping Tantrum, either from having to recharge\n\t * or spending a turn trapped by another Pokemon's Sky Drop.\n\t *\n\t * false indicates that the move completely failed to execute for any\n\t * reason not mentioned above, including missing, the target being\n\t * immune, the user being immobilized by an effect such as paralysis, etc.\n\t *\n\t * true indicates that the move successfully executed one or more of\n\t * its effects on one or more targets, including hitting with an attack\n\t * but dealing 0 damage to the target in cases such as Disguise, or that\n\t * the move was blocked by one or more moves such as Protect.\n\t */\n\tmoveLastTurnResult: boolean | null | undefined;\n\t/**\n\t * The result of the most recent move used this turn by this Pokemon.\n\t * At the start of each turn, the value stored here is moved to its\n\t * counterpart, moveLastTurnResult, and this property is reinitialized\n\t * to undefined. This property can have one of four possible values:\n\t *\n\t * undefined indicates that this Pokemon has not yet finished an\n\t * attempt to use a move this turn. As this value is only overwritten\n\t * after a move finishes execution, it is not sufficient for an event\n\t * to examine only this property when checking if a Pokemon has not\n\t * moved yet this turn if the event could take place during that\n\t * Pokemon's move.\n\t *\n\t * null indicates that the Pokemon's move was skipped in such a way\n\t * that does not boost Stomping Tantrum, either from having to recharge\n\t * or spending a turn trapped by another Pokemon's Sky Drop.\n\t *\n\t * false indicates that the move completely failed to execute for any\n\t * reason not mentioned above, including missing, the target being\n\t * immune, the user being immobilized by an effect such as paralysis, etc.\n\t *\n\t * true indicates that the move successfully executed one or more of\n\t * its effects on one or more targets, including hitting with an attack\n\t * but dealing 0 damage to the target in cases such as Disguise. It can\n\t * also mean that the move was blocked by one or more moves such as\n\t * Protect. Uniquely, this value can also be true if this Pokemon mega\n\t * evolved or ultra bursted this turn, but in that case the value should\n\t * always be overwritten by a move action before the end of that turn.\n\t */\n\tmoveThisTurnResult: boolean | null | undefined;\n\t/**\n\t * The undynamaxed HP value this Pokemon was reduced to by damage this turn,\n\t * or false if it hasn't taken damage yet this turn\n\t *\n\t * Used for Assurance, Emergency Exit, and Wimp Out\n\t */\n\thurtThisTurn: number | null;\n\tlastDamage: number;\n\tattackedBy: Attacker[];\n\ttimesAttacked: number;\n\n\tisActive: boolean;\n\tactiveTurns: number;\n\t/**\n\t * This is for Fake-Out-likes specifically - it mostly counts how many move\n\t * actions you've had since the last time you switched in, so 1/turn normally,\n\t * +1 for Dancer/Instruct, -1 for shifting/Sky Drop.\n\t *\n\t * Incremented before the move is used, so the first move use has\n\t * `activeMoveActions === 1`.\n\t *\n\t * Unfortunately, Truant counts Mega Evolution as an action and Fake\n\t * Out doesn't, meaning that Truant can't use this number.\n\t */\n\tactiveMoveActions: number;\n\tpreviouslySwitchedIn: number;\n\ttruantTurn: boolean;\n\t// Gen 9 only\n\tswordBoost: boolean;\n\tshieldBoost: boolean;\n\tsyrupTriggered: boolean;\n\tstellarBoostedTypes: string[];\n\n\t/** Have this pokemon's Start events run yet? (Start events run every switch-in) */\n\tisStarted: boolean;\n\tduringMove: boolean;\n\n\tweighthg: number;\n\tspeed: number;\n\n\tcanMegaEvo: string | null | undefined;\n\tcanMegaEvoX: string | null | undefined;\n\tcanMegaEvoY: string | null | undefined;\n\tcanUltraBurst: string | null | undefined;\n\treadonly canGigantamax: string | null;\n\t/**\n\t * A Pokemon's Tera type if it can Terastallize, false if it is temporarily unable to tera and should have its\n\t * ability restored upon switching out, or null if its inability to tera is permanent.\n\t */\n\tcanTerastallize: string | false | null;\n\tteraType: string;\n\tbaseTypes: string[];\n\tterastallized?: string;\n\n\t/** A Pokemon's currently 'staleness' with respect to the Endless Battle Clause. */\n\tstaleness?: 'internal' | 'external';\n\t/** Staleness that will be set once a future action occurs (eg. eating a berry). */\n\tpendingStaleness?: 'internal' | 'external';\n\t/** Temporary staleness that lasts only until the Pokemon switches. */\n\tvolatileStaleness?: 'external';\n\n\t// Gen 1 only\n\tmodifiedStats?: StatsExceptHPTable;\n\tmodifyStat?: (this: Pokemon, statName: StatIDExceptHP, modifier: number) => void;\n\t// Stadium only\n\trecalculateStats?: (this: Pokemon) => void;\n\n\t/**\n\t * An object for storing untyped data, for mods to use.\n\t */\n\tm: {\n\t\tinnate?: string, // Partners in Crime\n\t\toriginalSpecies?: string, // Mix and Mega\n\t\t[key: string]: any,\n\t};\n\n\tconstructor(set: string | AnyObject, side: Side) {\n\t\tthis.side = side;\n\t\tthis.battle = side.battle;\n\n\t\tthis.m = {};\n\n\t\tconst pokemonScripts = this.battle.format.pokemon || this.battle.dex.data.Scripts.pokemon;\n\t\tif (pokemonScripts) Object.assign(this, pokemonScripts);\n\n\t\tif (typeof set === 'string') set = { name: set };\n\n\t\tthis.baseSpecies = this.battle.dex.species.get(set.species || set.name);\n\t\tif (!this.baseSpecies.exists) {\n\t\t\tthrow new Error(`Unidentified species: ${this.baseSpecies.name}`);\n\t\t}\n\t\tthis.set = set as PokemonSet;\n\n\t\tthis.species = this.baseSpecies;\n\t\tif (set.name === set.species || !set.name) {\n\t\t\tset.name = this.baseSpecies.baseSpecies;\n\t\t}\n\t\tthis.speciesState = this.battle.initEffectState({ id: this.species.id });\n\n\t\tthis.name = set.name.substr(0, 20);\n\t\tthis.fullname = `${this.side.id}: ${this.name}`;\n\n\t\tset.level = this.battle.clampIntRange(set.adjustLevel || set.level || 100, 1, 9999);\n\t\tthis.level = set.level;\n\t\tconst genders: { [key: string]: GenderName } = { M: 'M', F: 'F', N: 'N' };\n\t\tthis.gender = genders[set.gender] || this.species.gender || (this.battle.random(2) ? 'F' : 'M');\n\t\tif (this.gender === 'N') this.gender = '';\n\t\tthis.happiness = typeof set.happiness === 'number' ? this.battle.clampIntRange(set.happiness, 0, 255) : 255;\n\t\tthis.pokeball = toID(this.set.pokeball) || 'pokeball' as ID;\n\t\tthis.dynamaxLevel = typeof set.dynamaxLevel === 'number' ? this.battle.clampIntRange(set.dynamaxLevel, 0, 10) : 10;\n\t\tthis.gigantamax = this.set.gigantamax || false;\n\n\t\tthis.baseMoveSlots = [];\n\t\tthis.moveSlots = [];\n\t\tif (!this.set.moves?.length) {\n\t\t\tthrow new Error(`Set ${this.name} has no moves`);\n\t\t}\n\t\tfor (const moveid of this.set.moves) {\n\t\t\tlet move = this.battle.dex.moves.get(moveid);\n\t\t\tif (!move.id) continue;\n\t\t\tif (move.id === 'hiddenpower' && move.type !== 'Normal') {\n\t\t\t\tif (!set.hpType) set.hpType = move.type;\n\t\t\t\tmove = this.battle.dex.moves.get('hiddenpower');\n\t\t\t}\n\t\t\tlet basepp = move.noPPBoosts ? move.pp : move.pp * 8 / 5;\n\t\t\tif (this.battle.gen < 3) basepp = Math.min(61, basepp);\n\t\t\tthis.baseMoveSlots.push({\n\t\t\t\tmove: move.name,\n\t\t\t\tid: move.id,\n\t\t\t\tpp: basepp,\n\t\t\t\tmaxpp: basepp,\n\t\t\t\ttarget: move.target,\n\t\t\t\tdisabled: false,\n\t\t\t\tdisabledSource: '',\n\t\t\t\tused: false,\n\t\t\t});\n\t\t}\n\n\t\tthis.position = 0;\n\t\tthis.details = this.getUpdatedDetails();\n\n\t\tthis.status = '';\n\t\tthis.statusState = this.battle.initEffectState({});\n\t\tthis.volatiles = {};\n\t\tthis.showCure = undefined;\n\n\t\tif (!this.set.evs) {\n\t\t\tthis.set.evs = { hp: 0, atk: 0, def: 0, spa: 0, spd: 0, spe: 0 };\n\t\t}\n\t\tif (!this.set.ivs) {\n\t\t\tthis.set.ivs = { hp: 31, atk: 31, def: 31, spa: 31, spd: 31, spe: 31 };\n\t\t}\n\t\tconst stats: StatsTable = { hp: 31, atk: 31, def: 31, spe: 31, spa: 31, spd: 31 };\n\t\tlet stat: StatID;\n\t\tfor (stat in stats) {\n\t\t\tif (!this.set.evs[stat]) this.set.evs[stat] = 0;\n\t\t\tif (!this.set.ivs[stat] && this.set.ivs[stat] !== 0) this.set.ivs[stat] = 31;\n\t\t}\n\t\tfor (stat in this.set.evs) {\n\t\t\tthis.set.evs[stat] = this.battle.clampIntRange(this.set.evs[stat], 0, 255);\n\t\t}\n\t\tfor (stat in this.set.ivs) {\n\t\t\tthis.set.ivs[stat] = this.battle.clampIntRange(this.set.ivs[stat], 0, 31);\n\t\t}\n\t\tif (this.battle.gen && this.battle.gen <= 2) {\n\t\t\t// We represent DVs using even IVs. Ensure they are in fact even.\n\t\t\tfor (stat in this.set.ivs) {\n\t\t\t\tthis.set.ivs[stat] &= 30;\n\t\t\t}\n\t\t}\n\n\t\tconst hpData = this.battle.dex.getHiddenPower(this.set.ivs);\n\t\tthis.hpType = set.hpType || hpData.type;\n\t\tthis.hpPower = hpData.power;\n\n\t\tthis.baseHpType = this.hpType;\n\t\tthis.baseHpPower = this.hpPower;\n\n\t\t// initialized in this.setSpecies(this.baseSpecies)\n\t\tthis.baseStoredStats = null!;\n\t\tthis.storedStats = { atk: 0, def: 0, spa: 0, spd: 0, spe: 0 };\n\t\tthis.boosts = { atk: 0, def: 0, spa: 0, spd: 0, spe: 0, accuracy: 0, evasion: 0 };\n\n\t\tthis.baseAbility = toID(set.ability);\n\t\tthis.ability = this.baseAbility;\n\t\tthis.abilityState = this.battle.initEffectState({ id: this.ability, target: this });\n\n\t\tthis.item = toID(set.item);\n\t\tthis.itemState = this.battle.initEffectState({ id: this.item, target: this });\n\t\tthis.lastItem = '';\n\t\tthis.usedItemThisTurn = false;\n\t\tthis.ateBerry = false;\n\n\t\tthis.trapped = false;\n\t\tthis.maybeTrapped = false;\n\t\tthis.maybeDisabled = false;\n\n\t\tthis.illusion = null;\n\t\tthis.transformed = false;\n\n\t\tthis.fainted = false;\n\t\tthis.faintQueued = false;\n\t\tthis.subFainted = null;\n\n\t\tthis.regressionForme = false;\n\n\t\tthis.types = this.baseSpecies.types;\n\t\tthis.baseTypes = this.types;\n\t\tthis.addedType = '';\n\t\tthis.knownType = true;\n\t\tthis.apparentType = this.baseSpecies.types.join('/');\n\t\t// Every Pokemon has a Terastal type\n\t\tthis.teraType = this.set.teraType || this.types[0];\n\n\t\tthis.switchFlag = false;\n\t\tthis.forceSwitchFlag = false;\n\t\tthis.skipBeforeSwitchOutEventFlag = false;\n\t\tthis.draggedIn = null;\n\t\tthis.newlySwitched = false;\n\t\tthis.beingCalledBack = false;\n\n\t\tthis.lastMove = null;\n\t\t// This is used in gen 2 only, here to avoid code repetition.\n\t\t// Only declared if gen 2 to avoid declaring an object we aren't going to need.\n\t\tif (this.battle.gen === 2) this.lastMoveEncore = null;\n\t\tthis.lastMoveUsed = null;\n\t\tthis.moveThisTurn = '';\n\t\tthis.statsRaisedThisTurn = false;\n\t\tthis.statsLoweredThisTurn = false;\n\t\tthis.hurtThisTurn = null;\n\t\tthis.lastDamage = 0;\n\t\tthis.attackedBy = [];\n\t\tthis.timesAttacked = 0;\n\n\t\tthis.isActive = false;\n\t\tthis.activeTurns = 0;\n\t\tthis.activeMoveActions = 0;\n\t\tthis.previouslySwitchedIn = 0;\n\t\tthis.truantTurn = false;\n\t\tthis.swordBoost = false;\n\t\tthis.shieldBoost = false;\n\t\tthis.syrupTriggered = false;\n\t\tthis.stellarBoostedTypes = [];\n\t\tthis.isStarted = false;\n\t\tthis.duringMove = false;\n\n\t\tthis.weighthg = 1;\n\t\tthis.speed = 0;\n\n\t\tthis.canMegaEvo = this.battle.actions.canMegaEvo(this);\n\t\tthis.canMegaEvoX = this.battle.actions.canMegaEvoX?.(this);\n\t\tthis.canMegaEvoY = this.battle.actions.canMegaEvoY?.(this);\n\t\tthis.canUltraBurst = this.battle.actions.canUltraBurst(this);\n\t\tthis.canGigantamax = this.baseSpecies.canGigantamax || null;\n\t\tthis.canTerastallize = this.battle.actions.canTerastallize(this);\n\n\t\t// This is used in gen 1 only, here to avoid code repetition.\n\t\t// Only declared if gen 1 to avoid declaring an object we aren't going to need.\n\t\tif (this.battle.gen === 1) this.modifiedStats = { atk: 0, def: 0, spa: 0, spd: 0, spe: 0 };\n\n\t\tthis.maxhp = 0;\n\t\tthis.baseMaxhp = 0;\n\t\tthis.hp = 0;\n\t\tthis.clearVolatile();\n\t\tthis.hp = this.maxhp;\n\t}\n\n\ttoJSON(): AnyObject {\n\t\treturn State.serializePokemon(this);\n\t}\n\n\tget moves(): readonly string[] {\n\t\treturn this.moveSlots.map(moveSlot => moveSlot.id);\n\t}\n\n\tget baseMoves(): readonly string[] {\n\t\treturn this.baseMoveSlots.map(moveSlot => moveSlot.id);\n\t}\n\n\tgetSlot(): PokemonSlot {\n\t\tconst positionOffset = Math.floor(this.side.n / 2) * this.side.active.length;\n\t\tconst positionLetter = 'abcdef'.charAt(this.position + positionOffset);\n\t\treturn (this.side.id + positionLetter) as PokemonSlot;\n\t}\n\n\ttoString() {\n\t\tconst fullname = (this.illusion) ? this.illusion.fullname : this.fullname;\n\t\treturn this.isActive ? this.getSlot() + fullname.slice(2) : fullname;\n\t}\n\n\tgetUpdatedDetails(level?: number) {\n\t\tlet name = this.species.name;\n\t\tif (['Greninja-Bond', 'Rockruff-Dusk'].includes(name)) name = this.species.baseSpecies;\n\t\tif (!level) level = this.level;\n\t\treturn name + (level === 100 ? '' : `, L${level}`) +\n\t\t\t(this.gender === '' ? '' : `, ${this.gender}`) + (this.set.shiny ? ', shiny' : '');\n\t}\n\n\tgetFullDetails = () => {\n\t\tconst health = this.getHealth();\n\t\tlet details = this.details;\n\t\tif (this.illusion) {\n\t\t\tdetails = this.illusion.getUpdatedDetails(\n\t\t\t\tthis.battle.ruleTable.has('illusionlevelmod') ? this.illusion.level : this.level\n\t\t\t);\n\t\t}\n\t\tif (this.terastallized) details += `, tera:${this.terastallized}`;\n\t\treturn { side: health.side, secret: `${details}|${health.secret}`, shared: `${details}|${health.shared}` };\n\t};\n\n\tupdateSpeed() {\n\t\tthis.speed = this.getActionSpeed();\n\t}\n\n\tcalculateStat(statName: StatIDExceptHP, boost: number, modifier?: number, statUser?: Pokemon) {\n\t\tstatName = toID(statName) as StatIDExceptHP;\n\t\t// @ts-expect-error type checking prevents 'hp' from being passed, but we're paranoid\n\t\tif (statName === 'hp') throw new Error(\"Please read `maxhp` directly\");\n\n\t\t// base stat\n\t\tlet stat = this.storedStats[statName];\n\n\t\t// Wonder Room swaps defenses before calculating anything else\n\t\tif ('wonderroom' in this.battle.field.pseudoWeather) {\n\t\t\tif (statName === 'def') {\n\t\t\t\tstat = this.storedStats['spd'];\n\t\t\t} else if (statName === 'spd') {\n\t\t\t\tstat = this.storedStats['def'];\n\t\t\t}\n\t\t}\n\n\t\t// stat boosts\n\t\tlet boosts: SparseBoostsTable = {};\n\t\tconst boostName = statName as BoostID;\n\t\tboosts[boostName] = boost;\n\t\tboosts = this.battle.runEvent('ModifyBoost', statUser || this, null, null, boosts);\n\t\tboost = boosts[boostName]!;\n\t\tconst boostTable = [1, 1.5, 2, 2.5, 3, 3.5, 4];\n\t\tif (boost > 6) boost = 6;\n\t\tif (boost < -6) boost = -6;\n\t\tif (boost >= 0) {\n\t\t\tstat = Math.floor(stat * boostTable[boost]);\n\t\t} else {\n\t\t\tstat = Math.floor(stat / boostTable[-boost]);\n\t\t}\n\n\t\t// stat modifier\n\t\treturn this.battle.modify(stat, (modifier || 1));\n\t}\n\n\tgetStat(statName: StatIDExceptHP, unboosted?: boolean, unmodified?: boolean) {\n\t\tstatName = toID(statName) as StatIDExceptHP;\n\t\t// @ts-expect-error type checking prevents 'hp' from being passed, but we're paranoid\n\t\tif (statName === 'hp') throw new Error(\"Please read `maxhp` directly\");\n\n\t\t// base stat\n\t\tlet stat = this.storedStats[statName];\n\n\t\t// Download ignores Wonder Room's effect, but this results in\n\t\t// stat stages being calculated on the opposite defensive stat\n\t\tif (unmodified && 'wonderroom' in this.battle.field.pseudoWeather) {\n\t\t\tif (statName === 'def') {\n\t\t\t\tstatName = 'spd';\n\t\t\t} else if (statName === 'spd') {\n\t\t\t\tstatName = 'def';\n\t\t\t}\n\t\t}\n\n\t\t// stat boosts\n\t\tif (!unboosted) {\n\t\t\tconst boosts = this.battle.runEvent('ModifyBoost', this, null, null, { ...this.boosts });\n\t\t\tlet boost = boosts[statName];\n\t\t\tconst boostTable = [1, 1.5, 2, 2.5, 3, 3.5, 4];\n\t\t\tif (boost > 6) boost = 6;\n\t\t\tif (boost < -6) boost = -6;\n\t\t\tif (boost >= 0) {\n\t\t\t\tstat = Math.floor(stat * boostTable[boost]);\n\t\t\t} else {\n\t\t\t\tstat = Math.floor(stat / boostTable[-boost]);\n\t\t\t}\n\t\t}\n\n\t\t// stat modifier effects\n\t\tif (!unmodified) {\n\t\t\tconst statTable: { [s in StatIDExceptHP]: string } = { atk: 'Atk', def: 'Def', spa: 'SpA', spd: 'SpD', spe: 'Spe' };\n\t\t\tstat = this.battle.runEvent('Modify' + statTable[statName], this, null, null, stat);\n\t\t}\n\n\t\tif (statName === 'spe' && stat > 10000 && !this.battle.format.battle?.trunc) stat = 10000;\n\t\treturn stat;\n\t}\n\n\tgetActionSpeed() {\n\t\tlet speed = this.getStat('spe', false, false);\n\t\tconst trickRoomCheck = this.battle.ruleTable.has('twisteddimensionmod') ?\n\t\t\t!this.battle.field.getPseudoWeather('trickroom') : this.battle.field.getPseudoWeather('trickroom');\n\t\tif (trickRoomCheck) {\n\t\t\tspeed = 10000 - speed;\n\t\t}\n\t\treturn this.battle.trunc(speed, 13);\n\t}\n\n\t/**\n\t * Gets the Pokemon's best stat.\n\t * Moved to its own method due to frequent use of the same code.\n\t * Used by Beast Boost, Quark Drive, and Protosynthesis.\n\t */\n\tgetBestStat(unboosted?: boolean, unmodified?: boolean): StatIDExceptHP {\n\t\tlet statName: StatIDExceptHP = 'atk';\n\t\tlet bestStat = 0;\n\t\tconst stats: StatIDExceptHP[] = ['atk', 'def', 'spa', 'spd', 'spe'];\n\t\tfor (const i of stats) {\n\t\t\tif (this.getStat(i, unboosted, unmodified) > bestStat) {\n\t\t\t\tstatName = i;\n\t\t\t\tbestStat = this.getStat(i, unboosted, unmodified);\n\t\t\t}\n\t\t}\n\n\t\treturn statName;\n\t}\n\n\t/* Commented out for now until a use for Combat Power is found in Let's Go\n\tgetCombatPower() {\n\t\tlet statSum = 0;\n\t\tlet awakeningSum = 0;\n\t\tfor (const stat in this.stats) {\n\t\t\tstatSum += this.calculateStat(stat, this.boosts[stat as BoostName]);\n\t\t\tawakeningSum += this.calculateStat(\n\t\t\t\tstat, this.boosts[stat as BoostName]) + this.set.evs[stat];\n\t\t}\n\t\tconst combatPower = Math.floor(Math.floor(statSum * this.level * 6 / 100) +\n\t\t\t(Math.floor(awakeningSum) * Math.floor((this.level * 4) / 100 + 2)));\n\t\treturn this.battle.clampIntRange(combatPower, 0, 10000);\n\t}\n\t*/\n\n\tgetWeight() {\n\t\tconst weighthg = this.battle.runEvent('ModifyWeight', this, null, null, this.weighthg);\n\t\treturn Math.max(1, weighthg);\n\t}\n\n\tgetMoveData(move: string | Move) {\n\t\tmove = this.battle.dex.moves.get(move);\n\t\tfor (const moveSlot of this.moveSlots) {\n\t\t\tif (moveSlot.id === move.id) {\n\t\t\t\treturn moveSlot;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tgetMoveHitData(move: ActiveMove) {\n\t\tif (!move.moveHitData) move.moveHitData = {};\n\t\tconst slot = this.getSlot();\n\t\treturn move.moveHitData[slot] || (move.moveHitData[slot] = {\n\t\t\tcrit: false,\n\t\t\ttypeMod: 0,\n\t\t\tzBrokeProtect: false,\n\t\t});\n\t}\n\n\talliesAndSelf(): Pokemon[] {\n\t\treturn this.side.allies();\n\t}\n\n\tallies(): Pokemon[] {\n\t\treturn this.side.allies().filter(ally => ally !== this);\n\t}\n\n\tadjacentAllies(): Pokemon[] {\n\t\treturn this.side.allies().filter(ally => this.isAdjacent(ally));\n\t}\n\n\tfoes(all?: boolean): Pokemon[] {\n\t\treturn this.side.foes(all);\n\t}\n\n\tadjacentFoes(): Pokemon[] {\n\t\tif (this.battle.activePerHalf <= 2) return this.side.foes();\n\t\treturn this.side.foes().filter(foe => this.isAdjacent(foe));\n\t}\n\n\tisAlly(pokemon: Pokemon | null) {\n\t\treturn !!pokemon && (this.side === pokemon.side || this.side.allySide === pokemon.side);\n\t}\n\n\tisAdjacent(pokemon2: Pokemon) {\n\t\tif (this.fainted || pokemon2.fainted) return false;\n\t\tif (this.battle.activePerHalf <= 2) return this !== pokemon2;\n\t\tif (this.side === pokemon2.side) return Math.abs(this.position - pokemon2.position) === 1;\n\t\treturn Math.abs(this.position + pokemon2.position + 1 - this.side.active.length) <= 1;\n\t}\n\n\tgetUndynamaxedHP(amount?: number) {\n\t\tconst hp = amount || this.hp;\n\t\tif (this.volatiles['dynamax']) {\n\t\t\treturn Math.ceil(hp * this.baseMaxhp / this.maxhp);\n\t\t}\n\t\treturn hp;\n\t}\n\n\t/** Get targets for Dragon Darts */\n\tgetSmartTargets(target: Pokemon, move: ActiveMove) {\n\t\tconst target2 = target.adjacentAllies()[0];\n\t\tif (!target2 || target2 === this || !target2.hp) {\n\t\t\tmove.smartTarget = false;\n\t\t\treturn [target];\n\t\t}\n\t\tif (!target.hp) {\n\t\t\tmove.smartTarget = false;\n\t\t\treturn [target2];\n\t\t}\n\t\treturn [target, target2];\n\t}\n\n\tgetAtLoc(targetLoc: number) {\n\t\tlet side = this.battle.sides[targetLoc < 0 ? this.side.n % 2 : (this.side.n + 1) % 2];\n\t\ttargetLoc = Math.abs(targetLoc);\n\t\tif (targetLoc > side.active.length) {\n\t\t\ttargetLoc -= side.active.length;\n\t\t\tside = this.battle.sides[side.n + 2];\n\t\t}\n\t\treturn side.active[targetLoc - 1];\n\t}\n\n\t/**\n\t * Returns a relative location: 1-3, positive for foe, and negative for ally.\n\t * Use `getAtLoc` to reverse.\n\t */\n\tgetLocOf(target: Pokemon) {\n\t\tconst positionOffset = Math.floor(target.side.n / 2) * target.side.active.length;\n\t\tconst position = target.position + positionOffset + 1;\n\t\tconst sameHalf = (this.side.n % 2) === (target.side.n % 2);\n\t\treturn sameHalf ? -position : position;\n\t}\n\n\tgetMoveTargets(move: ActiveMove, target: Pokemon): { targets: Pokemon[], pressureTargets: Pokemon[] } {\n\t\tlet targets: Pokemon[] = [];\n\n\t\tswitch (move.target) {\n\t\tcase 'all':\n\t\tcase 'foeSide':\n\t\tcase 'allySide':\n\t\tcase 'allyTeam':\n\t\t\tif (!move.target.startsWith('foe')) {\n\t\t\t\ttargets.push(...this.alliesAndSelf());\n\t\t\t}\n\t\t\tif (!move.target.startsWith('ally')) {\n\t\t\t\ttargets.push(...this.foes(true));\n\t\t\t}\n\t\t\tif (targets.length && !targets.includes(target)) {\n\t\t\t\tthis.battle.retargetLastMove(targets[targets.length - 1]);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'allAdjacent':\n\t\t\ttargets.push(...this.adjacentAllies());\n\t\t\t// falls through\n\t\tcase 'allAdjacentFoes':\n\t\t\ttargets.push(...this.adjacentFoes());\n\t\t\tif (targets.length && !targets.includes(target)) {\n\t\t\t\tthis.battle.retargetLastMove(targets[targets.length - 1]);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'allies':\n\t\t\ttargets = this.alliesAndSelf();\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tconst selectedTarget = target;\n\t\t\tif (!target || (target.fainted && !target.isAlly(this)) && this.battle.gameType !== 'freeforall') {\n\t\t\t\t// If a targeted foe faints, the move is retargeted\n\t\t\t\tconst possibleTarget = this.battle.getRandomTarget(this, move);\n\t\t\t\tif (!possibleTarget) return { targets: [], pressureTargets: [] };\n\t\t\t\ttarget = possibleTarget;\n\t\t\t}\n\t\t\tif (this.battle.activePerHalf > 1 && !move.tracksTarget) {\n\t\t\t\tconst isCharging = move.flags['charge'] && !this.volatiles['twoturnmove'] &&\n\t\t\t\t\t!(move.id.startsWith('solarb') && ['sunnyday', 'desolateland'].includes(this.effectiveWeather())) &&\n\t\t\t\t\t!(move.id === 'electroshot' && ['raindance', 'primordialsea'].includes(this.effectiveWeather())) &&\n\t\t\t\t\t!(this.hasItem('powerherb') && move.id !== 'skydrop');\n\t\t\t\tif (!isCharging) {\n\t\t\t\t\ttarget = this.battle.priorityEvent('RedirectTarget', this, this, move, target);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (move.smartTarget) {\n\t\t\t\ttargets = this.getSmartTargets(target, move);\n\t\t\t\ttarget = targets[0];\n\t\t\t} else {\n\t\t\t\ttargets.push(target);\n\t\t\t}\n\t\t\tif (target.fainted && !move.flags['futuremove']) {\n\t\t\t\treturn { targets: [], pressureTargets: [] };\n\t\t\t}\n\t\t\tif (selectedTarget !== target) {\n\t\t\t\tthis.battle.retargetLastMove(target);\n\t\t\t}\n\t\t}\n\n\t\t// Resolve apparent targets for Pressure.\n\t\tlet pressureTargets = targets;\n\t\tif (move.target === 'foeSide') {\n\t\t\tpressureTargets = [];\n\t\t}\n\t\tif (move.flags['mustpressure']) {\n\t\t\tpressureTargets = this.foes();\n\t\t}\n\n\t\treturn { targets, pressureTargets };\n\t}\n\n\tignoringAbility() {\n\t\tif (this.battle.gen >= 5 && !this.isActive) return true;\n\n\t\t// Certain Abilities won't activate while Transformed, even if they ordinarily couldn't be suppressed (e.g. Disguise)\n\t\tif (this.getAbility().flags['notransform'] && this.transformed) return true;\n\t\tif (this.getAbility().flags['cantsuppress']) return false;\n\t\tif (this.volatiles['gastroacid']) return true;\n\n\t\t// Check if any active pokemon have the ability Neutralizing Gas\n\t\tif (this.hasItem('Ability Shield') || this.ability === ('neutralizinggas' as ID)) return false;\n\t\tfor (const pokemon of this.battle.getAllActive()) {\n\t\t\t// can't use hasAbility because it would lead to infinite recursion\n\t\t\tif (pokemon.ability === ('neutralizinggas' as ID) && !pokemon.volatiles['gastroacid'] &&\n\t\t\t\t!pokemon.transformed && !pokemon.abilityState.ending && !this.volatiles['commanding']) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tignoringItem() {\n\t\treturn !this.getItem().isPrimalOrb && !!(\n\t\t\tthis.itemState.knockedOff || // Gen 3-4\n\t\t\t(this.battle.gen >= 5 && !this.isActive) ||\n\t\t\t(!this.getItem().ignoreKlutz && this.hasAbility('klutz')) ||\n\t\t\tthis.volatiles['embargo'] || this.battle.field.pseudoWeather['magicroom']\n\t\t);\n\t}\n\n\tdeductPP(move: string | Move, amount?: number | null, target?: Pokemon | null | false) {\n\t\tconst gen = this.battle.gen;\n\t\tmove = this.battle.dex.moves.get(move);\n\t\tconst ppData = this.getMoveData(move);\n\t\tif (!ppData) return 0;\n\t\tppData.used = true;\n\t\tif (!ppData.pp && gen > 1) return 0;\n\n\t\tif (!amount) amount = 1;\n\t\tppData.pp -= amount;\n\t\tif (ppData.pp < 0 && gen > 1) {\n\t\t\tamount += ppData.pp;\n\t\t\tppData.pp = 0;\n\t\t}\n\t\treturn amount;\n\t}\n\n\tmoveUsed(move: ActiveMove, targetLoc?: number) {\n\t\tthis.lastMove = move;\n\t\tif (this.battle.gen === 2) this.lastMoveEncore = move;\n\t\tthis.lastMoveTargetLoc = targetLoc;\n\t\tthis.moveThisTurn = move.id;\n\t}\n\n\tgotAttacked(move: string | Move, damage: number | false | undefined, source: Pokemon) {\n\t\tconst damageNumber = (typeof damage === 'number') ? damage : 0;\n\t\tmove = this.battle.dex.moves.get(move);\n\t\tthis.attackedBy.push({\n\t\t\tsource,\n\t\t\tdamage: damageNumber,\n\t\t\tmove: move.id,\n\t\t\tthisTurn: true,\n\t\t\tslot: source.getSlot(),\n\t\t\tdamageValue: damage,\n\t\t});\n\t}\n\n\tgetLastAttackedBy() {\n\t\tif (this.attackedBy.length === 0) return undefined;\n\t\treturn this.attackedBy[this.attackedBy.length - 1];\n\t}\n\n\tgetLastDamagedBy(filterOutSameSide: boolean) {\n\t\tconst damagedBy: Attacker[] = this.attackedBy.filter(attacker => (\n\t\t\ttypeof attacker.damageValue === 'number' &&\n\t\t\t(filterOutSameSide === undefined || !this.isAlly(attacker.source))\n\t\t));\n\t\tif (damagedBy.length === 0) return undefined;\n\t\treturn damagedBy[damagedBy.length - 1];\n\t}\n\n\t/**\n\t * This refers to multi-turn moves like SolarBeam and Outrage and\n\t * Sky Drop, which remove all choice (no dynamax, switching, etc).\n\t * Don't use it for \"soft locks\" like Choice Band.\n\t */\n\tgetLockedMove(): ID | null {\n\t\tconst lockedMove = this.battle.runEvent('LockMove', this);\n\t\treturn (lockedMove === true) ? null : lockedMove;\n\t}\n\n\tgetMoves(lockedMove?: ID | null, restrictData?: boolean): {\n\t\tmove: string, id: ID, disabled?: string | boolean, disabledSource?: string,\n\t\ttarget?: string, pp?: number, maxpp?: number,\n\t}[] {\n\t\tif (lockedMove) {\n\t\t\tlockedMove = toID(lockedMove);\n\t\t\tthis.trapped = true;\n\t\t\tif (lockedMove === 'recharge') {\n\t\t\t\treturn [{\n\t\t\t\t\tmove: 'Recharge',\n\t\t\t\t\tid: 'recharge' as ID,\n\t\t\t\t}];\n\t\t\t}\n\t\t\tfor (const moveSlot of this.moveSlots) {\n\t\t\t\tif (moveSlot.id !== lockedMove) continue;\n\t\t\t\treturn [{\n\t\t\t\t\tmove: moveSlot.move,\n\t\t\t\t\tid: moveSlot.id,\n\t\t\t\t}];\n\t\t\t}\n\t\t\t// does this happen?\n\t\t\treturn [{\n\t\t\t\tmove: this.battle.dex.moves.get(lockedMove).name,\n\t\t\t\tid: lockedMove,\n\t\t\t}];\n\t\t}\n\t\tconst moves = [];\n\t\tlet hasValidMove = false;\n\t\tfor (const moveSlot of this.moveSlots) {\n\t\t\tlet moveName = moveSlot.move;\n\t\t\tif (moveSlot.id === 'hiddenpower') {\n\t\t\t\tmoveName = `Hidden Power ${this.hpType}`;\n\t\t\t\tif (this.battle.gen < 6) moveName += ` ${this.hpPower}`;\n\t\t\t} else if (moveSlot.id === 'return' || moveSlot.id === 'frustration') {\n\t\t\t\tconst basePowerCallback = this.battle.dex.moves.get(moveSlot.id).basePowerCallback as (pokemon: Pokemon) => number;\n\t\t\t\tmoveName += ` ${basePowerCallback(this)}`;\n\t\t\t}\n\t\t\tlet target = moveSlot.target;\n\t\t\tswitch (moveSlot.id) {\n\t\t\tcase 'curse':\n\t\t\t\tif (!this.hasType('Ghost')) {\n\t\t\t\t\ttarget = this.battle.dex.moves.get('curse').nonGhostTarget;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'pollenpuff':\n\t\t\t\t// Heal Block only prevents Pollen Puff from targeting an ally when the user has Heal Block\n\t\t\t\tif (this.volatiles['healblock']) {\n\t\t\t\t\ttarget = 'adjacentFoe';\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'terastarstorm':\n\t\t\t\tif (this.species.name === 'Terapagos-Stellar') {\n\t\t\t\t\ttarget = 'allAdjacentFoes';\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tlet disabled = moveSlot.disabled;\n\t\t\tif (this.volatiles['dynamax']) {\n\t\t\t\t// if each of a Pokemon's base moves are disabled by one of these effects, it will Struggle\n\t\t\t\tconst canCauseStruggle = ['Encore', 'Disable', 'Taunt', 'Assault Vest', 'Belch', 'Stuff Cheeks'];\n\t\t\t\tdisabled = this.maxMoveDisabled(moveSlot.id) || disabled && canCauseStruggle.includes(moveSlot.disabledSource!);\n\t\t\t} else if (\n\t\t\t\t(moveSlot.pp <= 0 && !this.volatiles['partialtrappinglock']) || disabled &&\n\t\t\t\tthis.side.active.length >= 2 && this.battle.actions.targetTypeChoices(target!)\n\t\t\t) {\n\t\t\t\tdisabled = true;\n\t\t\t}\n\n\t\t\tif (!disabled) {\n\t\t\t\thasValidMove = true;\n\t\t\t} else if (disabled === 'hidden' && restrictData) {\n\t\t\t\tdisabled = false;\n\t\t\t}\n\n\t\t\tmoves.push({\n\t\t\t\tmove: moveName,\n\t\t\t\tid: moveSlot.id,\n\t\t\t\tpp: moveSlot.pp,\n\t\t\t\tmaxpp: moveSlot.maxpp,\n\t\t\t\ttarget,\n\t\t\t\tdisabled,\n\t\t\t});\n\t\t}\n\t\treturn hasValidMove ? moves : [];\n\t}\n\n\t/** This should be passed the base move and not the corresponding max move so we can check how much PP is left. */\n\tmaxMoveDisabled(baseMove: Move | string) {\n\t\tbaseMove = this.battle.dex.moves.get(baseMove);\n\t\tif (!this.getMoveData(baseMove.id)?.pp) return true;\n\t\treturn !!(baseMove.category === 'Status' && (this.hasItem('assaultvest') || this.volatiles['taunt']));\n\t}\n\n\tgetDynamaxRequest(skipChecks?: boolean) {\n\t\t// {gigantamax?: string, maxMoves: {[k: string]: string} | null}[]\n\t\tif (!skipChecks) {\n\t\t\tif (!this.side.canDynamaxNow()) return;\n\t\t\tif (\n\t\t\t\tthis.species.isMega || this.species.isPrimal || this.species.forme === \"Ultra\" ||\n\t\t\t\tthis.getItem().zMove || this.canMegaEvo\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Some pokemon species are unable to dynamax\n\t\t\tif (this.species.cannotDynamax || this.illusion?.species.cannotDynamax) return;\n\t\t}\n\t\tconst result: DynamaxOptions = { maxMoves: [] };\n\t\tlet atLeastOne = false;\n\t\tfor (const moveSlot of this.moveSlots) {\n\t\t\tconst move = this.battle.dex.moves.get(moveSlot.id);\n\t\t\tconst maxMove = this.battle.actions.getMaxMove(move, this);\n\t\t\tif (maxMove) {\n\t\t\t\tif (this.maxMoveDisabled(move)) {\n\t\t\t\t\tresult.maxMoves.push({ move: maxMove.id, target: maxMove.target, disabled: true });\n\t\t\t\t} else {\n\t\t\t\t\tresult.maxMoves.push({ move: maxMove.id, target: maxMove.target });\n\t\t\t\t\tatLeastOne = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!atLeastOne) return;\n\t\tif (this.canGigantamax) result.gigantamax = this.canGigantamax;\n\t\treturn result;\n\t}\n\n\tgetMoveRequestData() {\n\t\tlet lockedMove = this.getLockedMove();\n\n\t\t// Information should be restricted for the last active Pok\u00E9mon\n\t\tconst isLastActive = this.isLastActive();\n\t\tconst canSwitchIn = this.battle.canSwitch(this.side) > 0;\n\t\tlet moves = this.getMoves(lockedMove, isLastActive);\n\n\t\tif (!moves.length) {\n\t\t\tmoves = [{ move: 'Struggle', id: 'struggle' as ID, target: 'randomNormal', disabled: false }];\n\t\t\tlockedMove = 'struggle' as ID;\n\t\t}\n\n\t\tconst data: PokemonMoveRequestData = {\n\t\t\tmoves,\n\t\t};\n\n\t\tif (isLastActive) {\n\t\t\tif (this.maybeDisabled) {\n\t\t\t\tdata.maybeDisabled = true;\n\t\t\t}\n\t\t\tif (canSwitchIn) {\n\t\t\t\tif (this.trapped === true) {\n\t\t\t\t\tdata.trapped = true;\n\t\t\t\t} else if (this.maybeTrapped) {\n\t\t\t\t\tdata.maybeTrapped = true;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (canSwitchIn) {\n\t\t\t// Discovered by selecting a valid Pok\u00E9mon as a switch target and cancelling.\n\t\t\tif (this.trapped) data.trapped = true;\n\t\t}\n\n\t\tif (!lockedMove) {\n\t\t\tif (this.canMegaEvo) data.canMegaEvo = true;\n\t\t\tif (this.canMegaEvoX) data.canMegaEvoX = true;\n\t\t\tif (this.canMegaEvoY) data.canMegaEvoY = true;\n\t\t\tif (this.canUltraBurst) data.canUltraBurst = true;\n\t\t\tconst canZMove = this.battle.actions.canZMove(this);\n\t\t\tif (canZMove) data.canZMove = canZMove;\n\n\t\t\tif (this.getDynamaxRequest()) data.canDynamax = true;\n\t\t\tif (data.canDynamax || this.volatiles['dynamax']) data.maxMoves = this.getDynamaxRequest(true);\n\t\t\tif (this.canTerastallize) data.canTerastallize = this.canTerastallize;\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tgetSwitchRequestData(forAlly?: boolean): PokemonSwitchRequestData {\n\t\tconst entry: PokemonSwitchRequestData = {\n\t\t\tident: this.fullname,\n\t\t\tdetails: this.details,\n\t\t\tcondition: this.getHealth().secret,\n\t\t\tactive: (this.position < this.side.active.length),\n\t\t\tstats: {\n\t\t\t\tatk: this.baseStoredStats['atk'],\n\t\t\t\tdef: this.baseStoredStats['def'],\n\t\t\t\tspa: this.baseStoredStats['spa'],\n\t\t\t\tspd: this.baseStoredStats['spd'],\n\t\t\t\tspe: this.baseStoredStats['spe'],\n\t\t\t},\n\t\t\tmoves: this[forAlly ? 'baseMoves' : 'moves'].map(move => {\n\t\t\t\tif (move === 'hiddenpower') {\n\t\t\t\t\treturn `${move}${toID(this.hpType)}${this.battle.gen < 6 ? '' : this.hpPower}` as ID;\n\t\t\t\t}\n\t\t\t\tif (move === 'frustration' || move === 'return') {\n\t\t\t\t\tconst basePowerCallback = this.battle.dex.moves.get(move).basePowerCallback as (pokemon: Pokemon) => number;\n\t\t\t\t\treturn `${move}${basePowerCallback(this)}` as ID;\n\t\t\t\t}\n\t\t\t\treturn move as ID;\n\t\t\t}),\n\t\t\tbaseAbility: this.baseAbility,\n\t\t\titem: this.item,\n\t\t\tpokeball: this.pokeball,\n\t\t};\n\t\tif (this.battle.gen > 6) entry.ability = this.ability;\n\t\tif (this.battle.gen >= 9) {\n\t\t\tentry.commanding = !!this.volatiles['commanding'] && !this.fainted;\n\t\t\tentry.reviving = this.isActive && !!this.side.slotConditions[this.position]['revivalblessing'];\n\t\t}\n\t\tif (this.battle.gen === 9) {\n\t\t\tentry.teraType = this.teraType;\n\t\t\tentry.terastallized = this.terastallized || '';\n\t\t}\n\t\treturn entry;\n\t}\n\n\tisLastActive() {\n\t\tif (!this.isActive) return false;\n\t\tconst allyActive = this.side.active;\n\t\tfor (let i = this.position + 1; i < allyActive.length; i++) {\n\t\t\tif (allyActive[i] && !allyActive[i].fainted) return false;\n\t\t}\n\t\treturn true;\n\t}\n\n\tpositiveBoosts() {\n\t\tlet boosts = 0;\n\t\tlet boost: BoostID;\n\t\tfor (boost in this.boosts) {\n\t\t\tif (this.boosts[boost] > 0) boosts += this.boosts[boost];\n\t\t}\n\t\treturn boosts;\n\t}\n\n\tgetCappedBoost(boosts: SparseBoostsTable) {\n\t\tconst cappedBoost: SparseBoostsTable = {};\n\t\tlet boostName: BoostID;\n\t\tfor (boostName in boosts) {\n\t\t\tconst boost = boosts[boostName];\n\t\t\tif (!boost) continue;\n\t\t\tcappedBoost[boostName] = this.battle.clampIntRange(this.boosts[boostName] + boost, -6, 6) - this.boosts[boostName];\n\t\t}\n\t\treturn cappedBoost;\n\t}\n\n\tboostBy(boosts: SparseBoostsTable) {\n\t\tboosts = this.getCappedBoost(boosts);\n\t\tlet delta = 0;\n\t\tlet boostName: BoostID;\n\t\tfor (boostName in boosts) {\n\t\t\tdelta = boosts[boostName]!;\n\t\t\tthis.boosts[boostName] += delta;\n\t\t}\n\t\treturn delta;\n\t}\n\n\tclearBoosts() {\n\t\tlet boostName: BoostID;\n\t\tfor (boostName in this.boosts) {\n\t\t\tthis.boosts[boostName] = 0;\n\t\t}\n\t}\n\n\tsetBoost(boosts: SparseBoostsTable) {\n\t\tlet boostName: BoostID;\n\t\tfor (boostName in boosts) {\n\t\t\tthis.boosts[boostName] = boosts[boostName]!;\n\t\t}\n\t}\n\n\tcopyVolatileFrom(pokemon: Pokemon, switchCause?: string | boolean) {\n\t\tthis.clearVolatile();\n\t\tif (switchCause !== 'shedtail') this.boosts = pokemon.boosts;\n\t\tfor (const i in pokemon.volatiles) {\n\t\t\tif (switchCause === 'shedtail' && i !== 'substitute') continue;\n\t\t\tif (this.battle.dex.conditions.getByID(i as ID).noCopy) continue;\n\t\t\t// shallow clones\n\t\t\tthis.volatiles[i] = this.battle.initEffectState({ ...pokemon.volatiles[i] });\n\t\t\tif (this.volatiles[i].linkedPokemon) {\n\t\t\t\tdelete pokemon.volatiles[i].linkedPokemon;\n\t\t\t\tdelete pokemon.volatiles[i].linkedStatus;\n\t\t\t\tfor (const linkedPoke of this.volatiles[i].linkedPokemon) {\n\t\t\t\t\tconst linkedPokeLinks = linkedPoke.volatiles[this.volatiles[i].linkedStatus].linkedPokemon;\n\t\t\t\t\tlinkedPokeLinks[linkedPokeLinks.indexOf(pokemon)] = this;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tpokemon.clearVolatile();\n\t\tfor (const i in this.volatiles) {\n\t\t\tconst volatile = this.getVolatile(i) as Condition;\n\t\t\tthis.battle.singleEvent('Copy', volatile, this.volatiles[i], this);\n\t\t}\n\t}\n\n\ttransformInto(pokemon: Pokemon, effect?: Effect) {\n\t\tconst species = pokemon.species;\n\t\tif (\n\t\t\tpokemon.fainted || this.illusion || pokemon.illusion || (pokemon.volatiles['substitute'] && this.battle.gen >= 5) ||\n\t\t\t(pokemon.transformed && this.battle.gen >= 2) || (this.transformed && this.battle.gen >= 5) ||\n\t\t\tspecies.name === 'Eternatus-Eternamax' ||\n\t\t\t(['Ogerpon', 'Terapagos'].includes(species.baseSpecies) && (this.terastallized || pokemon.terastallized)) ||\n\t\t\tthis.terastallized === 'Stellar'\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (this.battle.dex.currentMod === 'gen1stadium' && (\n\t\t\tspecies.name === 'Ditto' ||\n\t\t\t(this.species.name === 'Ditto' && pokemon.moves.includes('transform'))\n\t\t)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!this.setSpecies(species, effect, true)) return false;\n\n\t\tthis.transformed = true;\n\t\tthis.weighthg = pokemon.weighthg;\n\n\t\tconst types = pokemon.getTypes(true, true);\n\t\tthis.setType(pokemon.volatiles['roost'] ? pokemon.volatiles['roost'].typeWas : types, true);\n\t\tthis.addedType = pokemon.addedType;\n\t\tthis.knownType = this.isAlly(pokemon) && pokemon.knownType;\n\t\tthis.apparentType = pokemon.apparentType;\n\n\t\tlet statName: StatIDExceptHP;\n\t\tfor (statName in this.storedStats) {\n\t\t\tthis.storedStats[statName] = pokemon.storedStats[statName];\n\t\t\tif (this.modifiedStats) this.modifiedStats[statName] = pokemon.modifiedStats![statName]; // Gen 1: Copy modified stats.\n\t\t}\n\t\tthis.moveSlots = [];\n\t\tthis.hpType = (this.battle.gen >= 5 ? this.hpType : pokemon.hpType);\n\t\tthis.hpPower = (this.battle.gen >= 5 ? this.hpPower : pokemon.hpPower);\n\t\tthis.timesAttacked = pokemon.timesAttacked;\n\t\tfor (const moveSlot of pokemon.moveSlots) {\n\t\t\tlet moveName = moveSlot.move;\n\t\t\tif (moveSlot.id === 'hiddenpower') {\n\t\t\t\tmoveName = 'Hidden Power ' + this.hpType;\n\t\t\t}\n\t\t\tthis.moveSlots.push({\n\t\t\t\tmove: moveName,\n\t\t\t\tid: moveSlot.id,\n\t\t\t\tpp: moveSlot.maxpp === 1 ? 1 : 5,\n\t\t\t\tmaxpp: this.battle.gen >= 5 ? (moveSlot.maxpp === 1 ? 1 : 5) : moveSlot.maxpp,\n\t\t\t\ttarget: moveSlot.target,\n\t\t\t\tdisabled: false,\n\t\t\t\tused: false,\n\t\t\t\tvirtual: true,\n\t\t\t});\n\t\t}\n\t\tlet boostName: BoostID;\n\t\tfor (boostName in pokemon.boosts) {\n\t\t\tthis.boosts[boostName] = pokemon.boosts[boostName];\n\t\t}\n\t\tif (this.battle.gen >= 6) {\n\t\t\t// we need to remove all of the overlapping crit volatiles before adding any of them\n\t\t\tconst volatilesToCopy = ['dragoncheer', 'focusenergy', 'gmaxchistrike', 'laserfocus'];\n\t\t\tfor (const volatile of volatilesToCopy) this.removeVolatile(volatile);\n\t\t\tfor (const volatile of volatilesToCopy) {\n\t\t\t\tif (pokemon.volatiles[volatile]) {\n\t\t\t\t\tthis.addVolatile(volatile);\n\t\t\t\t\tif (volatile === 'gmaxchistrike') this.volatiles[volatile].layers = pokemon.volatiles[volatile].layers;\n\t\t\t\t\tif (volatile === 'dragoncheer') this.volatiles[volatile].hasDragonType = pokemon.volatiles[volatile].hasDragonType;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (effect) {\n\t\t\tthis.battle.add('-transform', this, pokemon, '[from] ' + effect.fullname);\n\t\t} else {\n\t\t\tthis.battle.add('-transform', this, pokemon);\n\t\t}\n\t\tif (this.terastallized) {\n\t\t\tthis.knownType = true;\n\t\t\tthis.apparentType = this.terastallized;\n\t\t}\n\t\tif (this.battle.gen > 2) this.setAbility(pokemon.ability, this, true, true);\n\n\t\t// Change formes based on held items (for Transform)\n\t\t// Only ever relevant in Generation 4 since Generation 3 didn't have item-based forme changes\n\t\tif (this.battle.gen === 4) {\n\t\t\tif (this.species.num === 487) {\n\t\t\t\t// Giratina formes\n\t\t\t\tif (this.species.name === 'Giratina' && this.item === 'griseousorb') {\n\t\t\t\t\tthis.formeChange('Giratina-Origin');\n\t\t\t\t} else if (this.species.name === 'Giratina-Origin' && this.item !== 'griseousorb') {\n\t\t\t\t\tthis.formeChange('Giratina');\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.species.num === 493) {\n\t\t\t\t// Arceus formes\n\t\t\t\tconst item = this.getItem();\n\t\t\t\tconst targetForme = (item?.onPlate ? 'Arceus-' + item.onPlate : 'Arceus');\n\t\t\t\tif (this.species.name !== targetForme) {\n\t\t\t\t\tthis.formeChange(targetForme);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Pokemon transformed into Ogerpon cannot Terastallize\n\t\t// restoring their ability to tera after they untransform is handled ELSEWHERE\n\t\tif (['Ogerpon', 'Terapagos'].includes(this.species.baseSpecies) && this.canTerastallize) this.canTerastallize = false;\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Changes this Pokemon's species to the given speciesId (or species).\n\t * This function only handles changes to stats and type.\n\t * Use formeChange to handle changes to ability and sending client messages.\n\t */\n\tsetSpecies(rawSpecies: Species, source: Effect | null = this.battle.effect, isTransform = false) {\n\t\tconst species = this.battle.runEvent('ModifySpecies', this, null, source, rawSpecies);\n\t\tif (!species) return null;\n\t\tthis.species = species;\n\n\t\tthis.setType(species.types, true);\n\t\tthis.apparentType = rawSpecies.types.join('/');\n\t\tthis.addedType = species.addedType || '';\n\t\tthis.knownType = true;\n\t\tthis.weighthg = species.weighthg;\n\n\t\tconst stats = this.battle.spreadModify(this.species.baseStats, this.set);\n\t\tif (this.species.maxHP) stats.hp = this.species.maxHP;\n\n\t\tif (!this.maxhp) {\n\t\t\tthis.baseMaxhp = stats.hp;\n\t\t\tthis.maxhp = stats.hp;\n\t\t\tthis.hp = stats.hp;\n\t\t}\n\n\t\tif (!isTransform) this.baseStoredStats = stats;\n\t\tlet statName: StatIDExceptHP;\n\t\tfor (statName in this.storedStats) {\n\t\t\tthis.storedStats[statName] = stats[statName];\n\t\t\tif (this.modifiedStats) this.modifiedStats[statName] = stats[statName]; // Gen 1: Reset modified stats.\n\t\t}\n\t\tif (this.battle.gen <= 1) {\n\t\t\t// Gen 1: Re-Apply burn and para drops.\n\t\t\tif (this.status === 'par') this.modifyStat!('spe', 0.25);\n\t\t\tif (this.status === 'brn') this.modifyStat!('atk', 0.5);\n\t\t}\n\t\tthis.speed = this.storedStats.spe;\n\t\treturn species;\n\t}\n\n\t/**\n\t * Changes this Pokemon's forme to match the given speciesId (or species).\n\t * This function handles all changes to stats, ability, type, species, etc.\n\t * as well as sending all relevant messages sent to the client.\n\t */\n\tformeChange(\n\t\tspeciesId: string | Species, source: Effect | null = this.battle.effect,\n\t\tisPermanent?: boolean, abilitySlot = '0', message?: string\n\t) {\n\t\tconst rawSpecies = this.battle.dex.species.get(speciesId);\n\n\t\tconst species = this.setSpecies(rawSpecies, source);\n\t\tif (!species) return false;\n\n\t\tif (this.battle.gen <= 2) return true;\n\n\t\t// The species the opponent sees\n\t\tconst apparentSpecies =\n\t\t\tthis.illusion ? this.illusion.species.name : species.baseSpecies;\n\t\tif (isPermanent) {\n\t\t\tif (!this.transformed) this.regressionForme = true;\n\t\t\tthis.baseSpecies = rawSpecies;\n\t\t\tthis.details = this.getUpdatedDetails();\n\t\t\tlet details = (this.illusion || this).details;\n\t\t\tif (this.terastallized) details += `, tera:${this.terastallized}`;\n\t\t\tthis.battle.add('detailschange', this, details);\n\t\t\tif (!source) {\n\t\t\t\t// Tera forme\n\t\t\t\t// Ogerpon/Terapagos text goes here\n\t\t\t} else if (source.effectType === 'Item') {\n\t\t\t\tthis.canTerastallize = null; // National Dex behavior\n\t\t\t\tif (source.zMove) {\n\t\t\t\t\tthis.battle.add('-burst', this, apparentSpecies, species.requiredItem);\n\t\t\t\t\tthis.moveThisTurnResult = true; // Ultra Burst counts as an action for Truant\n\t\t\t\t} else if (source.isPrimalOrb) {\n\t\t\t\t\tif (this.illusion) {\n\t\t\t\t\t\tthis.ability = '';\n\t\t\t\t\t\tthis.battle.add('-primal', this.illusion, species.requiredItem);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.battle.add('-primal', this, species.requiredItem);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.battle.add('-mega', this, apparentSpecies, species.requiredItem);\n\t\t\t\t\tthis.moveThisTurnResult = true; // Mega Evolution counts as an action for Truant\n\t\t\t\t}\n\t\t\t} else if (source.effectType === 'Status') {\n\t\t\t\t// Shaymin-Sky -> Shaymin\n\t\t\t\tthis.battle.add('-formechange', this, species.name, message);\n\t\t\t}\n\t\t} else {\n\t\t\tif (source?.effectType === 'Ability') {\n\t\t\t\tthis.battle.add('-formechange', this, species.name, message, `[from] ability: ${source.name}`);\n\t\t\t} else {\n\t\t\t\tthis.battle.add('-formechange', this, this.illusion ? this.illusion.species.name : species.name, message);\n\t\t\t}\n\t\t}\n\t\tif (isPermanent && (!source || !['disguise', 'iceface'].includes(source.id))) {\n\t\t\tif (this.illusion) {\n\t\t\t\tthis.ability = ''; // Don't allow Illusion to wear off\n\t\t\t}\n\t\t\tconst ability = species.abilities[abilitySlot] || species.abilities['0'];\n\t\t\t// Ogerpon's forme change doesn't override permanent abilities\n\t\t\tif (source || !this.getAbility().flags['cantsuppress']) this.setAbility(ability, null, true);\n\t\t\t// However, its ability does reset upon switching out\n\t\t\tthis.baseAbility = toID(ability);\n\t\t}\n\t\tif (this.terastallized) {\n\t\t\tthis.knownType = true;\n\t\t\tthis.apparentType = this.terastallized;\n\t\t}\n\t\treturn true;\n\t}\n\n\tclearVolatile(includeSwitchFlags = true) {\n\t\tthis.boosts = {\n\t\t\tatk: 0,\n\t\t\tdef: 0,\n\t\t\tspa: 0,\n\t\t\tspd: 0,\n\t\t\tspe: 0,\n\t\t\taccuracy: 0,\n\t\t\tevasion: 0,\n\t\t};\n\n\t\tif (this.battle.gen === 1 && this.baseMoves.includes('mimic' as ID) && !this.transformed) {\n\t\t\tconst moveslot = this.baseMoves.indexOf('mimic' as ID);\n\t\t\tconst mimicPP = this.moveSlots[moveslot] ? this.moveSlots[moveslot].pp : 16;\n\t\t\tthis.moveSlots = this.baseMoveSlots.slice();\n\t\t\tthis.moveSlots[moveslot].pp = mimicPP;\n\t\t} else {\n\t\t\tthis.moveSlots = this.baseMoveSlots.slice();\n\t\t}\n\n\t\tthis.transformed = false;\n\t\tthis.ability = this.baseAbility;\n\t\tthis.hpType = this.baseHpType;\n\t\tthis.hpPower = this.baseHpPower;\n\t\tif (this.canTerastallize === false) this.canTerastallize = this.teraType;\n\t\tfor (const i in this.volatiles) {\n\t\t\tif (this.volatiles[i].linkedStatus) {\n\t\t\t\tthis.removeLinkedVolatiles(this.volatiles[i].linkedStatus, this.volatiles[i].linkedPokemon);\n\t\t\t}\n\t\t}\n\t\tif (this.species.name === 'Eternatus-Eternamax' && this.volatiles['dynamax']) {\n\t\t\tthis.volatiles = { dynamax: this.volatiles['dynamax'] };\n\t\t} else {\n\t\t\tthis.volatiles = {};\n\t\t}\n\t\tif (includeSwitchFlags) {\n\t\t\tthis.switchFlag = false;\n\t\t\tthis.forceSwitchFlag = false;\n\t\t}\n\n\t\tthis.lastMove = null;\n\t\tif (this.battle.gen === 2) this.lastMoveEncore = null;\n\t\tthis.lastMoveUsed = null;\n\t\tthis.moveThisTurn = '';\n\t\tthis.moveLastTurnResult = undefined;\n\t\tthis.moveThisTurnResult = undefined;\n\n\t\tthis.lastDamage = 0;\n\t\tthis.attackedBy = [];\n\t\tthis.hurtThisTurn = null;\n\t\tthis.newlySwitched = true;\n\t\tthis.beingCalledBack = false;\n\n\t\tthis.volatileStaleness = undefined;\n\n\t\tdelete this.abilityState.started;\n\t\tdelete this.itemState.started;\n\n\t\tthis.setSpecies(this.baseSpecies);\n\t}\n\n\thasType(type: string | string[]) {\n\t\tconst thisTypes = this.getTypes();\n\t\tif (typeof type === 'string') {\n\t\t\treturn thisTypes.includes(type);\n\t\t}\n\n\t\tfor (const typeName of type) {\n\t\t\tif (thisTypes.includes(typeName)) return true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * This function only puts the pokemon in the faint queue;\n\t * actually setting of this.fainted comes later when the\n\t * faint queue is resolved.\n\t *\n\t * Returns the amount of damage actually dealt\n\t */\n\tfaint(source: Pokemon | null = null, effect: Effect | null = null) {\n\t\tif (this.fainted || this.faintQueued) return 0;\n\t\tconst d = this.hp;\n\t\tthis.hp = 0;\n\t\tthis.switchFlag = false;\n\t\tthis.faintQueued = true;\n\t\tthis.battle.faintQueue.push({\n\t\t\ttarget: this,\n\t\t\tsource,\n\t\t\teffect,\n\t\t});\n\t\treturn d;\n\t}\n\n\tdamage(d: number, source: Pokemon | null = null, effect: Effect | null = null) {\n\t\tif (!this.hp || isNaN(d) || d <= 0) return 0;\n\t\tif (d < 1 && d > 0) d = 1;\n\t\td = this.battle.trunc(d);\n\t\tthis.hp -= d;\n\t\tif (this.hp <= 0) {\n\t\t\td += this.hp;\n\t\t\tthis.faint(source, effect);\n\t\t}\n\t\treturn d;\n\t}\n\n\ttryTrap(isHidden = false) {\n\t\tif (!this.runStatusImmunity('trapped')) return false;\n\t\tif (this.trapped && isHidden) return true;\n\t\tthis.trapped = isHidden ? 'hidden' : true;\n\t\treturn true;\n\t}\n\n\thasMove(moveid: string) {\n\t\tmoveid = toID(moveid);\n\t\tif (moveid.substr(0, 11) === 'hiddenpower') moveid = 'hiddenpower';\n\t\tfor (const moveSlot of this.moveSlots) {\n\t\t\tif (moveid === moveSlot.id) {\n\t\t\t\treturn moveid;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tdisableMove(moveid: string, isHidden?: boolean | string, sourceEffect?: Effect) {\n\t\tif (!sourceEffect && this.battle.event) {\n\t\t\tsourceEffect = this.battle.effect;\n\t\t}\n\t\tmoveid = toID(moveid);\n\n\t\tfor (const moveSlot of this.moveSlots) {\n\t\t\tif (moveSlot.id === moveid && moveSlot.disabled !== true) {\n\t\t\t\tmoveSlot.disabled = (isHidden || true);\n\t\t\t\tmoveSlot.disabledSource = (sourceEffect?.name || moveSlot.move);\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Returns the amount of damage actually healed */\n\theal(d: number, source: Pokemon | null = null, effect: Effect | null = null) {\n\t\tif (!this.hp) return false;\n\t\td = this.battle.trunc(d);\n\t\tif (isNaN(d)) return false;\n\t\tif (d <= 0) return false;\n\t\tif (this.hp >= this.maxhp) return false;\n\t\tthis.hp += d;\n\t\tif (this.hp > this.maxhp) {\n\t\t\td -= this.hp - this.maxhp;\n\t\t\tthis.hp = this.maxhp;\n\t\t}\n\t\treturn d;\n\t}\n\n\t/** Sets HP, returns delta */\n\tsethp(d: number) {\n\t\tif (!this.hp) return 0;\n\t\td = this.battle.trunc(d);\n\t\tif (isNaN(d)) return;\n\t\tif (d < 1) d = 1;\n\t\td -= this.hp;\n\t\tthis.hp += d;\n\t\tif (this.hp > this.maxhp) {\n\t\t\td -= this.hp - this.maxhp;\n\t\t\tthis.hp = this.maxhp;\n\t\t}\n\t\treturn d;\n\t}\n\n\ttrySetStatus(status: string | Condition, source: Pokemon | null = null, sourceEffect: Effect | null = null) {\n\t\treturn this.setStatus(this.status || status, source, sourceEffect);\n\t}\n\n\t/** Unlike clearStatus, gives cure message */\n\tcureStatus(silent = false) {\n\t\tif (!this.hp || !this.status) return false;\n\t\tthis.battle.add('-curestatus', this, this.status, silent ? '[silent]' : '[msg]');\n\t\tif (this.status === 'slp' && this.removeVolatile('nightmare')) {\n\t\t\tthis.battle.add('-end', this, 'Nightmare', '[silent]');\n\t\t}\n\t\tthis.setStatus('');\n\t\treturn true;\n\t}\n\n\tsetStatus(\n\t\tstatus: string | Condition,\n\t\tsource: Pokemon | null = null,\n\t\tsourceEffect: Effect | null = null,\n\t\tignoreImmunities = false\n\t) {\n\t\tif (!this.hp) return false;\n\t\tstatus = this.battle.dex.conditions.get(status);\n\t\tif (this.battle.event) {\n\t\t\tif (!source) source = this.battle.event.source;\n\t\t\tif (!sourceEffect) sourceEffect = this.battle.effect;\n\t\t}\n\t\tif (!source) source = this;\n\n\t\tif (this.status === status.id) {\n\t\t\tif ((sourceEffect as Move)?.status === this.status) {\n\t\t\t\tthis.battle.add('-fail', this, this.status);\n\t\t\t} else if ((sourceEffect as Move)?.status) {\n\t\t\t\tthis.battle.add('-fail', source);\n\t\t\t\tthis.battle.attrLastMove('[still]');\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\tif (\n\t\t\t!ignoreImmunities && status.id && !(source?.hasAbility('corrosion') && ['tox', 'psn'].includes(status.id))\n\t\t) {\n\t\t\t// the game currently never ignores immunities\n\t\t\tif (!this.runStatusImmunity(status.id === 'tox' ? 'psn' : status.id)) {\n\t\t\t\tthis.battle.debug('immune to status');\n\t\t\t\tif ((sourceEffect as Move)?.status) {\n\t\t\t\t\tthis.battle.add('-immune', this);\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\tconst prevStatus = this.status;\n\t\tconst prevStatusState = this.statusState;\n\t\tif (status.id) {\n\t\t\tconst result: boolean = this.battle.runEvent('SetStatus', this, source, sourceEffect, status);\n\t\t\tif (!result) {\n\t\t\t\tthis.battle.debug('set status [' + status.id + '] interrupted');\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\n\t\tthis.status = status.id;\n\t\tthis.statusState = this.battle.initEffectState({ id: status.id, target: this });\n\t\tif (source) this.statusState.source = source;\n\t\tif (status.duration) this.statusState.duration = status.duration;\n\t\tif (status.durationCallback) {\n\t\t\tthis.statusState.duration = status.durationCallback.call(this.battle, this, source, sourceEffect);\n\t\t}\n\n\t\tif (status.id && !this.battle.singleEvent('Start', status, this.statusState, this, source, sourceEffect)) {\n\t\t\tthis.battle.debug('status start [' + status.id + '] interrupted');\n\t\t\t// cancel the setstatus\n\t\t\tthis.status = prevStatus;\n\t\t\tthis.statusState = prevStatusState;\n\t\t\treturn false;\n\t\t}\n\t\tif (status.id && !this.battle.runEvent('AfterSetStatus', this, source, sourceEffect, status)) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Unlike cureStatus, does not give cure message\n\t */\n\tclearStatus() {\n\t\tif (!this.hp || !this.status) return false;\n\t\tif (this.status === 'slp' && this.removeVolatile('nightmare')) {\n\t\t\tthis.battle.add('-end', this, 'Nightmare', '[silent]');\n\t\t}\n\t\tthis.setStatus('');\n\t\treturn true;\n\t}\n\n\tgetStatus() {\n\t\treturn this.battle.dex.conditions.getByID(this.status);\n\t}\n\n\teatItem(force?: boolean, source?: Pokemon, sourceEffect?: Effect) {\n\t\tif (!this.item || this.itemState.knockedOff) return false;\n\t\tif ((!this.hp && this.item !== 'jabocaberry' && this.item !== 'rowapberry') || !this.isActive) return false;\n\n\t\tif (!sourceEffect && this.battle.effect) sourceEffect = this.battle.effect;\n\t\tif (!source && this.battle.event?.target) source = this.battle.event.target;\n\t\tconst item = this.getItem();\n\t\tif (sourceEffect?.effectType === 'Item' && this.item !== sourceEffect.id && source === this) {\n\t\t\t// if an item is telling us to eat it but we aren't holding it, we probably shouldn't eat what we are holding\n\t\t\treturn false;\n\t\t}\n\t\tif (\n\t\t\tthis.battle.runEvent('UseItem', this, null, null, item) &&\n\t\t\t(force || this.battle.runEvent('TryEatItem', this, null, null, item))\n\t\t) {\n\t\t\tthis.battle.add('-enditem', this, item, '[eat]');\n\n\t\t\tthis.battle.singleEvent('Eat', item, this.itemState, this, source, sourceEffect);\n\t\t\tthis.battle.runEvent('EatItem', this, null, null, item);\n\n\t\t\tif (RESTORATIVE_BERRIES.has(item.id)) {\n\t\t\t\tswitch (this.pendingStaleness) {\n\t\t\t\tcase 'internal':\n\t\t\t\t\tif (this.staleness !== 'external') this.staleness = 'internal';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'external':\n\t\t\t\t\tthis.staleness = 'external';\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tthis.pendingStaleness = undefined;\n\t\t\t}\n\n\t\t\tthis.lastItem = this.item;\n\t\t\tthis.item = '';\n\t\t\tthis.battle.clearEffectState(this.itemState);\n\t\t\tthis.usedItemThisTurn = true;\n\t\t\tthis.ateBerry = true;\n\t\t\tthis.battle.runEvent('AfterUseItem', this, null, null, item);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tuseItem(source?: Pokemon, sourceEffect?: Effect) {\n\t\tif ((!this.hp && !this.getItem().isGem) || !this.isActive) return false;\n\t\tif (!this.item || this.itemState.knockedOff) return false;\n\n\t\tif (!sourceEffect && this.battle.effect) sourceEffect = this.battle.effect;\n\t\tif (!source && this.battle.event?.target) source = this.battle.event.target;\n\t\tconst item = this.getItem();\n\t\tif (sourceEffect?.effectType === 'Item' && this.item !== sourceEffect.id && source === this) {\n\t\t\t// if an item is telling us to eat it but we aren't holding it, we probably shouldn't eat what we are holding\n\t\t\treturn false;\n\t\t}\n\t\tif (this.battle.runEvent('UseItem', this, null, null, item)) {\n\t\t\tswitch (item.id) {\n\t\t\tcase 'redcard':\n\t\t\t\tthis.battle.add('-enditem', this, item, `[of] ${source}`);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tif (item.isGem) {\n\t\t\t\t\tthis.battle.add('-enditem', this, item, '[from] gem');\n\t\t\t\t} else {\n\t\t\t\t\tthis.battle.add('-enditem', this, item);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (item.boosts) {\n\t\t\t\tthis.battle.boost(item.boosts, this, source, item);\n\t\t\t}\n\n\t\t\tthis.battle.singleEvent('Use', item, this.itemState, this, source, sourceEffect);\n\n\t\t\tthis.lastItem = this.item;\n\t\t\tthis.item = '';\n\t\t\tthis.battle.clearEffectState(this.itemState);\n\t\t\tthis.usedItemThisTurn = true;\n\t\t\tthis.battle.runEvent('AfterUseItem', this, null, null, item);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\ttakeItem(source?: Pokemon) {\n\t\tif (!this.isActive) return false;\n\t\tif (!this.item || this.itemState.knockedOff) return false;\n\t\tif (!source) source = this;\n\t\tif (this.battle.gen === 4) {\n\t\t\tif (toID(this.ability) === 'multitype') return false;\n\t\t\tif (toID(source.ability) === 'multitype') return false;\n\t\t}\n\t\tconst item = this.getItem();\n\t\tif (this.battle.runEvent('TakeItem', this, source, null, item)) {\n\t\t\tthis.item = '';\n\t\t\tconst oldItemState = this.itemState;\n\t\t\tthis.battle.clearEffectState(this.itemState);\n\t\t\tthis.pendingStaleness = undefined;\n\t\t\tthis.battle.singleEvent('End', item, oldItemState, this);\n\t\t\tthis.battle.runEvent('AfterTakeItem', this, null, null, item);\n\t\t\treturn item;\n\t\t}\n\t\treturn false;\n\t}\n\n\tsetItem(item: string | Item, source?: Pokemon, effect?: Effect) {\n\t\tif (!this.hp || !this.isActive) return false;\n\t\tif (this.itemState.knockedOff) return false;\n\t\tif (typeof item === 'string') item = this.battle.dex.items.get(item);\n\n\t\tconst effectid = this.battle.effect ? this.battle.effect.id : '';\n\t\tif (RESTORATIVE_BERRIES.has('leppaberry' as ID)) {\n\t\t\tconst inflicted = ['trick', 'switcheroo'].includes(effectid);\n\t\t\tconst external = inflicted && source && !source.isAlly(this);\n\t\t\tthis.pendingStaleness = external ? 'external' : 'internal';\n\t\t} else {\n\t\t\tthis.pendingStaleness = undefined;\n\t\t}\n\t\tconst oldItem = this.getItem();\n\t\tconst oldItemState = this.itemState;\n\t\tthis.item = item.id;\n\t\tthis.itemState = this.battle.initEffectState({ id: item.id, target: this });\n\t\tif (oldItem.exists) this.battle.singleEvent('End', oldItem, oldItemState, this);\n\t\tif (item.id) {\n\t\t\tthis.battle.singleEvent('Start', item, this.itemState, this, source, effect);\n\t\t}\n\t\treturn true;\n\t}\n\n\tgetItem() {\n\t\treturn this.battle.dex.items.getByID(this.item);\n\t}\n\n\thasItem(item: string | string[]) {\n\t\tif (Array.isArray(item)) {\n\t\t\tif (!item.map(toID).includes(this.item)) return false;\n\t\t} else {\n\t\t\tif (toID(item) !== this.item) return false;\n\t\t}\n\t\treturn !this.ignoringItem();\n\t}\n\n\tclearItem() {\n\t\treturn this.setItem('');\n\t}\n\n\tsetAbility(ability: string | Ability, source?: Pokemon | null, isFromFormeChange = false, isTransform = false) {\n\t\tif (!this.hp) return false;\n\t\tif (typeof ability === 'string') ability = this.battle.dex.abilities.get(ability);\n\t\tconst oldAbility = this.ability;\n\t\tif (!isFromFormeChange) {\n\t\t\tif (ability.flags['cantsuppress'] || this.getAbility().flags['cantsuppress']) return false;\n\t\t}\n\t\tif (!isFromFormeChange && !isTransform) {\n\t\t\tconst setAbilityEvent: boolean | null = this.battle.runEvent('SetAbility', this, source, this.battle.effect, ability);\n\t\t\tif (!setAbilityEvent) return setAbilityEvent;\n\t\t}\n\t\tthis.battle.singleEvent('End', this.battle.dex.abilities.get(oldAbility), this.abilityState, this, source);\n\t\tif (this.battle.effect && this.battle.effect.effectType === 'Move' && !isFromFormeChange) {\n\t\t\tthis.battle.add(\n\t\t\t\t'-endability', this, this.battle.dex.abilities.get(oldAbility),\n\t\t\t\t`[from] move: ${this.battle.dex.moves.get(this.battle.effect.id)}`\n\t\t\t);\n\t\t}\n\t\tthis.ability = ability.id;\n\t\tthis.abilityState = this.battle.initEffectState({ id: ability.id, target: this });\n\t\tif (ability.id && this.battle.gen > 3 &&\n\t\t\t(!isTransform || oldAbility !== ability.id || this.battle.gen <= 4)) {\n\t\t\tthis.battle.singleEvent('Start', ability, this.abilityState, this, source);\n\t\t}\n\t\treturn oldAbility;\n\t}\n\n\tgetAbility() {\n\t\treturn this.battle.dex.abilities.getByID(this.ability);\n\t}\n\n\thasAbility(ability: string | string[]) {\n\t\tif (Array.isArray(ability)) {\n\t\t\tif (!ability.map(toID).includes(this.ability)) return false;\n\t\t} else {\n\t\t\tif (toID(ability) !== this.ability) return false;\n\t\t}\n\t\treturn !this.ignoringAbility();\n\t}\n\n\tclearAbility() {\n\t\treturn this.setAbility('');\n\t}\n\n\tgetNature() {\n\t\treturn this.battle.dex.natures.get(this.set.nature);\n\t}\n\n\taddVolatile(\n\t\tstatus: string | Condition, source: Pokemon | null = null, sourceEffect: Effect | null = null,\n\t\tlinkedStatus: string | Condition | null = null\n\t): boolean | any {\n\t\tlet result;\n\t\tstatus = this.battle.dex.conditions.get(status);\n\t\tif (!this.hp && !status.affectsFainted) return false;\n\t\tif (linkedStatus && source && !source.hp) return false;\n\t\tif (this.battle.event) {\n\t\t\tif (!source) source = this.battle.event.source;\n\t\t\tif (!sourceEffect) sourceEffect = this.battle.effect;\n\t\t}\n\t\tif (!source) source = this;\n\n\t\tif (this.volatiles[status.id]) {\n\t\t\tif (!status.onRestart) return false;\n\t\t\treturn this.battle.singleEvent('Restart', status, this.volatiles[status.id], this, source, sourceEffect);\n\t\t}\n\t\tif (!this.runStatusImmunity(status.id)) {\n\t\t\tthis.battle.debug('immune to volatile status');\n\t\t\tif ((sourceEffect as Move)?.status) {\n\t\t\t\tthis.battle.add('-immune', this);\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\tresult = this.battle.runEvent('TryAddVolatile', this, source, sourceEffect, status);\n\t\tif (!result) {\n\t\t\tthis.battle.debug('add volatile [' + status.id + '] interrupted');\n\t\t\treturn result;\n\t\t}\n\t\tthis.volatiles[status.id] = this.battle.initEffectState({ id: status.id, name: status.name, target: this });\n\t\tif (source) {\n\t\t\tthis.volatiles[status.id].source = source;\n\t\t\tthis.volatiles[status.id].sourceSlot = source.getSlot();\n\t\t}\n\t\tif (sourceEffect) this.volatiles[status.id].sourceEffect = sourceEffect;\n\t\tif (status.duration) this.volatiles[status.id].duration = status.duration;\n\t\tif (status.durationCallback) {\n\t\t\tthis.volatiles[status.id].duration = status.durationCallback.call(this.battle, this, source, sourceEffect);\n\t\t}\n\t\tresult = this.battle.singleEvent('Start', status, this.volatiles[status.id], this, source, sourceEffect);\n\t\tif (!result) {\n\t\t\t// cancel\n\t\t\tdelete this.volatiles[status.id];\n\t\t\treturn result;\n\t\t}\n\t\tif (linkedStatus && source) {\n\t\t\tif (!source.volatiles[linkedStatus.toString()]) {\n\t\t\t\tsource.addVolatile(linkedStatus, this, sourceEffect);\n\t\t\t\tsource.volatiles[linkedStatus.toString()].linkedPokemon = [this];\n\t\t\t\tsource.volatiles[linkedStatus.toString()].linkedStatus = status;\n\t\t\t} else {\n\t\t\t\tsource.volatiles[linkedStatus.toString()].linkedPokemon.push(this);\n\t\t\t}\n\t\t\tthis.volatiles[status.toString()].linkedPokemon = [source];\n\t\t\tthis.volatiles[status.toString()].linkedStatus = linkedStatus;\n\t\t}\n\t\treturn true;\n\t}\n\n\tgetVolatile(status: string | Effect) {\n\t\tstatus = this.battle.dex.conditions.get(status) as Effect;\n\t\tif (!this.volatiles[status.id]) return null;\n\t\treturn status;\n\t}\n\n\tremoveVolatile(status: string | Effect) {\n\t\tif (!this.hp) return false;\n\t\tstatus = this.battle.dex.conditions.get(status) as Effect;\n\t\tif (!this.volatiles[status.id]) return false;\n\t\tconst linkedPokemon = this.volatiles[status.id].linkedPokemon;\n\t\tconst linkedStatus = this.volatiles[status.id].linkedStatus;\n\t\tthis.battle.singleEvent('End', status, this.volatiles[status.id], this);\n\t\tdelete this.volatiles[status.id];\n\t\tif (linkedPokemon) {\n\t\t\tthis.removeLinkedVolatiles(linkedStatus, linkedPokemon);\n\t\t}\n\t\treturn true;\n\t}\n\n\tremoveLinkedVolatiles(linkedStatus: string | Effect, linkedPokemon: Pokemon[]) {\n\t\tlinkedStatus = linkedStatus.toString();\n\t\tfor (const linkedPoke of linkedPokemon) {\n\t\t\tconst volatileData = linkedPoke.volatiles[linkedStatus];\n\t\t\tif (!volatileData) continue;\n\t\t\tvolatileData.linkedPokemon.splice(volatileData.linkedPokemon.indexOf(this), 1);\n\t\t\tif (volatileData.linkedPokemon.length === 0) {\n\t\t\t\tlinkedPoke.removeVolatile(linkedStatus);\n\t\t\t}\n\t\t}\n\t}\n\n\tgetHealth = () => {\n\t\tif (!this.hp) return { side: this.side.id, secret: '0 fnt', shared: '0 fnt' };\n\t\tlet secret = `${this.hp}/${this.maxhp}`;\n\t\tlet shared;\n\t\tconst ratio = this.hp / this.maxhp;\n\t\tif (this.battle.reportExactHP) {\n\t\t\tshared = secret;\n\t\t} else if (this.battle.reportPercentages || this.battle.gen >= 8) {\n\t\t\t// HP Percentage Mod mechanics\n\t\t\tlet percentage = Math.ceil(ratio * 100);\n\t\t\tif ((percentage === 100) && (ratio < 1.0)) {\n\t\t\t\tpercentage = 99;\n\t\t\t}\n\t\t\tshared = `${percentage}/100`;\n\t\t} else {\n\t\t\t// In-game accurate pixel health mechanics\n\t\t\tconst pixels = Math.floor(ratio * 48) || 1;\n\t\t\tshared = `${pixels}/48`;\n\t\t\tif ((pixels === 9) && (ratio > 0.2)) {\n\t\t\t\tshared += 'y'; // force yellow HP bar\n\t\t\t} else if ((pixels === 24) && (ratio > 0.5)) {\n\t\t\t\tshared += 'g'; // force green HP bar\n\t\t\t}\n\t\t}\n\t\tif (this.status) {\n\t\t\tsecret += ` ${this.status}`;\n\t\t\tshared += ` ${this.status}`;\n\t\t}\n\t\treturn { side: this.side.id, secret, shared };\n\t};\n\n\t/**\n\t * Sets a type (except on Arceus, who resists type changes)\n\t */\n\tsetType(newType: string | string[], enforce = false) {\n\t\tif (!enforce) {\n\t\t\t// No Pokemon should be able to have Stellar as a base type\n\t\t\tif (typeof newType === 'string' ? newType === 'Stellar' : newType.includes('Stellar')) return false;\n\t\t\t// First type of Arceus, Silvally cannot be normally changed\n\t\t\tif ((this.battle.gen >= 5 && (this.species.num === 493 || this.species.num === 773)) ||\n\t\t\t\t(this.battle.gen === 4 && this.hasAbility('multitype'))) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Terastallized Pokemon cannot have their base type changed except via forme change\n\t\t\tif (this.terastallized) return false;\n\t\t}\n\n\t\tif (!newType) throw new Error(\"Must pass type to setType\");\n\t\tthis.types = (typeof newType === 'string' ? [newType] : newType);\n\t\tthis.addedType = '';\n\t\tthis.knownType = true;\n\t\tthis.apparentType = this.types.join('/');\n\n\t\treturn true;\n\t}\n\n\t/** Removes any types added previously and adds another one. */\n\taddType(newType: string) {\n\t\tif (this.terastallized) return false;\n\t\tthis.addedType = newType;\n\t\treturn true;\n\t}\n\n\tgetTypes(excludeAdded?: boolean, preterastallized?: boolean): string[] {\n\t\tif (!preterastallized && this.terastallized && this.terastallized !== 'Stellar') {\n\t\t\treturn [this.terastallized];\n\t\t}\n\t\tconst types = this.battle.runEvent('Type', this, null, null, this.types);\n\t\tif (!types.length) types.push(this.battle.gen >= 5 ? 'Normal' : '???');\n\t\tif (!excludeAdded && this.addedType) return types.concat(this.addedType);\n\t\treturn types;\n\t}\n\n\tisGrounded(negateImmunity = false) {\n\t\tif ('gravity' in this.battle.field.pseudoWeather) return true;\n\t\tif ('ingrain' in this.volatiles && this.battle.gen >= 4) return true;\n\t\tif ('smackdown' in this.volatiles) return true;\n\t\tconst item = (this.ignoringItem() ? '' : this.item);\n\t\tif (item === 'ironball') return true;\n\t\t// If a Fire/Flying type uses Burn Up and Roost, it becomes ???/Flying-type, but it's still grounded.\n\t\tif (!negateImmunity && this.hasType('Flying') && !(this.hasType('???') && 'roost' in this.volatiles)) return false;\n\t\tif (this.hasAbility('levitate') && !this.battle.suppressingAbility(this)) return null;\n\t\tif ('magnetrise' in this.volatiles) return false;\n\t\tif ('telekinesis' in this.volatiles) return false;\n\t\treturn item !== 'airballoon';\n\t}\n\n\tisSemiInvulnerable() {\n\t\treturn (this.volatiles['fly'] || this.volatiles['bounce'] || this.volatiles['dive'] || this.volatiles['dig'] ||\n\t\t\tthis.volatiles['phantomforce'] || this.volatiles['shadowforce'] || this.isSkyDropped());\n\t}\n\n\tisSkyDropped() {\n\t\tif (this.volatiles['skydrop']) return true;\n\t\tfor (const foeActive of this.side.foe.active) {\n\t\t\tif (foeActive.volatiles['skydrop'] && foeActive.volatiles['skydrop'].source === this) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t/** Specifically: is protected against a single-target damaging move */\n\tisProtected() {\n\t\treturn !!(\n\t\t\tthis.volatiles['protect'] || this.volatiles['detect'] || this.volatiles['maxguard'] ||\n\t\t\tthis.volatiles['kingsshield'] || this.volatiles['spikyshield'] || this.volatiles['banefulbunker'] ||\n\t\t\tthis.volatiles['obstruct'] || this.volatiles['silktrap'] || this.volatiles['burningbulwark']\n\t\t);\n\t}\n\n\t/**\n\t * Like Field.effectiveWeather(), but ignores sun and rain if\n\t * the Utility Umbrella is active for the Pokemon.\n\t */\n\teffectiveWeather() {\n\t\tconst weather = this.battle.field.effectiveWeather();\n\t\tswitch (weather) {\n\t\tcase 'sunnyday':\n\t\tcase 'raindance':\n\t\tcase 'desolateland':\n\t\tcase 'primordialsea':\n\t\t\tif (this.hasItem('utilityumbrella')) return '';\n\t\t}\n\t\treturn weather;\n\t}\n\n\trunEffectiveness(move: ActiveMove) {\n\t\tlet totalTypeMod = 0;\n\t\tif (this.terastallized && move.type === 'Stellar') {\n\t\t\ttotalTypeMod = 1;\n\t\t} else {\n\t\t\tfor (const type of this.getTypes()) {\n\t\t\t\tlet typeMod = this.battle.dex.getEffectiveness(move, type);\n\t\t\t\ttypeMod = this.battle.singleEvent('Effectiveness', move, null, this, type, move, typeMod);\n\t\t\t\ttotalTypeMod += this.battle.runEvent('Effectiveness', this, type, move, typeMod);\n\t\t\t}\n\t\t}\n\t\tif (this.species.name === 'Terapagos-Terastal' && this.hasAbility('Tera Shell') &&\n\t\t\t!this.battle.suppressingAbility(this)) {\n\t\t\tif (this.abilityState.resisted) return -1; // all hits of multi-hit move should be not very effective\n\t\t\tif (move.category === 'Status' || move.id === 'struggle' || !this.runImmunity(move.type) ||\n\t\t\t\ttotalTypeMod < 0 || this.hp < this.maxhp) {\n\t\t\t\treturn totalTypeMod;\n\t\t\t}\n\n\t\t\tthis.battle.add('-activate', this, 'ability: Tera Shell');\n\t\t\tthis.abilityState.resisted = true;\n\t\t\treturn -1;\n\t\t}\n\t\treturn totalTypeMod;\n\t}\n\n\t/** false = immune, true = not immune */\n\trunImmunity(type: string, message?: string | boolean) {\n\t\tif (!type || type === '???') return true;\n\t\tif (!this.battle.dex.types.isName(type)) {\n\t\t\tthrow new Error(\"Use runStatusImmunity for \" + type);\n\t\t}\n\t\tif (this.fainted) return false;\n\n\t\tconst negateImmunity = !this.battle.runEvent('NegateImmunity', this, type);\n\t\tconst notImmune = type === 'Ground' ?\n\t\t\tthis.isGrounded(negateImmunity) :\n\t\t\tnegateImmunity || this.battle.dex.getImmunity(type, this);\n\t\tif (notImmune) return true;\n\t\tif (!message) return false;\n\t\tif (notImmune === null) {\n\t\t\tthis.battle.add('-immune', this, '[from] ability: Levitate');\n\t\t} else {\n\t\t\tthis.battle.add('-immune', this);\n\t\t}\n\t\treturn false;\n\t}\n\n\trunStatusImmunity(type: string, message?: string) {\n\t\tif (this.fainted) return false;\n\t\tif (!type) return true;\n\n\t\tif (!this.battle.dex.getImmunity(type, this)) {\n\t\t\tthis.battle.debug('natural status immunity');\n\t\t\tif (message) {\n\t\t\t\tthis.battle.add('-immune', this);\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\tconst immunity = this.battle.runEvent('Immunity', this, null, null, type);\n\t\tif (!immunity) {\n\t\t\tthis.battle.debug('artificial status immunity');\n\t\t\tif (message && immunity !== null) {\n\t\t\t\tthis.battle.add('-immune', this);\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\n\tdestroy() {\n\t\t// deallocate ourself\n\t\t// get rid of some possibly-circular references\n\t\t(this as any).battle = null!;\n\t\t(this as any).side = null!;\n\t}\n}\n"],
"mappings": "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",
"names": []
}