{ "version": 3, "sources": ["../../../sim/dex-species.ts"], "sourcesContent": ["import { toID, BasicEffect } from './dex-data';\r\nimport * as CobblemonCache from './cobblemon-cache';\r\n\r\ninterface SpeciesAbility {\r\n\t0: string;\r\n\t1?: string;\r\n\tH?: string;\r\n\tS?: string;\r\n}\r\n\r\ntype SpeciesTag = \"Mythical\" | \"Restricted Legendary\" | \"Sub-Legendary\" | \"Paradox\";\r\n\r\nexport interface SpeciesData extends Partial {\r\n\tname: string;\r\n\t/** National Dex number */\r\n\tnum: number;\r\n\r\n\ttypes: string[];\r\n\tabilities: SpeciesAbility;\r\n\tbaseStats: StatsTable;\r\n\teggGroups: string[];\r\n\tweightkg: number;\r\n}\r\n\r\nexport type ModdedSpeciesData = SpeciesData | Partial> & {inherit: true};\r\n\r\nexport interface SpeciesFormatsData {\r\n\tdoublesTier?: TierTypes.Doubles | TierTypes.Other;\r\n\tgmaxUnreleased?: boolean;\r\n\tisNonstandard?: Nonstandard | null;\r\n\tnatDexTier?: TierTypes.Singles | TierTypes.Other;\r\n\ttier?: TierTypes.Singles | TierTypes.Other;\r\n}\r\n\r\nexport type ModdedSpeciesFormatsData = SpeciesFormatsData & {inherit?: true};\r\n\r\nexport interface LearnsetData {\r\n\tlearnset?: {[moveid: string]: MoveSource[]};\r\n\teventData?: EventInfo[];\r\n\teventOnly?: boolean;\r\n\tencounters?: EventInfo[];\r\n\texists?: boolean;\r\n}\r\n\r\nexport type ModdedLearnsetData = LearnsetData & {inherit?: true};\r\n\r\nexport class Species extends BasicEffect implements Readonly {\r\n\tdeclare readonly effectType: 'Pokemon';\r\n\t/**\r\n\t * Species ID. Identical to ID. Note that this is the full ID, e.g.\r\n\t * 'basculinbluestriped'. To get the base species ID, you need to\r\n\t * manually read toID(species.baseSpecies).\r\n\t */\r\n\tdeclare readonly id: ID;\r\n\t/**\r\n\t * Name. Note that this is the full name with forme,\r\n\t * e.g. 'Basculin-Blue-Striped'. To get the name without forme, see\r\n\t * `species.baseSpecies`.\r\n\t */\r\n\tdeclare readonly name: string;\r\n\t/**\r\n\t * Base species. Species, but without the forme name.\r\n\t *\r\n\t * DO NOT ASSUME A POKEMON CAN TRANSFORM FROM `baseSpecies` TO\r\n\t * `species`. USE `changesFrom` FOR THAT.\r\n\t */\r\n\treadonly baseSpecies: string;\r\n\t/**\r\n\t * Forme name. If the forme exists,\r\n\t * `species.name === species.baseSpecies + '-' + species.forme`\r\n\t *\r\n\t * The games make a distinction between Forme (foorumu) (legendary Pok\u00E9mon)\r\n\t * and Form (sugata) (non-legendary Pok\u00E9mon). PS does not use the same\r\n\t * distinction \u2013 they're all \"Forme\" to PS, reflecting current community\r\n\t * use of the term.\r\n\t *\r\n\t * This property only tracks non-cosmetic formes, and will be `''` for\r\n\t * cosmetic formes.\r\n\t */\r\n\treadonly forme: string;\r\n\t/**\r\n\t * Base forme name (e.g. 'Altered' for Giratina).\r\n\t */\r\n\treadonly baseForme: string;\r\n\t/**\r\n\t * Other forms. List of names of cosmetic forms. These should have\r\n\t * `aliases.js` aliases to this entry, but not have their own\r\n\t * entry in `pokedex.js`.\r\n\t */\r\n\treadonly cosmeticFormes?: string[];\r\n\t/**\r\n\t * Other formes. List of names of formes, appears only on the base\r\n\t * forme. Unlike forms, these have their own entry in `pokedex.js`.\r\n\t */\r\n\treadonly otherFormes?: string[];\r\n\t/**\r\n\t * List of forme speciesNames in the order they appear in the game data -\r\n\t * the union of baseSpecies, otherFormes and cosmeticFormes. Appears only on\r\n\t * the base species forme.\r\n\t *\r\n\t * A species's alternate formeindex may change from generation to generation -\r\n\t * the forme with index N in Gen A is not guaranteed to be the same forme as the\r\n\t * forme with index in Gen B.\r\n\t *\r\n\t * Gigantamaxes are not considered formes by the game (see data/FORMES.md - PS\r\n\t * labels them as such for convenience) - Gigantamax \"formes\" are instead included at\r\n\t * the end of the formeOrder list so as not to interfere with the correct index numbers.\r\n\t */\r\n\treadonly formeOrder?: string[];\r\n\t/**\r\n\t * Sprite ID. Basically the same as ID, but with a dash between\r\n\t * species and forme.\r\n\t */\r\n\treadonly spriteid: string;\r\n\t/** Abilities. */\r\n\treadonly abilities: SpeciesAbility;\r\n\t/** Types. */\r\n\treadonly types: string[];\r\n\t/** Added type (added by Trick-Or-Treat or Forest's Curse, but only listed in species by OMs). */\r\n\treadonly addedType?: string;\r\n\t/** Pre-evolution. '' if nothing evolves into this Pokemon. */\r\n\treadonly prevo: string;\r\n\t/** Evolutions. Array because many Pokemon have multiple evolutions. */\r\n\treadonly evos: string[];\r\n\treadonly evoType?: 'trade' | 'useItem' | 'levelMove' | 'levelExtra' | 'levelFriendship' | 'levelHold' | 'other';\r\n\t/** Evolution condition. falsy if doesn't evolve. */\r\n\tdeclare readonly evoCondition?: string;\r\n\t/** Evolution item. falsy if doesn't evolve. */\r\n\tdeclare readonly evoItem?: string;\r\n\t/** Evolution move. falsy if doesn't evolve. */\r\n\treadonly evoMove?: string;\r\n\t/** Region required to be in for evolution. falsy if doesn't evolve. */\r\n\treadonly evoRegion?: 'Alola' | 'Galar';\r\n\t/** Evolution level. falsy if doesn't evolve. */\r\n\treadonly evoLevel?: number;\r\n\t/** Is NFE? True if this Pokemon can evolve (Mega evolution doesn't count). */\r\n\treadonly nfe: boolean;\r\n\t/** Egg groups. */\r\n\treadonly eggGroups: string[];\r\n\t/** True if this species can hatch from an Egg. */\r\n\treadonly canHatch: boolean;\r\n\t/**\r\n\t * Gender. M = always male, F = always female, N = always\r\n\t * genderless, '' = sometimes male sometimes female.\r\n\t */\r\n\treadonly gender: GenderName;\r\n\t/** Gender ratio. Should add up to 1 unless genderless. */\r\n\treadonly genderRatio: {M: number, F: number};\r\n\t/** Base stats. */\r\n\treadonly baseStats: StatsTable;\r\n\t/** Max HP. Overrides usual HP calculations (for Shedinja). */\r\n\treadonly maxHP?: number;\r\n\t/** A Pokemon's Base Stat Total */\r\n\treadonly bst: number;\r\n\t/** Weight (in kg). Not valid for OMs; use weighthg / 10 instead. */\r\n\treadonly weightkg: number;\r\n\t/** Weight (in integer multiples of 0.1kg). */\r\n\treadonly weighthg: number;\r\n\t/** Height (in m). */\r\n\treadonly heightm: number;\r\n\t/** Color. */\r\n\treadonly color: string;\r\n\t/**\r\n\t * Tags, boolean data. Currently just legendary/mythical status.\r\n\t */\r\n\treadonly tags: SpeciesTag[];\r\n\t/** Does this Pokemon have an unreleased hidden ability? */\r\n\treadonly unreleasedHidden: boolean | 'Past';\r\n\t/**\r\n\t * Is it only possible to get the hidden ability on a male pokemon?\r\n\t * This is mainly relevant to Gen 5.\r\n\t */\r\n\treadonly maleOnlyHidden: boolean;\r\n\t/** True if a pokemon is mega. */\r\n\treadonly isMega?: boolean;\r\n\t/** True if a pokemon is primal. */\r\n\tdeclare readonly isPrimal?: boolean;\r\n\t/** Name of its Gigantamax move, if a pokemon is capable of gigantamaxing. */\r\n\treadonly canGigantamax?: string;\r\n\t/** If this Pokemon can gigantamax, is its gigantamax released? */\r\n\treadonly gmaxUnreleased?: boolean;\r\n\t/** True if a Pokemon species is incapable of dynamaxing */\r\n\treadonly cannotDynamax?: boolean;\r\n\t/** What it transforms from, if a pokemon is a forme that is only accessible in battle. */\r\n\treadonly battleOnly?: string | string[];\r\n\t/** Required item. Do not use this directly; see requiredItems. */\r\n\treadonly requiredItem?: string;\r\n\t/** Required move. Move required to use this forme in-battle. */\r\n\tdeclare readonly requiredMove?: string;\r\n\t/** Required ability. Ability required to use this forme in-battle. */\r\n\tdeclare readonly requiredAbility?: string;\r\n\t/**\r\n\t * Required items. Items required to be in this forme, e.g. a mega\r\n\t * stone, or Griseous Orb. Array because Arceus formes can hold\r\n\t * either a Plate or a Z-Crystal.\r\n\t */\r\n\treadonly requiredItems?: string[];\r\n\r\n\t/**\r\n\t * Formes that can transform into this Pokemon, to inherit learnsets\r\n\t * from. (Like `prevo`, but for transformations that aren't\r\n\t * technically evolution. Includes in-battle transformations like\r\n\t * Zen Mode and out-of-battle transformations like Rotom.)\r\n\t *\r\n\t * Not filled out for megas/primals - fall back to baseSpecies\r\n\t * for in-battle formes.\r\n\t */\r\n\treadonly changesFrom?: string;\r\n\r\n\t/**\r\n\t * Singles Tier. The Pokemon's location in the Smogon tier system.\r\n\t */\r\n\treadonly tier: TierTypes.Singles | TierTypes.Other;\r\n\t/**\r\n\t * Doubles Tier. The Pokemon's location in the Smogon doubles tier system.\r\n\t */\r\n\treadonly doublesTier: TierTypes.Doubles | TierTypes.Other;\r\n\t/**\r\n\t * National Dex Tier. The Pokemon's location in the Smogon National Dex tier system.\r\n\t */\r\n\treadonly natDexTier: TierTypes.Singles | TierTypes.Other;\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 = `pokemon: ${data.name}`;\r\n\t\tthis.effectType = 'Pokemon';\r\n\t\tthis.baseSpecies = data.baseSpecies || this.name;\r\n\t\tthis.forme = data.forme || '';\r\n\t\tthis.baseForme = data.baseForme || '';\r\n\t\tthis.cosmeticFormes = data.cosmeticFormes || undefined;\r\n\t\tthis.otherFormes = data.otherFormes || undefined;\r\n\t\tthis.formeOrder = data.formeOrder || undefined;\r\n\t\tthis.spriteid = data.spriteid ||\r\n\t\t\t(toID(this.baseSpecies) + (this.baseSpecies !== this.name ? `-${toID(this.forme)}` : ''));\r\n\t\tthis.abilities = data.abilities || {0: \"\"};\r\n\t\tthis.types = data.types || ['???'];\r\n\t\tthis.addedType = data.addedType || undefined;\r\n\t\tthis.prevo = data.prevo || '';\r\n\t\tthis.tier = data.tier || '';\r\n\t\tthis.doublesTier = data.doublesTier || '';\r\n\t\tthis.natDexTier = data.natDexTier || '';\r\n\t\tthis.evos = data.evos || [];\r\n\t\tthis.evoType = data.evoType || undefined;\r\n\t\tthis.evoMove = data.evoMove || undefined;\r\n\t\tthis.evoLevel = data.evoLevel || undefined;\r\n\t\tthis.nfe = data.nfe || false;\r\n\t\tthis.eggGroups = data.eggGroups || [];\r\n\t\tthis.canHatch = data.canHatch || false;\r\n\t\tthis.gender = data.gender || '';\r\n\t\tthis.genderRatio = data.genderRatio || (this.gender === 'M' ? {M: 1, F: 0} :\r\n\t\t\tthis.gender === 'F' ? {M: 0, F: 1} :\r\n\t\t\tthis.gender === 'N' ? {M: 0, F: 0} :\r\n\t\t\t{M: 0.5, F: 0.5});\r\n\t\tthis.requiredItem = data.requiredItem || undefined;\r\n\t\tthis.requiredItems = this.requiredItems || (this.requiredItem ? [this.requiredItem] : undefined);\r\n\t\tthis.baseStats = data.baseStats || {hp: 0, atk: 0, def: 0, spa: 0, spd: 0, spe: 0};\r\n\t\tthis.bst = this.baseStats.hp + this.baseStats.atk + this.baseStats.def +\r\n\t\t\tthis.baseStats.spa + this.baseStats.spd + this.baseStats.spe;\r\n\t\tthis.weightkg = data.weightkg || 0;\r\n\t\tthis.weighthg = this.weightkg * 10;\r\n\t\tthis.heightm = data.heightm || 0;\r\n\t\tthis.color = data.color || '';\r\n\t\tthis.tags = data.tags || [];\r\n\t\tthis.unreleasedHidden = data.unreleasedHidden || false;\r\n\t\tthis.maleOnlyHidden = !!data.maleOnlyHidden;\r\n\t\tthis.maxHP = data.maxHP || undefined;\r\n\t\tthis.isMega = !!(this.forme && ['Mega', 'Mega-X', 'Mega-Y'].includes(this.forme)) || undefined;\r\n\t\tthis.canGigantamax = data.canGigantamax || undefined;\r\n\t\tthis.gmaxUnreleased = !!data.gmaxUnreleased;\r\n\t\tthis.cannotDynamax = !!data.cannotDynamax;\r\n\t\tthis.battleOnly = data.battleOnly || (this.isMega ? this.baseSpecies : undefined);\r\n\t\tthis.changesFrom = data.changesFrom ||\r\n\t\t\t(this.battleOnly !== this.baseSpecies ? this.battleOnly : this.baseSpecies);\r\n\t\tif (Array.isArray(data.changesFrom)) this.changesFrom = data.changesFrom[0];\r\n\r\n\t\tif (!this.gen && this.num >= 1) {\r\n\t\t\tif (this.num >= 906 || this.forme.includes('Paldea')) {\r\n\t\t\t\tthis.gen = 9;\r\n\t\t\t} else if (this.num >= 810 || ['Gmax', 'Galar', 'Galar-Zen', 'Hisui'].includes(this.forme)) {\r\n\t\t\t\tthis.gen = 8;\r\n\t\t\t} else if (this.num >= 722 || this.forme.startsWith('Alola') || this.forme === 'Starter') {\r\n\t\t\t\tthis.gen = 7;\r\n\t\t\t} else if (this.forme === 'Primal') {\r\n\t\t\t\tthis.gen = 6;\r\n\t\t\t\tthis.isPrimal = true;\r\n\t\t\t\tthis.battleOnly = this.baseSpecies;\r\n\t\t\t} else if (this.num >= 650 || this.isMega) {\r\n\t\t\t\tthis.gen = 6;\r\n\t\t\t} else if (this.num >= 494) {\r\n\t\t\t\tthis.gen = 5;\r\n\t\t\t} else if (this.num >= 387) {\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 >= 152) {\r\n\t\t\t\tthis.gen = 2;\r\n\t\t\t} else {\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 Learnset {\r\n\treadonly effectType: 'Learnset';\r\n\t/**\r\n\t * Keeps track of exactly how a pokemon might learn a move, in the\r\n\t * form moveid:sources[].\r\n\t */\r\n\treadonly learnset?: {[moveid: string]: MoveSource[]};\r\n\t/** True if the only way to get this Pokemon is from events. */\r\n\treadonly eventOnly: boolean;\r\n\t/** List of event data for each event. */\r\n\treadonly eventData?: EventInfo[];\r\n\treadonly encounters?: EventInfo[];\r\n\treadonly exists: boolean;\r\n\r\n\tconstructor(data: AnyObject) {\r\n\t\tthis.exists = true;\r\n\t\tthis.effectType = 'Learnset';\r\n\t\tthis.learnset = data.learnset || undefined;\r\n\t\tthis.eventOnly = !!data.eventOnly;\r\n\t\tthis.eventData = data.eventData || undefined;\r\n\t\tthis.encounters = data.encounters || undefined;\r\n\t}\r\n}\r\n\r\nexport class DexSpecies {\r\n\treadonly dex: ModdedDex;\r\n\treadonly speciesCache = new Map();\r\n\treadonly learnsetCache = new Map();\r\n\tallCache: readonly Species[] | 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 | Species): Species {\r\n\t\tif (name && typeof name !== 'string') return name;\r\n\r\n\t\tname = (name || '').trim();\r\n\t\tlet id = toID(name);\r\n\t\tif (id === 'nidoran' && name.endsWith('\u2640')) {\r\n\t\t\tid = 'nidoranf' as ID;\r\n\t\t} else if (id === 'nidoran' && name.endsWith('\u2642')) {\r\n\t\t\tid = 'nidoranm' as ID;\r\n\t\t}\r\n\r\n\t\treturn this.getByID(id);\r\n\t}\r\n\tgetByID(id: ID): Species {\r\n\t\tlet species: Mutable | undefined = this.dex.currentMod === CobblemonCache.MOD_ID ? CobblemonCache.speciesByID(id) : this.speciesCache.get(id);\r\n\t\tif (species) return species;\r\n\r\n\t\tif (this.dex.data.Aliases.hasOwnProperty(id)) {\r\n\t\t\tif (this.dex.data.FormatsData.hasOwnProperty(id)) {\r\n\t\t\t\t// special event ID, like Rockruff-Dusk\r\n\t\t\t\tconst baseId = toID(this.dex.data.Aliases[id]);\r\n\t\t\t\tspecies = new Species({\r\n\t\t\t\t\t...this.dex.data.Pokedex[baseId],\r\n\t\t\t\t\t...this.dex.data.FormatsData[id],\r\n\t\t\t\t\tname: id,\r\n\t\t\t\t});\r\n\t\t\t\tspecies.abilities = {0: species.abilities['S']!};\r\n\t\t\t} else {\r\n\t\t\t\tspecies = this.get(this.dex.data.Aliases[id]);\r\n\t\t\t\tif (species.cosmeticFormes) {\r\n\t\t\t\t\tfor (const forme of species.cosmeticFormes) {\r\n\t\t\t\t\t\tif (toID(forme) === id) {\r\n\t\t\t\t\t\t\tspecies = new Species({\r\n\t\t\t\t\t\t\t\t...species,\r\n\t\t\t\t\t\t\t\tname: forme,\r\n\t\t\t\t\t\t\t\tforme: forme.slice(species.name.length + 1),\r\n\t\t\t\t\t\t\t\tbaseForme: \"\",\r\n\t\t\t\t\t\t\t\tbaseSpecies: species.name,\r\n\t\t\t\t\t\t\t\totherFormes: null,\r\n\t\t\t\t\t\t\t\tcosmeticFormes: null,\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tthis.speciesCache.set(id, species);\r\n\t\t\treturn species;\r\n\t\t}\r\n\r\n\t\tif (!this.dex.data.Pokedex.hasOwnProperty(id)) {\r\n\t\t\tlet aliasTo = '';\r\n\t\t\tconst formeNames: {[k: string]: string[]} = {\r\n\t\t\t\talola: ['a', 'alola', 'alolan'],\r\n\t\t\t\tgalar: ['g', 'galar', 'galarian'],\r\n\t\t\t\thisui: ['h', 'hisui', 'hisuian'],\r\n\t\t\t\tpaldea: ['p', 'paldea', 'paldean'],\r\n\t\t\t\tmega: ['m', 'mega'],\r\n\t\t\t\tprimal: ['p', 'primal'],\r\n\t\t\t};\r\n\t\t\tfor (const forme in formeNames) {\r\n\t\t\t\tlet pokeName = '';\r\n\t\t\t\tfor (const i of formeNames[forme]) {\r\n\t\t\t\t\tif (id.startsWith(i)) {\r\n\t\t\t\t\t\tpokeName = id.slice(i.length);\r\n\t\t\t\t\t} else if (id.endsWith(i)) {\r\n\t\t\t\t\t\tpokeName = id.slice(0, -i.length);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (this.dex.data.Aliases.hasOwnProperty(pokeName)) pokeName = toID(this.dex.data.Aliases[pokeName]);\r\n\t\t\t\tif (this.dex.data.Pokedex[pokeName + forme]) {\r\n\t\t\t\t\taliasTo = pokeName + forme;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (aliasTo) {\r\n\t\t\t\tspecies = this.get(aliasTo);\r\n\t\t\t\tif (species.exists) {\r\n\t\t\t\t\tthis.speciesCache.set(id, species);\r\n\t\t\t\t\treturn species;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (id && this.dex.data.Pokedex.hasOwnProperty(id)) {\r\n\t\t\tconst pokedexData = this.dex.data.Pokedex[id];\r\n\t\t\tconst baseSpeciesTags = pokedexData.baseSpecies && this.dex.data.Pokedex[toID(pokedexData.baseSpecies)].tags;\r\n\t\t\tspecies = new Species({\r\n\t\t\t\ttags: baseSpeciesTags,\r\n\t\t\t\t...pokedexData,\r\n\t\t\t\t...this.dex.data.FormatsData[id],\r\n\t\t\t});\r\n\t\t\t// Inherit any statuses from the base species (Arceus, Silvally).\r\n\t\t\tconst baseSpeciesStatuses = this.dex.data.Conditions[toID(species.baseSpecies)];\r\n\t\t\tif (baseSpeciesStatuses !== undefined) {\r\n\t\t\t\tlet key: keyof EffectData;\r\n\t\t\t\tfor (key in baseSpeciesStatuses) {\r\n\t\t\t\t\tif (!(key in species)) (species as any)[key] = baseSpeciesStatuses[key];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (!species.tier && !species.doublesTier && !species.natDexTier && species.baseSpecies !== species.name) {\r\n\t\t\t\tif (species.baseSpecies === 'Mimikyu') {\r\n\t\t\t\t\tspecies.tier = this.dex.data.FormatsData[toID(species.baseSpecies)].tier || 'Illegal';\r\n\t\t\t\t\tspecies.doublesTier = this.dex.data.FormatsData[toID(species.baseSpecies)].doublesTier || 'Illegal';\r\n\t\t\t\t\tspecies.natDexTier = this.dex.data.FormatsData[toID(species.baseSpecies)].natDexTier || 'Illegal';\r\n\t\t\t\t} else if (species.id.endsWith('totem')) {\r\n\t\t\t\t\tspecies.tier = this.dex.data.FormatsData[species.id.slice(0, -5)].tier || 'Illegal';\r\n\t\t\t\t\tspecies.doublesTier = this.dex.data.FormatsData[species.id.slice(0, -5)].doublesTier || 'Illegal';\r\n\t\t\t\t\tspecies.natDexTier = this.dex.data.FormatsData[species.id.slice(0, -5)].natDexTier || 'Illegal';\r\n\t\t\t\t} else if (species.battleOnly) {\r\n\t\t\t\t\tspecies.tier = this.dex.data.FormatsData[toID(species.battleOnly)].tier || 'Illegal';\r\n\t\t\t\t\tspecies.doublesTier = this.dex.data.FormatsData[toID(species.battleOnly)].doublesTier || 'Illegal';\r\n\t\t\t\t\tspecies.natDexTier = this.dex.data.FormatsData[toID(species.battleOnly)].natDexTier || 'Illegal';\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconst baseFormatsData = this.dex.data.FormatsData[toID(species.baseSpecies)];\r\n\t\t\t\t\tif (!baseFormatsData) {\r\n\t\t\t\t\t\tthrow new Error(`${species.baseSpecies} has no formats-data entry`);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tspecies.tier = baseFormatsData.tier || 'Illegal';\r\n\t\t\t\t\tspecies.doublesTier = baseFormatsData.doublesTier || 'Illegal';\r\n\t\t\t\t\tspecies.natDexTier = baseFormatsData.natDexTier || 'Illegal';\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (!species.tier) species.tier = 'Illegal';\r\n\t\t\tif (!species.doublesTier) species.doublesTier = species.tier as any;\r\n\t\t\tif (!species.natDexTier) species.natDexTier = species.tier;\r\n\t\t\tif (species.gen > this.dex.gen) {\r\n\t\t\t\tspecies.tier = 'Illegal';\r\n\t\t\t\tspecies.doublesTier = 'Illegal';\r\n\t\t\t\tspecies.natDexTier = 'Illegal';\r\n\t\t\t\tspecies.isNonstandard = 'Future';\r\n\t\t\t}\r\n\t\t\tif (this.dex.currentMod === 'gen7letsgo' && !species.isNonstandard) {\r\n\t\t\t\tconst isLetsGo = (\r\n\t\t\t\t\t(species.num <= 151 || ['Meltan', 'Melmetal'].includes(species.name)) &&\r\n\t\t\t\t\t(!species.forme || (['Alola', 'Mega', 'Mega-X', 'Mega-Y', 'Starter'].includes(species.forme) &&\r\n\t\t\t\t\tspecies.name !== 'Pikachu-Alola'))\r\n\t\t\t\t);\r\n\t\t\t\tif (!isLetsGo) species.isNonstandard = 'Past';\r\n\t\t\t}\r\n\t\t\tif (this.dex.currentMod === 'gen8bdsp' &&\r\n\t\t\t\t(!species.isNonstandard || [\"Gigantamax\", \"CAP\"].includes(species.isNonstandard))) {\r\n\t\t\t\tif (species.gen > 4 || (species.num < 1 && species.isNonstandard !== 'CAP') ||\r\n\t\t\t\t\tspecies.id === 'pichuspikyeared') {\r\n\t\t\t\t\tspecies.isNonstandard = 'Future';\r\n\t\t\t\t\tspecies.tier = species.doublesTier = species.natDexTier = 'Illegal';\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tspecies.nfe = species.evos.some(evo => {\r\n\t\t\t\tconst evoSpecies = this.get(evo);\r\n\t\t\t\treturn !evoSpecies.isNonstandard ||\r\n\t\t\t\t\tevoSpecies.isNonstandard === species?.isNonstandard ||\r\n\t\t\t\t\t// Pokemon with Hisui evolutions\r\n\t\t\t\t\tevoSpecies.isNonstandard === \"Unobtainable\";\r\n\t\t\t});\r\n\t\t\tspecies.canHatch = species.canHatch ||\r\n\t\t\t\t(!['Ditto', 'Undiscovered'].includes(species.eggGroups[0]) && !species.prevo && species.name !== 'Manaphy');\r\n\t\t\tif (this.dex.gen === 1) species.bst -= species.baseStats.spd;\r\n\t\t\tif (this.dex.gen < 5) delete species.abilities['H'];\r\n\t\t\tif (this.dex.gen === 3 && this.dex.abilities.get(species.abilities['1']).gen === 4) delete species.abilities['1'];\r\n\t\t} else {\r\n\t\t\tspecies = new Species({\r\n\t\t\t\tid, name: id,\r\n\t\t\t\texists: false, tier: 'Illegal', doublesTier: 'Illegal', natDexTier: 'Illegal', isNonstandard: 'Custom',\r\n\t\t\t});\r\n\t\t}\r\n\t\tif (species.exists) this.speciesCache.set(id, species);\r\n\t\treturn species;\r\n\t}\r\n\r\n\tgetLearnset(id: ID): Learnset['learnset'] {\r\n\t\treturn this.getLearnsetData(id).learnset;\r\n\t}\r\n\r\n\tgetLearnsetData(id: ID): Learnset {\r\n\t\tlet learnsetData = this.learnsetCache.get(id);\r\n\t\tif (learnsetData) return learnsetData;\r\n\t\tif (!this.dex.data.Learnsets.hasOwnProperty(id)) {\r\n\t\t\treturn new Learnset({exists: false});\r\n\t\t}\r\n\t\tlearnsetData = new Learnset(this.dex.data.Learnsets[id]);\r\n\t\tthis.learnsetCache.set(id, learnsetData);\r\n\t\treturn learnsetData;\r\n\t}\r\n\r\n\tall(): readonly Species[] {\r\n\t\tif (this.allCache) return this.allCache;\r\n\t\tconst species = [];\r\n\t\tfor (const id in this.dex.data.Pokedex) {\r\n\t\t\tspecies.push(this.getByID(id as ID));\r\n\t\t}\r\n\t\tthis.allCache = species;\r\n\t\treturn this.allCache;\r\n\t}\r\n}\r\n"], "mappings": "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", "names": [] }