Spaces:
Running
Running
{ | |
"version": 3, | |
"sources": ["../../sim/dex.ts"], | |
"sourcesContent": ["/**\n * Dex\n * Pokemon Showdown - http://pokemonshowdown.com/\n *\n * Handles getting data about pokemon, items, etc. Also contains some useful\n * helper functions for using dex data.\n *\n * By default, nothing is loaded until you call Dex.mod(mod) or\n * Dex.forFormat(format).\n *\n * You may choose to preload some things:\n * - Dex.includeMods() ~10ms\n * This will preload `Dex.dexes`, giving you a list of possible mods.\n * - Dex.includeFormats() ~30ms\n * As above, but will also preload `Dex.formats.all()`.\n * - Dex.includeData() ~500ms\n * As above, but will also preload all of Dex.data for Gen 8, so\n * functions like `Dex.species.get`, etc will be instantly usable.\n * - Dex.includeModData() ~1500ms\n * As above, but will also preload `Dex.dexes[...].data` for all mods.\n *\n * Note that preloading is never necessary. All the data will be\n * automatically preloaded when needed, preloading will just spend time\n * now so you don't need to spend time later.\n *\n * @license MIT\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nimport * as Data from './dex-data';\nimport { Condition, DexConditions } from './dex-conditions';\nimport { DataMove, DexMoves } from './dex-moves';\nimport { Item, DexItems } from './dex-items';\nimport { Ability, DexAbilities } from './dex-abilities';\nimport { Species, DexSpecies } from './dex-species';\nimport { Format, DexFormats } from './dex-formats';\nimport { Utils } from '../lib/utils';\n\nconst BASE_MOD = 'gen9' as ID;\nconst DATA_DIR = path.resolve(__dirname, '../data');\nconst MODS_DIR = path.resolve(DATA_DIR, './mods');\n\nconst dexes: { [mod: string]: ModdedDex } = Object.create(null);\n\ntype DataType =\n\t'Abilities' | 'Rulesets' | 'FormatsData' | 'Items' | 'Learnsets' | 'Moves' |\n\t'Natures' | 'Pokedex' | 'Scripts' | 'Conditions' | 'TypeChart' | 'PokemonGoData';\nconst DATA_TYPES: (DataType | 'Aliases')[] = [\n\t'Abilities', 'Rulesets', 'FormatsData', 'Items', 'Learnsets', 'Moves',\n\t'Natures', 'Pokedex', 'Scripts', 'Conditions', 'TypeChart', 'PokemonGoData',\n];\n\nconst DATA_FILES = {\n\tAbilities: 'abilities',\n\tAliases: 'aliases',\n\tRulesets: 'rulesets',\n\tFormatsData: 'formats-data',\n\tItems: 'items',\n\tLearnsets: 'learnsets',\n\tMoves: 'moves',\n\tNatures: 'natures',\n\tPokedex: 'pokedex',\n\tPokemonGoData: 'pokemongo',\n\tScripts: 'scripts',\n\tConditions: 'conditions',\n\tTypeChart: 'typechart',\n};\n\n/** Unfortunately we do for..in too much to want to deal with the casts */\nexport interface DexTable<T> { [id: string]: T }\nexport interface AliasesTable { [id: IDEntry]: string }\n\ninterface DexTableData {\n\tAbilities: DexTable<import('./dex-abilities').AbilityData>;\n\tAliases: DexTable<string>;\n\tRulesets: DexTable<import('./dex-formats').FormatData>;\n\tItems: DexTable<import('./dex-items').ItemData>;\n\tLearnsets: DexTable<import('./dex-species').LearnsetData>;\n\tMoves: DexTable<import('./dex-moves').MoveData>;\n\tNatures: DexTable<import('./dex-data').NatureData>;\n\tPokedex: DexTable<import('./dex-species').SpeciesData>;\n\tFormatsData: DexTable<import('./dex-species').SpeciesFormatsData>;\n\tPokemonGoData: DexTable<import('./dex-species').PokemonGoData>;\n\tScripts: DexTable<AnyObject>;\n\tConditions: DexTable<import('./dex-conditions').ConditionData>;\n\tTypeChart: DexTable<import('./dex-data').TypeData>;\n}\ninterface TextTableData {\n\tAbilities: DexTable<AbilityText>;\n\tItems: DexTable<ItemText>;\n\tMoves: DexTable<MoveText>;\n\tPokedex: DexTable<PokedexText>;\n\tDefault: DexTable<DefaultText>;\n}\n\nexport const toID = Data.toID;\n\nexport class ModdedDex {\n\treadonly Data = Data;\n\treadonly Condition = Condition;\n\treadonly Ability = Ability;\n\treadonly Item = Item;\n\treadonly Move = DataMove;\n\treadonly Species = Species;\n\treadonly Format = Format;\n\treadonly ModdedDex = ModdedDex;\n\n\treadonly name = \"[ModdedDex]\";\n\treadonly isBase: boolean;\n\treadonly currentMod: string;\n\treadonly dataDir: string;\n\n\treadonly toID = Data.toID;\n\n\tgen = 0;\n\tparentMod = '';\n\tmodsLoaded = false;\n\n\tdataCache: DexTableData | null;\n\ttextCache: TextTableData | null;\n\n\tdeepClone = Utils.deepClone;\n\tdeepFreeze = Utils.deepFreeze;\n\tMultiset = Utils.Multiset;\n\n\treadonly formats: DexFormats;\n\treadonly abilities: DexAbilities;\n\treadonly items: DexItems;\n\treadonly moves: DexMoves;\n\treadonly species: DexSpecies;\n\treadonly conditions: DexConditions;\n\treadonly natures: Data.DexNatures;\n\treadonly types: Data.DexTypes;\n\treadonly stats: Data.DexStats;\n\n\tconstructor(mod = 'base') {\n\t\tthis.isBase = (mod === 'base');\n\t\tthis.currentMod = mod;\n\t\tthis.dataDir = (this.isBase ? DATA_DIR : MODS_DIR + '/' + this.currentMod);\n\n\t\tthis.dataCache = null;\n\t\tthis.textCache = null;\n\n\t\tthis.formats = new DexFormats(this);\n\t\tthis.abilities = new DexAbilities(this);\n\t\tthis.items = new DexItems(this);\n\t\tthis.moves = new DexMoves(this);\n\t\tthis.species = new DexSpecies(this);\n\t\tthis.conditions = new DexConditions(this);\n\t\tthis.natures = new Data.DexNatures(this);\n\t\tthis.types = new Data.DexTypes(this);\n\t\tthis.stats = new Data.DexStats(this);\n\t}\n\n\tget data(): DexTableData {\n\t\treturn this.loadData();\n\t}\n\n\tget dexes(): { [mod: string]: ModdedDex } {\n\t\tthis.includeMods();\n\t\treturn dexes;\n\t}\n\n\tmod(mod: string | undefined): ModdedDex {\n\t\tif (!dexes['base'].modsLoaded) dexes['base'].includeMods();\n\t\treturn dexes[mod || 'base'].includeData();\n\t}\n\n\tforGen(gen: number) {\n\t\tif (!gen) return this;\n\t\treturn this.mod(`gen${gen}`);\n\t}\n\n\tforFormat(format: Format | string): ModdedDex {\n\t\tif (!this.modsLoaded) this.includeMods();\n\t\tconst mod = this.formats.get(format).mod;\n\t\treturn dexes[mod || BASE_MOD].includeData();\n\t}\n\n\tmodData(dataType: DataType, id: string) {\n\t\tif (this.isBase) return this.data[dataType][id];\n\t\tif (this.data[dataType][id] !== dexes[this.parentMod].data[dataType][id]) return this.data[dataType][id];\n\t\treturn (this.data[dataType][id] = Utils.deepClone(this.data[dataType][id]));\n\t}\n\n\teffectToString() {\n\t\treturn this.name;\n\t}\n\n\t/**\n\t * Sanitizes a username or Pokemon nickname\n\t *\n\t * Returns the passed name, sanitized for safe use as a name in the PS\n\t * protocol.\n\t *\n\t * Such a string must uphold these guarantees:\n\t * - must not contain any ASCII whitespace character other than a space\n\t * - must not start or end with a space character\n\t * - must not contain any of: | , [ ]\n\t * - must not be the empty string\n\t * - must not contain Unicode RTL control characters\n\t *\n\t * If no such string can be found, returns the empty string. Calling\n\t * functions are expected to check for that condition and deal with it\n\t * accordingly.\n\t *\n\t * getName also enforces that there are not multiple consecutive space\n\t * characters in the name, although this is not strictly necessary for\n\t * safety.\n\t */\n\tgetName(name: any): string {\n\t\tif (typeof name !== 'string' && typeof name !== 'number') return '';\n\t\tname = `${name}`.replace(/[|\\s[\\],\\u202e]+/g, ' ').trim();\n\t\tif (name.length > 18) name = name.substr(0, 18).trim();\n\n\t\t// remove zalgo\n\t\tname = name.replace(\n\t\t\t/[\\u0300-\\u036f\\u0483-\\u0489\\u0610-\\u0615\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06ED\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E]{3,}/g,\n\t\t\t''\n\t\t);\n\t\tname = name.replace(/[\\u239b-\\u23b9]/g, '');\n\n\t\treturn name;\n\t}\n\n\t/**\n\t * Returns false if the target is immune; true otherwise.\n\t * Also checks immunity to some statuses.\n\t */\n\tgetImmunity(\n\t\tsource: { type: string } | string,\n\t\ttarget: { getTypes: () => string[] } | { types: string[] } | string[] | string\n\t): boolean {\n\t\tconst sourceType: string = typeof source !== 'string' ? source.type : source;\n\t\t// @ts-expect-error really wish TS would support this\n\t\tconst targetTyping: string[] | string = target.getTypes?.() || target.types || target;\n\t\tif (Array.isArray(targetTyping)) {\n\t\t\tfor (const type of targetTyping) {\n\t\t\t\tif (!this.getImmunity(sourceType, type)) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\tconst typeData = this.types.get(targetTyping);\n\t\tif (typeData && typeData.damageTaken[sourceType] === 3) return false;\n\t\treturn true;\n\t}\n\n\tgetEffectiveness(\n\t\tsource: { type: string } | string,\n\t\ttarget: { getTypes: () => string[] } | { types: string[] } | string[] | string\n\t): number {\n\t\tconst sourceType: string = typeof source !== 'string' ? source.type : source;\n\t\t// @ts-expect-error really wish TS would support this\n\t\tconst targetTyping: string[] | string = target.getTypes?.() || target.types || target;\n\t\tlet totalTypeMod = 0;\n\t\tif (Array.isArray(targetTyping)) {\n\t\t\tfor (const type of targetTyping) {\n\t\t\t\ttotalTypeMod += this.getEffectiveness(sourceType, type);\n\t\t\t}\n\t\t\treturn totalTypeMod;\n\t\t}\n\t\tconst typeData = this.types.get(targetTyping);\n\t\tif (!typeData) return 0;\n\t\tswitch (typeData.damageTaken[sourceType]) {\n\t\tcase 1: return 1; // super-effective\n\t\tcase 2: return -1; // resist\n\t\t// in case of weird situations like Gravity, immunity is handled elsewhere\n\t\tdefault: return 0;\n\t\t}\n\t}\n\n\tgetDescs(table: keyof TextTableData, id: ID, dataEntry: AnyObject) {\n\t\tif (dataEntry.shortDesc) {\n\t\t\treturn {\n\t\t\t\tdesc: dataEntry.desc,\n\t\t\t\tshortDesc: dataEntry.shortDesc,\n\t\t\t};\n\t\t}\n\t\tconst entry = this.loadTextData()[table][id];\n\t\tif (!entry) return null;\n\t\tconst descs = {\n\t\t\tdesc: '',\n\t\t\tshortDesc: '',\n\t\t};\n\t\tfor (let i = this.gen; i < dexes['base'].gen; i++) {\n\t\t\tconst curDesc = entry[`gen${i}` as keyof typeof entry]?.desc;\n\t\t\tconst curShortDesc = entry[`gen${i}` as keyof typeof entry]?.shortDesc;\n\t\t\tif (!descs.desc && curDesc) {\n\t\t\t\tdescs.desc = curDesc;\n\t\t\t}\n\t\t\tif (!descs.shortDesc && curShortDesc) {\n\t\t\t\tdescs.shortDesc = curShortDesc;\n\t\t\t}\n\t\t\tif (descs.desc && descs.shortDesc) break;\n\t\t}\n\t\tif (!descs.shortDesc) descs.shortDesc = entry.shortDesc || '';\n\t\tif (!descs.desc) descs.desc = entry.desc || descs.shortDesc;\n\t\treturn descs;\n\t}\n\n\t/**\n\t * Ensure we're working on a copy of a move (and make a copy if we aren't)\n\t *\n\t * Remember: \"ensure\" - by default, it won't make a copy of a copy:\n\t * moveCopy === Dex.getActiveMove(moveCopy)\n\t *\n\t * If you really want to, use:\n\t * moveCopyCopy = Dex.getActiveMove(moveCopy.id)\n\t */\n\tgetActiveMove(move: Move | string): ActiveMove {\n\t\tif (move && typeof (move as ActiveMove).hit === 'number') return move as ActiveMove;\n\t\tmove = this.moves.get(move);\n\t\tconst moveCopy: ActiveMove = this.deepClone(move);\n\t\tmoveCopy.hit = 0;\n\t\treturn moveCopy;\n\t}\n\n\tgetHiddenPower(ivs: StatsTable) {\n\t\tconst hpTypes = [\n\t\t\t'Fighting', 'Flying', 'Poison', 'Ground', 'Rock', 'Bug', 'Ghost', 'Steel',\n\t\t\t'Fire', 'Water', 'Grass', 'Electric', 'Psychic', 'Ice', 'Dragon', 'Dark',\n\t\t];\n\t\tconst tr = this.trunc;\n\t\tconst stats = { hp: 31, atk: 31, def: 31, spe: 31, spa: 31, spd: 31 };\n\t\tif (this.gen <= 2) {\n\t\t\t// Gen 2 specific Hidden Power check. IVs are still treated 0-31 so we get them 0-15\n\t\t\tconst atkDV = tr(ivs.atk / 2);\n\t\t\tconst defDV = tr(ivs.def / 2);\n\t\t\tconst speDV = tr(ivs.spe / 2);\n\t\t\tconst spcDV = tr(ivs.spa / 2);\n\t\t\treturn {\n\t\t\t\ttype: hpTypes[4 * (atkDV % 4) + (defDV % 4)],\n\t\t\t\tpower: tr(\n\t\t\t\t\t(5 * ((spcDV >> 3) + (2 * (speDV >> 3)) + (4 * (defDV >> 3)) + (8 * (atkDV >> 3))) + (spcDV % 4)) / 2 + 31\n\t\t\t\t),\n\t\t\t};\n\t\t} else {\n\t\t\t// Hidden Power check for Gen 3 onwards\n\t\t\tlet hpTypeX = 0;\n\t\t\tlet hpPowerX = 0;\n\t\t\tlet i = 1;\n\t\t\tfor (const s in stats) {\n\t\t\t\thpTypeX += i * (ivs[s as StatID] % 2);\n\t\t\t\thpPowerX += i * (tr(ivs[s as StatID] / 2) % 2);\n\t\t\t\ti *= 2;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\ttype: hpTypes[tr(hpTypeX * 15 / 63)],\n\t\t\t\t// After Gen 6, Hidden Power is always 60 base power\n\t\t\t\tpower: (this.gen && this.gen < 6) ? tr(hpPowerX * 40 / 63) + 30 : 60,\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Truncate a number into an unsigned 32-bit integer, for\n\t * compatibility with the cartridge games' math systems.\n\t */\n\ttrunc(this: void, num: number, bits = 0) {\n\t\tif (bits) return (num >>> 0) % (2 ** bits);\n\t\treturn num >>> 0;\n\t}\n\n\tdataSearch(\n\t\ttarget: string,\n\t\tsearchIn?: ('Pokedex' | 'Moves' | 'Abilities' | 'Items' | 'Natures' | 'TypeChart')[] | null,\n\t\tisInexact?: boolean\n\t): AnyObject[] | null {\n\t\tif (!target) return null;\n\n\t\tsearchIn = searchIn || ['Pokedex', 'Moves', 'Abilities', 'Items', 'Natures'];\n\n\t\tconst searchObjects = {\n\t\t\tPokedex: 'species', Moves: 'moves', Abilities: 'abilities', Items: 'items', Natures: 'natures', TypeChart: 'types',\n\t\t} as const;\n\t\tconst searchTypes = {\n\t\t\tPokedex: 'pokemon', Moves: 'move', Abilities: 'ability', Items: 'item', Natures: 'nature', TypeChart: 'type',\n\t\t} as const;\n\t\tlet searchResults: AnyObject[] | null = [];\n\t\tfor (const table of searchIn) {\n\t\t\tconst res = this[searchObjects[table]].get(target);\n\t\t\tif (res.exists && res.gen <= this.gen) {\n\t\t\t\tsearchResults.push({\n\t\t\t\t\tisInexact,\n\t\t\t\t\tsearchType: searchTypes[table],\n\t\t\t\t\tname: res.name,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tif (searchResults.length) return searchResults;\n\t\tif (isInexact) return null; // prevent infinite loop\n\n\t\tconst cmpTarget = toID(target);\n\t\tlet maxLd = 3;\n\t\tif (cmpTarget.length <= 1) {\n\t\t\treturn null;\n\t\t} else if (cmpTarget.length <= 4) {\n\t\t\tmaxLd = 1;\n\t\t} else if (cmpTarget.length <= 6) {\n\t\t\tmaxLd = 2;\n\t\t}\n\t\tsearchResults = null;\n\t\tfor (const table of [...searchIn, 'Aliases'] as const) {\n\t\t\tconst searchObj = this.data[table] as DexTable<any>;\n\t\t\tif (!searchObj) continue;\n\n\t\t\tfor (const j in searchObj) {\n\t\t\t\tconst ld = Utils.levenshtein(cmpTarget, j, maxLd);\n\t\t\t\tif (ld <= maxLd) {\n\t\t\t\t\tconst word = searchObj[j].name || j;\n\t\t\t\t\tconst results = this.dataSearch(word, searchIn, word);\n\t\t\t\t\tif (results) {\n\t\t\t\t\t\tsearchResults = results;\n\t\t\t\t\t\tmaxLd = ld;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn searchResults;\n\t}\n\n\tloadDataFile(basePath: string, dataType: DataType | 'Aliases'): AnyObject | void {\n\t\ttry {\n\t\t\tconst filePath = basePath + DATA_FILES[dataType];\n\t\t\tconst dataObject = require(filePath);\n\t\t\tif (!dataObject || typeof dataObject !== 'object') {\n\t\t\t\tthrow new TypeError(`${filePath}, if it exists, must export a non-null object`);\n\t\t\t}\n\t\t\tif (dataObject[dataType]?.constructor?.name !== 'Object') {\n\t\t\t\tthrow new TypeError(`${filePath}, if it exists, must export an object whose '${dataType}' property is an Object`);\n\t\t\t}\n\t\t\treturn dataObject[dataType];\n\t\t} catch (e: any) {\n\t\t\tif (e.code !== 'MODULE_NOT_FOUND' && e.code !== 'ENOENT') {\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t}\n\t}\n\n\tloadTextFile(\n\t\tname: string, exportName: string\n\t): DexTable<MoveText | ItemText | AbilityText | PokedexText | DefaultText> {\n\t\treturn require(`${DATA_DIR}/text/${name}`)[exportName];\n\t}\n\n\tincludeMods(): this {\n\t\tif (!this.isBase) throw new Error(`This must be called on the base Dex`);\n\t\tif (this.modsLoaded) return this;\n\n\t\tfor (const mod of fs.readdirSync(MODS_DIR)) {\n\t\t\tdexes[mod] = new ModdedDex(mod);\n\t\t}\n\t\tthis.modsLoaded = true;\n\n\t\treturn this;\n\t}\n\n\tincludeModData(): this {\n\t\tfor (const mod in this.dexes) {\n\t\t\tdexes[mod].includeData();\n\t\t}\n\t\treturn this;\n\t}\n\n\tincludeData(): this {\n\t\tthis.loadData();\n\t\treturn this;\n\t}\n\n\tloadTextData() {\n\t\tif (dexes['base'].textCache) return dexes['base'].textCache;\n\t\tdexes['base'].textCache = {\n\t\t\tPokedex: this.loadTextFile('pokedex', 'PokedexText') as DexTable<PokedexText>,\n\t\t\tMoves: this.loadTextFile('moves', 'MovesText') as DexTable<MoveText>,\n\t\t\tAbilities: this.loadTextFile('abilities', 'AbilitiesText') as DexTable<AbilityText>,\n\t\t\tItems: this.loadTextFile('items', 'ItemsText') as DexTable<ItemText>,\n\t\t\tDefault: this.loadTextFile('default', 'DefaultText') as DexTable<DefaultText>,\n\t\t};\n\t\treturn dexes['base'].textCache;\n\t}\n\n\tloadData(): DexTableData {\n\t\tif (this.dataCache) return this.dataCache;\n\t\tdexes['base'].includeMods();\n\t\tconst dataCache: { [k in keyof DexTableData]?: any } = {};\n\n\t\tconst basePath = this.dataDir + '/';\n\n\t\tconst Scripts = this.loadDataFile(basePath, 'Scripts') || {};\n\t\t// We want to inherit most of Scripts but not this.\n\t\tconst init = Scripts.init;\n\t\tthis.parentMod = this.isBase ? '' : (Scripts.inherit || 'base');\n\n\t\tlet parentDex;\n\t\tif (this.parentMod) {\n\t\t\tparentDex = dexes[this.parentMod];\n\t\t\tif (!parentDex || parentDex === this) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Unable to load ${this.currentMod}. 'inherit' in scripts.ts should specify a parent mod from which to inherit data, or must be not specified.`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (!parentDex) {\n\t\t\t// Formats are inherited by mods and used by Rulesets\n\t\t\tthis.includeFormats();\n\t\t}\n\t\tfor (const dataType of DATA_TYPES.concat('Aliases')) {\n\t\t\tdataCache[dataType] = this.loadDataFile(basePath, dataType);\n\t\t\tif (dataType === 'Rulesets' && !parentDex) {\n\t\t\t\tfor (const format of this.formats.all()) {\n\t\t\t\t\tdataCache.Rulesets[format.id] = { ...format, ruleTable: null };\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (parentDex) {\n\t\t\tfor (const dataType of DATA_TYPES) {\n\t\t\t\tconst parentTypedData: DexTable<any> = parentDex.data[dataType];\n\t\t\t\tif (!dataCache[dataType] && !init) {\n\t\t\t\t\tdataCache[dataType] = parentTypedData;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst childTypedData: DexTable<any> = dataCache[dataType] || (dataCache[dataType] = {});\n\t\t\t\tfor (const entryId in parentTypedData) {\n\t\t\t\t\tif (childTypedData[entryId] === null) {\n\t\t\t\t\t\t// null means don't inherit\n\t\t\t\t\t\tdelete childTypedData[entryId];\n\t\t\t\t\t} else if (!(entryId in childTypedData)) {\n\t\t\t\t\t\t// If it doesn't exist it's inherited from the parent data\n\t\t\t\t\t\tchildTypedData[entryId] = parentTypedData[entryId];\n\t\t\t\t\t} else if (childTypedData[entryId]?.inherit) {\n\t\t\t\t\t\t// {inherit: true} can be used to modify only parts of the parent data,\n\t\t\t\t\t\t// instead of overwriting entirely\n\t\t\t\t\t\tdelete childTypedData[entryId].inherit;\n\n\t\t\t\t\t\t// Merge parent and child's entry, with child overwriting parent.\n\t\t\t\t\t\tchildTypedData[entryId] = { ...parentTypedData[entryId], ...childTypedData[entryId] };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tdataCache['Aliases'] = parentDex.data['Aliases'];\n\t\t}\n\n\t\t// Flag the generation. Required for team validator.\n\t\tthis.gen = dataCache.Scripts.gen;\n\t\tif (!this.gen) throw new Error(`Mod ${this.currentMod} needs a generation number in scripts.js`);\n\t\tthis.dataCache = dataCache as DexTableData;\n\n\t\t// Execute initialization script.\n\t\tif (init) init.call(this);\n\n\t\treturn this.dataCache;\n\t}\n\n\tincludeFormats(): this {\n\t\tthis.formats.load();\n\t\treturn this;\n\t}\n}\n\ndexes['base'] = new ModdedDex();\n\n// \"gen9\" is an alias for the current base data\ndexes[BASE_MOD] = dexes['base'];\n\nexport const Dex = dexes['base'];\nexport declare namespace Dex {\n\texport type Species = import('./dex-species').Species;\n\texport type Item = import('./dex-items').Item;\n\texport type Move = import('./dex-moves').Move;\n\texport type Ability = import('./dex-abilities').Ability;\n\n\texport type HitEffect = import('./dex-moves').HitEffect;\n\texport type SecondaryEffect = import('./dex-moves').SecondaryEffect;\n\texport type RuleTable = import('./dex-formats').RuleTable;\n}\n\nexport default Dex;\n"], | |
"mappings": "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", | |
"names": [] | |
} | |