{ "version": 3, "sources": ["../../../sim/dex-moves.ts"], "sourcesContent": ["import {Utils} from '../lib';\r\nimport {BasicEffect, toID} from './dex-data';\r\n\r\n/**\r\n * Describes the acceptable target(s) of a move.\r\n * adjacentAlly - Only relevant to Doubles or Triples, the move only targets an ally of the user.\r\n * adjacentAllyOrSelf - The move can target the user or its ally.\r\n * adjacentFoe - The move can target a foe, but not (in Triples) a distant foe.\r\n * all - The move targets the field or all Pok\u00E9mon at once.\r\n * allAdjacent - The move is a spread move that also hits the user's ally.\r\n * allAdjacentFoes - The move is a spread move.\r\n * allies - The move affects all active Pok\u00E9mon on the user's team.\r\n * allySide - The move adds a side condition on the user's side.\r\n * allyTeam - The move affects all unfainted Pok\u00E9mon on the user's team.\r\n * any - The move can hit any other active Pok\u00E9mon, not just those adjacent.\r\n * foeSide - The move adds a side condition on the foe's side.\r\n * normal - The move can hit one adjacent Pok\u00E9mon of your choice.\r\n * randomNormal - The move targets an adjacent foe at random.\r\n * scripted - The move targets the foe that damaged the user.\r\n * self - The move affects the user of the move.\r\n */\r\nexport type MoveTarget =\r\n\t'adjacentAlly' | 'adjacentAllyOrSelf' | 'adjacentFoe' | 'all' | 'allAdjacent' | 'allAdjacentFoes' |\r\n\t'allies' | 'allySide' | 'allyTeam' | 'any' | 'foeSide' | 'normal' | 'randomNormal' | 'scripted' | 'self';\r\n\r\n/** Possible move flags. */\r\ninterface MoveFlags {\r\n\tallyanim?: 1; // The move plays its animation when used on an ally.\r\n\tbypasssub?: 1; // Ignores a target's substitute.\r\n\tbite?: 1; // Power is multiplied by 1.5 when used by a Pokemon with the Ability Strong Jaw.\r\n\tbullet?: 1; // Has no effect on Pokemon with the Ability Bulletproof.\r\n\tcharge?: 1; // The user is unable to make a move between turns.\r\n\tcontact?: 1; // Makes contact.\r\n\tdance?: 1; // When used by a Pokemon, other Pokemon with the Ability Dancer can attempt to execute the same move.\r\n\tdefrost?: 1; // Thaws the user if executed successfully while the user is frozen.\r\n\tdistance?: 1; // Can target a Pokemon positioned anywhere in a Triple Battle.\r\n\tfailcopycat?: 1; // Cannot be selected by Copycat.\r\n\tfailencore?: 1; // Encore fails if target used this move.\r\n\tfailinstruct?: 1; // Cannot be repeated by Instruct.\r\n\tfailmefirst?: 1; // Cannot be selected by Me First.\r\n\tfailmimic?: 1; // Cannot be copied by Mimic.\r\n\tfuturemove?: 1; // Targets a slot, and in 2 turns damages that slot.\r\n\tgravity?: 1; // Prevented from being executed or selected during Gravity's effect.\r\n\theal?: 1; // Prevented from being executed or selected during Heal Block's effect.\r\n\tmirror?: 1; // Can be copied by Mirror Move.\r\n\tmustpressure?: 1; // Additional PP is deducted due to Pressure when it ordinarily would not.\r\n\tnoassist?: 1; // Cannot be selected by Assist.\r\n\tnonsky?: 1; // Prevented from being executed or selected in a Sky Battle.\r\n\tnoparentalbond?: 1; // Cannot be made to hit twice via Parental Bond.\r\n\tnosleeptalk?: 1; // Cannot be selected by Sleep Talk.\r\n\tpledgecombo?: 1; // Gems will not activate. Cannot be redirected by Storm Drain / Lightning Rod.\r\n\tpowder?: 1; // Has no effect on Pokemon which are Grass-type, have the Ability Overcoat, or hold Safety Goggles.\r\n\tprotect?: 1; // Blocked by Detect, Protect, Spiky Shield, and if not a Status move, King's Shield.\r\n\tpulse?: 1; // Power is multiplied by 1.5 when used by a Pokemon with the Ability Mega Launcher.\r\n\tpunch?: 1; // Power is multiplied by 1.2 when used by a Pokemon with the Ability Iron Fist.\r\n\trecharge?: 1; // If this move is successful, the user must recharge on the following turn and cannot make a move.\r\n\treflectable?: 1; // Bounced back to the original user by Magic Coat or the Ability Magic Bounce.\r\n\tslicing?: 1; // Power is multiplied by 1.5 when used by a Pokemon with the Ability Sharpness.\r\n\tsnatch?: 1; // Can be stolen from the original user and instead used by another Pokemon using Snatch.\r\n\tsound?: 1; // Has no effect on Pokemon with the Ability Soundproof.\r\n\twind?: 1; // Activates the Wind Power and Wind Rider Abilities.\r\n}\r\n\r\nexport interface HitEffect {\r\n\tonHit?: MoveEventMethods['onHit'];\r\n\r\n\t// set pokemon conditions\r\n\tboosts?: SparseBoostsTable | null;\r\n\tstatus?: string;\r\n\tvolatileStatus?: string;\r\n\r\n\t// set side/slot conditions\r\n\tsideCondition?: string;\r\n\tslotCondition?: string;\r\n\r\n\t// set field conditions\r\n\tpseudoWeather?: string;\r\n\tterrain?: string;\r\n\tweather?: string;\r\n}\r\n\r\nexport interface SecondaryEffect extends HitEffect {\r\n\tchance?: number;\r\n\t/** Used to flag a secondary effect as added by Poison Touch */\r\n\tability?: Ability;\r\n\t/**\r\n\t * Applies to Sparkling Aria's secondary effect: Affected by\r\n\t * Sheer Force but not Shield Dust.\r\n\t */\r\n\tdustproof?: boolean;\r\n\t/**\r\n\t * Gen 2 specific mechanics: Bypasses Substitute only on Twineedle,\r\n\t * and allows it to flinch sleeping/frozen targets\r\n\t */\r\n\tkingsrock?: boolean;\r\n\tself?: HitEffect;\r\n}\r\n\r\nexport interface MoveEventMethods {\r\n\tbasePowerCallback?: (this: Battle, pokemon: Pokemon, target: Pokemon, move: ActiveMove) => number | false | null;\r\n\t/** Return true to stop the move from being used */\r\n\tbeforeMoveCallback?: (this: Battle, pokemon: Pokemon, target: Pokemon | null, move: ActiveMove) => boolean | void;\r\n\tbeforeTurnCallback?: (this: Battle, pokemon: Pokemon, target: Pokemon) => void;\r\n\tdamageCallback?: (this: Battle, pokemon: Pokemon, target: Pokemon) => number | false;\r\n\tpriorityChargeCallback?: (this: Battle, pokemon: Pokemon) => void;\r\n\r\n\tonDisableMove?: (this: Battle, pokemon: Pokemon) => void;\r\n\r\n\tonAfterHit?: CommonHandlers['VoidSourceMove'];\r\n\tonAfterSubDamage?: (this: Battle, damage: number, target: Pokemon, source: Pokemon, move: ActiveMove) => void;\r\n\tonAfterMoveSecondarySelf?: CommonHandlers['VoidSourceMove'];\r\n\tonAfterMoveSecondary?: CommonHandlers['VoidMove'];\r\n\tonAfterMove?: CommonHandlers['VoidSourceMove'];\r\n\tonDamagePriority?: number;\r\n\tonDamage?: (\r\n\t\tthis: Battle, damage: number, target: Pokemon, source: Pokemon, effect: Effect\r\n\t) => number | boolean | null | void;\r\n\r\n\t/* Invoked by the global BasePower event (onEffect = true) */\r\n\tonBasePower?: CommonHandlers['ModifierSourceMove'];\r\n\r\n\tonEffectiveness?: (\r\n\t\tthis: Battle, typeMod: number, target: Pokemon | null, type: string, move: ActiveMove\r\n\t) => number | void;\r\n\tonHit?: CommonHandlers['ResultMove'];\r\n\tonHitField?: CommonHandlers['ResultMove'];\r\n\tonHitSide?: (this: Battle, side: Side, source: Pokemon, move: ActiveMove) => boolean | null | \"\" | void;\r\n\tonModifyMove?: (this: Battle, move: ActiveMove, pokemon: Pokemon, target: Pokemon | null) => void;\r\n\tonModifyPriority?: CommonHandlers['ModifierSourceMove'];\r\n\tonMoveFail?: CommonHandlers['VoidMove'];\r\n\tonModifyType?: (this: Battle, move: ActiveMove, pokemon: Pokemon, target: Pokemon) => void;\r\n\tonModifyTarget?: (\r\n\t\tthis: Battle, relayVar: {target: Pokemon}, pokemon: Pokemon, target: Pokemon, move: ActiveMove\r\n\t) => void;\r\n\tonPrepareHit?: CommonHandlers['ResultMove'];\r\n\tonTry?: CommonHandlers['ResultSourceMove'];\r\n\tonTryHit?: CommonHandlers['ExtResultSourceMove'];\r\n\tonTryHitField?: CommonHandlers['ResultMove'];\r\n\tonTryHitSide?: (this: Battle, side: Side, source: Pokemon, move: ActiveMove) => boolean |\r\n\t null | \"\" | void;\r\n\tonTryImmunity?: CommonHandlers['ResultMove'];\r\n\tonTryMove?: CommonHandlers['ResultSourceMove'];\r\n\tonUseMoveMessage?: CommonHandlers['VoidSourceMove'];\r\n}\r\n\r\nexport interface MoveData extends EffectData, MoveEventMethods, HitEffect {\r\n\tname: string;\r\n\t/** move index number, used for Metronome rolls */\r\n\tnum?: number;\r\n\tcondition?: ConditionData;\r\n\tbasePower: number;\r\n\taccuracy: true | number;\r\n\tpp: number;\r\n\tcategory: 'Physical' | 'Special' | 'Status';\r\n\ttype: string;\r\n\tpriority: number;\r\n\ttarget: MoveTarget;\r\n\tflags: MoveFlags;\r\n\t/** Hidden Power */\r\n\trealMove?: string;\r\n\r\n\tdamage?: number | 'level' | false | null;\r\n\tcontestType?: string;\r\n\tnoPPBoosts?: boolean;\r\n\r\n\t// Z-move data\r\n\t// -----------\r\n\t/**\r\n\t * ID of the Z-Crystal that calls the move.\r\n\t * `true` for Z-Powered status moves like Z-Encore.\r\n\t */\r\n\tisZ?: boolean | string;\r\n\tzMove?: {\r\n\t\tbasePower?: number,\r\n\t\teffect?: string,\r\n\t\tboost?: SparseBoostsTable,\r\n\t};\r\n\r\n\t// Max move data\r\n\t// -------------\r\n\t/**\r\n\t * `true` for Max moves like Max Airstream. If its a G-Max moves, this is\r\n\t * the species ID of the Gigantamax Pokemon that can use this G-Max move.\r\n\t */\r\n\tisMax?: boolean | string;\r\n\tmaxMove?: {\r\n\t\tbasePower: number,\r\n\t};\r\n\r\n\t// Hit effects\r\n\t// -----------\r\n\tohko?: boolean | string;\r\n\tthawsTarget?: boolean;\r\n\theal?: number[] | null;\r\n\tforceSwitch?: boolean;\r\n\tselfSwitch?: 'copyvolatile' | 'shedtail' | boolean;\r\n\tselfBoost?: {boosts?: SparseBoostsTable};\r\n\tselfdestruct?: 'always' | 'ifHit' | boolean;\r\n\tbreaksProtect?: boolean;\r\n\t/**\r\n\t * Note that this is only \"true\" recoil. Other self-damage, like Struggle,\r\n\t * crash (High Jump Kick), Mind Blown, Life Orb, and even Substitute and\r\n\t * Healing Wish, are sometimes called \"recoil\" by the community, but don't\r\n\t * count as \"real\" recoil.\r\n\t */\r\n\trecoil?: [number, number];\r\n\tdrain?: [number, number];\r\n\tmindBlownRecoil?: boolean;\r\n\tstealsBoosts?: boolean;\r\n\tstruggleRecoil?: boolean;\r\n\tsecondary?: SecondaryEffect | null;\r\n\tsecondaries?: SecondaryEffect[] | null;\r\n\tself?: SecondaryEffect | null;\r\n\thasSheerForce?: boolean;\r\n\r\n\t// Hit effect modifiers\r\n\t// --------------------\r\n\talwaysHit?: boolean; // currently unused\r\n\tbaseMoveType?: string;\r\n\tbasePowerModifier?: number;\r\n\tcritModifier?: number;\r\n\tcritRatio?: number;\r\n\t/**\r\n\t * Pokemon for the attack stat. Ability and Item damage modifiers still come from the real attacker.\r\n\t */\r\n\toverrideOffensivePokemon?: 'target' | 'source';\r\n\t/**\r\n\t * Physical moves use attack stat modifiers, special moves use special attack stat modifiers.\r\n\t */\r\n\toverrideOffensiveStat?: StatIDExceptHP;\r\n\t/**\r\n\t * Pokemon for the defense stat. Ability and Item damage modifiers still come from the real defender.\r\n\t */\r\n\toverrideDefensivePokemon?: 'target' | 'source';\r\n\t/**\r\n\t * uses modifiers that match the new stat\r\n\t */\r\n\toverrideDefensiveStat?: StatIDExceptHP;\r\n\tforceSTAB?: boolean;\r\n\tignoreAbility?: boolean;\r\n\tignoreAccuracy?: boolean;\r\n\tignoreDefensive?: boolean;\r\n\tignoreEvasion?: boolean;\r\n\tignoreImmunity?: boolean | {[k: string]: boolean};\r\n\tignoreNegativeOffensive?: boolean;\r\n\tignoreOffensive?: boolean;\r\n\tignorePositiveDefensive?: boolean;\r\n\tignorePositiveEvasion?: boolean;\r\n\tmultiaccuracy?: boolean;\r\n\tmultihit?: number | number[];\r\n\tmultihitType?: string;\r\n\tnoDamageVariance?: boolean;\r\n\tnonGhostTarget?: string;\r\n\tpressureTarget?: string;\r\n\tspreadModifier?: number;\r\n\tsleepUsable?: boolean;\r\n\t/**\r\n\t * Will change target if current target is unavailable. (Dragon Darts)\r\n\t */\r\n\tsmartTarget?: boolean;\r\n\t/**\r\n\t * Tracks the original target through Ally Switch and other switch-out-and-back-in\r\n\t * situations, rather than just targeting a slot. (Stalwart, Snipe Shot)\r\n\t */\r\n\ttracksTarget?: boolean;\r\n\twillCrit?: boolean;\r\n\r\n\t// Mechanics flags\r\n\t// ---------------\r\n\thasCrashDamage?: boolean;\r\n\tisConfusionSelfHit?: boolean;\r\n\tnoMetronome?: string[];\r\n\tnoSketch?: boolean;\r\n\tstallingMove?: boolean;\r\n\tbaseMove?: string;\r\n}\r\n\r\nexport type ModdedMoveData = MoveData | Partial> & {\r\n\tinherit: true,\r\n\tigniteBoosted?: boolean,\r\n\tsettleBoosted?: boolean,\r\n\tbodyofwaterBoosted?: boolean,\r\n\tlongWhipBoost?: boolean,\r\n\tgen?: number,\r\n};\r\n\r\nexport interface Move extends Readonly {\r\n\treadonly effectType: 'Move';\r\n}\r\n\r\ninterface MoveHitData {\r\n\t[targetSlotid: string]: {\r\n\t\t/** Did this move crit against the target? */\r\n\t\tcrit: boolean,\r\n\t\t/** The type effectiveness of this move against the target */\r\n\t\ttypeMod: number,\r\n\t\t/**\r\n\t\t * Is this move a Z-Move that broke the target's protection?\r\n\t\t * (does 0.25x regular damage)\r\n\t\t */\r\n\t\tzBrokeProtect: boolean,\r\n\t};\r\n}\r\n\r\ntype MutableMove = BasicEffect & MoveData;\r\ntype RuinableMove = {[k in `ruined${'Atk' | 'Def' | 'SpA' | 'SpD'}`]?: Pokemon;};\r\nexport interface ActiveMove extends MutableMove, RuinableMove {\r\n\treadonly name: string;\r\n\treadonly effectType: 'Move';\r\n\treadonly id: ID;\r\n\tnum: number;\r\n\tweather?: ID;\r\n\tstatus?: ID;\r\n\thit: number;\r\n\tmoveHitData?: MoveHitData;\r\n\tability?: Ability;\r\n\tallies?: Pokemon[];\r\n\tauraBooster?: Pokemon;\r\n\tcausedCrashDamage?: boolean;\r\n\tforceStatus?: ID;\r\n\thasAuraBreak?: boolean;\r\n\thasBounced?: boolean;\r\n\thasSheerForce?: boolean;\r\n\t/** Is the move called by Dancer? Used to prevent infinite Dancer recursion. */\r\n\tisExternal?: boolean;\r\n\tlastHit?: boolean;\r\n\tmagnitude?: number;\r\n\tnegateSecondary?: boolean;\r\n\tpranksterBoosted?: boolean;\r\n\tselfDropped?: boolean;\r\n\tselfSwitch?: 'copyvolatile' | 'shedtail' | boolean;\r\n\tspreadHit?: boolean;\r\n\tstab?: number;\r\n\tstatusRoll?: string;\r\n\ttotalDamage?: number | false;\r\n\ttypeChangerBoosted?: Effect;\r\n\twillChangeForme?: boolean;\r\n\tinfiltrates?: boolean;\r\n\r\n\t/**\r\n\t * Has this move been boosted by a Z-crystal or used by a Dynamax Pokemon? Usually the same as\r\n\t * `isZ` or `isMax`, but hacked moves will have this be `false` and `isZ` / `isMax` be truthy.\r\n\t */\r\n\tisZOrMaxPowered?: boolean;\r\n}\r\n\r\ntype MoveCategory = 'Physical' | 'Special' | 'Status';\r\n\r\nexport class DataMove extends BasicEffect implements Readonly {\r\n\tdeclare readonly effectType: 'Move';\r\n\t/** Move type. */\r\n\treadonly type: string;\r\n\t/** Move target. */\r\n\treadonly target: MoveTarget;\r\n\t/** Move base power. */\r\n\treadonly basePower: number;\r\n\t/** Move base accuracy. True denotes a move that always hits. */\r\n\treadonly accuracy: true | number;\r\n\t/** Critical hit ratio. Defaults to 1. */\r\n\treadonly critRatio: number;\r\n\t/** Will this move always or never be a critical hit? */\r\n\tdeclare readonly willCrit?: boolean;\r\n\t/** Can this move OHKO foes? */\r\n\tdeclare readonly ohko?: boolean | string;\r\n\t/**\r\n\t * Base move type. This is the move type as specified by the games,\r\n\t * tracked because it often differs from the real move type.\r\n\t */\r\n\treadonly baseMoveType: string;\r\n\t/**\r\n\t * Secondary effect. You usually don't want to access this\r\n\t * directly; but through the secondaries array.\r\n\t */\r\n\treadonly secondary: SecondaryEffect | null;\r\n\t/**\r\n\t * Secondary effects. An array because there can be more than one\r\n\t * (for instance, Fire Fang has both a burn and a flinch\r\n\t * secondary).\r\n\t */\r\n\treadonly secondaries: SecondaryEffect[] | null;\r\n\t/**\r\n\t * Moves manually boosted by Sheer Force that don't have secondary effects.\r\n\t * e.g. Jet Punch\r\n\t */\r\n\treadonly hasSheerForce: boolean;\r\n\t/**\r\n\t * Move priority. Higher priorities go before lower priorities,\r\n\t * trumping the Speed stat.\r\n\t */\r\n\treadonly priority: number;\r\n\t/** Move category. */\r\n\treadonly category: MoveCategory;\r\n\t/**\r\n\t * Pokemon for the attack stat. Ability and Item damage modifiers still come from the real attacker.\r\n\t */\r\n\t readonly overrideOffensivePokemon?: 'target' | 'source';\r\n\t/**\r\n\t * Physical moves use attack stat modifiers, special moves use special attack stat modifiers.\r\n\t */\r\n\t readonly overrideOffensiveStat?: StatIDExceptHP;\r\n\t/**\r\n\t * Pokemon for the defense stat. Ability and Item damage modifiers still come from the real defender.\r\n\t */\r\n\t readonly overrideDefensivePokemon?: 'target' | 'source';\r\n\t/**\r\n\t * uses modifiers that match the new stat\r\n\t */\r\n\t readonly overrideDefensiveStat?: StatIDExceptHP;\r\n\t/** Whether or not this move ignores negative attack boosts. */\r\n\treadonly ignoreNegativeOffensive: boolean;\r\n\t/** Whether or not this move ignores positive defense boosts. */\r\n\treadonly ignorePositiveDefensive: boolean;\r\n\t/** Whether or not this move ignores attack boosts. */\r\n\treadonly ignoreOffensive: boolean;\r\n\t/** Whether or not this move ignores defense boosts. */\r\n\treadonly ignoreDefensive: boolean;\r\n\t/**\r\n\t * Whether or not this move ignores type immunities. Defaults to\r\n\t * true for Status moves and false for Physical/Special moves.\r\n\t */\r\n\treadonly ignoreImmunity: AnyObject | boolean;\r\n\t/** Base move PP. */\r\n\treadonly pp: number;\r\n\t/** Whether or not this move can receive PP boosts. */\r\n\treadonly noPPBoosts: boolean;\r\n\t/** How many times does this move hit? */\r\n\tdeclare readonly multihit?: number | number[];\r\n\t/** Is this move a Z-Move? */\r\n\treadonly isZ: boolean | string;\r\n\t/* Z-Move fields */\r\n\tdeclare readonly zMove?: {\r\n\t\tbasePower?: number,\r\n\t\teffect?: string,\r\n\t\tboost?: SparseBoostsTable,\r\n\t};\r\n\t/** Is this move a Max move? */\r\n\treadonly isMax: boolean | string;\r\n\t/** Max/G-Max move fields */\r\n\tdeclare readonly maxMove?: {\r\n\t\tbasePower: number,\r\n\t};\r\n\treadonly flags: MoveFlags;\r\n\t/** Whether or not the user must switch after using this move. */\r\n\treadonly selfSwitch?: 'copyvolatile' | 'shedtail' | boolean;\r\n\t/** Move target only used by Pressure. */\r\n\treadonly pressureTarget: string;\r\n\t/** Move target used if the user is not a Ghost type (for Curse). */\r\n\treadonly nonGhostTarget: string;\r\n\t/** Whether or not the move ignores abilities. */\r\n\treadonly ignoreAbility: boolean;\r\n\t/**\r\n\t * Move damage against the current target\r\n\t * false = move will always fail with \"But it failed!\"\r\n\t * null = move will always silently fail\r\n\t * undefined = move does not deal fixed damage\r\n\t */\r\n\treadonly damage: number | 'level' | false | null;\r\n\t/** Whether or not this move hit multiple targets. */\r\n\treadonly spreadHit: boolean;\r\n\t/** Modifier that affects damage when multiple targets are hit. */\r\n\tdeclare readonly spreadModifier?: number;\r\n\t/** Modifier that affects damage when this move is a critical hit. */\r\n\tdeclare readonly critModifier?: number;\r\n\t/** Forces the move to get STAB even if the type doesn't match. */\r\n\treadonly forceSTAB: boolean;\r\n\t/** True if it can't be copied with Sketch. */\r\n\treadonly noSketch: boolean;\r\n\t/** STAB multiplier (can be modified by other effects) (default 1.5). */\r\n\treadonly stab?: number;\r\n\r\n\treadonly volatileStatus?: ID;\r\n\r\n\tconstructor(data: AnyObject) {\r\n\t\tsuper(data);\r\n\t\t// eslint-disable-next-line @typescript-eslint/no-this-alias\r\n\t\tdata = this;\r\n\r\n\t\tthis.fullname = `move: ${this.name}`;\r\n\t\tthis.effectType = 'Move';\r\n\t\tthis.type = Utils.getString(data.type);\r\n\t\tthis.target = data.target;\r\n\t\tthis.basePower = Number(data.basePower);\r\n\t\tthis.accuracy = data.accuracy!;\r\n\t\tthis.critRatio = Number(data.critRatio) || 1;\r\n\t\tthis.baseMoveType = Utils.getString(data.baseMoveType) || this.type;\r\n\t\tthis.secondary = data.secondary || null;\r\n\t\tthis.secondaries = data.secondaries || (this.secondary && [this.secondary]) || null;\r\n\t\tthis.hasSheerForce = !!(data.hasSheerForce && !this.secondaries);\r\n\t\tthis.priority = Number(data.priority) || 0;\r\n\t\tthis.category = data.category!;\r\n\t\tthis.overrideOffensiveStat = data.overrideOffensiveStat || undefined;\r\n\t\tthis.overrideOffensivePokemon = data.overrideOffensivePokemon || undefined;\r\n\t\tthis.overrideDefensiveStat = data.overrideDefensiveStat || undefined;\r\n\t\tthis.overrideDefensivePokemon = data.overrideDefensivePokemon || undefined;\r\n\t\tthis.ignoreNegativeOffensive = !!data.ignoreNegativeOffensive;\r\n\t\tthis.ignorePositiveDefensive = !!data.ignorePositiveDefensive;\r\n\t\tthis.ignoreOffensive = !!data.ignoreOffensive;\r\n\t\tthis.ignoreDefensive = !!data.ignoreDefensive;\r\n\t\tthis.ignoreImmunity = (data.ignoreImmunity !== undefined ? data.ignoreImmunity : this.category === 'Status');\r\n\t\tthis.pp = Number(data.pp);\r\n\t\tthis.noPPBoosts = !!data.noPPBoosts;\r\n\t\tthis.isZ = data.isZ || false;\r\n\t\tthis.isMax = data.isMax || false;\r\n\t\tthis.flags = data.flags || {};\r\n\t\tthis.selfSwitch = (typeof data.selfSwitch === 'string' ? (data.selfSwitch as ID) : data.selfSwitch) || undefined;\r\n\t\tthis.pressureTarget = data.pressureTarget || '';\r\n\t\tthis.nonGhostTarget = data.nonGhostTarget || '';\r\n\t\tthis.ignoreAbility = data.ignoreAbility || false;\r\n\t\tthis.damage = data.damage!;\r\n\t\tthis.spreadHit = data.spreadHit || false;\r\n\t\tthis.forceSTAB = !!data.forceSTAB;\r\n\t\tthis.noSketch = !!data.noSketch;\r\n\t\tthis.stab = data.stab || undefined;\r\n\t\tthis.volatileStatus = typeof data.volatileStatus === 'string' ? (data.volatileStatus as ID) : undefined;\r\n\r\n\t\tif (this.category !== 'Status' && !this.maxMove && this.id !== 'struggle') {\r\n\t\t\tthis.maxMove = {basePower: 1};\r\n\t\t\tif (this.isMax || this.isZ) {\r\n\t\t\t\t// already initialized to 1\r\n\t\t\t} else if (!this.basePower) {\r\n\t\t\t\tthis.maxMove.basePower = 100;\r\n\t\t\t} else if (['Fighting', 'Poison'].includes(this.type)) {\r\n\t\t\t\tif (this.basePower >= 150) {\r\n\t\t\t\t\tthis.maxMove.basePower = 100;\r\n\t\t\t\t} else if (this.basePower >= 110) {\r\n\t\t\t\t\tthis.maxMove.basePower = 95;\r\n\t\t\t\t} else if (this.basePower >= 75) {\r\n\t\t\t\t\tthis.maxMove.basePower = 90;\r\n\t\t\t\t} else if (this.basePower >= 65) {\r\n\t\t\t\t\tthis.maxMove.basePower = 85;\r\n\t\t\t\t} else if (this.basePower >= 55) {\r\n\t\t\t\t\tthis.maxMove.basePower = 80;\r\n\t\t\t\t} else if (this.basePower >= 45) {\r\n\t\t\t\t\tthis.maxMove.basePower = 75;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.maxMove.basePower = 70;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tif (this.basePower >= 150) {\r\n\t\t\t\t\tthis.maxMove.basePower = 150;\r\n\t\t\t\t} else if (this.basePower >= 110) {\r\n\t\t\t\t\tthis.maxMove.basePower = 140;\r\n\t\t\t\t} else if (this.basePower >= 75) {\r\n\t\t\t\t\tthis.maxMove.basePower = 130;\r\n\t\t\t\t} else if (this.basePower >= 65) {\r\n\t\t\t\t\tthis.maxMove.basePower = 120;\r\n\t\t\t\t} else if (this.basePower >= 55) {\r\n\t\t\t\t\tthis.maxMove.basePower = 110;\r\n\t\t\t\t} else if (this.basePower >= 45) {\r\n\t\t\t\t\tthis.maxMove.basePower = 100;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.maxMove.basePower = 90;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (this.category !== 'Status' && !this.zMove && !this.isZ && !this.isMax && this.id !== 'struggle') {\r\n\t\t\tlet basePower = this.basePower;\r\n\t\t\tthis.zMove = {};\r\n\t\t\tif (Array.isArray(this.multihit)) basePower *= 3;\r\n\t\t\tif (!basePower) {\r\n\t\t\t\tthis.zMove.basePower = 100;\r\n\t\t\t} else if (basePower >= 140) {\r\n\t\t\t\tthis.zMove.basePower = 200;\r\n\t\t\t} else if (basePower >= 130) {\r\n\t\t\t\tthis.zMove.basePower = 195;\r\n\t\t\t} else if (basePower >= 120) {\r\n\t\t\t\tthis.zMove.basePower = 190;\r\n\t\t\t} else if (basePower >= 110) {\r\n\t\t\t\tthis.zMove.basePower = 185;\r\n\t\t\t} else if (basePower >= 100) {\r\n\t\t\t\tthis.zMove.basePower = 180;\r\n\t\t\t} else if (basePower >= 90) {\r\n\t\t\t\tthis.zMove.basePower = 175;\r\n\t\t\t} else if (basePower >= 80) {\r\n\t\t\t\tthis.zMove.basePower = 160;\r\n\t\t\t} else if (basePower >= 70) {\r\n\t\t\t\tthis.zMove.basePower = 140;\r\n\t\t\t} else if (basePower >= 60) {\r\n\t\t\t\tthis.zMove.basePower = 120;\r\n\t\t\t} else {\r\n\t\t\t\tthis.zMove.basePower = 100;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!this.gen) {\r\n\t\t\t// special handling for gen8 gmax moves (all of them have num 1000 but they are part of gen8)\r\n\t\t\tif (this.num >= 827 && !this.isMax) {\r\n\t\t\t\tthis.gen = 9;\r\n\t\t\t} else if (this.num >= 743) {\r\n\t\t\t\tthis.gen = 8;\r\n\t\t\t} else if (this.num >= 622) {\r\n\t\t\t\tthis.gen = 7;\r\n\t\t\t} else if (this.num >= 560) {\r\n\t\t\t\tthis.gen = 6;\r\n\t\t\t} else if (this.num >= 468) {\r\n\t\t\t\tthis.gen = 5;\r\n\t\t\t} else if (this.num >= 355) {\r\n\t\t\t\tthis.gen = 4;\r\n\t\t\t} else if (this.num >= 252) {\r\n\t\t\t\tthis.gen = 3;\r\n\t\t\t} else if (this.num >= 166) {\r\n\t\t\t\tthis.gen = 2;\r\n\t\t\t} else if (this.num >= 1) {\r\n\t\t\t\tthis.gen = 1;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport class DexMoves {\r\n\treadonly dex: ModdedDex;\r\n\treadonly moveCache = new Map();\r\n\tallCache: readonly Move[] | null = null;\r\n\r\n\tconstructor(dex: ModdedDex) {\r\n\t\tthis.dex = dex;\r\n\t}\r\n\r\n\tget(name?: string | Move): Move {\r\n\t\tif (name && typeof name !== 'string') return name;\r\n\r\n\t\tname = (name || '').trim();\r\n\t\tconst id = toID(name);\r\n\t\treturn this.getByID(id);\r\n\t}\r\n\r\n\tgetByID(id: ID): Move {\r\n\t\tlet move = this.moveCache.get(id);\r\n\t\tif (move) return move;\r\n\t\tif (this.dex.data.Aliases.hasOwnProperty(id)) {\r\n\t\t\tmove = this.get(this.dex.data.Aliases[id]);\r\n\t\t\tif (move.exists) {\r\n\t\t\t\tthis.moveCache.set(id, move);\r\n\t\t\t}\r\n\t\t\treturn move;\r\n\t\t}\r\n\t\tif (id.startsWith('hiddenpower')) {\r\n\t\t\tid = /([a-z]*)([0-9]*)/.exec(id)![1] as ID;\r\n\t\t}\r\n\t\tif (id && this.dex.data.Moves.hasOwnProperty(id)) {\r\n\t\t\tconst moveData = this.dex.data.Moves[id] as any;\r\n\t\t\tconst moveTextData = this.dex.getDescs('Moves', id, moveData);\r\n\t\t\tmove = new DataMove({\r\n\t\t\t\tname: id,\r\n\t\t\t\t...moveData,\r\n\t\t\t\t...moveTextData,\r\n\t\t\t});\r\n\t\t\tif (move.gen > this.dex.gen) {\r\n\t\t\t\t(move as any).isNonstandard = 'Future';\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tmove = new DataMove({\r\n\t\t\t\tname: id, exists: false,\r\n\t\t\t});\r\n\t\t}\r\n\t\tif (move.exists) this.moveCache.set(id, move);\r\n\t\treturn move;\r\n\t}\r\n\r\n\tall(): readonly Move[] {\r\n\t\tif (this.allCache) return this.allCache;\r\n\t\tconst moves = [];\r\n\t\tfor (const id in this.dex.data.Moves) {\r\n\t\t\tmoves.push(this.getByID(id as ID));\r\n\t\t}\r\n\t\tthis.allCache = moves;\r\n\t\treturn this.allCache;\r\n\t}\r\n}\r\n"], "mappings": "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", "names": [] }