{ "version": 3, "sources": ["../../../../../data/mods/gen8/random-teams.ts"], "sourcesContent": ["import {Dex, toID} from '../../../sim/dex';\nimport {Utils} from '../../../lib';\nimport {PRNG, PRNGSeed} from '../../../sim/prng';\nimport {RuleTable} from '../../../sim/dex-formats';\nimport {Tags} from './../../tags';\n\nexport interface TeamData {\n\ttypeCount: {[k: string]: number};\n\ttypeComboCount: {[k: string]: number};\n\tbaseFormes: {[k: string]: number};\n\tmegaCount?: number;\n\tzCount?: number;\n\thas: {[k: string]: number};\n\tforceResult: boolean;\n\tweaknesses: {[k: string]: number};\n\tresistances: {[k: string]: number};\n\tweather?: string;\n\teeveeLimCount?: number;\n\tgigantamax?: boolean;\n}\nexport interface BattleFactorySpecies {\n\tflags: {limEevee?: 1};\n\tsets: BattleFactorySet[];\n}\nexport interface OldRandomBattleSpecies {\n\tlevel?: number;\n\tmoves?: ID[];\n\tdoublesLevel?: number;\n\tdoublesMoves?: ID[];\n\tnoDynamaxMoves?: ID[];\n}\ninterface BattleFactorySet {\n\tspecies: string;\n\titem: string;\n\tability: string;\n\tnature: string;\n\tmoves: string[];\n\tevs?: Partial;\n\tivs?: Partial;\n}\nexport class MoveCounter extends Utils.Multiset {\n\tdamagingMoves: Set;\n\tsetupType: string;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.damagingMoves = new Set();\n\t\tthis.setupType = '';\n\t}\n\n\tget(key: string): number {\n\t\treturn super.get(key) || 0;\n\t}\n}\n\ntype MoveEnforcementChecker = (\n\tmovePool: string[], moves: Set, abilities: Set, types: Set,\n\tcounter: MoveCounter, species: Species, teamDetails: RandomTeamsTypes.TeamDetails\n) => boolean;\n\n// Moves that restore HP:\nconst RECOVERY_MOVES = [\n\t'healorder', 'milkdrink', 'moonlight', 'morningsun', 'recover', 'roost', 'shoreup', 'slackoff', 'softboiled', 'strengthsap', 'synthesis',\n];\n// Moves that drop stats:\nconst CONTRARY_MOVES = [\n\t'closecombat', 'leafstorm', 'overheat', 'superpower', 'vcreate',\n];\n// Moves that boost Attack:\nconst PHYSICAL_SETUP = [\n\t'bellydrum', 'bulkup', 'coil', 'curse', 'dragondance', 'honeclaws', 'howl', 'meditate', 'poweruppunch', 'screech', 'swordsdance',\n];\n// Moves which boost Special Attack:\nconst SPECIAL_SETUP = [\n\t'calmmind', 'chargebeam', 'geomancy', 'nastyplot', 'quiverdance', 'tailglow',\n];\n// Moves that boost Attack AND Special Attack:\nconst MIXED_SETUP = [\n\t'clangoroussoul', 'growth', 'happyhour', 'holdhands', 'noretreat', 'shellsmash', 'workup',\n];\n// Some moves that only boost Speed:\nconst SPEED_SETUP = [\n\t'agility', 'autotomize', 'flamecharge', 'rockpolish',\n];\n// Moves that shouldn't be the only STAB moves:\nconst NO_STAB = [\n\t'accelerock', 'aquajet', 'beakblast', 'bounce', 'breakingswipe', 'chatter', 'clearsmog', 'dragontail', 'eruption', 'explosion',\n\t'fakeout', 'firstimpression', 'flamecharge', 'flipturn', 'iceshard', 'icywind', 'incinerate', 'machpunch',\n\t'meteorbeam', 'pluck', 'pursuit', 'quickattack', 'reversal', 'selfdestruct', 'skydrop', 'snarl', 'suckerpunch', 'uturn', 'watershuriken',\n\t'vacuumwave', 'voltswitch', 'waterspout',\n];\n// Hazard-setting moves\nconst HAZARDS = [\n\t'spikes', 'stealthrock', 'stickyweb', 'toxicspikes',\n];\n\nfunction sereneGraceBenefits(move: Move) {\n\treturn move.secondary?.chance && move.secondary.chance >= 20 && move.secondary.chance < 100;\n}\n\nexport class RandomGen8Teams {\n\tdex: ModdedDex;\n\tgen: number;\n\tfactoryTier: string;\n\tformat: Format;\n\tprng: PRNG;\n\tnoStab: string[];\n\tpriorityPokemon: string[];\n\treadonly maxTeamSize: number;\n\treadonly adjustLevel: number | null;\n\treadonly maxMoveCount: number;\n\treadonly forceMonotype: string | undefined;\n\n\trandomData: {[species: string]: OldRandomBattleSpecies} = require('./random-data.json');\n\n\t/**\n\t * Checkers for move enforcement based on a Pok\u00E9mon's types or other factors\n\t *\n\t * returns true to reject one of its other moves to try to roll the forced move, false otherwise.\n\t */\n\tmoveEnforcementCheckers: {[k: string]: MoveEnforcementChecker};\n\n\tconstructor(format: Format | string, prng: PRNG | PRNGSeed | null) {\n\t\tformat = Dex.formats.get(format);\n\t\tthis.dex = Dex.forFormat(format);\n\t\tthis.gen = this.dex.gen;\n\t\tthis.noStab = NO_STAB;\n\t\tthis.priorityPokemon = [];\n\n\t\tconst ruleTable = Dex.formats.getRuleTable(format);\n\t\tthis.maxTeamSize = ruleTable.maxTeamSize;\n\t\tthis.adjustLevel = ruleTable.adjustLevel;\n\t\tthis.maxMoveCount = ruleTable.maxMoveCount;\n\t\tconst forceMonotype = ruleTable.valueRules.get('forcemonotype');\n\t\tthis.forceMonotype = forceMonotype && this.dex.types.get(forceMonotype).exists ?\n\t\t\tthis.dex.types.get(forceMonotype).name : undefined;\n\n\t\tthis.factoryTier = '';\n\t\tthis.format = format;\n\t\tthis.prng = prng && !Array.isArray(prng) ? prng : new PRNG(prng);\n\n\t\tthis.moveEnforcementCheckers = {\n\t\t\tscreens: (movePool, moves, abilities, types, counter, species, teamDetails) => {\n\t\t\t\tif (teamDetails.screens) return false;\n\t\t\t\treturn (\n\t\t\t\t\t(moves.has('lightscreen') && movePool.includes('reflect')) ||\n\t\t\t\t\t(moves.has('reflect') && movePool.includes('lightscreen'))\n\t\t\t\t);\n\t\t\t},\n\t\t\trecovery: (movePool, moves, abilities, types, counter, species, teamDetails) => (\n\t\t\t\t!!counter.get('Status') &&\n\t\t\t\t!counter.setupType &&\n\t\t\t\t['morningsun', 'recover', 'roost', 'slackoff', 'softboiled'].some(moveid => movePool.includes(moveid)) &&\n\t\t\t\t['healingwish', 'switcheroo', 'trick', 'trickroom'].every(moveid => !moves.has(moveid))\n\t\t\t),\n\t\t\tmisc: (movePool, moves, abilities, types, counter, species, teamDetails) => {\n\t\t\t\tif (movePool.includes('milkdrink') || movePool.includes('quiverdance')) return true;\n\t\t\t\treturn movePool.includes('stickyweb') && !counter.setupType && !teamDetails.stickyWeb;\n\t\t\t},\n\t\t\tlead: (movePool, moves, abilities, types, counter) => (\n\t\t\t\tmovePool.includes('stealthrock') &&\n\t\t\t\t!!counter.get('Status') &&\n\t\t\t\t!counter.setupType &&\n\t\t\t\t!counter.get('speedsetup') &&\n\t\t\t\t!moves.has('substitute')\n\t\t\t),\n\t\t\tleechseed: (movePool, moves) => (\n\t\t\t\t!moves.has('calmmind') &&\n\t\t\t\t['protect', 'substitute', 'spikyshield'].some(m => movePool.includes(m))\n\t\t\t),\n\t\t\tBug: (movePool) => movePool.includes('megahorn'),\n\t\t\tDark: (movePool, moves, abilities, types, counter) => {\n\t\t\t\tif (!counter.get('Dark')) return true;\n\t\t\t\treturn moves.has('suckerpunch') && (movePool.includes('knockoff') || movePool.includes('wickedblow'));\n\t\t\t},\n\t\t\tDragon: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!counter.get('Dragon') &&\n\t\t\t\t!moves.has('dragonascent') &&\n\t\t\t\t!moves.has('substitute') &&\n\t\t\t\t!(moves.has('rest') && moves.has('sleeptalk'))\n\t\t\t),\n\t\t\tElectric: (movePool, moves, abilities, types, counter) => !counter.get('Electric') || movePool.includes('thunder'),\n\t\t\tFairy: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!counter.get('Fairy') &&\n\t\t\t\t['dazzlinggleam', 'moonblast', 'fleurcannon', 'playrough', 'strangesteam'].some(moveid => movePool.includes(moveid))\n\t\t\t),\n\t\t\tFighting: (movePool, moves, abilities, types, counter) => !counter.get('Fighting') || !counter.get('stab'),\n\t\t\tFire: (movePool, moves, abilities, types, counter, species) => {\n\t\t\t\t// Entei should never reject Extreme Speed even if Flare Blitz could be rolled instead\n\t\t\t\tconst enteiException = moves.has('extremespeed') && species.id === 'entei';\n\t\t\t\treturn !moves.has('bellydrum') && (!counter.get('Fire') || (!enteiException && movePool.includes('flareblitz')));\n\t\t\t},\n\t\t\tFlying: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!counter.get('Flying') && !types.has('Dragon') && [\n\t\t\t\t\t'airslash', 'bravebird', 'dualwingbeat', 'oblivionwing',\n\t\t\t\t].some(moveid => movePool.includes(moveid))\n\t\t\t),\n\t\t\tGhost: (movePool, moves, abilities, types, counter) => {\n\t\t\t\tif (moves.has('nightshade')) return false;\n\t\t\t\tif (!counter.get('Ghost') && !types.has('Dark')) return true;\n\t\t\t\tif (movePool.includes('poltergeist')) return true;\n\t\t\t\treturn movePool.includes('spectralthief') && !counter.get('Dark');\n\t\t\t},\n\t\t\tGrass: (movePool, moves, abilities, types, counter, species) => {\n\t\t\t\tif (movePool.includes('leafstorm') || movePool.includes('grassyglide')) return true;\n\t\t\t\treturn !counter.get('Grass') && species.baseStats.atk >= 100;\n\t\t\t},\n\t\t\tGround: (movePool, moves, abilities, types, counter) => !counter.get('Ground'),\n\t\t\tIce: (movePool, moves, abilities, types, counter) => {\n\t\t\t\tif (!counter.get('Ice')) return true;\n\t\t\t\tif (movePool.includes('iciclecrash')) return true;\n\t\t\t\treturn abilities.has('Snow Warning') && movePool.includes('blizzard');\n\t\t\t},\n\t\t\tNormal: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t(abilities.has('Guts') && movePool.includes('facade')) || (abilities.has('Pixilate') && !counter.get('Normal'))\n\t\t\t),\n\t\t\tPoison: (movePool, moves, abilities, types, counter) => {\n\t\t\t\tif (counter.get('Poison')) return false;\n\t\t\t\treturn types.has('Ground') || types.has('Psychic') || types.has('Grass') || !!counter.setupType || movePool.includes('gunkshot');\n\t\t\t},\n\t\t\tPsychic: (movePool, moves, abilities, types, counter) => {\n\t\t\t\tif (counter.get('Psychic')) return false;\n\t\t\t\tif (types.has('Ghost') || types.has('Steel')) return false;\n\t\t\t\treturn abilities.has('Psychic Surge') || !!counter.setupType || movePool.includes('psychicfangs');\n\t\t\t},\n\t\t\tRock: (movePool, moves, abilities, types, counter, species) => !counter.get('Rock') && species.baseStats.atk >= 80,\n\t\t\tSteel: (movePool, moves, abilities, types, counter, species) => {\n\t\t\t\tif (species.baseStats.atk < 95) return false;\n\t\t\t\tif (movePool.includes('meteormash')) return true;\n\t\t\t\treturn !counter.get('Steel');\n\t\t\t},\n\t\t\tWater: (movePool, moves, abilities, types, counter, species) => {\n\t\t\t\tif (!counter.get('Water') && !moves.has('hypervoice')) return true;\n\t\t\t\tif (['hypervoice', 'liquidation', 'surgingstrikes'].some(m => movePool.includes(m))) return true;\n\t\t\t\treturn abilities.has('Huge Power') && movePool.includes('aquajet');\n\t\t\t},\n\t\t};\n\t}\n\n\tsetSeed(prng?: PRNG | PRNGSeed) {\n\t\tthis.prng = prng && !Array.isArray(prng) ? prng : new PRNG(prng);\n\t}\n\n\tgetTeam(options?: PlayerOptions | null): PokemonSet[] {\n\t\tconst generatorName = (\n\t\t\ttypeof this.format.team === 'string' && this.format.team.startsWith('random')\n\t\t ) ? this.format.team + 'Team' : '';\n\t\t// @ts-ignore\n\t\treturn this[generatorName || 'randomTeam'](options);\n\t}\n\n\trandomChance(numerator: number, denominator: number) {\n\t\treturn this.prng.randomChance(numerator, denominator);\n\t}\n\n\tsample(items: readonly T[]): T {\n\t\treturn this.prng.sample(items);\n\t}\n\n\tsampleIfArray(item: T | T[]): T {\n\t\tif (Array.isArray(item)) {\n\t\t\treturn this.sample(item);\n\t\t}\n\t\treturn item;\n\t}\n\n\trandom(m?: number, n?: number) {\n\t\treturn this.prng.next(m, n);\n\t}\n\n\t/**\n\t * Remove an element from an unsorted array significantly faster\n\t * than .splice\n\t */\n\tfastPop(list: any[], index: number) {\n\t\t// If an array doesn't need to be in order, replacing the\n\t\t// element at the given index with the removed element\n\t\t// is much, much faster than using list.splice(index, 1).\n\t\tconst length = list.length;\n\t\tif (index < 0 || index >= list.length) {\n\t\t\t// sanity check\n\t\t\tthrow new Error(`Index ${index} out of bounds for given array`);\n\t\t}\n\n\t\tconst element = list[index];\n\t\tlist[index] = list[length - 1];\n\t\tlist.pop();\n\t\treturn element;\n\t}\n\n\t/**\n\t * Remove a random element from an unsorted array and return it.\n\t * Uses the battle's RNG if in a battle.\n\t */\n\tsampleNoReplace(list: any[]) {\n\t\tconst length = list.length;\n\t\tif (length === 0) return null;\n\t\tconst index = this.random(length);\n\t\treturn this.fastPop(list, index);\n\t}\n\n\t/**\n\t * Removes n random elements from an unsorted array and returns them.\n\t * If n is less than the array's length, randomly removes and returns all the elements\n\t * in the array (so the returned array could have length < n).\n\t */\n\tmultipleSamplesNoReplace(list: T[], n: number): T[] {\n\t\tconst samples = [];\n\t\twhile (samples.length < n && list.length) {\n\t\t\tsamples.push(this.sampleNoReplace(list));\n\t\t}\n\n\t\treturn samples;\n\t}\n\n\t/**\n\t * Check if user has directly tried to ban/unban/restrict things in a custom battle.\n\t * Doesn't count bans nested inside other formats/rules.\n\t */\n\tprivate hasDirectCustomBanlistChanges() {\n\t\tif (!this.format.customRules) return false;\n\t\tfor (const rule of this.format.customRules) {\n\t\t\tfor (const banlistOperator of ['-', '+', '*']) {\n\t\t\t\tif (rule.startsWith(banlistOperator)) return true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Inform user when custom bans are unsupported in a team generator.\n\t */\n\tprotected enforceNoDirectCustomBanlistChanges() {\n\t\tif (this.hasDirectCustomBanlistChanges()) {\n\t\t\tthrow new Error(`Custom bans are not currently supported in ${this.format.name}.`);\n\t\t}\n\t}\n\n\t/**\n\t * Inform user when complex bans are unsupported in a team generator.\n\t */\n\tprotected enforceNoDirectComplexBans() {\n\t\tif (!this.format.customRules) return false;\n\t\tfor (const rule of this.format.customRules) {\n\t\t\tif (rule.includes('+') && !rule.startsWith('+')) {\n\t\t\t\tthrow new Error(`Complex bans are not currently supported in ${this.format.name}.`);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Validate set element pool size is sufficient to support size requirements after simple bans.\n\t */\n\tprivate enforceCustomPoolSizeNoComplexBans(\n\t\teffectTypeName: string,\n\t\tbasicEffectPool: BasicEffect[],\n\t\trequiredCount: number,\n\t\trequiredCountExplanation: string\n\t) {\n\t\tif (basicEffectPool.length >= requiredCount) return;\n\t\tthrow new Error(`Legal ${effectTypeName} count is insufficient to support ${requiredCountExplanation} (${basicEffectPool.length} / ${requiredCount}).`);\n\t}\n\n\tunrejectableMovesInSingles(move: Move) {\n\t\t// These moves cannot be rejected in favor of a forced move in singles\n\t\treturn (move.category !== 'Status' || !move.flags.heal) && ![\n\t\t\t'facade', 'leechseed', 'lightscreen', 'reflect', 'sleeptalk', 'spore', 'substitute', 'switcheroo',\n\t\t\t'teleport', 'toxic', 'trick',\n\t\t].includes(move.id);\n\t}\n\n\tunrejectableMovesInDoubles(move: Move) {\n\t\t// These moves cannot be rejected in favor of a forced move in doubles\n\t\treturn move.id !== 'bodypress';\n\t}\n\n\trandomCCTeam(): RandomTeamsTypes.RandomSet[] {\n\t\tthis.enforceNoDirectCustomBanlistChanges();\n\n\t\tconst dex = this.dex;\n\t\tconst team = [];\n\n\t\tconst natures = this.dex.natures.all();\n\t\tconst items = this.dex.items.all();\n\n\t\tconst randomN = this.randomNPokemon(this.maxTeamSize, this.forceMonotype, undefined, undefined, true);\n\n\t\tfor (let forme of randomN) {\n\t\t\tlet species = dex.species.get(forme);\n\t\t\tif (species.isNonstandard) species = dex.species.get(species.baseSpecies);\n\n\t\t\t// Random legal item\n\t\t\tlet item = '';\n\t\t\tif (this.gen >= 2) {\n\t\t\t\tdo {\n\t\t\t\t\titem = this.sample(items).name;\n\t\t\t\t} while (this.dex.items.get(item).gen > this.gen || this.dex.items.get(item).isNonstandard);\n\t\t\t}\n\n\t\t\t// Make sure forme is legal\n\t\t\tif (species.battleOnly) {\n\t\t\t\tif (typeof species.battleOnly === 'string') {\n\t\t\t\t\tspecies = dex.species.get(species.battleOnly);\n\t\t\t\t} else {\n\t\t\t\t\tspecies = dex.species.get(this.sample(species.battleOnly));\n\t\t\t\t}\n\t\t\t\tforme = species.name;\n\t\t\t} else if (species.requiredItems && !species.requiredItems.some(req => toID(req) === item)) {\n\t\t\t\tif (!species.changesFrom) throw new Error(`${species.name} needs a changesFrom value`);\n\t\t\t\tspecies = dex.species.get(species.changesFrom);\n\t\t\t\tforme = species.name;\n\t\t\t}\n\n\t\t\t// Make sure that a base forme does not hold any forme-modifier items.\n\t\t\tlet itemData = this.dex.items.get(item);\n\t\t\tif (itemData.forcedForme && forme === this.dex.species.get(itemData.forcedForme).baseSpecies) {\n\t\t\t\tdo {\n\t\t\t\t\titemData = this.sample(items);\n\t\t\t\t\titem = itemData.name;\n\t\t\t\t} while (\n\t\t\t\t\titemData.gen > this.gen ||\n\t\t\t\t\titemData.isNonstandard ||\n\t\t\t\t\t(itemData.forcedForme && forme === this.dex.species.get(itemData.forcedForme).baseSpecies)\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Random legal ability\n\t\t\tconst abilities = Object.values(species.abilities).filter(a => this.dex.abilities.get(a).gen <= this.gen);\n\t\t\tconst ability: string = this.gen <= 2 ? 'No Ability' : this.sample(abilities);\n\n\t\t\t// Four random unique moves from the movepool\n\t\t\tlet pool = ['struggle'];\n\t\t\tif (forme === 'Smeargle') {\n\t\t\t\tpool = this.dex.moves.all()\n\t\t\t\t\t.filter(move => !(move.isNonstandard || move.isZ || move.isMax || move.realMove))\n\t\t\t\t\t.map(m => m.id);\n\t\t\t} else {\n\t\t\t\tpool = [...this.dex.species.getMovePool(species.id)];\n\t\t\t}\n\n\t\t\tconst moves = this.multipleSamplesNoReplace(pool, this.maxMoveCount);\n\n\t\t\t// Random EVs\n\t\t\tconst evs: StatsTable = {hp: 0, atk: 0, def: 0, spa: 0, spd: 0, spe: 0};\n\t\t\tconst s: StatID[] = [\"hp\", \"atk\", \"def\", \"spa\", \"spd\", \"spe\"];\n\t\t\tlet evpool = 510;\n\t\t\tdo {\n\t\t\t\tconst x = this.sample(s);\n\t\t\t\tconst y = this.random(Math.min(256 - evs[x], evpool + 1));\n\t\t\t\tevs[x] += y;\n\t\t\t\tevpool -= y;\n\t\t\t} while (evpool > 0);\n\n\t\t\t// Random IVs\n\t\t\tconst ivs = {\n\t\t\t\thp: this.random(32),\n\t\t\t\tatk: this.random(32),\n\t\t\t\tdef: this.random(32),\n\t\t\t\tspa: this.random(32),\n\t\t\t\tspd: this.random(32),\n\t\t\t\tspe: this.random(32),\n\t\t\t};\n\n\t\t\t// Random nature\n\t\t\tconst nature = this.sample(natures).name;\n\n\t\t\t// Level balance--calculate directly from stats rather than using some silly lookup table\n\t\t\tconst mbstmin = 1307; // Sunkern has the lowest modified base stat total, and that total is 807\n\n\t\t\tlet stats = species.baseStats;\n\t\t\t// If Wishiwashi, use the school-forme's much higher stats\n\t\t\tif (species.baseSpecies === 'Wishiwashi') stats = Dex.species.get('wishiwashischool').baseStats;\n\n\t\t\t// Modified base stat total assumes 31 IVs, 85 EVs in every stat\n\t\t\tlet mbst = (stats[\"hp\"] * 2 + 31 + 21 + 100) + 10;\n\t\t\tmbst += (stats[\"atk\"] * 2 + 31 + 21 + 100) + 5;\n\t\t\tmbst += (stats[\"def\"] * 2 + 31 + 21 + 100) + 5;\n\t\t\tmbst += (stats[\"spa\"] * 2 + 31 + 21 + 100) + 5;\n\t\t\tmbst += (stats[\"spd\"] * 2 + 31 + 21 + 100) + 5;\n\t\t\tmbst += (stats[\"spe\"] * 2 + 31 + 21 + 100) + 5;\n\n\t\t\tlet level;\n\t\t\tif (this.adjustLevel) {\n\t\t\t\tlevel = this.adjustLevel;\n\t\t\t} else {\n\t\t\t\tlevel = Math.floor(100 * mbstmin / mbst); // Initial level guess will underestimate\n\n\t\t\t\twhile (level < 100) {\n\t\t\t\t\tmbst = Math.floor((stats[\"hp\"] * 2 + 31 + 21 + 100) * level / 100 + 10);\n\t\t\t\t\t// Since damage is roughly proportional to level\n\t\t\t\t\tmbst += Math.floor(((stats[\"atk\"] * 2 + 31 + 21 + 100) * level / 100 + 5) * level / 100);\n\t\t\t\t\tmbst += Math.floor((stats[\"def\"] * 2 + 31 + 21 + 100) * level / 100 + 5);\n\t\t\t\t\tmbst += Math.floor(((stats[\"spa\"] * 2 + 31 + 21 + 100) * level / 100 + 5) * level / 100);\n\t\t\t\t\tmbst += Math.floor((stats[\"spd\"] * 2 + 31 + 21 + 100) * level / 100 + 5);\n\t\t\t\t\tmbst += Math.floor((stats[\"spe\"] * 2 + 31 + 21 + 100) * level / 100 + 5);\n\n\t\t\t\t\tif (mbst >= mbstmin) break;\n\t\t\t\t\tlevel++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Random happiness\n\t\t\tconst happiness = this.random(256);\n\n\t\t\t// Random shininess\n\t\t\tconst shiny = this.randomChance(1, 1024);\n\n\t\t\tconst set: RandomTeamsTypes.RandomSet = {\n\t\t\t\tname: species.baseSpecies,\n\t\t\t\tspecies: species.name,\n\t\t\t\tgender: species.gender,\n\t\t\t\titem,\n\t\t\t\tability,\n\t\t\t\tmoves,\n\t\t\t\tevs,\n\t\t\t\tivs,\n\t\t\t\tnature,\n\t\t\t\tlevel,\n\t\t\t\thappiness,\n\t\t\t\tshiny,\n\t\t\t};\n\t\t\tif (this.gen === 9) {\n\t\t\t\t// Tera type\n\t\t\t\tset.teraType = this.sample(this.dex.types.all()).name;\n\t\t\t}\n\t\t\tteam.push(set);\n\t\t}\n\n\t\treturn team;\n\t}\n\n\trandomNPokemon(n: number, requiredType?: string, minSourceGen?: number, ruleTable?: RuleTable, requireMoves = false) {\n\t\t// Picks `n` random pokemon--no repeats, even among formes\n\t\t// Also need to either normalize for formes or select formes at random\n\t\t// Unreleased are okay but no CAP\n\t\tif (requiredType && !this.dex.types.get(requiredType).exists) {\n\t\t\tthrow new Error(`\"${requiredType}\" is not a valid type.`);\n\t\t}\n\n\t\tconst isNotCustom = !ruleTable;\n\n\t\tconst pool: number[] = [];\n\t\tlet speciesPool: Species[] = [];\n\t\tif (isNotCustom) {\n\t\t\tspeciesPool = [...this.dex.species.all()];\n\t\t\tfor (const species of speciesPool) {\n\t\t\t\tif (species.isNonstandard && species.isNonstandard !== 'Unobtainable') continue;\n\t\t\t\tif (requireMoves) {\n\t\t\t\t\tconst hasMovesInCurrentGen = this.dex.species.getMovePool(species.id).size;\n\t\t\t\t\tif (!hasMovesInCurrentGen) continue;\n\t\t\t\t}\n\t\t\t\tif (requiredType && !species.types.includes(requiredType)) continue;\n\t\t\t\tif (minSourceGen && species.gen < minSourceGen) continue;\n\t\t\t\tconst num = species.num;\n\t\t\t\tif (num <= 0 || pool.includes(num)) continue;\n\t\t\t\tpool.push(num);\n\t\t\t}\n\t\t} else {\n\t\t\tconst EXISTENCE_TAG = ['past', 'future', 'lgpe', 'unobtainable', 'cap', 'custom', 'nonexistent'];\n\t\t\tconst nonexistentBanReason = ruleTable.check('nonexistent');\n\t\t\t// Assume tierSpecies does not differ from species here (mega formes can be used without their stone, etc)\n\t\t\tfor (const species of this.dex.species.all()) {\n\t\t\t\tif (requiredType && !species.types.includes(requiredType)) continue;\n\n\t\t\t\tlet banReason = ruleTable.check('pokemon:' + species.id);\n\t\t\t\tif (banReason) continue;\n\t\t\t\tif (banReason !== '') {\n\t\t\t\t\tif (species.isMega && ruleTable.check('pokemontag:mega')) continue;\n\n\t\t\t\t\tbanReason = ruleTable.check('basepokemon:' + toID(species.baseSpecies));\n\t\t\t\t\tif (banReason) continue;\n\t\t\t\t\tif (banReason !== '' || this.dex.species.get(species.baseSpecies).isNonstandard !== species.isNonstandard) {\n\t\t\t\t\t\tconst nonexistentCheck = Tags.nonexistent.genericFilter!(species) && nonexistentBanReason;\n\t\t\t\t\t\tlet tagWhitelisted = false;\n\t\t\t\t\t\tlet tagBlacklisted = false;\n\t\t\t\t\t\tfor (const ruleid of ruleTable.tagRules) {\n\t\t\t\t\t\t\tif (ruleid.startsWith('*')) continue;\n\t\t\t\t\t\t\tconst tagid = ruleid.slice(12);\n\t\t\t\t\t\t\tconst tag = Tags[tagid];\n\t\t\t\t\t\t\tif ((tag.speciesFilter || tag.genericFilter)!(species)) {\n\t\t\t\t\t\t\t\tconst existenceTag = EXISTENCE_TAG.includes(tagid);\n\t\t\t\t\t\t\t\tif (ruleid.startsWith('+')) {\n\t\t\t\t\t\t\t\t\tif (!existenceTag && nonexistentCheck) continue;\n\t\t\t\t\t\t\t\t\ttagWhitelisted = true;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\ttagBlacklisted = true;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (tagBlacklisted) continue;\n\t\t\t\t\t\tif (!tagWhitelisted) {\n\t\t\t\t\t\t\tif (ruleTable.check('pokemontag:allpokemon')) continue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tspeciesPool.push(species);\n\t\t\t\tconst num = species.num;\n\t\t\t\tif (pool.includes(num)) continue;\n\t\t\t\tpool.push(num);\n\t\t\t}\n\t\t}\n\n\t\tconst hasDexNumber: {[k: string]: number} = {};\n\t\tfor (let i = 0; i < n; i++) {\n\t\t\tconst num = this.sampleNoReplace(pool);\n\t\t\thasDexNumber[num] = i;\n\t\t}\n\n\t\tconst formes: string[][] = [];\n\t\tfor (const species of speciesPool) {\n\t\t\tif (!(species.num in hasDexNumber)) continue;\n\t\t\tif (isNotCustom && (species.gen > this.gen ||\n\t\t\t\t(species.isNonstandard && species.isNonstandard !== 'Unobtainable'))) continue;\n\t\t\tif (requiredType && !species.types.includes(requiredType)) continue;\n\t\t\tif (!formes[hasDexNumber[species.num]]) formes[hasDexNumber[species.num]] = [];\n\t\t\tformes[hasDexNumber[species.num]].push(species.name);\n\t\t}\n\n\t\tif (formes.length < n) {\n\t\t\tthrow new Error(`Legal Pokemon forme count insufficient to support Max Team Size: (${formes.length} / ${n}).`);\n\t\t}\n\n\t\tconst nPokemon = [];\n\t\tfor (let i = 0; i < n; i++) {\n\t\t\tif (!formes[i].length) {\n\t\t\t\tthrow new Error(`Invalid pokemon gen ${this.gen}: ${JSON.stringify(formes)} numbers ${JSON.stringify(hasDexNumber)}`);\n\t\t\t}\n\t\t\tnPokemon.push(this.sample(formes[i]));\n\t\t}\n\t\treturn nPokemon;\n\t}\n\n\trandomHCTeam(): PokemonSet[] {\n\t\tconst hasCustomBans = this.hasDirectCustomBanlistChanges();\n\t\tconst ruleTable = this.dex.formats.getRuleTable(this.format);\n\t\tconst hasNonexistentBan = hasCustomBans && ruleTable.check('nonexistent');\n\t\tconst hasNonexistentWhitelist = hasCustomBans && (hasNonexistentBan === '');\n\n\t\tif (hasCustomBans) {\n\t\t\tthis.enforceNoDirectComplexBans();\n\t\t}\n\n\t\t// Item Pool\n\t\tconst doItemsExist = this.gen > 1;\n\t\tlet itemPool: Item[] = [];\n\t\tif (doItemsExist) {\n\t\t\tif (!hasCustomBans) {\n\t\t\t\titemPool = [...this.dex.items.all()].filter(item => (item.gen <= this.gen && !item.isNonstandard));\n\t\t\t} else {\n\t\t\t\tconst hasAllItemsBan = ruleTable.check('pokemontag:allitems');\n\t\t\t\tfor (const item of this.dex.items.all()) {\n\t\t\t\t\tlet banReason = ruleTable.check('item:' + item.id);\n\t\t\t\t\tif (banReason) continue;\n\t\t\t\t\tif (banReason !== '' && item.id) {\n\t\t\t\t\t\tif (hasAllItemsBan) continue;\n\t\t\t\t\t\tif (item.isNonstandard) {\n\t\t\t\t\t\t\tbanReason = ruleTable.check('pokemontag:' + toID(item.isNonstandard));\n\t\t\t\t\t\t\tif (banReason) continue;\n\t\t\t\t\t\t\tif (banReason !== '' && item.isNonstandard !== 'Unobtainable') {\n\t\t\t\t\t\t\t\tif (hasNonexistentBan) continue;\n\t\t\t\t\t\t\t\tif (!hasNonexistentWhitelist) continue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\titemPool.push(item);\n\t\t\t\t}\n\t\t\t\tif (ruleTable.check('item:noitem')) {\n\t\t\t\t\tthis.enforceCustomPoolSizeNoComplexBans('item', itemPool, this.maxTeamSize, 'Max Team Size');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Ability Pool\n\t\tconst doAbilitiesExist = (this.gen > 2) && (this.dex.currentMod !== 'gen7letsgo');\n\t\tlet abilityPool: Ability[] = [];\n\t\tif (doAbilitiesExist) {\n\t\t\tif (!hasCustomBans) {\n\t\t\t\tabilityPool = [...this.dex.abilities.all()].filter(ability => (ability.gen <= this.gen && !ability.isNonstandard));\n\t\t\t} else {\n\t\t\t\tconst hasAllAbilitiesBan = ruleTable.check('pokemontag:allabilities');\n\t\t\t\tfor (const ability of this.dex.abilities.all()) {\n\t\t\t\t\tlet banReason = ruleTable.check('ability:' + ability.id);\n\t\t\t\t\tif (banReason) continue;\n\t\t\t\t\tif (banReason !== '') {\n\t\t\t\t\t\tif (hasAllAbilitiesBan) continue;\n\t\t\t\t\t\tif (ability.isNonstandard) {\n\t\t\t\t\t\t\tbanReason = ruleTable.check('pokemontag:' + toID(ability.isNonstandard));\n\t\t\t\t\t\t\tif (banReason) continue;\n\t\t\t\t\t\t\tif (banReason !== '') {\n\t\t\t\t\t\t\t\tif (hasNonexistentBan) continue;\n\t\t\t\t\t\t\t\tif (!hasNonexistentWhitelist) continue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tabilityPool.push(ability);\n\t\t\t\t}\n\t\t\t\tif (ruleTable.check('ability:noability')) {\n\t\t\t\t\tthis.enforceCustomPoolSizeNoComplexBans('ability', abilityPool, this.maxTeamSize, 'Max Team Size');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Move Pool\n\t\tconst setMoveCount = ruleTable.maxMoveCount;\n\t\tlet movePool: Move[] = [];\n\t\tif (!hasCustomBans) {\n\t\t\tmovePool = [...this.dex.moves.all()].filter(move =>\n\t\t\t\t(move.gen <= this.gen && !move.isNonstandard && !move.name.startsWith('Hidden Power ')));\n\t\t} else {\n\t\t\tconst hasAllMovesBan = ruleTable.check('pokemontag:allmoves');\n\t\t\tfor (const move of this.dex.moves.all()) {\n\t\t\t\t// Legality of specific HP types can't be altered in built formats anyway\n\t\t\t\tif (move.name.startsWith('Hidden Power ')) continue;\n\t\t\t\tlet banReason = ruleTable.check('move:' + move.id);\n\t\t\t\tif (banReason) continue;\n\t\t\t\tif (banReason !== '') {\n\t\t\t\t\tif (hasAllMovesBan) continue;\n\t\t\t\t\tif (move.isNonstandard) {\n\t\t\t\t\t\tbanReason = ruleTable.check('pokemontag:' + toID(move.isNonstandard));\n\t\t\t\t\t\tif (banReason) continue;\n\t\t\t\t\t\tif (banReason !== '' && move.isNonstandard !== 'Unobtainable') {\n\t\t\t\t\t\t\tif (hasNonexistentBan) continue;\n\t\t\t\t\t\t\tif (!hasNonexistentWhitelist) continue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tmovePool.push(move);\n\t\t\t}\n\t\t\tthis.enforceCustomPoolSizeNoComplexBans('move', movePool, this.maxTeamSize * setMoveCount, 'Max Team Size * Max Move Count');\n\t\t}\n\n\t\t// Nature Pool\n\t\tconst doNaturesExist = this.gen > 2;\n\t\tlet naturePool: Nature[] = [];\n\t\tif (doNaturesExist) {\n\t\t\tif (!hasCustomBans) {\n\t\t\t\tnaturePool = [...this.dex.natures.all()];\n\t\t\t} else {\n\t\t\t\tconst hasAllNaturesBan = ruleTable.check('pokemontag:allnatures');\n\t\t\t\tfor (const nature of this.dex.natures.all()) {\n\t\t\t\t\tlet banReason = ruleTable.check('nature:' + nature.id);\n\t\t\t\t\tif (banReason) continue;\n\t\t\t\t\tif (banReason !== '' && nature.id) {\n\t\t\t\t\t\tif (hasAllNaturesBan) continue;\n\t\t\t\t\t\tif (nature.isNonstandard) {\n\t\t\t\t\t\t\tbanReason = ruleTable.check('pokemontag:' + toID(nature.isNonstandard));\n\t\t\t\t\t\t\tif (banReason) continue;\n\t\t\t\t\t\t\tif (banReason !== '' && nature.isNonstandard !== 'Unobtainable') {\n\t\t\t\t\t\t\t\tif (hasNonexistentBan) continue;\n\t\t\t\t\t\t\t\tif (!hasNonexistentWhitelist) continue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tnaturePool.push(nature);\n\t\t\t\t}\n\t\t\t\t// There is no 'nature:nonature' rule so do not constrain pool size\n\t\t\t}\n\t\t}\n\n\t\tconst randomN = this.randomNPokemon(this.maxTeamSize, this.forceMonotype, undefined,\n\t\t\thasCustomBans ? ruleTable : undefined);\n\n\t\tconst team = [];\n\t\tfor (const forme of randomN) {\n\t\t\t// Choose forme\n\t\t\tconst species = this.dex.species.get(forme);\n\n\t\t\t// Random unique item\n\t\t\tlet item = '';\n\t\t\tlet itemData;\n\t\t\tif (doItemsExist) {\n\t\t\t\titemData = this.sampleNoReplace(itemPool);\n\t\t\t\titem = itemData?.name;\n\t\t\t}\n\n\t\t\t// Random unique ability\n\t\t\tlet ability = 'No Ability';\n\t\t\tlet abilityData;\n\t\t\tif (doAbilitiesExist) {\n\t\t\t\tabilityData = this.sampleNoReplace(abilityPool);\n\t\t\t\tability = abilityData?.name;\n\t\t\t}\n\n\t\t\t// Random unique moves\n\t\t\tconst m = [];\n\t\t\tdo {\n\t\t\t\tconst move = this.sampleNoReplace(movePool);\n\t\t\t\tm.push(move.id);\n\t\t\t} while (m.length < setMoveCount);\n\n\t\t\t// Random EVs\n\t\t\tconst evs = {hp: 0, atk: 0, def: 0, spa: 0, spd: 0, spe: 0};\n\t\t\tif (this.gen === 6) {\n\t\t\t\tlet evpool = 510;\n\t\t\t\tdo {\n\t\t\t\t\tconst x = this.sample(Dex.stats.ids());\n\t\t\t\t\tconst y = this.random(Math.min(256 - evs[x], evpool + 1));\n\t\t\t\t\tevs[x] += y;\n\t\t\t\t\tevpool -= y;\n\t\t\t\t} while (evpool > 0);\n\t\t\t} else {\n\t\t\t\tfor (const x of Dex.stats.ids()) {\n\t\t\t\t\tevs[x] = this.random(256);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Random IVs\n\t\t\tconst ivs: StatsTable = {\n\t\t\t\thp: this.random(32),\n\t\t\t\tatk: this.random(32),\n\t\t\t\tdef: this.random(32),\n\t\t\t\tspa: this.random(32),\n\t\t\t\tspd: this.random(32),\n\t\t\t\tspe: this.random(32),\n\t\t\t};\n\n\t\t\t// Random nature\n\t\t\tlet nature = '';\n\t\t\tif (doNaturesExist && (naturePool.length > 0)) {\n\t\t\t\tnature = this.sample(naturePool).name;\n\t\t\t}\n\n\t\t\t// Level balance\n\t\t\tconst mbstmin = 1307;\n\t\t\tconst stats = species.baseStats;\n\t\t\tlet mbst = (stats['hp'] * 2 + 31 + 21 + 100) + 10;\n\t\t\tmbst += (stats['atk'] * 2 + 31 + 21 + 100) + 5;\n\t\t\tmbst += (stats['def'] * 2 + 31 + 21 + 100) + 5;\n\t\t\tmbst += (stats['spa'] * 2 + 31 + 21 + 100) + 5;\n\t\t\tmbst += (stats['spd'] * 2 + 31 + 21 + 100) + 5;\n\t\t\tmbst += (stats['spe'] * 2 + 31 + 21 + 100) + 5;\n\n\t\t\tlet level;\n\t\t\tif (this.adjustLevel) {\n\t\t\t\tlevel = this.adjustLevel;\n\t\t\t} else {\n\t\t\t\tlevel = Math.floor(100 * mbstmin / mbst);\n\t\t\t\twhile (level < 100) {\n\t\t\t\t\tmbst = Math.floor((stats['hp'] * 2 + 31 + 21 + 100) * level / 100 + 10);\n\t\t\t\t\tmbst += Math.floor(((stats['atk'] * 2 + 31 + 21 + 100) * level / 100 + 5) * level / 100);\n\t\t\t\t\tmbst += Math.floor((stats['def'] * 2 + 31 + 21 + 100) * level / 100 + 5);\n\t\t\t\t\tmbst += Math.floor(((stats['spa'] * 2 + 31 + 21 + 100) * level / 100 + 5) * level / 100);\n\t\t\t\t\tmbst += Math.floor((stats['spd'] * 2 + 31 + 21 + 100) * level / 100 + 5);\n\t\t\t\t\tmbst += Math.floor((stats['spe'] * 2 + 31 + 21 + 100) * level / 100 + 5);\n\t\t\t\t\tif (mbst >= mbstmin) break;\n\t\t\t\t\tlevel++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Random happiness\n\t\t\tconst happiness = this.random(256);\n\n\t\t\t// Random shininess\n\t\t\tconst shiny = this.randomChance(1, 1024);\n\n\t\t\tconst set: PokemonSet = {\n\t\t\t\tname: species.baseSpecies,\n\t\t\t\tspecies: species.name,\n\t\t\t\tgender: species.gender,\n\t\t\t\titem,\n\t\t\t\tability,\n\t\t\t\tmoves: m,\n\t\t\t\tevs,\n\t\t\t\tivs,\n\t\t\t\tnature,\n\t\t\t\tlevel,\n\t\t\t\thappiness,\n\t\t\t\tshiny,\n\t\t\t};\n\t\t\tif (this.gen === 9) {\n\t\t\t\t// Random Tera type\n\t\t\t\tset.teraType = this.sample(this.dex.types.all()).name;\n\t\t\t}\n\t\t\tteam.push(set);\n\t\t}\n\n\t\treturn team;\n\t}\n\n\tqueryMoves(\n\t\tmoves: Set | null,\n\t\ttypes: string[],\n\t\tabilities: Set = new Set(),\n\t\tmovePool: string[] = []\n\t): MoveCounter {\n\t\t// This is primarily a helper function for random setbuilder functions.\n\t\tconst counter = new MoveCounter();\n\n\t\tif (!moves?.size) return counter;\n\n\t\tconst categories = {Physical: 0, Special: 0, Status: 0};\n\n\t\t// Iterate through all moves we've chosen so far and keep track of what they do:\n\t\tfor (const moveid of moves) {\n\t\t\tlet move = this.dex.moves.get(moveid);\n\t\t\tif (move.id === 'naturepower') {\n\t\t\t\tif (this.gen === 5) move = this.dex.moves.get('earthquake');\n\t\t\t}\n\n\t\t\tlet moveType = move.type;\n\t\t\tif (['judgment', 'multiattack', 'revelationdance'].includes(moveid)) moveType = types[0];\n\t\t\tif (move.damage || move.damageCallback) {\n\t\t\t\t// Moves that do a set amount of damage:\n\t\t\t\tcounter.add('damage');\n\t\t\t\tcounter.damagingMoves.add(move);\n\t\t\t} else {\n\t\t\t\t// Are Physical/Special/Status moves:\n\t\t\t\tcategories[move.category]++;\n\t\t\t}\n\t\t\t// Moves that have a low base power:\n\t\t\tif (moveid === 'lowkick' || (move.basePower && move.basePower <= 60 && moveid !== 'rapidspin')) {\n\t\t\t\tcounter.add('technician');\n\t\t\t}\n\t\t\t// Moves that hit up to 5 times:\n\t\t\tif (move.multihit && Array.isArray(move.multihit) && move.multihit[1] === 5) counter.add('skilllink');\n\t\t\tif (move.recoil || move.hasCrashDamage) counter.add('recoil');\n\t\t\tif (move.drain) counter.add('drain');\n\t\t\t// Moves which have a base power, but aren't super-weak like Rapid Spin:\n\t\t\tif (move.basePower > 30 || move.multihit || move.basePowerCallback || moveid === 'infestation') {\n\t\t\t\tcounter.add(moveType);\n\t\t\t\tif (types.includes(moveType)) {\n\t\t\t\t\t// STAB:\n\t\t\t\t\t// Certain moves aren't acceptable as a Pokemon's only STAB attack\n\t\t\t\t\tif (!this.noStab.includes(moveid) && (!moveid.startsWith('hiddenpower') || types.length === 1)) {\n\t\t\t\t\t\tcounter.add('stab');\n\t\t\t\t\t\t// Ties between Physical and Special setup should broken in favor of STABs\n\t\t\t\t\t\tcategories[move.category] += 0.1;\n\t\t\t\t\t}\n\t\t\t\t} else if (\n\t\t\t\t\t// Less obvious forms of STAB\n\t\t\t\t\t(moveType === 'Normal' && (['Aerilate', 'Galvanize', 'Pixilate', 'Refrigerate'].some(abil => abilities.has(abil)))) ||\n\t\t\t\t\t(move.priority === 0 && (abilities.has('Libero') || abilities.has('Protean')) && !this.noStab.includes(moveid)) ||\n\t\t\t\t\t(moveType === 'Steel' && abilities.has('Steelworker'))\n\t\t\t\t) {\n\t\t\t\t\tcounter.add('stab');\n\t\t\t\t}\n\n\t\t\t\tif (move.flags['bite']) counter.add('strongjaw');\n\t\t\t\tif (move.flags['punch']) counter.add('ironfist');\n\t\t\t\tif (move.flags['sound']) counter.add('sound');\n\t\t\t\tif (move.priority !== 0 || (moveid === 'grassyglide' && abilities.has('Grassy Surge'))) {\n\t\t\t\t\tcounter.add('priority');\n\t\t\t\t}\n\t\t\t\tcounter.damagingMoves.add(move);\n\t\t\t}\n\t\t\t// Moves with secondary effects:\n\t\t\tif (move.secondary) {\n\t\t\t\tcounter.add('sheerforce');\n\t\t\t\tif (sereneGraceBenefits(move)) {\n\t\t\t\t\tcounter.add('serenegrace');\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Moves with low accuracy:\n\t\t\tif (move.accuracy && move.accuracy !== true && move.accuracy < 90) counter.add('inaccurate');\n\n\t\t\t// Moves that change stats:\n\t\t\tif (RECOVERY_MOVES.includes(moveid)) counter.add('recovery');\n\t\t\tif (CONTRARY_MOVES.includes(moveid)) counter.add('contrary');\n\t\t\tif (PHYSICAL_SETUP.includes(moveid)) {\n\t\t\t\tcounter.add('physicalsetup');\n\t\t\t\tcounter.setupType = 'Physical';\n\t\t\t} else if (SPECIAL_SETUP.includes(moveid)) {\n\t\t\t\tcounter.add('specialsetup');\n\t\t\t\tcounter.setupType = 'Special';\n\t\t\t}\n\n\t\t\tif (MIXED_SETUP.includes(moveid)) counter.add('mixedsetup');\n\t\t\tif (SPEED_SETUP.includes(moveid)) counter.add('speedsetup');\n\t\t\tif (HAZARDS.includes(moveid)) counter.add('hazards');\n\t\t}\n\n\t\t// Keep track of the available moves\n\t\tfor (const moveid of movePool) {\n\t\t\tconst move = this.dex.moves.get(moveid);\n\t\t\tif (move.damageCallback) continue;\n\t\t\tif (move.category === 'Physical') counter.add('physicalpool');\n\t\t\tif (move.category === 'Special') counter.add('specialpool');\n\t\t}\n\n\t\t// Choose a setup type:\n\t\tif (counter.get('mixedsetup')) {\n\t\t\tcounter.setupType = 'Mixed';\n\t\t} else if (counter.get('physicalsetup') && counter.get('specialsetup')) {\n\t\t\tconst pool = {\n\t\t\t\tPhysical: categories['Physical'] + counter.get('physicalpool'),\n\t\t\t\tSpecial: categories['Special'] + counter.get('specialpool'),\n\t\t\t};\n\t\t\tif (pool.Physical === pool.Special) {\n\t\t\t\tif (categories['Physical'] > categories['Special']) counter.setupType = 'Physical';\n\t\t\t\tif (categories['Special'] > categories['Physical']) counter.setupType = 'Special';\n\t\t\t} else {\n\t\t\t\tcounter.setupType = pool.Physical > pool.Special ? 'Physical' : 'Special';\n\t\t\t}\n\t\t} else if (counter.setupType === 'Physical') {\n\t\t\tif (\n\t\t\t\t(categories['Physical'] < 2 && (!counter.get('stab') || !counter.get('physicalpool'))) &&\n\t\t\t\t!(moves.has('rest') && moves.has('sleeptalk')) &&\n\t\t\t\t!moves.has('batonpass')\n\t\t\t) {\n\t\t\t\tcounter.setupType = '';\n\t\t\t}\n\t\t} else if (counter.setupType === 'Special') {\n\t\t\tif (\n\t\t\t\t(categories['Special'] < 2 && (!counter.get('stab') || !counter.get('specialpool'))) &&\n\t\t\t\t!moves.has('quiverdance') &&\n\t\t\t\t!(moves.has('rest') && moves.has('sleeptalk')) &&\n\t\t\t\t!(moves.has('wish') && moves.has('protect')) &&\n\t\t\t\t!moves.has('batonpass')\n\t\t\t) {\n\t\t\t\tcounter.setupType = '';\n\t\t\t}\n\t\t}\n\n\t\tcounter.set('Physical', Math.floor(categories['Physical']));\n\t\tcounter.set('Special', Math.floor(categories['Special']));\n\t\tcounter.set('Status', categories['Status']);\n\n\t\treturn counter;\n\t}\n\n\tshouldCullMove(\n\t\tmove: Move,\n\t\ttypes: Set,\n\t\tmoves: Set,\n\t\tabilities: Set,\n\t\tcounter: MoveCounter,\n\t\tmovePool: string[],\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tisLead: boolean,\n\t\tisDoubles: boolean,\n\t\tisNoDynamax: boolean,\n\t): {cull: boolean, isSetup?: boolean} {\n\t\tif (isDoubles && species.baseStats.def >= 140 && movePool.includes('bodypress')) {\n\t\t\t// In Doubles, Pok\u00E9mon with Defense stats >= 140 should always have body press\n\t\t\treturn {cull: true};\n\t\t}\n\t\tif (\n\t\t\t(species.id === 'doublade' && movePool.includes('swordsdance')) ||\n\t\t\t(species.id === 'entei' && movePool.includes('extremespeed')) ||\n\t\t\t(species.id === 'genesectdouse' && movePool.includes('technoblast')) ||\n\t\t\t(species.id === 'golisopod' && movePool.includes('leechlife') && movePool.includes('firstimpression'))\n\t\t) {\n\t\t\t// Entei should always have Extreme Speed, and Genesect-Douse should always have Techno Blast\n\t\t\t// Golisopod should always have one of its bug moves (Leech Life or First Impression)\n\t\t\treturn {cull: true};\n\t\t}\n\n\t\tconst hasRestTalk = moves.has('rest') && moves.has('sleeptalk');\n\n\t\t// Reject moves that need support\n\t\tswitch (move.id) {\n\t\tcase 'acrobatics': case 'junglehealing':\n\t\t\t// Special case to prevent lead Acrobatics Rillaboom\n\t\t\treturn {cull: (species.id.startsWith('rillaboom') && isLead) || (!isDoubles && !counter.setupType)};\n\t\tcase 'dualwingbeat': case 'fly':\n\t\t\treturn {cull: !types.has(move.type) && !counter.setupType && !!counter.get('Status')};\n\t\tcase 'healbell':\n\t\t\treturn {cull: movePool.includes('protect') || movePool.includes('wish')};\n\t\tcase 'fireblast':\n\t\t\t// Special case for Togekiss, which always wants Aura Sphere\n\t\t\treturn {cull: abilities.has('Serene Grace') && (!moves.has('trick') || counter.get('Status') > 1)};\n\t\tcase 'firepunch':\n\t\t\t// Special case for Darmanitan-Zen-Galar, which doesn't always want Fire Punch\n\t\t\treturn {cull: movePool.includes('bellydrum') || (moves.has('earthquake') && movePool.includes('substitute'))};\n\t\tcase 'flamecharge':\n\t\t\treturn {cull: movePool.includes('swordsdance')};\n\t\tcase 'hypervoice':\n\t\t\t// Special case for Heliolisk, which always wants Thunderbolt\n\t\t\treturn {cull: types.has('Electric') && movePool.includes('thunderbolt')};\n\t\tcase 'payback': case 'psychocut':\n\t\t\t// Special case for Type: Null and Malamar, which don't want these + RestTalk\n\t\t\treturn {cull: !counter.get('Status') || hasRestTalk};\n\t\tcase 'rest':\n\t\t\tconst bulkySetup = !moves.has('sleeptalk') && ['bulkup', 'calmmind', 'coil', 'curse'].some(m => movePool.includes(m));\n\t\t\t// Registeel would otherwise get Curse sets without Rest, which are very bad generally\n\t\t\treturn {cull: species.id !== 'registeel' && (movePool.includes('sleeptalk') || bulkySetup)};\n\t\tcase 'sleeptalk':\n\t\t\tif (!moves.has('rest')) return {cull: true};\n\t\t\tif (movePool.length > 1 && !abilities.has('Contrary')) {\n\t\t\t\tconst rest = movePool.indexOf('rest');\n\t\t\t\tif (rest >= 0) this.fastPop(movePool, rest);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'storedpower':\n\t\t\treturn {cull: !counter.setupType};\n\t\tcase 'switcheroo': case 'trick':\n\t\t\treturn {cull: counter.get('Physical') + counter.get('Special') < 3 || moves.has('rapidspin')};\n\t\tcase 'trickroom':\n\t\t\tconst webs = !!teamDetails.stickyWeb;\n\t\t\treturn {cull:\n\t\t\t\tisLead || webs || !!counter.get('speedsetup') ||\n\t\t\t\tcounter.damagingMoves.size < 2 || movePool.includes('nastyplot'),\n\t\t\t};\n\t\tcase 'zenheadbutt':\n\t\t\t// Special case for Victini, which should prefer Bolt Strike to Zen Headbutt\n\t\t\treturn {cull: movePool.includes('boltstrike') || (species.id === 'eiscue' && moves.has('substitute'))};\n\n\t\t// Set up once and only if we have the moves for it\n\t\tcase 'bellydrum': case 'bulkup': case 'coil': case 'curse': case 'dragondance': case 'honeclaws': case 'swordsdance':\n\t\t\tif (counter.setupType !== 'Physical') return {cull: true}; // if we're not setting up physically this is pointless\n\t\t\tif (counter.get('Physical') + counter.get('physicalpool') < 2 && !hasRestTalk) return {cull: true};\n\n\t\t\t// First Impression + setup is undesirable in Doubles\n\t\t\tif (isDoubles && moves.has('firstimpression')) return {cull: true};\n\t\t\tif (move.id === 'swordsdance' && moves.has('dragondance')) return {cull: true}; // Dragon Dance is judged as better\n\n\t\t\treturn {cull: false, isSetup: true};\n\t\tcase 'calmmind': case 'nastyplot':\n\t\t\tif (species.id === 'togekiss') return {cull: false};\n\t\t\tif (counter.setupType !== 'Special') return {cull: true};\n\t\t\tif (\n\t\t\t\t(counter.get('Special') + counter.get('specialpool')) < 2 &&\n\t\t\t\t!hasRestTalk &&\n\t\t\t\t!(moves.has('wish') && moves.has('protect'))\n\t\t\t) return {cull: true};\n\t\t\tif (moves.has('healpulse') || move.id === 'calmmind' && moves.has('trickroom')) return {cull: true};\n\t\t\treturn {cull: false, isSetup: true};\n\t\tcase 'quiverdance':\n\t\t\treturn {cull: false, isSetup: true};\n\t\tcase 'clangoroussoul': case 'shellsmash': case 'workup':\n\t\t\tif (counter.setupType !== 'Mixed') return {cull: true};\n\t\t\tif (counter.damagingMoves.size + counter.get('physicalpool') + counter.get('specialpool') < 2) return {cull: true};\n\t\t\treturn {cull: false, isSetup: true};\n\t\tcase 'agility': case 'autotomize': case 'rockpolish': case 'shiftgear':\n\t\t\tif (counter.damagingMoves.size < 2 || moves.has('rest')) return {cull: true};\n\t\t\tif (movePool.includes('calmmind') || movePool.includes('nastyplot')) return {cull: true};\n\t\t\treturn {cull: false, isSetup: !counter.setupType};\n\n\t\t// Bad after setup\n\t\tcase 'coaching': case 'counter': case 'reversal':\n\t\t\t// Counter: special case for Alakazam, which doesn't want Counter + Nasty Plot\n\t\t\treturn {cull: !!counter.setupType};\n\t\tcase 'bulletpunch': case 'extremespeed': case 'rockblast':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.get('speedsetup') ||\n\t\t\t\t(!isDoubles && moves.has('dragondance')) ||\n\t\t\t\tcounter.damagingMoves.size < 2\n\t\t\t)};\n\t\tcase 'closecombat': case 'flashcannon': case 'pollenpuff':\n\t\t\tconst substituteCullCondition = (\n\t\t\t\t(moves.has('substitute') && !types.has('Fighting')) ||\n\t\t\t\t(moves.has('toxic') && movePool.includes('substitute'))\n\t\t\t);\n\t\t\tconst preferHJKOverCCCullCondition = (\n\t\t\t\tmove.id === 'closecombat' &&\n\t\t\t\t!counter.setupType &&\n\t\t\t\t(moves.has('highjumpkick') || movePool.includes('highjumpkick'))\n\t\t\t);\n\t\t\treturn {cull: substituteCullCondition || preferHJKOverCCCullCondition};\n\t\tcase 'defog':\n\t\t\treturn {cull: !!counter.setupType || moves.has('healbell') || moves.has('toxicspikes') || !!teamDetails.defog};\n\t\tcase 'fakeout':\n\t\t\treturn {cull: !!counter.setupType || ['protect', 'rapidspin', 'substitute', 'uturn'].some(m => moves.has(m))};\n\t\tcase 'firstimpression': case 'glare': case 'icywind': case 'tailwind': case 'waterspout':\n\t\t\treturn {cull: !!counter.setupType || !!counter.get('speedsetup') || moves.has('rest')};\n\t\tcase 'healingwish': case 'memento':\n\t\t\treturn {cull: !!counter.setupType || !!counter.get('recovery') || moves.has('substitute') || moves.has('uturn')};\n\t\tcase 'highjumpkick':\n\t\t\t// Special case for Hitmonlee to prevent non-Unburden Curse\n\t\t\treturn {cull: moves.has('curse')};\n\t\tcase 'partingshot':\n\t\t\treturn {cull: !!counter.get('speedsetup') || moves.has('bulkup') || moves.has('uturn')};\n\t\tcase 'protect':\n\t\t\tif (!isDoubles && ((counter.setupType && !moves.has('wish')) || moves.has('rest'))) return {cull: true};\n\t\t\tif (\n\t\t\t\t!isDoubles &&\n\t\t\t\tcounter.get('Status') < 2 &&\n\t\t\t\t['Hunger Switch', 'Speed Boost'].every(m => !abilities.has(m))\n\t\t\t) return {cull: true};\n\t\t\tif (movePool.includes('leechseed') || (movePool.includes('toxic') && !moves.has('wish'))) return {cull: true};\n\t\t\tif (isDoubles && (\n\t\t\t\t['bellydrum', 'fakeout', 'shellsmash', 'spore'].some(m => movePool.includes(m)) ||\n\t\t\t\tmoves.has('tailwind') || moves.has('waterspout') || counter.get('recovery')\n\t\t\t)) return {cull: true};\n\t\t\treturn {cull: false};\n\t\tcase 'rapidspin':\n\t\t\tconst setup = ['curse', 'nastyplot', 'shellsmash'].some(m => moves.has(m));\n\t\t\treturn {cull: !!teamDetails.rapidSpin || setup || (!!counter.setupType && counter.get('Fighting') >= 2)};\n\t\tcase 'shadowsneak':\n\t\t\tconst sneakIncompatible = ['substitute', 'trickroom', 'dualwingbeat', 'toxic'].some(m => moves.has(m));\n\t\t\treturn {cull: hasRestTalk || sneakIncompatible || counter.setupType === 'Special'};\n\t\tcase 'spikes':\n\t\t\treturn {cull: !!counter.setupType || (!!teamDetails.spikes && teamDetails.spikes > 1)};\n\t\tcase 'stealthrock':\n\t\t\treturn {cull:\n\t\t\t\t!!counter.setupType ||\n\t\t\t\t!!counter.get('speedsetup') ||\n\t\t\t\t!!teamDetails.stealthRock ||\n\t\t\t\t['rest', 'substitute', 'trickroom', 'teleport'].some(m => moves.has(m)) ||\n\t\t\t\t(species.id === 'palossand' && movePool.includes('shoreup')),\n\t\t\t};\n\t\tcase 'stickyweb':\n\t\t\treturn {cull: counter.setupType === 'Special' || !!teamDetails.stickyWeb};\n\t\tcase 'taunt':\n\t\t\treturn {cull: moves.has('encore') || moves.has('nastyplot') || moves.has('swordsdance')};\n\t\tcase 'thunderwave': case 'voltswitch':\n\t\t\tconst cullInDoubles = isDoubles && (moves.has('electroweb') || moves.has('nuzzle'));\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.setupType ||\n\t\t\t\t!!counter.get('speedsetup') ||\n\t\t\t\tmoves.has('shiftgear') ||\n\t\t\t\tmoves.has('raindance') ||\n\t\t\t\tcullInDoubles\n\t\t\t)};\n\t\tcase 'toxic':\n\t\t\treturn {cull: !!counter.setupType || ['sludgewave', 'thunderwave', 'willowisp'].some(m => moves.has(m))};\n\t\tcase 'toxicspikes':\n\t\t\treturn {cull: !!counter.setupType || !!teamDetails.toxicSpikes};\n\t\tcase 'uturn':\n\t\t\tconst bugSwordsDanceCase = types.has('Bug') && counter.get('recovery') && moves.has('swordsdance');\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.get('speedsetup') ||\n\t\t\t\t(counter.setupType && !bugSwordsDanceCase) ||\n\t\t\t\t(isDoubles && moves.has('leechlife')) ||\n\t\t\t\tmoves.has('shiftgear')\n\t\t\t)};\n\n\t\t/**\n\t\t * Ineffective to have both moves together\n\t\t *\n\t\t * These are sorted in order of:\n\t\t * Normal>Fire>Water>Electric>Grass>Ice>Fighting>Poison>Ground>Flying>Psychic>Bug>Rock>Ghost>Dragon>Dark>Fairy\n\t\t * and then subsorted alphabetically.\n\t\t * This type order is arbitrary and referenced from https://pokemondb.net/type.\n\t\t */\n\t\tcase 'explosion':\n\t\t\t// Rock Blast: Special case for Gigalith to prevent Stone Edge-less Choice Band sets\n\t\t\tconst otherMoves = ['curse', 'stompingtantrum', 'rockblast', 'painsplit', 'wish'].some(m => moves.has(m));\n\t\t\treturn {cull: !!counter.get('speedsetup') || !!counter.get('recovery') || otherMoves};\n\t\tcase 'facade':\n\t\t\t// Special case for Snorlax\n\t\t\treturn {cull: movePool.includes('doubleedge')};\n\t\tcase 'quickattack':\n\t\t\t// Diggersby wants U-turn on Choiced sets\n\t\t\tconst diggersbyCull = counter.get('Physical') > 3 && movePool.includes('uturn');\n\t\t\treturn {cull: !!counter.get('speedsetup') || (types.has('Rock') && !!counter.get('Status')) || diggersbyCull};\n\t\tcase 'blazekick':\n\t\t\treturn {cull: species.id === 'genesect' && counter.get('Special') >= 1};\n\t\tcase 'blueflare':\n\t\t\treturn {cull: moves.has('vcreate')};\n\t\tcase 'firefang': case 'flamethrower':\n\t\t\t// Fire Fang: Special case for Garchomp, which doesn't want Fire Fang w/o Swords Dance\n\t\t\tconst otherFireMoves = ['heatwave', 'overheat'].some(m => moves.has(m));\n\t\t\treturn {cull: (moves.has('fireblast') && counter.setupType !== 'Physical') || otherFireMoves};\n\t\tcase 'flareblitz':\n\t\t\t// Special case for Solgaleo to prevent Flame Charge + Flare Blitz\n\t\t\treturn {cull: species.id === 'solgaleo' && moves.has('flamecharge')};\n\t\tcase 'overheat':\n\t\t\treturn {cull: moves.has('flareblitz') || (isDoubles && moves.has('calmmind'))};\n\t\tcase 'aquatail': case 'flipturn':\n\t\t\treturn {cull: moves.has('aquajet') || !!counter.get('Status')};\n\t\tcase 'hydropump':\n\t\t\treturn {cull: moves.has('scald') && (\n\t\t\t\t(counter.get('Special') < 4 && !moves.has('uturn')) ||\n\t\t\t\t(species.types.length > 1 && counter.get('stab') < 3)\n\t\t\t)};\n\t\tcase 'muddywater':\n\t\t\treturn {cull: moves.has('liquidation')};\n\t\tcase 'scald':\n\t\t\t// Special case for Clawitzer\n\t\t\treturn {cull: moves.has('waterpulse')};\n\t\tcase 'thunderbolt':\n\t\t\t// Special case for Goodra, which only wants one move to hit Water-types\n\t\t\treturn {cull: moves.has('powerwhip')};\n\t\tcase 'energyball':\n\t\t\t// Special case to prevent Shiinotic with four Grass moves and no Moonblast\n\t\t\treturn {cull: species.id === 'shiinotic' && !moves.has('moonblast')};\n\t\tcase 'gigadrain':\n\t\t\t// Celebi always wants Leaf Storm on its more pivoting-focused non-Nasty Plot sets\n\t\t\tconst celebiPreferLeafStorm = species.id === 'celebi' && !counter.setupType && moves.has('uturn');\n\t\t\treturn {cull: celebiPreferLeafStorm || (types.has('Poison') && !counter.get('Poison'))};\n\t\tcase 'leafblade':\n\t\t\t// Special case for Virizion to prevent Leaf Blade on Assault Vest sets\n\t\t\treturn {cull: (moves.has('leafstorm') || movePool.includes('leafstorm')) && counter.setupType !== 'Physical'};\n\t\tcase 'leafstorm':\n\t\t\tconst leafBladePossible = movePool.includes('leafblade') || moves.has('leafblade');\n\t\t\treturn {cull:\n\t\t\t\t// Virizion should always prefer Leaf Blade to Leaf Storm on Physical sets\n\t\t\t\t(counter.setupType === 'Physical' && (species.id === 'virizion' || leafBladePossible)) ||\n\t\t\t\t(moves.has('gigadrain') && !!counter.get('Status')) ||\n\t\t\t\t(isDoubles && moves.has('energyball')),\n\t\t\t};\n\t\tcase 'powerwhip':\n\t\t\t// Special case for Centiskorch, which doesn't want Assault Vest\n\t\t\treturn {cull: moves.has('leechlife')};\n\t\tcase 'woodhammer':\n\t\t\treturn {cull: moves.has('hornleech') && counter.get('Physical') < 4};\n\t\tcase 'freezedry':\n\t\t\tconst betterIceMove = (\n\t\t\t\t(moves.has('blizzard') && !!counter.setupType) ||\n\t\t\t\t(moves.has('icebeam') && counter.get('Special') < 4)\n\t\t\t);\n\t\t\tconst preferThunderWave = movePool.includes('thunderwave') && types.has('Electric');\n\t\t\treturn {cull: betterIceMove || preferThunderWave || movePool.includes('bodyslam')};\n\t\tcase 'bodypress':\n\t\t\t// Turtonator never wants Earthquake + Body Press, and wants EQ+Smash or Press+No Smash\n\t\t\tconst turtonatorPressCull = species.id === 'turtonator' && moves.has('earthquake') && movePool.includes('shellsmash');\n\t\t\tconst pressIncompatible = ['shellsmash', 'mirrorcoat', 'whirlwind'].some(m => moves.has(m));\n\t\t\treturn {cull: turtonatorPressCull || pressIncompatible || counter.setupType === 'Special'};\n\t\tcase 'circlethrow':\n\t\t\t// Part of a special case for Throh to pick one specific Fighting move depending on its set\n\t\t\treturn {cull: moves.has('stormthrow') && !moves.has('rest')};\n\t\tcase 'drainpunch':\n\t\t\treturn {cull: moves.has('closecombat') || (!types.has('Fighting') && movePool.includes('swordsdance'))};\n\t\tcase 'dynamicpunch': case 'thunderouskick':\n\t\t\t// Dynamic Punch: Special case for Machamp to better split Guts and No Guard sets\n\t\t\treturn {cull: moves.has('closecombat') || moves.has('facade')};\n\t\tcase 'focusblast':\n\t\t\t// Special cases for Blastoise and Regice; Blastoise wants Shell Smash, and Regice wants Thunderbolt\n\t\t\treturn {cull: movePool.includes('shellsmash') || hasRestTalk};\n\t\tcase 'hammerarm':\n\t\t\t// Special case for Kangaskhan, which always wants Sucker Punch\n\t\t\treturn {cull: moves.has('fakeout')};\n\t\tcase 'stormthrow':\n\t\t\t// Part of a special case for Throh to pick one specific Fighting move depending on its set\n\t\t\treturn {cull: hasRestTalk};\n\t\tcase 'superpower':\n\t\t\treturn {\n\t\t\t\tcull: moves.has('hydropump') ||\n\t\t\t\t\t(counter.get('Physical') >= 4 && movePool.includes('uturn')) ||\n\t\t\t\t\t(moves.has('substitute') && !abilities.has('Contrary')),\n\t\t\t\tisSetup: abilities.has('Contrary'),\n\t\t\t};\n\t\tcase 'poisonjab':\n\t\t\treturn {cull: !types.has('Poison') && counter.get('Status') >= 2};\n\t\tcase 'earthquake':\n\t\t\tconst doublesCull = moves.has('earthpower') || moves.has('highhorsepower');\n\t\t\t// Turtonator wants Body Press when it doesn't have Shell Smash\n\t\t\tconst turtQuakeCull = species.id === 'turtonator' && movePool.includes('bodypress') && movePool.includes('shellsmash');\n\t\t\tconst subToxicPossible = moves.has('substitute') && movePool.includes('toxic');\n\t\t\treturn {cull: turtQuakeCull || (isDoubles && doublesCull) || subToxicPossible || moves.has('bonemerang')};\n\t\tcase 'scorchingsands':\n\t\t\t// Special cases for Ninetales and Palossand; prevents status redundancy\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('willowisp') ||\n\t\t\t\tmoves.has('earthpower') ||\n\t\t\t\t(moves.has('toxic') && movePool.includes('earthpower'))\n\t\t\t)};\n\t\tcase 'airslash':\n\t\t\treturn {cull:\n\t\t\t\t(species.id === 'naganadel' && moves.has('nastyplot')) ||\n\t\t\t\thasRestTalk ||\n\t\t\t\t(abilities.has('Simple') && !!counter.get('recovery')) ||\n\t\t\t\tcounter.setupType === 'Physical',\n\t\t\t};\n\t\tcase 'bravebird':\n\t\t\t// Special case for Mew, which only wants Brave Bird with Swords Dance\n\t\t\treturn {cull: moves.has('dragondance')};\n\t\tcase 'hurricane':\n\t\t\treturn {cull: counter.setupType === 'Physical'};\n\t\tcase 'futuresight':\n\t\t\treturn {cull: moves.has('psyshock') || moves.has('trick') || movePool.includes('teleport')};\n\t\tcase 'photongeyser':\n\t\t\t// Special case for Necrozma-DM, which always wants Dragon Dance\n\t\t\treturn {cull: moves.has('morningsun')};\n\t\tcase 'psychic':\n\t\t\tconst alcremieCase = species.id === 'alcremiegmax' && counter.get('Status') < 2;\n\t\t\treturn {cull: alcremieCase || (moves.has('psyshock') && (!!counter.setupType || isDoubles))};\n\t\tcase 'psychicfangs':\n\t\t\t// Special case for Morpeko, which doesn't want 4 attacks Leftovers\n\t\t\treturn {cull: moves.has('rapidspin')};\n\t\tcase 'psyshock':\n\t\t\t// Special case for Sylveon which only wants Psyshock if it gets a Choice item\n\t\t\tconst sylveonCase = abilities.has('Pixilate') && counter.get('Special') < 4;\n\t\t\treturn {cull: moves.has('psychic') || (!counter.setupType && sylveonCase) || (isDoubles && moves.has('psychic'))};\n\t\tcase 'bugbuzz':\n\t\t\treturn {cull: moves.has('uturn') && !counter.setupType};\n\t\tcase 'leechlife':\n\t\t\treturn {cull:\n\t\t\t\t(isDoubles && moves.has('lunge')) ||\n\t\t\t\t(moves.has('uturn') && !counter.setupType) ||\n\t\t\t\tmovePool.includes('spikes'),\n\t\t\t};\n\t\tcase 'stoneedge':\n\t\t\tconst gutsCullCondition = abilities.has('Guts') && (!moves.has('dynamicpunch') || moves.has('spikes'));\n\t\t\tconst rockSlidePlusStatusPossible = counter.get('Status') && movePool.includes('rockslide');\n\t\t\tconst otherRockMove = moves.has('rockblast') || moves.has('rockslide');\n\t\t\tconst lucarioCull = species.id === 'lucario' && !!counter.setupType;\n\t\t\treturn {cull: gutsCullCondition || (!isDoubles && rockSlidePlusStatusPossible) || otherRockMove || lucarioCull};\n\t\tcase 'poltergeist':\n\t\t\t// Special case for Dhelmise in Doubles, which doesn't want both\n\t\t\treturn {cull: moves.has('knockoff')};\n\t\tcase 'shadowball':\n\t\t\treturn {cull:\n\t\t\t\t(isDoubles && moves.has('phantomforce')) ||\n\t\t\t\t// Special case for Sylveon, which never wants Shadow Ball as its only coverage move\n\t\t\t\t(abilities.has('Pixilate') && (!!counter.setupType || counter.get('Status') > 1)) ||\n\t\t\t\t(!types.has('Ghost') && movePool.includes('focusblast')),\n\t\t\t};\n\t\tcase 'shadowclaw':\n\t\t\treturn {cull: types.has('Steel') && moves.has('shadowsneak') && counter.get('Physical') < 4};\n\t\tcase 'dragonpulse': case 'spacialrend':\n\t\t\treturn {cull: moves.has('dracometeor') && counter.get('Special') < 4};\n\t\tcase 'darkpulse':\n\t\t\tconst pulseIncompatible = ['foulplay', 'knockoff'].some(m => moves.has(m)) || (\n\t\t\t\tspecies.id === 'shiftry' && (moves.has('defog') || moves.has('suckerpunch'))\n\t\t\t);\n\t\t\t// Special clause to prevent bugged Shiftry sets with Sucker Punch + Nasty Plot\n\t\t\tconst shiftryCase = movePool.includes('nastyplot') && !moves.has('defog');\n\t\t\treturn {cull: pulseIncompatible && !shiftryCase && counter.setupType !== 'Special'};\n\t\tcase 'suckerpunch':\n\t\t\treturn {cull:\n\t\t\t\t// Shiftry in No Dynamax would otherwise get Choice Scarf Sucker Punch sometimes.\n\t\t\t\t(isNoDynamax && species.id === 'shiftry' && moves.has('defog')) ||\n\t\t\t\tmoves.has('rest') ||\n\t\t\t\tcounter.damagingMoves.size < 2 ||\n\t\t\t\t(counter.setupType === 'Special') ||\n\t\t\t\t(counter.get('Dark') > 1 && !types.has('Dark')),\n\t\t\t};\n\t\tcase 'dazzlinggleam':\n\t\t\treturn {cull: ['fleurcannon', 'moonblast', 'petaldance'].some(m => moves.has(m))};\n\n\t\t// Status:\n\t\tcase 'bodyslam': case 'clearsmog':\n\t\t\tconst toxicCullCondition = moves.has('toxic') && !types.has('Normal');\n\t\t\treturn {cull: moves.has('sludgebomb') || moves.has('trick') || movePool.includes('recover') || toxicCullCondition};\n\t\tcase 'haze':\n\t\t\t// Special case for Corsola-Galar, which always wants Will-O-Wisp\n\t\t\treturn {cull: !teamDetails.stealthRock && (moves.has('stealthrock') || movePool.includes('stealthrock'))};\n\t\tcase 'hypnosis':\n\t\t\t// Special case for Xurkitree to properly split Blunder Policy and Choice item sets\n\t\t\treturn {cull: moves.has('voltswitch')};\n\t\tcase 'willowisp': case 'yawn':\n\t\t\t// Swords Dance is a special case for Rapidash\n\t\t\treturn {cull: moves.has('thunderwave') || moves.has('toxic') || moves.has('swordsdance')};\n\t\tcase 'painsplit': case 'recover': case 'synthesis':\n\t\t\treturn {cull: moves.has('rest') || moves.has('wish') || (move.id === 'synthesis' && moves.has('gigadrain'))};\n\t\tcase 'roost':\n\t\t\treturn {cull:\n\t\t\t\tmoves.has('throatchop') ||\n\t\t\t\t// Hawlucha doesn't want Roost + 3 attacks\n\t\t\t\t(moves.has('stoneedge') && species.id === 'hawlucha') ||\n\t\t\t\t// Special cases for Salamence, Dynaless Dragonite, and Scizor to help prevent sets with poor coverage or no setup.\n\t\t\t\t(moves.has('dualwingbeat') && (moves.has('outrage') || species.id === 'scizor')),\n\t\t\t};\n\t\tcase 'reflect': case 'lightscreen':\n\t\t\treturn {cull: !!teamDetails.screens};\n\t\tcase 'slackoff':\n\t\t\t// Special case to prevent Scaldless Slowking\n\t\t\treturn {cull: species.id === 'slowking' && !moves.has('scald')};\n\t\tcase 'substitute':\n\t\t\tconst moveBasedCull = ['bulkup', 'nastyplot', 'painsplit', 'roost', 'swordsdance'].some(m => movePool.includes(m));\n\t\t\t// Smaller formes of Gourgeist in Doubles don't want Poltergeist as their only attack\n\t\t\tconst doublesGourgeist = isDoubles && movePool.includes('powerwhip');\n\t\t\t// Calyrex wants Substitute + Leech Seed not Calm Mind + Leech Seed\n\t\t\tconst calmMindCullCondition = !counter.get('recovery') && movePool.includes('calmmind') && species.id !== 'calyrex';\n\t\t\t// Eiscue wants to always have Liquidation and Belly Drum\n\t\t\tconst eiscue = species.id === 'eiscue' && moves.has('zenheadbutt');\n\t\t\treturn {cull: moves.has('rest') || moveBasedCull || doublesGourgeist || calmMindCullCondition || eiscue};\n\t\tcase 'helpinghand':\n\t\t\t// Special case for Shuckle in Doubles, which doesn't want sets with no method to harm foes\n\t\t\treturn {cull: moves.has('acupressure')};\n\t\tcase 'wideguard':\n\t\t\treturn {cull: moves.has('protect')};\n\t\tcase 'grassknot':\n\t\t\t// Special case for Raichu and Heliolisk\n\t\t\treturn {cull: moves.has('surf')};\n\t\tcase 'icepunch':\n\t\t\t// Special case for Marshadow\n\t\t\treturn {cull: moves.has('rocktomb')};\n\t\tcase 'leechseed':\n\t\t\t// Special case for Calyrex to prevent Leech Seed + Calm Mind\n\t\t\treturn {cull: !!counter.setupType};\n\t\t}\n\n\t\treturn {cull: false};\n\t}\n\n\tshouldCullAbility(\n\t\tability: string,\n\t\ttypes: Set,\n\t\tmoves: Set,\n\t\tabilities: Set,\n\t\tcounter: MoveCounter,\n\t\tmovePool: string[],\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tpreferredType: string,\n\t\trole: RandomTeamsTypes.Role,\n\t\tisDoubles: boolean,\n\t\tisNoDynamax: boolean\n\t): boolean {\n\t\tif ([\n\t\t\t'Flare Boost', 'Hydration', 'Ice Body', 'Immunity', 'Innards Out', 'Insomnia', 'Misty Surge', 'Moody',\n\t\t\t'Perish Body', 'Quick Feet', 'Rain Dish', 'Snow Cloak', 'Steadfast', 'Steam Engine',\n\t\t].includes(ability)) return true;\n\n\t\tswitch (ability) {\n\t\t// Abilities which are primarily useful for certain moves\n\t\tcase 'Contrary': case 'Serene Grace': case 'Skill Link': case 'Strong Jaw':\n\t\t\treturn !counter.get(toID(ability));\n\t\tcase 'Analytic':\n\t\t\treturn (moves.has('rapidspin') || species.nfe || isDoubles);\n\t\tcase 'Blaze':\n\t\t\treturn (isDoubles && abilities.has('Solar Power')) || (!isDoubles && !isNoDynamax && species.id === 'charizard');\n\t\t// case 'Bulletproof': case 'Overcoat':\n\t\t// \treturn !!counter.setupType;\n\t\tcase 'Chlorophyll':\n\t\t\treturn (species.baseStats.spe > 100 || !counter.get('Fire') && !moves.has('sunnyday') && !teamDetails.sun);\n\t\tcase 'Cloud Nine':\n\t\t\treturn (!isNoDynamax || species.id !== 'golduck');\n\t\tcase 'Competitive':\n\t\t\treturn (counter.get('Special') < 2 || (moves.has('rest') && moves.has('sleeptalk')));\n\t\tcase 'Compound Eyes': case 'No Guard':\n\t\t\treturn !counter.get('inaccurate');\n\t\tcase 'Cursed Body':\n\t\t\treturn abilities.has('Infiltrator');\n\t\tcase 'Defiant':\n\t\t\treturn !counter.get('Physical');\n\t\tcase 'Download':\n\t\t\treturn (counter.damagingMoves.size < 3 || moves.has('trick'));\n\t\tcase 'Early Bird':\n\t\t\treturn (types.has('Grass') && isDoubles);\n\t\tcase 'Flash Fire':\n\t\t\treturn (this.dex.getEffectiveness('Fire', species) < -1 || abilities.has('Drought'));\n\t\tcase 'Gluttony':\n\t\t\treturn !moves.has('bellydrum');\n\t\tcase 'Guts':\n\t\t\treturn (!moves.has('facade') && !moves.has('sleeptalk') && !species.nfe);\n\t\tcase 'Harvest':\n\t\t\treturn (abilities.has('Frisk') && !isDoubles);\n\t\tcase 'Hustle': case 'Inner Focus':\n\t\t\treturn ((species.id !== 'glalie' && counter.get('Physical') < 2) || abilities.has('Iron Fist'));\n\t\tcase 'Infiltrator':\n\t\t\treturn (moves.has('rest') && moves.has('sleeptalk')) || (isDoubles && abilities.has('Clear Body'));\n\t\tcase 'Intimidate':\n\t\t\tif (species.id === 'salamence' && moves.has('dragondance')) return true;\n\t\t\treturn ['bodyslam', 'bounce', 'tripleaxel'].some(m => moves.has(m));\n\t\tcase 'Iron Fist':\n\t\t\treturn (counter.get('ironfist') < 2 || moves.has('dynamicpunch'));\n\t\tcase 'Justified':\n\t\t\treturn (isDoubles && abilities.has('Inner Focus'));\n\t\tcase 'Lightning Rod':\n\t\t\treturn (species.types.includes('Ground') || (!isNoDynamax && counter.setupType === 'Physical'));\n\t\tcase 'Limber':\n\t\t\treturn species.types.includes('Electric') || moves.has('facade');\n\t\tcase 'Liquid Voice':\n\t\t\treturn !moves.has('hypervoice');\n\t\tcase 'Magic Guard':\n\t\t\t// For Sigilyph\n\t\t\treturn (abilities.has('Tinted Lens') && !counter.get('Status') && !isDoubles);\n\t\tcase 'Mold Breaker':\n\t\t\treturn (\n\t\t\t\tabilities.has('Adaptability') || abilities.has('Scrappy') || (abilities.has('Unburden') && !!counter.setupType) ||\n\t\t\t\t(abilities.has('Sheer Force') && !!counter.get('sheerforce'))\n\t\t\t);\n\t\tcase 'Moxie':\n\t\t\treturn (counter.get('Physical') < 2 || moves.has('stealthrock') || moves.has('defog'));\n\t\tcase 'Overgrow':\n\t\t\treturn !counter.get('Grass');\n\t\tcase 'Own Tempo':\n\t\t\treturn !moves.has('petaldance');\n\t\tcase 'Power Construct':\n\t\t\treturn (species.forme === '10%' && !isDoubles);\n\t\tcase 'Prankster':\n\t\t\treturn !counter.get('Status');\n\t\tcase 'Pressure':\n\t\t\treturn (!!counter.setupType || counter.get('Status') < 2 || isDoubles);\n\t\tcase 'Refrigerate':\n\t\t\treturn !counter.get('Normal');\n\t\tcase 'Regenerator':\n\t\t\t// For Reuniclus\n\t\t\treturn abilities.has('Magic Guard');\n\t\tcase 'Reckless':\n\t\t\treturn !counter.get('recoil') || moves.has('curse');\n\t\tcase 'Rock Head':\n\t\t\treturn !counter.get('recoil');\n\t\tcase 'Sand Force': case 'Sand Veil':\n\t\t\treturn !teamDetails.sand;\n\t\tcase 'Sand Rush':\n\t\t\treturn (!teamDetails.sand && (isNoDynamax || !counter.setupType || !counter.get('Rock') || moves.has('rapidspin')));\n\t\tcase 'Sap Sipper':\n\t\t\t// For Drampa, which wants Berserk with Roost\n\t\t\treturn moves.has('roost');\n\t\tcase 'Scrappy':\n\t\t\treturn (moves.has('earthquake') && species.id === 'miltank');\n\t\tcase 'Screen Cleaner':\n\t\t\treturn !!teamDetails.screens;\n\t\tcase 'Shed Skin':\n\t\t\t// For Scrafty\n\t\t\treturn moves.has('dragondance');\n\t\tcase 'Sheer Force':\n\t\t\treturn (!counter.get('sheerforce') || abilities.has('Guts') || (species.id === 'druddigon' && !isDoubles));\n\t\tcase 'Shell Armor':\n\t\t\treturn (species.id === 'omastar' && (moves.has('spikes') || moves.has('stealthrock')));\n\t\tcase 'Slush Rush':\n\t\t\treturn (!teamDetails.hail && !abilities.has('Swift Swim'));\n\t\tcase 'Sniper':\n\t\t\t// Inteleon wants Torrent unless it is Gmax\n\t\t\treturn (species.name === 'Inteleon' || (counter.get('Water') > 1 && !moves.has('focusenergy')));\n\t\tcase 'Solar Power':\n\t\t\treturn (isNoDynamax && !teamDetails.sun);\n\t\tcase 'Speed Boost':\n\t\t\treturn (isNoDynamax && species.id === 'ninjask');\n\t\tcase 'Steely Spirit':\n\t\t\treturn (moves.has('fakeout') && !isDoubles);\n\t\tcase 'Sturdy':\n\t\t\treturn (moves.has('bulkup') || !!counter.get('recoil') || (!isNoDynamax && abilities.has('Solid Rock')));\n\t\tcase 'Swarm':\n\t\t\treturn (!counter.get('Bug') || !!counter.get('recovery'));\n\t\tcase 'Sweet Veil':\n\t\t\treturn types.has('Grass');\n\t\tcase 'Swift Swim':\n\t\t\tif (isNoDynamax) {\n\t\t\t\tconst neverWantsSwim = !moves.has('raindance') && [\n\t\t\t\t\t'Intimidate', 'Rock Head', 'Water Absorb',\n\t\t\t\t].some(m => abilities.has(m));\n\t\t\t\tconst noSwimIfNoRain = !moves.has('raindance') && [\n\t\t\t\t\t'Cloud Nine', 'Lightning Rod', 'Intimidate', 'Rock Head', 'Sturdy', 'Water Absorb', 'Weak Armor',\n\t\t\t\t].some(m => abilities.has(m));\n\t\t\t\treturn teamDetails.rain ? neverWantsSwim : noSwimIfNoRain;\n\t\t\t}\n\t\t\treturn (!moves.has('raindance') && (\n\t\t\t\t['Intimidate', 'Rock Head', 'Slush Rush', 'Water Absorb'].some(abil => abilities.has(abil)) ||\n\t\t\t\t(abilities.has('Lightning Rod') && !counter.setupType)\n\t\t\t));\n\t\tcase 'Synchronize':\n\t\t\treturn counter.get('Status') < 3;\n\t\tcase 'Technician':\n\t\t\treturn (\n\t\t\t\t!counter.get('technician') ||\n\t\t\t\tmoves.has('tailslap') ||\n\t\t\t\tabilities.has('Punk Rock') ||\n\t\t\t\t// For Doubles Alolan Persian\n\t\t\t\tmovePool.includes('snarl')\n\t\t\t);\n\t\tcase 'Tinted Lens':\n\t\t\treturn (\n\t\t\t\t// For Sigilyph\n\t\t\t\tmoves.has('defog') ||\n\t\t\t\t// For Butterfree\n\t\t\t\t(moves.has('hurricane') && abilities.has('Compound Eyes')) ||\n\t\t\t\t(counter.get('Status') > 2 && !counter.setupType)\n\t\t\t);\n\t\tcase 'Torrent':\n\t\t\t// For Inteleon-Gmax and Primarina\n\t\t\treturn (moves.has('focusenergy') || moves.has('hypervoice'));\n\t\tcase 'Tough Claws':\n\t\t\t// For Perrserker\n\t\t\treturn (types.has('Steel') && !moves.has('fakeout'));\n\t\tcase 'Unaware':\n\t\t\t// For Swoobat and Clefable\n\t\t\treturn (!!counter.setupType || moves.has('fireblast'));\n\t\tcase 'Unburden':\n\t\t\treturn (abilities.has('Prankster') || !counter.setupType && !isDoubles);\n\t\tcase 'Volt Absorb':\n\t\t\treturn (this.dex.getEffectiveness('Electric', species) < -1);\n\t\tcase 'Water Absorb':\n\t\t\treturn (\n\t\t\t\tmoves.has('raindance') ||\n\t\t\t\t['Drizzle', 'Strong Jaw', 'Unaware', 'Volt Absorb'].some(abil => abilities.has(abil))\n\t\t\t);\n\t\tcase 'Weak Armor':\n\t\t\t// The Speed less than 50 case is intended for Cursola, but could apply to any slow Pok\u00E9mon.\n\t\t\treturn (\n\t\t\t\t(!isNoDynamax && species.baseStats.spe > 50) ||\n\t\t\t\tspecies.id === 'skarmory' ||\n\t\t\t\tmoves.has('shellsmash') || moves.has('rapidspin')\n\t\t\t);\n\t\t}\n\n\t\treturn false;\n\t}\n\n\n\tgetAbility(\n\t\ttypes: Set,\n\t\tmoves: Set,\n\t\tabilities: Set,\n\t\tcounter: MoveCounter,\n\t\tmovePool: string[],\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tpreferredType: string,\n\t\trole: RandomTeamsTypes.Role,\n\t\tisDoubles: boolean,\n\t\tisNoDynamax: boolean\n\t): string {\n\t\tconst abilityData = Array.from(abilities).map(a => this.dex.abilities.get(a));\n\t\tUtils.sortBy(abilityData, abil => -abil.rating);\n\n\t\tif (abilityData.length <= 1) return abilityData[0].name;\n\n\t\t// Hard-code abilities here\n\n\t\t// Lopunny, and other Facade users, don't want Limber, even if other abilities are poorly rated,\n\t\t// since paralysis would arguably be good for them.\n\t\tif (species.id === 'lopunny' && moves.has('facade')) return 'Cute Charm';\n\t\tif (species.id === 'copperajahgmax') return 'Heavy Metal';\n\t\tif (abilities.has('Guts') &&\n\t\t\t// for Ursaring in BDSP\n\t\t\t!abilities.has('Quick Feet') && (\n\t\t\tspecies.id === 'gurdurr' || species.id === 'throh' ||\n\t\t\tmoves.has('facade') || (moves.has('rest') && moves.has('sleeptalk'))\n\t\t)) return 'Guts';\n\t\tif (abilities.has('Moxie') && (counter.get('Physical') > 3 || moves.has('bounce')) && !isDoubles) return 'Moxie';\n\n\t\tif (isDoubles) {\n\t\t\tif (abilities.has('Competitive') && !abilities.has('Shadow Tag') && !abilities.has('Strong Jaw')) return 'Competitive';\n\t\t\tif (abilities.has('Friend Guard')) return 'Friend Guard';\n\t\t\tif (abilities.has('Gluttony') && moves.has('recycle')) return 'Gluttony';\n\t\t\tif (abilities.has('Guts')) return 'Guts';\n\t\t\tif (abilities.has('Harvest')) return 'Harvest';\n\t\t\tif (abilities.has('Healer') && (\n\t\t\t\tabilities.has('Natural Cure') ||\n\t\t\t\t(abilities.has('Aroma Veil') && this.randomChance(1, 2))\n\t\t\t)) return 'Healer';\n\t\t\tif (abilities.has('Intimidate')) return 'Intimidate';\n\t\t\tif (species.id === 'lopunny') return 'Klutz';\n\t\t\tif (abilities.has('Magic Guard') && !abilities.has('Unaware')) return 'Magic Guard';\n\t\t\tif (abilities.has('Ripen')) return 'Ripen';\n\t\t\tif (abilities.has('Stalwart')) return 'Stalwart';\n\t\t\tif (abilities.has('Storm Drain')) return 'Storm Drain';\n\t\t\tif (abilities.has('Telepathy') && (abilities.has('Pressure') || abilities.has('Analytic'))) return 'Telepathy';\n\t\t}\n\n\t\tlet abilityAllowed: Ability[] = [];\n\t\t// Obtain a list of abilities that are allowed (not culled)\n\t\tfor (const ability of abilityData) {\n\t\t\tif (ability.rating >= 1 && !this.shouldCullAbility(\n\t\t\t\tability.name, types, moves, abilities, counter, movePool, teamDetails, species, '', '', isDoubles, isNoDynamax\n\t\t\t)) {\n\t\t\t\tabilityAllowed.push(ability);\n\t\t\t}\n\t\t}\n\n\t\t// If all abilities are rejected, re-allow all abilities\n\t\tif (!abilityAllowed.length) {\n\t\t\tfor (const ability of abilityData) {\n\t\t\t\tif (ability.rating > 0) abilityAllowed.push(ability);\n\t\t\t}\n\t\t\tif (!abilityAllowed.length) abilityAllowed = abilityData;\n\t\t}\n\n\t\tif (abilityAllowed.length === 1) return abilityAllowed[0].name;\n\t\t// Sort abilities by rating with an element of randomness\n\t\t// All three abilities can be chosen\n\t\tif (abilityAllowed[2] && abilityAllowed[0].rating - 0.5 <= abilityAllowed[2].rating) {\n\t\t\tif (abilityAllowed[1].rating <= abilityAllowed[2].rating) {\n\t\t\t\tif (this.randomChance(1, 2)) [abilityAllowed[1], abilityAllowed[2]] = [abilityAllowed[2], abilityAllowed[1]];\n\t\t\t} else {\n\t\t\t\tif (this.randomChance(1, 3)) [abilityAllowed[1], abilityAllowed[2]] = [abilityAllowed[2], abilityAllowed[1]];\n\t\t\t}\n\t\t\tif (abilityAllowed[0].rating <= abilityAllowed[1].rating) {\n\t\t\t\tif (this.randomChance(2, 3)) [abilityAllowed[0], abilityAllowed[1]] = [abilityAllowed[1], abilityAllowed[0]];\n\t\t\t} else {\n\t\t\t\tif (this.randomChance(1, 2)) [abilityAllowed[0], abilityAllowed[1]] = [abilityAllowed[1], abilityAllowed[0]];\n\t\t\t}\n\t\t} else {\n\t\t\t// Third ability cannot be chosen\n\t\t\tif (abilityAllowed[0].rating <= abilityAllowed[1].rating) {\n\t\t\t\tif (this.randomChance(1, 2)) [abilityAllowed[0], abilityAllowed[1]] = [abilityAllowed[1], abilityAllowed[0]];\n\t\t\t} else if (abilityAllowed[0].rating - 0.5 <= abilityAllowed[1].rating) {\n\t\t\t\tif (this.randomChance(1, 3)) [abilityAllowed[0], abilityAllowed[1]] = [abilityAllowed[1], abilityAllowed[0]];\n\t\t\t}\n\t\t}\n\n\t\t// After sorting, choose the first ability\n\t\treturn abilityAllowed[0].name;\n\t}\n\n\tgetHighPriorityItem(\n\t\tability: string,\n\t\ttypes: Set,\n\t\tmoves: Set,\n\t\tcounter: MoveCounter,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tisLead: boolean,\n\t\tisDoubles: boolean\n\t) {\n\t\t// not undefined \u2014 we want \"no item\" not \"go find a different item\"\n\t\tif (moves.has('acrobatics') && ability !== 'Ripen') return ability === 'Grassy Surge' ? 'Grassy Seed' : '';\n\t\tif (moves.has('geomancy') || moves.has('meteorbeam')) return 'Power Herb';\n\t\tif (moves.has('shellsmash')) {\n\t\t\tif (ability === 'Sturdy' && !isLead && !isDoubles) return 'Heavy-Duty Boots';\n\t\t\t// Shell Smash + Solid Rock is intended for Carracosta, but I think\n\t\t\t// any Pok\u00E9mon which can take a SE hit via Solid Rock deserves to have\n\t\t\t// its Shell Smash considered a good enough speed setup move for WP.\n\t\t\tif (ability === 'Solid Rock') return 'Weakness Policy';\n\t\t\treturn 'White Herb';\n\t\t}\n\t\t// Techno Blast should always be Water-type\n\t\tif (moves.has('technoblast')) return 'Douse Drive';\n\t\t// Species-specific logic\n\t\tif (\n\t\t\t['Corsola', 'Garchomp', 'Tangrowth'].includes(species.name) &&\n\t\t\tcounter.get('Status') &&\n\t\t\t!counter.setupType &&\n\t\t\t!isDoubles\n\t\t) return 'Rocky Helmet';\n\n\t\tif (species.name === 'Eternatus' && counter.get('Status') < 2) return 'Metronome';\n\t\tif (species.name === 'Farfetch\\u2019d') return 'Leek';\n\t\tif (species.name === 'Froslass' && !isDoubles) return 'Wide Lens';\n\t\tif (species.name === 'Latios' && counter.get('Special') === 2 && !isDoubles) return 'Soul Dew';\n\t\tif (species.name === 'Lopunny') return isDoubles ? 'Iron Ball' : 'Toxic Orb';\n\t\tif (species.baseSpecies === 'Marowak') return 'Thick Club';\n\t\tif (species.baseSpecies === 'Pikachu') return 'Light Ball';\n\t\tif (species.name === 'Regieleki' && !isDoubles) return 'Magnet';\n\t\tif (species.name === 'Shedinja') {\n\t\t\tconst noSash = !teamDetails.defog && !teamDetails.rapidSpin && !isDoubles;\n\t\t\treturn noSash ? 'Heavy-Duty Boots' : 'Focus Sash';\n\t\t}\n\t\tif (species.name === 'Shuckle' && moves.has('stickyweb')) return 'Mental Herb';\n\t\tif (species.name === 'Unfezant' || moves.has('focusenergy')) return 'Scope Lens';\n\t\tif (species.name === 'Pincurchin') return 'Shuca Berry';\n\t\tif (species.name === 'Wobbuffet' && moves.has('destinybond')) return 'Custap Berry';\n\t\tif (species.name === 'Scyther' && counter.damagingMoves.size > 3) return 'Choice Band';\n\t\tif (species.name === 'Cinccino' && !moves.has('uturn')) return 'Life Orb';\n\t\tif (moves.has('bellydrum') && moves.has('substitute')) return 'Salac Berry';\n\n\t\t// Misc item generation logic\n\t\tconst HDBBetterThanEviolite = (\n\t\t\t!isDoubles &&\n\t\t\t(!isLead || moves.has('uturn')) &&\n\t\t\tthis.dex.getEffectiveness('Rock', species) >= 2\n\t\t);\n\t\tif (species.nfe) return HDBBetterThanEviolite ? 'Heavy-Duty Boots' : 'Eviolite';\n\n\t\t// Ability based logic and miscellaneous logic\n\t\tif (species.name === 'Wobbuffet' || ['Cheek Pouch', 'Harvest', 'Ripen'].includes(ability)) return 'Sitrus Berry';\n\t\tif (ability === 'Gluttony') return this.sample(['Aguav', 'Figy', 'Iapapa', 'Mago', 'Wiki']) + ' Berry';\n\t\tif (\n\t\t\tability === 'Imposter' ||\n\t\t\t(ability === 'Magnet Pull' && moves.has('bodypress') && !isDoubles)\n\t\t) return 'Choice Scarf';\n\t\tif (\n\t\t\tability === 'Guts' &&\n\t\t\t(counter.get('Physical') > 2 || isDoubles)\n\t\t) {\n\t\t\treturn types.has('Fire') ? 'Toxic Orb' : 'Flame Orb';\n\t\t}\n\t\tif (ability === 'Magic Guard' && counter.damagingMoves.size > 1) {\n\t\t\treturn moves.has('counter') ? 'Focus Sash' : 'Life Orb';\n\t\t}\n\t\tif (ability === 'Sheer Force' && counter.get('sheerforce')) return 'Life Orb';\n\t\tif (ability === 'Unburden') return (moves.has('closecombat') || moves.has('curse')) ? 'White Herb' : 'Sitrus Berry';\n\n\t\tif (moves.has('trick') || (moves.has('switcheroo') && !isDoubles) || ability === 'Gorilla Tactics') {\n\t\t\tif (species.baseStats.spe >= 60 && species.baseStats.spe <= 108 && !counter.get('priority') && ability !== 'Triage') {\n\t\t\t\treturn 'Choice Scarf';\n\t\t\t} else {\n\t\t\t\treturn (counter.get('Physical') > counter.get('Special')) ? 'Choice Band' : 'Choice Specs';\n\t\t\t}\n\t\t}\n\t\tif (moves.has('auroraveil') || moves.has('lightscreen') && moves.has('reflect')) return 'Light Clay';\n\t\tif (moves.has('rest') && !moves.has('sleeptalk') && ability !== 'Shed Skin') return 'Chesto Berry';\n\t\tif (moves.has('hypnosis') && ability === 'Beast Boost') return 'Blunder Policy';\n\t\tif (moves.has('bellydrum')) return 'Sitrus Berry';\n\n\t\tif (this.dex.getEffectiveness('Rock', species) >= 2 && !isDoubles) {\n\t\t\treturn 'Heavy-Duty Boots';\n\t\t}\n\t}\n\n\t/** Item generation specific to Random Doubles */\n\tgetDoublesItem(\n\t\tability: string,\n\t\ttypes: Set,\n\t\tmoves: Set,\n\t\tabilities: Set,\n\t\tcounter: MoveCounter,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t): string | undefined {\n\t\tconst defensiveStatTotal = species.baseStats.hp + species.baseStats.def + species.baseStats.spd;\n\n\t\tif (\n\t\t\t(['dragonenergy', 'eruption', 'waterspout'].some(m => moves.has(m))) &&\n\t\t\tcounter.damagingMoves.size >= 4\n\t\t) return 'Choice Scarf';\n\t\tif (moves.has('blizzard') && ability !== 'Snow Warning' && !teamDetails.hail) return 'Blunder Policy';\n\t\tif (this.dex.getEffectiveness('Rock', species) >= 2 && !types.has('Flying')) return 'Heavy-Duty Boots';\n\t\tif (counter.get('Physical') >= 4 && ['fakeout', 'feint', 'rapidspin', 'suckerpunch'].every(m => !moves.has(m)) && (\n\t\t\ttypes.has('Dragon') || types.has('Fighting') || types.has('Rock') ||\n\t\t\tmoves.has('flipturn') || moves.has('uturn')\n\t\t)) {\n\t\t\treturn (\n\t\t\t\t!counter.get('priority') && !abilities.has('Speed Boost') &&\n\t\t\t\tspecies.baseStats.spe >= 60 && species.baseStats.spe <= 100 &&\n\t\t\t\tthis.randomChance(1, 2)\n\t\t\t) ? 'Choice Scarf' : 'Choice Band';\n\t\t}\n\t\tif (\n\t\t\t(\n\t\t\t\tcounter.get('Special') >= 4 &&\n\t\t\t\t(types.has('Dragon') || types.has('Fighting') || types.has('Rock') || moves.has('voltswitch'))\n\t\t\t) || (\n\t\t\t\t(counter.get('Special') >= 3 && (moves.has('flipturn') || moves.has('uturn'))) &&\n\t\t\t\t!moves.has('acidspray') && !moves.has('electroweb')\n\t\t\t)\n\t\t) {\n\t\t\treturn (\n\t\t\t\tspecies.baseStats.spe >= 60 && species.baseStats.spe <= 100 && this.randomChance(1, 2)\n\t\t\t) ? 'Choice Scarf' : 'Choice Specs';\n\t\t}\n\t\t// This one is intentionally below the Choice item checks.\n\t\tif ((defensiveStatTotal < 250 && ability === 'Regenerator') || species.name === 'Pheromosa') return 'Life Orb';\n\t\tif (counter.damagingMoves.size >= 4 && defensiveStatTotal >= 275) return 'Assault Vest';\n\t\tif (\n\t\t\tcounter.damagingMoves.size >= 3 &&\n\t\t\tspecies.baseStats.spe >= 60 &&\n\t\t\tability !== 'Multiscale' && ability !== 'Sturdy' &&\n\t\t\t[\n\t\t\t\t'acidspray', 'clearsmog', 'electroweb', 'fakeout', 'feint', 'icywind',\n\t\t\t\t'incinerate', 'naturesmadness', 'rapidspin', 'snarl', 'uturn',\n\t\t\t].every(m => !moves.has(m))\n\t\t) return (ability === 'Defeatist' || defensiveStatTotal >= 275) ? 'Sitrus Berry' : 'Life Orb';\n\t}\n\n\tgetMediumPriorityItem(\n\t\tability: string,\n\t\tmoves: Set,\n\t\tcounter: MoveCounter,\n\t\tspecies: Species,\n\t\tisLead: boolean,\n\t\tisDoubles: boolean,\n\t\tisNoDynamax: boolean\n\t): string | undefined {\n\t\tconst defensiveStatTotal = species.baseStats.hp + species.baseStats.def + species.baseStats.spd;\n\n\t\t// Choice items\n\t\tif (\n\t\t\t!isDoubles && counter.get('Physical') >= 4 && ability !== 'Serene Grace' &&\n\t\t\t['fakeout', 'flamecharge', 'rapidspin'].every(m => !moves.has(m))\n\t\t) {\n\t\t\tconst scarfReqs = (\n\t\t\t\t(species.baseStats.atk >= 100 || ability === 'Huge Power') &&\n\t\t\t\tspecies.baseStats.spe >= 60 && species.baseStats.spe <= 108 &&\n\t\t\t\tability !== 'Speed Boost' && !counter.get('priority') &&\n\t\t\t\t(isNoDynamax || ['bounce', 'dualwingbeat'].every(m => !moves.has(m)))\n\t\t\t);\n\t\t\treturn (scarfReqs && this.randomChance(2, 3)) ? 'Choice Scarf' : 'Choice Band';\n\t\t}\n\t\tif (!isDoubles && (\n\t\t\t(counter.get('Special') >= 4 && !moves.has('futuresight')) ||\n\t\t\t(counter.get('Special') >= 3 && ['flipturn', 'partingshot', 'uturn'].some(m => moves.has(m)))\n\t\t)) {\n\t\t\tconst scarfReqs = (\n\t\t\t\tspecies.baseStats.spa >= 100 &&\n\t\t\t\tspecies.baseStats.spe >= 60 && species.baseStats.spe <= 108 &&\n\t\t\t\tability !== 'Tinted Lens' && !counter.get('Physical')\n\t\t\t);\n\t\t\treturn (scarfReqs && this.randomChance(2, 3)) ? 'Choice Scarf' : 'Choice Specs';\n\t\t}\n\t\tif (\n\t\t\t!isDoubles &&\n\t\t\tcounter.get('Physical') >= 3 &&\n\t\t\t!moves.has('rapidspin') &&\n\t\t\t['copycat', 'memento', 'partingshot'].some(m => moves.has(m))\n\t\t) return 'Choice Band';\n\t\tif (\n\t\t\t!isDoubles &&\n\t\t\t((counter.get('Physical') >= 3 && moves.has('defog')) || (counter.get('Special') >= 3 && moves.has('healingwish'))) &&\n\t\t\t!counter.get('priority') && !moves.has('uturn')\n\t\t) return 'Choice Scarf';\n\n\t\t// Palkia sometimes wants Choice items instead\n\t\tif (species.name === 'Palkia') return 'Lustrous Orb';\n\n\t\t// Other items\n\t\tif (\n\t\t\tmoves.has('raindance') || moves.has('sunnyday') ||\n\t\t\t(ability === 'Speed Boost' && !counter.get('hazards')) ||\n\t\t\t(ability === 'Stance Change' && counter.damagingMoves.size >= 3)\n\t\t) return 'Life Orb';\n\t\tif (\n\t\t\t!isDoubles &&\n\t\t\tthis.dex.getEffectiveness('Rock', species) >= 1 && (\n\t\t\t\t['Defeatist', 'Emergency Exit', 'Multiscale'].includes(ability) ||\n\t\t\t\t['courtchange', 'defog', 'rapidspin'].some(m => moves.has(m))\n\t\t\t)\n\t\t) return 'Heavy-Duty Boots';\n\t\tif (species.name === 'Necrozma-Dusk-Mane' || (\n\t\t\tthis.dex.getEffectiveness('Ground', species) < 2 &&\n\t\t\tcounter.get('speedsetup') &&\n\t\t\tcounter.damagingMoves.size >= 3 &&\n\t\t\tdefensiveStatTotal >= 300\n\t\t)) return 'Weakness Policy';\n\t\tif (counter.damagingMoves.size >= 4 && defensiveStatTotal >= 235) return 'Assault Vest';\n\t\tif (\n\t\t\t['clearsmog', 'curse', 'haze', 'healbell', 'protect', 'sleeptalk', 'strangesteam'].some(m => moves.has(m)) &&\n\t\t\t!isDoubles\n\t\t) return 'Leftovers';\n\t}\n\n\tgetLowPriorityItem(\n\t\tability: string,\n\t\ttypes: Set,\n\t\tmoves: Set,\n\t\tabilities: Set,\n\t\tcounter: MoveCounter,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tisLead: boolean,\n\t\tisDoubles: boolean,\n\t\tisNoDynamax: boolean\n\t): string | undefined {\n\t\tconst defensiveStatTotal = species.baseStats.hp + species.baseStats.def + species.baseStats.spd;\n\n\t\tif (\n\t\t\tisLead && !isDoubles &&\n\t\t\t!['Disguise', 'Sturdy'].includes(ability) && !moves.has('substitute') &&\n\t\t\t!counter.get('drain') && !counter.get('recoil') && !counter.get('recovery') &&\n\t\t\t((defensiveStatTotal <= 250 && counter.get('hazards')) || defensiveStatTotal <= 210)\n\t\t) return 'Focus Sash';\n\t\tif (\n\t\t\tmoves.has('clangoroussoul') ||\n\t\t\t// We manually check for speed-boosting moves, rather than using `counter.get('speedsetup')`,\n\t\t\t// because we want to check for ANY speed boosting move.\n\t\t\t// In particular, Shift Gear + Boomburst Toxtricity should get Throat Spray.\n\t\t\t(moves.has('boomburst') && Array.from(moves).some(m => Dex.moves.get(m).boosts?.spe))\n\t\t) return 'Throat Spray';\n\n\t\tconst rockWeaknessCase = (\n\t\t\tthis.dex.getEffectiveness('Rock', species) >= 1 &&\n\t\t\t(!teamDetails.defog || ability === 'Intimidate' || moves.has('uturn') || moves.has('voltswitch'))\n\t\t);\n\t\tconst spinnerCase = (moves.has('rapidspin') && (ability === 'Regenerator' || !!counter.get('recovery')));\n\t\tif (!isDoubles && (rockWeaknessCase || spinnerCase)) return 'Heavy-Duty Boots';\n\n\t\tif (\n\t\t\t!isDoubles && this.dex.getEffectiveness('Ground', species) >= 2 && !types.has('Poison') &&\n\t\t\tability !== 'Levitate' && !abilities.has('Iron Barbs')\n\t\t) return 'Air Balloon';\n\t\tif (\n\t\t\t!isDoubles &&\n\t\t\tcounter.damagingMoves.size >= 3 &&\n\t\t\t!counter.get('damage') &&\n\t\t\tability !== 'Sturdy' &&\n\t\t\t(species.baseStats.spe >= 90 || !moves.has('voltswitch')) &&\n\t\t\t['foulplay', 'rapidspin', 'substitute', 'uturn'].every(m => !moves.has(m)) && (\n\t\t\t\tcounter.get('speedsetup') ||\n\t\t\t\t// No Dynamax Buzzwole doesn't want Life Orb with Bulk Up + 3 attacks\n\t\t\t\t(counter.get('drain') && (!isNoDynamax || species.id !== 'buzzwole' || moves.has('roost'))) ||\n\t\t\t\tmoves.has('trickroom') || moves.has('psystrike') ||\n\t\t\t\t(species.baseStats.spe > 40 && defensiveStatTotal < 275)\n\t\t\t)\n\t\t) return 'Life Orb';\n\t\tif (\n\t\t\t!isDoubles &&\n\t\t\tcounter.damagingMoves.size >= 4 &&\n\t\t\t!counter.get('Dragon') &&\n\t\t\t!counter.get('Normal')\n\t\t) {\n\t\t\treturn 'Expert Belt';\n\t\t}\n\t\tif (\n\t\t\t!isDoubles &&\n\t\t\t!moves.has('substitute') &&\n\t\t\t(moves.has('dragondance') || moves.has('swordsdance')) &&\n\t\t\t(moves.has('outrage') || (\n\t\t\t\t['Bug', 'Fire', 'Ground', 'Normal', 'Poison'].every(type => !types.has(type)) &&\n\t\t\t\t!['Pastel Veil', 'Storm Drain'].includes(ability)\n\t\t\t))\n\t\t) return 'Lum Berry';\n\t}\n\n\tgetLevel(\n\t\tspecies: Species,\n\t\tisDoubles: boolean,\n\t\tisNoDynamax: boolean,\n\t): number {\n\t\tconst data = this.randomData[species.id];\n\t\t// level set by rules\n\t\tif (this.adjustLevel) return this.adjustLevel;\n\t\t// doubles levelling\n\t\tif (isDoubles && data.doublesLevel) return data.doublesLevel;\n\t\t// No Dmax levelling\n\t\tif (isNoDynamax) {\n\t\t\tconst tier = species.name.endsWith('-Gmax') ? this.dex.species.get(species.changesFrom).tier : species.tier;\n\t\t\tconst tierScale: Partial> = {\n\t\t\t\tUber: 76,\n\t\t\t\tOU: 80,\n\t\t\t\tUUBL: 81,\n\t\t\t\tUU: 82,\n\t\t\t\tRUBL: 83,\n\t\t\t\tRU: 84,\n\t\t\t\tNUBL: 85,\n\t\t\t\tNU: 86,\n\t\t\t\tPUBL: 87,\n\t\t\t\tPU: 88, \"(PU)\": 88, NFE: 88,\n\t\t\t};\n\t\t\tconst customScale: {[k: string]: number} = {\n\t\t\t\t// These Pokemon are too strong and need a lower level\n\t\t\t\tzaciancrowned: 65, calyrexshadow: 68, xerneas: 70, necrozmaduskmane: 72, zacian: 72, kyogre: 73, eternatus: 73,\n\t\t\t\tzekrom: 74, marshadow: 75, urshifurapidstrike: 79, haxorus: 80, inteleon: 80,\n\t\t\t\tcresselia: 83, jolteon: 84, swoobat: 84, dugtrio: 84, slurpuff: 84, polteageist: 84,\n\t\t\t\twobbuffet: 86, scrafty: 86,\n\t\t\t\t// These Pokemon are too weak and need a higher level\n\t\t\t\tdelibird: 100, vespiquen: 96, pikachu: 92, shedinja: 92, solrock: 90, arctozolt: 88, reuniclus: 87,\n\t\t\t\tdecidueye: 87, noivern: 85, magnezone: 82, slowking: 81,\n\t\t\t};\n\t\t\treturn customScale[species.id] || tierScale[tier] || 80;\n\t\t}\n\t\t// BDSP tier levelling\n\t\tif (this.dex.currentMod === 'gen8bdsp') {\n\t\t\tconst tierScale: Partial> = {\n\t\t\t\tUber: 76, Unreleased: 76,\n\t\t\t\tOU: 80,\n\t\t\t\tUUBL: 81,\n\t\t\t\tUU: 82,\n\t\t\t\tRUBL: 83,\n\t\t\t\tRU: 84,\n\t\t\t\tNUBL: 85,\n\t\t\t\tNU: 86,\n\t\t\t\tPUBL: 87,\n\t\t\t\tPU: 88, \"(PU)\": 88, NFE: 88,\n\t\t\t};\n\t\t\tconst customScale: {[k: string]: number} = {\n\t\t\t\tdelibird: 100, dugtrio: 76, glalie: 76, luvdisc: 100, spinda: 100, unown: 100,\n\t\t\t};\n\n\t\t\treturn customScale[species.id] || tierScale[species.tier] || 80;\n\t\t}\n\t\t// Arbitrary levelling base on data files (typically winrate-influenced)\n\t\tif (data.level) return data.level;\n\t\t// Finally default to level 80\n\t\treturn 80;\n\t}\n\n\tgetForme(species: Species): string {\n\t\tif (typeof species.battleOnly === 'string') {\n\t\t\t// Only change the forme. The species has custom moves, and may have different typing and requirements.\n\t\t\treturn species.battleOnly;\n\t\t}\n\t\tif (species.cosmeticFormes) return this.sample([species.name].concat(species.cosmeticFormes));\n\t\tif (species.name.endsWith('-Gmax')) return species.name.slice(0, -5);\n\n\t\t// Consolidate mostly-cosmetic formes, at least for the purposes of Random Battles\n\t\tif (['Magearna', 'Polteageist', 'Zarude'].includes(species.baseSpecies)) {\n\t\t\treturn this.sample([species.name].concat(species.otherFormes!));\n\t\t}\n\t\tif (species.baseSpecies === 'Basculin') return 'Basculin' + this.sample(['', '-Blue-Striped']);\n\t\tif (species.baseSpecies === 'Keldeo' && this.gen <= 7) return 'Keldeo' + this.sample(['', '-Resolute']);\n\t\tif (species.baseSpecies === 'Pikachu' && this.dex.currentMod === 'gen8') {\n\t\t\treturn 'Pikachu' + this.sample(\n\t\t\t\t['', '-Original', '-Hoenn', '-Sinnoh', '-Unova', '-Kalos', '-Alola', '-Partner', '-World']\n\t\t\t);\n\t\t}\n\t\treturn species.name;\n\t}\n\n\trandomSet(\n\t\tspecies: string | Species,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails = {},\n\t\tisLead = false,\n\t\tisDoubles = false,\n\t\tisNoDynamax = false\n\t): RandomTeamsTypes.RandomSet {\n\t\tspecies = this.dex.species.get(species);\n\t\tconst forme = this.getForme(species);\n\t\tconst gmax = species.name.endsWith('-Gmax');\n\n\t\tconst data = this.randomData[species.id];\n\n\t\tconst randMoves =\n\t\t\t(isDoubles && data.doublesMoves) ||\n\t\t\t(isNoDynamax && data.noDynamaxMoves) ||\n\t\t\tdata.moves;\n\t\tconst movePool: string[] = [...(randMoves || this.dex.species.getMovePool(species.id))];\n\t\tif (this.format.playerCount > 2) {\n\t\t\t// Random Multi Battle uses doubles move pools, but Ally Switch fails in multi battles\n\t\t\t// Random Free-For-All also uses doubles move pools, for now\n\t\t\tconst allySwitch = movePool.indexOf('allyswitch');\n\t\t\tif (allySwitch > -1) {\n\t\t\t\tif (movePool.length > this.maxMoveCount) {\n\t\t\t\t\tthis.fastPop(movePool, allySwitch);\n\t\t\t\t} else {\n\t\t\t\t\t// Ideally, we'll never get here, but better to have a move that usually does nothing than one that always does\n\t\t\t\t\tmovePool[allySwitch] = 'sleeptalk';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst rejectedPool = [];\n\t\tlet ability = '';\n\t\tlet item = undefined;\n\n\t\tconst evs = {hp: 85, atk: 85, def: 85, spa: 85, spd: 85, spe: 85};\n\t\tconst ivs = {hp: 31, atk: 31, def: 31, spa: 31, spd: 31, spe: 31};\n\n\t\tconst types = new Set(species.types);\n\t\tconst abilities = new Set(Object.values(species.abilities));\n\t\tif (species.unreleasedHidden) abilities.delete(species.abilities.H);\n\n\t\tconst moves = new Set();\n\t\tlet counter: MoveCounter;\n\t\t// This is just for BDSP Unown;\n\t\t// it can be removed from this file if BDSP gets its own random-teams file in the future.\n\t\tlet hasHiddenPower = false;\n\n\t\tdo {\n\t\t\t// Choose next 4 moves from learnset/viable moves and add them to moves list:\n\t\t\tconst pool = (movePool.length ? movePool : rejectedPool);\n\t\t\twhile (moves.size < this.maxMoveCount && pool.length) {\n\t\t\t\tconst moveid = this.sampleNoReplace(pool);\n\t\t\t\tif (moveid.startsWith('hiddenpower')) {\n\t\t\t\t\tif (hasHiddenPower) continue;\n\t\t\t\t\thasHiddenPower = true;\n\t\t\t\t}\n\t\t\t\tmoves.add(moveid);\n\t\t\t}\n\n\t\t\tcounter = this.queryMoves(moves, species.types, abilities, movePool);\n\t\t\tconst runEnforcementChecker = (checkerName: string) => {\n\t\t\t\tif (!this.moveEnforcementCheckers[checkerName]) return false;\n\t\t\t\treturn this.moveEnforcementCheckers[checkerName](\n\t\t\t\t\tmovePool, moves, abilities, types, counter, species as Species, teamDetails\n\t\t\t\t);\n\t\t\t};\n\n\t\t\t// Iterate through the moves again, this time to cull them:\n\t\t\tfor (const moveid of moves) {\n\t\t\t\tconst move = this.dex.moves.get(moveid);\n\t\t\t\tlet {cull, isSetup} = this.shouldCullMove(\n\t\t\t\t\tmove, types, moves, abilities, counter,\n\t\t\t\t\tmovePool, teamDetails, species, isLead, isDoubles, isNoDynamax\n\t\t\t\t);\n\n\t\t\t\tif (move.id !== 'photongeyser' && (\n\t\t\t\t\t(move.category === 'Physical' && counter.setupType === 'Special') ||\n\t\t\t\t\t(move.category === 'Special' && counter.setupType === 'Physical')\n\t\t\t\t)) {\n\t\t\t\t\t// Reject STABs last in case the setup type changes later on\n\t\t\t\t\tconst stabs = counter.get(species.types[0]) + (species.types[1] ? counter.get(species.types[1]) : 0);\n\t\t\t\t\tif (!types.has(move.type) || stabs > 1 || counter.get(move.category) < 2) cull = true;\n\t\t\t\t}\n\n\t\t\t\t// Pokemon should have moves that benefit their types, stats, or ability\n\t\t\t\tconst isLowBP = move.basePower && move.basePower < 50;\n\n\t\t\t\t// Genesect-Douse should never reject Techno Blast\n\t\t\t\tconst moveIsRejectable = (\n\t\t\t\t\t!(species.id === 'genesectdouse' && move.id === 'technoblast') &&\n\t\t\t\t\t!(species.id === 'togekiss' && move.id === 'nastyplot') &&\n\t\t\t\t\t!(species.id === 'shuckle' && ['stealthrock', 'stickyweb'].includes(move.id)) && (\n\t\t\t\t\t\tmove.category === 'Status' ||\n\t\t\t\t\t\t(!types.has(move.type) && move.id !== 'judgment') ||\n\t\t\t\t\t\t(isLowBP && !move.multihit && !abilities.has('Technician'))\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\t// Setup-supported moves should only be rejected under specific circumstances\n\t\t\t\tconst notImportantSetup = (\n\t\t\t\t\t!counter.setupType ||\n\t\t\t\t\tcounter.setupType === 'Mixed' ||\n\t\t\t\t\t(counter.get(counter.setupType) + counter.get('Status') > 3 && !counter.get('hazards')) ||\n\t\t\t\t\t(move.category !== counter.setupType && move.category !== 'Status')\n\t\t\t\t);\n\n\t\t\t\tif (moveIsRejectable && (\n\t\t\t\t\t!cull && !isSetup && !move.weather && !move.stallingMove && notImportantSetup && !move.damage &&\n\t\t\t\t\t(isDoubles ? this.unrejectableMovesInDoubles(move) : this.unrejectableMovesInSingles(move))\n\t\t\t\t)) {\n\t\t\t\t\t// There may be more important moves that this Pokemon needs\n\t\t\t\t\tif (\n\t\t\t\t\t\t// Pokemon should have at least one STAB move\n\t\t\t\t\t\t(!counter.get('stab') && counter.get('physicalpool') + counter.get('specialpool') > 0 && move.id !== 'stickyweb') ||\n\t\t\t\t\t\t// Swords Dance Mew should have Brave Bird\n\t\t\t\t\t\t(moves.has('swordsdance') && species.id === 'mew' && runEnforcementChecker('Flying')) ||\n\t\t\t\t\t\t// Dhelmise should have Anchor Shot\n\t\t\t\t\t\t(abilities.has('Steelworker') && runEnforcementChecker('Steel')) ||\n\t\t\t\t\t\t// Check for miscellaneous important moves\n\t\t\t\t\t\t(!isDoubles && runEnforcementChecker('recovery') && move.id !== 'stickyweb') ||\n\t\t\t\t\t\trunEnforcementChecker('screens') ||\n\t\t\t\t\t\trunEnforcementChecker('misc') ||\n\t\t\t\t\t\t((isLead || species.id === 'shuckle') && runEnforcementChecker('lead')) ||\n\t\t\t\t\t\t(moves.has('leechseed') && runEnforcementChecker('leechseed'))\n\t\t\t\t\t) {\n\t\t\t\t\t\tcull = true;\n\t\t\t\t\t// Pokemon should have moves that benefit their typing\n\t\t\t\t\t// Don't cull Sticky Web in type-based enforcement, and make sure Azumarill always has Aqua Jet\n\t\t\t\t\t} else if (move.id !== 'stickyweb' && !(species.id === 'azumarill' && move.id === 'aquajet')) {\n\t\t\t\t\t\tfor (const type of types) {\n\t\t\t\t\t\t\tif (runEnforcementChecker(type)) {\n\t\t\t\t\t\t\t\tcull = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Sleep Talk shouldn't be selected without Rest\n\t\t\t\tif (move.id === 'rest' && cull) {\n\t\t\t\t\tconst sleeptalk = movePool.indexOf('sleeptalk');\n\t\t\t\t\tif (sleeptalk >= 0) {\n\t\t\t\t\t\tif (movePool.length < 2) {\n\t\t\t\t\t\t\tcull = false;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.fastPop(movePool, sleeptalk);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Remove rejected moves from the move list\n\t\t\t\tif (cull && movePool.length) {\n\t\t\t\t\tif (moveid.startsWith('hiddenpower')) hasHiddenPower = false;\n\t\t\t\t\tif (move.category !== 'Status' && !move.damage) rejectedPool.push(moveid);\n\t\t\t\t\tmoves.delete(moveid);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (cull && rejectedPool.length) {\n\t\t\t\t\tif (moveid.startsWith('hiddenpower')) hasHiddenPower = false;\n\t\t\t\t\tmoves.delete(moveid);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} while (moves.size < this.maxMoveCount && (movePool.length || rejectedPool.length));\n\n\t\t// for BD/SP only\n\t\tif (hasHiddenPower) {\n\t\t\tlet hpType;\n\t\t\tfor (const move of moves) {\n\t\t\t\tif (move.startsWith('hiddenpower')) hpType = move.substr(11);\n\t\t\t}\n\t\t\tif (!hpType) throw new Error(`hasHiddenPower is true, but no Hidden Power move was found.`);\n\t\t\tconst HPivs = this.dex.types.get(hpType).HPivs;\n\t\t\tlet iv: StatID;\n\t\t\tfor (iv in HPivs) {\n\t\t\t\tivs[iv] = HPivs[iv]!;\n\t\t\t}\n\t\t}\n\n\t\tability = this.getAbility(types, moves, abilities, counter, movePool, teamDetails, species,\n\t\t\t'', '', isDoubles, isNoDynamax);\n\n\t\tif (species.requiredItems) {\n\t\t\titem = this.sample(species.requiredItems);\n\t\t// First, the extra high-priority items\n\t\t} else {\n\t\t\titem = this.getHighPriorityItem(ability, types, moves, counter, teamDetails, species, isLead, isDoubles);\n\t\t\tif (item === undefined && isDoubles) {\n\t\t\t\titem = this.getDoublesItem(ability, types, moves, abilities, counter, teamDetails, species);\n\t\t\t}\n\t\t\tif (item === undefined) {\n\t\t\t\titem = this.getMediumPriorityItem(ability, moves, counter, species, isLead, isDoubles, isNoDynamax);\n\t\t\t}\n\t\t\tif (item === undefined) {\n\t\t\t\titem = this.getLowPriorityItem(\n\t\t\t\t\tability, types, moves, abilities, counter, teamDetails, species, isLead, isDoubles, isNoDynamax\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// fallback\n\t\t\tif (item === undefined) item = isDoubles ? 'Sitrus Berry' : 'Leftovers';\n\t\t}\n\n\t\t// For Trick / Switcheroo\n\t\tif (item === 'Leftovers' && types.has('Poison')) {\n\t\t\titem = 'Black Sludge';\n\t\t}\n\n\t\tconst level: number = this.getLevel(species, isDoubles, isNoDynamax);\n\n\t\t// Prepare optimal HP\n\t\tconst srImmunity = ability === 'Magic Guard' || item === 'Heavy-Duty Boots';\n\t\tconst srWeakness = srImmunity ? 0 : this.dex.getEffectiveness('Rock', species);\n\t\twhile (evs.hp > 1) {\n\t\t\tconst hp = Math.floor(Math.floor(2 * species.baseStats.hp + ivs.hp + Math.floor(evs.hp / 4) + 100) * level / 100 + 10);\n\t\t\tconst multipleOfFourNecessary = (moves.has('substitute') && !['Leftovers', 'Black Sludge'].includes(item) && (\n\t\t\t\titem === 'Sitrus Berry' ||\n\t\t\t\titem === 'Salac Berry' ||\n\t\t\t\tability === 'Power Construct'\n\t\t\t));\n\t\t\tif (multipleOfFourNecessary) {\n\t\t\t\t// Two Substitutes should activate Sitrus Berry\n\t\t\t\tif (hp % 4 === 0) break;\n\t\t\t} else if (moves.has('bellydrum') && (item === 'Sitrus Berry' || ability === 'Gluttony')) {\n\t\t\t\t// Belly Drum should activate Sitrus Berry\n\t\t\t\tif (hp % 2 === 0) break;\n\t\t\t} else if (moves.has('substitute') && moves.has('reversal')) {\n\t\t\t\t// Reversal users should be able to use four Substitutes\n\t\t\t\tif (hp % 4 > 0) break;\n\t\t\t} else {\n\t\t\t\t// Maximize number of Stealth Rock switch-ins\n\t\t\t\tif (srWeakness <= 0 || hp % (4 / srWeakness) > 0) break;\n\t\t\t}\n\t\t\tevs.hp -= 4;\n\t\t}\n\n\t\tif (moves.has('shellsidearm') && item === 'Choice Specs') evs.atk -= 8;\n\n\t\t// Minimize confusion damage\n\t\tconst noAttackStatMoves = [...moves].every(m => {\n\t\t\tconst move = this.dex.moves.get(m);\n\t\t\tif (move.damageCallback || move.damage) return true;\n\t\t\treturn move.category !== 'Physical' || move.id === 'bodypress';\n\t\t});\n\t\tif (noAttackStatMoves && !moves.has('transform') && (!moves.has('shellsidearm') || !counter.get('Status'))) {\n\t\t\tevs.atk = 0;\n\t\t\tivs.atk = 0;\n\t\t}\n\n\t\t// Ensure Nihilego's Beast Boost gives it Special Attack boosts instead of Special Defense\n\t\tif (forme === 'Nihilego') evs.spd -= 32;\n\n\t\tif (moves.has('gyroball') || moves.has('trickroom')) {\n\t\t\tevs.spe = 0;\n\t\t\tivs.spe = 0;\n\t\t}\n\n\t\treturn {\n\t\t\tname: species.baseSpecies,\n\t\t\tspecies: forme,\n\t\t\tgender: species.gender,\n\t\t\tshiny: this.randomChance(1, 1024),\n\t\t\tgigantamax: gmax,\n\t\t\tlevel,\n\t\t\tmoves: Array.from(moves),\n\t\t\tability,\n\t\t\tevs,\n\t\t\tivs,\n\t\t\titem,\n\t\t};\n\t}\n\n\tgetPokemonPool(\n\t\ttype: string,\n\t\tpokemonToExclude: RandomTeamsTypes.RandomSet[] = [],\n\t\tisMonotype = false,\n\t\tpokemonList: string[]\n\t): [{[k: string]: string[]}, string[]] {\n\t\tconst exclude = pokemonToExclude.map(p => toID(p.species));\n\t\tconst pokemonPool: {[k: string]: string[]} = {};\n\t\tconst baseSpeciesPool = [];\n\t\tfor (const pokemon of pokemonList) {\n\t\t\tlet species = this.dex.species.get(pokemon);\n\t\t\tif (exclude.includes(species.id)) continue;\n\t\t\tif (isMonotype) {\n\t\t\t\tif (!species.types.includes(type)) continue;\n\t\t\t\tif (typeof species.battleOnly === 'string') {\n\t\t\t\t\tspecies = this.dex.species.get(species.battleOnly);\n\t\t\t\t\tif (!species.types.includes(type)) continue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (species.baseSpecies in pokemonPool) {\n\t\t\t\tpokemonPool[species.baseSpecies].push(pokemon);\n\t\t\t} else {\n\t\t\t\tpokemonPool[species.baseSpecies] = [pokemon];\n\t\t\t}\n\t\t}\n\t\t// Include base species 1x if 1-3 formes, 2x if 4-6 formes, 3x if 7+ formes\n\t\tfor (const baseSpecies of Object.keys(pokemonPool)) {\n\t\t\t// Squawkabilly has 4 formes, but only 2 functionally different formes, so only include it 1x\n\t\t\tconst weight = (baseSpecies === 'Squawkabilly') ? 1 : Math.min(Math.ceil(pokemonPool[baseSpecies].length / 3), 3);\n\t\t\tfor (let i = 0; i < weight; i++) baseSpeciesPool.push(baseSpecies);\n\t\t}\n\t\treturn [pokemonPool, baseSpeciesPool];\n\t}\n\n\trandomTeam() {\n\t\tthis.enforceNoDirectCustomBanlistChanges();\n\n\t\tconst seed = this.prng.seed;\n\t\tconst ruleTable = this.dex.formats.getRuleTable(this.format);\n\t\tconst pokemon: RandomTeamsTypes.RandomSet[] = [];\n\n\t\t// For Monotype\n\t\tconst isMonotype = !!this.forceMonotype || ruleTable.has('sametypeclause');\n\t\tconst isDoubles = this.format.gameType !== 'singles';\n\t\tconst typePool = this.dex.types.names();\n\t\tconst type = this.forceMonotype || this.sample(typePool);\n\n\t\t// PotD stuff\n\t\tconst usePotD = global.Config && Config.potd && ruleTable.has('potd');\n\t\tconst potd = usePotD ? this.dex.species.get(Config.potd) : null;\n\n\t\tconst baseFormes: {[k: string]: number} = {};\n\n\t\tconst typeCount: {[k: string]: number} = {};\n\t\tconst typeComboCount: {[k: string]: number} = {};\n\t\tconst typeWeaknesses: {[k: string]: number} = {};\n\t\tconst teamDetails: RandomTeamsTypes.TeamDetails = {};\n\t\tlet numMaxLevelPokemon = 0;\n\n\t\tconst pokemonList = [];\n\t\tfor (const poke of Object.keys(this.randomData)) {\n\t\t\tif (isDoubles && this.randomData[poke]?.doublesMoves || !isDoubles && this.randomData[poke]?.moves) {\n\t\t\t\tpokemonList.push(poke);\n\t\t\t}\n\t\t}\n\t\tconst [pokemonPool, baseSpeciesPool] = this.getPokemonPool(type, pokemon, isMonotype, pokemonList);\n\t\twhile (baseSpeciesPool.length && pokemon.length < this.maxTeamSize) {\n\t\t\tconst baseSpecies = this.sampleNoReplace(baseSpeciesPool);\n\t\t\tlet species = this.dex.species.get(this.sample(pokemonPool[baseSpecies]));\n\t\t\tif (!species.exists) continue;\n\n\t\t\t// Limit to one of each species (Species Clause)\n\t\t\tif (baseFormes[species.baseSpecies]) continue;\n\n\t\t\t// Illusion shouldn't be on the last slot\n\t\t\tif (species.name === 'Zoroark' && pokemon.length >= (this.maxTeamSize - 1)) continue;\n\t\t\t// The sixth slot should not be Zacian/Zamazenta/Eternatus if Zoroark is present,\n\t\t\t// as they make dynamax malfunction, regardless of level\n\t\t\tif (\n\t\t\t\tpokemon.some(pkmn => pkmn.name === 'Zoroark') &&\n\t\t\t\tpokemon.length >= (this.maxTeamSize - 1) &&\n\t\t\t\t['Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Eternatus'].includes(species.name)\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst types = species.types;\n\t\t\tconst typeCombo = types.slice().sort().join();\n\t\t\tconst weakToFreezeDry = (\n\t\t\t\tthis.dex.getEffectiveness('Ice', species) > 0 ||\n\t\t\t\t(this.dex.getEffectiveness('Ice', species) > -2 && types.includes('Water'))\n\t\t\t);\n\t\t\t// Dynamically scale limits for different team sizes. The default and minimum value is 1.\n\t\t\tconst limitFactor = Math.round(this.maxTeamSize / 6) || 1;\n\n\t\t\tif (!isMonotype && !this.forceMonotype) {\n\t\t\t\tlet skip = false;\n\n\t\t\t\t// Limit two of any type\n\t\t\t\tfor (const typeName of types) {\n\t\t\t\t\tif (typeCount[typeName] >= 2 * limitFactor) {\n\t\t\t\t\t\tskip = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (skip) continue;\n\n\t\t\t\t// Limit three weak to any type\n\t\t\t\tfor (const typeName of this.dex.types.names()) {\n\t\t\t\t\t// it's weak to the type\n\t\t\t\t\tif (this.dex.getEffectiveness(typeName, species) > 0) {\n\t\t\t\t\t\tif (!typeWeaknesses[typeName]) typeWeaknesses[typeName] = 0;\n\t\t\t\t\t\tif (typeWeaknesses[typeName] >= 3 * limitFactor) {\n\t\t\t\t\t\t\tskip = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (skip) continue;\n\n\t\t\t\t// Limit four weak to Freeze-Dry\n\t\t\t\tif (weakToFreezeDry) {\n\t\t\t\t\tif (!typeWeaknesses['Freeze-Dry']) typeWeaknesses['Freeze-Dry'] = 0;\n\t\t\t\t\tif (typeWeaknesses['Freeze-Dry'] >= 4 * limitFactor) continue;\n\t\t\t\t}\n\n\t\t\t\t// Limit one level 100 Pokemon\n\t\t\t\tif (\n\t\t\t\t\t!this.adjustLevel && numMaxLevelPokemon >= limitFactor &&\n\t\t\t\t\t(this.getLevel(species, isDoubles, this.dex.formats.getRuleTable(this.format).has('dynamaxclause')) === 100)\n\t\t\t\t) continue;\n\t\t\t}\n\n\t\t\t// Limit three of any type combination in Monotype\n\t\t\tif (!this.forceMonotype && isMonotype && (typeComboCount[typeCombo] >= 3 * limitFactor)) continue;\n\n\t\t\t// The Pokemon of the Day\n\t\t\tif (potd?.exists && (pokemon.length === 1 || this.maxTeamSize === 1)) species = potd;\n\n\t\t\tconst set = this.randomSet(species, teamDetails, pokemon.length === 0,\n\t\t\t\tisDoubles, this.dex.formats.getRuleTable(this.format).has('dynamaxclause'));\n\n\t\t\t// Okay, the set passes, add it to our team\n\t\t\tpokemon.push(set);\n\t\t\t// Don't bother tracking details for the last Pokemon\n\t\t\tif (pokemon.length === this.maxTeamSize) break;\n\n\t\t\t// Now that our Pokemon has passed all checks, we can increment our counters\n\t\t\tbaseFormes[species.baseSpecies] = 1;\n\n\t\t\t// Increment type counters\n\t\t\tfor (const typeName of types) {\n\t\t\t\tif (typeName in typeCount) {\n\t\t\t\t\ttypeCount[typeName]++;\n\t\t\t\t} else {\n\t\t\t\t\ttypeCount[typeName] = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (typeCombo in typeComboCount) {\n\t\t\t\ttypeComboCount[typeCombo]++;\n\t\t\t} else {\n\t\t\t\ttypeComboCount[typeCombo] = 1;\n\t\t\t}\n\n\t\t\t// Increment weakness counter\n\t\t\tfor (const typeName of this.dex.types.names()) {\n\t\t\t\t// it's weak to the type\n\t\t\t\tif (this.dex.getEffectiveness(typeName, species) > 0) {\n\t\t\t\t\ttypeWeaknesses[typeName]++;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (weakToFreezeDry) typeWeaknesses['Freeze-Dry']++;\n\n\t\t\t// Increment level 100 counter\n\t\t\tif (set.level === 100) numMaxLevelPokemon++;\n\n\t\t\t// Track what the team has\n\t\t\tif (set.ability === 'Drizzle' || set.moves.includes('raindance')) teamDetails.rain = 1;\n\t\t\tif (set.ability === 'Drought' || set.moves.includes('sunnyday')) teamDetails.sun = 1;\n\t\t\tif (set.ability === 'Sand Stream') teamDetails.sand = 1;\n\t\t\tif (set.ability === 'Snow Warning') teamDetails.hail = 1;\n\t\t\tif (set.moves.includes('spikes')) teamDetails.spikes = (teamDetails.spikes || 0) + 1;\n\t\t\tif (set.moves.includes('stealthrock')) teamDetails.stealthRock = 1;\n\t\t\tif (set.moves.includes('stickyweb')) teamDetails.stickyWeb = 1;\n\t\t\tif (set.moves.includes('toxicspikes')) teamDetails.toxicSpikes = 1;\n\t\t\tif (set.moves.includes('defog')) teamDetails.defog = 1;\n\t\t\tif (set.moves.includes('rapidspin')) teamDetails.rapidSpin = 1;\n\t\t\tif (set.moves.includes('auroraveil') || (set.moves.includes('reflect') && set.moves.includes('lightscreen'))) {\n\t\t\t\tteamDetails.screens = 1;\n\t\t\t}\n\t\t}\n\t\tif (pokemon.length < this.maxTeamSize && pokemon.length < 12) { // large teams sometimes cannot be built\n\t\t\tthrow new Error(`Could not build a random team for ${this.format} (seed=${seed})`);\n\t\t}\n\n\t\treturn pokemon;\n\t}\n\n\trandomCAP1v1Sets: AnyObject = require('./cap-1v1-sets.json');\n\n\trandomCAP1v1Team() {\n\t\tthis.enforceNoDirectCustomBanlistChanges();\n\n\t\tconst pokemon = [];\n\t\tconst pokemonPool = Object.keys(this.randomCAP1v1Sets);\n\n\t\twhile (pokemonPool.length && pokemon.length < this.maxTeamSize) {\n\t\t\tconst species = this.dex.species.get(this.sampleNoReplace(pokemonPool));\n\t\t\tif (!species.exists) throw new Error(`Invalid Pokemon \"${species}\" in ${this.format}`);\n\t\t\tif (this.forceMonotype && !species.types.includes(this.forceMonotype)) continue;\n\n\t\t\tconst setData: AnyObject = this.sample(this.randomCAP1v1Sets[species.name]);\n\t\t\tconst set = {\n\t\t\t\tname: species.baseSpecies,\n\t\t\t\tspecies: species.name,\n\t\t\t\tgender: species.gender,\n\t\t\t\titem: this.sampleIfArray(setData.item) || '',\n\t\t\t\tability: (this.sampleIfArray(setData.ability)),\n\t\t\t\tshiny: this.randomChance(1, 1024),\n\t\t\t\tlevel: this.adjustLevel || 100,\n\t\t\t\tevs: {hp: 0, atk: 0, def: 0, spa: 0, spd: 0, spe: 0, ...setData.evs},\n\t\t\t\tnature: setData.nature,\n\t\t\t\tivs: {hp: 31, atk: 31, def: 31, spa: 31, spd: 31, spe: 31, ...setData.ivs || {}},\n\t\t\t\tmoves: setData.moves.map((move: any) => this.sampleIfArray(move)),\n\t\t\t};\n\t\t\tif (this.adjustLevel) set.level = this.adjustLevel;\n\t\t\tpokemon.push(set);\n\t\t}\n\t\treturn pokemon;\n\t}\n\n\trandomFactorySets: {[format: string]: {[species: string]: BattleFactorySpecies}} = require('./factory-sets.json');\n\n\trandomFactorySet(\n\t\tspecies: Species, teamData: RandomTeamsTypes.FactoryTeamDetails, tier: string\n\t): RandomTeamsTypes.RandomFactorySet | null {\n\t\tconst id = toID(species.name);\n\t\tconst setList = this.randomFactorySets[tier][id].sets;\n\n\t\tconst itemsMax: {[k: string]: number} = {\n\t\t\tchoicespecs: 1,\n\t\t\tchoiceband: 1,\n\t\t\tchoicescarf: 1,\n\t\t};\n\t\tconst movesMax: {[k: string]: number} = {\n\t\t\trapidspin: 1,\n\t\t\tbatonpass: 1,\n\t\t\tstealthrock: 1,\n\t\t\tdefog: 1,\n\t\t\tspikes: 1,\n\t\t\ttoxicspikes: 1,\n\t\t};\n\t\tconst requiredMoves: {[k: string]: string} = {\n\t\t\tstealthrock: 'hazardSet',\n\t\t\trapidspin: 'hazardClear',\n\t\t\tdefog: 'hazardClear',\n\t\t};\n\t\tconst weatherAbilities = ['drizzle', 'drought', 'snowwarning', 'sandstream'];\n\n\t\t// Build a pool of eligible sets, given the team partners\n\t\t// Also keep track of sets with moves the team requires\n\t\tlet effectivePool: {set: AnyObject, moveVariants?: number[], item?: string, ability?: string}[] = [];\n\t\tconst priorityPool = [];\n\t\tfor (const curSet of setList) {\n\t\t\t// if (this.forceMonotype && !species.types.includes(this.forceMonotype)) continue;\n\n\t\t\t// reject disallowed items, specifically a second of any given choice item\n\t\t\tconst allowedItems: string[] = [];\n\t\t\tfor (const itemString of curSet.item) {\n\t\t\t\tconst item = this.dex.items.get(itemString);\n\t\t\t\tif (itemsMax[item.id] && teamData.has[item.id] >= itemsMax[item.id]) continue;\n\t\t\t\tallowedItems.push(itemString);\n\t\t\t}\n\t\t\tif (allowedItems.length === 0) continue;\n\t\t\tconst curSetItem = this.sample(allowedItems);\n\n\t\t\t// reject 2+ weather setters\n\t\t\tconst allowedAbilities: string[] = [];\n\t\t\tfor (const abilityString of curSet.ability) {\n\t\t\t\tconst ability = this.dex.abilities.get(abilityString);\n\t\t\t\tif (teamData.weather && weatherAbilities.includes(ability.id)) continue;\n\t\t\t\tallowedAbilities.push(abilityString);\n\t\t\t}\n\t\t\tif (allowedAbilities.length === 0) continue;\n\t\t\tconst curSetAbility = this.sample(allowedAbilities);\n\n\t\t\tlet reject = false;\n\t\t\tlet hasRequiredMove = false;\n\t\t\tconst curSetVariants = [];\n\t\t\tfor (const move of curSet.moves) {\n\t\t\t\tconst variantIndex = this.random(move.length);\n\t\t\t\tconst moveId = toID(move[variantIndex]);\n\t\t\t\tif (movesMax[moveId] && teamData.has[moveId] >= movesMax[moveId]) {\n\t\t\t\t\treject = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (requiredMoves[moveId] && !teamData.has[requiredMoves[moveId]]) {\n\t\t\t\t\thasRequiredMove = true;\n\t\t\t\t}\n\t\t\t\tcurSetVariants.push(variantIndex);\n\t\t\t}\n\t\t\tif (reject) continue;\n\n\t\t\tconst fullSetSpec = {set: curSet, moveVariants: curSetVariants, item: curSetItem, ability: curSetAbility};\n\t\t\teffectivePool.push(fullSetSpec);\n\t\t\tif (hasRequiredMove) priorityPool.push(fullSetSpec);\n\t\t}\n\t\tif (priorityPool.length) effectivePool = priorityPool;\n\n\t\tif (!effectivePool.length) {\n\t\t\tif (!teamData.forceResult) return null;\n\t\t\tfor (const curSet of setList) {\n\t\t\t\teffectivePool.push({set: curSet});\n\t\t\t}\n\t\t}\n\n\t\tconst setData = this.sample(effectivePool);\n\t\tconst moves = [];\n\t\tfor (const [i, moveSlot] of setData.set.moves.entries()) {\n\t\t\tmoves.push(setData.moveVariants ? moveSlot[setData.moveVariants[i]] : this.sample(moveSlot));\n\t\t}\n\n\n\t\tconst item = setData.item || this.sampleIfArray(setData.set.item);\n\t\tconst ability = setData.ability || this.sampleIfArray(setData.set.ability);\n\t\tconst nature = this.sampleIfArray(setData.set.nature);\n\t\tconst level = this.adjustLevel || setData.set.level || (tier === \"LC\" ? 5 : 100);\n\n\t\treturn {\n\t\t\tname: setData.set.name || species.baseSpecies,\n\t\t\tspecies: setData.set.species,\n\t\t\tgender: setData.set.gender || species.gender || (this.randomChance(1, 2) ? 'M' : 'F'),\n\t\t\titem: item || '',\n\t\t\tability: ability || species.abilities['0'],\n\t\t\tshiny: typeof setData.set.shiny === 'undefined' ? this.randomChance(1, 1024) : setData.set.shiny,\n\t\t\tlevel,\n\t\t\thappiness: typeof setData.set.happiness === 'undefined' ? 255 : setData.set.happiness,\n\t\t\tevs: {hp: 0, atk: 0, def: 0, spa: 0, spd: 0, spe: 0, ...setData.set.evs},\n\t\t\tivs: {hp: 31, atk: 31, def: 31, spa: 31, spd: 31, spe: 31, ...setData.set.ivs},\n\t\t\tnature: nature || 'Serious',\n\t\t\tmoves,\n\t\t};\n\t}\n\n\trandomFactoryTeam(side: PlayerOptions, depth = 0): RandomTeamsTypes.RandomFactorySet[] {\n\t\tthis.enforceNoDirectCustomBanlistChanges();\n\n\t\tconst forceResult = (depth >= 12);\n\t\t// Leaving Monotype code in comments in case it's used in the future\n\t\t// const isMonotype = !!this.forceMonotype || this.dex.formats.getRuleTable(this.format).has('sametypeclause');\n\n\t\t// The teams generated depend on the tier choice in such a way that\n\t\t// no exploitable information is leaked from rolling the tier in getTeam(p1).\n\t\tif (!this.factoryTier) {\n\t\t//\tthis.factoryTier = isMonotype ? 'Mono' : this.sample(['Uber', 'OU', 'UU', 'RU', 'NU', 'PU', 'LC']);\n\t\t\tthis.factoryTier = this.sample(['Uber', 'OU', 'UU', 'RU', 'NU', 'PU', 'LC']);\n\t\t}\n\t\t/*\n\t\t} else if (isMonotype && this.factoryTier !== 'Mono') {\n\t\t\t// I don't think this can ever happen?\n\t\t\tthrow new Error(`Can't generate a Monotype Battle Factory set in a battle with factory tier ${this.factoryTier}`);\n\t\t}\n\t\t*/\n\n\t\tconst tierValues: {[k: string]: number} = {\n\t\t\tUber: 5,\n\t\t\tOU: 4, UUBL: 4,\n\t\t\tUU: 3, RUBL: 3,\n\t\t\tRU: 2, NUBL: 2,\n\t\t\tNU: 1, PUBL: 1,\n\t\t\tPU: 0,\n\t\t};\n\n\t\tconst pokemon = [];\n\t\tconst pokemonPool = Object.keys(this.randomFactorySets[this.factoryTier]);\n\n\t\t// const typePool = this.dex.types.names();\n\t\t// const type = this.sample(typePool);\n\n\t\tconst teamData: TeamData = {\n\t\t\ttypeCount: {}, typeComboCount: {}, baseFormes: {},\n\t\t\thas: {}, forceResult: forceResult, weaknesses: {}, resistances: {},\n\t\t};\n\t\tconst requiredMoveFamilies = ['hazardSet', 'hazardClear'];\n\t\tconst requiredMoves: {[k: string]: string} = {\n\t\t\tstealthrock: 'hazardSet',\n\t\t\trapidspin: 'hazardClear',\n\t\t\tdefog: 'hazardClear',\n\t\t};\n\t\tconst weatherAbilitiesSet: {[k: string]: string} = {\n\t\t\tdrizzle: 'raindance',\n\t\t\tdrought: 'sunnyday',\n\t\t\tsnowwarning: 'hail',\n\t\t\tsandstream: 'sandstorm',\n\t\t};\n\t\tconst resistanceAbilities: {[k: string]: string[]} = {\n\t\t\tdryskin: ['Water'], waterabsorb: ['Water'], stormdrain: ['Water'],\n\t\t\tflashfire: ['Fire'], heatproof: ['Fire'],\n\t\t\tlightningrod: ['Electric'], motordrive: ['Electric'], voltabsorb: ['Electric'],\n\t\t\tsapsipper: ['Grass'],\n\t\t\tthickfat: ['Ice', 'Fire'],\n\t\t\tlevitate: ['Ground'],\n\t\t};\n\n\t\twhile (pokemonPool.length && pokemon.length < this.maxTeamSize) {\n\t\t\tconst species = this.dex.species.get(this.sampleNoReplace(pokemonPool));\n\t\t\tif (!species.exists) continue;\n\n\t\t\t// Lessen the need of deleting sets of Pokemon after tier shifts\n\t\t\tif (\n\t\t\t\tthis.factoryTier in tierValues && species.tier in tierValues &&\n\t\t\t\ttierValues[species.tier] > tierValues[this.factoryTier]\n\t\t\t) continue;\n\n\t\t\t// const speciesFlags = this.randomFactorySets[this.factoryTier][species.id].flags;\n\n\t\t\t// Limit to one of each species (Species Clause)\n\t\t\tif (teamData.baseFormes[species.baseSpecies]) continue;\n\n\t\t\tconst set = this.randomFactorySet(species, teamData, this.factoryTier);\n\t\t\tif (!set) continue;\n\n\t\t\tconst itemData = this.dex.items.get(set.item);\n\n\t\t\tconst types = species.types;\n\t\t\t// Dynamically scale limits for different team sizes. The default and minimum value is 1.\n\t\t\tconst limitFactor = Math.round(this.maxTeamSize / 6) || 1;\n\t\t\t/*\n\t\t\t// Enforce Monotype\n\t\t\tif (isMonotype) {\n\t\t\t\t// Prevents Mega Evolutions from breaking the type limits\n\t\t\t\tif (itemData.megaStone) {\n\t\t\t\t\tconst megaSpecies = this.dex.species.get(itemData.megaStone);\n\t\t\t\t\tif (types.length > megaSpecies.types.length) types = [species.types[0]];\n\t\t\t\t\t// Only check the second type because a Mega Evolution should always share the first type with its base forme.\n\t\t\t\t\tif (megaSpecies.types[1] && types[1] && megaSpecies.types[1] !== types[1]) {\n\t\t\t\t\t\ttypes = [megaSpecies.types[0]];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!types.includes(type)) continue;\n\t\t\t} else\n\t\t\t*/\n\t\t\t{\n\t\t\t\t// If not Monotype, limit to two of each type\n\t\t\t\tlet skip = false;\n\t\t\t\tfor (const typeName of types) {\n\t\t\t\t\tif (teamData.typeCount[typeName] >= 2 * limitFactor && this.randomChance(4, 5)) {\n\t\t\t\t\t\tskip = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (skip) continue;\n\n\t\t\t\t// Limit 1 of any type combination\n\t\t\t\tlet typeCombo = types.slice().sort().join();\n\t\t\t\tif (set.ability + '' === 'Drought' || set.ability + '' === 'Drizzle') {\n\t\t\t\t// Drought and Drizzle don't count towards the type combo limit\n\t\t\t\t\ttypeCombo = set.ability + '';\n\t\t\t\t}\n\t\t\t\tif (teamData.typeComboCount[typeCombo] >= 1 * limitFactor) continue;\n\t\t\t}\n\n\t\t\t// Okay, the set passes, add it to our team\n\t\t\tpokemon.push(set);\n\t\t\tconst typeCombo = types.slice().sort().join();\n\t\t\t// Now that our Pokemon has passed all checks, we can update team data:\n\t\t\tfor (const typeName of types) {\n\t\t\t\tif (typeName in teamData.typeCount) {\n\t\t\t\t\tteamData.typeCount[typeName]++;\n\t\t\t\t} else {\n\t\t\t\t\tteamData.typeCount[typeName] = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\tteamData.typeComboCount[typeCombo] = (teamData.typeComboCount[typeCombo] + 1) || 1;\n\n\t\t\tteamData.baseFormes[species.baseSpecies] = 1;\n\n\t\t\tif (itemData.id in teamData.has) {\n\t\t\t\tteamData.has[itemData.id]++;\n\t\t\t} else {\n\t\t\t\tteamData.has[itemData.id] = 1;\n\t\t\t}\n\n\t\t\tconst abilityState = this.dex.abilities.get(set.ability);\n\t\t\tif (abilityState.id in weatherAbilitiesSet) {\n\t\t\t\tteamData.weather = weatherAbilitiesSet[abilityState.id];\n\t\t\t}\n\n\t\t\tfor (const move of set.moves) {\n\t\t\t\tconst moveId = toID(move);\n\t\t\t\tif (moveId in teamData.has) {\n\t\t\t\t\tteamData.has[moveId]++;\n\t\t\t\t} else {\n\t\t\t\t\tteamData.has[moveId] = 1;\n\t\t\t\t}\n\t\t\t\tif (moveId in requiredMoves) {\n\t\t\t\t\tteamData.has[requiredMoves[moveId]] = 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const typeName of this.dex.types.names()) {\n\t\t\t\t// Cover any major weakness (3+) with at least one resistance\n\t\t\t\tif (teamData.resistances[typeName] >= 1) continue;\n\t\t\t\tif (resistanceAbilities[abilityState.id]?.includes(typeName) || !this.dex.getImmunity(typeName, types)) {\n\t\t\t\t\t// Heuristic: assume that Pok\u00E9mon with these abilities don't have (too) negative typing.\n\t\t\t\t\tteamData.resistances[typeName] = (teamData.resistances[typeName] || 0) + 1;\n\t\t\t\t\tif (teamData.resistances[typeName] >= 1) teamData.weaknesses[typeName] = 0;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst typeMod = this.dex.getEffectiveness(typeName, types);\n\t\t\t\tif (typeMod < 0) {\n\t\t\t\t\tteamData.resistances[typeName] = (teamData.resistances[typeName] || 0) + 1;\n\t\t\t\t\tif (teamData.resistances[typeName] >= 1) teamData.weaknesses[typeName] = 0;\n\t\t\t\t} else if (typeMod > 0) {\n\t\t\t\t\tteamData.weaknesses[typeName] = (teamData.weaknesses[typeName] || 0) + 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (pokemon.length < this.maxTeamSize) return this.randomFactoryTeam(side, ++depth);\n\n\t\t// Quality control\n\t\tif (!teamData.forceResult) {\n\t\t\tfor (const requiredFamily of requiredMoveFamilies) {\n\t\t\t\tif (!teamData.has[requiredFamily]) return this.randomFactoryTeam(side, ++depth);\n\t\t\t}\n\t\t\tfor (const typeName in teamData.weaknesses) {\n\t\t\t\tif (teamData.weaknesses[typeName] >= 3) return this.randomFactoryTeam(side, ++depth);\n\t\t\t}\n\t\t}\n\n\t\treturn pokemon;\n\t}\n\n\trandomBSSFactorySets: AnyObject = require('./bss-factory-sets.json');\n\n\trandomBSSFactorySet(\n\t\tspecies: Species, teamData: RandomTeamsTypes.FactoryTeamDetails\n\t): RandomTeamsTypes.RandomFactorySet | null {\n\t\tconst id = toID(species.name);\n\t\tconst setList = this.randomBSSFactorySets[id].sets;\n\n\t\tconst movesMax: {[k: string]: number} = {\n\t\t\tbatonpass: 1,\n\t\t\tstealthrock: 1,\n\t\t\ttoxicspikes: 1,\n\t\t\ttrickroom: 1,\n\t\t\tauroraveil: 1,\n\t\t};\n\n\t\tconst requiredMoves: {[k: string]: number} = {};\n\n\t\t// Build a pool of eligible sets, given the team partners\n\t\t// Also keep track of sets with moves the team requires\n\t\tlet effectivePool: {set: AnyObject, moveVariants?: number[], itemVariants?: number, abilityVariants?: number}[] = [];\n\t\tconst priorityPool = [];\n\t\tfor (const curSet of setList) {\n\t\t\tlet reject = false;\n\t\t\tlet hasRequiredMove = false;\n\t\t\tconst curSetMoveVariants = [];\n\t\t\tfor (const move of curSet.moves) {\n\t\t\t\tconst variantIndex = this.random(move.length);\n\t\t\t\tconst moveId = toID(move[variantIndex]);\n\t\t\t\tif (movesMax[moveId] && teamData.has[moveId] >= movesMax[moveId]) {\n\t\t\t\t\treject = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (requiredMoves[moveId] && !teamData.has[requiredMoves[moveId]]) {\n\t\t\t\t\thasRequiredMove = true;\n\t\t\t\t}\n\t\t\t\tcurSetMoveVariants.push(variantIndex);\n\t\t\t}\n\t\t\tif (reject) continue;\n\t\t\tconst set = {set: curSet, moveVariants: curSetMoveVariants};\n\t\t\teffectivePool.push(set);\n\t\t\tif (hasRequiredMove) priorityPool.push(set);\n\t\t}\n\t\tif (priorityPool.length) effectivePool = priorityPool;\n\n\t\tif (!effectivePool.length) {\n\t\t\tif (!teamData.forceResult) return null;\n\t\t\tfor (const curSet of setList) {\n\t\t\t\teffectivePool.push({set: curSet});\n\t\t\t}\n\t\t}\n\n\t\tconst setData = this.sample(effectivePool);\n\t\tconst moves = [];\n\t\tfor (const [i, moveSlot] of setData.set.moves.entries()) {\n\t\t\tmoves.push(setData.moveVariants ? moveSlot[setData.moveVariants[i]] : this.sample(moveSlot));\n\t\t}\n\n\t\tconst setDataAbility = this.sampleIfArray(setData.set.ability);\n\t\treturn {\n\t\t\tname: setData.set.nickname || setData.set.name || species.baseSpecies,\n\t\t\tspecies: setData.set.species,\n\t\t\tgigantamax: setData.set.gigantamax,\n\t\t\tgender: setData.set.gender || species.gender || (this.randomChance(1, 2) ? 'M' : 'F'),\n\t\t\titem: this.sampleIfArray(setData.set.item) || '',\n\t\t\tability: setDataAbility || species.abilities['0'],\n\t\t\tshiny: typeof setData.set.shiny === 'undefined' ? this.randomChance(1, 1024) : setData.set.shiny,\n\t\t\tlevel: setData.set.level || 50,\n\t\t\thappiness: typeof setData.set.happiness === 'undefined' ? 255 : setData.set.happiness,\n\t\t\tevs: {hp: 0, atk: 0, def: 0, spa: 0, spd: 0, spe: 0, ...setData.set.evs},\n\t\t\tivs: {hp: 31, atk: 31, def: 31, spa: 31, spd: 31, spe: 31, ...setData.set.ivs},\n\t\t\tnature: setData.set.nature || 'Serious',\n\t\t\tmoves,\n\t\t};\n\t}\n\n\trandomBSSFactoryTeam(side: PlayerOptions, depth = 0): RandomTeamsTypes.RandomFactorySet[] {\n\t\tthis.enforceNoDirectCustomBanlistChanges();\n\n\t\tconst forceResult = (depth >= 4);\n\n\t\tconst pokemon = [];\n\n\t\tconst pokemonPool = Object.keys(this.randomBSSFactorySets);\n\n\t\tconst teamData: TeamData = {\n\t\t\ttypeCount: {}, typeComboCount: {}, baseFormes: {}, has: {}, forceResult: forceResult,\n\t\t\tweaknesses: {}, resistances: {},\n\t\t};\n\t\tconst weatherAbilitiesSet: {[k: string]: string} = {\n\t\t\tdrizzle: 'raindance',\n\t\t\tdrought: 'sunnyday',\n\t\t\tsnowwarning: 'hail',\n\t\t\tsandstream: 'sandstorm',\n\t\t};\n\t\tconst resistanceAbilities: {[k: string]: string[]} = {\n\t\t\twaterabsorb: ['Water'],\n\t\t\tflashfire: ['Fire'],\n\t\t\tlightningrod: ['Electric'], voltabsorb: ['Electric'],\n\t\t\tthickfat: ['Ice', 'Fire'],\n\t\t\tlevitate: ['Ground'],\n\t\t};\n\t\tconst limitFactor = Math.ceil(this.maxTeamSize / 6);\n\t\t/**\n\t\t * Weighted random shuffle\n\t\t * Uses the fact that for two uniform variables x1 and x2, x1^(1/w1) is larger than x2^(1/w2)\n\t\t * with probability equal to w1/(w1+w2), which is what we want. See e.g. here https://arxiv.org/pdf/1012.0256.pdf,\n\t\t * original paper is behind a paywall.\n\t\t */\n\t\tconst shuffledSpecies = [];\n\t\tfor (const speciesName of pokemonPool) {\n\t\t\tconst sortObject = {\n\t\t\t\tspeciesName: speciesName,\n\t\t\t\tscore: Math.pow(this.prng.next(), 1 / this.randomBSSFactorySets[speciesName].usage),\n\t\t\t};\n\t\t\tshuffledSpecies.push(sortObject);\n\t\t}\n\t\tshuffledSpecies.sort((a, b) => a.score - b.score);\n\n\t\twhile (shuffledSpecies.length && pokemon.length < this.maxTeamSize) {\n\t\t\t// repeated popping from weighted shuffle is equivalent to repeated weighted sampling without replacement\n\t\t\tconst specie = shuffledSpecies.pop()!.speciesName;\n\t\t\tconst species = this.dex.species.get(specie);\n\t\t\tif (!species.exists) continue;\n\n\t\t\tif (this.forceMonotype && !species.types.includes(this.forceMonotype)) continue;\n\n\t\t\t// Limit to one of each species (Species Clause)\n\t\t\tif (teamData.baseFormes[species.baseSpecies]) continue;\n\n\t\t\t// Limit 2 of any type (most of the time)\n\t\t\tconst types = species.types;\n\t\t\tlet skip = false;\n\t\t\tif (!this.forceMonotype) {\n\t\t\t\tfor (const type of types) {\n\t\t\t\t\tif (teamData.typeCount[type] >= 2 * limitFactor && this.randomChance(4, 5)) {\n\t\t\t\t\t\tskip = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (skip) continue;\n\n\t\t\tconst set = this.randomBSSFactorySet(species, teamData);\n\t\t\tif (!set) continue;\n\n\t\t\t// Limit 1 of any type combination\n\t\t\tlet typeCombo = types.slice().sort().join();\n\t\t\tif (set.ability === 'Drought' || set.ability === 'Drizzle') {\n\t\t\t\t// Drought and Drizzle don't count towards the type combo limit\n\t\t\t\ttypeCombo = set.ability;\n\t\t\t}\n\t\t\tif (!this.forceMonotype && teamData.typeComboCount[typeCombo] >= limitFactor) continue;\n\n\t\t\tconst itemData = this.dex.items.get(set.item);\n\t\t\tif (teamData.has[itemData.id]) continue; // Item Clause\n\n\t\t\t// Okay, the set passes, add it to our team\n\t\t\tpokemon.push(set);\n\n\t\t\t// Now that our Pokemon has passed all checks, we can update team data:\n\t\t\tfor (const type of types) {\n\t\t\t\tif (type in teamData.typeCount) {\n\t\t\t\t\tteamData.typeCount[type]++;\n\t\t\t\t} else {\n\t\t\t\t\tteamData.typeCount[type] = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (typeCombo in teamData.typeComboCount) {\n\t\t\t\tteamData.typeComboCount[typeCombo]++;\n\t\t\t} else {\n\t\t\t\tteamData.typeComboCount[typeCombo] = 1;\n\t\t\t}\n\n\t\t\tteamData.baseFormes[species.baseSpecies] = 1;\n\n\t\t\tteamData.has[itemData.id] = 1;\n\n\t\t\tconst abilityState = this.dex.abilities.get(set.ability);\n\t\t\tif (abilityState.id in weatherAbilitiesSet) {\n\t\t\t\tteamData.weather = weatherAbilitiesSet[abilityState.id];\n\t\t\t}\n\n\t\t\tfor (const move of set.moves) {\n\t\t\t\tconst moveId = toID(move);\n\t\t\t\tif (moveId in teamData.has) {\n\t\t\t\t\tteamData.has[moveId]++;\n\t\t\t\t} else {\n\t\t\t\t\tteamData.has[moveId] = 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const typeName of this.dex.types.names()) {\n\t\t\t\t// Cover any major weakness (3+) with at least one resistance\n\t\t\t\tif (teamData.resistances[typeName] >= 1) continue;\n\t\t\t\tif (resistanceAbilities[abilityState.id]?.includes(typeName) || !this.dex.getImmunity(typeName, types)) {\n\t\t\t\t\t// Heuristic: assume that Pok\u00E9mon with these abilities don't have (too) negative typing.\n\t\t\t\t\tteamData.resistances[typeName] = (teamData.resistances[typeName] || 0) + 1;\n\t\t\t\t\tif (teamData.resistances[typeName] >= 1) teamData.weaknesses[typeName] = 0;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst typeMod = this.dex.getEffectiveness(typeName, types);\n\t\t\t\tif (typeMod < 0) {\n\t\t\t\t\tteamData.resistances[typeName] = (teamData.resistances[typeName] || 0) + 1;\n\t\t\t\t\tif (teamData.resistances[typeName] >= 1) teamData.weaknesses[typeName] = 0;\n\t\t\t\t} else if (typeMod > 0) {\n\t\t\t\t\tteamData.weaknesses[typeName] = (teamData.weaknesses[typeName] || 0) + 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!teamData.forceResult && pokemon.length < this.maxTeamSize) return this.randomBSSFactoryTeam(side, ++depth);\n\n\t\t// Quality control we cannot afford for monotype\n\t\tif (!teamData.forceResult && !this.forceMonotype) {\n\t\t\tfor (const type in teamData.weaknesses) {\n\t\t\t\tif (teamData.weaknesses[type] >= 3 * limitFactor) return this.randomBSSFactoryTeam(side, ++depth);\n\t\t\t}\n\t\t}\n\n\t\treturn pokemon;\n\t}\n}\n\nexport default RandomGen8Teams;\n"], "mappings": "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", "names": ["item", "ability", "typeCombo"] }