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