pokebedrock-showdown 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -9,6 +9,8 @@ Try to keep this fork with the least amount of changes to the original codebase.
9
9
 
10
10
  ## Releasing a new NPM Version
11
11
 
12
+ If your `smell-of-curry` and you want to release a new version, you can do the following:
13
+
12
14
  1. Update the version in `package.json`
13
15
  2. Run `npm run build-npm`
14
16
  3. Run `npm publish`
@@ -1015,7 +1015,6 @@ class Pokemon {
1015
1015
  this.details = this.getUpdatedDetails();
1016
1016
  let details = (this.illusion || this).details;
1017
1017
  if (this.terastallized) details += `, tera:${this.terastallized}`;
1018
- this.battle.add("detailschange", this, details);
1019
1018
  this.updateMaxHp();
1020
1019
  if (!source) {
1021
1020
  this.formeRegression = true;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../sim/pokemon.ts"],
4
- "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\nimport type { DynamaxOptions, PokemonMoveRequestData, PokemonSwitchRequestData } from './side';\r\n\r\n// @pokebedrock - Add bag items\r\nimport { bagItems } from '../data/bag-items';\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\t// @pokebedrock - Specify type as MoveTarget\r\n\ttarget?: MoveTarget;\r\n\tdisabled: boolean | 'hidden';\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\tid: string;\r\n\teffectOrder: number;\r\n\tduration?: number;\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\t/** `` `${sideid}: ${name}` `` - used to refer to pokemon in the protocol */\r\n\treadonly fullname: string;\r\n\treadonly level: number;\r\n\treadonly gender: GenderName;\r\n\treadonly happiness: number;\r\n\treadonly pokeball: ID;\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\t/**\r\n\t * Information about this pokemon visible to opponents when in battle\r\n\t * (species, gender, level, shininess, tera state).\r\n\t * @see https://github.com/smogon/pokemon-showdown/blob/master/sim/SIM-PROTOCOL.md#identifying-pok%C3%A9mon\r\n\t */\r\n\tdetails: string;\r\n\r\n\t/**\r\n\t * UUID of the pokemon from @pokebedrock\r\n\t */\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\t/** true = locked, */\r\n\tmaybeLocked: boolean | null;\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\t/** If this Pokemon should revert to its set species when it faints */\r\n\tformeRegression: boolean;\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\tbondTriggered: boolean;\r\n\t// Gen 9 only\r\n\tswordBoost: boolean;\r\n\tshieldBoost: boolean;\r\n\tsyrupTriggered: boolean;\r\n\tstellarBoostedTypes: string[];\r\n\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\r\n\tcanMegaEvo: string | null | undefined;\r\n\tcanMegaEvoX: string | null | undefined;\r\n\tcanMegaEvoY: string | null | undefined;\r\n\tcanUltraBurst: string | null | undefined;\r\n\treadonly canGigantamax: string | null;\r\n\t/**\r\n\t * A Pokemon's Tera type if it can Terastallize, false if it is temporarily unable to tera and should have its\r\n\t * ability restored upon switching out, or null if its inability to tera is permanent.\r\n\t */\r\n\tcanTerastallize: string | false | 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\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 = this.battle.initEffectState({ 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 | null } = { __proto__: null, M: 'M', F: 'F', N: 'N' };\r\n\t\tthis.gender = genders[set.gender] || this.species.gender || this.battle.sample(['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 = toID(this.set.pokeball) || 'pokeball' as ID;\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\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\t// @pokebedrock - Add (i) to moveSet loop\r\n\t\tfor (const [i, moveid] of this.set.moves.entries()) {\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.pp : move.pp * 8 / 5;\r\n\t\t\tif (this.battle.gen < 3) basepp = Math.min(61, basepp);\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// Apply PP from @pokebedrock\r\n\t\t\t\tpp: this.set.movesInfo?.[i]?.pp || basepp,\r\n\t\t\t\t// Apply maxpp from @pokebedrock\r\n\t\t\t\tmaxpp: this.set.movesInfo?.[i]?.maxPp || basepp,\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}\r\n\r\n\t\tthis.position = 0;\r\n\t\t// @pokebedrock - Add uuid to pokemon\r\n\t\tthis.uuid = this.set.uuid || '';\r\n\t\tthis.details = this.getUpdatedDetails();\r\n\r\n\t\tthis.status = '';\r\n\t\tthis.statusState = this.battle.initEffectState({});\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 = this.battle.initEffectState({ id: this.ability, target: this });\r\n\r\n\t\tthis.item = toID(set.item);\r\n\t\tthis.itemState = this.battle.initEffectState({ id: this.item, target: this });\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\t\tthis.maybeLocked = 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.formeRegression = false;\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.bondTriggered = false;\r\n\t\tthis.swordBoost = false;\r\n\t\tthis.shieldBoost = false;\r\n\t\tthis.syrupTriggered = false;\r\n\t\tthis.stellarBoostedTypes = [];\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\r\n\t\tthis.canMegaEvo = this.battle.actions.canMegaEvo(this);\r\n\t\tthis.canMegaEvoX = this.battle.actions.canMegaEvoX?.(this);\r\n\t\tthis.canMegaEvoY = this.battle.actions.canMegaEvoY?.(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// @pokebedrock - Apply currentHealth to hp\r\n\t\tif (this.set.currentHealth === 0 || this.set.currentHealth) {\r\n\t\t\tthis.hp = this.set.currentHealth;\r\n\t\t} else {\r\n\t\t\tthis.hp = this.maxhp;\r\n\t\t}\r\n\r\n\t\t// @pokebedrock - Apply status to status\r\n\t\tif (this.set.status) {\r\n\t\t\tconst status = this.battle.dex.conditions.get(this.set.status);\r\n\t\t\tthis.status = status.id;\r\n\t\t\tthis.setStatus(status);\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\r\n\t\t// @pokebedrock - Apply faint status\r\n\t\tif (this.hp === 0) {\r\n\t\t\tthis.status = 'fnt' as ID;\r\n\t\t\tthis.fainted = true;\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.fullname : this.fullname;\r\n\t\treturn this.isActive ? this.getSlot() + fullname.slice(2) : fullname;\r\n\t}\r\n\r\n\tgetUpdatedDetails(level?: number) {\r\n\t\tlet name = this.species.name;\r\n\t\tif (['Greninja-Bond', 'Rockruff-Dusk'].includes(name)) name = this.species.baseSpecies;\r\n\t\tif (!level) level = this.level;\r\n\t\treturn name + ', ' +\r\n\t\t\t(this.set.uuid || '') +\r\n\t\t\t(level === 100 ? '' : `, L${level}`) +\r\n\t\t\t(this.gender === '' ? '' : `, ${this.gender}`) +\r\n\t\t\t(this.set.shiny ? ', shiny' : '');\r\n\t}\r\n\r\n\tgetFullDetails = () => {\r\n\t\tconst health = this.getHealth();\r\n\t\tlet details = this.details;\r\n\t\tif (this.illusion) {\r\n\t\t\tdetails = this.illusion.getUpdatedDetails(\r\n\t\t\t\tthis.battle.ruleTable.has('illusionlevelmod') ? this.illusion.level : this.level\r\n\t\t\t);\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-expect-error 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-expect-error 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\tlet boosts = this.boosts;\r\n\t\t\tif (!unmodified) {\r\n\t\t\t\tboosts = this.battle.runEvent('ModifyBoost', this, null, null, { ...boosts });\r\n\t\t\t}\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\tconst trickRoomCheck = this.battle.ruleTable.has('twisteddimensionmod') ?\r\n\t\t\t!this.battle.field.getPseudoWeather('trickroom') : this.battle.field.getPseudoWeather('trickroom');\r\n\t\tif (trickRoomCheck) {\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') && ['sunnyday', 'desolateland'].includes(this.effectiveWeather())) &&\r\n\t\t\t\t\t!(move.id === 'electroshot' && ['raindance', 'primordialsea'].includes(this.effectiveWeather())) &&\r\n\t\t\t\t\t!(this.hasItem('powerherb') && move.id !== 'skydrop');\r\n\t\t\t\tif (!isCharging && !(move.id === 'pursuit' && (target.beingCalledBack || target.switchFlag))) {\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\r\n\t\t// Certain Abilities won't activate while Transformed, even if they ordinarily couldn't be suppressed (e.g. Disguise)\r\n\t\tif (this.getAbility().flags['notransform'] && this.transformed) return true;\r\n\t\tif (this.getAbility().flags['cantsuppress']) 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 && !this.volatiles['commanding']) {\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(isFling = false) {\r\n\t\tif (this.getItem().isPrimalOrb) return false;\r\n\t\tif (this.itemState.knockedOff) return true; // Gen 3-4\r\n\t\tif (this.battle.gen >= 5 && !this.isActive) return true;\r\n\t\tif (this.volatiles['embargo'] || this.battle.field.pseudoWeather['magicroom']) return true;\r\n\t\t// check Fling first to avoid infinite recursion\r\n\t\tif (isFling) return this.battle.gen >= 5 && this.hasAbility('klutz');\r\n\t\treturn !this.getItem().ignoreKlutz && this.hasAbility('klutz');\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(): ID | 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?: ID | null, restrictData?: boolean): {\r\n\t\tmove: string, id: ID, disabled?: string | boolean, disabledSource?: string,\r\n\t\t// @pokebedrock - Specify type as MoveTarget\r\n\t\ttarget?: MoveTarget,\r\n\t\tpp?: 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' as ID,\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\tswitch (moveSlot.id) {\r\n\t\t\tcase 'curse':\r\n\t\t\t\tif (!this.hasType('Ghost')) {\r\n\t\t\t\t\ttarget = this.battle.dex.moves.get('curse').nonGhostTarget;\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'pollenpuff':\r\n\t\t\t\t// Heal Block only prevents Pollen Puff from targeting an ally when the user has Heal Block\r\n\t\t\t\tif (this.volatiles['healblock']) {\r\n\t\t\t\t\ttarget = 'adjacentFoe';\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'terastarstorm':\r\n\t\t\t\tif (this.species.name === 'Terapagos-Stellar') {\r\n\t\t\t\t\ttarget = 'allAdjacentFoes';\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\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 (moveSlot.pp <= 0 && !this.volatiles['partialtrappinglock']) {\r\n\t\t\t\tdisabled = true;\r\n\t\t\t}\r\n\r\n\t\t\tif (disabled === 'hidden') {\r\n\t\t\t\tdisabled = !restrictData;\r\n\t\t\t}\r\n\t\t\tif (!disabled) {\r\n\t\t\t\thasValidMove = true;\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 && this.gigantamax) result.gigantamax = this.canGigantamax;\r\n\t\treturn result;\r\n\t}\r\n\r\n\tgetMoveRequestData() {\r\n\t\tlet lockedMove = this.maybeLocked ? null : 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' as ID, target: 'randomNormal', disabled: false }];\r\n\t\t\tlockedMove = 'struggle' as ID;\r\n\t\t}\r\n\r\n\t\tconst data: PokemonMoveRequestData = {\r\n\t\t\tmoves,\r\n\t\t};\r\n\r\n\t\tif (isLastActive) {\r\n\t\t\tthis.maybeDisabled = this.maybeDisabled && !lockedMove;\r\n\t\t\tthis.maybeLocked = this.maybeLocked || this.maybeDisabled;\r\n\t\t\tif (this.maybeDisabled) {\r\n\t\t\t\tdata.maybeDisabled = this.maybeDisabled;\r\n\t\t\t}\r\n\t\t\tif (this.maybeLocked) {\r\n\t\t\t\tdata.maybeLocked = this.maybeLocked;\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 {\r\n\t\t\tthis.maybeDisabled = false;\r\n\t\t\tthis.maybeLocked = false;\r\n\t\t\tif (canSwitchIn) {\r\n\t\t\t\t// Discovered by selecting a valid Pok\u00E9mon as a switch target and cancelling.\r\n\t\t\t\tif (this.trapped) data.trapped = true;\r\n\t\t\t}\r\n\t\t\tthis.maybeTrapped = false;\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.canMegaEvoX) data.canMegaEvoX = true;\r\n\t\t\tif (this.canMegaEvoY) data.canMegaEvoY = 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): PokemonSwitchRequestData {\r\n\t\tconst entry: PokemonSwitchRequestData = {\r\n\t\t\tident: this.fullname,\r\n\t\t\t// @pokebedrock\r\n\t\t\tuuid: this.uuid || '',\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}` as ID;\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)}` as ID;\r\n\t\t\t\t}\r\n\t\t\t\treturn move as ID;\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\t// @pokebedrock\r\n\t\t\ttypes: this.types,\r\n\t\t\t// @pokebedrock\r\n\t\t\tboosts: this.boosts,\r\n\t\t\t// @pokebedrock\r\n\t\t\tstatus: this.status,\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] = this.battle.initEffectState({ ...pokemon.volatiles[i], target: this });\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 (\r\n\t\t\tpokemon.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\t(['Ogerpon', 'Terapagos'].includes(species.baseSpecies) && (this.terastallized || pokemon.terastallized)) ||\r\n\t\t\tthis.terastallized === 'Stellar'\r\n\t\t) {\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.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\t// we need to remove all of the overlapping crit volatiles before adding any of them\r\n\t\t\tconst volatilesToCopy = ['dragoncheer', 'focusenergy', 'gmaxchistrike', 'laserfocus'];\r\n\t\t\tfor (const volatile of volatilesToCopy) this.removeVolatile(volatile);\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\tif (volatile === 'dragoncheer') this.volatiles[volatile].hasDragonType = pokemon.volatiles[volatile].hasDragonType;\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\t// Pokemon transformed into Ogerpon cannot Terastallize\r\n\t\t// restoring their ability to tera after they untransform is handled ELSEWHERE\r\n\t\tif (['Ogerpon', 'Terapagos'].includes(this.species.baseSpecies) && this.canTerastallize) this.canTerastallize = false;\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 formeChange 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 | null = this.battle.effect,\r\n\t\tisPermanent?: boolean, abilitySlot = '0', 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 = this.getUpdatedDetails();\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\tthis.updateMaxHp();\r\n\t\t\tif (!source) {\r\n\t\t\t\t// Tera forme\r\n\t\t\t\t// Ogerpon/Terapagos text goes here\r\n\t\t\t\tthis.formeRegression = true;\r\n\t\t\t} else if (source.effectType === 'Item') {\r\n\t\t\t\tthis.canTerastallize = null; // National Dex behavior\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.isPrimalOrb) {\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, species.requiredItem);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tthis.battle.add('-primal', this, species.requiredItem);\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\tthis.formeRegression = true;\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\t// @pokebedrock - Send Details changed after, so mega effect can look good.\r\n\t\t\tthis.battle.add('detailschange', this, details);\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 && (!source || !['disguise', 'iceface'].includes(source.id))) {\r\n\t\t\tif (this.illusion && source) {\r\n\t\t\t\t// Tera forme by Ogerpon or Terapagos breaks the Illusion\r\n\t\t\t\tthis.ability = ''; // Don't allow Illusion to wear off\r\n\t\t\t}\r\n\t\t\tconst ability = species.abilities[abilitySlot] || species.abilities['0'];\r\n\t\t\t// Ogerpon's forme change doesn't override permanent abilities\r\n\t\t\tif (source || !this.getAbility().flags['cantsuppress']) this.setAbility(ability, null, true);\r\n\t\t\t// However, its ability does reset upon switching out\r\n\t\t\tthis.baseAbility = toID(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\tupdateMaxHp() {\r\n\t\tconst newBaseMaxHp = Math.floor(Math.floor(\r\n\t\t\t2 * this.species.baseStats['hp'] + this.set.ivs['hp'] + Math.floor(this.set.evs['hp'] / 4) + 100\r\n\t\t) * this.level / 100 + 10);\r\n\t\tif (newBaseMaxHp === this.baseMaxhp) return;\r\n\t\tthis.baseMaxhp = newBaseMaxHp;\r\n\t\tconst newMaxHP = this.volatiles['dynamax'] ? (2 * this.baseMaxhp) : this.baseMaxhp;\r\n\t\tthis.hp = newMaxHP - (this.maxhp - this.hp);\r\n\t\tif (this.hp < 0) this.hp = this.fainted ? 0 : 1; // latest should never happen\r\n\t\tthis.maxhp = newMaxHP;\r\n\t\tif (this.hp) this.battle.add('-heal', this, this.getHealth, '[silent]');\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\tif (this.canTerastallize === false) this.canTerastallize = this.teraType;\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\t\tthis.moveLastTurnResult = undefined;\r\n\t\tthis.moveThisTurnResult = undefined;\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\tdelete this.abilityState.started;\r\n\t\tdelete this.itemState.started;\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\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, 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 ? 'hidden' : 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/**\r\n\t* @pokebedrock - Add revive function\r\n\t*\r\n * Revives a pokemon from a fainted state.\r\n * @param newHealth\r\n */\r\n\trevive(newHealth = this.maxhp) {\r\n\t\tthis.side.pokemonLeft++;\r\n\t\tthis.fainted = false;\r\n\t\tthis.faintQueued = false;\r\n\t\tthis.subFainted = false;\r\n\t\tthis.status = '';\r\n\t\tthis.hp = 1; // Needed so hp functions works\r\n\t\tthis.sethp(newHealth);\r\n\t}\r\n\r\n\t/**\r\n\t * @pokebedrock - Add useBagItem function\r\n\t *\r\n\t * Uses a bag item on the pokemon.\r\n\t * @param itemId\r\n\t * @param moveName\r\n\t */\r\n\tuseBagItem(itemId: string, moveName?: string) {\r\n\t\tconst bagItem = bagItems.get(itemId);\r\n\t\tif (bagItem === undefined)\r\n\t\t\tthrow new Error(`No item registered for item id ${itemId}`);\r\n\t\tbagItem(this.battle, this, moveName);\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 -= 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 (\r\n\t\t\t!ignoreImmunities && status.id && !(source?.hasAbility('corrosion') && ['tox', 'psn'].includes(status.id))\r\n\t\t) {\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 = this.battle.initEffectState({ 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?.target) source = this.battle.event.target;\r\n\t\tconst item = this.getItem();\r\n\t\tif (sourceEffect?.effectType === 'Item' && this.item !== sourceEffect.id && source === this) {\r\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\r\n\t\t\treturn false;\r\n\t\t}\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.battle.clearEffectState(this.itemState);\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?.target) source = this.battle.event.target;\r\n\t\tconst item = this.getItem();\r\n\t\tif (sourceEffect?.effectType === 'Item' && this.item !== sourceEffect.id && source === this) {\r\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\r\n\t\t\treturn false;\r\n\t\t}\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.battle.clearEffectState(this.itemState);\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.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.battle.clearEffectState(this.itemState);\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 = this.battle.initEffectState({ 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.flags['cantsuppress'] || this.getAbility().flags['cantsuppress']) return false;\r\n\t\t}\r\n\t\tif (!isFromFormeChange && !isTransform) {\r\n\t\t\tconst setAbilityEvent: boolean | null = this.battle.runEvent('SetAbility', this, source, this.battle.effect, ability);\r\n\t\t\tif (!setAbilityEvent) return setAbilityEvent;\r\n\t\t}\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(\r\n\t\t\t\t'-endability', this, this.battle.dex.abilities.get(oldAbility),\r\n\t\t\t\t`[from] move: ${this.battle.dex.moves.get(this.battle.effect.id)}`\r\n\t\t\t);\r\n\t\t}\r\n\t\tthis.ability = ability.id;\r\n\t\tthis.abilityState = this.battle.initEffectState({ 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\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] = this.battle.initEffectState({ id: status.id, name: status.name, 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\tconst { linkedPokemon, linkedStatus } = this.volatiles[status.id];\r\n\t\tthis.battle.singleEvent('End', status, this.volatiles[status.id], this);\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\tif (this.battle.reportExactHP) {\r\n\t\t\tshared = secret;\r\n\t\t} else if (this.battle.reportPercentages || this.battle.gen >= 7) {\r\n\t\t\t// HP Percentage Mod mechanics\r\n\t\t\tlet percentage = Math.ceil(100 * this.hp / this.maxhp);\r\n\t\t\tif (percentage === 100 && this.hp < this.maxhp) {\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/**\r\n\t\t\t * In-game accurate pixel health mechanics\r\n\t\t\t * PS doesn't use pixels after Gen 6, but for reference:\r\n\t\t\t * - [Gen 7] SM uses 99 pixels\r\n\t\t\t * - [Gen 7] USUM uses 86 pixels\r\n\t\t\t * */\r\n\t\t\tconst pixels = Math.floor(48 * this.hp / this.maxhp) || 1;\r\n\t\t\tshared = `${pixels}/48`;\r\n\t\t\tif (this.battle.gen >= 5) {\r\n\t\t\t\tif (pixels === 9) {\r\n\t\t\t\t\tshared += this.hp * 5 > this.maxhp ? 'y' : 'r';\r\n\t\t\t\t} else if (pixels === 24) {\r\n\t\t\t\t\tshared += this.hp * 2 > this.maxhp ? 'g' : 'y';\r\n\t\t\t\t}\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// No Pokemon should be able to have Stellar as a base type\r\n\t\t\tif (typeof newType === 'string' ? newType === 'Stellar' : newType.includes('Stellar')) return false;\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 && this.terastallized !== 'Stellar') {\r\n\t\t\treturn [this.terastallized];\r\n\t\t}\r\n\t\tconst types = this.battle.runEvent('Type', this, null, null, this.types);\r\n\t\tif (!types.length) types.push(this.battle.gen >= 5 ? 'Normal' : '???');\r\n\t\tif (!excludeAdded && this.addedType) return types.concat(this.addedType);\r\n\t\treturn types;\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'] || this.volatiles['burningbulwark']\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\tif (this.terastallized && move.type === 'Stellar') {\r\n\t\t\ttotalTypeMod = 1;\r\n\t\t} else {\r\n\t\t\tfor (const type of this.getTypes()) {\r\n\t\t\t\tlet typeMod = this.battle.dex.getEffectiveness(move, type);\r\n\t\t\t\ttypeMod = this.battle.singleEvent('Effectiveness', move, null, this, type, move, typeMod);\r\n\t\t\t\ttotalTypeMod += this.battle.runEvent('Effectiveness', this, type, move, typeMod);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (this.species.name === 'Terapagos-Terastal' && this.hasAbility('Tera Shell') &&\r\n\t\t\t!this.battle.suppressingAbility(this)) {\r\n\t\t\tif (this.abilityState.resisted) return -1; // all hits of multi-hit move should be not very effective\r\n\t\t\tif (move.category === 'Status' || move.id === 'struggle' || !this.runImmunity(move) ||\r\n\t\t\t\ttotalTypeMod < 0 || this.hp < this.maxhp) {\r\n\t\t\t\treturn totalTypeMod;\r\n\t\t\t}\r\n\r\n\t\t\tthis.battle.add('-activate', this, 'ability: Tera Shell');\r\n\t\t\tthis.abilityState.resisted = true;\r\n\t\t\treturn -1;\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(source: ActiveMove | string, message?: string | boolean) {\r\n\t\tif (!source) return true;\r\n\t\tconst type: string = typeof source !== 'string' ? source.type : source;\r\n\t\tif (typeof source !== 'string') {\r\n\t\t\tif (source.ignoreImmunity && (source.ignoreImmunity === true || source.ignoreImmunity[type])) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\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\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"],
5
- "mappings": "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",
4
+ "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\nimport type { DynamaxOptions, PokemonMoveRequestData, PokemonSwitchRequestData } from './side';\r\n\r\n// @pokebedrock - Add bag items\r\nimport { bagItems } from '../data/bag-items';\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\t// @pokebedrock - Specify type as MoveTarget\r\n\ttarget?: MoveTarget;\r\n\tdisabled: boolean | 'hidden';\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\tid: string;\r\n\teffectOrder: number;\r\n\tduration?: number;\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\t/** `` `${sideid}: ${name}` `` - used to refer to pokemon in the protocol */\r\n\treadonly fullname: string;\r\n\treadonly level: number;\r\n\treadonly gender: GenderName;\r\n\treadonly happiness: number;\r\n\treadonly pokeball: ID;\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\t/**\r\n\t * Information about this pokemon visible to opponents when in battle\r\n\t * (species, gender, level, shininess, tera state).\r\n\t * @see https://github.com/smogon/pokemon-showdown/blob/master/sim/SIM-PROTOCOL.md#identifying-pok%C3%A9mon\r\n\t */\r\n\tdetails: string;\r\n\r\n\t/**\r\n\t * UUID of the pokemon from @pokebedrock\r\n\t */\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\t/** true = locked, */\r\n\tmaybeLocked: boolean | null;\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\t/** If this Pokemon should revert to its set species when it faints */\r\n\tformeRegression: boolean;\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\tbondTriggered: boolean;\r\n\t// Gen 9 only\r\n\tswordBoost: boolean;\r\n\tshieldBoost: boolean;\r\n\tsyrupTriggered: boolean;\r\n\tstellarBoostedTypes: string[];\r\n\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\r\n\tcanMegaEvo: string | null | undefined;\r\n\tcanMegaEvoX: string | null | undefined;\r\n\tcanMegaEvoY: string | null | undefined;\r\n\tcanUltraBurst: string | null | undefined;\r\n\treadonly canGigantamax: string | null;\r\n\t/**\r\n\t * A Pokemon's Tera type if it can Terastallize, false if it is temporarily unable to tera and should have its\r\n\t * ability restored upon switching out, or null if its inability to tera is permanent.\r\n\t */\r\n\tcanTerastallize: string | false | 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\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 = this.battle.initEffectState({ 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 | null } = { __proto__: null, M: 'M', F: 'F', N: 'N' };\r\n\t\tthis.gender = genders[set.gender] || this.species.gender || this.battle.sample(['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 = toID(this.set.pokeball) || 'pokeball' as ID;\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\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\t// @pokebedrock - Add (i) to moveSet loop\r\n\t\tfor (const [i, moveid] of this.set.moves.entries()) {\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.pp : move.pp * 8 / 5;\r\n\t\t\tif (this.battle.gen < 3) basepp = Math.min(61, basepp);\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// Apply PP from @pokebedrock\r\n\t\t\t\tpp: this.set.movesInfo?.[i]?.pp || basepp,\r\n\t\t\t\t// Apply maxpp from @pokebedrock\r\n\t\t\t\tmaxpp: this.set.movesInfo?.[i]?.maxPp || basepp,\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}\r\n\r\n\t\tthis.position = 0;\r\n\t\t// @pokebedrock - Add uuid to pokemon\r\n\t\tthis.uuid = this.set.uuid || '';\r\n\t\tthis.details = this.getUpdatedDetails();\r\n\r\n\t\tthis.status = '';\r\n\t\tthis.statusState = this.battle.initEffectState({});\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 = this.battle.initEffectState({ id: this.ability, target: this });\r\n\r\n\t\tthis.item = toID(set.item);\r\n\t\tthis.itemState = this.battle.initEffectState({ id: this.item, target: this });\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\t\tthis.maybeLocked = 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.formeRegression = false;\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.bondTriggered = false;\r\n\t\tthis.swordBoost = false;\r\n\t\tthis.shieldBoost = false;\r\n\t\tthis.syrupTriggered = false;\r\n\t\tthis.stellarBoostedTypes = [];\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\r\n\t\tthis.canMegaEvo = this.battle.actions.canMegaEvo(this);\r\n\t\tthis.canMegaEvoX = this.battle.actions.canMegaEvoX?.(this);\r\n\t\tthis.canMegaEvoY = this.battle.actions.canMegaEvoY?.(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// @pokebedrock - Apply currentHealth to hp\r\n\t\tif (this.set.currentHealth === 0 || this.set.currentHealth) {\r\n\t\t\tthis.hp = this.set.currentHealth;\r\n\t\t} else {\r\n\t\t\tthis.hp = this.maxhp;\r\n\t\t}\r\n\r\n\t\t// @pokebedrock - Apply status to status\r\n\t\tif (this.set.status) {\r\n\t\t\tconst status = this.battle.dex.conditions.get(this.set.status);\r\n\t\t\tthis.status = status.id;\r\n\t\t\tthis.setStatus(status);\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\r\n\t\t// @pokebedrock - Apply faint status\r\n\t\tif (this.hp === 0) {\r\n\t\t\tthis.status = 'fnt' as ID;\r\n\t\t\tthis.fainted = true;\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.fullname : this.fullname;\r\n\t\treturn this.isActive ? this.getSlot() + fullname.slice(2) : fullname;\r\n\t}\r\n\r\n\tgetUpdatedDetails(level?: number) {\r\n\t\tlet name = this.species.name;\r\n\t\tif (['Greninja-Bond', 'Rockruff-Dusk'].includes(name)) name = this.species.baseSpecies;\r\n\t\tif (!level) level = this.level;\r\n\t\treturn name + ', ' +\r\n\t\t\t(this.set.uuid || '') +\r\n\t\t\t(level === 100 ? '' : `, L${level}`) +\r\n\t\t\t(this.gender === '' ? '' : `, ${this.gender}`) +\r\n\t\t\t(this.set.shiny ? ', shiny' : '');\r\n\t}\r\n\r\n\tgetFullDetails = () => {\r\n\t\tconst health = this.getHealth();\r\n\t\tlet details = this.details;\r\n\t\tif (this.illusion) {\r\n\t\t\tdetails = this.illusion.getUpdatedDetails(\r\n\t\t\t\tthis.battle.ruleTable.has('illusionlevelmod') ? this.illusion.level : this.level\r\n\t\t\t);\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-expect-error 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-expect-error 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\tlet boosts = this.boosts;\r\n\t\t\tif (!unmodified) {\r\n\t\t\t\tboosts = this.battle.runEvent('ModifyBoost', this, null, null, { ...boosts });\r\n\t\t\t}\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\tconst trickRoomCheck = this.battle.ruleTable.has('twisteddimensionmod') ?\r\n\t\t\t!this.battle.field.getPseudoWeather('trickroom') : this.battle.field.getPseudoWeather('trickroom');\r\n\t\tif (trickRoomCheck) {\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') && ['sunnyday', 'desolateland'].includes(this.effectiveWeather())) &&\r\n\t\t\t\t\t!(move.id === 'electroshot' && ['raindance', 'primordialsea'].includes(this.effectiveWeather())) &&\r\n\t\t\t\t\t!(this.hasItem('powerherb') && move.id !== 'skydrop');\r\n\t\t\t\tif (!isCharging && !(move.id === 'pursuit' && (target.beingCalledBack || target.switchFlag))) {\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\r\n\t\t// Certain Abilities won't activate while Transformed, even if they ordinarily couldn't be suppressed (e.g. Disguise)\r\n\t\tif (this.getAbility().flags['notransform'] && this.transformed) return true;\r\n\t\tif (this.getAbility().flags['cantsuppress']) 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 && !this.volatiles['commanding']) {\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(isFling = false) {\r\n\t\tif (this.getItem().isPrimalOrb) return false;\r\n\t\tif (this.itemState.knockedOff) return true; // Gen 3-4\r\n\t\tif (this.battle.gen >= 5 && !this.isActive) return true;\r\n\t\tif (this.volatiles['embargo'] || this.battle.field.pseudoWeather['magicroom']) return true;\r\n\t\t// check Fling first to avoid infinite recursion\r\n\t\tif (isFling) return this.battle.gen >= 5 && this.hasAbility('klutz');\r\n\t\treturn !this.getItem().ignoreKlutz && this.hasAbility('klutz');\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(): ID | 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?: ID | null, restrictData?: boolean): {\r\n\t\tmove: string, id: ID, disabled?: string | boolean, disabledSource?: string,\r\n\t\t// @pokebedrock - Specify type as MoveTarget\r\n\t\ttarget?: MoveTarget,\r\n\t\tpp?: 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' as ID,\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\tswitch (moveSlot.id) {\r\n\t\t\tcase 'curse':\r\n\t\t\t\tif (!this.hasType('Ghost')) {\r\n\t\t\t\t\ttarget = this.battle.dex.moves.get('curse').nonGhostTarget;\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'pollenpuff':\r\n\t\t\t\t// Heal Block only prevents Pollen Puff from targeting an ally when the user has Heal Block\r\n\t\t\t\tif (this.volatiles['healblock']) {\r\n\t\t\t\t\ttarget = 'adjacentFoe';\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'terastarstorm':\r\n\t\t\t\tif (this.species.name === 'Terapagos-Stellar') {\r\n\t\t\t\t\ttarget = 'allAdjacentFoes';\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\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 (moveSlot.pp <= 0 && !this.volatiles['partialtrappinglock']) {\r\n\t\t\t\tdisabled = true;\r\n\t\t\t}\r\n\r\n\t\t\tif (disabled === 'hidden') {\r\n\t\t\t\tdisabled = !restrictData;\r\n\t\t\t}\r\n\t\t\tif (!disabled) {\r\n\t\t\t\thasValidMove = true;\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 && this.gigantamax) result.gigantamax = this.canGigantamax;\r\n\t\treturn result;\r\n\t}\r\n\r\n\tgetMoveRequestData() {\r\n\t\tlet lockedMove = this.maybeLocked ? null : 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' as ID, target: 'randomNormal', disabled: false }];\r\n\t\t\tlockedMove = 'struggle' as ID;\r\n\t\t}\r\n\r\n\t\tconst data: PokemonMoveRequestData = {\r\n\t\t\tmoves,\r\n\t\t};\r\n\r\n\t\tif (isLastActive) {\r\n\t\t\tthis.maybeDisabled = this.maybeDisabled && !lockedMove;\r\n\t\t\tthis.maybeLocked = this.maybeLocked || this.maybeDisabled;\r\n\t\t\tif (this.maybeDisabled) {\r\n\t\t\t\tdata.maybeDisabled = this.maybeDisabled;\r\n\t\t\t}\r\n\t\t\tif (this.maybeLocked) {\r\n\t\t\t\tdata.maybeLocked = this.maybeLocked;\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 {\r\n\t\t\tthis.maybeDisabled = false;\r\n\t\t\tthis.maybeLocked = false;\r\n\t\t\tif (canSwitchIn) {\r\n\t\t\t\t// Discovered by selecting a valid Pok\u00E9mon as a switch target and cancelling.\r\n\t\t\t\tif (this.trapped) data.trapped = true;\r\n\t\t\t}\r\n\t\t\tthis.maybeTrapped = false;\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.canMegaEvoX) data.canMegaEvoX = true;\r\n\t\t\tif (this.canMegaEvoY) data.canMegaEvoY = 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): PokemonSwitchRequestData {\r\n\t\tconst entry: PokemonSwitchRequestData = {\r\n\t\t\tident: this.fullname,\r\n\t\t\t// @pokebedrock\r\n\t\t\tuuid: this.uuid || '',\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}` as ID;\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)}` as ID;\r\n\t\t\t\t}\r\n\t\t\t\treturn move as ID;\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\t// @pokebedrock\r\n\t\t\ttypes: this.types,\r\n\t\t\t// @pokebedrock\r\n\t\t\tboosts: this.boosts,\r\n\t\t\t// @pokebedrock\r\n\t\t\tstatus: this.status,\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] = this.battle.initEffectState({ ...pokemon.volatiles[i], target: this });\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 (\r\n\t\t\tpokemon.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\t(['Ogerpon', 'Terapagos'].includes(species.baseSpecies) && (this.terastallized || pokemon.terastallized)) ||\r\n\t\t\tthis.terastallized === 'Stellar'\r\n\t\t) {\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.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\t// we need to remove all of the overlapping crit volatiles before adding any of them\r\n\t\t\tconst volatilesToCopy = ['dragoncheer', 'focusenergy', 'gmaxchistrike', 'laserfocus'];\r\n\t\t\tfor (const volatile of volatilesToCopy) this.removeVolatile(volatile);\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\tif (volatile === 'dragoncheer') this.volatiles[volatile].hasDragonType = pokemon.volatiles[volatile].hasDragonType;\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\t// Pokemon transformed into Ogerpon cannot Terastallize\r\n\t\t// restoring their ability to tera after they untransform is handled ELSEWHERE\r\n\t\tif (['Ogerpon', 'Terapagos'].includes(this.species.baseSpecies) && this.canTerastallize) this.canTerastallize = false;\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 formeChange 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 | null = this.battle.effect,\r\n\t\tisPermanent?: boolean, abilitySlot = '0', 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 = this.getUpdatedDetails();\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\t// this.battle.add('detailschange', this, details);\r\n\t\t\tthis.updateMaxHp();\r\n\t\t\tif (!source) {\r\n\t\t\t\t// Tera forme\r\n\t\t\t\t// Ogerpon/Terapagos text goes here\r\n\t\t\t\tthis.formeRegression = true;\r\n\t\t\t} else if (source.effectType === 'Item') {\r\n\t\t\t\tthis.canTerastallize = null; // National Dex behavior\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.isPrimalOrb) {\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, species.requiredItem);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tthis.battle.add('-primal', this, species.requiredItem);\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\tthis.formeRegression = true;\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\t// @pokebedrock - Send Details changed after, so mega effect can look good.\r\n\t\t\tthis.battle.add('detailschange', this, details);\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 && (!source || !['disguise', 'iceface'].includes(source.id))) {\r\n\t\t\tif (this.illusion && source) {\r\n\t\t\t\t// Tera forme by Ogerpon or Terapagos breaks the Illusion\r\n\t\t\t\tthis.ability = ''; // Don't allow Illusion to wear off\r\n\t\t\t}\r\n\t\t\tconst ability = species.abilities[abilitySlot] || species.abilities['0'];\r\n\t\t\t// Ogerpon's forme change doesn't override permanent abilities\r\n\t\t\tif (source || !this.getAbility().flags['cantsuppress']) this.setAbility(ability, null, true);\r\n\t\t\t// However, its ability does reset upon switching out\r\n\t\t\tthis.baseAbility = toID(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\tupdateMaxHp() {\r\n\t\tconst newBaseMaxHp = Math.floor(Math.floor(\r\n\t\t\t2 * this.species.baseStats['hp'] + this.set.ivs['hp'] + Math.floor(this.set.evs['hp'] / 4) + 100\r\n\t\t) * this.level / 100 + 10);\r\n\t\tif (newBaseMaxHp === this.baseMaxhp) return;\r\n\t\tthis.baseMaxhp = newBaseMaxHp;\r\n\t\tconst newMaxHP = this.volatiles['dynamax'] ? (2 * this.baseMaxhp) : this.baseMaxhp;\r\n\t\tthis.hp = newMaxHP - (this.maxhp - this.hp);\r\n\t\tif (this.hp < 0) this.hp = this.fainted ? 0 : 1; // latest should never happen\r\n\t\tthis.maxhp = newMaxHP;\r\n\t\tif (this.hp) this.battle.add('-heal', this, this.getHealth, '[silent]');\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\tif (this.canTerastallize === false) this.canTerastallize = this.teraType;\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\t\tthis.moveLastTurnResult = undefined;\r\n\t\tthis.moveThisTurnResult = undefined;\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\tdelete this.abilityState.started;\r\n\t\tdelete this.itemState.started;\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\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, 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 ? 'hidden' : 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/**\r\n\t* @pokebedrock - Add revive function\r\n\t*\r\n * Revives a pokemon from a fainted state.\r\n * @param newHealth\r\n */\r\n\trevive(newHealth = this.maxhp) {\r\n\t\tthis.side.pokemonLeft++;\r\n\t\tthis.fainted = false;\r\n\t\tthis.faintQueued = false;\r\n\t\tthis.subFainted = false;\r\n\t\tthis.status = '';\r\n\t\tthis.hp = 1; // Needed so hp functions works\r\n\t\tthis.sethp(newHealth);\r\n\t}\r\n\r\n\t/**\r\n\t * @pokebedrock - Add useBagItem function\r\n\t *\r\n\t * Uses a bag item on the pokemon.\r\n\t * @param itemId\r\n\t * @param moveName\r\n\t */\r\n\tuseBagItem(itemId: string, moveName?: string) {\r\n\t\tconst bagItem = bagItems.get(itemId);\r\n\t\tif (bagItem === undefined)\r\n\t\t\tthrow new Error(`No item registered for item id ${itemId}`);\r\n\t\tbagItem(this.battle, this, moveName);\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 -= 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 (\r\n\t\t\t!ignoreImmunities && status.id && !(source?.hasAbility('corrosion') && ['tox', 'psn'].includes(status.id))\r\n\t\t) {\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 = this.battle.initEffectState({ 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?.target) source = this.battle.event.target;\r\n\t\tconst item = this.getItem();\r\n\t\tif (sourceEffect?.effectType === 'Item' && this.item !== sourceEffect.id && source === this) {\r\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\r\n\t\t\treturn false;\r\n\t\t}\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.battle.clearEffectState(this.itemState);\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?.target) source = this.battle.event.target;\r\n\t\tconst item = this.getItem();\r\n\t\tif (sourceEffect?.effectType === 'Item' && this.item !== sourceEffect.id && source === this) {\r\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\r\n\t\t\treturn false;\r\n\t\t}\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.battle.clearEffectState(this.itemState);\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.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.battle.clearEffectState(this.itemState);\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 = this.battle.initEffectState({ 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.flags['cantsuppress'] || this.getAbility().flags['cantsuppress']) return false;\r\n\t\t}\r\n\t\tif (!isFromFormeChange && !isTransform) {\r\n\t\t\tconst setAbilityEvent: boolean | null = this.battle.runEvent('SetAbility', this, source, this.battle.effect, ability);\r\n\t\t\tif (!setAbilityEvent) return setAbilityEvent;\r\n\t\t}\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(\r\n\t\t\t\t'-endability', this, this.battle.dex.abilities.get(oldAbility),\r\n\t\t\t\t`[from] move: ${this.battle.dex.moves.get(this.battle.effect.id)}`\r\n\t\t\t);\r\n\t\t}\r\n\t\tthis.ability = ability.id;\r\n\t\tthis.abilityState = this.battle.initEffectState({ 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\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] = this.battle.initEffectState({ id: status.id, name: status.name, 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\tconst { linkedPokemon, linkedStatus } = this.volatiles[status.id];\r\n\t\tthis.battle.singleEvent('End', status, this.volatiles[status.id], this);\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\tif (this.battle.reportExactHP) {\r\n\t\t\tshared = secret;\r\n\t\t} else if (this.battle.reportPercentages || this.battle.gen >= 7) {\r\n\t\t\t// HP Percentage Mod mechanics\r\n\t\t\tlet percentage = Math.ceil(100 * this.hp / this.maxhp);\r\n\t\t\tif (percentage === 100 && this.hp < this.maxhp) {\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/**\r\n\t\t\t * In-game accurate pixel health mechanics\r\n\t\t\t * PS doesn't use pixels after Gen 6, but for reference:\r\n\t\t\t * - [Gen 7] SM uses 99 pixels\r\n\t\t\t * - [Gen 7] USUM uses 86 pixels\r\n\t\t\t * */\r\n\t\t\tconst pixels = Math.floor(48 * this.hp / this.maxhp) || 1;\r\n\t\t\tshared = `${pixels}/48`;\r\n\t\t\tif (this.battle.gen >= 5) {\r\n\t\t\t\tif (pixels === 9) {\r\n\t\t\t\t\tshared += this.hp * 5 > this.maxhp ? 'y' : 'r';\r\n\t\t\t\t} else if (pixels === 24) {\r\n\t\t\t\t\tshared += this.hp * 2 > this.maxhp ? 'g' : 'y';\r\n\t\t\t\t}\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// No Pokemon should be able to have Stellar as a base type\r\n\t\t\tif (typeof newType === 'string' ? newType === 'Stellar' : newType.includes('Stellar')) return false;\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 && this.terastallized !== 'Stellar') {\r\n\t\t\treturn [this.terastallized];\r\n\t\t}\r\n\t\tconst types = this.battle.runEvent('Type', this, null, null, this.types);\r\n\t\tif (!types.length) types.push(this.battle.gen >= 5 ? 'Normal' : '???');\r\n\t\tif (!excludeAdded && this.addedType) return types.concat(this.addedType);\r\n\t\treturn types;\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'] || this.volatiles['burningbulwark']\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\tif (this.terastallized && move.type === 'Stellar') {\r\n\t\t\ttotalTypeMod = 1;\r\n\t\t} else {\r\n\t\t\tfor (const type of this.getTypes()) {\r\n\t\t\t\tlet typeMod = this.battle.dex.getEffectiveness(move, type);\r\n\t\t\t\ttypeMod = this.battle.singleEvent('Effectiveness', move, null, this, type, move, typeMod);\r\n\t\t\t\ttotalTypeMod += this.battle.runEvent('Effectiveness', this, type, move, typeMod);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (this.species.name === 'Terapagos-Terastal' && this.hasAbility('Tera Shell') &&\r\n\t\t\t!this.battle.suppressingAbility(this)) {\r\n\t\t\tif (this.abilityState.resisted) return -1; // all hits of multi-hit move should be not very effective\r\n\t\t\tif (move.category === 'Status' || move.id === 'struggle' || !this.runImmunity(move) ||\r\n\t\t\t\ttotalTypeMod < 0 || this.hp < this.maxhp) {\r\n\t\t\t\treturn totalTypeMod;\r\n\t\t\t}\r\n\r\n\t\t\tthis.battle.add('-activate', this, 'ability: Tera Shell');\r\n\t\t\tthis.abilityState.resisted = true;\r\n\t\t\treturn -1;\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(source: ActiveMove | string, message?: string | boolean) {\r\n\t\tif (!source) return true;\r\n\t\tconst type: string = typeof source !== 'string' ? source.type : source;\r\n\t\tif (typeof source !== 'string') {\r\n\t\t\tif (source.ignoreImmunity && (source.ignoreImmunity === true || source.ignoreImmunity[type])) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\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\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"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pokebedrock-showdown",
3
3
  "description": "A modified version of the Pokémon Showdown server, designed for PokeBedrock.",
4
- "version": "0.1.1",
4
+ "version": "0.1.2",
5
5
  "main": "dist/sim/index.js",
6
6
  "types": "dist/sim/index.d.ts",
7
7
  "dependencies": {
@@ -47,11 +47,13 @@
47
47
  "full-test": "eslint --max-warnings 0 && npm run tsc && mocha --timeout 8000 --forbid-only -g \".*\" && npm run test-npm",
48
48
  "full-test-ci": "eslint --max-warnings 0 && tsc && (([ \"$SKIPSIMTESTS\" = true ] && mocha --timeout 8000 --forbid-only -g \".*\" --exclude \"test/{sim,random-battles}/**\") || mocha --timeout 8000 --forbid-only -g \".*\") && npm run test-npm"
49
49
  },
50
- "bin": "./pokemon-showdown",
50
+ "bin": {
51
+ "pokebedrock-showdown": "pokemon-showdown"
52
+ },
51
53
  "homepage": "https://pokebedrock.com",
52
54
  "repository": {
53
55
  "type": "git",
54
- "url": "https://github.com/smell-of-curry/pokebedrock-showdown.git"
56
+ "url": "git+https://github.com/smell-of-curry/pokebedrock-showdown.git"
55
57
  },
56
58
  "author": {
57
59
  "name": "Guangcong Luo",
package/sim/battle.ts CHANGED
@@ -3093,6 +3093,7 @@ export class Battle {
3093
3093
  const oldHealth = pokemon.getHealth();
3094
3094
  pokemon.useBagItem(itemId, moveName);
3095
3095
  if (oldHealth.secret !== pokemon.getHealth().secret)
3096
+ // @pokebedrock - Add details to the heal message
3096
3097
  this.add(
3097
3098
  '-heal',
3098
3099
  pokemon,
package/sim/pokemon.ts CHANGED
@@ -1455,7 +1455,6 @@ export class Pokemon {
1455
1455
  this.details = this.getUpdatedDetails();
1456
1456
  let details = (this.illusion || this).details;
1457
1457
  if (this.terastallized) details += `, tera:${this.terastallized}`;
1458
- this.battle.add('detailschange', this, details);
1459
1458
  this.updateMaxHp();
1460
1459
  if (!source) {
1461
1460
  // Tera forme
@@ -1519,7 +1518,8 @@ export class Pokemon {
1519
1518
  this.hp = newMaxHP - (this.maxhp - this.hp);
1520
1519
  if (this.hp < 0) this.hp = this.fainted ? 0 : 1; // latest should never happen
1521
1520
  this.maxhp = newMaxHP;
1522
- if (this.hp) this.battle.add('-heal', this, this.getHealth, '[silent]');
1521
+ // @pokebedrock - Add details to the heal message
1522
+ if (this.hp) this.battle.add('-heal', this, this.details, this.getHealth, '[silent]');
1523
1523
  }
1524
1524
 
1525
1525
  clearVolatile(includeSwitchFlags = true) {