@pkmn/randoms 0.7.9 → 0.7.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/utils.ts","../src/gen8.ts","../src/gen7.ts","../src/gen6.ts","../src/gen5.ts","../src/gen4.ts","../src/gen3.ts","../src/gen2.ts","../src/gen1.ts","../src/gen9.ts"],"names":["eiscue","item","ability","typeCombo","specie","usage","toID","SetupException","PhysicalSetup","SpecialSetup","PRNG","Tags","MoveCounter","RecoveryMove","ContraryMoves","MixedSetup","SpeedSetup","NoStab","Hazards","sereneGraceBenefits","recoveryMoves","moveid","set","species"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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","sourcesContent":["import {\n\tPlayerOptions,\n\tPokemonSet,\n\tPRNG,\n\tPRNGSeed,\n\tDex,\n\tFormat,\n\tModdedDex,\n} from '@pkmn/sim';\n\nimport {RandomGen1Teams} from './gen1';\nimport {RandomGen2Teams} from './gen2';\nimport {RandomGen3Teams} from './gen3';\nimport {RandomGen4Teams} from './gen4';\nimport {RandomGen5Teams} from './gen5';\nimport {RandomGen6Teams} from './gen6';\nimport {RandomGen7Teams} from './gen7';\nimport {RandomGen8Teams} from './gen8';\nimport {RandomTeams} from './gen9';\n\nconst GENERATORS: {[mod: string]: new(dex: ModdedDex, format: Format, seed: PRNG | PRNGSeed | null) => TeamGenerator} = {\n\tgen1: RandomGen1Teams,\n\tgen2: RandomGen2Teams,\n\tgen3: RandomGen3Teams,\n\tgen4: RandomGen4Teams,\n\tgen5: RandomGen5Teams,\n\tgen6: RandomGen6Teams,\n\tgen7: RandomGen7Teams,\n\tgen8: RandomGen8Teams,\n\tgen9: RandomTeams,\n};\n\ninterface TeamGenerator {\n\tprng: PRNG;\n\tgetTeam(options?: PlayerOptions): PokemonSet[];\n\tsetSeed(prng?: PRNG | PRNGSeed): void;\n}\n\nexport const TeamGenerators = new class {\n\tgetTeamGenerator(format: Format | string, seed: PRNG | PRNGSeed | null = null) {\n\t\tformat = Dex.formats.get(format);\n\t\tif (!format.exists) throw new Error(`Unknown format '${format.name}' - does not exist`);\n\t\tif (format.team !== 'random') throw new Error(`Unsupported format '${format.name}`);\n\t\tconst Generator = format.mod && GENERATORS[format.mod];\n\t\tif (!Generator) throw new Error(`Unknown format '${format.name}' - cannot find generator`);\n\t\treturn new Generator(Dex.mod(format.mod), format, seed);\n\t}\n};\n","type Comparable = number | string | boolean | Comparable[] | {reverse: Comparable};\n\n/** Forces num to be an integer (between min and max). */\nfunction clampIntRange(num: any, min?: number, max?: number): number {\n\tif (typeof num !== 'number') num = 0;\n\tnum = Math.floor(num);\n\tif (min !== undefined && num < min) num = min;\n\tif (max !== undefined && num > max) num = max;\n\treturn num;\n}\n/**\n * Compares two variables; intended to be used as a smarter comparator.\n * The two variables must be the same type (TypeScript will not check this).\n *\n * - Numbers are sorted low-to-high, use `-val` to reverse\n * - Strings are sorted A to Z case-semi-insensitively, use `{reverse: val}` to reverse\n * - Booleans are sorted true-first (REVERSE of casting to numbers), use `!val` to reverse\n * - Arrays are sorted lexically in the order of their elements\n *\n * In other words: `[num, str]` will be sorted A to Z, `[num, {reverse: str}]` will be sorted Z to A.\n */\nfunction compare(a: Comparable, b: Comparable): number {\n\tif (typeof a === 'number') {\n\t\treturn a - (b as number);\n\t}\n\tif (typeof a === 'string') {\n\t\treturn a.localeCompare(b as string);\n\t}\n\tif (typeof a === 'boolean') {\n\t\treturn (a ? 1 : 2) - (b ? 1 : 2);\n\t}\n\tif (Array.isArray(a)) {\n\t\tfor (let i = 0; i < a.length; i++) {\n\t\t\tconst comparison = compare(a[i], (b as Comparable[])[i]);\n\t\t\tif (comparison) return comparison;\n\t\t}\n\t\treturn 0;\n\t}\n\tif ('reverse' in a) {\n\t\treturn compare((b as {reverse: string}).reverse, a.reverse);\n\t}\n\tthrow new Error(`Passed value ${a} is not comparable`);\n}\n\n/**\n * Sorts an array according to the callback's output on its elements.\n *\n * The callback's output is compared according to `PSUtils.compare`\n * (numbers low to high, strings A-Z, booleans true-first, arrays in order).\n */\nfunction sortBy<T>(array: T[], callback: (a: T) => Comparable): T[];\n/**\n * Sorts an array according to `PSUtils.compare`\n * (numbers low to high, strings A-Z, booleans true-first, arrays in order).\n *\n * Note that array.sort() only works on strings, not numbers, so you'll need\n * this to sort numbers.\n */\nfunction sortBy<T extends Comparable>(array: T[]): T[];\nfunction sortBy<T>(array: T[], callback?: (a: T) => Comparable) {\n\tif (!callback) return (array as any[]).sort(compare);\n\treturn array.sort((a, b) => compare(callback(a), callback(b)));\n}\n\nclass Multiset<T> extends Map<T, number> {\n\tadd(key: T) {\n\t\tthis.set(key, (this.get(key) ?? 0) + 1);\n\t\treturn this;\n\t}\n\tremove(key: T) {\n\t\tconst newValue = (this.get(key) ?? 0) - 1;\n\t\tif (newValue <= 0) return this.delete(key);\n\t\tthis.set(key, newValue);\n\t\treturn true;\n\t}\n}\n\nexport const Utils = {clampIntRange, compare, sortBy, Multiset};\n","import {Utils} from './utils';\nimport {\n\tAbility,\n\tAnyObject,\n\tBasicEffect,\n\tFormat,\n\tItem,\n\tModdedDex,\n\tMove,\n\tNature,\n\tPRNG,\n\tPRNGSeed,\n\tPlayerOptions,\n\tPokemonSet,\n\tRandomTeamsTypes,\n\tRuleTable,\n\tSpecies,\n\tStatID,\n\tStatsTable,\n\tTags,\n\ttoID,\n} from '@pkmn/sim';\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}\ninterface BattleFactorySet {\n\tspecies: string;\n\titem: string;\n\tability: string;\n\tnature: string;\n\tmoves: string[];\n\tevs?: Partial<StatsTable>;\n\tivs?: Partial<StatsTable>;\n}\nexport class MoveCounter extends Utils.Multiset<string> {\n\tdamagingMoves: Set<Move>;\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<string>, abilities: Set<string>, types: Set<string>,\n\tcounter: MoveCounter, species: Species, teamDetails: RandomTeamsTypes.TeamDetails\n) => boolean;\n\n// Moves that restore HP:\nconst RecoveryMove = [\n\t'healorder', 'milkdrink', 'moonlight', 'morningsun', 'recover', 'roost', 'shoreup', 'slackoff', 'softboiled', 'strengthsap', 'synthesis',\n];\n// Moves that drop stats:\nconst ContraryMoves = [\n\t'closecombat', 'leafstorm', 'overheat', 'superpower', 'vcreate',\n];\n// Moves that boost Attack:\nconst PhysicalSetup = [\n\t'bellydrum', 'bulkup', 'coil', 'curse', 'dragondance', 'honeclaws', 'howl', 'meditate', 'poweruppunch', 'swordsdance',\n];\n// Moves which boost Special Attack:\nconst SpecialSetup = [\n\t'calmmind', 'chargebeam', 'geomancy', 'nastyplot', 'quiverdance', 'tailglow',\n];\n// Moves that boost Attack AND Special Attack:\nconst MixedSetup = [\n\t'clangoroussoul', 'growth', 'happyhour', 'holdhands', 'noretreat', 'shellsmash', 'workup',\n];\n// Some moves that only boost Speed:\nconst SpeedSetup = [\n\t'agility', 'autotomize', 'flamecharge', 'rockpolish',\n];\n// Moves that shouldn't be the only STAB moves:\nconst NoStab = [\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\treadonly maxTeamSize: number;\n\treadonly adjustLevel: number | null;\n\treadonly maxMoveCount: number;\n\treadonly forceMonotype: string | undefined;\n\n\t/**\n\t * Checkers for move enforcement based on a Pokémon'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(dex: ModdedDex, format: Format, prng: PRNG | PRNGSeed | null) {\n\t\tthis.dex = dex;\n\t\tthis.gen = this.dex.gen;\n\t\tthis.noStab = NoStab;\n\n\t\tconst ruleTable = this.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<T>(items: readonly T[]): T {\n\t\treturn this.prng.sample(items);\n\t}\n\n\tsampleIfArray<T>(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<T>(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\n\t\t\t\t\t.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\tconst formes = ['gastrodoneast', 'pumpkaboosuper', 'zygarde10'];\n\t\t\t\tlet learnset = this.dex.species.getLearnset(species.id);\n\t\t\t\tif (formes.includes(species.id) || !learnset) {\n\t\t\t\t\tlearnset = this.dex.species.getLearnset(this.dex.species.get(species.baseSpecies).id);\n\t\t\t\t}\n\t\t\t\tif (learnset) {\n\t\t\t\t\tpool = Object.keys(learnset).filter(\n\t\t\t\t\t\tmoveid => learnset![moveid].find(learned => learned.startsWith(String(this.gen)))\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (species.changesFrom) {\n\t\t\t\t\tlearnset = this.dex.species.getLearnset(toID(species.changesFrom));\n\t\t\t\t\tconst basePool = Object.keys(learnset!).filter(\n\t\t\t\t\t\tmoveid => learnset![moveid].find(learned => learned.startsWith(String(this.gen)))\n\t\t\t\t\t);\n\t\t\t\t\tpool = [...new Set(pool.concat(basePool))];\n\t\t\t\t}\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 = this.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\tconst last = [0, 151, 251, 386, 493, 649, 721, 807, 898, 1010][this.gen];\n\n\t\tif (n <= 0 || n > last) throw new Error(`n must be a number between 1 and ${last} (got ${n})`);\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 = Object.values(this.dex.species.getLearnset(species.id) || {})\n\t\t\t\t\t\t.some(sources => sources.some(source => source.startsWith('9')));\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\tif (num > last) break;\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 (!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\tif (!hasCustomBans) {\n\t\t\t\t\tnaturePool = [...this.dex.natures.all()];\n\t\t\t\t} else {\n\t\t\t\t\tconst hasAllNaturesBan = ruleTable.check('pokemontag:allnatures');\n\t\t\t\t\tfor (const nature of this.dex.natures.all()) {\n\t\t\t\t\t\tlet banReason = ruleTable.check('nature:' + nature.id);\n\t\t\t\t\t\tif (banReason) continue;\n\t\t\t\t\t\tif (banReason !== '' && nature.id) {\n\t\t\t\t\t\t\tif (hasAllNaturesBan) continue;\n\t\t\t\t\t\t\tif (nature.isNonstandard) {\n\t\t\t\t\t\t\t\tbanReason = ruleTable.check('pokemontag:' + toID(nature.isNonstandard));\n\t\t\t\t\t\t\t\tif (banReason) continue;\n\t\t\t\t\t\t\t\tif (banReason !== '' && nature.isNonstandard !== 'Unobtainable') {\n\t\t\t\t\t\t\t\t\tif (hasNonexistentBan) continue;\n\t\t\t\t\t\t\t\t\tif (!hasNonexistentWhitelist) continue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnaturePool.push(nature);\n\t\t\t\t\t}\n\t\t\t\t\t// There is no 'nature:nonature' rule so do not constrain pool size\n\t\t\t\t}\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(this.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 this.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<string> | null,\n\t\ttypes: string[],\n\t\tabilities: Set<string> = 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 (RecoveryMove.includes(moveid)) counter.add('recovery');\n\t\t\tif (ContraryMoves.includes(moveid)) counter.add('contrary');\n\t\t\tif (PhysicalSetup.includes(moveid)) {\n\t\t\t\tcounter.add('physicalsetup');\n\t\t\t\tcounter.setupType = 'Physical';\n\t\t\t} else if (SpecialSetup.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 (MixedSetup.includes(moveid)) counter.add('mixedsetup');\n\t\t\tif (SpeedSetup.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) {\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('rest') && moves.has('sleeptalk')) &&\n\t\t\t\t!(moves.has('wish') && moves.has('protect'))\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<string>,\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\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émon 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', 'Moody'].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<string>,\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tmovePool: string[],\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\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',\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 (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émon.\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\tgetHighPriorityItem(\n\t\tability: string,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\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 — 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émon 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!isLead &&\n\t\t\tthis.dex.getEffectiveness('Rock', species) >= 2 &&\n\t\t\t!isDoubles\n\t\t);\n\t\tif (species.nfe && !HDBBetterThanEviolite) return '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<string>,\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t) {\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<string>,\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(ability === 'Moody' || !isDoubles)\n\t\t) return 'Leftovers';\n\t}\n\n\tgetLowPriorityItem(\n\t\tability: string,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\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 => this.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\t// Glalie prefers Leftovers\n\t\tif (!isDoubles && (rockWeaknessCase || spinnerCase) && species.id !== 'glalie') 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\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\tlet forme = species.name;\n\t\tlet gmax = false;\n\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\tforme = species.battleOnly;\n\t\t}\n\t\tif (species.cosmeticFormes) {\n\t\t\tforme = this.sample([species.name].concat(species.cosmeticFormes));\n\t\t}\n\t\tif (species.name.endsWith('-Gmax')) {\n\t\t\tforme = species.name.slice(0, -5);\n\t\t\tgmax = true;\n\t\t}\n\n\t\tconst randMoves =\n\t\t\t(isDoubles && species.randomDoubleBattleMoves) ||\n\t\t\t(isNoDynamax && species.randomBattleNoDynamaxMoves) ||\n\t\t\tspecies.randomBattleMoves;\n\t\tconst movePool = (randMoves || Object.keys(this.dex.species.getLearnset(species.id)!)).slice();\n\t\tif (this.format.gameType === 'multi' || this.format.gameType === 'freeforall') {\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<string>();\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\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 && 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\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[1]) {\n\t\t\t// Sort abilities by rating with an element of randomness\n\t\t\tif (abilityData[2] && abilityData[1].rating <= abilityData[2].rating && this.randomChance(1, 2)) {\n\t\t\t\t[abilityData[1], abilityData[2]] = [abilityData[2], abilityData[1]];\n\t\t\t}\n\t\t\tif (abilityData[0].rating <= abilityData[1].rating) {\n\t\t\t\tif (this.randomChance(1, 2)) [abilityData[0], abilityData[1]] = [abilityData[1], abilityData[0]];\n\t\t\t} else if (abilityData[0].rating - 0.6 <= abilityData[1].rating) {\n\t\t\t\tif (this.randomChance(2, 3)) [abilityData[0], abilityData[1]] = [abilityData[1], abilityData[0]];\n\t\t\t}\n\n\t\t\t// Start with the first abiility and work our way through, culling as we go\n\t\t\tability = abilityData[0].name;\n\t\t\tlet rejectAbility = false;\n\t\t\tdo {\n\t\t\t\trejectAbility = this.shouldCullAbility(\n\t\t\t\t\tability, types, moves, abilities, counter, movePool, teamDetails, species, isDoubles, isNoDynamax\n\t\t\t\t);\n\n\t\t\t\tif (rejectAbility) {\n\t\t\t\t\t// Lopunny, and other Facade users, don't want Limber, even if other abilities are poorly rated,\n\t\t\t\t\t// since paralysis would arguably be good for them.\n\t\t\t\t\tconst limberFacade = moves.has('facade') && ability === 'Limber';\n\n\t\t\t\t\tif (ability === abilityData[0].name && (abilityData[1].rating >= 1 || limberFacade)) {\n\t\t\t\t\t\tability = abilityData[1].name;\n\t\t\t\t\t} else if (ability === abilityData[1].name && abilityData[2] && (abilityData[2].rating >= 1 || limberFacade)) {\n\t\t\t\t\t\tability = abilityData[2].name;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Default to the highest rated ability if all are rejected\n\t\t\t\t\t\tability = abilityData[0].name;\n\t\t\t\t\t\trejectAbility = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} while (rejectAbility);\n\n\t\t\t// Hardcoded abilities for certain contexts\n\t\t\tif (forme === 'Copperajah' && gmax) {\n\t\t\t\tability = 'Heavy Metal';\n\t\t\t} else if (abilities.has('Guts') && (\n\t\t\t\tspecies.id === 'gurdurr' || species.id === 'throh' ||\n\t\t\t\tmoves.has('facade') || (moves.has('rest') && moves.has('sleeptalk'))\n\t\t\t)) {\n\t\t\t\tability = 'Guts';\n\t\t\t} else if (abilities.has('Moxie') && (counter.get('Physical') > 3 || moves.has('bounce')) && !isDoubles) {\n\t\t\t\tability = 'Moxie';\n\t\t\t} else if (isDoubles) {\n\t\t\t\tif (abilities.has('Competitive') && ability !== 'Shadow Tag' && ability !== 'Strong Jaw') ability = 'Competitive';\n\t\t\t\tif (abilities.has('Friend Guard')) ability = 'Friend Guard';\n\t\t\t\tif (abilities.has('Gluttony') && moves.has('recycle')) ability = 'Gluttony';\n\t\t\t\tif (abilities.has('Guts')) ability = 'Guts';\n\t\t\t\tif (abilities.has('Harvest')) ability = 'Harvest';\n\t\t\t\tif (abilities.has('Healer') && (\n\t\t\t\t\tabilities.has('Natural Cure') ||\n\t\t\t\t\t(abilities.has('Aroma Veil') && this.randomChance(1, 2))\n\t\t\t\t)) ability = 'Healer';\n\t\t\t\tif (abilities.has('Intimidate')) ability = 'Intimidate';\n\t\t\t\tif (abilities.has('Klutz') && ability === 'Limber') ability = 'Klutz';\n\t\t\t\tif (abilities.has('Magic Guard') && ability !== 'Friend Guard' && ability !== 'Unaware') ability = 'Magic Guard';\n\t\t\t\tif (abilities.has('Ripen')) ability = 'Ripen';\n\t\t\t\tif (abilities.has('Stalwart')) ability = 'Stalwart';\n\t\t\t\tif (abilities.has('Storm Drain')) ability = 'Storm Drain';\n\t\t\t\tif (abilities.has('Telepathy') && (ability === 'Pressure' || abilities.has('Analytic'))) ability = 'Telepathy';\n\t\t\t}\n\t\t} else {\n\t\t\tability = abilityData[0].name;\n\t\t}\n\n\t\t// item = !isDoubles ? 'Leftovers' : 'Sitrus Berry';\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\t\tif (species.baseSpecies === 'Pikachu' && !gmax && this.dex.currentMod !== 'gen8bdsp') {\n\t\t\tforme = 'Pikachu' + this.sample(['', '-Original', '-Hoenn', '-Sinnoh', '-Unova', '-Kalos', '-Alola', '-Partner', '-World']);\n\t\t}\n\n\t\tlet level: number;\n\t\tif (this.adjustLevel) {\n\t\t\tlevel = this.adjustLevel;\n\t\t// doubles levelling\n\t\t} else if (isDoubles && species.randomDoubleBattleLevel) {\n\t\t\tlevel = species.randomDoubleBattleLevel;\n\t\t// No Dmax levelling\n\t\t} else if (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<Record<Species['tier'], number>> = {\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, glalie: 78, urshifurapidstrike: 79, haxorus: 80, inteleon: 80,\n\t\t\t\tcresselia: 83, octillery: 84, 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\tlevel = customScale[species.id] || tierScale[tier] || 80;\n\t\t// BDSP tier levelling\n\t\t} else if (this.dex.currentMod === 'gen8bdsp') {\n\t\t\tconst tierScale: Partial<Record<Species['tier'], number>> = {\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} = {delibird: 100, glalie: 76, luvdisc: 100, spinda: 100, unown: 100};\n\n\t\t\tlevel = customScale[species.id] || tierScale[species.tier] || 80;\n\t\t// Arbitrary levelling base on data files (typically winrate-influenced)\n\t\t} else if (species.randomBattleLevel) {\n\t\t\tlevel = species.randomBattleLevel;\n\t\t// Default to level 80\n\t\t} else {\n\t\t\tlevel = 80;\n\t\t}\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) {\n\t\tconst exclude = pokemonToExclude.map(p => toID(p.species));\n\t\tconst pokemonPool = [];\n\t\tfor (let species of this.dex.species.all()) {\n\t\t\tif (species.gen > this.gen || exclude.includes(species.id)) continue;\n\t\t\tif (this.dex.currentMod === 'gen8bdsp' && species.gen > 4) 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\t\t\tpokemonPool.push(species.id);\n\t\t}\n\t\treturn pokemonPool;\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 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 tierCount: {[k: string]: number} = {};\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\n\t\tconst pokemonPool = this.getPokemonPool(type, pokemon, isMonotype);\n\t\twhile (pokemonPool.length && pokemon.length < this.maxTeamSize) {\n\t\t\tlet species = this.dex.species.get(this.sampleNoReplace(pokemonPool));\n\t\t\tif (!species.exists) continue;\n\n\t\t\t// Check if the forme has moves for random battle\n\t\t\tif (this.format.gameType === 'singles') {\n\t\t\t\tif (!species.randomBattleMoves?.length) continue;\n\t\t\t} else {\n\t\t\t\tif (!species.randomDoubleBattleMoves?.length) continue;\n\t\t\t}\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// Adjust rate for species with multiple sets\n\t\t\t// TODO: investigate automating this by searching for Pokémon with multiple sets\n\t\t\tswitch (species.baseSpecies) {\n\t\t\tcase 'Arceus': case 'Silvally':\n\t\t\t\tif (this.randomChance(8, 9) && !isMonotype) continue;\n\t\t\t\tbreak;\n\t\t\tcase 'Aegislash': case 'Basculin': case 'Gourgeist': case 'Meloetta': case 'Rotom':\n\t\t\t\tif (this.randomChance(1, 2)) continue;\n\t\t\t\tbreak;\n\t\t\tcase 'Greninja':\n\t\t\t\tif (this.gen >= 7 && this.randomChance(1, 2)) continue;\n\t\t\t\tbreak;\n\t\t\tcase 'Darmanitan':\n\t\t\t\tif (species.gen === 8 && this.randomChance(1, 2)) continue;\n\t\t\t\tbreak;\n\t\t\tcase 'Necrozma': case 'Calyrex':\n\t\t\t\tif (this.randomChance(2, 3)) continue;\n\t\t\t\tbreak;\n\t\t\tcase 'Magearna': case 'Toxtricity': case 'Zacian': case 'Zamazenta': case 'Zarude':\n\t\t\tcase 'Appletun': case 'Blastoise': case 'Butterfree': case 'Copperajah': case 'Grimmsnarl':\n\t\t\tcase 'Inteleon': case 'Rillaboom': case 'Snorlax': case 'Urshifu': case 'Giratina': case 'Genesect':\n\t\t\tcase 'Cinderace':\n\t\t\t\tif (this.gen >= 8 && this.randomChance(1, 2)) continue;\n\t\t\t\tbreak;\n\t\t\t}\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 a Zoroark is present\n\t\t\tif (\n\t\t\t\tpokemon.some(pkmn => pkmn.species === 'Zoroark') &&\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 tier = species.tier;\n\t\t\tconst types = species.types;\n\t\t\tconst typeCombo = types.slice().sort().join();\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\t// Limit one Pokemon per tier, two for Monotype\n\t\t\t// This limitation is not applied to BD/SP team generation, because tiering for BD/SP is not yet complete,\n\t\t\t// meaning that most Pokémon are in OU.\n\t\t\tif (\n\t\t\t\tthis.dex.currentMod !== 'gen8bdsp' &&\n\t\t\t\t(tierCount[tier] >= (this.forceMonotype || isMonotype ? 2 : 1) * limitFactor) &&\n\t\t\t\t!this.randomChance(1, Math.pow(5, tierCount[tier]))\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\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\t\t\t}\n\n\t\t\t// Limit one of any type combination, two in Monotype\n\t\t\tif (!this.forceMonotype && typeComboCount[typeCombo] >= (isMonotype ? 2 : 1) * 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\tthis.format.gameType !== 'singles', 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\tif (pokemon.length === this.maxTeamSize) {\n\t\t\t\t// Set Zoroark's level to be the same as the last Pokemon\n\t\t\t\tconst illusion = teamDetails.illusion;\n\t\t\t\tif (illusion) pokemon[illusion - 1].level = pokemon[this.maxTeamSize - 1].level;\n\n\t\t\t\t// Don't bother tracking details for the last Pokemon\n\t\t\t\tbreak;\n\t\t\t}\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 tier counter\n\t\t\tif (tierCount[tier]) {\n\t\t\t\ttierCount[tier]++;\n\t\t\t} else {\n\t\t\t\ttierCount[tier] = 1;\n\t\t\t}\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\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\n\t\t\t// For setting Zoroark's level\n\t\t\tif (set.ability === 'Illusion') teamDetails.illusion = pokemon.length;\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 = {};\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}} = {};\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[]}[] = [];\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\tconst item = this.dex.items.get(curSet.item);\n\t\t\tif (itemsMax[item.id] && teamData.has[item.id] >= itemsMax[item.id]) continue;\n\n\t\t\tconst ability = this.dex.abilities.get(curSet.ability);\n\t\t\tif (teamData.weather && weatherAbilities.includes(ability.id)) continue; // reject 2+ weather setters\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\t\t\teffectivePool.push({set: curSet, moveVariants: curSetVariants});\n\t\t\tif (hasRequiredMove) priorityPool.push({set: curSet, moveVariants: curSetVariants});\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 = this.sampleIfArray(setData.set.item);\n\t\tconst 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émon 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 = {};\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 requiredMoveFamilies: string[] = [];\n\t\tconst requiredMoves: {[k: string]: string} = {};\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\n\t\twhile (pokemonPool.length && pokemon.length < this.maxTeamSize) {\n\t\t\t// Weighted random sampling\n\t\t\tlet maxUsage = 0;\n\t\t\tconst sets: {[k: string]: number} = {};\n\t\t\tfor (const specie of pokemonPool) {\n\t\t\t\tif (teamData.baseFormes[this.dex.species.get(specie).baseSpecies]) continue; // Species Clause\n\t\t\t\tconst usage: number = this.randomBSSFactorySets[specie].usage;\n\t\t\t\tsets[specie] = usage + maxUsage;\n\t\t\t\tmaxUsage += usage;\n\t\t\t}\n\n\t\t\tconst usage = this.random(1, maxUsage);\n\t\t\tlet last = 0;\n\t\t\tlet specie;\n\t\t\tfor (const key of Object.keys(sets)) {\n\t\t\t\t if (usage > last && usage <= sets[key]) {\n\t\t\t\t\t specie = key;\n\t\t\t\t\t break;\n\t\t\t\t }\n\t\t\t\t last = sets[key];\n\t\t\t}\n\n\t\t\tconst species = this.dex.species.get(specie);\n\t\t\tif (!species.exists) continue;\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\tfor (const type of types) {\n\t\t\t\tif (teamData.typeCount[type] > 1 && this.randomChance(4, 5)) {\n\t\t\t\t\tskip = true;\n\t\t\t\t\tbreak;\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 (typeCombo in teamData.typeComboCount) 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\tteamData.typeComboCount[typeCombo] = 1;\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\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émon 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.randomBSSFactoryTeam(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.randomBSSFactoryTeam(side, ++depth);\n\t\t\t}\n\t\t\tfor (const type in teamData.weaknesses) {\n\t\t\t\tif (teamData.weaknesses[type] >= 3) 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","import {MoveCounter, RandomGen8Teams, TeamData} from './gen8';\nimport {Utils} from './utils';\nimport {\n\tAnyObject,\n\tFormat,\n\tModdedDex,\n\tMove,\n\tPRNG,\n\tPRNGSeed,\n\tPlayerOptions,\n\tRandomTeamsTypes,\n\tSparseStatsTable,\n\tSpecies,\n\tStatID,\n\tStatsTable,\n\ttoID,\n} from '@pkmn/sim';\n\nexport interface BattleFactorySpecies {\n\tflags: {megaOnly?: 1, zmoveOnly?: 1, limEevee?: 1};\n\tsets: BattleFactorySet[];\n}\ninterface BattleFactorySet {\n\tspecies: string;\n\titem: string;\n\tability: string;\n\tnature: string;\n\tmoves: string[];\n\tevs?: Partial<StatsTable>;\n\tivs?: Partial<StatsTable>;\n}\n\nconst ZeroAttackHPIVs: {[k: string]: SparseStatsTable} = {\n\tgrass: {hp: 30, spa: 30},\n\tfire: {spa: 30, spe: 30},\n\tice: {def: 30},\n\tground: {spa: 30, spd: 30},\n\tfighting: {def: 30, spa: 30, spd: 30, spe: 30},\n\telectric: {def: 30, spe: 30},\n\tpsychic: {spe: 30},\n\tflying: {spa: 30, spd: 30, spe: 30},\n\trock: {def: 30, spd: 30, spe: 30},\n};\n\nexport class RandomGen7Teams extends RandomGen8Teams {\n\tconstructor(dex: ModdedDex, format: Format, prng: PRNG | PRNGSeed | null) {\n\t\tsuper(dex, format, prng);\n\n\t\tthis.noStab = [...this.noStab, 'voltswitch'];\n\n\t\tthis.moveEnforcementCheckers = {\n\t\t\tBug: movePool => movePool.includes('megahorn') || movePool.includes('pinmissile'),\n\t\t\tDark: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\t(!counter.get('Dark') && !abilities.has('Protean')) ||\n\t\t\t\t(moves.has('pursuit') && species.types.length > 1 && counter.get('Dark') === 1)\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!abilities.has('Aerilate') && !abilities.has('Pixilate') &&\n\t\t\t\t!moves.has('fly') && !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') && !types.has('Flying') && !abilities.has('Pixilate'))\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) => (\n\t\t\t\t!counter.get('Fire') || ['eruption', 'flareblitz', 'quiverdance'].some(m => movePool.includes(m))\n\t\t\t),\n\t\t\tFlying: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\t!counter.get('Flying') && (\n\t\t\t\t\tspecies.id === 'rotomfan' ||\n\t\t\t\t\tabilities.has('Gale Wings') ||\n\t\t\t\t\tabilities.has('Serene Grace') || (\n\t\t\t\t\t\ttypes.has('Normal') && (movePool.includes('beakblast') || movePool.includes('bravebird'))\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t),\n\t\t\tGhost: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t(!counter.get('Ghost') || movePool.includes('spectralthief')) &&\n\t\t\t\t!types.has('Dark') &&\n\t\t\t\t!abilities.has('Steelworker')\n\t\t\t),\n\t\t\tGrass: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\t!counter.get('Grass') && (species.baseStats.atk >= 100 || movePool.includes('leafstorm'))\n\t\t\t),\n\t\t\tGround: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!counter.get('Ground') && !moves.has('rest') && !moves.has('sleeptalk')\n\t\t\t),\n\t\t\tIce: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!abilities.has('Refrigerate') && (\n\t\t\t\t\t!counter.get('Ice') ||\n\t\t\t\t\tmovePool.includes('iciclecrash') ||\n\t\t\t\t\t(abilities.has('Snow Warning') && movePool.includes('blizzard'))\n\t\t\t\t)\n\t\t\t),\n\t\t\tNormal: movePool => movePool.includes('facade'),\n\t\t\tPoison: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!counter.get('Poison') &&\n\t\t\t\t(!!counter.setupType || abilities.has('Adaptability') || abilities.has('Sheer Force') || movePool.includes('gunkshot'))\n\t\t\t),\n\t\t\tPsychic: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\t!counter.get('Psychic') && (\n\t\t\t\t\tabilities.has('Psychic Surge') ||\n\t\t\t\t\tmovePool.includes('psychicfangs') ||\n\t\t\t\t\t(!types.has('Flying') && !abilities.has('Pixilate') && counter.get('stab') < species.types.length)\n\t\t\t\t)\n\t\t\t),\n\t\t\tRock: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\t!counter.get('Rock') &&\n\t\t\t\t!types.has('Fairy') &&\n\t\t\t\t(counter.setupType === 'Physical' || species.baseStats.atk >= 105 || abilities.has('Rock Head'))\n\t\t\t),\n\t\t\tSteel: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\t!counter.get('Steel') && (species.baseStats.atk >= 100 || abilities.has('Steelworker'))\n\t\t\t),\n\t\t\tWater: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\t(!counter.get('Water') && !abilities.has('Protean')) ||\n\t\t\t\t!counter.get('stab') ||\n\t\t\t\tmovePool.includes('crabhammer') ||\n\t\t\t\t(abilities.has('Huge Power') && movePool.includes('aquajet'))\n\t\t\t),\n\t\t\tAdaptability: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\t!counter.setupType &&\n\t\t\t\tspecies.types.length > 1 &&\n\t\t\t\t(!counter.get(species.types[0]) || !counter.get(species.types[1]))\n\t\t\t),\n\t\t\tContrary: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\t!counter.get('contrary') && species.name !== 'Shuckle'\n\t\t\t),\n\t\t\t'Slow Start': movePool => movePool.includes('substitute'),\n\t\t};\n\t}\n\n\tshouldCullMove(\n\t\tmove: Move,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\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): {cull: boolean, isSetup?: boolean} {\n\t\tconst hasRestTalk = moves.has('rest') && moves.has('sleeptalk');\n\t\tswitch (move.id) {\n\t\t// Not very useful without their supporting moves\n\t\tcase 'clangingscales': case 'electricterrain': case 'happyhour': case 'holdhands':\n\t\t\treturn {\n\t\t\t\tcull: !!teamDetails.zMove || hasRestTalk,\n\t\t\t\tisSetup: move.id === 'happyhour' || move.id === 'holdhands',\n\t\t\t};\n\t\tcase 'cottonguard': case 'defendorder':\n\t\t\treturn {cull: !counter.get('recovery') && !moves.has('rest')};\n\t\tcase 'bounce': case 'dig': case 'fly':\n\t\t\treturn {cull: !!teamDetails.zMove || counter.setupType !== 'Physical'};\n\t\tcase 'focuspunch':\n\t\t\treturn {cull: !moves.has('substitute') || counter.damagingMoves.size < 2};\n\t\tcase 'icebeam':\n\t\t\treturn {cull: abilities.has('Tinted Lens') && !!counter.get('Status')};\n\t\tcase 'perishsong':\n\t\t\treturn {cull: !moves.has('protect')};\n\t\tcase 'reflect':\n\t\t\tif (movePool.length > 1) {\n\t\t\t\tconst screen = movePool.indexOf('lightscreen');\n\t\t\t\tif (screen >= 0) this.fastPop(movePool, screen);\n\t\t\t}\n\t\t\treturn {cull: !moves.has('calmmind') && !moves.has('lightscreen')};\n\t\tcase 'rest':\n\t\t\treturn {cull: movePool.includes('sleeptalk')};\n\t\tcase 'sleeptalk':\n\t\t\tif (movePool.length > 1) {\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\treturn {cull: !moves.has('rest')};\n\t\tcase 'storedpower':\n\t\t\treturn {cull: !counter.setupType};\n\t\tcase 'switcheroo': case 'trick':\n\t\t\treturn {cull: (\n\t\t\t\tcounter.get('Physical') + counter.get('Special') < 3 ||\n\t\t\t\t['electroweb', 'snarl', 'suckerpunch'].some(m => moves.has(m))\n\t\t\t)};\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\treturn {cull: (\n\t\t\t\tcounter.setupType !== 'Physical' ||\n\t\t\t\tcounter.get('physicalsetup') > 1 ||\n\t\t\t\t(counter.get('Physical') + counter.get('physicalpool') < 2 && !hasRestTalk) ||\n\t\t\t\t(move.id === 'bulkup' && hasRestTalk) ||\n\t\t\t\t(move.id === 'bellydrum' && !abilities.has('Unburden') && !counter.get('priority'))\n\t\t\t), isSetup: true};\n\t\tcase 'calmmind': case 'geomancy': case 'nastyplot': case 'quiverdance': case 'tailglow':\n\t\t\tif (types.has('Dark') && moves.has('darkpulse')) {\n\t\t\t\tcounter.setupType = 'Special';\n\t\t\t\treturn {cull: false, isSetup: true};\n\t\t\t}\n\t\t\treturn {cull: (\n\t\t\t\tcounter.setupType !== 'Special' ||\n\t\t\t\tcounter.get('specialsetup') > 1 ||\n\t\t\t\t(counter.get('Special') + counter.get('specialpool') < 2 && !hasRestTalk)\n\t\t\t), isSetup: true};\n\t\tcase 'growth': case 'shellsmash': case 'workup':\n\t\t\treturn {cull: (\n\t\t\t\tcounter.setupType !== 'Mixed' ||\n\t\t\t\tcounter.get('mixedsetup') > 1 ||\n\t\t\t\tcounter.damagingMoves.size + counter.get('physicalpool') + counter.get('specialpool') < 2 ||\n\t\t\t\t(move.id === 'growth' && !moves.has('sunnyday'))\n\t\t\t), isSetup: true};\n\t\tcase 'agility': case 'autotomize': case 'rockpolish': case 'shiftgear':\n\t\t\treturn {cull: counter.damagingMoves.size < 2 || hasRestTalk, isSetup: !counter.setupType};\n\t\tcase 'flamecharge':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('dracometeor') ||\n\t\t\t\tmoves.has('overheat') ||\n\t\t\t\t(counter.damagingMoves.size < 3 && !counter.setupType)\n\t\t\t)};\n\n\t\t// Bad after setup\n\t\tcase 'circlethrow': case 'dragontail':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.get('speedsetup') ||\n\t\t\t\t(isDoubles && moves.has('superpower')) ||\n\t\t\t\t(!!counter.setupType && ((!moves.has('rest') && !moves.has('sleeptalk')) || moves.has('stormthrow'))) ||\n\t\t\t\t['encore', 'raindance', 'roar', 'trickroom', 'whirlwind'].some(m => moves.has(m)) ||\n\t\t\t\t(counter.get(move.type) > 1 && counter.get('Status') > 1) ||\n\t\t\t\t(abilities.has('Sheer Force') && !!counter.get('sheerforce'))\n\t\t\t)};\n\t\tcase 'defog':\n\t\t\treturn {cull: !!counter.setupType || moves.has('spikes') || moves.has('stealthrock') || !!teamDetails.defog};\n\t\tcase 'fakeout': case 'tailwind':\n\t\t\treturn {cull: !!counter.setupType || ['substitute', 'switcheroo', 'trick'].some(m => moves.has(m))};\n\t\tcase 'foulplay':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.setupType ||\n\t\t\t\t!!counter.get('speedsetup') ||\n\t\t\t\tcounter.get('Dark') > 2 ||\n\t\t\t\tmoves.has('clearsmog') ||\n\t\t\t\tcounter.damagingMoves.size - 1 === counter.get('priority') ||\n\t\t\t\thasRestTalk\n\t\t\t)};\n\t\tcase 'haze': case 'spikes':\n\t\t\treturn {cull: !!counter.setupType || !!counter.get('speedsetup') || moves.has('trickroom')};\n\t\tcase 'healbell': case 'technoblast':\n\t\t\treturn {cull: !!counter.get('speedsetup')};\n\t\tcase 'healingwish': case 'memento':\n\t\t\treturn {cull: !!counter.setupType || !!counter.get('recovery') || moves.has('substitute')};\n\t\tcase 'helpinghand': case 'yawn':\n\t\t\treturn {cull: !!counter.setupType};\n\t\tcase 'icywind': case 'stringshot':\n\t\t\treturn {cull: !!counter.get('speedsetup') || moves.has('trickroom')};\n\t\tcase 'leechseed': case 'roar': case 'whirlwind':\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('dragontail') ||\n\t\t\t\t(isDoubles && (movePool.includes('protect') || movePool.includes('spikyshield')))\n\t\t\t)};\n\t\tcase 'protect':\n\t\t\tconst doublesCondition = (\n\t\t\t\tmoves.has('fakeout') ||\n\t\t\t\t(moves.has('tailwind') && moves.has('roost')) ||\n\t\t\t\tmovePool.includes('bellydrum') ||\n\t\t\t\tmovePool.includes('shellsmash')\n\t\t\t);\n\t\t\tconst singlesCondition = counter.setupType && !moves.has('wish');\n\t\t\treturn {cull: (\n\t\t\t\t(isDoubles ? doublesCondition : singlesCondition) ||\n\t\t\t\t!!counter.get('speedsetup') ||\n\t\t\t\tmoves.has('rest') || moves.has('roar') || moves.has('whirlwind') ||\n\t\t\t\t(moves.has('lightscreen') && moves.has('reflect'))\n\t\t\t)};\n\t\tcase 'pursuit':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.setupType ||\n\t\t\t\tcounter.get('Status') > 1 ||\n\t\t\t\tcounter.get('Dark') > 2 ||\n\t\t\t\t(moves.has('knockoff') && !types.has('Dark'))\n\t\t\t)};\n\t\tcase 'rapidspin':\n\t\t\treturn {cull: !!counter.setupType || !!teamDetails.rapidSpin};\n\t\tcase 'reversal':\n\t\t\treturn {cull: moves.has('substitute') && !!teamDetails.zMove};\n\t\tcase 'seismictoss': case 'superfang':\n\t\t\treturn {cull: !abilities.has('Parental Bond') && (counter.damagingMoves.size > 1 || !!counter.setupType)};\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['rest', 'substitute', 'trickroom'].some(m => moves.has(m)) ||\n\t\t\t\t!!teamDetails.stealthRock\n\t\t\t)};\n\t\tcase 'stickyweb':\n\t\t\treturn {cull: !!teamDetails.stickyWeb};\n\t\tcase 'toxicspikes':\n\t\t\treturn {cull: !!counter.setupType || !!teamDetails.toxicSpikes};\n\t\tcase 'trickroom':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.setupType ||\n\t\t\t\t!!counter.get('speedsetup') ||\n\t\t\t\tcounter.damagingMoves.size < 2 ||\n\t\t\t\tmoves.has('lightscreen') ||\n\t\t\t\tmoves.has('reflect')\n\t\t\t)};\n\t\tcase 'uturn':\n\t\t\treturn {cull: (\n\t\t\t\t(abilities.has('Speed Boost') && moves.has('protect')) ||\n\t\t\t\t(abilities.has('Protean') && counter.get('Status') > 2) ||\n\t\t\t\t!!counter.setupType ||\n\t\t\t\t!!counter.get('speedsetup') || (\n\t\t\t\t\ttypes.has('Bug') &&\n\t\t\t\t\tcounter.get('stab') < 2 &&\n\t\t\t\t\tcounter.damagingMoves.size > 2 &&\n\t\t\t\t\t!abilities.has('Adaptability') &&\n\t\t\t\t\t!abilities.has('Download')\n\t\t\t\t)\n\t\t\t)};\n\t\tcase 'voltswitch':\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['electricterrain', 'raindance', 'uturn'].some(m => moves.has(m))\n\t\t\t)};\n\n\t\t// Bit redundant to have both\n\t\t// Attacks:\n\t\tcase 'bugbite': case 'bugbuzz': case 'infestation': case 'signalbeam':\n\t\t\treturn {cull: moves.has('uturn') && !counter.setupType && !abilities.has('Tinted Lens')};\n\t\tcase 'darkestlariat': case 'nightslash':\n\t\t\treturn {cull: moves.has('knockoff') || moves.has('pursuit')};\n\t\tcase 'darkpulse':\n\t\t\treturn {cull: ['crunch', 'knockoff', 'hyperspacefury'].some(m => moves.has(m)) && counter.setupType !== 'Special'};\n\t\tcase 'suckerpunch':\n\t\t\treturn {cull: counter.damagingMoves.size < 2 || moves.has('glare') || !types.has('Dark') && counter.get('Dark') > 1};\n\t\tcase 'dracometeor':\n\t\t\treturn {cull: hasRestTalk};\n\t\tcase 'dragonpulse': case 'spacialrend':\n\t\t\treturn {cull: moves.has('dracometeor') || moves.has('outrage') || (moves.has('dragontail') && !counter.setupType)};\n\t\tcase 'outrage':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('dragonclaw') ||\n\t\t\t\t(moves.has('dracometeor') && counter.damagingMoves.size < 3) ||\n\t\t\t\t(moves.has('clangingscales') && !teamDetails.zMove)\n\t\t\t)};\n\t\tcase 'thunderbolt':\n\t\t\treturn {cull: ['discharge', 'voltswitch', 'wildcharge'].some(m => moves.has(m))};\n\t\tcase 'moonblast':\n\t\t\treturn {cull: isDoubles && moves.has('dazzlinggleam')};\n\t\tcase 'aurasphere': case 'focusblast':\n\t\t\treturn {cull: (\n\t\t\t\thasRestTalk ||\n\t\t\t\t((moves.has('closecombat') || moves.has('superpower')) && counter.setupType !== 'Special')\n\t\t\t)};\n\t\tcase 'drainpunch':\n\t\t\treturn {cull: (\n\t\t\t\t(!moves.has('bulkup') && (moves.has('closecombat') || moves.has('highjumpkick'))) ||\n\t\t\t\t((moves.has('focusblast') || moves.has('superpower')) && counter.setupType !== 'Physical')\n\t\t\t)};\n\t\tcase 'closecombat': case 'highjumpkick':\n\t\t\treturn {cull: (\n\t\t\t\t(moves.has('bulkup') && moves.has('drainpunch')) ||\n\t\t\t\t(counter.setupType === 'Special' && ['aurasphere', 'focusblast'].some(m => moves.has(m) || movePool.includes(m)))\n\t\t\t)};\n\t\tcase 'dynamicpunch': case 'vacuumwave':\n\t\t\treturn {cull: (moves.has('closecombat') || moves.has('facade')) && counter.setupType !== 'Special'};\n\t\tcase 'stormthrow':\n\t\t\treturn {cull: moves.has('circlethrow') && hasRestTalk};\n\t\tcase 'superpower':\n\t\t\treturn {\n\t\t\t\tcull: (counter.get('Fighting') > 1 && !!counter.setupType) || (hasRestTalk && !abilities.has('Contrary')),\n\t\t\t\tisSetup: abilities.has('Contrary'),\n\t\t\t};\n\t\tcase 'fierydance': case 'heatwave':\n\t\t\treturn {cull: moves.has('fireblast') && (!!counter.get('Status') || isDoubles)};\n\t\tcase 'firefang': case 'firepunch': case 'flamethrower':\n\t\t\treturn {cull: (\n\t\t\t\t['blazekick', 'heatwave', 'overheat'].some(m => moves.has(m)) ||\n\t\t\t\t((moves.has('fireblast') || moves.has('lavaplume')) && counter.setupType !== 'Physical')\n\t\t\t)};\n\t\tcase 'fireblast': case 'magmastorm':\n\t\t\treturn {cull: (\n\t\t\t\t(moves.has('flareblitz') && counter.setupType !== 'Special') ||\n\t\t\t\t(moves.has('lavaplume') && !counter.setupType && !counter.get('speedsetup'))\n\t\t\t)};\n\t\tcase 'lavaplume':\n\t\t\treturn {cull: moves.has('firepunch') || moves.has('fireblast') && (!!counter.setupType || !!counter.get('speedsetup'))};\n\t\tcase 'overheat':\n\t\t\treturn {cull: ['fireblast', 'flareblitz', 'lavaplume'].some(m => moves.has(m))};\n\t\tcase 'hurricane':\n\t\t\treturn {cull: moves.has('bravebird') || moves.has('airslash') && !!counter.get('Status')};\n\t\tcase 'hex':\n\t\t\treturn {cull: !moves.has('thunderwave') && !moves.has('willowisp')};\n\t\tcase 'shadowball':\n\t\t\treturn {cull: moves.has('darkpulse') || (moves.has('hex') && moves.has('willowisp'))};\n\t\tcase 'shadowclaw':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('shadowforce') ||\n\t\t\t\tmoves.has('shadowsneak') ||\n\t\t\t\t(moves.has('shadowball') && counter.setupType !== 'Physical')\n\t\t\t)};\n\t\tcase 'shadowsneak':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('trick') ||\n\t\t\t\thasRestTalk ||\n\t\t\t\t(types.has('Ghost') && species.types.length > 1 && counter.get('stab') < 2)\n\t\t\t)};\n\t\tcase 'gigadrain':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('petaldance') ||\n\t\t\t\tmoves.has('powerwhip') ||\n\t\t\t\t(!isDoubles && moves.has('seedbomb')) ||\n\t\t\t\t(moves.has('leafstorm') && counter.get('Special') < 4 && !counter.setupType && !moves.has('trickroom'))\n\t\t\t)};\n\t\tcase 'leafblade': case 'woodhammer':\n\t\t\treturn {cull: (\n\t\t\t\t(moves.has('gigadrain') && counter.setupType !== 'Physical') ||\n\t\t\t\t(moves.has('hornleech') && !!counter.setupType)\n\t\t\t)};\n\t\tcase 'leafstorm':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('trickroom') ||\n\t\t\t\t(isDoubles && moves.has('energyball')) ||\n\t\t\t\t(counter.get('Grass') > 1 && !!counter.setupType)\n\t\t\t)};\n\t\tcase 'seedbomb':\n\t\t\treturn {cull: moves.has('leafstorm') || isDoubles && moves.has('gigadrain')};\n\t\tcase 'solarbeam':\n\t\t\treturn {cull: (\n\t\t\t\t(!abilities.has('Drought') && !moves.has('sunnyday')) ||\n\t\t\t\tmoves.has('gigadrain') ||\n\t\t\t\tmoves.has('leafstorm')\n\t\t\t)};\n\t\tcase 'bonemerang': case 'precipiceblades':\n\t\t\treturn {cull: moves.has('earthquake')};\n\t\tcase 'earthpower':\n\t\t\treturn {cull: moves.has('earthquake') && counter.setupType !== 'Special'};\n\t\tcase 'earthquake':\n\t\t\treturn {cull: isDoubles && moves.has('highhorsepower')};\n\t\tcase 'freezedry':\n\t\t\treturn {cull: moves.has('icebeam') || moves.has('icywind') || counter.get('stab') < 2};\n\t\tcase 'bodyslam': case 'return':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('doubleedge') ||\n\t\t\t\t(moves.has('glare') && moves.has('headbutt')) ||\n\t\t\t\t(move.id === 'return' && moves.has('bodyslam'))\n\t\t\t)};\n\t\tcase 'endeavor':\n\t\t\treturn {cull: !isLead && !abilities.has('Defeatist')};\n\t\tcase 'explosion':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.setupType ||\n\t\t\t\tmoves.has('wish') ||\n\t\t\t\t(abilities.has('Refrigerate') && (moves.has('freezedry') || movePool.includes('return')))\n\t\t\t)};\n\t\tcase 'extremespeed': case 'skyattack':\n\t\t\treturn {cull: moves.has('substitute') || counter.setupType !== 'Physical' && moves.has('vacuumwave')};\n\t\tcase 'facade':\n\t\t\treturn {cull: moves.has('bulkup') || hasRestTalk};\n\t\tcase 'hiddenpower':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('rest') ||\n\t\t\t\t(!counter.get('stab') && counter.damagingMoves.size < 2) ||\n\t\t\t\t// Force Moonblast on Special-setup Fairies\n\t\t\t\t(counter.setupType === 'Special' && types.has('Fairy') && movePool.includes('moonblast'))\n\t\t\t)};\n\t\tcase 'hypervoice':\n\t\t\treturn {cull: moves.has('blizzard')};\n\t\tcase 'judgment':\n\t\t\treturn {cull: counter.setupType !== 'Special' && counter.get('stab') > 1};\n\t\tcase 'quickattack':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.get('speedsetup') ||\n\t\t\t\t(types.has('Rock') && !!counter.get('Status')) ||\n\t\t\t\tmoves.has('feint') ||\n\t\t\t\t(types.has('Normal') && !counter.get('stab'))\n\t\t\t)};\n\t\tcase 'weatherball':\n\t\t\treturn {cull: !moves.has('raindance') && !moves.has('sunnyday')};\n\t\tcase 'poisonjab':\n\t\t\treturn {cull: moves.has('gunkshot')};\n\t\tcase 'acidspray': case 'sludgewave':\n\t\t\treturn {cull: moves.has('poisonjab') || moves.has('sludgebomb')};\n\t\tcase 'psychic':\n\t\t\treturn {cull: moves.has('psyshock')};\n\t\tcase 'psychocut': case 'zenheadbutt':\n\t\t\treturn {cull: (\n\t\t\t\t((moves.has('psychic') || moves.has('psyshock')) && counter.setupType !== 'Physical') ||\n\t\t\t\t(abilities.has('Contrary') && !counter.setupType && !!counter.get('physicalpool'))\n\t\t\t)};\n\t\tcase 'psyshock':\n\t\t\tconst psychic = movePool.indexOf('psychic');\n\t\t\tif (psychic >= 0) this.fastPop(movePool, psychic);\n\t\t\treturn {cull: false};\n\t\tcase 'headsmash':\n\t\t\treturn {cull: moves.has('stoneedge') || isDoubles && moves.has('rockslide')};\n\t\tcase 'rockblast': case 'rockslide':\n\t\t\treturn {cull: (moves.has('headsmash') || moves.has('stoneedge')) && !isDoubles};\n\t\tcase 'stoneedge':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('rockslide') ||\n\t\t\t\t(abilities.has('Guts') && !moves.has('dynamicpunch')) ||\n\t\t\t\t(isDoubles && moves.has('rockslide'))\n\t\t\t)};\n\t\tcase 'bulletpunch':\n\t\t\treturn {cull: types.has('Steel') && counter.get('stab') < 2 && !abilities.has('Technician')};\n\t\tcase 'flashcannon':\n\t\t\treturn {cull: (moves.has('ironhead') || moves.has('meteormash')) && counter.setupType !== 'Special'};\n\t\tcase 'hydropump':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('liquidation') ||\n\t\t\t\tmoves.has('waterfall') ||\n\t\t\t\thasRestTalk || (\n\t\t\t\t\tmoves.has('scald') &&\n\t\t\t\t\t((counter.get('Special') < 4 && !moves.has('uturn')) || (species.types.length > 1 && counter.get('stab') < 3))\n\t\t\t\t)\n\t\t\t)};\n\t\tcase 'muddywater':\n\t\t\treturn {cull: isDoubles && (moves.has('scald') || moves.has('hydropump'))};\n\t\tcase 'originpulse': case 'surf':\n\t\t\treturn {cull: moves.has('hydropump') || moves.has('scald')};\n\t\tcase 'scald':\n\t\t\treturn {cull: ['liquidation', 'waterfall', 'waterpulse'].some(m => moves.has(m))};\n\n\t\t// Status:\n\t\tcase 'electroweb': case 'stunspore': case 'thunderwave':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.setupType ||\n\t\t\t\t!!counter.get('speedsetup') ||\n\t\t\t\thasRestTalk ||\n\t\t\t\t['discharge', 'spore', 'toxic', 'trickroom', 'yawn'].some(m => moves.has(m))\n\t\t\t)};\n\t\tcase 'glare': case 'headbutt':\n\t\t\treturn {cull: moves.has('bodyslam') || !moves.has('glare')};\n\t\tcase 'toxic':\n\t\t\tconst otherStatus = ['hypnosis', 'sleeppowder', 'toxicspikes', 'willowisp', 'yawn'].some(m => moves.has(m));\n\t\t\treturn {cull: otherStatus || !!counter.setupType || moves.has('flamecharge') || moves.has('raindance')};\n\t\tcase 'willowisp':\n\t\t\treturn {cull: moves.has('scald')};\n\t\tcase 'raindance':\n\t\t\treturn {cull: (\n\t\t\t\tcounter.get('Physical') + counter.get('Special') < 2 ||\n\t\t\t\thasRestTalk ||\n\t\t\t\tmoves.has('rest') ||\n\t\t\t\t(!types.has('Water') && !counter.get('Water'))\n\t\t\t)};\n\t\tcase 'sunnyday':\n\t\t\tconst cull = (\n\t\t\t\tcounter.get('Physical') + counter.get('Special') < 2 ||\n\t\t\t\t(!abilities.has('Chlorophyll') && !abilities.has('Flower Gift') && !moves.has('solarbeam')) ||\n\t\t\t\thasRestTalk\n\t\t\t);\n\n\t\t\tif (cull && movePool.length > 1) {\n\t\t\t\tconst solarbeam = movePool.indexOf('solarbeam');\n\t\t\t\tif (solarbeam >= 0) this.fastPop(movePool, solarbeam);\n\t\t\t\tif (movePool.length > 1) {\n\t\t\t\t\tconst weatherball = movePool.indexOf('weatherball');\n\t\t\t\t\tif (weatherball >= 0) this.fastPop(movePool, weatherball);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {cull};\n\t\tcase 'painsplit': case 'recover': case 'roost': case 'synthesis':\n\t\t\treturn {cull: moves.has('leechseed') || moves.has('rest')};\n\t\tcase 'substitute':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('dracometeor') ||\n\t\t\t\t(moves.has('leafstorm') && !abilities.has('Contrary')) ||\n\t\t\t\t['encore', 'pursuit', 'rest', 'taunt', 'uturn', 'voltswitch', 'whirlwind'].some(m => moves.has(m)) ||\n\t\t\t\tmovePool.includes('copycat')\n\t\t\t)};\n\t\tcase 'powersplit':\n\t\t\treturn {cull: moves.has('guardsplit')};\n\t\tcase 'wideguard':\n\t\t\treturn {cull: moves.has('protect')};\n\t\tcase 'bravebird':\n\t\t\t// Hurricane > Brave Bird in the rain\n\t\t\treturn {cull: (moves.has('raindance') || abilities.has('Drizzle')) && movePool.includes('hurricane')};\n\t\t}\n\t\treturn {cull: false};\n\t}\n\n\tshouldCullAbility(\n\t\tability: string,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tmovePool: string[],\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tisDoubles: boolean\n\t): boolean {\n\t\tswitch (ability) {\n\t\tcase 'Battle Bond': case 'Dazzling': case 'Flare Boost': case 'Hyper Cutter':\n\t\tcase 'Ice Body': case 'Innards Out': case 'Moody': case 'Steadfast':\n\t\t\treturn true;\n\t\tcase 'Aerilate': case 'Galvanize': case 'Pixilate': case 'Refrigerate':\n\t\t\treturn !counter.get('Normal');\n\t\tcase 'Analytic': case 'Download':\n\t\t\treturn species.nfe;\n\t\tcase 'Battle Armor': case 'Sturdy':\n\t\t\treturn (!!counter.get('recoil') && !counter.get('recovery'));\n\t\tcase 'Chlorophyll': case 'Leaf Guard':\n\t\t\treturn (\n\t\t\t\tspecies.baseStats.spe > 100 ||\n\t\t\t\tabilities.has('Harvest') ||\n\t\t\t\t(!moves.has('sunnyday') && !teamDetails.sun)\n\t\t\t);\n\t\tcase 'Competitive':\n\t\t\treturn (!counter.get('Special') || moves.has('sleeptalk') && moves.has('rest'));\n\t\tcase 'Compound Eyes': case 'No Guard':\n\t\t\treturn !counter.get('inaccurate');\n\t\tcase 'Contrary': case 'Iron Fist': case 'Skill Link': case 'Strong Jaw':\n\t\t\treturn !counter.get(toID(ability));\n\t\tcase 'Defiant': case 'Justified': case 'Moxie':\n\t\t\treturn !counter.get('Physical') || moves.has('dragontail');\n\t\tcase 'Flash Fire':\n\t\t\treturn abilities.has('Drought');\n\t\tcase 'Gluttony':\n\t\t\treturn !moves.has('bellydrum');\n\t\tcase 'Harvest':\n\t\t\treturn abilities.has('Frisk');\n\t\tcase 'Hustle':\n\t\t\treturn counter.get('Physical') < 2;\n\t\tcase 'Hydration': case 'Rain Dish': case 'Swift Swim':\n\t\t\treturn (species.baseStats.spe > 100 || !moves.has('raindance') && !teamDetails.rain);\n\t\tcase 'Slush Rush': case 'Snow Cloak':\n\t\t\treturn !teamDetails.hail;\n\t\tcase 'Immunity': case 'Snow Warning':\n\t\t\treturn (moves.has('facade') || moves.has('hypervoice'));\n\t\tcase 'Intimidate':\n\t\t\treturn (moves.has('bodyslam') || moves.has('rest') || abilities.has('Reckless') && counter.get('recoil') > 1);\n\t\tcase 'Lightning Rod':\n\t\t\treturn species.types.includes('Ground');\n\t\tcase 'Limber':\n\t\t\treturn species.types.includes('Electric');\n\t\tcase 'Liquid Voice':\n\t\t\treturn !counter.get('sound');\n\t\tcase 'Magic Guard': case 'Speed Boost':\n\t\t\treturn (abilities.has('Tinted Lens') && (!counter.get('Status') || moves.has('uturn')));\n\t\tcase 'Magician':\n\t\t\treturn moves.has('switcheroo');\n\t\tcase 'Magnet Pull':\n\t\t\treturn (!!counter.get('Normal') || !types.has('Electric') && !moves.has('earthpower'));\n\t\tcase 'Mold Breaker':\n\t\t\treturn (\n\t\t\t\tmoves.has('acrobatics') || moves.has('sleeptalk') ||\n\t\t\t\tabilities.has('Adaptability') || abilities.has('Iron Fist') ||\n\t\t\t\t(abilities.has('Sheer Force') && !!counter.get('sheerforce'))\n\t\t\t);\n\t\tcase 'Overgrow':\n\t\t\treturn !counter.get('Grass');\n\t\tcase 'Poison Heal':\n\t\t\treturn (abilities.has('Technician') && !!counter.get('technician'));\n\t\tcase 'Power Construct':\n\t\t\treturn species.forme === '10%';\n\t\tcase 'Prankster':\n\t\t\treturn !counter.get('Status');\n\t\tcase 'Pressure': case 'Synchronize':\n\t\t\treturn (counter.get('Status') < 2 || !!counter.get('recoil') || !!species.isMega);\n\t\tcase 'Regenerator':\n\t\t\treturn abilities.has('Magic Guard');\n\t\tcase 'Quick Feet':\n\t\t\treturn moves.has('bellydrum');\n\t\tcase 'Reckless': case 'Rock Head':\n\t\t\treturn (!counter.get('recoil') || !!species.isMega);\n\t\tcase 'Sand Force': case 'Sand Rush': case 'Sand Veil':\n\t\t\treturn !teamDetails.sand;\n\t\tcase 'Scrappy':\n\t\t\treturn !species.types.includes('Normal');\n\t\tcase 'Serene Grace':\n\t\t\treturn (!counter.get('serenegrace') || species.name === 'Blissey');\n\t\tcase 'Sheer Force':\n\t\t\treturn (!counter.get('sheerforce') || moves.has('doubleedge') || abilities.has('Guts') || !!species.isMega);\n\t\tcase 'Simple':\n\t\t\treturn (!counter.setupType && !moves.has('flamecharge'));\n\t\tcase 'Solar Power':\n\t\t\treturn (!counter.get('Special') || !teamDetails.sun || !!species.isMega);\n\t\tcase 'Swarm':\n\t\t\treturn (!counter.get('Bug') || !!species.isMega);\n\t\tcase 'Sweet Veil':\n\t\t\treturn types.has('Grass');\n\t\tcase 'Technician':\n\t\t\treturn (!counter.get('technician') || moves.has('tailslap') || !!species.isMega);\n\t\tcase 'Tinted Lens':\n\t\t\treturn (\n\t\t\t\tmoves.has('protect') || !!counter.get('damage') ||\n\t\t\t\t(counter.get('Status') > 2 && !counter.setupType) ||\n\t\t\t\tabilities.has('Prankster') ||\n\t\t\t\t(abilities.has('Magic Guard') && !!counter.get('Status'))\n\t\t\t);\n\t\tcase 'Torrent':\n\t\t\treturn (!counter.get('Water') || !!species.isMega);\n\t\tcase 'Unaware':\n\t\t\treturn (!!counter.setupType || abilities.has('Magic Guard'));\n\t\tcase 'Unburden':\n\t\t\treturn (!!species.isMega || abilities.has('Prankster') || !counter.setupType && !moves.has('acrobatics'));\n\t\tcase 'Water Absorb':\n\t\t\treturn moves.has('raindance') || ['Drizzle', 'Unaware', 'Volt Absorb'].some(abil => abilities.has(abil));\n\t\tcase 'Weak Armor':\n\t\t\treturn counter.setupType !== 'Physical';\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tgetHighPriorityItem(\n\t\tability: string,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tisLead: boolean,\n\t\tisDoubles: boolean\n\t): string | undefined {\n\t\tif (species.requiredItems) {\n\t\t\tif (\n\t\t\t\tspecies.baseSpecies === 'Arceus' &&\n\t\t\t\t(moves.has('judgment') || !counter.get(species.types[0]) || teamDetails.zMove)\n\t\t\t) {\n\t\t\t\t// Judgment doesn't change type with Z-Crystals\n\t\t\t\treturn species.requiredItems[0];\n\t\t\t}\n\t\t\treturn this.sample(species.requiredItems);\n\t\t}\n\n\t\t// First, the extra high-priority items\n\t\tif (species.name === 'Dedenne') return moves.has('substitute') ? 'Petaya Berry' : 'Sitrus Berry';\n\t\tif (species.name === 'Deoxys-Attack') return (isLead && moves.has('stealthrock')) ? 'Focus Sash' : 'Life Orb';\n\t\tif (species.name === 'Farfetch\\u2019d') return 'Stick';\n\t\tif (species.name === 'Genesect' && moves.has('technoblast')) return 'Douse Drive';\n\t\tif (species.baseSpecies === 'Marowak') return 'Thick Club';\n\t\tif (species.name === 'Pikachu') return 'Light Ball';\n\t\tif (species.name === 'Shedinja' || species.name === 'Smeargle') return 'Focus Sash';\n\t\tif (species.name === 'Unfezant' && counter.get('Physical') >= 2) return 'Scope Lens';\n\t\tif (species.name === 'Unown') return 'Choice Specs';\n\t\tif (species.name === 'Wobbuffet') return 'Custap Berry';\n\t\tif (ability === 'Harvest' || ability === 'Emergency Exit' && !!counter.get('Status')) return 'Sitrus Berry';\n\t\tif (ability === 'Imposter') return 'Choice Scarf';\n\t\tif (ability === 'Poison Heal') return 'Toxic Orb';\n\t\tif (species.nfe) return (ability === 'Technician' && counter.get('Physical') >= 4) ? 'Choice Band' : 'Eviolite';\n\t\tif (moves.has('switcheroo') || moves.has('trick')) {\n\t\t\tif (species.baseStats.spe >= 60 && species.baseStats.spe <= 108) {\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('bellydrum')) {\n\t\t\tif (ability === 'Gluttony') {\n\t\t\t\treturn `${this.sample(['Aguav', 'Figy', 'Iapapa', 'Mago', 'Wiki'])} Berry`;\n\t\t\t} else if (species.baseStats.spe <= 50 && !teamDetails.zMove && this.randomChance(1, 2)) {\n\t\t\t\treturn 'Normalium Z';\n\t\t\t} else {\n\t\t\t\treturn 'Sitrus Berry';\n\t\t\t}\n\t\t}\n\t\tif (moves.has('copycat') && counter.get('Physical') >= 3) return 'Choice Band';\n\t\tif (moves.has('geomancy') || moves.has('skyattack')) return 'Power Herb';\n\t\tif (moves.has('shellsmash')) {\n\t\t\treturn (ability === 'Solid Rock' && !!counter.get('priority')) ? 'Weakness Policy' : 'White Herb';\n\t\t}\n\t\tif ((ability === 'Guts' || moves.has('facade')) && !moves.has('sleeptalk')) {\n\t\t\treturn (types.has('Fire') || ability === 'Quick Feet' || ability === 'Toxic Boost') ? 'Toxic Orb' : 'Flame Orb';\n\t\t}\n\t\tif (\n\t\t\t(ability === 'Magic Guard' && counter.damagingMoves.size > 1) ||\n\t\t\t(ability === 'Sheer Force' && counter.get('sheerforce'))\n\t\t) {\n\t\t\treturn 'Life Orb';\n\t\t}\n\t\tif (ability === 'Unburden') return moves.has('fakeout') ? 'Normal Gem' : 'Sitrus Berry';\n\t\tif (moves.has('acrobatics')) return '';\n\t\tif (moves.has('electricterrain') || ability === 'Electric Surge' && moves.has('thunderbolt')) return 'Electrium Z';\n\t\tif (\n\t\t\tmoves.has('happyhour') ||\n\t\t\tmoves.has('holdhands') ||\n\t\t\t(moves.has('encore') && ability === 'Contrary')\n\t\t) return 'Normalium Z';\n\t\tif (moves.has('raindance')) {\n\t\t\tif (species.baseSpecies === 'Castform' && !teamDetails.zMove) {\n\t\t\t\treturn 'Waterium Z';\n\t\t\t} else {\n\t\t\t\treturn (ability === 'Forecast') ? 'Damp Rock' : 'Life Orb';\n\t\t\t}\n\t\t}\n\t\tif (moves.has('sunnyday')) {\n\t\t\tif ((species.baseSpecies === 'Castform' || species.baseSpecies === 'Cherrim') && !teamDetails.zMove) {\n\t\t\t\treturn 'Firium Z';\n\t\t\t} else {\n\t\t\t\treturn (ability === 'Forecast') ? 'Heat Rock' : 'Life Orb';\n\t\t\t}\n\t\t}\n\n\t\tif (moves.has('solarbeam') && ability !== 'Drought' && !moves.has('sunnyday') && !teamDetails.sun) {\n\t\t\treturn !teamDetails.zMove ? 'Grassium Z' : 'Power Herb';\n\t\t}\n\n\t\tif (moves.has('auroraveil') || moves.has('lightscreen') && moves.has('reflect')) return 'Light Clay';\n\t\tif (\n\t\t\tmoves.has('rest') && !moves.has('sleeptalk') &&\n\t\t\tability !== 'Natural Cure' && ability !== 'Shed Skin' && ability !== 'Shadow Tag'\n\t\t) {\n\t\t\treturn 'Chesto Berry';\n\t\t}\n\n\t\t// Z-Moves\n\t\tif (!teamDetails.zMove) {\n\t\t\tif (species.name === 'Decidueye' && moves.has('spiritshackle') && counter.setupType) {\n\t\t\t\treturn 'Decidium Z';\n\t\t\t}\n\t\t\tif (species.name === 'Kommo-o') return moves.has('clangingscales') ? 'Kommonium Z' : 'Dragonium Z';\n\t\t\tif (species.baseSpecies === 'Lycanroc' && moves.has('stoneedge') && counter.setupType) {\n\t\t\t\treturn 'Lycanium Z';\n\t\t\t}\n\t\t\tif (species.name === 'Marshadow' && moves.has('spectralthief') && counter.setupType) {\n\t\t\t\treturn 'Marshadium Z';\n\t\t\t}\n\t\t\tif (species.name === 'Necrozma-Dusk-Mane' || species.name === 'Necrozma-Dawn-Wings') {\n\t\t\t\tif (moves.has('autotomize') && moves.has('sunsteelstrike')) {\n\t\t\t\t\treturn 'Solganium Z';\n\t\t\t\t} else if (moves.has('trickroom') && moves.has('moongeistbeam')) {\n\t\t\t\t\treturn 'Lunalium Z';\n\t\t\t\t} else {\n\t\t\t\t\treturn 'Ultranecrozium Z';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (species.name === 'Mimikyu' && moves.has('playrough') && counter.setupType) return 'Mimikium Z';\n\t\t\tif (species.name === 'Raichu-Alola' && moves.has('thunderbolt') && counter.setupType) return 'Aloraichium Z';\n\t\t\tif (moves.has('bugbuzz') && counter.setupType && species.baseStats.spa > 100) return 'Buginium Z';\n\t\t\tif (\n\t\t\t\t(moves.has('darkpulse') && ability === 'Fur Coat' && counter.setupType) ||\n\t\t\t\t(moves.has('suckerpunch') && ability === 'Moxie' && counter.get('Dark') < 2)\n\t\t\t) {\n\t\t\t\treturn 'Darkinium Z';\n\t\t\t}\n\t\t\tif (moves.has('outrage') && counter.setupType && !moves.has('fly')) return 'Dragonium Z';\n\t\t\tif (moves.has('fleurcannon') && !!counter.get('speedsetup')) return 'Fairium Z';\n\t\t\tif (\n\t\t\t\t(moves.has('focusblast') && types.has('Fighting') && counter.setupType) ||\n\t\t\t\t(moves.has('reversal') && moves.has('substitute'))\n\t\t\t) {\n\t\t\t\treturn 'Fightinium Z';\n\t\t\t}\n\t\t\tif (\n\t\t\t\tmoves.has('fly') ||\n\t\t\t\t(moves.has('hurricane') && species.baseStats.spa >= 125 && (!!counter.get('Status') || moves.has('superpower'))) ||\n\t\t\t\t((moves.has('bounce') || moves.has('bravebird')) && counter.setupType)\n\t\t\t) {\n\t\t\t\treturn 'Flyinium Z';\n\t\t\t}\n\t\t\tif (moves.has('shadowball') && counter.setupType && ability === 'Beast Boost') return 'Ghostium Z';\n\t\t\tif (\n\t\t\t\tmoves.has('sleeppowder') && types.has('Grass') &&\n\t\t\t\tcounter.setupType && species.baseStats.spe <= 70\n\t\t\t) {\n\t\t\t\treturn 'Grassium Z';\n\t\t\t}\n\t\t\tif (moves.has('magmastorm')) return 'Firium Z';\n\t\t\tif (moves.has('dig')) return 'Groundium Z';\n\t\t\tif (moves.has('photongeyser') && counter.setupType) return 'Psychium Z';\n\t\t\tif (moves.has('stoneedge') && types.has('Rock') && moves.has('swordsdance')) return 'Rockium Z';\n\t\t\tif (moves.has('hydropump') && ability === 'Battle Bond' && moves.has('uturn')) return 'Waterium Z';\n\t\t\tif ((moves.has('hail') || (moves.has('blizzard') && ability !== 'Snow Warning'))) return 'Icium Z';\n\t\t}\n\t}\n\n\tgetMediumPriorityItem(\n\t\tability: string,\n\t\tmoves: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tspecies: Species,\n\t\tisDoubles: boolean,\n\t\tisLead: 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\t(ability === 'Speed Boost' || ability === 'Stance Change' || species.name === 'Pheromosa') &&\n\t\t\tcounter.get('Physical') + counter.get('Special') > 2 &&\n\t\t\t!moves.has('uturn')\n\t\t) {\n\t\t\treturn 'Life Orb';\n\t\t}\n\n\t\tif (isDoubles && moves.has('uturn') && counter.get('Physical') === 4 && !moves.has('fakeout')) {\n\t\t\treturn (\n\t\t\t\tspecies.baseStats.spe >= 60 && species.baseStats.spe <= 108 &&\n\t\t\t\t!counter.get('priority') && this.randomChance(1, 2)\n\t\t\t) ? 'Choice Scarf' : 'Choice Band';\n\t\t}\n\t\tif (isDoubles && counter.get('Special') === 4 && (moves.has('waterspout') || moves.has('eruption'))) {\n\t\t\treturn 'Choice Scarf';\n\t\t}\n\n\t\tif (\n\t\t\t!isDoubles &&\n\t\t\tcounter.get('Physical') >= 4 &&\n\t\t\t['bodyslam', 'dragontail', 'fakeout', 'flamecharge', 'rapidspin', 'suckerpunch'].every(m => !moves.has(m))\n\t\t) {\n\t\t\treturn (\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\t!counter.get('priority') &&\n\t\t\t\tthis.randomChance(2, 3)\n\t\t\t) ? 'Choice Scarf' : 'Choice Band';\n\t\t}\n\t\tif (\n\t\t\t!isDoubles &&\n\t\t\t(counter.get('Special') >= 4 || (counter.get('Special') >= 3 && moves.has('uturn'))) &&\n\t\t\t!moves.has('acidspray') && !moves.has('clearsmog')\n\t\t) {\n\t\t\treturn (\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' &&\n\t\t\t\t!counter.get('Physical') && !counter.get('priority') &&\n\t\t\t\tthis.randomChance(2, 3)\n\t\t\t) ? '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\tmoves.has('defog') &&\n\t\t\t!moves.has('foulplay') &&\n\t\t\tspecies.baseStats.spe >= 60 && species.baseStats.spe <= 108 &&\n\t\t\t!counter.get('priority')\n\t\t) {\n\t\t\treturn 'Choice Scarf';\n\t\t}\n\t\tif (!isDoubles && (\n\t\t\tability === 'Drizzle' ||\n\t\t\tability === 'Slow Start' ||\n\t\t\tspecies.name.includes('Rotom-') ||\n\t\t\t['aromatherapy', 'bite', 'clearsmog', 'curse', 'protect', 'sleeptalk'].some(m => moves.has(m)))\n\t\t) {\n\t\t\treturn 'Leftovers';\n\t\t}\n\t\tif (['endeavor', 'flail', 'reversal'].some(m => moves.has(m)) && ability !== 'Sturdy') {\n\t\t\treturn (ability === 'Defeatist') ? 'Expert Belt' : 'Focus Sash';\n\t\t}\n\t\tif (moves.has('outrage') && counter.setupType) return 'Lum Berry';\n\t\tif (\n\t\t\tisDoubles &&\n\t\t\tcounter.damagingMoves.size >= 3 &&\n\t\t\tspecies.baseStats.spe >= 70 &&\n\t\t\tability !== 'Multiscale' && ability !== 'Sturdy' && [\n\t\t\t\t'acidspray', 'electroweb', 'fakeout', 'feint', 'flamecharge', 'icywind',\n\t\t\t\t'incinerate', 'naturesmadness', 'rapidspin', 'snarl', 'suckerpunch', 'uturn',\n\t\t\t].every(m => !moves.has(m))\n\t\t) {\n\t\t\treturn defensiveStatTotal >= 275 ? 'Sitrus Berry' : 'Life Orb';\n\t\t}\n\n\t\tif (moves.has('substitute')) return counter.damagingMoves.size > 2 && !!counter.get('drain') ? 'Life Orb' : 'Leftovers';\n\t\tif (\n\t\t\t!isDoubles &&\n\t\t\tthis.dex.getEffectiveness('Ground', species) >= 2 &&\n\t\t\tability !== 'Levitate' &&\n\t\t\t!moves.has('magnetrise')\n\t\t) {\n\t\t\treturn 'Air Balloon';\n\t\t}\n\t\tif ((ability === 'Iron Barbs' || ability === 'Rough Skin') && this.randomChance(1, 2)) return 'Rocky Helmet';\n\t\tif (\n\t\t\tcounter.get('Physical') + counter.get('Special') >= 4 &&\n\t\t\tspecies.baseStats.spd >= 50 && defensiveStatTotal >= 235\n\t\t) {\n\t\t\treturn 'Assault Vest';\n\t\t}\n\t\tif (species.name === 'Palkia' && (moves.has('dracometeor') || moves.has('spacialrend')) && moves.has('hydropump')) {\n\t\t\treturn 'Lustrous Orb';\n\t\t}\n\t\tif (counter.damagingMoves.size >= 4) {\n\t\t\treturn (counter.get('Dragon') || counter.get('Dark') || counter.get('Normal')) ? 'Life Orb' : 'Expert Belt';\n\t\t}\n\t\tif (counter.damagingMoves.size >= 3 && !!counter.get('speedsetup') && defensiveStatTotal >= 300) {\n\t\t\treturn 'Weakness Policy';\n\t\t}\n\t\tif (\n\t\t\t!isDoubles && isLead &&\n\t\t\t!['Regenerator', 'Sturdy'].includes(ability) &&\n\t\t\t!counter.get('recoil') && !counter.get('recovery') &&\n\t\t\tdefensiveStatTotal < 255\n\t\t) {\n\t\t\treturn 'Focus Sash';\n\t\t}\n\t}\n\n\tgetLowPriorityItem(\n\t\tability: string,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tisLead: boolean,\n\t\tisDoubles: boolean\n\t): string | undefined {\n\t\t// This is the \"REALLY can't think of a good item\" cutoff\n\t\tif (moves.has('stickyweb') && ability === 'Sturdy') return 'Mental Herb';\n\t\tif (ability === 'Serene Grace' && moves.has('airslash') && species.baseStats.spe > 100) return 'Metronome';\n\t\tif (ability === 'Sturdy' && moves.has('explosion') && !counter.get('speedsetup')) return 'Custap Berry';\n\t\tif (ability === 'Super Luck') return 'Scope Lens';\n\t\tif (\n\t\t\t!isDoubles &&\n\t\t\tcounter.damagingMoves.size >= 3 &&\n\t\t\tability !== 'Sturdy' &&\n\t\t\t['acidspray', 'dragontail', 'foulplay', 'rapidspin', 'superfang', 'uturn'].every(m => !moves.has(m)) && (\n\t\t\t\tcounter.get('speedsetup') ||\n\t\t\t\tmoves.has('trickroom') ||\n\t\t\t\t(species.baseStats.spe > 40 && species.baseStats.hp + species.baseStats.def + species.baseStats.spd < 275)\n\t\t\t)\n\t\t) {\n\t\t\treturn 'Life Orb';\n\t\t}\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): RandomTeamsTypes.RandomSet {\n\t\tspecies = this.dex.species.get(species);\n\t\tlet forme = species.name;\n\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\tforme = species.battleOnly;\n\t\t}\n\t\tif (species.cosmeticFormes) {\n\t\t\tforme = this.sample([species.name].concat(species.cosmeticFormes));\n\t\t}\n\n\t\tconst randMoves = isDoubles ?\n\t\t\t(species.randomDoubleBattleMoves || species.randomBattleMoves) :\n\t\t\tspecies.randomBattleMoves;\n\t\tconst movePool = (randMoves || Object.keys(this.dex.species.getLearnset(species.id)!)).slice();\n\t\tif (this.format.gameType === 'multi') {\n\t\t\t// Random Multi Battle uses doubles move pools, but Ally Switch fails in multi battles\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\tconst moves = new Set<string>();\n\t\tlet ability = '';\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<string>();\n\t\tfor (const abilityName of Object.values(species.abilities)) {\n\t\t\tif (abilityName === species.abilities.S || (species.unreleasedHidden && abilityName === species.abilities.H)) continue;\n\t\t\tabilities.add(abilityName);\n\t\t}\n\n\t\tlet availableHP = 0;\n\t\tfor (const moveid of movePool) {\n\t\t\tif (moveid.startsWith('hiddenpower')) availableHP++;\n\t\t}\n\n\t\t// These moves can be used even if we aren't setting up to use them:\n\t\tconst SetupException = ['closecombat', 'diamondstorm', 'extremespeed', 'superpower', 'clangingscales'];\n\n\t\tlet counter: MoveCounter;\n\t\t// We use a special variable to track Hidden Power\n\t\t// so that we can check for all Hidden Powers at once\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\twhile (moves.size < this.maxMoveCount && movePool.length) {\n\t\t\t\tconst moveid = this.sampleNoReplace(movePool);\n\t\t\t\tif (moveid.startsWith('hiddenpower')) {\n\t\t\t\t\tavailableHP--;\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\t\t\twhile (moves.size < this.maxMoveCount && rejectedPool.length) {\n\t\t\t\tconst moveid = this.sampleNoReplace(rejectedPool);\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\n\t\t\t\tlet {cull, isSetup} = this.shouldCullMove(\n\t\t\t\t\tmove, types, moves, abilities, counter, movePool, teamDetails,\n\t\t\t\t\tspecies, isLead, isDoubles\n\t\t\t\t);\n\n\t\t\t\t// This move doesn't satisfy our setup requirements:\n\t\t\t\tif (\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]) + (counter.get(species.types[1]) || 0);\n\t\t\t\t\tif (\n\t\t\t\t\t\t!SetupException.includes(moveid) &&\n\t\t\t\t\t\t(!types.has(move.type) || stabs > 1 || counter.get(move.category) < 2)\n\t\t\t\t\t) cull = true;\n\t\t\t\t}\n\t\t\t\t// Hidden Power isn't good enough\n\t\t\t\tif (\n\t\t\t\t\tcounter.setupType === 'Special' &&\n\t\t\t\t\tmoveid === 'hiddenpower' &&\n\t\t\t\t\tspecies.types.length > 1 &&\n\t\t\t\t\tcounter.get('Special') <= 2 &&\n\t\t\t\t\t!types.has(move.type) &&\n\t\t\t\t\t!counter.get('Physical') &&\n\t\t\t\t\tcounter.get('specialpool')\n\t\t\t\t) {\n\t\t\t\t\tcull = true;\n\t\t\t\t}\n\n\t\t\t\tconst singlesEnforcement = (\n\t\t\t\t\t!['judgment', 'lightscreen', 'reflect', 'sleeptalk', 'toxic'].includes(moveid) && (\n\t\t\t\t\t\tmove.category !== 'Status' ||\n\t\t\t\t\t\t// should allow Meganium to cull a recovery move for the sake of STAB\n\t\t\t\t\t\t!(move.flags.heal && species.id !== 'meganium')\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\t// Pokemon should have moves that benefit their Type/Ability/Weather, as well as moves required by its forme\n\t\t\t\tif (\n\t\t\t\t\t!cull &&\n\t\t\t\t\t!move.damage &&\n\t\t\t\t\t!isSetup &&\n\t\t\t\t\t!move.weather &&\n\t\t\t\t\t!move.stallingMove &&\n\t\t\t\t\t(isDoubles || singlesEnforcement) && (\n\t\t\t\t\t\t!counter.setupType || counter.setupType === 'Mixed' ||\n\t\t\t\t\t\t(move.category !== counter.setupType && move.category !== 'Status') ||\n\t\t\t\t\t\t(counter.get(counter.setupType) + counter.get('Status') > 3 && !counter.get('hazards'))\n\t\t\t\t\t) && (\n\t\t\t\t\t\tmove.category === 'Status' ||\n\t\t\t\t\t\t!types.has(move.type) ||\n\t\t\t\t\t\t(move.basePower && move.basePower < 40 && !move.multihit)\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tif (\n\t\t\t\t\t\t(!counter.get('stab') && !moves.has('nightshade') && !moves.has('seismictoss') && (\n\t\t\t\t\t\t\tspecies.types.length > 1 ||\n\t\t\t\t\t\t\t(species.types[0] !== 'Normal' && species.types[0] !== 'Psychic') ||\n\t\t\t\t\t\t\t!moves.has('icebeam') ||\n\t\t\t\t\t\t\tspecies.baseStats.spa >= species.baseStats.spd\n\t\t\t\t\t\t)) || (\n\t\t\t\t\t\t\tmoves.has('suckerpunch') && !abilities.has('Contrary') && counter.get('stab') < species.types.length\n\t\t\t\t\t\t) || (\n\t\t\t\t\t\t\t(['recover', 'roost', 'slackoff', 'softboiled'].some(m => movePool.includes(m))) &&\n\t\t\t\t\t\t\tcounter.get('Status') &&\n\t\t\t\t\t\t\t!counter.setupType &&\n\t\t\t\t\t\t\t['healingwish', 'trick', 'trickroom'].every(m => !moves.has(m))\n\t\t\t\t\t\t) || (\n\t\t\t\t\t\t\tmovePool.includes('milkdrink') ||\n\t\t\t\t\t\t\tmovePool.includes('shoreup') ||\n\t\t\t\t\t\t\t(movePool.includes('stickyweb') && !counter.setupType && !teamDetails.stickyWeb)\n\t\t\t\t\t\t) || (\n\t\t\t\t\t\t\tisLead &&\n\t\t\t\t\t\t\tmovePool.includes('stealthrock') &&\n\t\t\t\t\t\t\tcounter.get('Status') && !counter.setupType &&\n\t\t\t\t\t\t\t!counter.get('speedsetup') && !moves.has('substitute')\n\t\t\t\t\t\t) || (\n\t\t\t\t\t\t\tspecies.requiredMove && movePool.includes(toID(species.requiredMove))\n\t\t\t\t\t\t) || (\n\t\t\t\t\t\t\t!counter.get('Normal') &&\n\t\t\t\t\t\t\t(abilities.has('Aerilate') || abilities.has('Pixilate') || (abilities.has('Refrigerate') && !moves.has('blizzard')))\n\t\t\t\t\t\t)\n\t\t\t\t\t) {\n\t\t\t\t\t\tcull = true;\n\t\t\t\t\t} else {\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\tfor (const abil of abilities) {\n\t\t\t\t\t\t\tif (runEnforcementChecker(abil)) {\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 (moveid === '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\tconst moveIsHP = moveid.startsWith('hiddenpower');\n\t\t\t\tif (cull && (\n\t\t\t\t\tmovePool.length - availableHP ||\n\t\t\t\t\t(availableHP && (moveIsHP || !hasHiddenPower))\n\t\t\t\t)) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tmove.category !== 'Status' &&\n\t\t\t\t\t\t!move.damage &&\n\t\t\t\t\t\t!move.flags.charge &&\n\t\t\t\t\t\t(!moveIsHP || !availableHP)\n\t\t\t\t\t) {\n\t\t\t\t\t\trejectedPool.push(moveid);\n\t\t\t\t\t}\n\t\t\t\t\tif (moveIsHP) hasHiddenPower = false;\n\t\t\t\t\tmoves.delete(moveid);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (cull && rejectedPool.length) {\n\t\t\t\t\tif (moveIsHP) 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// Moveset modifications\n\t\tif (moves.has('autotomize') && moves.has('heavyslam')) {\n\t\t\tif (species.id === 'celesteela') {\n\t\t\t\tmoves.delete('heavyslam');\n\t\t\t\tmoves.add('flashcannon');\n\t\t\t} else {\n\t\t\t\tmoves.delete('autotomize');\n\t\t\t\tmoves.add('rockpolish');\n\t\t\t}\n\t\t}\n\t\tif (moves.has('raindance') && moves.has('thunderbolt') && !isDoubles) {\n\t\t\tmoves.delete('thunderbolt');\n\t\t\tmoves.add('thunder');\n\t\t}\n\t\tif (moves.has('workup') && !counter.get('Special') && species.id === 'zeraora') {\n\t\t\tmoves.delete('workup');\n\t\t\tmoves.add('bulkup');\n\t\t}\n\n\t\tconst battleOnly = species.battleOnly && !species.requiredAbility;\n\t\tconst baseSpecies: Species = battleOnly ? this.dex.species.get(species.battleOnly as string) : species;\n\n\t\tconst abilityData = Object.values(baseSpecies.abilities).map(a => this.dex.abilities.get(a));\n\t\tUtils.sortBy(abilityData, abil => -abil.rating);\n\n\t\tif (abilityData[1]) {\n\t\t\t// Sort abilities by rating with an element of randomness\n\t\t\tif (abilityData[2] && abilityData[1].rating <= abilityData[2].rating && this.randomChance(1, 2)) {\n\t\t\t\t[abilityData[1], abilityData[2]] = [abilityData[2], abilityData[1]];\n\t\t\t}\n\t\t\tif (abilityData[0].rating <= abilityData[1].rating && this.randomChance(1, 2)) {\n\t\t\t\t[abilityData[0], abilityData[1]] = [abilityData[1], abilityData[0]];\n\t\t\t} else if (abilityData[0].rating - 0.6 <= abilityData[1].rating && this.randomChance(2, 3)) {\n\t\t\t\t[abilityData[0], abilityData[1]] = [abilityData[1], abilityData[0]];\n\t\t\t}\n\t\t\tability = abilityData[0].name;\n\n\t\t\twhile (this.shouldCullAbility(\n\t\t\t\tability, types, moves, abilities, counter, movePool, teamDetails, species, isDoubles\n\t\t\t)) {\n\t\t\t\tif (ability === abilityData[0].name && abilityData[1].rating >= 1) {\n\t\t\t\t\tability = abilityData[1].name;\n\t\t\t\t} else if (ability === abilityData[1].name && abilityData[2] && abilityData[2].rating >= 1) {\n\t\t\t\t\tability = abilityData[2].name;\n\t\t\t\t} else {\n\t\t\t\t\t// Default to the highest rated ability if all are rejected\n\t\t\t\t\tability = abilityData[0].name;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tabilities.has('Guts') &&\n\t\t\t\tability !== 'Quick Feet' &&\n\t\t\t\t(moves.has('facade') || (moves.has('protect') && !isDoubles) || (moves.has('sleeptalk') && moves.has('rest')))\n\t\t\t) {\n\t\t\t\tability = 'Guts';\n\t\t\t} else if (abilities.has('Moxie') && (counter.get('Physical') > 3 || moves.has('bounce')) && !isDoubles) {\n\t\t\t\tability = 'Moxie';\n\t\t\t} else if (isDoubles) {\n\t\t\t\tif (abilities.has('Intimidate') && !battleOnly) ability = 'Intimidate';\n\t\t\t\tif (abilities.has('Guts') && ability !== 'Intimidate') ability = 'Guts';\n\t\t\t\tif (abilities.has('Storm Drain')) ability = 'Storm Drain';\n\t\t\t\tif (abilities.has('Harvest')) ability = 'Harvest';\n\t\t\t\tif (abilities.has('Unburden') && ability !== 'Prankster' && !species.isMega) ability = 'Unburden';\n\t\t\t}\n\t\t\tif (species.name === 'Ambipom' && !counter.get('technician')) {\n\t\t\t\t// If it doesn't qualify for Technician, Skill Link is useless on it\n\t\t\t\tability = 'Pickup';\n\t\t\t}\n\t\t\tif (species.name === 'Raticate-Alola') ability = 'Hustle';\n\t\t\tif (species.name === 'Altaria') ability = 'Natural Cure';\n\t\t} else {\n\t\t\tability = abilityData[0].name;\n\t\t}\n\n\t\tif (species.name === 'Genesect' && moves.has('technoblast')) forme = 'Genesect-Douse';\n\t\tif (!isDoubles && species.id === 'pikachu') {\n\t\t\tconst pikachuForme = this.sample(['', '-Original', '-Hoenn', '-Sinnoh', '-Unova', '-Kalos', '-Alola', '-Partner']);\n\t\t\tforme = `Pikachu${pikachuForme}`;\n\t\t\tif (forme !== 'Pikachu') ability = 'Static';\n\t\t}\n\n\t\tif (\n\t\t\t!moves.has('photongeyser') &&\n\t\t\t!teamDetails.zMove &&\n\t\t\t(species.name === 'Necrozma-Dusk-Mane' || species.name === 'Necrozma-Dawn-Wings')\n\t\t) {\n\t\t\tfor (const moveid of moves) {\n\t\t\t\tconst move = this.dex.moves.get(moveid);\n\t\t\t\tif (move.category === 'Status' || types.has(move.type)) continue;\n\t\t\t\tmoves.delete(moveid);\n\t\t\t\tmoves.add('photongeyser');\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tlet item = this.getHighPriorityItem(ability, types, moves, counter, teamDetails, species, isLead, isDoubles);\n\t\tif (item === undefined) item = this.getMediumPriorityItem(ability, moves, counter, species, isDoubles, isLead);\n\t\tif (item === undefined) {\n\t\t\titem = this.getLowPriorityItem(ability, types, moves, abilities, counter, teamDetails, species, isLead, isDoubles);\n\t\t}\n\n\t\t// fallback\n\t\tif (item === undefined) item = isDoubles ? 'Sitrus Berry' : 'Leftovers';\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\tlet level: number;\n\t\tif (this.adjustLevel) {\n\t\t\tlevel = this.adjustLevel;\n\t\t} else if (!isDoubles) {\n\t\t\tconst levelScale: {[k: string]: number} = {uber: 76, ou: 80, uu: 82, ru: 84, nu: 86, pu: 88};\n\t\t\tconst customScale: {[k: string]: number} = {\n\t\t\t\t// Banned Ability\n\t\t\t\tDugtrio: 82, Gothitelle: 82, Pelipper: 84, Politoed: 84, Torkoal: 84, Wobbuffet: 82,\n\t\t\t\t// Holistic judgement\n\t\t\t\t'Castform-Rainy': 100, 'Castform-Snowy': 100, 'Castform-Sunny': 100, Delibird: 100, Luvdisc: 100, Spinda: 100, Unown: 100,\n\t\t\t};\n\t\t\tconst tier = toID(species.tier).replace('bl', '');\n\t\t\tlevel = levelScale[tier] || (species.nfe ? 90 : 80);\n\t\t\tif (customScale[species.name]) level = customScale[species.name];\n\t\t} else {\n\t\t\t// We choose level based on BST. Min level is 70, max level is 99. 600+ BST is 70, less than 300 is 99. Calculate with those values.\n\t\t\t// Every 10.34 BST adds a level from 70 up to 99. Results are floored. Uses the Mega's stats if holding a Mega Stone\n\t\t\tconst baseStats = species.baseStats;\n\n\t\t\tlet bst = species.bst;\n\t\t\t// If Wishiwashi, use the school-forme's much higher stats\n\t\t\tif (species.baseSpecies === 'Wishiwashi') bst = this.dex.species.get('wishiwashischool').bst;\n\t\t\t// Adjust levels of mons based on abilities (Pure Power, Sheer Force, etc.) and also Eviolite\n\t\t\t// For the stat boosted, treat the Pokemon's base stat as if it were multiplied by the boost. (Actual effective base stats are higher.)\n\t\t\tconst speciesAbility = (baseSpecies === species ? ability : species.abilities[0]);\n\t\t\tif (speciesAbility === 'Huge Power' || speciesAbility === 'Pure Power') {\n\t\t\t\tbst += baseStats.atk;\n\t\t\t} else if (speciesAbility === 'Parental Bond') {\n\t\t\t\tbst += 0.25 * (counter.get('Physical') > counter.get('Special') ? baseStats.atk : baseStats.spa);\n\t\t\t} else if (speciesAbility === 'Protean') {\n\t\t\t\tbst += 0.3 * (counter.get('Physical') > counter.get('Special') ? baseStats.atk : baseStats.spa);\n\t\t\t} else if (speciesAbility === 'Fur Coat') {\n\t\t\t\tbst += baseStats.def;\n\t\t\t} else if (speciesAbility === 'Slow Start') {\n\t\t\t\tbst -= baseStats.atk / 2 + baseStats.spe / 2;\n\t\t\t} else if (speciesAbility === 'Truant') {\n\t\t\t\tbst *= 2 / 3;\n\t\t\t}\n\t\t\tif (item === 'Eviolite') {\n\t\t\t\tbst += 0.5 * (baseStats.def + baseStats.spd);\n\t\t\t} else if (item === 'Light Ball') {\n\t\t\t\tbst += baseStats.atk + baseStats.spa;\n\t\t\t}\n\t\t\tlevel = 70 + Math.floor(((600 - Utils.clampIntRange(bst, 300, 600)) / 10.34));\n\t\t}\n\n\t\t// Prepare optimal HP\n\t\tconst srWeakness = 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\tif (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 if (moves.has('substitute') && (\n\t\t\t\titem === 'Petaya Berry' || item === 'Sitrus Berry' ||\n\t\t\t\t(ability === 'Power Construct' && item !== 'Leftovers')\n\t\t\t)) {\n\t\t\t\t// Three Substitutes should activate Petaya Berry for Dedenne\n\t\t\t\t// Two Substitutes should activate Sitrus Berry or Power Construct\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 {\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\t// Minimize confusion damage\n\t\tif (!counter.get('Physical') && !moves.has('copycat') && !moves.has('transform')) {\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 (ability === 'Beast Boost' && counter.get('Special') < 1) {\n\t\t\tevs.spa = 0;\n\t\t\tivs.spa = 0;\n\t\t}\n\n\t\tif (['gyroball', 'metalburst', 'trickroom'].some(m => moves.has(m))) {\n\t\t\tevs.spe = 0;\n\t\t\tivs.spe = 0;\n\t\t}\n\n\t\t// Fix IVs for non-Bottle Cap-able sets\n\t\tif (hasHiddenPower && level < 100) {\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 = ivs.atk === 0 ? ZeroAttackHPIVs[hpType] : 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\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\tmoves: Array.from(moves),\n\t\t\tability,\n\t\t\tevs,\n\t\t\tivs,\n\t\t\titem,\n\t\t\tlevel,\n\t\t};\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 = [];\n\n\t\t// For Monotype\n\t\tconst isMonotype = !!this.forceMonotype || ruleTable.has('sametypeclause');\n\t\tconst typePool = this.dex.types.names();\n\t\tconst type = this.forceMonotype || this.sample(typePool);\n\n\t\tconst baseFormes: {[k: string]: number} = {};\n\t\tlet hasMega = false;\n\n\t\tconst tierCount: {[k: string]: number} = {};\n\t\tconst typeCount: {[k: string]: number} = {};\n\t\tconst typeComboCount: {[k: string]: number} = {};\n\t\tconst teamDetails: RandomTeamsTypes.TeamDetails = {};\n\n\t\t// We make at most two passes through the potential Pokemon pool when creating a team - if the first pass doesn't\n\t\t// result in a team of six Pokemon we perform a second iteration relaxing as many restrictions as possible.\n\t\tfor (const restrict of [true, false]) {\n\t\t\tif (pokemon.length >= this.maxTeamSize) break;\n\t\t\tconst pokemonPool = this.getPokemonPool(type, pokemon, isMonotype);\n\t\t\twhile (pokemonPool.length && pokemon.length < this.maxTeamSize) {\n\t\t\t\tconst species = this.dex.species.get(this.sampleNoReplace(pokemonPool));\n\n\t\t\t\t// Check if the forme has moves for random battle\n\t\t\t\tif (this.format.gameType === 'singles') {\n\t\t\t\t\tif (!species.randomBattleMoves) continue;\n\t\t\t\t} else {\n\t\t\t\t\tif (!species.randomDoubleBattleMoves) continue;\n\t\t\t\t}\n\t\t\t\tif (!species.exists) continue;\n\n\t\t\t\t// Limit to one of each species (Species Clause)\n\t\t\t\tif (baseFormes[species.baseSpecies]) continue;\n\n\t\t\t\t// Limit one Mega per team\n\t\t\t\tif (hasMega && species.isMega) continue;\n\n\t\t\t\t// Adjust rate for species with multiple sets\n\t\t\t\tswitch (species.baseSpecies) {\n\t\t\t\tcase 'Arceus': case 'Silvally':\n\t\t\t\t\tif (this.randomChance(8, 9) && !isMonotype) continue;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Oricorio':\n\t\t\t\t\tif (this.randomChance(3, 4)) continue;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Castform': case 'Floette':\n\t\t\t\t\tif (this.randomChance(2, 3)) continue;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Aegislash': case 'Basculin': case 'Cherrim': case 'Gourgeist': case 'Groudon': case 'Kyogre': case 'Meloetta':\n\t\t\t\t\tif (this.randomChance(1, 2)) continue;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Greninja':\n\t\t\t\t\tif (this.gen >= 7 && this.randomChance(1, 2)) continue;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (species.otherFormes && !hasMega && (\n\t\t\t\t\tspecies.otherFormes.includes(species.name + '-Mega') ||\n\t\t\t\t\tspecies.otherFormes.includes(species.name + '-Mega-X')\n\t\t\t\t)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst tier = species.tier;\n\t\t\t\tconst types = species.types;\n\t\t\t\tconst typeCombo = types.slice().sort().join();\n\t\t\t\t// Dynamically scale limits for different team sizes. The default and minimum value is 1.\n\t\t\t\tconst limitFactor = Math.round(this.maxTeamSize / 6) || 1;\n\n\t\t\t\tif (restrict && !species.isMega) {\n\t\t\t\t\t// Limit one Pokemon per tier, two for Monotype\n\t\t\t\t\tif (\n\t\t\t\t\t\t(tierCount[tier] >= (isMonotype || this.forceMonotype ? 2 : 1) * limitFactor) &&\n\t\t\t\t\t\t!this.randomChance(1, Math.pow(5, tierCount[tier]))\n\t\t\t\t\t) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!isMonotype && !this.forceMonotype) {\n\t\t\t\t\t\t// Limit two of any type\n\t\t\t\t\t\tlet skip = false;\n\t\t\t\t\t\tfor (const typeName of types) {\n\t\t\t\t\t\t\tif (typeCount[typeName] >= 2 * limitFactor) {\n\t\t\t\t\t\t\t\tskip = 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 (skip) continue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Limit one of any type combination, two in Monotype\n\t\t\t\t\tif (!this.forceMonotype && typeComboCount[typeCombo] >= (isMonotype ? 2 : 1) * limitFactor) continue;\n\t\t\t\t}\n\n\t\t\t\tconst set = this.randomSet(\n\t\t\t\t\tspecies,\n\t\t\t\t\tteamDetails,\n\t\t\t\t\tpokemon.length === this.maxTeamSize - 1,\n\t\t\t\t\tthis.format.gameType !== 'singles'\n\t\t\t\t);\n\n\t\t\t\tconst item = this.dex.items.get(set.item);\n\n\t\t\t\t// Limit one Z-Move per team\n\t\t\t\tif (item.zMove && teamDetails.zMove) continue;\n\n\t\t\t\t// Zoroark copies the last Pokemon\n\t\t\t\tif (set.ability === 'Illusion') {\n\t\t\t\t\tif (pokemon.length < 1) continue;\n\t\t\t\t\tset.level = pokemon[pokemon.length - 1].level;\n\t\t\t\t}\n\n\t\t\t\t// Okay, the set passes, add it to our team\n\t\t\t\tpokemon.unshift(set);\n\n\t\t\t\t// Don't bother tracking details for the last Pokemon\n\t\t\t\tif (pokemon.length === this.maxTeamSize) break;\n\n\t\t\t\t// Now that our Pokemon has passed all checks, we can increment our counters\n\t\t\t\tbaseFormes[species.baseSpecies] = 1;\n\n\t\t\t\t// Increment tier counter\n\t\t\t\tif (tierCount[tier]) {\n\t\t\t\t\ttierCount[tier]++;\n\t\t\t\t} else {\n\t\t\t\t\ttierCount[tier] = 1;\n\t\t\t\t}\n\n\t\t\t\t// Increment type counters\n\t\t\t\tfor (const typeName of types) {\n\t\t\t\t\tif (typeName in typeCount) {\n\t\t\t\t\t\ttypeCount[typeName]++;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttypeCount[typeName] = 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (typeCombo in typeComboCount) {\n\t\t\t\t\ttypeComboCount[typeCombo]++;\n\t\t\t\t} else {\n\t\t\t\t\ttypeComboCount[typeCombo] = 1;\n\t\t\t\t}\n\n\t\t\t\t// Track what the team has\n\t\t\t\tif (item.megaStone) hasMega = true;\n\t\t\t\tif (item.zMove) teamDetails.zMove = 1;\n\t\t\t\tif (set.ability === 'Snow Warning' || set.moves.includes('hail')) teamDetails.hail = 1;\n\t\t\t\tif (set.moves.includes('raindance') || set.ability === 'Drizzle' && !item.onPrimal) teamDetails.rain = 1;\n\t\t\t\tif (set.ability === 'Sand Stream') teamDetails.sand = 1;\n\t\t\t\tif (set.moves.includes('sunnyday') || set.ability === 'Drought' && !item.onPrimal) teamDetails.sun = 1;\n\t\t\t\tif (set.moves.includes('spikes')) teamDetails.spikes = (teamDetails.spikes || 0) + 1;\n\t\t\t\tif (set.moves.includes('stealthrock')) teamDetails.stealthRock = 1;\n\t\t\t\tif (set.moves.includes('stickyweb')) teamDetails.stickyWeb = 1;\n\t\t\t\tif (set.moves.includes('toxicspikes')) teamDetails.toxicSpikes = 1;\n\t\t\t\tif (set.moves.includes('defog')) teamDetails.defog = 1;\n\t\t\t\tif (set.moves.includes('rapidspin')) teamDetails.rapidSpin = 1;\n\t\t\t}\n\t\t}\n\t\tif (pokemon.length < this.maxTeamSize && pokemon.length < 12) {\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\trandomFactorySets: {[format: string]: {[species: string]: BattleFactorySpecies}} = {};\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 weatherAbilitiesRequire: {[k: string]: string} = {\n\t\t\thydration: 'raindance', swiftswim: 'raindance',\n\t\t\tleafguard: 'sunnyday', solarpower: 'sunnyday', chlorophyll: 'sunnyday',\n\t\t\tsandforce: 'sandstorm', sandrush: 'sandstorm', sandveil: 'sandstorm',\n\t\t\tslushrush: 'hail', snowcloak: 'hail',\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[]}[] = [];\n\t\tconst priorityPool = [];\n\t\tfor (const curSet of setList) {\n\t\t\tif (this.forceMonotype && !species.types.includes(this.forceMonotype)) continue;\n\n\t\t\tconst item = this.dex.items.get(curSet.item);\n\t\t\tif (teamData.megaCount && teamData.megaCount > 0 && item.megaStone) continue; // reject 2+ mega stones\n\t\t\tif (teamData.zCount && teamData.zCount > 0 && item.zMove) continue; // reject 2+ Z stones\n\t\t\tif (itemsMax[item.id] && teamData.has[item.id] >= itemsMax[item.id]) continue;\n\n\t\t\tconst ability = this.dex.abilities.get(curSet.ability);\n\t\t\tif (weatherAbilitiesRequire[ability.id] && teamData.weather !== weatherAbilitiesRequire[ability.id]) continue;\n\t\t\tif (teamData.weather && weatherAbilities.includes(ability.id)) continue; // reject 2+ weather setters\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\t\t\teffectivePool.push({set: curSet, moveVariants: curSetVariants});\n\t\t\tif (hasRequiredMove) priorityPool.push({set: curSet, moveVariants: curSetVariants});\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 = this.sampleIfArray(setData.set.item);\n\t\tconst 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\tconst 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} 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\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\tconst typePool = this.dex.types.names();\n\t\tconst type = this.sample(typePool);\n\n\t\tconst teamData: TeamData = {\n\t\t\ttypeCount: {}, typeComboCount: {}, baseFormes: {}, megaCount: 0, zCount: 0,\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\tconst 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\t// Limit the number of Megas to one\n\t\t\tif (!teamData.megaCount) teamData.megaCount = 0;\n\t\t\tif (teamData.megaCount >= 1 && speciesFlags.megaOnly) 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\t// Actually limit the number of Megas to one\n\t\t\tif (teamData.megaCount >= 1 && itemData.megaStone) continue;\n\n\t\t\t// Limit the number of Z moves to one\n\t\t\tif (teamData.zCount && teamData.zCount >= 1 && itemData.zMove) continue;\n\n\t\t\tlet 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\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\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.megaStone) teamData.megaCount++;\n\t\t\tif (itemData.zMove) {\n\t\t\t\tif (!teamData.zCount) teamData.zCount = 0;\n\t\t\t\tteamData.zCount++;\n\t\t\t}\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émon 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 = {};\n\n\trandomBSSFactorySet(\n\t\tspecies: Species, teamData: RandomTeamsTypes.FactoryTeamDetails\n\t): RandomTeamsTypes.RandomFactorySet | null {\n\t\tconst id = toID(species.name);\n\t\t// const flags = this.randomBSSFactorySets[tier][id].flags;\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\tspikes: 1,\n\t\t\ttoxicspikes: 1,\n\t\t\tdoubleedge: 1,\n\t\t\ttrickroom: 1,\n\t\t};\n\t\tconst requiredMoves: {[k: string]: number} = {};\n\t\tconst weatherAbilitiesRequire: {[k: string]: string} = {\n\t\t\tswiftswim: 'raindance',\n\t\t\tsandrush: 'sandstorm', sandveil: 'sandstorm',\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[], itemVariants?: number, abilityVariants?: number}[] = [];\n\t\tconst priorityPool = [];\n\t\tfor (const curSet of setList) {\n\t\t\tif (this.forceMonotype && !species.types.includes(this.forceMonotype)) continue;\n\n\t\t\tconst item = this.dex.items.get(curSet.item);\n\t\t\tif (teamData.megaCount && teamData.megaCount > 1 && item.megaStone) continue; // reject 3+ mega stones\n\t\t\tif (teamData.zCount && teamData.zCount > 1 && item.zMove) continue; // reject 3+ Z stones\n\t\t\tif (teamData.has[item.id]) continue; // Item clause\n\n\t\t\tconst ability = this.dex.abilities.get(curSet.ability);\n\t\t\tif (weatherAbilitiesRequire[ability.id] && teamData.weather !== weatherAbilitiesRequire[ability.id]) continue;\n\t\t\tif (teamData.weather && weatherAbilities.includes(ability.id)) continue; // reject 2+ weather setters\n\n\t\t\tif (curSet.species === 'Aron' && teamData.weather !== 'sandstorm') continue; // reject Aron without a Sand Stream user\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\t\t\teffectivePool.push({set: curSet, moveVariants: curSetVariants});\n\t\t\tif (hasRequiredMove) priorityPool.push({set: curSet, moveVariants: curSetVariants});\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\treturn {\n\t\t\tname: setData.set.nickname || 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: this.sampleIfArray(setData.set.item) || '',\n\t\t\tability: setData.set.ability || 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: {}, megaCount: 0, zCount: 0,\n\t\t\teeveeLimCount: 0, has: {}, forceResult, weaknesses: {}, resistances: {},\n\t\t};\n\t\tconst requiredMoveFamilies: string[] = [];\n\t\tconst requiredMoves: {[k: string]: string} = {};\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\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\tconst speciesFlags = this.randomBSSFactorySets[species.id].flags;\n\t\t\tif (!teamData.megaCount) teamData.megaCount = 0;\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 the number of Megas + Z-moves to 3\n\t\t\tif (teamData.megaCount + (teamData.zCount ? teamData.zCount : 0) >= 3 && speciesFlags.megaOnly) continue;\n\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\t// Limit 2 of any type\n\t\t\tconst types = species.types;\n\t\t\tlet skip = false;\n\t\t\tfor (const type of types) {\n\t\t\t\tif (teamData.typeCount[type] >= 2 * limitFactor && this.randomChance(4, 5)) {\n\t\t\t\t\tskip = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (skip) continue;\n\n\t\t\t// Restrict Eevee with certain Pokemon\n\t\t\tif (speciesFlags.limEevee) {\n\t\t\t\tif (!teamData.eeveeLimCount) teamData.eeveeLimCount = 0;\n\t\t\t\tteamData.eeveeLimCount++;\n\t\t\t}\n\t\t\tif (teamData.eeveeLimCount && teamData.eeveeLimCount >= 1 && speciesFlags.limEevee) 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 (teamData.typeComboCount[typeCombo] >= 1 * limitFactor) continue;\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\tteamData.typeComboCount[typeCombo] = (teamData.typeComboCount[typeCombo] + 1) || 1;\n\n\t\t\tteamData.baseFormes[species.baseSpecies] = 1;\n\n\t\t\t// Limit Mega and Z-move\n\t\t\tconst itemData = this.dex.items.get(set.item);\n\t\t\tif (itemData.megaStone) teamData.megaCount++;\n\t\t\tif (itemData.zMove) {\n\t\t\t\tif (!teamData.zCount) teamData.zCount = 0;\n\t\t\t\tteamData.zCount++;\n\t\t\t}\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\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émon 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.randomBSSFactoryTeam(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.randomBSSFactoryTeam(side, ++depth);\n\t\t\t}\n\t\t\tfor (const type in teamData.weaknesses) {\n\t\t\t\tif (teamData.weaknesses[type] >= 3) return this.randomBSSFactoryTeam(side, ++depth);\n\t\t\t}\n\t\t}\n\n\t\treturn pokemon;\n\t}\n}\n\nexport default RandomGen7Teams;\n","import {BattleFactorySpecies, RandomGen7Teams} from './gen7';\nimport {MoveCounter, TeamData} from './gen8';\nimport {Utils} from './utils';\nimport {\n\tAnyObject,\n\tFormat,\n\tModdedDex,\n\tMove,\n\tPRNG,\n\tPRNGSeed,\n\tPlayerOptions,\n\tRandomTeamsTypes,\n\tSpecies,\n\tStatID,\n\ttoID,\n} from '@pkmn/sim';\n\nexport class RandomGen6Teams extends RandomGen7Teams {\n\tconstructor(dex: ModdedDex, format: Format, prng: PRNG | PRNGSeed | null) {\n\t\tsuper(dex, format, prng);\n\t\tthis.noStab = [...this.noStab, 'aquajet', 'fakeout', 'iceshard', 'machpunch', 'quickattack', 'vacuumwave'];\n\n\t\tthis.moveEnforcementCheckers = {\n\t\t\tBug: movePool => movePool.includes('megahorn') || movePool.includes('pinmissile'),\n\t\t\tDark: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\t(!counter.get('Dark') && !abilities.has('Protean'))\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!abilities.has('Aerilate') &&\n\t\t\t\t!abilities.has('Pixilate') &&\n\t\t\t\t!moves.has('rest') &&\n\t\t\t\t!moves.has('sleeptalk')\n\t\t\t),\n\t\t\tElectric: (movePool, moves, abilities, types, counter) => !counter.get('Electric'),\n\t\t\tFairy: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!counter.get('Fairy') && !abilities.has('Pixilate') && (!!counter.setupType || !counter.get('Status'))\n\t\t\t),\n\t\t\tFighting: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\t!counter.get('Fighting') && (\n\t\t\t\t\tspecies.baseStats.atk >= 110 ||\n\t\t\t\t\tabilities.has('Justified') || abilities.has('Unburden') ||\n\t\t\t\t\t!!counter.setupType || !counter.get('Status')\n\t\t\t\t)\n\t\t\t),\n\t\t\tFire: (movePool, moves, abilities, types, counter) => !counter.get('Fire') || movePool.includes('quiverdance'),\n\t\t\tFlying: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!counter.get('Flying') && (\n\t\t\t\t\tabilities.has('Gale Wings') ||\n\t\t\t\t\tabilities.has('Serene Grace') ||\n\t\t\t\t\t(types.has('Normal') && movePool.includes('bravebird'))\n\t\t\t\t)\n\t\t\t),\n\t\t\tGhost: (movePool, moves, abilities, types, counter) => !types.has('Dark') && !counter.get('Ghost'),\n\t\t\tGrass: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!counter.get('Grass') && !types.has('Fairy') && !types.has('Poison') && !types.has('Steel')\n\t\t\t),\n\t\t\tGround: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!counter.get('Ground') && !moves.has('rest') && !moves.has('sleeptalk')\n\t\t\t),\n\t\t\tIce: (movePool, moves, abilities, types, counter) => !counter.get('Ice') && !abilities.has('Refrigerate'),\n\t\t\tNormal: movePool => movePool.includes('facade'),\n\t\t\tPsychic: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\t!!counter.get('Psychic') &&\n\t\t\t\t!types.has('Flying') &&\n\t\t\t\t!abilities.has('Pixilate') &&\n\t\t\t\tcounter.get('stab') < species.types.length\n\t\t\t),\n\t\t\tRock: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!counter.get('Rock') &&\n\t\t\t\t!types.has('Fairy') &&\n\t\t\t\t(abilities.has('Rock Head') || counter.setupType === 'Physical')\n\t\t\t),\n\t\t\tSteel: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!counter.get('Steel') && (abilities.has('Technician') || movePool.includes('meteormash'))\n\t\t\t),\n\t\t\tWater: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t(!counter.get('Water') || !counter.get('stab')) &&\n\t\t\t\t!abilities.has('Protean')\n\t\t\t),\n\t\t\tAdaptability: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\t!counter.setupType &&\n\t\t\t\tspecies.types.length > 1 &&\n\t\t\t\t(!counter.get(species.types[0]) || !counter.get(species.types[1]))\n\t\t\t),\n\t\t\tAerilate: (movePool, moves, abilities, types, counter) => !counter.get('Normal'),\n\t\t\tPixilate: (movePool, moves, abilities, types, counter) => !counter.get('Normal'),\n\t\t\tRefrigerate: (movePool, moves, abilities, types, counter) => !moves.has('blizzard') && !counter.get('Normal'),\n\t\t\tContrary: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\t!counter.get('contrary') && species.name !== 'Shuckle'\n\t\t\t),\n\t\t\t'Bad Dreams': movePool => movePool.includes('darkvoid'),\n\t\t\t'Slow Start': movePool => movePool.includes('substitute'),\n\t\t};\n\t}\n\n\tshouldCullMove(\n\t\tmove: Move,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tmovePool: string[],\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tisLead: boolean,\n\t): {cull: boolean, isSetup?: boolean} {\n\t\tconst restTalk = moves.has('rest') && moves.has('sleeptalk');\n\n\t\tif (move.priority > 0 && counter.get('speedsetup')) return {cull: true};\n\n\t\tswitch (move.id) {\n\t\t// Not very useful without their supporting moves\n\t\tcase 'cottonguard': case 'defendorder':\n\t\t\treturn {cull: !counter.get('recovery') && !moves.has('rest')};\n\t\tcase 'focuspunch':\n\t\t\treturn {cull: !moves.has('substitute') || counter.damagingMoves.size < 2};\n\t\tcase 'perishsong':\n\t\t\treturn {cull: !moves.has('protect')};\n\t\tcase 'reflect':\n\t\t\tif (movePool.length > 1) {\n\t\t\t\tconst screen = movePool.indexOf('lightscreen');\n\t\t\t\tif (screen >= 0) this.fastPop(movePool, screen);\n\t\t\t}\n\t\t\treturn {cull: !moves.has('calmmind') && !moves.has('lightscreen')};\n\t\tcase 'rest':\n\t\t\treturn {cull: movePool.includes('sleeptalk')};\n\t\tcase 'sleeptalk':\n\t\t\tif (movePool.length > 1) {\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\treturn {cull: !moves.has('rest')};\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 || !!counter.get('priority')};\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\treturn {cull: (\n\t\t\t\t(move.id === 'bellydrum' && !abilities.has('Unburden') && !counter.get('priority')) ||\n\t\t\t\t(counter.get('Physical') + counter.get('physicalpool') < 2 && (!moves.has('rest') || !moves.has('sleeptalk'))) || (\n\t\t\t\t\t(counter.setupType !== 'Physical' || counter.get('physicalsetup') > 1) &&\n\t\t\t\t\t(!moves.has('growth') || moves.has('sunnyday'))\n\t\t\t\t)\n\t\t\t), isSetup: true};\n\t\tcase 'calmmind': case 'geomancy': case 'nastyplot': case 'quiverdance': case 'tailglow':\n\t\t\tif (types.has('Dark') && moves.has('darkpulse')) {\n\t\t\t\tcounter.setupType = 'Special';\n\t\t\t\treturn {cull: false, isSetup: true};\n\t\t\t}\n\t\t\treturn {cull: (\n\t\t\t\tcounter.setupType !== 'Special' ||\n\t\t\t\tcounter.get('specialsetup') > 1 ||\n\t\t\t\t(counter.get('Special') + counter.get('specialpool') < 2 && (!moves.has('rest') || !moves.has('sleeptalk')))\n\t\t\t), isSetup: true};\n\t\tcase 'growth': case 'shellsmash': case 'workup':\n\t\t\treturn {cull: (\n\t\t\t\tcounter.setupType !== 'Mixed' ||\n\t\t\t\tcounter.get('mixedsetup') > 1 ||\n\t\t\t\tcounter.damagingMoves.size + counter.get('physicalpool') + counter.get('specialpool') < 2 ||\n\t\t\t\t(move.id === 'growth' && !moves.has('sunnyday'))\n\t\t\t), isSetup: true};\n\t\tcase 'agility': case 'autotomize': case 'rockpolish': case 'shiftgear':\n\t\t\treturn {cull: counter.damagingMoves.size < 2 || restTalk, isSetup: !counter.setupType};\n\t\tcase 'flamecharge':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('dracometeor') ||\n\t\t\t\tmoves.has('overheat') ||\n\t\t\t\t(counter.damagingMoves.size < 3 && !counter.setupType)\n\t\t\t)};\n\n\t\t// Bad after setup\n\t\tcase 'circlethrow': case 'dragontail':\n\t\t\treturn {cull: (\n\t\t\t\t(!!counter.setupType && ((!moves.has('rest') && !moves.has('sleeptalk')) || moves.has('stormthrow'))) ||\n\t\t\t\t(!!counter.get('speedsetup') || ['encore', 'raindance', 'roar', 'trickroom', 'whirlwind'].some(m => moves.has(m))) ||\n\t\t\t\t(counter.get(move.type) > 1 && counter.get('Status') > 1) ||\n\t\t\t\t(abilities.has('Sheer Force') && !!counter.get('sheerforce'))\n\t\t\t)};\n\t\tcase 'defog':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.setupType ||\n\t\t\t\tmoves.has('spikes') || moves.has('stealthrock') ||\n\t\t\t\trestTalk ||\n\t\t\t\t!!teamDetails.defog\n\t\t\t)};\n\t\tcase 'fakeout': case 'tailwind':\n\t\t\treturn {cull: !!counter.setupType || ['substitute', 'switcheroo', 'trick'].some(m => moves.has(m))};\n\t\tcase 'foulplay':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.setupType ||\n\t\t\t\t!!counter.get('speedsetup') ||\n\t\t\t\tcounter.get('Dark') > 2 ||\n\t\t\t\tmoves.has('clearsmog') ||\n\t\t\t\trestTalk ||\n\t\t\t\tcounter.damagingMoves.size - 1 === counter.get('priority')\n\t\t\t)};\n\t\tcase 'haze': case 'spikes':\n\t\t\treturn {cull: !!counter.setupType || !!counter.get('speedsetup') || moves.has('trickroom')};\n\t\tcase 'healbell': case 'technoblast':\n\t\t\treturn {cull: !!counter.get('speedsetup')};\n\t\tcase 'healingwish': case 'memento':\n\t\t\treturn {cull: !!counter.setupType || !!counter.get('recovery') || moves.has('substitute')};\n\t\tcase 'leechseed': case 'roar': case 'whirlwind':\n\t\t\treturn {cull: !!counter.setupType || !!counter.get('speedsetup') || moves.has('dragontail')};\n\t\tcase 'nightshade': case 'seismictoss': case 'superfang':\n\t\t\treturn {cull: counter.damagingMoves.size > 1 || !!counter.setupType};\n\t\tcase 'protect':\n\t\t\tconst screens = moves.has('lightscreen') && moves.has('reflect');\n\t\t\treturn {cull: moves.has('rest') || screens || (!!counter.setupType && !moves.has('wish'))};\n\t\tcase 'pursuit':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('nightslash') ||\n\t\t\t\t!!counter.setupType ||\n\t\t\t\tcounter.get('Status') > 1 ||\n\t\t\t\tcounter.get('Dark') > 2 ||\n\t\t\t\t(moves.has('knockoff') && !types.has('Dark'))\n\t\t\t)};\n\t\tcase 'rapidspin':\n\t\t\treturn {cull: !!counter.setupType || !!teamDetails.rapidSpin};\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['rest', 'substitute', 'trickroom'].some(m => moves.has(m)) ||\n\t\t\t\t!!teamDetails.stealthRock\n\t\t\t)};\n\t\tcase 'stickyweb':\n\t\t\treturn {cull: !!teamDetails.stickyWeb};\n\t\tcase 'toxicspikes':\n\t\t\treturn {cull: !!counter.setupType || !!teamDetails.toxicSpikes};\n\t\tcase 'trickroom':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('lightscreen') || moves.has('reflect') ||\n\t\t\t\t!!counter.setupType ||\n\t\t\t\t!!counter.get('speedsetup') ||\n\t\t\t\tcounter.damagingMoves.size < 2\n\t\t\t)};\n\t\tcase 'uturn':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.setupType || !!counter.get('speedsetup') ||\n\t\t\t\t(abilities.has('Speed Boost') && moves.has('protect')) ||\n\t\t\t\t(abilities.has('Protean') && counter.get('Status') > 2) || (\n\t\t\t\t\ttypes.has('Bug') &&\n\t\t\t\t\tcounter.get('stab') < 2 &&\n\t\t\t\t\tcounter.damagingMoves.size > 2 &&\n\t\t\t\t\t!abilities.has('Adaptability') && !abilities.has('Download')\n\t\t\t\t)\n\t\t\t)};\n\t\tcase 'voltswitch':\n\t\t\treturn {cull: !!counter.setupType || !!counter.get('speedsetup') || moves.has('raindance') || moves.has('uturn')};\n\n\t\t// Bit redundant to have both\n\t\t// Attacks:\n\t\tcase 'bugbite': case 'bugbuzz': case 'signalbeam':\n\t\t\treturn {cull: moves.has('uturn') && !counter.setupType && !abilities.has('Tinted Lens')};\n\t\tcase 'darkpulse':\n\t\t\treturn {cull: ['crunch', 'knockoff', 'hyperspacefury'].some(m => moves.has(m)) && counter.setupType !== 'Special'};\n\t\tcase 'suckerpunch':\n\t\t\treturn {cull: (\n\t\t\t\tcounter.damagingMoves.size < 2 ||\n\t\t\t\t(counter.get('Dark') > 1 && !types.has('Dark')) ||\n\t\t\t\tmoves.has('glare') ||\n\t\t\t\trestTalk\n\t\t\t)};\n\t\tcase 'dragonclaw':\n\t\t\treturn {cull: moves.has('dragontail') || moves.has('outrage')};\n\t\tcase 'dracometeor':\n\t\t\treturn {cull: moves.has('swordsdance') || counter.setupType === 'Physical' && counter.get('Dragon') > 1};\n\t\tcase 'dragonpulse': case 'spacialrend':\n\t\t\treturn {cull: moves.has('dracometeor') || moves.has('outrage') || (moves.has('dragontail') && !counter.setupType)};\n\t\tcase 'outrage':\n\t\t\treturn {cull: moves.has('dracometeor') && counter.damagingMoves.size < 3};\n\t\tcase 'thunderbolt':\n\t\t\treturn {cull: moves.has('discharge') || (moves.has('voltswitch') && moves.has('wildcharge'))};\n\t\tcase 'dazzlinggleam':\n\t\t\treturn {cull: moves.has('playrough') && counter.setupType !== 'Special'};\n\t\tcase 'aurasphere': case 'focusblast':\n\t\t\treturn {cull: restTalk || ((moves.has('closecombat') || moves.has('superpower')) && counter.setupType !== 'Special')};\n\t\tcase 'drainpunch':\n\t\t\treturn {cull: (\n\t\t\t\t(!moves.has('bulkup') && (moves.has('closecombat') || moves.has('highjumpkick'))) ||\n\t\t\t\t((moves.has('focusblast') || moves.has('superpower')) && counter.setupType !== 'Physical')\n\t\t\t)};\n\t\tcase 'closecombat': case 'highjumpkick':\n\t\t\treturn {cull: (\n\t\t\t\t(moves.has('bulkup') && moves.has('drainpunch')) || (\n\t\t\t\t\tcounter.setupType === 'Special' &&\n\t\t\t\t\t(moves.has('aurasphere') || moves.has('focusblast') || movePool.includes('aurasphere'))\n\t\t\t\t)\n\t\t\t)};\n\t\tcase 'machpunch':\n\t\t\treturn {cull: types.has('Fighting') && counter.get('stab') < 2 && !abilities.has('Technician')};\n\t\tcase 'stormthrow':\n\t\t\treturn {cull: moves.has('circlethrow') && restTalk};\n\t\tcase 'superpower':\n\t\t\tconst isSetup = abilities.has('Contrary');\n\t\t\treturn {cull: (counter.get('Fighting') > 1 && !!counter.setupType) || (restTalk && !isSetup), isSetup};\n\t\tcase 'vacuumwave':\n\t\t\treturn {cull: (moves.has('closecombat') || moves.has('machpunch')) && counter.setupType !== 'Special'};\n\t\tcase 'fierydance': case 'firefang': case 'flamethrower':\n\t\t\treturn {cull: (\n\t\t\t\t(move.id === 'flamethrower' && moves.has('drainpunch') && counter.setupType !== 'Special') ||\n\t\t\t\tmoves.has('blazekick') ||\n\t\t\t\tmoves.has('overheat') ||\n\t\t\t\t((moves.has('fireblast') || moves.has('lavaplume')) && counter.setupType !== 'Physical')\n\t\t\t)};\n\t\tcase 'fireblast':\n\t\t\treturn {cull: (\n\t\t\t\t(moves.has('flareblitz') && counter.setupType !== 'Special') ||\n\t\t\t\t(moves.has('lavaplume') && !counter.setupType && !counter.get('speedsetup'))\n\t\t\t)};\n\t\tcase 'lavaplume':\n\t\t\treturn {cull: moves.has('firepunch') || moves.has('fireblast') && (!!counter.setupType || !!counter.get('speedsetup'))};\n\t\tcase 'airslash': case 'hurricane':\n\t\t\treturn {cull: (\n\t\t\t\t[(move.id === 'hurricane' ? 'airslash' : 'hurricane'), 'acrobatics', 'bravebird'].some(m => moves.has(m))\n\t\t\t)};\n\t\tcase 'shadowball':\n\t\t\treturn {cull: moves.has('darkpulse') || (moves.has('hex') && moves.has('willowisp'))};\n\t\tcase 'shadowclaw':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('shadowforce') ||\n\t\t\t\tmoves.has('shadowsneak') ||\n\t\t\t\t(moves.has('shadowball') && counter.setupType !== 'Physical')\n\t\t\t)};\n\t\tcase 'shadowsneak':\n\t\t\treturn {cull: restTalk || (types.has('Ghost') && species.types.length > 1 && counter.get('stab') < 2)};\n\t\tcase 'hex':\n\t\t\treturn {cull: moves.has('shadowball') && !moves.has('willowisp')};\n\t\tcase 'gigadrain': case 'powerwhip':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('seedbomb') ||\n\t\t\t\tmoves.has('petaldance') ||\n\t\t\t\t(moves.has('sunnyday') && moves.has('solarbeam')) ||\n\t\t\t\t(counter.get('Special') < 4 && !counter.setupType && moves.has('leafstorm'))\n\t\t\t)};\n\t\tcase 'leafblade': case 'woodhammer':\n\t\t\treturn {cull: (\n\t\t\t\t(moves.has('hornleech') && counter.get('Physical') < 4) ||\n\t\t\t\t(moves.has('gigadrain') && counter.setupType !== 'Physical')\n\t\t\t)};\n\t\tcase 'leafstorm':\n\t\t\treturn {cull: counter.get('Grass') > 1 && !!counter.setupType};\n\t\tcase 'solarbeam':\n\t\t\treturn {cull: (\n\t\t\t\t(!abilities.has('Drought') && !moves.has('sunnyday')) ||\n\t\t\t\tmoves.has('gigadrain') ||\n\t\t\t\tmoves.has('leafstorm')\n\t\t\t)};\n\t\tcase 'bonemerang': case 'earthpower': case 'precipiceblades':\n\t\t\treturn {cull: moves.has('earthquake')};\n\t\tcase 'freezedry':\n\t\t\treturn {cull: moves.has('icebeam') || moves.has('icywind') || counter.get('stab') < 2};\n\t\tcase 'bodyslam': case 'return':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('doubleedge') ||\n\t\t\t\t(moves.has('glare') && moves.has('headbutt')) ||\n\t\t\t\t(move.id === 'return' && moves.has('bodyslam'))\n\t\t\t)};\n\t\tcase 'endeavor':\n\t\t\treturn {cull: !isLead && !abilities.has('Defeatist')};\n\t\tcase 'explosion':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.setupType ||\n\t\t\t\t(abilities.has('Refrigerate') && (moves.has('freezedry') || movePool.includes('return'))) ||\n\t\t\t\tmoves.has('wish')\n\t\t\t)};\n\t\tcase 'extremespeed':\n\t\t\treturn {cull: counter.setupType !== 'Physical' && moves.has('vacuumwave')};\n\t\tcase 'hiddenpower':\n\t\t\treturn {cull: moves.has('rest') || !counter.get('stab') && counter.damagingMoves.size < 2};\n\t\tcase 'hypervoice':\n\t\t\treturn {cull: moves.has('blizzard') || moves.has('return')};\n\t\tcase 'judgment':\n\t\t\treturn {cull: counter.setupType !== 'Special' && counter.get('stab') > 1};\n\t\tcase 'quickattack':\n\t\t\treturn {cull: (\n\t\t\t\t(types.has('Normal') && (!counter.get('stab') || counter.get('Normal') > 2)) ||\n\t\t\t\t(types.has('Rock') && !!counter.get('Status'))\n\t\t\t)};\n\t\tcase 'weatherball':\n\t\t\treturn {cull: !moves.has('raindance') && !moves.has('sunnyday')};\n\t\tcase 'poisonjab':\n\t\t\treturn {cull: moves.has('gunkshot')};\n\t\tcase 'acidspray': case 'sludgewave':\n\t\t\treturn {cull: moves.has('poisonjab') || moves.has('sludgebomb')};\n\t\tcase 'psychic':\n\t\t\treturn {cull: moves.has('psyshock')};\n\t\tcase 'psychocut': case 'zenheadbutt':\n\t\t\treturn {cull: (moves.has('psychic') || moves.has('psyshock')) && counter.setupType !== 'Physical'};\n\t\tcase 'psyshock':\n\t\t\tconst psychic = movePool.indexOf('psychic');\n\t\t\tif (psychic >= 0) this.fastPop(movePool, psychic);\n\t\t\treturn {cull: false};\n\t\tcase 'headsmash':\n\t\t\treturn {cull: moves.has('stoneedge')};\n\t\tcase 'rockblast': case 'rockslide':\n\t\t\treturn {cull: moves.has('headsmash') || moves.has('stoneedge')};\n\t\tcase 'bulletpunch':\n\t\t\treturn {cull: moves.has('substitute')};\n\t\tcase 'hydropump':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('razorshell') ||\n\t\t\t\tmoves.has('waterfall') ||\n\t\t\t\t(moves.has('scald') && (counter.get('Special') < 4 || species.types.length > 1 && counter.get('stab') < 3)) ||\n\t\t\t\trestTalk\n\t\t\t)};\n\t\tcase 'originpulse': case 'surf':\n\t\t\treturn {cull: moves.has('hydropump') || moves.has('scald')};\n\t\tcase 'scald':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('waterfall') ||\n\t\t\t\tmoves.has('waterpulse') ||\n\t\t\t\t(species.id === 'quagsire' && movePool.includes('recover'))\n\t\t\t)};\n\n\t\t// Status:\n\t\tcase 'glare': case 'headbutt':\n\t\t\treturn {cull: moves.has('bodyslam') || !moves.has('glare')};\n\t\tcase 'stunspore': case 'thunderwave':\n\t\t\tconst otherStatus = ['discharge', 'spore', 'toxic', 'trickroom', 'yawn'].some(m => moves.has(m));\n\t\t\treturn {cull: !!counter.setupType || !!counter.get('speedsetup') || restTalk || otherStatus};\n\t\tcase 'toxic':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.setupType ||\n\t\t\t\t['hypnosis', 'sleeppowder', 'toxicspikes', 'willowisp', 'yawn', 'raindance', 'flamecharge'].some(m => moves.has(m))\n\t\t\t)};\n\t\tcase 'willowisp':\n\t\t\treturn {cull: moves.has('scald')};\n\t\tcase 'raindance':\n\t\t\treturn {cull: (\n\t\t\t\tcounter.get('Physical') + counter.get('Special') < 2 ||\n\t\t\t\t(!types.has('Water') && !counter.get('Water')) ||\n\t\t\t\trestTalk\n\t\t\t)};\n\t\tcase 'sunnyday':\n\t\t\tconst cull = (\n\t\t\t\tcounter.get('Physical') + counter.get('Special') < 2 ||\n\t\t\t\t(!abilities.has('Chlorophyll') && !abilities.has('Flower Gift') && !moves.has('solarbeam')) ||\n\t\t\t\trestTalk\n\t\t\t);\n\n\t\t\tif (cull && movePool.length > 1) {\n\t\t\t\tconst solarbeam = movePool.indexOf('solarbeam');\n\t\t\t\tif (solarbeam >= 0) this.fastPop(movePool, solarbeam);\n\t\t\t\tif (movePool.length > 1) {\n\t\t\t\t\tconst weatherball = movePool.indexOf('weatherball');\n\t\t\t\t\tif (weatherball >= 0) this.fastPop(movePool, weatherball);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {cull};\n\t\tcase 'milkdrink': case 'moonlight': case 'painsplit': case 'recover': case 'roost': case 'synthesis':\n\t\t\treturn {cull: ['leechseed', 'rest', 'wish'].some(m => moves.has(m))};\n\t\tcase 'safeguard':\n\t\t\treturn {cull: moves.has('destinybond')};\n\t\tcase 'substitute':\n\t\t\treturn {cull: (\n\t\t\t\t['dracometeor', 'pursuit', 'rest', 'taunt', 'uturn', 'voltswitch', 'whirlwind'].some(m => moves.has(m)) ||\n\t\t\t\t(moves.has('leafstorm') && !abilities.has('Contrary')) ||\n\t\t\t\tmovePool.includes('copycat')\n\t\t\t)};\n\t\t}\n\n\t\treturn {cull: false};\n\t}\n\n\tshouldCullAbility(\n\t\tability: string,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tmovePool: string[],\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species\n\t): boolean {\n\t\tswitch (ability) {\n\t\tcase 'Flare Boost': case 'Gluttony': case 'Moody': case 'Snow Cloak': case 'Steadfast':\n\t\t\treturn true;\n\t\tcase 'Contrary': case 'Iron Fist': case 'Skill Link': case 'Strong Jaw':\n\t\t\treturn !counter.get(toID(ability));\n\t\tcase 'Aerilate': case 'Pixilate': case 'Refrigerate':\n\t\t\treturn !counter.get('Normal');\n\t\tcase 'Analytic': case 'Download': case 'Hyper Cutter':\n\t\t\treturn species.nfe;\n\t\tcase 'Battle Armor': case 'Sturdy':\n\t\t\treturn (!!counter.get('recoil') && !counter.get('recovery'));\n\t\tcase 'Chlorophyll': case 'Leaf Guard':\n\t\t\treturn (\n\t\t\t\tspecies.baseStats.spe > 100 ||\n\t\t\t\tabilities.has('Harvest') ||\n\t\t\t\t(!moves.has('sunnyday') && !teamDetails.sun)\n\t\t\t);\n\t\tcase 'Competitive':\n\t\t\treturn (!counter.get('Special') || moves.has('rest') && moves.has('sleeptalk'));\n\t\tcase 'Compound Eyes': case 'No Guard':\n\t\t\treturn !counter.get('inaccurate');\n\t\tcase 'Defiant': case 'Moxie':\n\t\t\treturn (!counter.get('Physical') || moves.has('dragontail'));\n\t\tcase 'Flash Fire':\n\t\t\treturn abilities.has('Drought');\n\t\tcase 'Harvest':\n\t\t\treturn abilities.has('Frisk');\n\t\tcase 'Hustle':\n\t\t\treturn counter.get('Physical') < 2;\n\t\tcase 'Hydration': case 'Rain Dish': case 'Swift Swim':\n\t\t\treturn (species.baseStats.spe > 100 || !moves.has('raindance') && !teamDetails.rain);\n\t\tcase 'Ice Body':\n\t\t\treturn !teamDetails.hail;\n\t\tcase 'Immunity': case 'Snow Warning':\n\t\t\treturn (moves.has('facade') || moves.has('hypervoice'));\n\t\tcase 'Intimidate':\n\t\t\treturn (moves.has('bodyslam') || moves.has('rest') || abilities.has('Reckless') && counter.get('recoil') > 1);\n\t\tcase 'Lightning Rod':\n\t\t\treturn species.types.includes('Ground');\n\t\tcase 'Limber':\n\t\t\treturn species.types.includes('Electric');\n\t\tcase 'Magnet Pull':\n\t\t\treturn (!types.has('Electric') && !moves.has('earthpower'));\n\t\tcase 'Mold Breaker':\n\t\t\treturn (\n\t\t\t\tmoves.has('acrobatics') ||\n\t\t\t\tabilities.has('Adaptability') ||\n\t\t\t\t(abilities.has('Sheer Force') && !!counter.get('sheerforce'))\n\t\t\t);\n\t\tcase 'Overgrow':\n\t\t\treturn !counter.get('Grass');\n\t\tcase 'Poison Heal':\n\t\t\treturn (abilities.has('Technician') && !!counter.get('technician'));\n\t\tcase 'Prankster':\n\t\t\treturn !counter.get('Status');\n\t\tcase 'Pressure': case 'Synchronize':\n\t\t\treturn (counter.get('Status') < 2 || !!counter.get('recoil') || !!species.isMega);\n\t\tcase 'Reckless': case 'Rock Head':\n\t\t\treturn (!counter.get('recoil') || !!species.isMega);\n\t\tcase 'Regenerator':\n\t\t\treturn abilities.has('Magic Guard');\n\t\tcase 'Sand Force': case 'Sand Rush': case 'Sand Veil':\n\t\t\treturn !teamDetails.sand;\n\t\tcase 'Scrappy':\n\t\t\treturn !species.types.includes('Normal');\n\t\tcase 'Serene Grace':\n\t\t\treturn (!counter.get('serenegrace') || species.name === 'Blissey');\n\t\tcase 'Sheer Force':\n\t\t\treturn (!counter.get('sheerforce') || moves.has('doubleedge') || abilities.has('Guts') || !!species.isMega);\n\t\tcase 'Simple':\n\t\t\treturn (!counter.setupType && !moves.has('flamecharge'));\n\t\tcase 'Solar Power':\n\t\t\treturn (!counter.get('Special') || !teamDetails.sun || !!species.isMega);\n\t\tcase 'Speed Boost':\n\t\t\treturn moves.has('uturn');\n\t\tcase 'Swarm':\n\t\t\treturn (!counter.get('Bug') || !!species.isMega);\n\t\tcase 'Sweet Veil':\n\t\t\treturn types.has('Grass');\n\t\tcase 'Technician':\n\t\t\treturn (!counter.get('technician') || moves.has('tailslap') || !!species.isMega);\n\t\tcase 'Tinted Lens':\n\t\t\treturn (\n\t\t\t\tmoves.has('protect') ||\n\t\t\t\tabilities.has('Prankster') ||\n\t\t\t\tcounter.get('damage') >= counter.damagingMoves.size ||\n\t\t\t\t(counter.get('Status') > 2 && !counter.setupType)\n\t\t\t);\n\t\tcase 'Torrent':\n\t\t\treturn (!counter.get('Water') || !!species.isMega);\n\t\tcase 'Unaware':\n\t\t\treturn (!!counter.setupType || moves.has('stealthrock'));\n\t\tcase 'Unburden':\n\t\t\treturn (!!species.isMega || abilities.has('Prankster') || !counter.setupType && !moves.has('acrobatics'));\n\t\tcase 'Water Absorb':\n\t\t\treturn (moves.has('raindance') || ['Drizzle', 'Unaware', 'Volt Absorb'].some(a => abilities.has(a)));\n\t\tcase 'Weak Armor':\n\t\t\treturn counter.setupType !== 'Physical';\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tgetHighPriorityItem(\n\t\tability: string,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tisLead: boolean\n\t): string | undefined {\n\t\tif (species.requiredItem) return species.requiredItem;\n\t\tif (species.requiredItems) return this.sample(species.requiredItems);\n\n\t\t// First, the extra high-priority items\n\t\tif (species.name === 'Marowak') return 'Thick Club';\n\t\tif (species.name === 'Dedenne') return 'Petaya Berry';\n\t\tif (species.name === 'Deoxys-Attack') return (isLead && moves.has('stealthrock')) ? 'Focus Sash' : 'Life Orb';\n\t\tif (species.name === 'Farfetch\\u2019d') return 'Stick';\n\t\tif (species.name === 'Genesect' && moves.has('technoblast')) return 'Douse Drive';\n\t\tif (species.baseSpecies === 'Pikachu') return 'Light Ball';\n\t\tif (species.name === 'Shedinja' || species.name === 'Smeargle') return 'Focus Sash';\n\t\tif (species.name === 'Unfezant' && counter.get('Physical') >= 2) return 'Scope Lens';\n\t\tif (species.name === 'Unown') return 'Choice Specs';\n\t\tif (species.name === 'Wobbuffet') {\n\t\t\treturn moves.has('destinybond') ? 'Custap Berry' : this.sample(['Leftovers', 'Sitrus Berry']);\n\t\t}\n\t\tif (ability === 'Harvest') return 'Sitrus Berry';\n\t\tif (ability === 'Imposter') return 'Choice Scarf';\n\t\tif (moves.has('switcheroo') || moves.has('trick')) {\n\t\t\tif (ability === 'Klutz') {\n\t\t\t\treturn 'Assault Vest';\n\t\t\t} else if (species.baseStats.spe >= 60 && species.baseStats.spe <= 108) {\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 (species.nfe) return (ability === 'Technician' && counter.get('Physical') >= 4) ? 'Choice Band' : 'Eviolite';\n\t\tif (moves.has('copycat') && counter.get('Physical') >= 3) return 'Choice Band';\n\t\tif (moves.has('bellydrum')) return 'Sitrus Berry';\n\t\tif (\n\t\t\tmoves.has('geomancy') ||\n\t\t\t(moves.has('solarbeam') && ability !== 'Drought' && !moves.has('sunnyday') && !teamDetails.sun)\n\t\t) {\n\t\t\treturn 'Power Herb';\n\t\t}\n\t\tif (moves.has('shellsmash')) {\n\t\t\treturn (ability === 'Solid Rock' && !!counter.get('priority')) ? 'Weakness Policy' : 'White Herb';\n\t\t}\n\t\tif ((ability === 'Guts' || moves.has('facade') || moves.has('psychoshift')) && !moves.has('sleeptalk')) {\n\t\t\treturn moves.has('drainpunch') ? 'Flame Orb' : 'Toxic Orb';\n\t\t}\n\t\tif (\n\t\t\t(ability === 'Magic Guard' && counter.damagingMoves.size > 1) ||\n\t\t\t(ability === 'Sheer Force' && !!counter.get('sheerforce'))\n\t\t) {\n\t\t\treturn 'Life Orb';\n\t\t}\n\t\tif (ability === 'Poison Heal') return 'Toxic Orb';\n\t\tif (ability === 'Unburden') {\n\t\t\tif (moves.has('fakeout')) {\n\t\t\t\treturn 'Normal Gem';\n\t\t\t} else if (['dracometeor', 'leafstorm', 'overheat'].some(m => moves.has(m))) {\n\t\t\t\treturn 'White Herb';\n\t\t\t} else if (moves.has('substitute') || counter.setupType) {\n\t\t\t\treturn 'Sitrus Berry';\n\t\t\t} else {\n\t\t\t\treturn 'Red Card';\n\t\t\t}\n\t\t}\n\t\tif (moves.has('acrobatics')) return ''; // not undefined - we want \"no item\"\n\t\tif (moves.has('raindance')) return (ability === 'Forecast') ? 'Damp Rock' : 'Life Orb';\n\t\tif (moves.has('sunnyday')) return (ability === 'Forecast') ? 'Heat Rock' : 'Life Orb';\n\t\tif (moves.has('lightscreen') && moves.has('reflect')) return 'Light Clay';\n\t\tif (moves.has('rest') && !moves.has('sleeptalk') && ability !== 'Natural Cure' && ability !== 'Shed Skin') {\n\t\t\treturn 'Chesto Berry';\n\t\t}\n\t}\n\n\tgetMediumPriorityItem(\n\t\tability: string,\n\t\tmoves: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tspecies: Species,\n\t\tisDoubles: boolean,\n\t\tisLead: boolean\n\t): string | undefined {\n\t\tconst defensiveStatTotal = species.baseStats.hp + species.baseStats.def + species.baseStats.spd;\n\t\tconst scarfReqs = species.baseStats.spe >= 60 && species.baseStats.spe <= 108 && !counter.get('priority');\n\n\t\tif (\n\t\t\t(ability === 'Speed Boost' || ability === 'Stance Change') &&\n\t\t\tcounter.get('Physical') + counter.get('Special') > 2\n\t\t) {\n\t\t\treturn 'Life Orb';\n\t\t}\n\t\tif (\n\t\t\tcounter.get('Physical') >= 4 &&\n\t\t\t['bodyslam', 'dragontail', 'fakeout', 'flamecharge', 'rapidspin', 'suckerpunch'].every(m => !moves.has(m))\n\t\t) {\n\t\t\treturn (\n\t\t\t\t(species.baseStats.atk >= 100 || ability === 'Huge Power') &&\n\t\t\t\tscarfReqs &&\n\t\t\t\tthis.randomChance(2, 3)\n\t\t\t) ? 'Choice Scarf' : 'Choice Band';\n\t\t}\n\t\tif (\n\t\t\tcounter.get('Special') >= 4 &&\n\t\t\t!moves.has('acidspray') && !moves.has('clearsmog') && !moves.has('fierydance')\n\t\t) {\n\t\t\treturn (\n\t\t\t\tspecies.baseStats.spa >= 100 &&\n\t\t\t\tscarfReqs &&\n\t\t\t\tthis.randomChance(2, 3)\n\t\t\t) ? 'Choice Scarf' : 'Choice Specs';\n\t\t}\n\t\tif (\n\t\t\tcounter.get('Physical') >= 3 &&\n\t\t\tmoves.has('defog') &&\n\t\t\tscarfReqs &&\n\t\t\t!moves.has('foulplay')\n\t\t) {\n\t\t\treturn 'Choice Scarf';\n\t\t}\n\n\t\tif (counter.get('Special') >= 3 && moves.has('uturn') && !moves.has('acidspray')) return 'Choice Specs';\n\t\tif (\n\t\t\tability === 'Slow Start' ||\n\t\t\t['bite', 'clearsmog', 'curse', 'protect', 'sleeptalk'].some(m => moves.has(m)) ||\n\t\t\tspecies.name.includes('Rotom-')\n\t\t) {\n\t\t\treturn 'Leftovers';\n\t\t}\n\n\t\tif (['endeavor', 'flail', 'reversal'].some(m => moves.has(m)) && ability !== 'Sturdy') {\n\t\t\treturn (ability === 'Defeatist') ? 'Expert Belt' : 'Focus Sash';\n\t\t}\n\t\tif (moves.has('outrage') && counter.setupType) return 'Lum Berry';\n\t\tif (moves.has('substitute')) return counter.damagingMoves.size > 2 && !!counter.get('drain') ? 'Life Orb' : 'Leftovers';\n\t\tif (this.dex.getEffectiveness('Ground', species) >= 2 && ability !== 'Levitate' && !moves.has('magnetrise')) {\n\t\t\treturn 'Air Balloon';\n\t\t}\n\t\tif ((ability === 'Iron Barbs' || ability === 'Rough Skin') && this.randomChance(1, 2)) return 'Rocky Helmet';\n\t\tif (\n\t\t\tcounter.get('Physical') + counter.get('Special') >= 4 &&\n\t\t\tspecies.baseStats.spd >= 50 &&\n\t\t\tdefensiveStatTotal >= 235\n\t\t) {\n\t\t\treturn 'Assault Vest';\n\t\t}\n\t\tif (species.name === 'Palkia' && (moves.has('dracometeor') || moves.has('spacialrend')) && moves.has('hydropump')) {\n\t\t\treturn 'Lustrous Orb';\n\t\t}\n\t\tif (counter.damagingMoves.size >= 4) {\n\t\t\treturn (!!counter.get('Dragon') || !!counter.get('Dark') || !!counter.get('Normal')) ? 'Life Orb' : 'Expert Belt';\n\t\t}\n\t\tif (counter.damagingMoves.size >= 3 && counter.get('speedsetup') && defensiveStatTotal >= 300) return 'Weakness Policy';\n\t\tif (\n\t\t\tisLead &&\n\t\t\tability !== 'Regenerator' && ability !== 'Sturdy' &&\n\t\t\t!counter.get('recoil') && !counter.get('recovery') &&\n\t\t\tdefensiveStatTotal <= 275\n\t\t) {\n\t\t\treturn 'Focus Sash';\n\t\t}\n\t}\n\n\tgetLowPriorityItem(\n\t\tability: string,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tisLead: boolean\n\t): string | undefined {\n\t\tconst defensiveStatTotal = species.baseStats.hp + species.baseStats.def + species.baseStats.spd;\n\n\t\tif (ability === 'Gale Wings' && moves.has('bravebird')) return 'Sharp Beak';\n\t\tif (moves.has('stickyweb') && ability === 'Sturdy') return 'Mental Herb';\n\t\tif (ability === 'Serene Grace' && moves.has('airslash') && species.baseStats.spe > 100) return 'Metronome';\n\t\tif (ability === 'Sturdy' && moves.has('explosion') && !counter.get('speedsetup')) return 'Custap Berry';\n\t\tif (ability === 'Super Luck') return 'Scope Lens';\n\t\tif (\n\t\t\tcounter.damagingMoves.size >= 3 && ability !== 'Sturdy' &&\n\t\t\t['acidspray', 'dragontail', 'foulplay', 'rapidspin', 'superfang', 'uturn'].every(m => !moves.has(m))\n\t\t) {\n\t\t\treturn (\n\t\t\t\tcounter.get('speedsetup') ||\n\t\t\t\tmoves.has('trickroom') ||\n\t\t\t\t(species.baseStats.spe > 40 && defensiveStatTotal <= 275)\n\t\t\t) ? 'Life Orb' : 'Leftovers';\n\t\t}\n\t}\n\n\trandomSet(\n\t\tspecies: string | Species,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails = {},\n\t\tisLead = false\n\t): RandomTeamsTypes.RandomSet {\n\t\tspecies = this.dex.species.get(species);\n\t\tlet forme = species.name;\n\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\tforme = species.battleOnly;\n\t\t}\n\t\tif (species.cosmeticFormes) {\n\t\t\tforme = this.sample([species.name].concat(species.cosmeticFormes));\n\t\t}\n\n\t\tconst movePool = (species.randomBattleMoves || Object.keys(this.dex.species.getLearnset(species.id)!)).slice();\n\t\tconst rejectedPool = [];\n\t\tlet ability = '';\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\tlet abilities = new Set(Object.values(species.abilities));\n\t\tif (species.unreleasedHidden) abilities.delete(species.abilities.H);\n\t\tlet availableHP = 0;\n\t\tfor (const setMoveid of movePool) {\n\t\t\tif (setMoveid.startsWith('hiddenpower')) availableHP++;\n\t\t}\n\n\t\t// These moves can be used even if we aren't setting up to use them:\n\t\tconst SetupException = ['closecombat', 'diamondstorm', 'extremespeed', 'suckerpunch', 'superpower', 'dracometeor'];\n\n\t\tconst moves = new Set<string>();\n\t\tlet counter: MoveCounter;\n\t\t// We use a special variable to track Hidden Power\n\t\t// so that we can check for all Hidden Powers at once\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\twhile (moves.size < this.maxMoveCount && movePool.length) {\n\t\t\t\tconst moveid = this.sampleNoReplace(movePool);\n\t\t\t\tif (moveid.startsWith('hiddenpower')) {\n\t\t\t\t\tavailableHP--;\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\twhile (moves.size < this.maxMoveCount && rejectedPool.length) {\n\t\t\t\tconst moveid = this.sampleNoReplace(rejectedPool);\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\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\n\t\t\t\tlet {cull, isSetup} = this.shouldCullMove(\n\t\t\t\t\tmove, types, moves, abilities, counter, movePool,\n\t\t\t\t\tteamDetails, species, isLead\n\t\t\t\t);\n\n\t\t\t\t// This move doesn't satisfy our setup requirements:\n\t\t\t\tif (\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]) + counter.get(species.types[1]);\n\t\t\t\t\tif (\n\t\t\t\t\t\t!SetupException.includes(moveid) &&\n\t\t\t\t\t\t(!types.has(move.type) || stabs > 1 || counter.get(move.category) < 2)\n\t\t\t\t\t) cull = true;\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tcounter.setupType && !isSetup && counter.setupType !== 'Mixed' && move.category !== counter.setupType &&\n\t\t\t\t\tcounter.get(counter.setupType) < 2 && (move.category !== 'Status' || !move.flags.heal) &&\n\t\t\t\t\tmoveid !== 'sleeptalk' && !types.has('Dark') && !moves.has('darkpulse') && (\n\t\t\t\t\t\tmove.category !== 'Status' || (\n\t\t\t\t\t\t\tcounter.get(counter.setupType) + counter.get('Status') > 3 &&\n\t\t\t\t\t\t\tcounter.get('physicalsetup') + counter.get('specialsetup') < 2\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\t// Mono-attacking with setup and RestTalk is allowed\n\t\t\t\t\t// Reject Status moves only if there is nothing else to reject\n\t\t\t\t\tcull = true;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\tcounter.setupType === 'Special' &&\n\t\t\t\t\tmoveid === 'hiddenpower' &&\n\t\t\t\t\tspecies.types.length > 1 &&\n\t\t\t\t\tcounter.get('Special') <= 2 &&\n\t\t\t\t\t!types.has(move.type) &&\n\t\t\t\t\t!counter.get('Physical') &&\n\t\t\t\t\tcounter.get('specialpool')\n\t\t\t\t) {\n\t\t\t\t\t// Hidden Power isn't good enough\n\t\t\t\t\tcull = true;\n\t\t\t\t}\n\n\t\t\t\tconst runEnforcementChecker = (checkerName: string) => {\n\t\t\t\t\tif (!this.moveEnforcementCheckers[checkerName]) return false;\n\t\t\t\t\treturn this.moveEnforcementCheckers[checkerName](\n\t\t\t\t\t\tmovePool, moves, abilities, types, counter, species as Species, teamDetails\n\t\t\t\t\t);\n\t\t\t\t};\n\n\t\t\t\t// Pokemon should have moves that benefit their Type/Ability/Weather, as well as moves required by its forme\n\t\t\t\tif (\n\t\t\t\t\t!cull && !isSetup && !move.weather && !move.damage &&\n\t\t\t\t\t(move.category !== 'Status' || !move.flags.heal) &&\n\t\t\t\t\t!['judgment', 'sleeptalk', 'toxic'].includes(moveid) &&\n\t\t\t\t\t(counter.get('physicalsetup') + counter.get('specialsetup') < 2 && (\n\t\t\t\t\t\t!counter.setupType || counter.setupType === 'Mixed' ||\n\t\t\t\t\t\t(move.category !== counter.setupType && move.category !== 'Status') ||\n\t\t\t\t\t\tcounter.get(counter.setupType) + counter.get('Status') > 3\n\t\t\t\t\t)) && (\n\t\t\t\t\t\tmove.category === 'Status' ||\n\t\t\t\t\t\t!types.has(move.type) ||\n\t\t\t\t\t\t(move.basePower && move.basePower < 40 && !move.multihit)\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tif (\n\t\t\t\t\t\t(!counter.get('stab') && !moves.has('nightshade') && !moves.has('seismictoss') && (\n\t\t\t\t\t\t\tspecies.types.length > 1 ||\n\t\t\t\t\t\t\t(species.types[0] !== 'Normal' && species.types[0] !== 'Psychic') ||\n\t\t\t\t\t\t\t!moves.has('icebeam') ||\n\t\t\t\t\t\t\tspecies.baseStats.spa >= species.baseStats.spd)\n\t\t\t\t\t\t) ||\n\t\t\t\t\t\t(!counter.get('recovery') && !counter.setupType && !moves.has('healingwish') && (\n\t\t\t\t\t\t\tmovePool.includes('recover') || movePool.includes('roost') || movePool.includes('softboiled')\n\t\t\t\t\t\t) && (counter.get('Status') > 1 || (species.nfe && !!counter.get('Status')))) ||\n\t\t\t\t\t\t(movePool.includes('stickyweb') && !counter.setupType && !teamDetails.stickyWeb) ||\n\t\t\t\t\t\t(species.requiredMove && movePool.includes(toID(species.requiredMove))) ||\n\t\t\t\t\t\t(moves.has('suckerpunch') && counter.get('stab') < species.types.length)\n\t\t\t\t\t) {\n\t\t\t\t\t\tcull = true;\n\t\t\t\t\t} else {\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\tfor (const abil of abilities) {\n\t\t\t\t\t\t\tif (runEnforcementChecker(abil)) {\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 (moveid === '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 cull moves from the move list\n\t\t\t\tif (cull && (\n\t\t\t\t\tmovePool.length - availableHP ||\n\t\t\t\t\t(availableHP && (moveid.startsWith('hiddenpower') || !hasHiddenPower))\n\t\t\t\t)) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tmove.category !== 'Status' &&\n\t\t\t\t\t\t!move.damage && !move.flags.charge &&\n\t\t\t\t\t\t(moveid !== 'hiddenpower' || !availableHP)\n\t\t\t\t\t) rejectedPool.push(moveid);\n\t\t\t\t\tmoves.delete(moveid);\n\t\t\t\t\tif (moveid.startsWith('hiddenpower')) hasHiddenPower = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (cull && rejectedPool.length) {\n\t\t\t\t\tmoves.delete(moveid);\n\t\t\t\t\tif (moveid.startsWith('hiddenpower')) hasHiddenPower = false;\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\tif (hasHiddenPower) {\n\t\t\tlet hpType;\n\t\t\tfor (const move of moves) {\n\t\t\t\tif (move.startsWith('hiddenpower')) {\n\t\t\t\t\thpType = move.substr(11);\n\t\t\t\t\tbreak;\n\t\t\t\t}\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\t// Moveset modifications\n\t\tif (moves.has('autotomize') && moves.has('heavyslam')) {\n\t\t\tmoves.delete('autotomize');\n\t\t\tmoves.add('rockpolish');\n\t\t}\n\t\tif (moves.has('raindance') && moves.has('thunderbolt')) {\n\t\t\tmoves.delete('thunderbolt');\n\t\t\tmoves.add('thunder');\n\t\t}\n\n\t\tif (species.battleOnly && !species.requiredAbility) {\n\t\t\tabilities = new Set(Object.values(this.dex.species.get(species.battleOnly as string).abilities));\n\t\t}\n\t\tconst abilityData = [...abilities].map(a => this.dex.abilities.get(a));\n\t\tUtils.sortBy(abilityData, abil => -abil.rating);\n\n\t\tif (abilityData.length > 1) {\n\t\t\t// Sort abilities by rating with an element of randomness\n\t\t\tif (abilityData[2] && abilityData[1].rating <= abilityData[2].rating && this.randomChance(1, 2)) {\n\t\t\t\t[abilityData[1], abilityData[2]] = [abilityData[2], abilityData[1]];\n\t\t\t}\n\t\t\tif (abilityData[0].rating <= abilityData[1].rating && this.randomChance(1, 2)) {\n\t\t\t\t[abilityData[0], abilityData[1]] = [abilityData[1], abilityData[0]];\n\t\t\t} else if (abilityData[0].rating - 0.6 <= abilityData[1].rating && this.randomChance(2, 3)) {\n\t\t\t\t[abilityData[0], abilityData[1]] = [abilityData[1], abilityData[0]];\n\t\t\t}\n\n\t\t\t// Start with the first abiility and work our way through, culling as we go\n\t\t\tability = abilityData[0].name;\n\n\t\t\twhile (this.shouldCullAbility(ability, types, moves, abilities, counter, movePool, teamDetails, species)) {\n\t\t\t\tif (ability === abilityData[0].name && abilityData[1].rating >= 1) {\n\t\t\t\t\tability = abilityData[1].name;\n\t\t\t\t} else if (ability === abilityData[1].name && abilityData[2] && abilityData[2].rating >= 1) {\n\t\t\t\t\tability = abilityData[2].name;\n\t\t\t\t} else {\n\t\t\t\t\t// Default to the highest rated ability if all are rejected\n\t\t\t\t\tability = abilityData[0].name;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tabilities.has('Guts') &&\n\t\t\t\tability !== 'Quick Feet' &&\n\t\t\t\t(moves.has('facade') || moves.has('protect') || (moves.has('rest') && moves.has('sleeptalk')))\n\t\t\t) {\n\t\t\t\tability = 'Guts';\n\t\t\t} else if (abilities.has('Moxie') && counter.get('Physical') > 3) {\n\t\t\t\tability = 'Moxie';\n\t\t\t}\n\t\t\tif (species.name === 'Ambipom' && !counter.get('technician')) {\n\t\t\t\t// If it doesn't qualify for Technician, Skill Link is useless on it\n\t\t\t\tability = 'Pickup';\n\t\t\t} else if (species.name === 'Lopunny' && moves.has('switcheroo') && this.randomChance(2, 3)) {\n\t\t\t\tability = 'Klutz';\n\t\t\t}\n\t\t} else {\n\t\t\tability = abilityData[0].name;\n\t\t}\n\n\t\tlet item = this.getHighPriorityItem(ability, types, moves, counter, teamDetails, species, isLead);\n\t\tif (item === undefined) item = this.getMediumPriorityItem(ability, moves, counter, species, false, isLead);\n\t\tif (item === undefined) {\n\t\t\titem = this.getLowPriorityItem(ability, types, moves, abilities, counter, teamDetails, species, isLead);\n\t\t}\n\t\tif (item === undefined) item = 'Leftovers';\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 levelScale: {[k: string]: number} = {\n\t\t\tuber: 76, ou: 80, uu: 82, ru: 84, nu: 86, pu: 88,\n\t\t};\n\t\tconst customScale: {[k: string]: number} = {\n\t\t\t// Banned Ability\n\t\t\tDugtrio: 82, Gothitelle: 82, Ninetales: 84, Politoed: 84, Wobbuffet: 82,\n\t\t\t// Holistic judgement\n\t\t\tCastform: 100, Delibird: 100, 'Genesect-Douse': 80, Luvdisc: 100, Spinda: 100, Unown: 100,\n\t\t};\n\t\tconst tier = toID(species.tier).replace('bl', '');\n\t\tconst level = this.adjustLevel || customScale[species.name] || levelScale[tier] || (species.nfe ? 90 : 80);\n\n\t\t// Prepare optimal HP\n\t\tconst srWeakness = 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\tif (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 if (moves.has('substitute') && (item === 'Petaya Berry' || item === 'Sitrus Berry')) {\n\t\t\t\t// Three Substitutes should activate Petaya Berry for Dedenne\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') {\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 {\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\t// Minimize confusion damage\n\t\tif (!counter.get('Physical') && !moves.has('copycat') && !moves.has('transform')) {\n\t\t\tevs.atk = 0;\n\t\t\tivs.atk = hasHiddenPower ? ivs.atk - 30 : 0;\n\t\t}\n\n\t\tif (['gyroball', 'metalburst', 'trickroom'].some(m => moves.has(m))) {\n\t\t\tevs.spe = 0;\n\t\t\tivs.spe = hasHiddenPower ? ivs.spe - 30 : 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\tmoves: Array.from(moves),\n\t\t\tability: ability,\n\t\t\tevs: evs,\n\t\t\tivs: ivs,\n\t\t\titem: item,\n\t\t\tlevel,\n\t\t\tshiny: this.randomChance(1, 1024),\n\t\t};\n\t}\n\n\trandomFactorySets: {[format: string]: {[species: string]: BattleFactorySpecies}} = {};\n\n\trandomFactorySet(\n\t\tspecies: Species,\n\t\tteamData: RandomTeamsTypes.FactoryTeamDetails,\n\t\ttier: string\n\t): RandomTeamsTypes.RandomFactorySet | null {\n\t\tconst id = toID(species.name);\n\t\t// const flags = this.randomFactorySets[tier][id].flags;\n\t\tconst setList = this.randomFactorySets[tier][id].sets;\n\n\t\tconst itemsMax: {[k: string]: number} = {choicespecs: 1, choiceband: 1, choicescarf: 1};\n\t\tconst movesMax: {[k: string]: number} = {\n\t\t\trapidspin: 1, batonpass: 1, stealthrock: 1, defog: 1, spikes: 1, toxicspikes: 1,\n\t\t};\n\t\tconst requiredMoves: {[k: string]: string} = {stealthrock: 'hazardSet', rapidspin: 'hazardClear', defog: 'hazardClear'};\n\t\tconst weatherAbilitiesRequire: {[k: string]: string} = {\n\t\t\thydration: 'raindance', swiftswim: 'raindance',\n\t\t\tleafguard: 'sunnyday', solarpower: 'sunnyday', chlorophyll: 'sunnyday',\n\t\t\tsandforce: 'sandstorm', sandrush: 'sandstorm', sandveil: 'sandstorm',\n\t\t\tsnowcloak: 'hail',\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[], itemVariants?: number, abilityVariants?: number}[] = [];\n\t\tconst priorityPool = [];\n\t\tfor (const curSet of setList) {\n\t\t\tif (this.forceMonotype && !species.types.includes(this.forceMonotype)) continue;\n\n\t\t\tconst itemData = this.dex.items.get(curSet.item);\n\t\t\tif (teamData.megaCount && teamData.megaCount > 0 && itemData.megaStone) continue; // reject 2+ mega stones\n\t\t\tif (itemsMax[itemData.id] && teamData.has[itemData.id] >= itemsMax[itemData.id]) continue;\n\n\t\t\tconst abilityState = this.dex.abilities.get(curSet.ability);\n\t\t\tif (weatherAbilitiesRequire[abilityState.id] && teamData.weather !== weatherAbilitiesRequire[abilityState.id]) continue;\n\t\t\tif (teamData.weather && weatherAbilities.includes(abilityState.id)) continue; // reject 2+ weather setters\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\t\t\teffectivePool.push({set: curSet, moveVariants: curSetVariants});\n\t\t\tif (hasRequiredMove) priorityPool.push({set: curSet, moveVariants: curSetVariants});\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\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: setData.set.item || '',\n\t\t\tability: setData.set.ability || species.abilities['0'],\n\t\t\tshiny: typeof setData.set.shiny === 'undefined' ? this.randomChance(1, 1024) : setData.set.shiny,\n\t\t\tlevel: this.adjustLevel || 100,\n\t\t\thappiness: typeof setData.set.happiness === 'undefined' ? 255 : setData.set.happiness,\n\t\t\tevs: setData.set.evs || {hp: 84, atk: 84, def: 84, spa: 84, spd: 84, spe: 84},\n\t\t\tivs: setData.set.ivs || {hp: 31, atk: 31, def: 31, spa: 31, spd: 31, spe: 31},\n\t\t\tnature: setData.set.nature || 'Serious',\n\t\t\tmoves: moves,\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\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) this.factoryTier = this.sample(['Uber', 'OU', 'UU', 'RU', 'NU', 'PU']);\n\t\tconst chosenTier = this.factoryTier;\n\n\t\tconst pokemon = [];\n\n\t\tconst pokemonPool = Object.keys(this.randomFactorySets[chosenTier]);\n\n\t\tconst teamData: TeamData = {\n\t\t\ttypeCount: {}, typeComboCount: {}, baseFormes: {}, megaCount: 0, has: {}, forceResult,\n\t\t\tweaknesses: {}, resistances: {},\n\t\t};\n\t\tconst requiredMoveFamilies = ['hazardSet', 'hazardClear'];\n\t\tconst requiredMoves: {[k: string]: string} = {stealthrock: 'hazardSet', rapidspin: 'hazardClear', defog: 'hazardClear'};\n\t\tconst weatherAbilitiesSet: {[k: string]: string} = {\n\t\t\tdrizzle: 'raindance', drought: 'sunnyday', snowwarning: 'hail', sandstream: '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\tconst speciesFlags = this.randomFactorySets[chosenTier][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\t// Limit the number of Megas to one\n\t\t\tif (!teamData.megaCount) teamData.megaCount = 0;\n\t\t\tif (teamData.megaCount >= 1 && speciesFlags.megaOnly) continue;\n\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\t// Limit 2 of any type\n\t\t\tconst types = species.types;\n\t\t\tlet skip = false;\n\t\t\tfor (const type of types) {\n\t\t\t\tif (teamData.typeCount[type] >= 2 * limitFactor && this.randomChance(4, 5)) {\n\t\t\t\t\tskip = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (skip) continue;\n\n\t\t\tconst set = this.randomFactorySet(species, teamData, chosenTier);\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 (teamData.typeComboCount[typeCombo] >= 1 * limitFactor) continue;\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\tteamData.typeComboCount[typeCombo] = (teamData.typeComboCount[typeCombo] + 1) || 1;\n\n\t\t\tteamData.baseFormes[species.baseSpecies] = 1;\n\n\t\t\tconst itemData = this.dex.items.get(set.item);\n\t\t\tif (itemData.megaStone) teamData.megaCount++;\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 Pokemon 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 type in teamData.weaknesses) {\n\t\t\t\tif (teamData.weaknesses[type] >= 3) return this.randomFactoryTeam(side, ++depth);\n\t\t\t}\n\t\t}\n\n\t\treturn pokemon;\n\t}\n}\n\nexport default RandomGen6Teams;\n","import {MoveCounter} from './gen8';\nimport {RandomGen6Teams} from './gen6';\nimport {Utils} from './utils';\nimport {\n\tFormat,\n\tModdedDex,\n\tMove,\n\tPRNG,\n\tPRNGSeed,\n\tRandomTeamsTypes,\n\tSparseStatsTable,\n\tSpecies,\n\tStatID,\n\ttoID,\n} from '@pkmn/sim';\n\nexport class RandomGen5Teams extends RandomGen6Teams {\n\tconstructor(dex: ModdedDex, format: Format, prng: PRNG | PRNGSeed | null) {\n\t\tsuper(dex, format, prng);\n\t\tthis.moveEnforcementCheckers = {\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\tDark: (movePool, moves, abilities, types, counter) => !counter.get('Dark'),\n\t\t\tDragon: (movePool, moves, abilities, types, counter) => !counter.get('Dragon'),\n\t\t\tElectric: (movePool, moves, abilities, types, counter) => !counter.get('Electric') || movePool.includes('thunder'),\n\t\t\tFighting: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\t!counter.get('Fighting') &&\n\t\t\t\t(species.baseStats.atk >= 90 || abilities.has('Pure Power') || !!counter.setupType || !counter.get('Status'))\n\t\t\t),\n\t\t\tFire: (movePool, moves, abilities, types, counter) => !counter.get('Fire'),\n\t\t\tFlying: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!counter.get('Flying') && (types.has('Normal') || abilities.has('Serene Grace'))\n\t\t\t),\n\t\t\tGhost: (movePool, moves, abilities, types, counter) => !types.has('Dark') && !counter.get('Ghost'),\n\t\t\tGrass: movePool => movePool.includes('hornleech') || movePool.includes('seedflare'),\n\t\t\tGround: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!counter.get('Ground') && !moves.has('rest') && !moves.has('sleeptalk')\n\t\t\t),\n\t\t\tIce: (movePool, moves, abilities, types, counter) => !counter.get('Ice'),\n\t\t\tNormal: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\tmovePool.includes('return') && species.baseStats.atk > 80\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) => !counter.get('Steel') && abilities.has('Technician'),\n\t\t\tWater: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!counter.get('Water') || (abilities.has('Adaptability') && movePool.includes('waterfall'))\n\t\t\t),\n\t\t\tContrary: (movePool, moves, abilities, types, counter, species, teamDetails) => (\n\t\t\t\t!counter.get('contrary') && species.name !== 'Shuckle'\n\t\t\t),\n\t\t\tGuts: (movePool, moves, abilities, types) => types.has('Normal') && movePool.includes('facade'),\n\t\t\t'Slow Start': movePool => movePool.includes('substitute'),\n\t\t};\n\t}\n\n\tshouldCullMove(\n\t\tmove: Move,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tmovePool: string[],\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tisLead: boolean,\n\t): {cull: boolean, isSetup?: boolean} {\n\t\tconst hasRestTalk = moves.has('rest') && moves.has('sleeptalk');\n\t\tswitch (move.id) {\n\t\t// Not very useful without their supporting moves\n\t\tcase 'batonpass':\n\t\t\treturn {cull: !counter.setupType && !counter.get('speedsetup') && !moves.has('substitute') && !moves.has('wish')};\n\t\tcase 'endeavor':\n\t\t\treturn {cull: !isLead};\n\t\tcase 'focuspunch':\n\t\t\treturn {cull: !moves.has('substitute') || counter.damagingMoves.size < 2 || moves.has('swordsdance')};\n\t\tcase 'rest':\n\t\t\treturn {cull: movePool.includes('sleeptalk')};\n\t\tcase 'sleeptalk':\n\t\t\tif (movePool.length > 1) {\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\treturn {cull: !moves.has('rest')};\n\t\tcase 'storedpower':\n\t\t\treturn {cull: !counter.setupType && !moves.has('cosmicpower')};\n\t\tcase 'weatherball':\n\t\t\treturn {cull: !moves.has('sunnyday')};\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\treturn {cull: (counter.setupType !== 'Physical' || counter.get('physicalsetup') > 1 || (\n\t\t\t\tcounter.get('Physical') + counter.get('physicalpool') < 2 &&\n\t\t\t\t!moves.has('batonpass') &&\n\t\t\t\t!hasRestTalk\n\t\t\t)), isSetup: true};\n\t\tcase 'calmmind': case 'nastyplot': case 'tailglow':\n\t\t\treturn {cull: (counter.setupType !== 'Special' || counter.get('specialsetup') > 1 || (\n\t\t\t\tcounter.get('Special') + counter.get('specialpool') < 2 &&\n\t\t\t\t!moves.has('batonpass') &&\n\t\t\t\t!hasRestTalk\n\t\t\t)), isSetup: true};\n\t\tcase 'growth': case 'shellsmash': case 'workup':\n\t\t\tconst moveTotal = counter.damagingMoves.size + counter.get('physicalpool') + counter.get('specialpool');\n\t\t\treturn {\n\t\t\t\tcull: (\n\t\t\t\t\tcounter.setupType !== 'Mixed' ||\n\t\t\t\t\tcounter.get('mixedsetup') > 1 ||\n\t\t\t\t\tmoveTotal < 2 ||\n\t\t\t\t\t(move.id === 'growth' && !moves.has('sunnyday'))\n\t\t\t\t),\n\t\t\t\tisSetup: true,\n\t\t\t};\n\t\tcase 'agility': case 'autotomize': case 'rockpolish':\n\t\t\treturn {\n\t\t\t\tcull: (\n\t\t\t\t\t(counter.damagingMoves.size < 2 && !counter.setupType && !moves.has('batonpass')) ||\n\t\t\t\t\thasRestTalk\n\t\t\t\t),\n\t\t\t\tisSetup: !counter.setupType,\n\t\t\t};\n\n\t\t// Bad after setup\n\t\tcase 'bulletpunch':\n\t\t\treturn {cull: !!counter.get('speedsetup')};\n\t\tcase 'circlethrow': case 'dragontail':\n\t\t\treturn {cull: moves.has('substitute') || (!!counter.setupType && !moves.has('rest') && !moves.has('sleeptalk'))};\n\t\tcase 'fakeout': case 'healingwish':\n\t\t\treturn {cull: !!counter.setupType || !!counter.get('recovery') || moves.has('substitute')};\n\t\tcase 'haze': case 'magiccoat': case 'pursuit': case 'spikes':\n\t\t\treturn {cull: !!counter.setupType || !!counter.get('speedsetup') || moves.has('rest') || moves.has('trickroom')};\n\t\tcase 'leechseed': case 'roar': case 'whirlwind':\n\t\t\treturn {cull: !!counter.setupType || !!counter.get('speedsetup') || moves.has('dragontail')};\n\t\tcase 'nightshade': case 'seismictoss': case 'superfang':\n\t\t\treturn {cull: !!counter.setupType || counter.damagingMoves.size > 1};\n\t\tcase 'protect':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('rest') ||\n\t\t\t\t(counter.setupType && !abilities.has('Speed Boost') && !moves.has('wish')) ||\n\t\t\t\tmoves.has('lightscreen') && moves.has('reflect')\n\t\t\t)};\n\t\tcase 'rapidspin':\n\t\t\treturn {cull: moves.has('shellsmash') || (!!counter.setupType && counter.get('Status') >= 2)};\n\t\tcase 'stealthrock':\n\t\t\treturn {cull: !!counter.setupType || !!counter.get('speedsetup') || moves.has('rest') || !!teamDetails.stealthRock};\n\t\tcase 'switcheroo': case 'trick':\n\t\t\treturn {cull: (\n\t\t\t\tcounter.get('Physical') + counter.get('Special') < 3 ||\n\t\t\t\t!!counter.get('priority') ||\n\t\t\t\tmoves.has('rapidspin')\n\t\t\t)};\n\t\tcase 'toxic':\n\t\t\treturn {cull: !!counter.setupType || !!counter.get('speedsetup') || moves.has('trickroom')};\n\t\tcase 'toxicspikes':\n\t\t\treturn {cull: !!counter.setupType || !!teamDetails.toxicSpikes};\n\t\tcase 'trickroom':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.setupType ||\n\t\t\t\t!!counter.get('speedsetup') ||\n\t\t\t\tcounter.damagingMoves.size < 2 ||\n\t\t\t\tmoves.has('lightscreen') || moves.has('reflect')\n\t\t\t)};\n\t\tcase 'uturn':\n\t\t\t// Infernape doesn't want mixed sets with U-turn\n\t\t\tconst infernapeCase = species.id === 'infernape' && !!counter.get('Special');\n\t\t\treturn {cull: !!counter.setupType || !!counter.get('speedsetup') || moves.has('batonpass') || infernapeCase};\n\t\tcase 'voltswitch':\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['batonpass', 'magnetrise', 'uturn'].some(m => moves.has(m))\n\t\t\t)};\n\n\t\t// Ineffective having both\n\t\t// Attacks:\n\t\tcase 'bugbite':\n\t\t\treturn {cull: moves.has('uturn')};\n\t\tcase 'crunch':\n\t\t\treturn {cull: !types.has('Dark') && moves.has('suckerpunch')};\n\t\tcase 'dragonpulse': case 'spacialrend':\n\t\t\treturn {cull: moves.has('dracometeor') || moves.has('outrage')};\n\t\tcase 'thunderbolt':\n\t\t\treturn {cull: moves.has('wildcharge')};\n\t\tcase 'drainpunch': case 'focusblast':\n\t\t\treturn {cull: moves.has('closecombat') || moves.has('lowkick')};\n\t\tcase 'blueflare': case 'flareblitz': case 'fierydance': case 'flamethrower': case 'lavaplume':\n\t\t\treturn {cull: ['fireblast', 'overheat', 'vcreate'].some(m => moves.has(m))};\n\t\tcase 'bravebird': case 'pluck':\n\t\t\treturn {cull: moves.has('acrobatics') || moves.has('hurricane')};\n\t\tcase 'gigadrain':\n\t\t\treturn {cull: (!counter.setupType && moves.has('leafstorm')) || moves.has('petaldance') || moves.has('powerwhip')};\n\t\tcase 'solarbeam':\n\t\t\treturn {cull: (!abilities.has('Drought') && !moves.has('sunnyday')) || moves.has('gigadrain')};\n\t\tcase 'leafstorm':\n\t\t\treturn {cull: !!counter.setupType && moves.has('gigadrain')};\n\t\tcase 'bonemerang': case 'earthpower':\n\t\t\treturn {cull: moves.has('earthquake')};\n\t\tcase 'extremespeed': case 'headsmash':\n\t\t\treturn {cull: moves.has('roost')};\n\t\tcase 'facade':\n\t\t\treturn {cull: moves.has('suckerpunch') && !types.has('Normal')};\n\t\tcase 'judgment':\n\t\t\treturn {cull: counter.setupType !== 'Special' && counter.get('stab') > 1};\n\t\tcase 'return':\n\t\t\treturn {cull: moves.has('doubleedge')};\n\t\tcase 'poisonjab':\n\t\t\treturn {cull: moves.has('gunkshot')};\n\t\tcase 'psychic':\n\t\t\treturn {cull: moves.has('psyshock')};\n\t\tcase 'scald': case 'surf':\n\t\t\treturn {cull: moves.has('hydropump') || moves.has('waterfall')};\n\t\tcase 'waterspout':\n\t\t\treturn {cull: !!counter.get('Status')};\n\n\t\t// Status:\n\t\tcase 'encore': case 'icepunch': case 'raindance': case 'suckerpunch':\n\t\t\treturn {cull: moves.has('thunderwave') || hasRestTalk};\n\t\tcase 'glare': case 'headbutt':\n\t\t\treturn {cull: moves.has('bodyslam')};\n\t\tcase 'healbell':\n\t\t\treturn {cull: !!counter.get('speedsetup') || moves.has('magiccoat')};\n\t\tcase 'moonlight': case 'painsplit': case 'recover': case 'roost': case 'softboiled': case 'synthesis':\n\t\t\treturn {cull: ['leechseed', 'rest', 'wish'].some(m => moves.has(m))};\n\t\tcase 'substitute':\n\t\t\treturn {cull: (\n\t\t\t\t(moves.has('doubleedge') && !abilities.has('rockhead')) ||\n\t\t\t\t['pursuit', 'rest', 'superpower', 'uturn', 'voltswitch'].some(m => moves.has(m))\n\t\t\t)};\n\t\tcase 'thunderwave':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.setupType ||\n\t\t\t\t!!counter.get('speedsetup') ||\n\t\t\t\thasRestTalk ||\n\t\t\t\tmoves.has('discharge') || moves.has('trickroom')\n\t\t\t)};\n\t\tcase 'willowisp':\n\t\t\treturn {cull: moves.has('lavaplume') || moves.has('scald') && !types.has('Ghost')};\n\t\t}\n\n\t\treturn {cull: false};\n\t}\n\n\tshouldCullAbility(\n\t\tability: string,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tmovePool: string[],\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species\n\t): boolean {\n\t\tswitch (ability) {\n\t\tcase 'Anger Point': case 'Gluttony': case 'Keen Eye': case 'Moody':\n\t\tcase 'Sand Veil': case 'Snow Cloak': case 'Steadfast': case 'Weak Armor':\n\t\t\treturn true;\n\t\tcase 'Analytic': case 'Download': case 'Hyper Cutter':\n\t\t\treturn species.nfe;\n\t\tcase 'Chlorophyll': case 'Solar Power':\n\t\t\treturn (!moves.has('sunnyday') && !teamDetails.sun);\n\t\tcase 'Compound Eyes': case 'No Guard':\n\t\t\treturn !counter.get('inaccurate');\n\t\tcase 'Contrary': case 'Iron Fist': case 'Skill Link':\n\t\t\treturn !counter.get(toID(ability));\n\t\tcase 'Defiant': case 'Moxie':\n\t\t\treturn (!counter.get('Physical') && !moves.has('batonpass'));\n\t\tcase 'Flash Fire':\n\t\t\treturn abilities.has('Drought');\n\t\tcase 'Hydration': case 'Rain Dish': case 'Swift Swim':\n\t\t\treturn (!moves.has('raindance') && !teamDetails.rain);\n\t\tcase 'Hustle':\n\t\t\treturn counter.get('Physical') < 2;\n\t\tcase 'Ice Body':\n\t\t\treturn !teamDetails.hail;\n\t\tcase 'Immunity':\n\t\t\treturn abilities.has('Toxic Boost');\n\t\tcase 'Intimidate':\n\t\t\treturn moves.has('rest') || species.id === 'staraptor';\n\t\tcase 'Lightning Rod':\n\t\t\treturn species.types.includes('Ground');\n\t\tcase 'Limber':\n\t\t\treturn species.types.includes('Electric');\n\t\tcase 'Mold Breaker':\n\t\t\treturn (abilities.has('Adaptability') || moves.has('rest') && moves.has('sleeptalk'));\n\t\tcase 'Overgrow':\n\t\t\treturn !counter.get('Grass');\n\t\tcase 'Poison Heal':\n\t\t\treturn (abilities.has('Technician') && !!counter.get('technician'));\n\t\tcase 'Prankster':\n\t\t\treturn !counter.get('Status');\n\t\tcase 'Pressure': case 'Synchronize':\n\t\t\treturn (counter.get('Status') < 2 || abilities.has('Trace'));\n\t\tcase 'Reckless': case 'Rock Head':\n\t\t\treturn (!counter.get('recoil') || abilities.has('Sap Sipper'));\n\t\tcase 'Regenerator':\n\t\t\treturn abilities.has('Magic Guard');\n\t\tcase 'Sand Force': case 'Sand Rush':\n\t\t\treturn !teamDetails.sand;\n\t\tcase 'Serene Grace':\n\t\t\treturn (!counter.get('serenegrace') || species.id === 'blissey');\n\t\tcase 'Sheer Force':\n\t\t\treturn (!counter.get('sheerforce') || abilities.has('Guts'));\n\t\tcase 'Sturdy':\n\t\t\treturn (!!counter.get('recoil') && !counter.get('recovery'));\n\t\tcase 'Swarm':\n\t\t\treturn !counter.get('Bug');\n\t\tcase 'Technician':\n\t\t\treturn (!counter.get('technician') || moves.has('tailslap'));\n\t\tcase 'Tinted Lens':\n\t\t\treturn (abilities.has('Insomnia') || abilities.has('Magic Guard') || moves.has('protect'));\n\t\tcase 'Unaware':\n\t\t\treturn (!!counter.setupType || abilities.has('Magic Guard'));\n\t\tcase 'Unburden':\n\t\t\treturn species.baseStats.spe > 100 && !moves.has('acrobatics');\n\t\tcase 'Water Absorb':\n\t\t\treturn (abilities.has('Drizzle') || abilities.has('Unaware') || abilities.has('Volt Absorb'));\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tgetHighPriorityItem(\n\t\tability: string,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tisLead: boolean\n\t): string | undefined {\n\t\tif (species.requiredItem) return species.requiredItem;\n\t\tif (species.requiredItems) return this.sample(species.requiredItems);\n\n\t\tif (species.name === 'Marowak') return 'Thick Club';\n\t\tif (species.name === 'Farfetch\\u2019d') return 'Stick';\n\t\tif (species.name === 'Pikachu') return 'Light Ball';\n\t\tif (species.name === 'Shedinja' || species.name === 'Smeargle') return 'Focus Sash';\n\t\tif (species.name === 'Unown') return 'Choice Specs';\n\t\tif (species.name === 'Wobbuffet' && moves.has('destinybond') && this.randomChance(1, 2)) return 'Custap Berry';\n\t\tif (ability === 'Imposter') return 'Choice Scarf';\n\t\tif (moves.has('switcheroo') || moves.has('trick')) {\n\t\t\tif (species.baseStats.spe >= 60 && species.baseStats.spe <= 108 && !counter.get('priority')) {\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 (species.nfe) return 'Eviolite';\n\t\tif (moves.has('shellsmash')) return 'White Herb';\n\t\tif (ability === 'Harvest' || moves.has('bellydrum')) return 'Sitrus Berry';\n\t\tif ((ability === 'Magic Guard' || ability === 'Sheer Force') && counter.damagingMoves.size > 1) return 'Life Orb';\n\t\tif (\n\t\t\tability === 'Poison Heal' ||\n\t\t\tability === 'Toxic Boost' ||\n\t\t\t(ability === 'Quick Feet' && moves.has('facade')) ||\n\t\t\tmoves.has('psychoshift')\n\t\t) {\n\t\t\treturn 'Toxic Orb';\n\t\t}\n\t\tif (moves.has('rest') && !moves.has('sleeptalk') && ability !== 'Natural Cure' && ability !== 'Shed Skin') {\n\t\t\treturn 'Chesto Berry';\n\t\t}\n\t\tif (ability === 'Guts' && moves.has('facade')) {\n\t\t\treturn (types.has('Fire') || moves.has('uturn') || moves.has('voltswitch')) ? 'Toxic Orb' : 'Flame Orb';\n\t\t}\n\t\tif (moves.has('raindance')) return (ability === 'Forecast') ? 'Damp Rock' : 'Life Orb';\n\t\tif (moves.has('sunnyday')) return (ability === 'Forecast' || ability === 'Flower Gift') ? 'Heat Rock' : 'Life Orb';\n\t\tif (moves.has('lightscreen') && moves.has('reflect')) return 'Light Clay';\n\t\tif (moves.has('acrobatics')) return 'Flying Gem';\n\t\tif (ability === 'Unburden') return moves.has('fakeout') ? 'Normal Gem' : `${species.types[0]} Gem`;\n\t}\n\n\tgetLowPriorityItem(\n\t\tability: string,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tisLead: boolean,\n\t): string | undefined {\n\t\tif (\n\t\t\tability === 'Speed Boost' &&\n\t\t\t!moves.has('substitute') &&\n\t\t\tcounter.get('Physical') + counter.get('Special') > 2\n\t\t) {\n\t\t\treturn 'Life Orb';\n\t\t}\n\t\tif (\n\t\t\tcounter.get('Physical') >= 4 &&\n\t\t\t['dragontail', 'fakeout', 'flamecharge'].every(m => !moves.has(m)) &&\n\t\t\t!moves.has('suckerpunch') &&\n\t\t\t(!moves.has('rapidspin') || this.dex.getEffectiveness('Rock', species) < 1)\n\t\t) {\n\t\t\treturn (\n\t\t\t\t(species.baseStats.atk >= 100 || abilities.has('Huge Power')) &&\n\t\t\t\tspecies.baseStats.spe >= 60 && species.baseStats.spe <= 108 &&\n\t\t\t\t!counter.get('priority') &&\n\t\t\t\tthis.randomChance(2, 3)\n\t\t\t) ? 'Choice Scarf' : 'Choice Band';\n\t\t}\n\t\tif (counter.get('Special') >= 4 || (counter.get('Special') >= 3 && moves.has('uturn'))) {\n\t\t\treturn (\n\t\t\t\tspecies.baseStats.spa >= 100 &&\n\t\t\t\tspecies.baseStats.spe >= 60 && species.baseStats.spe <= 108 &&\n\t\t\t\t!moves.has('uturn') &&\n\t\t\t\t(ability === 'Download' || moves.has('eruption') || moves.has('waterspout') || this.randomChance(2, 3))\n\t\t\t) ? 'Choice Scarf' : 'Choice Specs';\n\t\t}\n\n\t\tif (counter.setupType && moves.has('outrage')) return 'Lum Berry';\n\t\tif (this.dex.getEffectiveness('Ground', species) >= 2 && ability !== 'Levitate') return 'Air Balloon';\n\t\tif (\n\t\t\ttypes.has('Poison') ||\n\t\t\t['bodyslam', 'dragontail', 'protect', 'scald', 'sleeptalk', 'substitute'].some(m => moves.has(m))\n\t\t) {\n\t\t\treturn 'Leftovers';\n\t\t}\n\t\tif (species.name === 'Palkia' && (moves.has('dracometeor') || moves.has('spacialrend')) && moves.has('hydropump')) {\n\t\t\treturn 'Lustrous Orb';\n\t\t}\n\t\tif (counter.damagingMoves.size >= 4 && ability !== 'Sturdy') {\n\t\t\treturn moves.has('uturn') ? 'Expert Belt' : 'Life Orb';\n\t\t}\n\t\tif (\n\t\t\tisLead &&\n\t\t\tcounter.get('hazards') &&\n\t\t\t!counter.get('recovery') &&\n\t\t\tability !== 'Regenerator' &&\n\t\t\tspecies.baseStats.hp + species.baseStats.def + species.baseStats.spd <= 275\n\t\t) {\n\t\t\treturn ability === 'Sturdy' ? 'Custap Berry' : 'Focus Sash';\n\t\t}\n\t\tif (moves.has('voltswitch') && species.baseStats.spe <= 90) {\n\t\t\treturn 'Leftovers';\n\t\t}\n\t\tif (\n\t\t\tcounter.damagingMoves.size >= 3 &&\n\t\t\tspecies.baseStats.spe >= 40 &&\n\t\t\tspecies.baseStats.hp + species.baseStats.def + species.baseStats.spd <= 275 &&\n\t\t\tability !== 'Sturdy' &&\n\t\t\t!moves.has('rapidspin') && !moves.has('uturn')\n\t\t) {\n\t\t\treturn 'Life Orb';\n\t\t}\n\t}\n\n\trandomSet(\n\t\tspecies: string | Species,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails = {},\n\t\tisLead = false\n\t): RandomTeamsTypes.RandomSet {\n\t\tspecies = this.dex.species.get(species);\n\t\tlet forme = species.name;\n\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\tforme = species.battleOnly;\n\t\t}\n\t\tif (species.cosmeticFormes) {\n\t\t\tforme = this.sample([species.name].concat(species.cosmeticFormes));\n\t\t}\n\n\t\tconst movePool = (species.randomBattleMoves || Object.keys(this.dex.species.getLearnset(species.id)!)).slice();\n\t\tconst rejectedPool = [];\n\t\tconst moves = new Set<string>();\n\t\tlet ability = '';\n\n\t\tconst evs = {hp: 85, atk: 85, def: 85, spa: 85, spd: 85, spe: 85};\n\t\tconst ivs: SparseStatsTable = {hp: 31, atk: 31, def: 31, spa: 31, spd: 31, spe: 31};\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\tlet availableHP = 0;\n\t\tfor (const setMoveid of movePool) {\n\t\t\tif (setMoveid.startsWith('hiddenpower')) availableHP++;\n\t\t}\n\n\t\tlet counter: MoveCounter;\n\t\t// We use a special variable to track Hidden Power\n\t\t// so that we can check for all Hidden Powers at once\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\twhile (moves.size < this.maxMoveCount && movePool.length) {\n\t\t\t\tconst moveid = this.sampleNoReplace(movePool);\n\t\t\t\tif (moveid.startsWith('hiddenpower')) {\n\t\t\t\t\tavailableHP--;\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\twhile (moves.size < this.maxMoveCount && rejectedPool.length) {\n\t\t\t\tconst moveid = this.sampleNoReplace(rejectedPool);\n\t\t\t\tif (moveid.startsWith('hiddenpower')) {\n\t\t\t\t\tif (hasHiddenPower) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\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\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\n\t\t\t\tlet {cull, isSetup} = this.shouldCullMove(\n\t\t\t\t\tmove, types, moves, abilities, counter, movePool,\n\t\t\t\t\tteamDetails, species, isLead\n\t\t\t\t);\n\n\t\t\t\t// This move doesn't satisfy our setup requirements:\n\t\t\t\tif (\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]) + (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\t\t\t\tif (\n\t\t\t\t\t!isSetup &&\n\t\t\t\t\tcounter.setupType &&\n\t\t\t\t\tcounter.setupType !== 'Mixed' &&\n\t\t\t\t\tmove.category !== counter.setupType &&\n\t\t\t\t\tcounter.get(counter.setupType) < 2 &&\n\t\t\t\t\t!moves.has('batonpass') &&\n\t\t\t\t\t(move.category !== 'Status' || !move.flags.heal) &&\n\t\t\t\t\tmoveid !== 'sleeptalk' && (\n\t\t\t\t\t\tmove.category !== 'Status' || (\n\t\t\t\t\t\t\tcounter.get(counter.setupType) + counter.get('Status') > 3 &&\n\t\t\t\t\t\t\tcounter.get('physicalsetup') + counter.get('specialsetup') < 2\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\t// Mono-attacking with setup and RestTalk is allowed\n\t\t\t\t\t// Reject Status moves only if there is nothing else to reject\n\t\t\t\t\tcull = true;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\tcounter.setupType === 'Special' &&\n\t\t\t\t\tmoveid === 'hiddenpower' &&\n\t\t\t\t\tspecies.types.length > 1 &&\n\t\t\t\t\tcounter.get('Special') <= 2 &&\n\t\t\t\t\t!types.has(move.type) &&\n\t\t\t\t\t!counter.get('Physical') &&\n\t\t\t\t\tcounter.get('specialpool')\n\t\t\t\t) {\n\t\t\t\t\t// Hidden Power isn't good enough\n\t\t\t\t\tcull = true;\n\t\t\t\t}\n\n\t\t\t\tconst runEnforcementChecker = (checkerName: string) => {\n\t\t\t\t\tif (!this.moveEnforcementCheckers[checkerName]) return false;\n\t\t\t\t\treturn this.moveEnforcementCheckers[checkerName](\n\t\t\t\t\t\tmovePool, moves, abilities, types, counter, species as Species, teamDetails\n\t\t\t\t\t);\n\t\t\t\t};\n\t\t\t\t// Pokemon should have moves that benefit their Type/Ability/Weather, as well as moves required by its forme\n\t\t\t\tif (\n\t\t\t\t\t!cull &&\n\t\t\t\t\t!['judgment', 'quiverdance', 'sleeptalk'].includes(moveid) &&\n\t\t\t\t\t!isSetup && !move.weather && !move.damage && (move.category !== 'Status' || !move.flags.heal) && (\n\t\t\t\t\t\tmove.category === 'Status' ||\n\t\t\t\t\t\t!types.has(move.type) ||\n\t\t\t\t\t\tmove.basePower && move.basePower < 40 && !move.multihit\n\t\t\t\t\t) && (counter.get('physicalsetup') + counter.get('specialsetup') < 2 && (\n\t\t\t\t\t\t!counter.setupType ||\n\t\t\t\t\t\tcounter.setupType === 'Mixed' ||\n\t\t\t\t\t\t(move.category !== counter.setupType && move.category !== 'Status') ||\n\t\t\t\t\t\tcounter.get(counter.setupType) + counter.get('Status') > 3\n\t\t\t\t\t))\n\t\t\t\t) {\n\t\t\t\t\tif (\n\t\t\t\t\t\t(\n\t\t\t\t\t\t\t!counter.get('stab') &&\n\t\t\t\t\t\t\t!counter.get('damage') && (\n\t\t\t\t\t\t\t\tspecies.types.length > 1 ||\n\t\t\t\t\t\t\t\t(species.types[0] !== 'Normal' && species.types[0] !== 'Psychic') ||\n\t\t\t\t\t\t\t\t!moves.has('icebeam') ||\n\t\t\t\t\t\t\t\tspecies.baseStats.spa >= species.baseStats.spd\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t) || (\n\t\t\t\t\t\t\t!counter.get('recovery') &&\n\t\t\t\t\t\t\t!counter.setupType &&\n\t\t\t\t\t\t\t!moves.has('healingwish') &&\n\t\t\t\t\t\t\t(counter.get('Status') > 1 || (species.nfe && !!counter.get('Status'))) &&\n\t\t\t\t\t\t\t(movePool.includes('recover') || movePool.includes('roost') || movePool.includes('softboiled'))\n\t\t\t\t\t\t) || (\n\t\t\t\t\t\t\tmovePool.includes('darkvoid') ||\n\t\t\t\t\t\t\tmovePool.includes('quiverdance') ||\n\t\t\t\t\t\t\t(species.requiredMove && movePool.includes(toID(species.requiredMove)))\n\t\t\t\t\t\t) || (\n\t\t\t\t\t\t\tisLead && runEnforcementChecker('lead')\n\t\t\t\t\t\t)\n\t\t\t\t\t) {\n\t\t\t\t\t\tcull = true;\n\t\t\t\t\t} else {\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\tfor (const abil of abilities) {\n\t\t\t\t\t\t\tif (runEnforcementChecker(abil)) {\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 (moveid === '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\tconst isHP = moveid.startsWith('hiddenpower');\n\t\t\t\tif (\n\t\t\t\t\tcull &&\n\t\t\t\t\t(movePool.length - availableHP || availableHP && (isHP || !hasHiddenPower))\n\t\t\t\t) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tmove.category !== 'Status' && !move.damage && !move.flags.charge &&\n\t\t\t\t\t\t(!isHP || !availableHP)\n\t\t\t\t\t) rejectedPool.push(moveid);\n\t\t\t\t\tmoves.delete(moveid);\n\t\t\t\t\tif (isHP) hasHiddenPower = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (cull && rejectedPool.length) {\n\t\t\t\t\tmoves.delete(moveid);\n\t\t\t\t\tif (moveid.startsWith('hiddenpower')) hasHiddenPower = false;\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\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\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) {\n\t\t\t// Sort abilities by rating with an element of randomness\n\t\t\tif (abilityData[2] && abilityData[1].rating <= abilityData[2].rating && this.randomChance(1, 2)) {\n\t\t\t\t[abilityData[1], abilityData[2]] = [abilityData[2], abilityData[1]];\n\t\t\t}\n\t\t\tif (abilityData[0].rating <= abilityData[1].rating) {\n\t\t\t\tif (this.randomChance(1, 2)) [abilityData[0], abilityData[1]] = [abilityData[1], abilityData[0]];\n\t\t\t} else if (abilityData[0].rating - 0.6 <= abilityData[1].rating) {\n\t\t\t\tif (this.randomChance(2, 3)) [abilityData[0], abilityData[1]] = [abilityData[1], abilityData[0]];\n\t\t\t}\n\n\t\t\t// Start with the first abiility and work our way through, culling as we go\n\t\t\tability = abilityData[0].name;\n\n\n\t\t\twhile (this.shouldCullAbility(ability, types, moves, abilities, counter, movePool, teamDetails, species)) {\n\t\t\t\tif (ability === abilityData[0].name && abilityData[1].rating >= 1) {\n\t\t\t\t\tability = abilityData[1].name;\n\t\t\t\t} else if (ability === abilityData[1].name && abilityData[2] && abilityData[2].rating >= 1) {\n\t\t\t\t\tability = abilityData[2].name;\n\t\t\t\t} else {\n\t\t\t\t\tability = abilityData[0].name;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (abilities.has('Guts') && moves.has('facade') && (ability !== 'Quick Feet' || !counter.setupType)) {\n\t\t\t\tability = 'Guts';\n\t\t\t} else if (abilities.has('Prankster') && counter.get('Status') > 1) {\n\t\t\t\tability = 'Prankster';\n\t\t\t} else if (abilities.has('Quick Feet') && moves.has('facade')) {\n\t\t\t\tability = 'Quick Feet';\n\t\t\t} else if (abilities.has('Swift Swim') && moves.has('raindance')) {\n\t\t\t\tability = 'Swift Swim';\n\t\t\t}\n\t\t} else {\n\t\t\tability = abilityData[0].name;\n\t\t}\n\n\t\tlet item = this.getHighPriorityItem(ability, types, moves, counter, teamDetails, species, isLead);\n\t\tif (item === undefined) {\n\t\t\titem = this.getLowPriorityItem(ability, types, moves, abilities, counter, teamDetails, species, isLead);\n\t\t}\n\t\tif (item === undefined) item = 'Leftovers';\n\t\tif (item === 'Leftovers' && types.has('Poison')) {\n\t\t\titem = 'Black Sludge';\n\t\t}\n\n\t\tconst levelScale: {[tier: string]: number} = {\n\t\t\tUber: 76,\n\t\t\tOU: 80,\n\t\t\t'(OU)': 82,\n\t\t\tUUBL: 82,\n\t\t\tUU: 82,\n\t\t\tRUBL: 84,\n\t\t\tRU: 84,\n\t\t\tNUBL: 86,\n\t\t\tNU: 86,\n\t\t\t'(NU)': 88,\n\t\t\tPUBL: 88,\n\t\t\tPU: 88,\n\t\t\t'(PU)': 90,\n\t\t};\n\t\tconst customScale: {[forme: string]: number} = {\n\t\t\tDelibird: 100, 'Farfetch\\u2019d': 100, Luvdisc: 100, Unown: 100,\n\t\t};\n\t\tconst level = this.adjustLevel || customScale[species.name] || levelScale[species.tier] || (species.nfe ? 90 : 80);\n\n\t\t// Prepare optimal HP\n\t\tconst srWeakness = this.dex.getEffectiveness('Rock', species);\n\t\twhile (evs.hp > 1) {\n\t\t\tconst hp = Math.floor(\n\t\t\t\tMath.floor(\n\t\t\t\t\t2 * species.baseStats.hp + (ivs.hp || 31) + Math.floor(evs.hp / 4) + 100\n\t\t\t\t) * level / 100 + 10\n\t\t\t);\n\t\t\tif (moves.has('bellydrum') && item === 'Sitrus Berry') {\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 {\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\t// Minimize confusion damage\n\t\tif (!counter.get('Physical') && !moves.has('transform')) {\n\t\t\tevs.atk = 0;\n\t\t\tivs.atk = hasHiddenPower ? (ivs.atk || 31) - 28 : 0;\n\t\t}\n\n\t\tif (['gyroball', 'metalburst', 'trickroom'].some(m => moves.has(m))) {\n\t\t\tevs.spe = 0;\n\t\t\tivs.spe = hasHiddenPower ? (ivs.spe || 31) - 28 : 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\tmoves: Array.from(moves),\n\t\t\tability,\n\t\t\tevs,\n\t\t\tivs,\n\t\t\titem,\n\t\t\tlevel,\n\t\t};\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 typePool = this.dex.types.names();\n\t\tconst type = this.forceMonotype || this.sample(typePool);\n\n\t\tconst baseFormes: {[k: string]: number} = {};\n\t\tconst tierCount: {[k: string]: number} = {};\n\t\tconst typeCount: {[k: string]: number} = {};\n\t\tconst typeComboCount: {[k: string]: number} = {};\n\t\tconst teamDetails: RandomTeamsTypes.TeamDetails = {};\n\n\t\tconst pokemonPool = this.getPokemonPool(type, pokemon, isMonotype);\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 || !species.randomBattleMoves) 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// Adjust rate for species with multiple sets\n\t\t\tswitch (species.baseSpecies) {\n\t\t\tcase 'Arceus':\n\t\t\t\tif (this.randomChance(16, 17) && !isMonotype) continue;\n\t\t\t\tbreak;\n\t\t\tcase 'Rotom':\n\t\t\t\tif (this.gen < 5 && this.randomChance(5, 6) && !isMonotype) continue;\n\t\t\t\tbreak;\n\t\t\tcase 'Basculin': case 'Castform': case 'Cherrim': case 'Meloetta':\n\t\t\t\tif (this.randomChance(1, 2)) continue;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Illusion shouldn't be in the last slot\n\t\t\tif (species.name === 'Zoroark' && pokemon.length > 4) continue;\n\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\tconst tier = species.tier;\n\n\t\t\t// Limit two Pokemon per tier\n\t\t\tif (this.gen === 5 && !isMonotype && !this.forceMonotype && tierCount[tier] >= 2 * limitFactor) continue;\n\n\t\t\tconst set = this.randomSet(species, teamDetails, pokemon.length === 0);\n\n\t\t\tconst types = species.types;\n\n\t\t\tif (!isMonotype && !this.forceMonotype) {\n\t\t\t\t// Limit two of any type\n\t\t\t\tlet skip = false;\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\t\t\t}\n\n\t\t\t// Limit one of any type combination, two in Monotype\n\t\t\tlet typeCombo = types.slice().sort().join();\n\t\t\tif (set.ability === 'Drought' || set.ability === 'Drizzle' || set.ability === 'Sand Stream') {\n\t\t\t\t// Drought, Drizzle and Sand Stream don't count towards the type combo limit\n\t\t\t\ttypeCombo = set.ability;\n\t\t\t\tif (typeCombo in typeComboCount) continue;\n\t\t\t} else if (!this.forceMonotype) {\n\t\t\t\tif (typeComboCount[typeCombo] >= (isMonotype ? 2 : 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\n\t\t\tif (pokemon.length === this.maxTeamSize) {\n\t\t\t\t// Set Zoroark's level to be the same as the last Pokemon\n\t\t\t\tconst illusion = teamDetails.illusion;\n\t\t\t\tif (illusion) pokemon[illusion - 1].level = pokemon[this.maxTeamSize - 1].level;\n\t\t\t\tbreak;\n\t\t\t}\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 tier counter\n\t\t\tif (tierCount[tier]) {\n\t\t\t\ttierCount[tier]++;\n\t\t\t} else {\n\t\t\t\ttierCount[tier] = 1;\n\t\t\t}\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// Team details\n\t\t\tif (set.ability === 'Snow Warning' || set.moves.includes('hail')) teamDetails.hail = 1;\n\t\t\tif (set.ability === 'Drizzle' || set.moves.includes('raindance')) teamDetails.rain = 1;\n\t\t\tif (set.ability === 'Sand Stream') teamDetails.sand = 1;\n\t\t\tif (set.moves.includes('stealthrock')) teamDetails.stealthRock = 1;\n\t\t\tif (set.moves.includes('toxicspikes')) teamDetails.toxicSpikes = 1;\n\t\t\tif (set.moves.includes('rapidspin')) teamDetails.rapidSpin = 1;\n\n\t\t\t// For setting Zoroark's level\n\t\t\tif (set.ability === 'Illusion') teamDetails.illusion = pokemon.length;\n\t\t}\n\t\tif (pokemon.length < this.maxTeamSize && pokemon.length < 12) {\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\nexport default RandomGen5Teams;\n","import {MoveCounter} from './gen8';\nimport {RandomGen5Teams} from './gen5';\nimport {Utils} from './utils';\nimport {\n\tFormat,\n\tModdedDex,\n\tMove,\n\tPRNG,\n\tPRNGSeed,\n\tRandomTeamsTypes,\n\tSparseStatsTable,\n\tSpecies,\n\tStatID,\n\ttoID,\n} from '@pkmn/sim';\n\n\n// These moves can be used even if we aren't setting up to use them:\nconst SetupException = ['dracometeor', 'overheat'];\n\n// Give recovery moves priority over certain other defensive status moves\nconst recoveryMoves = [\n\t'healorder', 'milkdrink', 'moonlight', 'morningsun', 'painsplit', 'recover', 'rest', 'roost',\n\t'slackoff', 'softboiled', 'synthesis', 'wish',\n];\nconst defensiveStatusMoves = ['aromatherapy', 'haze', 'healbell', 'roar', 'whirlwind', 'willowisp', 'yawn'];\nexport class RandomGen4Teams extends RandomGen5Teams {\n\tconstructor(dex: ModdedDex, format: Format, prng: PRNG | PRNGSeed | null) {\n\t\tsuper(dex, format, prng);\n\t\tthis.moveEnforcementCheckers = {\n\t\t\tBug: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!counter.get('Bug') && (movePool.includes('bugbuzz') || movePool.includes('megahorn'))\n\t\t\t),\n\t\t\tDark: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t(!counter.get('Dark') || (counter.get('Dark') === 1 && moves.has('pursuit'))) &&\n\t\t\t\tmovePool.includes('suckerpunch') &&\n\t\t\t\tcounter.setupType !== 'Special'\n\t\t\t),\n\t\t\tDragon: (movePool, moves, abilities, types, counter) => !counter.get('Dragon'),\n\t\t\tElectric: (movePool, moves, abilities, types, counter) => !counter.get('Electric'),\n\t\t\tFighting: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!counter.get('Fighting') &&\n\t\t\t\t(!!counter.setupType || !counter.get('Status') || movePool.includes('closecombat') || movePool.includes('highjumpkick'))\n\t\t\t),\n\t\t\tFire: (movePool, moves, abilities, types, counter) => !counter.get('Fire'),\n\t\t\tFlying: (movePool, moves, abilities, types, counter) => !counter.get('Flying') && (\n\t\t\t\t(counter.setupType !== 'Special' && movePool.includes('bravebird')) ||\n\t\t\t\t(abilities.has('Serene Grace') && movePool.includes('airslash'))\n\t\t\t),\n\t\t\tGrass: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!counter.get('Grass') &&\n\t\t\t\t['leafblade', 'leafstorm', 'seedflare', 'woodhammer'].some(m => movePool.includes(m))\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\t!counter.get('Ice') && (!types.has('Water') || !counter.get('Water'))\n\t\t\t),\n\t\t\tRock: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!counter.get('Rock') && (movePool.includes('headsmash') || movePool.includes('stoneedge'))\n\t\t\t),\n\t\t\tSteel: (movePool, moves, abilities, types, counter) => !counter.get('Steel') && movePool.includes('meteormash'),\n\t\t\tWater: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!counter.get('Water') && (moves.has('raindance') || !types.has('Ice') || !counter.get('Ice'))\n\t\t\t),\n\t\t\tAdaptability: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\t!counter.setupType &&\n\t\t\t\tspecies.types.length > 1 &&\n\t\t\t\t(!counter.get(species.types[0]) || !counter.get(species.types[1]))\n\t\t\t),\n\t\t\tGuts: (movePool, moves, abilities, types) => types.has('Normal') && movePool.includes('facade'),\n\t\t\t'Slow Start': movePool => movePool.includes('substitute'),\n\t\t};\n\t}\n\tshouldCullMove(\n\t\tmove: Move,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tmovePool: string[],\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tisLead: boolean,\n\t): {cull: boolean, isSetup?: boolean} {\n\t\tconst restTalk = moves.has('rest') && moves.has('sleeptalk');\n\n\t\tswitch (move.id) {\n\t\t// Not very useful without their supporting moves\n\t\tcase 'batonpass':\n\t\t\treturn {cull: !counter.setupType && !counter.get('speedsetup') && !moves.has('substitute')};\n\t\tcase 'eruption': case 'waterspout':\n\t\t\treturn {cull: counter.get('Physical') + counter.get('Special') < 4};\n\t\tcase 'focuspunch':\n\t\t\treturn {cull: !moves.has('substitute') || counter.damagingMoves.size < 2 || moves.has('hammerarm')};\n\t\tcase 'raindance':\n\t\t\treturn {cull: abilities.has('Hydration') ? !moves.has('rest') : counter.get('Physical') + counter.get('Special') < 2};\n\t\tcase 'refresh':\n\t\t\treturn {cull: !(moves.has('calmmind') && (moves.has('recover') || moves.has('roost')))};\n\t\tcase 'rest':\n\t\t\treturn {cull: movePool.includes('sleeptalk') || (abilities.has('Hydration') && !moves.has('raindance'))};\n\t\tcase 'sleeptalk':\n\t\t\tif (movePool.length > 1) {\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\treturn {cull: !moves.has('rest')};\n\t\tcase 'sunnyday':\n\t\t\treturn {cull: !moves.has('solarbeam')};\n\t\tcase 'weatherball':\n\t\t\treturn {cull: !moves.has('raindance') && !moves.has('sunnyday')};\n\n\t\t// Set up once and only if we have the moves for it\n\t\tcase 'bellydrum': case 'bulkup': case 'curse': case 'dragondance': case 'swordsdance':\n\t\t\tconst notEnoughPhysicalMoves = (\n\t\t\t\tcounter.get('Physical') + counter.get('physicalpool') < 2 &&\n\t\t\t\t!moves.has('batonpass') &&\n\t\t\t\t(!moves.has('rest') || !moves.has('sleeptalk'))\n\t\t\t);\n\t\t\tconst badPhysicalMoveset = counter.setupType !== 'Physical' || counter.get('physicalsetup') > 1;\n\t\t\treturn {cull: moves.has('sunnyday') || notEnoughPhysicalMoves || badPhysicalMoveset, isSetup: true};\n\t\tcase 'calmmind': case 'nastyplot': case 'tailglow':\n\t\t\tconst notEnoughSpecialMoves = (\n\t\t\t\tcounter.get('Special') + counter.get('specialpool') < 2 &&\n\t\t\t\t!moves.has('batonpass') &&\n\t\t\t\t(!moves.has('rest') || !moves.has('sleeptalk'))\n\t\t\t);\n\t\t\tconst badSpecialMoveset = counter.setupType !== 'Special' || counter.get('specialsetup') > 1;\n\t\t\treturn {cull: notEnoughSpecialMoves || badSpecialMoveset, isSetup: true};\n\t\tcase 'agility': case 'rockpolish':\n\t\t\treturn {cull: restTalk || (counter.damagingMoves.size < 2 && !moves.has('batonpass')), isSetup: !counter.setupType};\n\n\t\t// Bad after setup\n\t\tcase 'destinybond':\n\t\t\treturn {cull: !!counter.setupType || moves.has('explosion')};\n\t\tcase 'explosion': case 'selfdestruct':\n\t\t\treturn {cull: (\n\t\t\t\tcounter.setupType === 'Special' ||\n\t\t\t\tArray.from(moves).some(id => recoveryMoves.includes(id) || defensiveStatusMoves.includes(id)) ||\n\t\t\t\t['batonpass', 'protect', 'substitute'].some(m => moves.has(m))\n\t\t\t)};\n\t\tcase 'foresight': case 'roar': case 'whirlwind':\n\t\t\treturn {cull: !!counter.setupType && !abilities.has('Speed Boost')};\n\t\tcase 'healingwish': case 'lunardance':\n\t\t\treturn {cull: !!counter.setupType || moves.has('rest') || moves.has('substitute')};\n\t\tcase 'protect':\n\t\t\treturn {cull: (\n\t\t\t\t!['Guts', 'Quick Feet', 'Speed Boost'].some(abil => abilities.has(abil)) ||\n\t\t\t\t['rest', 'softboiled', 'toxic', 'wish'].some(m => moves.has(m))\n\t\t\t)};\n\t\tcase 'wish':\n\t\t\treturn {cull: (\n\t\t\t\t!['batonpass', 'protect', 'uturn'].some(m => moves.has(m)) ||\n\t\t\t\tmoves.has('rest') ||\n\t\t\t\t!!counter.get('speedsetup')\n\t\t\t)};\n\t\tcase 'rapidspin':\n\t\t\treturn {cull: !!teamDetails.rapidSpin || (!!counter.setupType && counter.get('Physical') + counter.get('Special') < 2)};\n\t\tcase 'reflect': case 'lightscreen': case 'fakeout':\n\t\t\treturn {cull: !!counter.setupType || !!counter.get('speedsetup') || moves.has('substitute')};\n\t\tcase 'spikes':\n\t\t\treturn {cull: !!counter.setupType || !!counter.get('speedsetup') || moves.has('substitute')};\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\tmoves.has('rest') || moves.has('substitute') ||\n\t\t\t\t!!teamDetails.stealthRock\n\t\t\t)};\n\t\tcase 'switcheroo': case 'trick':\n\t\t\treturn {cull: (\n\t\t\t\tcounter.get('Physical') + counter.get('Special') < 3 ||\n\t\t\t\t!!counter.setupType ||\n\t\t\t\t['fakeout', 'lightscreen', 'reflect', 'suckerpunch', 'trickroom'].some(m => moves.has(m))\n\t\t\t)};\n\t\tcase 'toxic': case 'toxicspikes':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.setupType || !!counter.get('speedsetup') || !!teamDetails.toxicSpikes || moves.has('willowisp')\n\t\t\t)};\n\t\tcase 'trickroom':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.setupType ||\n\t\t\t\t!!counter.get('speedsetup') ||\n\t\t\t\tcounter.damagingMoves.size < 2 ||\n\t\t\t\tmoves.has('lightscreen') || moves.has('reflect') ||\n\t\t\t\trestTalk\n\t\t\t)};\n\t\tcase 'uturn':\n\t\t\treturn {cull: (\n\t\t\t\t(types.has('Bug') && counter.get('stab') < 2 && counter.damagingMoves.size > 1) ||\n\t\t\t\t(abilities.has('Speed Boost') && moves.has('protect')) ||\n\t\t\t\t!!counter.setupType ||\n\t\t\t\t!!counter.get('speedsetup') ||\n\t\t\t\tmoves.has('batonpass') || moves.has('substitute')\n\t\t\t)};\n\n\t\t// Bit redundant to have both\n\t\t// Attacks:\n\t\tcase 'bodyslam': case 'slash':\n\t\t\treturn {cull: moves.has('facade') || moves.has('return')};\n\t\tcase 'doubleedge':\n\t\t\treturn {cull: ['bodyslam', 'facade', 'return'].some(m => moves.has(m))};\n\t\tcase 'endeavor':\n\t\t\treturn {cull: !isLead};\n\t\tcase 'headbutt':\n\t\t\treturn {cull: !moves.has('bodyslam') && !moves.has('thunderwave')};\n\t\tcase 'judgment': case 'swift':\n\t\t\treturn {cull: counter.setupType !== 'Special' && counter.get('stab') > 1};\n\t\tcase 'quickattack':\n\t\t\treturn {cull: moves.has('thunderwave')};\n\t\tcase 'firepunch': case 'flamethrower':\n\t\t\treturn {cull: moves.has('fireblast') || moves.has('overheat') && !counter.setupType};\n\t\tcase 'lavaplume': case 'fireblast':\n\t\t\tif (move.id === 'fireblast' && moves.has('lavaplume') && !counter.get('speedsetup')) return {cull: true};\n\t\t\tif (move.id === 'lavaplume' && moves.has('fireblast') && counter.get('speedsetup')) return {cull: true};\n\t\t\tif (moves.has('flareblitz') && counter.setupType !== 'Special') return {cull: true};\n\t\t\tbreak;\n\t\tcase 'overheat':\n\t\t\treturn {cull: counter.setupType === 'Special' || ['batonpass', 'fireblast', 'flareblitz'].some(m => moves.has(m))};\n\t\tcase 'aquajet':\n\t\t\treturn {cull: moves.has('dragondance') || (moves.has('waterfall') && counter.get('Physical') < 3)};\n\t\tcase 'hydropump':\n\t\t\treturn {cull: moves.has('surf')};\n\t\tcase 'waterfall':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('aquatail') ||\n\t\t\t\t(counter.setupType !== 'Physical' && (moves.has('hydropump') || moves.has('surf')))\n\t\t\t)};\n\t\tcase 'chargebeam':\n\t\t\treturn {cull: moves.has('thunderbolt') && counter.get('Special') < 3};\n\t\tcase 'discharge':\n\t\t\treturn {cull: moves.has('thunderbolt')};\n\t\tcase 'energyball':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('leafblade') ||\n\t\t\t\tmoves.has('woodhammer') ||\n\t\t\t\t(moves.has('sunnyday') && moves.has('solarbeam')) ||\n\t\t\t\t(moves.has('leafstorm') && counter.get('Physical') + counter.get('Special') < 4)\n\t\t\t)};\n\t\tcase 'grassknot': case 'leafblade': case 'seedbomb':\n\t\t\treturn {cull: moves.has('woodhammer') || (moves.has('sunnyday') && moves.has('solarbeam'))};\n\t\tcase 'leafstorm':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.setupType ||\n\t\t\t\tmoves.has('batonpass') ||\n\t\t\t\tmoves.has('powerwhip') ||\n\t\t\t\t(moves.has('sunnyday') && moves.has('solarbeam'))\n\t\t\t)};\n\t\tcase 'solarbeam':\n\t\t\treturn {cull: counter.setupType === 'Physical' || !moves.has('sunnyday')};\n\t\tcase 'icepunch':\n\t\t\treturn {cull: !counter.setupType && moves.has('icebeam')};\n\t\tcase 'aurasphere': case 'drainpunch': case 'focusblast':\n\t\t\treturn {cull: moves.has('closecombat') && counter.setupType !== 'Special'};\n\t\tcase 'brickbreak': case 'closecombat': case 'crosschop': case 'lowkick':\n\t\t\treturn {cull: moves.has('substitute') && moves.has('focuspunch')};\n\t\tcase 'machpunch':\n\t\t\treturn {cull: (\n\t\t\t\tcounter.damagingMoves.size <= counter.get('Fighting') ||\n\t\t\t\t(types.has('Fighting') && counter.get('stab') < 2 && !abilities.has('Technician'))\n\t\t\t)};\n\t\tcase 'seismictoss':\n\t\t\treturn {cull: moves.has('nightshade') || counter.get('Physical') + counter.get('Special') >= 1};\n\t\tcase 'superpower':\n\t\t\treturn {cull: moves.has('dragondance') || !!counter.get('speedsetup')};\n\t\tcase 'gunkshot':\n\t\t\treturn {cull: moves.has('poisonjab')};\n\t\tcase 'earthpower':\n\t\t\treturn {cull: moves.has('earthquake')};\n\t\tcase 'airslash':\n\t\t\treturn {cull: !counter.setupType && moves.has('bravebird')};\n\t\tcase 'zenheadbutt':\n\t\t\treturn {cull: moves.has('psychocut')};\n\t\tcase 'rockblast': case 'rockslide':\n\t\t\treturn {cull: moves.has('stoneedge')};\n\t\tcase 'shadowclaw':\n\t\t\treturn {cull: moves.has('shadowforce') || moves.has('suckerpunch') && !types.has('Ghost')};\n\t\tcase 'dracometeor':\n\t\t\treturn {cull: moves.has('calmmind') || restTalk || (!!counter.setupType && counter.get('stab') < 2)};\n\t\tcase 'dragonclaw':\n\t\t\treturn {cull: moves.has('outrage')};\n\t\tcase 'dragonpulse':\n\t\t\treturn {cull: moves.has('dracometeor') && moves.has('outrage')};\n\t\tcase 'crunch': case 'nightslash':\n\t\t\treturn {cull: moves.has('suckerpunch')};\n\t\tcase 'pursuit':\n\t\t\treturn {cull: !!counter.setupType || moves.has('payback')};\n\t\tcase 'flashcannon':\n\t\t\treturn {cull: (moves.has('ironhead') || movePool.includes('ironhead')) && counter.setupType !== 'Special'};\n\n\t\t// Status:\n\t\tcase 'encore':\n\t\t\treturn {cull: ['roar', 'taunt', 'whirlwind'].some(m => moves.has(m)) || restTalk};\n\t\tcase 'haze': case 'taunt':\n\t\t\treturn {cull: restTalk};\n\t\tcase 'leechseed': case 'painsplit':\n\t\t\treturn {cull: !!counter.setupType || !!counter.get('speedsetup') || moves.has('rest')};\n\t\tcase 'recover': case 'slackoff':\n\t\t\treturn {cull: restTalk};\n\t\tcase 'stunspore':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.setupType ||\n\t\t\t\tmoves.has('toxic') ||\n\t\t\t\tmovePool.includes('sleeppowder') ||\n\t\t\t\tmovePool.includes('spore')\n\t\t\t)};\n\t\tcase 'substitute':\n\t\t\treturn {cull: ['pursuit', 'rapidspin', 'rest', 'taunt'].some(m => moves.has(m))};\n\t\tcase 'thunderwave':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.setupType ||\n\t\t\t\tmoves.has('toxic') ||\n\t\t\t\tmoves.has('trickroom') ||\n\t\t\t\t(moves.has('bodyslam') && abilities.has('Serene Grace'))\n\t\t\t)};\n\t\tcase 'yawn':\n\t\t\treturn {cull: moves.has('thunderwave') || moves.has('toxic')};\n\t\t}\n\t\treturn {cull: false};\n\t}\n\n\tshouldCullAbility(\n\t\tability: string,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tmovePool: string[],\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t) {\n\t\tswitch (ability) {\n\t\tcase 'Anger Point': case 'Ice Body': case 'Steadfast':\n\t\t\treturn true;\n\t\tcase 'Blaze':\n\t\t\treturn !counter.get('Fire');\n\t\tcase 'Chlorophyll':\n\t\t\treturn !moves.has('sunnyday') && !teamDetails.sun;\n\t\tcase 'Compound Eyes': case 'No Guard':\n\t\t\treturn !counter.get('inaccurate');\n\t\tcase 'Early Bird':\n\t\t\treturn !moves.has('rest');\n\t\tcase 'Gluttony':\n\t\t\treturn !moves.has('bellydrum');\n\t\tcase 'Hustle':\n\t\t\treturn counter.get('Physical') < 2;\n\t\tcase 'Mold Breaker':\n\t\t\treturn !moves.has('earthquake');\n\t\tcase 'Overgrow':\n\t\t\treturn !counter.get('Grass');\n\t\tcase 'Reckless': case 'Rock Head':\n\t\t\treturn !counter.get('recoil');\n\t\tcase 'Sand Veil':\n\t\t\treturn !teamDetails.sand;\n\t\tcase 'Serene Grace':\n\t\t\treturn !counter.get('serenegrace') || species.id === 'blissey';\n\t\tcase 'Simple':\n\t\t\treturn !counter.setupType && !moves.has('cosmicpower');\n\t\tcase 'Skill Link':\n\t\t\treturn !counter.get('skilllink');\n\t\tcase 'Snow Cloak':\n\t\t\treturn !teamDetails.hail;\n\t\tcase 'Solar Power':\n\t\t\treturn !counter.get('Special') || !moves.has('sunnyday') && !teamDetails.sun;\n\t\tcase 'Speed Boost':\n\t\t\treturn moves.has('uturn');\n\t\tcase 'Swift Swim':\n\t\t\treturn !moves.has('raindance') && !teamDetails.rain;\n\t\tcase 'Swarm':\n\t\t\treturn !counter.get('Bug');\n\t\tcase 'Synchronize':\n\t\t\treturn counter.get('Status') < 2;\n\t\tcase 'Technician':\n\t\t\treturn !counter.get('technician') || moves.has('toxic');\n\t\tcase 'Tinted Lens':\n\t\t\treturn counter.get('damage') >= counter.damagingMoves.size;\n\t\tcase 'Torrent':\n\t\t\treturn !counter.get('Water');\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tgetHighPriorityItem(\n\t\tability: string,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tisLead: boolean,\n\t): string | undefined {\n\t\tif (species.requiredItem) return species.requiredItem;\n\t\tif (species.requiredItems) return this.sample(species.requiredItems);\n\t\tif (species.name === 'Farfetch\\u2019d') return 'Stick';\n\t\tif (species.name === 'Marowak') return 'Thick Club';\n\t\tif (species.name === 'Shedinja' || species.name === 'Smeargle') return 'Focus Sash';\n\t\tif (species.name === 'Unown') return 'Choice Specs';\n\t\tif (species.name === 'Wobbuffet') {\n\t\t\treturn moves.has('destinybond') ? 'Custap Berry' : this.sample(['Leftovers', 'Sitrus Berry']);\n\t\t}\n\n\t\tif (moves.has('switcheroo') || moves.has('trick')) {\n\t\t\tif (\n\t\t\t\tspecies.baseStats.spe >= 60 && species.baseStats.spe <= 108 &&\n\t\t\t\t!counter.get('priority') &&\n\t\t\t\tthis.randomChance(2, 3)\n\t\t\t) {\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('bellydrum')) return 'Sitrus Berry';\n\t\tif (ability === 'Magic Guard' || ability === 'Speed Boost' && counter.get('Status') < 2) return 'Life Orb';\n\t\tif (ability === 'Poison Heal' || ability === 'Toxic Boost') return 'Toxic Orb';\n\n\t\tif (moves.has('rest') && !moves.has('sleeptalk') && ability !== 'Natural Cure' && ability !== 'Shed Skin') {\n\t\t\treturn (moves.has('raindance') && ability === 'Hydration') ? 'Damp Rock' : 'Chesto Berry';\n\t\t}\n\t\tif (moves.has('raindance') && ability === 'Swift Swim' && counter.get('Status') < 2) return 'Life Orb';\n\t\tif (moves.has('sunnyday')) return (ability === 'Chlorophyll' && counter.get('Status') < 2) ? 'Life Orb' : 'Heat Rock';\n\t\tif (moves.has('lightscreen') && moves.has('reflect')) return 'Light Clay';\n\t\tif ((ability === 'Guts' || ability === 'Quick Feet') && moves.has('facade')) return 'Toxic Orb';\n\t\tif (ability === 'Unburden') return 'Sitrus Berry';\n\t\tif (species.baseStats.hp + species.baseStats.def + species.baseStats.spd <= 150) {\n\t\t\treturn isLead ? 'Focus Sash' : 'Life Orb';\n\t\t}\n\t\tif (moves.has('endeavor')) return 'Focus Sash';\n\t}\n\n\tgetMediumPriorityItem(\n\t\tability: string,\n\t\tmoves: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tspecies: Species,\n\t\tisDoubles: boolean,\n\t\tisLead: boolean\n\t): string | undefined {\n\t\tif (\n\t\t\tability === 'Slow Start' ||\n\t\t\t['curse', 'leechseed', 'protect', 'roar', 'sleeptalk', 'whirlwind'].some(m => moves.has(m)) ||\n\t\t\t(ability === 'Serene Grace' && ['bodyslam', 'headbutt', 'ironhead'].some(m => moves.has(m)))\n\t\t) {\n\t\t\treturn 'Leftovers';\n\t\t}\n\n\t\tif (counter.get('Physical') >= 4 && !moves.has('fakeout') && !moves.has('rapidspin') && !moves.has('suckerpunch')) {\n\t\t\treturn (\n\t\t\t\tspecies.baseStats.spe >= 60 && species.baseStats.spe <= 108 &&\n\t\t\t\t!counter.get('priority') && !moves.has('bodyslam') && this.randomChance(2, 3)\n\t\t\t) ? 'Choice Scarf' : 'Choice Band';\n\t\t}\n\n\t\tif (\n\t\t\t(counter.get('Special') >= 4 || (\n\t\t\t\tcounter.get('Special') >= 3 &&\n\t\t\t\t['batonpass', 'uturn', 'waterspout', 'selfdestruct'].some(m => moves.has(m))\n\t\t\t)) &&\n\t\t\t!moves.has('chargebeam')\n\t\t) {\n\t\t\treturn (\n\t\t\t\tspecies.baseStats.spe >= 60 && species.baseStats.spe <= 108 &&\n\t\t\t\tability !== 'Speed Boost' && !counter.get('priority') && this.randomChance(2, 3)\n\t\t\t) ? 'Choice Scarf' : 'Choice Specs';\n\t\t}\n\n\t\tif (moves.has('outrage') && counter.setupType) return 'Lum Berry';\n\t\tif (moves.has('substitute')) {\n\t\t\treturn (counter.damagingMoves.size < 2 ||\n\t\t\t\t!counter.get('drain') &&\n\t\t\t\t(counter.damagingMoves.size < 3 || species.baseStats.hp >= 60 || species.baseStats.def + species.baseStats.spd >= 180)\n\t\t\t) ? 'Leftovers' : 'Life Orb';\n\t\t}\n\t\tif (ability === 'Guts') return 'Toxic Orb';\n\t\tif (\n\t\t\tisLead &&\n\t\t\t!counter.get('recoil') &&\n\t\t\t!Array.from(moves).some(id => !!recoveryMoves.includes(id)) &&\n\t\t\tspecies.baseStats.hp + species.baseStats.def + species.baseStats.spd < 225\n\t\t) {\n\t\t\treturn 'Focus Sash';\n\t\t}\n\t\tif (counter.damagingMoves.size >= 4) {\n\t\t\treturn (\n\t\t\t\tcounter.get('Normal') || counter.get('Dragon') > 1 || moves.has('chargebeam') || moves.has('suckerpunch')\n\t\t\t) ? 'Life Orb' : 'Expert Belt';\n\t\t}\n\t\tif (counter.damagingMoves.size >= 3 && !moves.has('superfang') && !moves.has('metalburst')) {\n\t\t\tconst totalBulk = species.baseStats.hp + species.baseStats.def + species.baseStats.spd;\n\t\t\treturn (\n\t\t\t\tcounter.get('speedsetup') || counter.get('priority') ||\n\t\t\t\tmoves.has('dragondance') || moves.has('trickroom') ||\n\t\t\t\ttotalBulk < 235 ||\n\t\t\t\t(species.baseStats.spe >= 70 && (totalBulk < 260 || (!!counter.get('recovery') && totalBulk < 285)))\n\t\t\t) ? 'Life Orb' : 'Leftovers';\n\t\t}\n\t}\n\n\tgetLowPriorityItem(\n\t\tability: string,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t) {\n\t\tif (types.has('Poison')) return 'Black Sludge';\n\t\tif (this.dex.getEffectiveness('Rock', species) >= 1 || moves.has('roar')) return 'Leftovers';\n\t\tif (counter.get('Status') <= 1 && ['metalburst', 'rapidspin', 'superfang'].every(m => !moves.has(m))) return 'Life Orb';\n\t\treturn 'Leftovers';\n\t}\n\n\trandomSet(\n\t\tspecies: string | Species,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails = {},\n\t\tisLead = false\n\t): RandomTeamsTypes.RandomSet {\n\t\tspecies = this.dex.species.get(species);\n\t\tlet forme = species.name;\n\n\t\tif (typeof species.battleOnly === 'string') forme = species.battleOnly;\n\n\t\tif (species.cosmeticFormes) {\n\t\t\tforme = this.sample([species.name].concat(species.cosmeticFormes));\n\t\t}\n\n\t\tconst movePool = (species.randomBattleMoves || Object.keys(this.dex.species.getLearnset(species.id)!)).slice();\n\t\tconst rejectedPool: string[] = [];\n\t\tconst moves = new Set<string>();\n\t\tlet ability = '';\n\t\tlet item: string | undefined;\n\t\tconst evs = {hp: 85, atk: 85, def: 85, spa: 85, spd: 85, spe: 85};\n\t\tconst ivs: SparseStatsTable = {hp: 31, atk: 31, def: 31, spa: 31, spd: 31, spe: 31};\n\n\t\tconst types = new Set(species.types);\n\n\t\tconst abilities = new Set(Object.values(species.abilities));\n\n\t\tlet availableHP = 0;\n\t\tfor (const setMoveid of movePool) {\n\t\t\tif (setMoveid.startsWith('hiddenpower')) availableHP++;\n\t\t}\n\n\t\tlet counter: MoveCounter;\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\twhile (moves.size < this.maxMoveCount && movePool.length) {\n\t\t\t\tconst moveid = this.sampleNoReplace(movePool);\n\t\t\t\tif (moveid.startsWith('hiddenpower')) {\n\t\t\t\t\tavailableHP--;\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\twhile (moves.size < this.maxMoveCount && rejectedPool.length) {\n\t\t\t\tconst moveid = this.sampleNoReplace(rejectedPool);\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\tif (types.has('Dark') && moves.has('suckerpunch') && species.types.length === 1) {\n\t\t\t\tcounter.add('stab');\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\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\n\t\t\t\t);\n\n\t\t\t\t// Increased/decreased priority moves are unneeded with moves that boost only speed\n\t\t\t\tif (move.priority !== 0 && !!counter.get('speedsetup')) cull = true;\n\n\t\t\t\t// This move doesn't satisfy our setup requirements:\n\t\t\t\tif (\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\tif (\n\t\t\t\t\t\t!SetupException.includes(moveid) &&\n\t\t\t\t\t\t(!types.has(move.type) || counter.get('stab') > 1 || counter.get(move.category) < 2)\n\t\t\t\t\t) {\n\t\t\t\t\t\tcull = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tcounter.setupType && !isSetup && move.category !== counter.setupType &&\n\t\t\t\t\tcounter.get(counter.setupType) < 2 && !moves.has('batonpass')\n\t\t\t\t) {\n\t\t\t\t\t// Mono-attacking with setup and RestTalk or recovery + status healing is allowed\n\t\t\t\t\tif (\n\t\t\t\t\t\tmoveid !== 'rest' && moveid !== 'sleeptalk' &&\n\t\t\t\t\t\t!(recoveryMoves.includes(moveid) && (moves.has('healbell') || moves.has('refresh'))) &&\n\t\t\t\t\t\t!((moveid === 'healbell' || moveid === 'refresh') && Array.from(moves).some(id => recoveryMoves.includes(id))) && (\n\t\t\t\t\t\t\t// Reject Status moves only if there is nothing else to reject\n\t\t\t\t\t\t\tmove.category !== 'Status' || (\n\t\t\t\t\t\t\t\tcounter.get(counter.setupType) + counter.get('Status') > 3 &&\n\t\t\t\t\t\t\t\tcounter.get('physicalsetup') + counter.get('specialsetup') < 2\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\t\tcull = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tmoveid === 'hiddenpower' &&\n\t\t\t\t\tcounter.setupType === 'Special' &&\n\t\t\t\t\tspecies.types.length > 1 &&\n\t\t\t\t\tcounter.get('Special') <= 2 &&\n\t\t\t\t\t!types.has(move.type) &&\n\t\t\t\t\t!counter.get('Physical') &&\n\t\t\t\t\tcounter.get('specialpool') &&\n\t\t\t\t\t(!(types.has('Ghost') && move.type === 'Fighting' || types.has('Electric') && move.type === 'Ice'))\n\t\t\t\t) {\n\t\t\t\t\t// Hidden Power isn't good enough\n\t\t\t\t\tcull = true;\n\t\t\t\t}\n\n\t\t\t\t// Reject defensive status moves if a reliable recovery move is available but not selected.\n\t\t\t\t// Toxic is only defensive if used with another status move other than Protect (Toxic + 3 attacks and Toxic + Protect are ok).\n\t\t\t\tif (\n\t\t\t\t\t!Array.from(moves).some(id => recoveryMoves.includes(id)) &&\n\t\t\t\t\tmovePool.some(id => recoveryMoves.includes(id)) && (\n\t\t\t\t\t\tdefensiveStatusMoves.includes(moveid) ||\n\t\t\t\t\t\t(moveid === 'toxic' && ((counter.get('Status') > 1 && !moves.has('protect')) || counter.get('Status') > 2))\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tcull = true;\n\t\t\t\t}\n\n\t\t\t\tconst runEnforcementChecker = (checkerName: string) => {\n\t\t\t\t\tif (!this.moveEnforcementCheckers[checkerName]) return false;\n\t\t\t\t\treturn this.moveEnforcementCheckers[checkerName](\n\t\t\t\t\t\tmovePool, moves, abilities, types, counter, species as Species, teamDetails\n\t\t\t\t\t);\n\t\t\t\t};\n\n\t\t\t\tconst moveIsRejectable = (\n\t\t\t\t\t!move.weather &&\n\t\t\t\t\t!move.damage &&\n\t\t\t\t\t(move.category !== 'Status' || !move.flags.heal) &&\n\t\t\t\t\t(move.category === 'Status' || !types.has(move.type) || (move.basePower && move.basePower < 40 && !move.multihit)) &&\n\t\t\t\t\t// These moves cannot be rejected in favor of a forced move\n\t\t\t\t\t!['judgment', 'sleeptalk'].includes(moveid) &&\n\t\t\t\t\t// Setup-supported moves should only be rejected under specific circumstances\n\t\t\t\t\t(counter.get('physicalsetup') + counter.get('specialsetup') < 2 && (\n\t\t\t\t\t\t!counter.setupType || counter.setupType === 'Mixed' ||\n\t\t\t\t\t\t(move.category !== counter.setupType && move.category !== 'Status') ||\n\t\t\t\t\t\tcounter.get(counter.setupType) + counter.get('Status') > 3\n\t\t\t\t\t))\n\t\t\t\t);\n\n\t\t\t\tif (!cull && !isSetup && moveIsRejectable) {\n\t\t\t\t\t// There may be more important moves that this Pokemon needs\n\t\t\t\t\tconst canRollForcedMoves = (\n\t\t\t\t\t\t// These moves should always be rolled\n\t\t\t\t\t\tmovePool.includes('spore') || (!Array.from(moves).some(id => recoveryMoves.includes(id)) && (\n\t\t\t\t\t\t\tmovePool.includes('softboiled') ||\n\t\t\t\t\t\t\t(species.baseSpecies === 'Arceus' && movePool.includes('recover'))\n\t\t\t\t\t\t))\n\t\t\t\t\t);\n\t\t\t\t\t// Pokemon should usually have at least one STAB move\n\t\t\t\t\tconst requiresStab = (\n\t\t\t\t\t\t!counter.get('stab') && !counter.get('damage') && (\n\t\t\t\t\t\t\tspecies.types.length > 1 ||\n\t\t\t\t\t\t\t(species.types[0] !== 'Normal' && species.types[0] !== 'Psychic') ||\n\t\t\t\t\t\t\t!moves.has('icebeam') ||\n\t\t\t\t\t\t\tspecies.baseStats.spa >= species.baseStats.spd\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t\tif (\n\t\t\t\t\t\tcanRollForcedMoves ||\n\t\t\t\t\t\trequiresStab ||\n\t\t\t\t\t\t(species.requiredMove && movePool.includes(toID(species.requiredMove))) ||\n\t\t\t\t\t\t(counter.get('defensesetup') && !counter.get('recovery') && !moves.has('rest'))\n\t\t\t\t\t) {\n\t\t\t\t\t\tcull = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Pokemon should have moves that benefit their typing or ability\n\t\t\t\t\t\tfor (const type of types) {\n\t\t\t\t\t\t\tif (runEnforcementChecker(type)) cull = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfor (const abil of abilities) {\n\t\t\t\t\t\t\tif (runEnforcementChecker(abil)) cull = true;\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 (moveid === '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 && (\n\t\t\t\t\tmovePool.length - availableHP || availableHP && (moveid.startsWith('hiddenpower') || !hasHiddenPower)\n\t\t\t\t)) {\n\t\t\t\t\tif (move.category !== 'Status' && (!moveid.startsWith('hiddenpower') || !availableHP)) rejectedPool.push(moveid);\n\t\t\t\t\tmoves.delete(moveid);\n\t\t\t\t\tif (moveid.startsWith('hiddenpower')) hasHiddenPower = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (cull && rejectedPool.length) {\n\t\t\t\t\tmoves.delete(moveid);\n\t\t\t\t\tif (moveid.startsWith('hiddenpower')) hasHiddenPower = false;\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\tif (hasHiddenPower) {\n\t\t\tlet hpType;\n\t\t\tfor (const move of moves) {\n\t\t\t\tif (move.startsWith('hiddenpower')) {\n\t\t\t\t\thpType = move.substr(11);\n\t\t\t\t\tbreak;\n\t\t\t\t}\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\tconst abilityData = Array.from(abilities).map(a => this.dex.abilities.get(a));\n\t\tUtils.sortBy(abilityData, abil => -abil.rating);\n\n\t\tlet ability0 = abilityData[0];\n\t\tlet ability1 = abilityData[1];\n\t\tif (abilityData[1]) {\n\t\t\tif (ability0.rating <= ability1.rating && this.randomChance(1, 2)) {\n\t\t\t\t[ability0, ability1] = [ability1, ability0];\n\t\t\t} else if (ability0.rating - 0.6 <= ability1.rating && this.randomChance(2, 3)) {\n\t\t\t\t[ability0, ability1] = [ability1, ability0];\n\t\t\t}\n\t\t\tability = ability0.name;\n\n\t\t\twhile (this.shouldCullAbility(ability, types, moves, abilities, counter, movePool, teamDetails, species)) {\n\t\t\t\tif (ability === ability0.name && ability1.rating >= 1) {\n\t\t\t\t\tability = ability1.name;\n\t\t\t\t} else {\n\t\t\t\t\t// Default to the highest rated ability if all are rejected\n\t\t\t\t\tability = abilityData[0].name;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (abilities.has('Hydration') && moves.has('raindance') && moves.has('rest')) {\n\t\t\t\tability = 'Hydration';\n\t\t\t} else if (abilities.has('Swift Swim') && moves.has('raindance')) {\n\t\t\t\tability = 'Swift Swim';\n\t\t\t} else if (abilities.has('Technician') && moves.has('machpunch') && types.has('Fighting') && counter.get('stab') < 2) {\n\t\t\t\tability = 'Technician';\n\t\t\t}\n\t\t} else {\n\t\t\tability = ability0.name;\n\t\t}\n\n\t\titem = this.getHighPriorityItem(ability, types, moves, counter, teamDetails, species, isLead);\n\t\tif (item === undefined) item = this.getMediumPriorityItem(ability, moves, counter, species, false, isLead);\n\t\tif (item === undefined) {\n\t\t\titem = this.getLowPriorityItem(ability, types, moves, abilities, counter, teamDetails, species);\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 levelScale: {[k: string]: number} = {\n\t\t\tAG: 74,\n\t\t\tUber: 76,\n\t\t\tOU: 80,\n\t\t\t'(OU)': 82,\n\t\t\tUUBL: 82,\n\t\t\tUU: 84,\n\t\t\tNUBL: 86,\n\t\t\tNU: 88,\n\t\t};\n\t\tconst customScale: {[k: string]: number} = {\n\t\t\tDelibird: 100, Ditto: 100, 'Farfetch\\u2019d': 100, Unown: 100, Castform: 100,\n\t\t};\n\t\tconst level = this.adjustLevel || customScale[species.name] || levelScale[species.tier] || (species.nfe ? 90 : 80);\n\n\t\t// Prepare optimal HP\n\t\tlet hp = Math.floor(\n\t\t\tMath.floor(\n\t\t\t\t2 * species.baseStats.hp + (ivs.hp || 31) + Math.floor(evs.hp / 4) + 100\n\t\t\t) * level / 100 + 10\n\t\t);\n\t\tif (moves.has('substitute') && item === 'Sitrus Berry') {\n\t\t\t// Two Substitutes should activate Sitrus Berry\n\t\t\twhile (hp % 4 > 0) {\n\t\t\t\tevs.hp -= 4;\n\t\t\t\thp = Math.floor(\n\t\t\t\t\tMath.floor(\n\t\t\t\t\t\t2 * species.baseStats.hp + (ivs.hp || 31) + Math.floor(evs.hp / 4) + 100\n\t\t\t\t\t) * level / 100 + 10\n\t\t\t\t);\n\t\t\t}\n\t\t} else if (moves.has('bellydrum') && item === 'Sitrus Berry') {\n\t\t\t// Belly Drum should activate Sitrus Berry\n\t\t\tif (hp % 2 > 0) evs.hp -= 4;\n\t\t} else {\n\t\t\t// Maximize number of Stealth Rock switch-ins\n\t\t\tconst srWeakness = this.dex.getEffectiveness('Rock', species);\n\t\t\tif (srWeakness > 0 && hp % (4 / srWeakness) === 0) evs.hp -= 4;\n\t\t}\n\n\t\t// Minimize confusion damage\n\t\tif (!counter.get('Physical') && !moves.has('transform')) {\n\t\t\tevs.atk = 0;\n\t\t\tivs.atk = hasHiddenPower ? (ivs.atk || 31) - 28 : 0;\n\t\t}\n\n\t\tif (['gyroball', 'metalburst', 'trickroom'].some(m => moves.has(m))) {\n\t\t\tevs.spe = 0;\n\t\t\tivs.spe = hasHiddenPower ? (ivs.spe || 31) - 28 : 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\tmoves: Array.from(moves),\n\t\t\tability,\n\t\t\tevs,\n\t\t\tivs,\n\t\t\titem,\n\t\t\tlevel,\n\t\t};\n\t}\n}\n\nexport default RandomGen4Teams;\n","import {MoveCounter} from './gen8';\nimport {RandomGen4Teams} from './gen4';\nimport {Utils} from './utils';\nimport {\n\tFormat,\n\tModdedDex,\n\tMove,\n\tPRNG,\n\tPRNGSeed,\n\tRandomTeamsTypes,\n\tSpecies,\n\tStatID,\n} from '@pkmn/sim';\n\nexport class RandomGen3Teams extends RandomGen4Teams {\n\tbattleHasDitto: boolean;\n\tbattleHasWobbuffet: boolean;\n\n\tconstructor(dex: ModdedDex, format: Format, prng: PRNG | PRNGSeed | null) {\n\t\tsuper(dex, format, prng);\n\t\tthis.battleHasDitto = false;\n\t\tthis.battleHasWobbuffet = false;\n\t\tthis.moveEnforcementCheckers = {\n\t\t\tBug: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\tmovePool.includes('megahorn') || (!species.types[1] && movePool.includes('hiddenpowerbug'))\n\t\t\t),\n\t\t\tElectric: (movePool, moves, abilities, types, counter) => !counter.get('Electric'),\n\t\t\tFighting: (movePool, moves, abilities, types, counter) => !counter.get('Fighting'),\n\t\t\tFire: (movePool, moves, abilities, types, counter) => !counter.get('Fire'),\n\t\t\tGround: (movePool, moves, abilities, types, counter) => !counter.get('Ground'),\n\t\t\tNormal: (movePool, moves, abilities, types, counter, species) => {\n\t\t\t\tif (species.id === 'blissey' && movePool.includes('softboiled')) return true;\n\t\t\t\treturn !counter.get('Normal') && counter.setupType === 'Physical';\n\t\t\t},\n\t\t\tPsychic: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\ttypes.has('Psychic') &&\n\t\t\t\t(movePool.includes('psychic') || movePool.includes('psychoboost')) &&\n\t\t\t\tspecies.baseStats.spa >= 100\n\t\t\t),\n\t\t\tRock: (movePool, moves, abilities, types, counter, species) => !counter.get('Rock') && species.baseStats.atk >= 100,\n\t\t\tWater: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\t!counter.get('Water') && counter.setupType !== 'Physical' && species.baseStats.spa >= 60\n\t\t\t),\n\t\t\t// If the Pokémon has this move, the other move will be forced\n\t\t\tprotect: movePool => movePool.includes('wish'),\n\t\t\tsunnyday: movePool => movePool.includes('solarbeam'),\n\t\t\tsleeptalk: movePool => movePool.includes('rest'),\n\t\t};\n\t}\n\n\tshouldCullMove(\n\t\tmove: Move,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tmovePool: string[],\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t): {cull: boolean, isSetup?: boolean} {\n\t\tconst restTalk = moves.has('rest') && moves.has('sleeptalk');\n\n\t\tswitch (move.id) {\n\t\t// Set up once and only if we have the moves for it\n\t\tcase 'bulkup': case 'curse': case 'dragondance': case 'swordsdance':\n\t\t\treturn {\n\t\t\t\tcull: (\n\t\t\t\t\t(counter.setupType !== 'Physical' || counter.get('physicalsetup') > 1) ||\n\t\t\t\t\t(counter.get('Physical') + counter.get('physicalpool') < 2 && !moves.has('batonpass') && !restTalk)\n\t\t\t\t),\n\t\t\t\tisSetup: true,\n\t\t\t};\n\t\tcase 'calmmind':\n\t\t\treturn {\n\t\t\t\tcull: (\n\t\t\t\t\tcounter.setupType !== 'Special' ||\n\t\t\t\t\t(counter.get('Special') + counter.get('specialpool') < 2 && !moves.has('batonpass') && !restTalk)\n\t\t\t\t),\n\t\t\t\tisSetup: true,\n\t\t\t};\n\t\tcase 'agility':\n\t\t\treturn {\n\t\t\t\tcull: (counter.damagingMoves.size < 2 && !moves.has('batonpass')) || moves.has('substitute') || restTalk,\n\t\t\t\tisSetup: !counter.setupType,\n\t\t\t};\n\n\t\t// Not very useful without their supporting moves\n\t\tcase 'amnesia': case 'sleeptalk':\n\t\t\tif (moves.has('roar')) return {cull: true};\n\t\t\tif (!moves.has('rest')) return {cull: true};\n\t\t\tif (movePool.length > 1) {\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 'barrier':\n\t\t\treturn {cull: !moves.has('calmmind') && !moves.has('batonpass') && !moves.has('mirrorcoat')};\n\t\tcase 'batonpass':\n\t\t\treturn {cull: (\n\t\t\t\t(!counter.setupType && !counter.get('speedsetup')) &&\n\t\t\t\t['meanlook', 'spiderweb', 'substitute', 'wish'].every(m => !moves.has(m))\n\t\t\t)};\n\t\tcase 'endeavor': case 'flail': case 'reversal':\n\t\t\treturn {cull: restTalk || (!moves.has('endure') && !moves.has('substitute'))};\n\t\tcase 'endure':\n\t\t\treturn {cull: movePool.includes('destinybond')};\n\t\tcase 'extremespeed': case 'raindance': case 'sunnyday':\n\t\t\treturn {cull: counter.damagingMoves.size < 2 || moves.has('rest')};\n\t\tcase 'focuspunch':\n\t\t\treturn {cull: (\n\t\t\t\t(counter.damagingMoves.size < 2 || moves.has('rest') || counter.setupType && !moves.has('spore')) ||\n\t\t\t\t(!moves.has('substitute') && (counter.get('Physical') < 4 || moves.has('fakeout'))) ||\n\t\t\t\t// Breloom likes to have coverage\n\t\t\t\t(species.id === 'breloom' && (moves.has('machpunch') || moves.has('skyuppercut')))\n\t\t\t)};\n\t\tcase 'moonlight':\n\t\t\treturn {cull: moves.has('wish') || moves.has('protect')};\n\t\tcase 'perishsong':\n\t\t\treturn {cull: !moves.has('meanlook') && !moves.has('spiderweb')};\n\t\tcase 'protect':\n\t\t\treturn {cull: !abilities.has('Speed Boost') && ['perishsong', 'toxic', 'wish'].every(m => !moves.has(m))};\n\t\tcase 'refresh':\n\t\t\treturn {cull: !counter.setupType};\n\t\tcase 'rest':\n\t\t\treturn {cull: (\n\t\t\t\tmovePool.includes('sleeptalk') ||\n\t\t\t\t(!moves.has('sleeptalk') && (!!counter.get('recovery') || movePool.includes('curse')))\n\t\t\t)};\n\t\tcase 'solarbeam':\n\t\t\tif (movePool.length > 1) {\n\t\t\t\tconst sunnyday = movePool.indexOf('sunnyday');\n\t\t\t\tif (sunnyday >= 0) this.fastPop(movePool, sunnyday);\n\t\t\t}\n\t\t\treturn {cull: !moves.has('sunnyday')};\n\n\t\t// Bad after setup\n\t\tcase 'aromatherapy': case 'healbell':\n\t\t\treturn {cull: moves.has('rest') || !!teamDetails.statusCure};\n\t\tcase 'confuseray':\n\t\t\treturn {cull: !!counter.setupType || restTalk};\n\t\tcase 'counter': case 'mirrorcoat':\n\t\t\treturn {cull: !!counter.setupType || ['rest', 'substitute', 'toxic'].some(m => moves.has(m))};\n\t\tcase 'destinybond':\n\t\t\treturn {cull: !!counter.setupType || moves.has('explosion') || moves.has('selfdestruct')};\n\t\tcase 'doubleedge': case 'facade': case 'fakeout': case 'waterspout':\n\t\t\treturn {cull: (\n\t\t\t\t(!types.has(move.type) && counter.get('Status') >= 1) ||\n\t\t\t\t(move.id === 'doubleedge' && moves.has('return'))\n\t\t\t)};\n\t\tcase 'encore': case 'painsplit': case 'recover': case 'yawn':\n\t\t\treturn {cull: restTalk};\n\t\tcase 'explosion': case 'machpunch': case 'selfdestruct':\n\t\t\t// Snorlax doesn't want to roll selfdestruct as its only STAB move\n\t\t\tconst snorlaxCase = species.id === 'snorlax' && !moves.has('return') && !moves.has('bodyslam');\n\t\t\treturn {cull: snorlaxCase || moves.has('rest') || moves.has('substitute') || !!counter.get('recovery')};\n\t\tcase 'haze':\n\t\t\treturn {cull: !!counter.setupType || moves.has('raindance') || restTalk};\n\t\tcase 'icywind': case 'pursuit': case 'superpower': case 'transform':\n\t\t\treturn {cull: !!counter.setupType || moves.has('rest')};\n\t\tcase 'leechseed':\n\t\t\treturn {cull: !!counter.setupType || moves.has('explosion')};\n\t\tcase 'stunspore':\n\t\t\treturn {cull: moves.has('sunnyday') || moves.has('toxic')};\n\t\tcase 'lightscreen':\n\t\t\treturn {cull: !!counter.setupType || !!counter.get('speedsetup')};\n\t\tcase 'meanlook': case 'spiderweb':\n\t\t\treturn {cull: !!counter.get('speedsetup') || (!moves.has('batonpass') && !moves.has('perishsong'))};\n\t\tcase 'morningsun':\n\t\t\treturn {cull: counter.get('speedsetup') >= 1};\n\t\tcase 'quickattack':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.get('speedsetup') ||\n\t\t\t\tmoves.has('substitute') ||\n\t\t\t\t(!types.has('Normal') && !!counter.get('Status'))\n\t\t\t)};\n\t\tcase 'rapidspin':\n\t\t\treturn {cull: !!counter.setupType || moves.has('rest') || !!teamDetails.rapidSpin};\n\t\tcase 'reflect':\n\t\t\treturn {cull: !!counter.setupType || !!counter.get('speedsetup')};\n\t\tcase 'roar':\n\t\t\treturn {cull: moves.has('sleeptalk') || moves.has('rest')};\n\t\tcase 'seismictoss':\n\t\t\treturn {cull: !!counter.setupType || moves.has('thunderbolt')};\n\t\tcase 'spikes':\n\t\t\treturn {cull: !!counter.setupType || moves.has('substitute') || restTalk || !!teamDetails.spikes};\n\t\tcase 'substitute':\n\t\t\tconst restOrDD = moves.has('rest') || (moves.has('dragondance') && !moves.has('bellydrum'));\n\t\t\t// This cull condition otherwise causes mono-solarbeam Entei\n\t\t\treturn {cull: restOrDD || (species.id !== 'entei' && !moves.has('batonpass') && movePool.includes('calmmind'))};\n\t\tcase 'thunderwave':\n\t\t\treturn {cull: !!counter.setupType || moves.has('bodyslam') || moves.has('substitute') || restTalk};\n\t\tcase 'toxic':\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['endure', 'focuspunch', 'raindance', 'yawn', 'hypnosis'].some(m => moves.has(m))\n\t\t\t)};\n\t\tcase 'trick':\n\t\t\treturn {cull: counter.get('Status') > 1};\n\t\tcase 'willowisp':\n\t\t\treturn {cull: !!counter.setupType || moves.has('hypnosis') || moves.has('toxic')};\n\n\t\t// Bit redundant to have both\n\t\tcase 'bodyslam':\n\t\t\treturn {cull: moves.has('return') && !!counter.get('Status')};\n\t\tcase 'headbutt':\n\t\t\treturn {cull: !moves.has('bodyslam') && !moves.has('thunderwave')};\n\t\tcase 'return':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('endure') ||\n\t\t\t\t(moves.has('substitute') && moves.has('flail')) ||\n\t\t\t\t(moves.has('bodyslam') && !counter.get('Status'))\n\t\t\t)};\n\t\tcase 'fireblast':\n\t\t\treturn {cull: moves.has('flamethrower') && !!counter.get('Status')};\n\t\tcase 'flamethrower':\n\t\t\treturn {cull: moves.has('fireblast') && !counter.get('Status')};\n\t\tcase 'overheat':\n\t\t\treturn {cull: moves.has('flamethrower') || moves.has('substitute')};\n\t\tcase 'hydropump':\n\t\t\treturn {cull: moves.has('surf') && !!counter.get('Status')};\n\t\tcase 'surf':\n\t\t\treturn {cull: moves.has('hydropump') && !counter.get('Status')};\n\t\tcase 'gigadrain':\n\t\t\treturn {cull: moves.has('morningsun') || moves.has('toxic')};\n\t\tcase 'hiddenpower':\n\t\t\tconst stabCondition = types.has(move.type) && counter.get(move.type) > 1 && (\n\t\t\t\t(moves.has('substitute') && !counter.setupType && !moves.has('toxic')) ||\n\t\t\t\t// This otherwise causes STABless meganium\n\t\t\t\t(species.id !== 'meganium' && moves.has('toxic') && !moves.has('substitute')) ||\n\t\t\t\trestTalk\n\t\t\t);\n\t\t\treturn {cull: stabCondition || (move.type === 'Grass' && moves.has('sunnyday') && moves.has('solarbeam'))};\n\t\tcase 'brickbreak': case 'crosschop': case 'skyuppercut':\n\t\t\treturn {cull: moves.has('substitute') && (moves.has('focuspunch') || movePool.includes('focuspunch'))};\n\t\tcase 'earthquake':\n\t\t\treturn {cull: moves.has('bonemerang')};\n\t\t}\n\n\t\treturn {cull: false};\n\t}\n\n\n\tgetItem(\n\t\tability: string,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tspecies: Species\n\t) {\n\t\t// First, the high-priority items\n\t\tif (species.name === 'Ditto') return this.sample(['Metal Powder', 'Quick Claw']);\n\t\tif (species.name === 'Farfetch\\u2019d') return 'Stick';\n\t\tif (species.name === 'Marowak') return 'Thick Club';\n\t\tif (species.name === 'Pikachu') return 'Light Ball';\n\t\tif (species.name === 'Shedinja') return 'Lum Berry';\n\t\tif (species.name === 'Unown') return 'Twisted Spoon';\n\n\t\tif (moves.has('trick')) return 'Choice Band';\n\t\tif (moves.has('rest') && !moves.has('sleeptalk') && !['Early Bird', 'Natural Cure', 'Shed Skin'].includes(ability)) {\n\t\t\treturn 'Chesto Berry';\n\t\t}\n\n\t\t// Medium priority items\n\t\tif (moves.has('dragondance') && ability !== 'Natural Cure') return 'Lum Berry';\n\t\tif ((moves.has('bellydrum') && counter.get('Physical') - counter.get('priority') > 1) || (\n\t\t\t((moves.has('swordsdance') && counter.get('Status') < 2) || (moves.has('bulkup') && moves.has('substitute'))) &&\n\t\t\t!counter.get('priority') &&\n\t\t\tspecies.baseStats.spe >= 60 && species.baseStats.spe <= 95\n\t\t)) {\n\t\t\treturn 'Salac Berry';\n\t\t}\n\t\tif (moves.has('endure') || (\n\t\t\tmoves.has('substitute') &&\n\t\t\t['bellydrum', 'endeavor', 'flail', 'reversal'].some(m => moves.has(m))\n\t\t)) {\n\t\t\treturn (\n\t\t\t\tspecies.baseStats.spe <= 100 && ability !== 'Speed Boost' && !counter.get('speedsetup') && !moves.has('focuspunch')\n\t\t\t) ? 'Salac Berry' : 'Liechi Berry';\n\t\t}\n\t\tif (moves.has('substitute') && counter.get('Physical') >= 3 && species.baseStats.spe >= 120) return 'Liechi Berry';\n\t\tif ((moves.has('substitute') || moves.has('raindance')) && counter.get('Special') >= 3) return 'Petaya Berry';\n\t\tif (counter.get('Physical') >= 4 && !moves.has('fakeout')) return 'Choice Band';\n\t\tif (counter.get('Physical') >= 3 && !moves.has('rapidspin') && (\n\t\t\t['firepunch', 'icebeam', 'overheat'].some(m => moves.has(m)) ||\n\t\t\tArray.from(moves).some(m => {\n\t\t\t\tconst moveData = this.dex.moves.get(m);\n\t\t\t\treturn moveData.category === 'Special' && types.has(moveData.type);\n\t\t\t})\n\t\t)) {\n\t\t\treturn 'Choice Band';\n\t\t}\n\n\t\t// Default to Leftovers\n\t\treturn 'Leftovers';\n\t}\n\n\tshouldCullAbility(\n\t\tability: string,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tmovePool: string[],\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t) {\n\t\tswitch (ability) {\n\t\tcase 'Chlorophyll':\n\t\t\treturn !moves.has('sunnyday') && !teamDetails['sun'];\n\t\tcase 'Compound Eyes':\n\t\t\treturn !counter.get('inaccurate');\n\t\tcase 'Hustle':\n\t\t\treturn counter.get('Physical') < 2;\n\t\tcase 'Lightning Rod':\n\t\t\treturn species.types.includes('Ground');\n\t\tcase 'Overgrow':\n\t\t\treturn !counter.get('Grass');\n\t\tcase 'Rock Head':\n\t\t\treturn !counter.get('recoil');\n\t\tcase 'Sand Veil':\n\t\t\treturn !teamDetails['sand'];\n\t\tcase 'Serene Grace':\n\t\t\treturn species.id === 'blissey';\n\t\tcase 'Sturdy':\n\t\t\t// Sturdy is bad.\n\t\t\treturn true;\n\t\tcase 'Swift Swim':\n\t\t\treturn !moves.has('raindance') && !teamDetails['rain'];\n\t\tcase 'Swarm':\n\t\t\treturn !counter.get('Bug');\n\t\tcase 'Torrent':\n\t\t\treturn !counter.get('Water');\n\t\tcase 'Water Absorb':\n\t\t\treturn abilities.has('Swift Swim');\n\t\t}\n\n\t\treturn false;\n\t}\n\n\trandomSet(species: string | Species, teamDetails: RandomTeamsTypes.TeamDetails = {}): RandomTeamsTypes.RandomSet {\n\t\tspecies = this.dex.species.get(species);\n\t\tlet forme = species.name;\n\n\t\tif (typeof species.battleOnly === 'string') forme = species.battleOnly;\n\n\t\tconst movePool = (species.randomBattleMoves || Object.keys(this.dex.species.getLearnset(species.id)!)).slice();\n\t\tconst rejectedPool = [];\n\t\tconst moves = new Set<string>();\n\t\tlet ability = '';\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\t\tlet availableHP = 0;\n\t\tfor (const setMoveid of movePool) {\n\t\t\tif (setMoveid.startsWith('hiddenpower')) availableHP++;\n\t\t}\n\n\t\tconst types = new Set(species.types);\n\n\t\tconst abilities = new Set(Object.values(species.abilities));\n\n\t\tlet counter: MoveCounter;\n\t\t// We use a special variable to track Hidden Power\n\t\t// so that we can check for all Hidden Powers at once\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\twhile (moves.size < this.maxMoveCount && movePool.length) {\n\t\t\t\tconst moveid = this.sampleNoReplace(movePool);\n\t\t\t\tif (moveid.startsWith('hiddenpower')) {\n\t\t\t\t\tavailableHP--;\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\twhile (moves.size < this.maxMoveCount && rejectedPool.length) {\n\t\t\t\tconst moveid = this.sampleNoReplace(rejectedPool);\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\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\n\t\t\t\tlet {cull, isSetup} = this.shouldCullMove(move, types, moves, abilities, counter, movePool, teamDetails, species);\n\n\t\t\t\t// This move doesn't satisfy our setup requirements:\n\t\t\t\tif (\n\t\t\t\t\t(counter.setupType === 'Physical' && move.category === 'Special' && !types.has(move.type) && move.type !== 'Fire') ||\n\t\t\t\t\t(counter.setupType === 'Special' && move.category === 'Physical' && moveid !== 'superpower')\n\t\t\t\t) {\n\t\t\t\t\tcull = true;\n\t\t\t\t}\n\t\t\t\tconst moveIsRejectable = (\n\t\t\t\t\t!move.weather &&\n\t\t\t\t\t(move.category !== 'Status' || !move.flags.heal) &&\n\t\t\t\t\t(counter.setupType || !move.stallingMove) &&\n\t\t\t\t\t// These moves cannot be rejected in favor of a forced move\n\t\t\t\t\t!['batonpass', 'sleeptalk', 'solarbeam', 'substitute', 'sunnyday'].includes(moveid) &&\n\t\t\t\t\t(move.category === 'Status' || !types.has(move.type) || (move.basePower && move.basePower < 40 && !move.multihit))\n\t\t\t\t);\n\t\t\t\t// Pokemon should usually have at least one STAB move\n\t\t\t\tconst requiresStab = (\n\t\t\t\t\t!counter.get('stab') &&\n\t\t\t\t\t!moves.has('seismictoss') && !moves.has('nightshade') &&\n\t\t\t\t\tspecies.id !== 'castform' &&\n\t\t\t\t\t// If a Flying-type has Psychic, it doesn't need STAB\n\t\t\t\t\t!(moves.has('psychic') && types.has('Flying')) &&\n\t\t\t\t\t!(types.has('Ghost') && species.baseStats.spa > species.baseStats.atk) &&\n\t\t\t\t\t!(\n\t\t\t\t\t\t// With Calm Mind, Lugia and pure Normal-types are fine without STAB\n\t\t\t\t\t\tcounter.setupType === 'Special' && (\n\t\t\t\t\t\t\tspecies.id === 'lugia' ||\n\t\t\t\t\t\t\t(types.has('Normal') && species.types.length < 2)\n\t\t\t\t\t\t)\n\t\t\t\t\t) &&\n\t\t\t\t\t!(\n\t\t\t\t\t\t// With Swords Dance, Dark-types and pure Water-types are fine without STAB\n\t\t\t\t\t\tcounter.setupType === 'Physical' &&\n\t\t\t\t\t\t((types.has('Water') && species.types.length < 2) || types.has('Dark'))\n\t\t\t\t\t) &&\n\t\t\t\t\tcounter.get('physicalpool') + counter.get('specialpool') > 0\n\t\t\t\t);\n\n\t\t\t\tconst runEnforcementChecker = (checkerName: string) => {\n\t\t\t\t\tif (!this.moveEnforcementCheckers[checkerName]) return false;\n\t\t\t\t\treturn this.moveEnforcementCheckers[checkerName](\n\t\t\t\t\t\tmovePool, moves, abilities, types, counter, species as Species, teamDetails\n\t\t\t\t\t);\n\t\t\t\t};\n\n\t\t\t\tif (!cull && !isSetup && moveIsRejectable) {\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\trequiresStab ||\n\t\t\t\t\t\t(counter.setupType && counter.get(counter.setupType) < 2) ||\n\t\t\t\t\t\t(moves.has('substitute') && movePool.includes('morningsun')) ||\n\t\t\t\t\t\t['meteormash', 'spore', 'recover'].some(m => movePool.includes(m))\n\t\t\t\t\t) {\n\t\t\t\t\t\tcull = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Pokemon should have moves that benefit their typing and their other moves\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\tfor (const m of moves) {\n\t\t\t\t\t\t\tif (runEnforcementChecker(m)) cull = true;\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 (moveid === '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\tconst moveIsHP = moveid.startsWith('hiddenpower');\n\t\t\t\tif (\n\t\t\t\t\tcull &&\n\t\t\t\t\t(movePool.length - availableHP || availableHP && (moveIsHP || !hasHiddenPower))\n\t\t\t\t) {\n\t\t\t\t\tif (move.category !== 'Status' && !move.damage && (!moveIsHP || !availableHP)) {\n\t\t\t\t\t\trejectedPool.push(moveid);\n\t\t\t\t\t}\n\t\t\t\t\tif (moveIsHP) 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\tif (cull && rejectedPool.length) {\n\t\t\t\t\tif (moveIsHP) 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\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\tconst abilityData = Array.from(abilities).map(a => this.dex.abilities.get(a)).filter(a => a.gen === 3);\n\t\tUtils.sortBy(abilityData, abil => -abil.rating);\n\t\tlet ability0 = abilityData[0];\n\t\tlet ability1 = abilityData[1];\n\t\tif (abilityData[1]) {\n\t\t\tif (ability0.rating <= ability1.rating && this.randomChance(1, 2)) {\n\t\t\t\t[ability0, ability1] = [ability1, ability0];\n\t\t\t} else if (ability0.rating - 0.6 <= ability1.rating && this.randomChance(2, 3)) {\n\t\t\t\t[ability0, ability1] = [ability1, ability0];\n\t\t\t}\n\t\t\tability = ability0.name;\n\n\t\t\twhile (this.shouldCullAbility(ability, types, moves, abilities, counter, movePool, teamDetails, species)) {\n\t\t\t\tif (ability === ability0.name && ability1.rating > 1) {\n\t\t\t\t\tability = ability1.name;\n\t\t\t\t} else {\n\t\t\t\t\t// Default to the highest rated ability if all are rejected\n\t\t\t\t\tability = abilityData[0].name;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tability = abilityData[0].name;\n\t\t}\n\n\t\tconst item = this.getItem(ability, types, moves, counter, species);\n\t\tconst levelScale: {[k: string]: number} = {\n\t\t\tUber: 76,\n\t\t\tOU: 80,\n\t\t\tUUBL: 82,\n\t\t\tUU: 84,\n\t\t\tNUBL: 86,\n\t\t\tNU: 88,\n\t\t\tNFE: 90,\n\t\t};\n\t\tconst customScale: {[k: string]: number} = {\n\t\t\tDitto: 99, Unown: 99,\n\t\t};\n\t\tconst tier = species.tier;\n\t\tconst level = this.adjustLevel || customScale[species.name] || levelScale[tier] || (species.nfe ? 90 : 80);\n\n\t\t// Prepare optimal HP\n\t\tlet hp = Math.floor(Math.floor(2 * species.baseStats.hp + ivs.hp + Math.floor(evs.hp / 4) + 100) * level / 100 + 10);\n\t\tif (moves.has('substitute') && ['endeavor', 'flail', 'reversal'].some(m => moves.has(m))) {\n\t\t\t// Endeavor/Flail/Reversal users should be able to use four Substitutes\n\t\t\tif (hp % 4 === 0) evs.hp -= 4;\n\t\t} else if (moves.has('substitute') && (item === 'Salac Berry' || item === 'Petaya Berry' || item === 'Liechi Berry')) {\n\t\t\t// Other pinch berry holders should have berries activate after three Substitutes\n\t\t\twhile (hp % 4 > 0) {\n\t\t\t\tevs.hp -= 4;\n\t\t\t\thp = Math.floor(Math.floor(2 * species.baseStats.hp + ivs.hp + Math.floor(evs.hp / 4) + 100) * level / 100 + 10);\n\t\t\t}\n\t\t}\n\n\t\t// Minimize confusion damage\n\t\tif (!counter.get('Physical') && !moves.has('transform')) {\n\t\t\tevs.atk = 0;\n\t\t\tivs.atk = hasHiddenPower ? ivs.atk - 28 : 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\tmoves: Array.from(moves),\n\t\t\tability: ability,\n\t\t\tevs: evs,\n\t\t\tivs: ivs,\n\t\t\titem: item,\n\t\t\tlevel,\n\t\t\tshiny: this.randomChance(1, 1024),\n\t\t};\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 typePool = this.dex.types.names();\n\t\tconst type = this.forceMonotype || this.sample(typePool);\n\n\t\tconst baseFormes: {[k: string]: number} = {};\n\t\tconst tierCount: {[k: string]: number} = {};\n\t\tconst typeCount: {[k: string]: number} = {};\n\t\tconst typeComboCount: {[k: string]: number} = {};\n\t\tconst teamDetails: RandomTeamsTypes.TeamDetails = {};\n\n\t\tconst pokemonPool = this.getPokemonPool(type, pokemon, isMonotype);\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 || !species.randomBattleMoves) continue;\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// Limit to one Wobbuffet per battle (not just per team)\n\t\t\tif (species.name === 'Wobbuffet' && this.battleHasWobbuffet) continue;\n\t\t\t// Limit to one Ditto per battle in Gen 2\n\t\t\tif (this.dex.gen < 3 && species.name === 'Ditto' && this.battleHasDitto) continue;\n\n\t\t\tconst tier = species.tier;\n\t\t\tconst types = species.types;\n\t\t\tconst typeCombo = types.slice().sort().join();\n\n\t\t\tif (!isMonotype && !this.forceMonotype) {\n\t\t\t\t// Dynamically scale limits for different team sizes. The default and minimum value is 1.\n\t\t\t\tconst limitFactor = Math.round(this.maxTeamSize / 6) || 1;\n\n\t\t\t\t// Limit two Pokemon per tier\n\t\t\t\tif (tierCount[tier] >= 2 * limitFactor) continue;\n\n\t\t\t\t// Limit two of any type\n\t\t\t\tlet skip = false;\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 one of any type combination\n\t\t\t\tif (!this.forceMonotype && 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\tconst set = this.randomSet(species, teamDetails);\n\t\t\tpokemon.push(set);\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 tier counter\n\t\t\tif (tierCount[tier]) {\n\t\t\t\ttierCount[tier]++;\n\t\t\t} else {\n\t\t\t\ttierCount[tier] = 1;\n\t\t\t}\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// Updateeam details\n\t\t\tif (set.ability === 'Drizzle' || set.moves.includes('raindance')) teamDetails.rain = 1;\n\t\t\tif (set.ability === 'Sand Stream') teamDetails.sand = 1;\n\t\t\tif (set.moves.includes('spikes')) teamDetails.spikes = 1;\n\t\t\tif (set.moves.includes('rapidspin')) teamDetails.rapidSpin = 1;\n\t\t\tif (set.moves.includes('aromatherapy') || set.moves.includes('healbell')) teamDetails.statusCure = 1;\n\n\t\t\t// In Gen 3, Shadow Tag users can prevent each other from switching out, possibly causing and endless battle or at least causing a long stall war\n\t\t\t// To prevent this, we prevent more than one Wobbuffet in a single battle.\n\t\t\tif (set.ability === 'Shadow Tag') this.battleHasWobbuffet = true;\n\t\t\tif (species.id === 'ditto') this.battleHasDitto = true;\n\t\t}\n\n\t\tif (pokemon.length < this.maxTeamSize && !isMonotype && !this.forceMonotype && pokemon.length < 12) {\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\nexport default RandomGen3Teams;\n","import {MoveCounter} from './gen8';\nimport {RandomGen3Teams} from './gen3';\nimport {\n\tFormat,\n\tModdedDex,\n\tMove,\n\tPRNG,\n\tPRNGSeed,\n\tRandomTeamsTypes,\n\tSpecies,\n} from '@pkmn/sim';\n\nexport class RandomGen2Teams extends RandomGen3Teams {\n\tconstructor(dex: ModdedDex, format: Format, prng: PRNG | PRNGSeed | null) {\n\t\tsuper(dex, format, prng);\n\t\tthis.moveEnforcementCheckers = {\n\t\t\tElectric: (movePool, moves, abilities, types, counter) => !counter.get('Electric'),\n\t\t\tFire: (movePool, moves, abilities, types, counter) => !counter.get('Fire'),\n\t\t\tGround: (movePool, moves, abilities, types, counter) => !counter.get('Ground'),\n\t\t\tIce: (movePool, moves, abilities, types, counter) => !counter.get('Ice'),\n\t\t\tNormal: (movePool, moves, abilities, types, counter) => !counter.get('Normal') && counter.setupType === 'Physical',\n\t\t\tPsychic: (movePool, moves, abilities, types, counter) => !counter.get('Psychic') && types.has('Grass'),\n\t\t\tRock: (movePool, moves, abilities, types, counter, species) => !counter.get('Rock') && species.baseStats.atk > 60,\n\t\t\tWater: (movePool, moves, abilities, types, counter) => !counter.get('Water'),\n\t\t};\n\t}\n\n\tshouldCullMove(\n\t\tmove: Move,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tabilities = {},\n\t\tcounter: MoveCounter,\n\t\tmovePool: string[],\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t): {cull: boolean, isSetup?: boolean} {\n\t\tconst restTalk = moves.has('rest') && moves.has('sleeptalk');\n\n\t\tswitch (move.id) {\n\t\t// Set up once and only if we have the moves for it\n\t\tcase 'bellydrum': case 'curse': case 'meditate': case 'screech': case 'swordsdance':\n\t\t\treturn {\n\t\t\t\tcull: (\n\t\t\t\t\t(counter.setupType !== 'Physical' || counter.get('physicalsetup') > 1) ||\n\t\t\t\t\t(!counter.get('Physical') || counter.damagingMoves.size < 2 && !moves.has('batonpass') && !moves.has('sleeptalk'))\n\t\t\t\t),\n\t\t\t\tisSetup: true,\n\t\t\t};\n\n\t\t// Not very useful without their supporting moves\n\t\tcase 'batonpass':\n\t\t\treturn {cull: !counter.setupType && !counter.get('speedsetup') && !moves.has('meanlook')};\n\t\tcase 'meanlook':\n\t\t\treturn {cull: movePool.includes('perishsong')};\n\t\tcase 'nightmare':\n\t\t\treturn {cull: !moves.has('lovelykiss') && !moves.has('sleeppowder')};\n\t\tcase 'swagger':\n\t\t\treturn {cull: !moves.has('substitute')};\n\n\t\t// Bad after setup\n\t\tcase 'charm': case 'counter':\n\t\t\treturn {cull: !!counter.setupType};\n\t\tcase 'haze':\n\t\t\treturn {cull: !!counter.setupType || restTalk};\n\t\tcase 'reflect': case 'lightscreen':\n\t\t\treturn {cull: !!counter.setupType || moves.has('rest')};\n\n\t\t// Ineffective to have both\n\t\tcase 'doubleedge':\n\t\t\treturn {cull: moves.has('bodyslam') || moves.has('return')};\n\t\tcase 'explosion': case 'selfdestruct':\n\t\t\treturn {cull: moves.has('softboiled') || restTalk};\n\t\tcase 'extremespeed':\n\t\t\treturn {cull: moves.has('bodyslam') || restTalk};\n\t\tcase 'hyperbeam':\n\t\t\treturn {cull: moves.has('rockslide')};\n\t\tcase 'quickattack':\n\t\t\treturn {cull: moves.has('rest')};\n\t\tcase 'rapidspin':\n\t\t\treturn {cull: !!teamDetails.rapidSpin || moves.has('sleeptalk')};\n\t\tcase 'return':\n\t\t\treturn {cull: moves.has('bodyslam')};\n\t\tcase 'surf':\n\t\t\treturn {cull: moves.has('hydropump')};\n\t\tcase 'thunder':\n\t\t\treturn {cull: moves.has('thunderbolt')};\n\t\tcase 'gigadrain':\n\t\t\treturn {cull: moves.has('razorleaf') || moves.has('swordsdance') && movePool.includes('sludgebomb')};\n\t\tcase 'icebeam':\n\t\t\treturn {cull: moves.has('dragonbreath')};\n\t\tcase 'seismictoss':\n\t\t\treturn {cull: moves.has('rest') || moves.has('sleeptalk')};\n\t\tcase 'destinybond':\n\t\t\treturn {cull: moves.has('explosion')};\n\t\tcase 'pursuit':\n\t\t\treturn {cull: moves.has('crunch') && moves.has('solarbeam')};\n\t\tcase 'thief':\n\t\t\treturn {cull: moves.has('rest') || moves.has('substitute')};\n\t\tcase 'irontail':\n\t\t\treturn {cull: types.has('Ground') && movePool.includes('earthquake')};\n\n\t\t// Status and illegal move rejections\n\t\tcase 'confuseray': case 'roar': case 'whirlwind':\n\t\t\treturn {cull: restTalk};\n\t\tcase 'encore':\n\t\t\treturn {cull: moves.has('bodyslam') || moves.has('surf') || restTalk};\n\t\tcase 'lovelykiss':\n\t\t\treturn {cull: ['healbell', 'moonlight', 'morningsun'].some(m => moves.has(m)) || restTalk};\n\t\tcase 'sleeptalk':\n\t\t\treturn {cull: moves.has('curse') && counter.get('stab') >= 2};\n\t\tcase 'softboiled':\n\t\t\treturn {cull: movePool.includes('swordsdance')};\n\t\tcase 'spikes':\n\t\t\treturn {cull: !!teamDetails.spikes || types.has('Ice') && moves.has('rapidspin')};\n\t\tcase 'substitute':\n\t\t\treturn {cull: moves.has('agility') || moves.has('rest')};\n\t\tcase 'synthesis':\n\t\t\treturn {cull: moves.has('explosion')};\n\t\tcase 'thunderwave':\n\t\t\treturn {cull: moves.has('thunder') || moves.has('toxic')};\n\t\t}\n\n\t\treturn {cull: false};\n\t}\n\n\tgetItem(\n\t\tability: string,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tspecies: Species,\n\t) {\n\t\t// First, the high-priority items\n\t\tif (species.name === 'Ditto') return this.sample(['Metal Powder', 'Quick Claw']);\n\t\tif (species.name === 'Farfetch\\u2019d') return 'Stick';\n\t\tif (species.name === 'Marowak') return 'Thick Club';\n\t\tif (species.name === 'Pikachu') return 'Light Ball';\n\t\tif (species.name === 'Unown') return 'Twisted Spoon';\n\t\tif (moves.has('thief')) return '';\n\n\t\t// Medium priority\n\t\tif (moves.has('rest') && !moves.has('sleeptalk')) return 'Mint Berry';\n\t\tif (\n\t\t\t(moves.has('bellydrum') || moves.has('swordsdance')) &&\n\t\t\tspecies.baseStats.spe >= 60 && !types.has('Ground') &&\n\t\t\t!moves.has('sleeptalk') && !moves.has('substitute') &&\n\t\t\tthis.randomChance(1, 2)\n\t\t) {\n\t\t\treturn 'Miracle Berry';\n\t\t}\n\n\t\t// Default to Leftovers\n\t\treturn 'Leftovers';\n\t}\n\n\trandomSet(species: string | Species, teamDetails: RandomTeamsTypes.TeamDetails = {}): RandomTeamsTypes.RandomSet {\n\t\tspecies = this.dex.species.get(species);\n\n\t\tconst movePool = (species.randomBattleMoves || Object.keys(this.dex.species.getLearnset(species.id)!)).slice();\n\t\tconst rejectedPool: string[] = [];\n\t\tconst moves = new Set<string>();\n\n\t\tlet ivs = {hp: 30, atk: 30, def: 30, spa: 30, spd: 30, spe: 30};\n\t\tlet availableHP = 0;\n\t\tfor (const setMoveid of movePool) {\n\t\t\tif (setMoveid.startsWith('hiddenpower')) availableHP++;\n\t\t}\n\n\t\tconst types = new Set(species.types);\n\n\t\tlet counter;\n\t\t// We use a special variable to track Hidden Power\n\t\t// so that we can check for all Hidden Powers at once\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\twhile (moves.size < this.maxMoveCount && movePool.length) {\n\t\t\t\tconst moveid = this.sampleNoReplace(movePool);\n\t\t\t\tif (moveid.startsWith('hiddenpower')) {\n\t\t\t\t\tavailableHP--;\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\t\t\twhile (moves.size < this.maxMoveCount && rejectedPool.length) {\n\t\t\t\tconst moveid = this.sampleNoReplace(rejectedPool);\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, new Set(), movePool);\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(move, types, moves, {}, counter, movePool, teamDetails);\n\n\t\t\t\t// This move doesn't satisfy our setup requirements:\n\t\t\t\tif (counter.setupType === 'Physical' && move.category === 'Special' && !counter.get('Physical')) {\n\t\t\t\t\tcull = true;\n\t\t\t\t}\n\n\n\t\t\t\t// Reject Status, non-STAB, or low basepower moves\n\t\t\t\tconst moveIsRejectable = (\n\t\t\t\t\t(move.category !== 'Status' || !move.flags.heal) &&\n\t\t\t\t\t// These moves cannot be rejected in favor of a forced move\n\t\t\t\t\t!['batonpass', 'sleeptalk', 'spikes', 'sunnyday'].includes(move.id) &&\n\t\t\t\t\t(move.category === 'Status' || !types.has(move.type) || (move.basePower && move.basePower < 40))\n\t\t\t\t);\n\n\t\t\t\tif (!cull && !isSetup && moveIsRejectable && (counter.setupType || !move.stallingMove)) {\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 usually have at least one STAB move\n\t\t\t\t\t\t(\n\t\t\t\t\t\t\t!counter.get('stab') &&\n\t\t\t\t\t\t\t!counter.get('damage') &&\n\t\t\t\t\t\t\t!types.has('Ghost') &&\n\t\t\t\t\t\t\tcounter.get('physicalpool') + counter.get('specialpool') > 0\n\t\t\t\t\t\t) || (movePool.includes('megahorn') || (movePool.includes('softboiled') && moves.has('present'))) ||\n\t\t\t\t\t\t// Rest + Sleep Talk should be selected together\n\t\t\t\t\t\t((moves.has('rest') && movePool.includes('sleeptalk')) || (moves.has('sleeptalk') && movePool.includes('rest'))) ||\n\t\t\t\t\t\t// Sunny Day + Solar Beam should be selected together\n\t\t\t\t\t\t(moves.has('sunnyday') && movePool.includes('solarbeam') ||\n\t\t\t\t\t\t(moves.has('solarbeam') && movePool.includes('sunnyday'))) ||\n\t\t\t\t\t\t['milkdrink', 'recover', 'spore'].some(m => movePool.includes(m))\n\t\t\t\t\t) {\n\t\t\t\t\t\tcull = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Pokemon should have moves that benefit their typing\n\t\t\t\t\t\tfor (const type of types) {\n\t\t\t\t\t\t\tif (this.moveEnforcementCheckers[type]?.(movePool, moves, new Set(), types, counter, species, teamDetails)) cull = true;\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 (\n\t\t\t\t\tcull &&\n\t\t\t\t\t(movePool.length - availableHP || availableHP && (move.id === 'hiddenpower' || !hasHiddenPower))\n\t\t\t\t) {\n\t\t\t\t\tif (move.category !== 'Status' && !move.damage && (move.id !== 'hiddenpower' || !availableHP)) {\n\t\t\t\t\t\trejectedPool.push(moveid);\n\t\t\t\t\t}\n\t\t\t\t\tmoves.delete(moveid);\n\t\t\t\t\tif (moveid.startsWith('hiddenpower')) hasHiddenPower = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (cull && rejectedPool.length) {\n\t\t\t\t\tmoves.delete(moveid);\n\t\t\t\t\tif (moveid.startsWith('hiddenpower')) hasHiddenPower = false;\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// Adjust IVs for Hidden Power\n\t\tfor (const setMoveid of moves) {\n\t\t\tif (!setMoveid.startsWith('hiddenpower')) continue;\n\t\t\tconst hpType = setMoveid.substr(11, setMoveid.length);\n\n\t\t\tconst hpIVs: {[k: string]: Partial<typeof ivs>} = {\n\t\t\t\tdragon: {def: 28},\n\t\t\t\tice: {def: 26},\n\t\t\t\tpsychic: {def: 24},\n\t\t\t\telectric: {atk: 28},\n\t\t\t\tgrass: {atk: 28, def: 28},\n\t\t\t\twater: {atk: 28, def: 26},\n\t\t\t\tfire: {atk: 28, def: 24},\n\t\t\t\tsteel: {atk: 26},\n\t\t\t\tghost: {atk: 26, def: 28},\n\t\t\t\tbug: {atk: 26, def: 26},\n\t\t\t\trock: {atk: 26, def: 24},\n\t\t\t\tground: {atk: 24},\n\t\t\t\tpoison: {atk: 24, def: 28},\n\t\t\t\tflying: {atk: 24, def: 26},\n\t\t\t\tfighting: {atk: 24, def: 24},\n\t\t\t};\n\t\t\tif (hpIVs[hpType]) {\n\t\t\t\tivs = {...ivs, ...hpIVs[hpType]};\n\t\t\t}\n\n\t\t\tif (ivs.atk === 28 || ivs.atk === 24) ivs.hp = 14;\n\t\t\tif (ivs.def === 28 || ivs.def === 24) ivs.hp -= 8;\n\t\t}\n\n\t\tconst levelScale: {[k: string]: number} = {\n\t\t\tNU: 73,\n\t\t\tNUBL: 71,\n\t\t\tUU: 69,\n\t\t\tUUBL: 67,\n\t\t\tOU: 65,\n\t\t\tUber: 61,\n\t\t};\n\t\tconst customScale: {[k: string]: number} = {\n\t\t\tDitto: 83, Unown: 87, Wobbuffet: 83,\n\t\t};\n\t\tconst level = this.adjustLevel || customScale[species.name] || levelScale[species.tier] || 80;\n\n\t\treturn {\n\t\t\tname: species.name,\n\t\t\tspecies: species.name,\n\t\t\tmoves: Array.from(moves),\n\t\t\tability: 'No Ability',\n\t\t\tevs: {hp: 255, atk: 255, def: 255, spa: 255, spd: 255, spe: 255},\n\t\t\tivs,\n\t\t\titem: this.getItem('None', types, moves, counter, species),\n\t\t\tlevel,\n\t\t\t// No shiny chance because Gen 2 shinies have bad IVs\n\t\t\tshiny: false,\n\t\t\tgender: species.gender ? species.gender : 'M',\n\t\t};\n\t}\n}\n\nexport default RandomGen2Teams;\n","import {MoveCounter} from './gen8';\nimport {RandomGen2Teams} from './gen2';\nimport {Utils} from './utils';\nimport {\n\tMove,\n\tPokemonSet,\n\tRandomTeamsTypes,\n\tSpecies,\n\tStatID,\n\tStatsTable,\n} from '@pkmn/sim';\n\ninterface HackmonsCupEntry {\n\ttypes: string[];\n\tbaseStats: StatsTable;\n}\n\nexport class RandomGen1Teams extends RandomGen2Teams {\n\t// Challenge Cup or CC teams are basically fully random teams.\n\trandomCCTeam() {\n\t\tthis.enforceNoDirectCustomBanlistChanges();\n\n\t\tconst team = [];\n\n\t\tconst randomN = this.randomNPokemon(this.maxTeamSize, this.forceMonotype);\n\n\t\tfor (const pokemon of randomN) {\n\t\t\tconst species = this.dex.species.get(pokemon);\n\t\t\tconst learnset = this.dex.species.getLearnset(species.id);\n\n\t\t\t// Level balance: calculate directly from stats rather than using some silly lookup table.\n\t\t\tconst mbstmin = 1307;\n\t\t\tconst stats = species.baseStats;\n\n\t\t\t// Modified base stat total assumes 15 DVs, 255 EVs in every stat\n\t\t\tlet mbst = (stats[\"hp\"] * 2 + 30 + 63 + 100) + 10;\n\t\t\tmbst += (stats[\"atk\"] * 2 + 30 + 63 + 100) + 5;\n\t\t\tmbst += (stats[\"def\"] * 2 + 30 + 63 + 100) + 5;\n\t\t\tmbst += (stats[\"spa\"] * 2 + 30 + 63 + 100) + 5;\n\t\t\tmbst += (stats[\"spd\"] * 2 + 30 + 63 + 100) + 5;\n\t\t\tmbst += (stats[\"spe\"] * 2 + 30 + 63 + 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 + 30 + 63 + 100) * level / 100 + 10);\n\t\t\t\t\t// Since damage is roughly proportional to lvl\n\t\t\t\t\tmbst += Math.floor(((stats[\"atk\"] * 2 + 30 + 63 + 100) * level / 100 + 5) * level / 100);\n\t\t\t\t\tmbst += Math.floor((stats[\"def\"] * 2 + 30 + 63 + 100) * level / 100 + 5);\n\t\t\t\t\tmbst += Math.floor(((stats[\"spa\"] * 2 + 30 + 63 + 100) * level / 100 + 5) * level / 100);\n\t\t\t\t\tmbst += Math.floor((stats[\"spd\"] * 2 + 30 + 63 + 100) * level / 100 + 5);\n\t\t\t\t\tmbst += Math.floor((stats[\"spe\"] * 2 + 30 + 63 + 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 DVs.\n\t\t\tconst ivs = {\n\t\t\t\thp: 0,\n\t\t\t\tatk: this.random(16),\n\t\t\t\tdef: this.random(16),\n\t\t\t\tspa: this.random(16),\n\t\t\t\tspd: 0,\n\t\t\t\tspe: this.random(16),\n\t\t\t};\n\t\t\tivs[\"hp\"] = (ivs[\"atk\"] % 2) * 16 + (ivs[\"def\"] % 2) * 8 + (ivs[\"spe\"] % 2) * 4 + (ivs[\"spa\"] % 2) * 2;\n\t\t\tivs[\"atk\"] *= 2;\n\t\t\tivs[\"def\"] *= 2;\n\t\t\tivs[\"spa\"] *= 2;\n\t\t\tivs[\"spd\"] = ivs[\"spa\"];\n\t\t\tivs[\"spe\"] *= 2;\n\n\t\t\t// Maxed EVs.\n\t\t\tconst evs = {hp: 255, atk: 255, def: 255, spa: 255, spd: 255, spe: 255};\n\n\t\t\t// Four random unique moves from movepool. don't worry about \"attacking\" or \"viable\".\n\t\t\t// Since Gens 1 and 2 learnsets are shared, we need to weed out Gen 2 moves.\n\t\t\tconst pool: string[] = [];\n\t\t\tif (learnset) {\n\t\t\t\tfor (const move in learnset) {\n\t\t\t\t\tif (this.dex.moves.get(move).gen !== 1) continue;\n\t\t\t\t\tif (learnset[move].some(learned => learned.startsWith('1'))) {\n\t\t\t\t\t\tpool.push(move);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tteam.push({\n\t\t\t\tname: species.baseSpecies,\n\t\t\t\tspecies: species.name,\n\t\t\t\tmoves: this.multipleSamplesNoReplace(pool, 4),\n\t\t\t\tgender: false,\n\t\t\t\tability: 'No Ability',\n\t\t\t\tevs: evs,\n\t\t\t\tivs: ivs,\n\t\t\t\titem: '',\n\t\t\t\tlevel,\n\t\t\t\thappiness: 0,\n\t\t\t\tshiny: false,\n\t\t\t\tnature: 'Serious',\n\t\t\t});\n\t\t}\n\n\t\treturn team;\n\t}\n\n\t// Random team generation for Gen 1 Random Battles.\n\trandomTeam() {\n\t\tthis.enforceNoDirectCustomBanlistChanges();\n\n\t\t// Get what we need ready.\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 typePool = this.dex.types.names();\n\t\tconst type = this.forceMonotype || this.sample(typePool);\n\n\t\t/** Pokémon that are not wholly incompatible with the team, but still pretty bad */\n\t\tconst rejectedButNotInvalidPool: string[] = [];\n\t\tconst nuTiers = ['UU', 'UUBL', 'NFE', 'LC', 'NU'];\n\t\tconst uuTiers = ['NFE', 'UU', 'UUBL', 'NU'];\n\n\t\t// Now let's store what we are getting.\n\t\tconst typeCount: {[k: string]: number} = {};\n\t\tconst weaknessCount: {[k: string]: number} = {Electric: 0, Psychic: 0, Water: 0, Ice: 0, Ground: 0};\n\t\tlet uberCount = 0;\n\t\tlet nuCount = 0;\n\n\t\tconst pokemonPool = this.getPokemonPool(type, pokemon, isMonotype);\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 || !species.randomBattleMoves) continue;\n\t\t\t// Only one Ditto is allowed per battle in Generation 1,\n\t\t\t// as it can cause an endless battle if two Dittos are forced\n\t\t\t// to face each other.\n\t\t\tif (species.id === 'ditto' && this.battleHasDitto) continue;\n\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\tconst tier = species.tier;\n\t\t\tswitch (tier) {\n\t\t\tcase 'LC':\n\t\t\tcase 'NFE':\n\t\t\t\t// Don't add pre-evo mon if already 4 or more non-OUs\n\t\t\t\t// Regardless, pre-evo mons are slightly less common.\n\t\t\t\tif (nuCount >= 4 * limitFactor || this.randomChance(1, 3)) continue;\n\t\t\t\tbreak;\n\t\t\tcase 'Uber':\n\t\t\t\t// Only allow a single Uber.\n\t\t\t\tif (uberCount >= 1 * limitFactor) continue;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t// OUs are fine. Otherwise 50% chance to skip mon if already 4 or more non-OUs.\n\t\t\t\tif (uuTiers.includes(tier) && pokemonPool.length > 1 && (nuCount >= 4 * limitFactor && this.randomChance(1, 2))) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet skip = false;\n\n\t\t\tif (!isMonotype && !this.forceMonotype) {\n\t\t\t\t// Limit 2 of any type as well. Diversity and minor weakness count.\n\t\t\t\t// The second of a same type has halved chance of being added.\n\t\t\t\tfor (const typeName of species.types) {\n\t\t\t\t\tif (typeCount[typeName] >= 2 * limitFactor ||\n\t\t\t\t\t\t(typeCount[typeName] >= 1 * limitFactor && this.randomChance(1, 2) && pokemonPool.length > 1)) {\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\n\t\t\t\tif (skip) {\n\t\t\t\t\trejectedButNotInvalidPool.push(species.id);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// We need a weakness count of spammable attacks to avoid being swept by those.\n\t\t\t// Spammable attacks are: Thunderbolt, Psychic, Surf, Blizzard, Earthquake.\n\t\t\tconst pokemonWeaknesses = [];\n\t\t\tfor (const typeName in weaknessCount) {\n\t\t\t\tconst increaseCount = this.dex.getImmunity(typeName, species) && this.dex.getEffectiveness(typeName, species) > 0;\n\t\t\t\tif (!increaseCount) continue;\n\t\t\t\tif (weaknessCount[typeName] >= 2 * limitFactor) {\n\t\t\t\t\tskip = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tpokemonWeaknesses.push(typeName);\n\t\t\t}\n\n\t\t\tif (skip) {\n\t\t\t\trejectedButNotInvalidPool.push(species.id);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// The set passes the limitations.\n\t\t\tpokemon.push(this.randomSet(species));\n\n\t\t\t// Now let's increase the counters.\n\t\t\t// Type counter.\n\t\t\tfor (const typeName of species.types) {\n\t\t\t\tif (typeCount[typeName]) {\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\n\t\t\t// Weakness counter.\n\t\t\tfor (const weakness of pokemonWeaknesses) {\n\t\t\t\tweaknessCount[weakness]++;\n\t\t\t}\n\n\t\t\t// Increment tier bias counters.\n\t\t\tif (tier === 'Uber') {\n\t\t\t\tuberCount++;\n\t\t\t} else if (nuTiers.includes(tier)) {\n\t\t\t\tnuCount++;\n\t\t\t}\n\n\t\t\t// Ditto check\n\t\t\tif (species.id === 'ditto') this.battleHasDitto = true;\n\t\t}\n\n\t\t// if we don't have enough Pokémon, go back to rejects, which are already known to not be invalid.\n\t\twhile (pokemon.length < this.maxTeamSize && rejectedButNotInvalidPool.length) {\n\t\t\tconst species = this.sampleNoReplace(rejectedButNotInvalidPool);\n\t\t\tpokemon.push(this.randomSet(species));\n\t\t}\n\n\t\tif (pokemon.length < this.maxTeamSize && pokemon.length < 12 && !isMonotype) {\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\tshouldCullMove(move: Move, types: Set<string>, moves: Set<string>, counter: MoveCounter): {cull: boolean} {\n\t\tswitch (move.id) {\n\t\t// bit redundant to have both, but neither particularly better than the other\n\t\tcase 'hydropump':\n\t\t\treturn {cull: moves.has('surf')};\n\t\tcase 'surf':\n\t\t\treturn {cull: moves.has('hydropump')};\n\n\t\t// other redundancies that aren't handled within the movesets themselves\n\t\tcase 'selfdestruct':\n\t\t\treturn {cull: moves.has('rest')};\n\t\tcase 'rest':\n\t\t\treturn {cull: moves.has('selfdestruct')};\n\t\tcase 'sharpen': case 'swordsdance':\n\t\t\treturn {cull: counter.get('Special') > counter.get('Physical') || !counter.get('Physical') || moves.has('growth')};\n\t\tcase 'growth':\n\t\t\treturn {cull: counter.get('Special') < counter.get('Physical') || !counter.get('Special') || moves.has('swordsdance')};\n\t\tcase 'poisonpowder': case 'stunspore': case 'sleeppowder': case 'toxic':\n\t\t\treturn {cull: counter.get('Status') > 1};\n\t\t}\n\t\treturn {cull: false};\n\t}\n\n\t/**\n\t * Random set generation for Gen 1 Random Battles.\n\t */\n\trandomSet(species: string | Species): RandomTeamsTypes.RandomSet {\n\t\tspecies = this.dex.species.get(species);\n\t\tif (!species.exists) species = this.dex.species.get('pikachu'); // Because Gen 1.\n\n\t\tconst movePool = species.randomBattleMoves ? species.randomBattleMoves.slice() : [];\n\t\tconst moves = new Set<string>();\n\t\tconst types = new Set(species.types);\n\n\t\tconst counter = new MoveCounter();\n\n\t\t// Moves that boost Attack:\n\t\tconst PhysicalSetup = ['swordsdance', 'sharpen'];\n\t\t// Moves which boost Special Attack:\n\t\tconst SpecialSetup = ['amnesia', 'growth'];\n\n\t\t// Either add all moves or add none\n\t\tif (species.comboMoves && species.comboMoves.length <= this.maxMoveCount && this.randomChance(1, 2)) {\n\t\t\tfor (const m of species.comboMoves) moves.add(m);\n\t\t}\n\n\t\t// Add one of the semi-mandatory moves\n\t\t// Often, these are used so that the Pokemon only gets one of the less useful moves\n\t\tif (moves.size < this.maxMoveCount && species.exclusiveMoves) {\n\t\t\tmoves.add(this.sample(species.exclusiveMoves));\n\t\t}\n\n\t\t// Add the mandatory move. SD Mew and Amnesia Snorlax are exceptions.\n\t\tif (moves.size < this.maxMoveCount && species.essentialMove) {\n\t\t\tmoves.add(species.essentialMove);\n\t\t}\n\n\t\twhile (moves.size < this.maxMoveCount && movePool.length) {\n\t\t\t// Choose next 4 moves from learnset/viable moves and add them to moves list:\n\t\t\twhile (moves.size < this.maxMoveCount && movePool.length) {\n\t\t\t\tconst moveid = this.sampleNoReplace(movePool);\n\t\t\t\tmoves.add(moveid);\n\t\t\t}\n\n\t\t\t// Only do move choosing if we have backup moves in the pool...\n\t\t\tif (movePool.length) {\n\t\t\t\tfor (const setMoveid of moves) {\n\t\t\t\t\tconst move = this.dex.moves.get(setMoveid);\n\t\t\t\t\tconst moveid = move.id;\n\t\t\t\t\tif (!move.damage && !move.damageCallback) counter.add(move.category);\n\t\t\t\t\tif (PhysicalSetup.includes(moveid)) counter.add('physicalsetup');\n\t\t\t\t\tif (SpecialSetup.includes(moveid)) counter.add('specialsetup');\n\t\t\t\t}\n\n\t\t\t\tfor (const moveid of moves) {\n\t\t\t\t\tif (moveid === species.essentialMove) continue;\n\t\t\t\t\tconst move = this.dex.moves.get(moveid);\n\t\t\t\t\tif (\n\t\t\t\t\t\t(!species.essentialMove || moveid !== species.essentialMove) &&\n\t\t\t\t\t\tthis.shouldCullMove(move, types, moves, counter).cull\n\t\t\t\t\t) {\n\t\t\t\t\t\tmoves.delete(moveid);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcounter.add(move.category);\n\t\t\t\t}\n\t\t\t} // End of the check for more than 4 moves on moveset.\n\t\t}\n\n\t\tconst levelScale: {[k: string]: number} = {\n\t\t\tLC: 88,\n\t\t\tNFE: 80,\n\t\t\tPU: 77,\n\t\t\tNU: 77,\n\t\t\tNUBL: 76,\n\t\t\tUU: 74,\n\t\t\tUUBL: 71,\n\t\t\tOU: 68,\n\t\t\tUber: 65,\n\t\t};\n\n\t\tconst customScale: {[k: string]: number} = {\n\t\t\tMewtwo: 62,\n\t\t\tCaterpie: 100, Metapod: 100, Weedle: 100, Kakuna: 100, Magikarp: 100,\n\t\t\tDitto: 88,\n\t\t};\n\t\tconst level = this.adjustLevel || customScale[species.name] || levelScale[species.tier] || 80;\n\n\t\treturn {\n\t\t\tname: species.name,\n\t\t\tspecies: species.name,\n\t\t\tmoves: Array.from(moves),\n\t\t\tability: 'No Ability',\n\t\t\tevs: {hp: 255, atk: 255, def: 255, spa: 255, spd: 255, spe: 255},\n\t\t\tivs: {hp: 30, atk: 30, def: 30, spa: 30, spd: 30, spe: 30},\n\t\t\titem: '',\n\t\t\tlevel,\n\t\t\tshiny: false,\n\t\t\tgender: false,\n\t\t};\n\t}\n\n\trandomHCTeam(): PokemonSet[] {\n\t\tthis.enforceNoDirectCustomBanlistChanges();\n\n\t\tconst team = [];\n\n\t\tconst movePool = [...this.dex.moves.all()];\n\t\tconst typesPool = ['Bird', ...this.dex.types.names()];\n\n\t\tconst randomN = this.randomNPokemon(this.maxTeamSize);\n\t\tconst hackmonsCup: {[k: string]: HackmonsCupEntry} = {};\n\n\t\tfor (const forme of randomN) {\n\t\t\t// Choose forme\n\t\t\tconst species = this.dex.species.get(forme);\n\t\t\tif (!hackmonsCup[species.id]) {\n\t\t\t\thackmonsCup[species.id] = {\n\t\t\t\t\ttypes: [this.sample(typesPool), this.sample(typesPool)],\n\t\t\t\t\tbaseStats: {\n\t\t\t\t\t\thp: Utils.clampIntRange(this.random(256), 1),\n\t\t\t\t\t\tatk: Utils.clampIntRange(this.random(256), 1),\n\t\t\t\t\t\tdef: Utils.clampIntRange(this.random(256), 1),\n\t\t\t\t\t\tspa: Utils.clampIntRange(this.random(256), 1),\n\t\t\t\t\t\tspd: 0,\n\t\t\t\t\t\tspe: Utils.clampIntRange(this.random(256), 1),\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tif (this.forceMonotype && !hackmonsCup[species.id].types.includes(this.forceMonotype)) {\n\t\t\t\t\thackmonsCup[species.id].types[1] = this.forceMonotype;\n\t\t\t\t}\n\t\t\t\thackmonsCup[species.id].baseStats.spd = hackmonsCup[species.id].baseStats.spa;\n\t\t\t}\n\t\t\tif (hackmonsCup[species.id].types[0] === hackmonsCup[species.id].types[1]) {\n\t\t\t\thackmonsCup[species.id].types.splice(1, 1);\n\t\t\t}\n\n\t\t\t// Random unique moves\n\t\t\tconst moves = [];\n\t\t\tdo {\n\t\t\t\tconst move = this.sampleNoReplace(movePool);\n\t\t\t\tif (move.gen <= this.gen && !move.isNonstandard && !move.name.startsWith('Hidden Power ')) {\n\t\t\t\t\tmoves.push(move.id);\n\t\t\t\t}\n\t\t\t} while (moves.length < this.maxMoveCount);\n\n\t\t\t// Random EVs\n\t\t\tconst evs = {\n\t\t\t\thp: this.random(256),\n\t\t\t\tatk: this.random(256),\n\t\t\t\tdef: this.random(256),\n\t\t\t\tspa: this.random(256),\n\t\t\t\tspd: 0,\n\t\t\t\tspe: this.random(256),\n\t\t\t};\n\t\t\tevs['spd'] = evs['spa'];\n\n\t\t\t// Random DVs\n\t\t\tconst ivs: StatsTable = {\n\t\t\t\thp: 0,\n\t\t\t\tatk: this.random(16),\n\t\t\t\tdef: this.random(16),\n\t\t\t\tspa: this.random(16),\n\t\t\t\tspd: 0,\n\t\t\t\tspe: this.random(16),\n\t\t\t};\n\t\t\tivs[\"hp\"] = (ivs[\"atk\"] % 2) * 16 + (ivs[\"def\"] % 2) * 8 + (ivs[\"spe\"] % 2) * 4 + (ivs[\"spa\"] % 2) * 2;\n\t\t\tfor (const iv in ivs) {\n\t\t\t\tif (iv === 'hp' || iv === 'spd') continue;\n\t\t\t\tivs[iv as keyof StatsTable] *= 2;\n\t\t\t}\n\t\t\tivs['spd'] = ivs['spa'];\n\n\t\t\t// Level balance\n\t\t\tconst mbstmin = 425;\n\t\t\tconst baseStats = hackmonsCup[species.id].baseStats;\n\t\t\tconst calcStat = (statName: StatID, lvl?: number) => {\n\t\t\t\tif (lvl) {\n\t\t\t\t\treturn Math.floor(Math.floor(2 * baseStats[statName] + ivs[statName] + Math.floor(evs[statName] / 4)) * lvl / 100 + 5);\n\t\t\t\t}\n\t\t\t\treturn Math.floor(2 * baseStats[statName] + ivs[statName] + Math.floor(evs[statName] / 4)) + 5;\n\t\t\t};\n\t\t\tlet mbst = 0;\n\t\t\tfor (const statName of Object.keys(baseStats)) {\n\t\t\t\tmbst += calcStat(statName as StatID);\n\t\t\t\tif (statName === 'hp') mbst += 5;\n\t\t\t}\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\tfor (const statName of Object.keys(baseStats)) {\n\t\t\t\t\t\tmbst += calcStat(statName as StatID, level);\n\t\t\t\t\t\tif (statName === 'hp') mbst += 5;\n\t\t\t\t\t}\n\t\t\t\t\tif (mbst >= mbstmin) break;\n\t\t\t\t\tlevel++;\n\t\t\t\t}\n\t\t\t\tif (level > 100) level = 100;\n\t\t\t}\n\n\t\t\tteam.push({\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: 'No Ability',\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\tshiny: false,\n\t\t\t\t// Hacky but the only way to communicate stats/level generation properly\n\t\t\t\thc: hackmonsCup[species.id],\n\t\t\t});\n\t\t}\n\n\t\treturn team;\n\t}\n}\n\nexport default RandomGen1Teams;\n","import {Utils} from './utils';\nimport {\n\tAbility,\n\tAnyObject,\n\tBasicEffect,\n\tFormat,\n\tItem,\n\tModdedDex,\n\tMove,\n\tNature,\n\tPRNG,\n\tPRNGSeed,\n\tPlayerOptions,\n\tPokemonSet,\n\tRandomTeamsTypes,\n\tRuleTable,\n\tSpecies,\n\tStatID,\n\tStatsTable,\n\tTags,\n\ttoID,\n} from '@pkmn/sim';\nimport * as randomSetsJSON from './data/gen9.json';\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}\ninterface BattleFactorySet {\n\tspecies: string;\n\titem: string;\n\tability: string;\n\tnature: string;\n\tmoves: string[];\n\tevs?: Partial<StatsTable>;\n\tivs?: Partial<StatsTable>;\n}\nexport class MoveCounter extends Utils.Multiset<string> {\n\tdamagingMoves: Set<Move>;\n\tstabCounter: number;\n\tironFist: number;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.damagingMoves = new Set();\n\t\tthis.stabCounter = 0;\n\t\tthis.ironFist = 0;\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<string>, abilities: Set<string>, types: string[],\n\tcounter: MoveCounter, species: Species, teamDetails: RandomTeamsTypes.TeamDetails,\n\tisLead: boolean, isDoubles: boolean, teraType: string, role: string,\n) => boolean;\n\n// Moves that restore HP:\nconst RecoveryMove = [\n\t'healorder', 'milkdrink', 'moonlight', 'morningsun', 'recover', 'roost', 'shoreup', 'slackoff', 'softboiled', 'strengthsap', 'synthesis',\n];\n// Moves that drop stats:\nconst ContraryMoves = [\n\t'armorcannon', 'closecombat', 'leafstorm', 'makeitrain', 'overheat', 'spinout', 'superpower', 'vcreate',\n];\n// Moves that boost Attack:\nconst PhysicalSetup = [\n\t'bellydrum', 'bulkup', 'coil', 'curse', 'dragondance', 'honeclaws', 'howl', 'meditate', 'poweruppunch', 'swordsdance', 'tidyup',\n];\n// Moves which boost Special Attack:\nconst SpecialSetup = [\n\t'calmmind', 'chargebeam', 'geomancy', 'nastyplot', 'quiverdance', 'tailglow', 'torchsong',\n];\n// Moves that boost Attack AND Special Attack:\nconst MixedSetup = [\n\t'clangoroussoul', 'growth', 'happyhour', 'holdhands', 'noretreat', 'shellsmash', 'workup',\n];\n// Some moves that only boost Speed:\nconst SpeedSetup = [\n\t'agility', 'autotomize', 'rockpolish',\n];\n// Conglomerate for ease of access\nconst Setup = [\n\t'acidarmor', 'agility', 'autotomize', 'bellydrum', 'bulkup', 'calmmind', 'coil', 'curse', 'dragondance', 'flamecharge',\n\t'growth', 'honeclaws', 'howl', 'irondefense', 'meditate', 'nastyplot', 'noretreat', 'poweruppunch', 'quiverdance', 'rockpolish',\n\t'shellsmash', 'shiftgear', 'swordsdance', 'tailglow', 'tidyup', 'trailblaze', 'workup',\n];\n// Moves that shouldn't be the only STAB moves:\nconst NoStab = [\n\t'accelerock', 'aquajet', 'beakblast', 'bounce', 'breakingswipe', 'chatter', 'chloroblast', 'clearsmog', 'dragontail', 'eruption',\n\t'explosion', 'fakeout', 'flamecharge', 'flipturn', 'iceshard', 'icywind', 'incinerate', 'machpunch',\n\t'meteorbeam', 'mortalspin', 'pluck', 'pursuit', 'quickattack', 'reversal', 'saltcure', 'selfdestruct', 'shadowsneak', 'skydrop',\n\t'snarl', 'steelbeam', 'suckerpunch', 'uturn', 'watershuriken', 'vacuumwave', 'voltswitch', 'waterspout',\n];\n// Hazard-setting moves\nconst Hazards = [\n\t'spikes', 'stealthrock', 'stickyweb', 'toxicspikes',\n];\n\n// Moves that should be paired together when possible\nconst MovePairs = [\n\t['lightscreen', 'reflect'],\n\t['sleeptalk', 'rest'],\n\t['protect', 'wish'],\n];\n\nfunction sereneGraceBenefits(move: Move) {\n\treturn move.secondary?.chance && move.secondary.chance >= 20 && move.secondary.chance < 100;\n}\n\nexport class RandomTeams {\n\tdex: ModdedDex;\n\tgen: number;\n\tfactoryTier: string;\n\tformat: Format;\n\tprng: PRNG;\n\tnoStab: string[];\n\treadonly maxTeamSize: number;\n\treadonly adjustLevel: number | null;\n\treadonly maxMoveCount: number;\n\treadonly forceMonotype: string | undefined;\n\n\t/**\n\t * Checkers for move enforcement based on types or other factors\n\t *\n\t * returns true to try to force the move type, false otherwise.\n\t */\n\tmoveEnforcementCheckers: {[k: string]: MoveEnforcementChecker};\n\n\tconstructor(dex: ModdedDex, format: Format, prng: PRNG | PRNGSeed | null) {\n\t\tthis.dex = dex;\n\t\tthis.gen = this.dex.gen;\n\t\tthis.noStab = NoStab;\n\n\t\tconst ruleTable = this.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\tBug: (movePool) => movePool.includes('megahorn'),\n\t\t\tDark: (movePool, moves, abilities, types, counter) => !counter.get('Dark'),\n\t\t\tDragon: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!counter.get('Dragon') &&\n\t\t\t\t!movePool.includes('dualwingbeat')\n\t\t\t),\n\t\t\tElectric: (movePool, moves, abilities, types, counter) => !counter.get('Electric'),\n\t\t\tFairy: (movePool, moves, abilities, types, counter) => !counter.get('Fairy'),\n\t\t\tFighting: (movePool, moves, abilities, types, counter) => !counter.get('Fighting'),\n\t\t\tFire: (movePool, moves, abilities, types, counter, species) => !counter.get('Fire'),\n\t\t\tFlying: (movePool, moves, abilities, types, counter) => !counter.get('Flying'),\n\t\t\tGhost: (movePool, moves, abilities, types, counter) => !counter.get('Ghost'),\n\t\t\tGrass: (movePool, moves, abilities, types, counter, species) => {\n\t\t\t\tif (movePool.includes('leafstorm')) return true;\n\t\t\t\treturn !counter.get('Grass') &&\n\t\t\t\t\t(species.baseStats.atk >= 100 || types.includes('Electric') || abilities.has('Seed Sower'));\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) => !counter.get('Ice'),\n\t\t\tNormal: (movePool, moves, abilities, types, counter) => (movePool.includes('boomburst')),\n\t\t\tPoison: (movePool, moves, abilities, types, counter) => {\n\t\t\t\tif (types.includes('Ground')) return false;\n\t\t\t\treturn !counter.get('Poison');\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 (movePool.includes('calmmind') || movePool.includes('psychicfangs') || movePool.includes('psychocut')) return true;\n\t\t\t\treturn abilities.has('Psychic Surge') || types.includes('Fire');\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\treturn !counter.get('Steel');\n\t\t\t},\n\t\t\tWater: (movePool, moves, abilities, types, counter, species) => {\n\t\t\t\tif (species.id === 'quagsire') return false;\n\t\t\t\treturn !counter.get('Water');\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<T>(items: readonly T[]): T {\n\t\treturn this.prng.sample(items);\n\t}\n\n\tsampleIfArray<T>(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<T>(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\tqueryMoves(\n\t\tmoves: Set<string> | null,\n\t\ttypes: string[],\n\t\tteraType: string,\n\t\tabilities: Set<string> = new Set(),\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\tconst move = this.dex.moves.get(moveid);\n\n\t\t\tlet moveType = move.type;\n\t\t\tif (['judgment', 'revelationdance'].includes(moveid)) moveType = types[0];\n\t\t\tif (moveType === 'Normal') {\n\t\t\t\tif (abilities.has('Aerilate')) moveType = 'Flying';\n\t\t\t\tif (abilities.has('Galvanize')) moveType = 'Electric';\n\t\t\t\tif (abilities.has('Pixilate')) moveType = 'Fairy';\n\t\t\t\tif (abilities.has('Refrigerate')) moveType = 'Ice';\n\t\t\t}\n\t\t\tif (moveid === 'terablast') moveType = teraType;\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:\n\t\t\tif (move.basePower > 30 || move.multihit || move.basePowerCallback) {\n\t\t\t\tif (!this.noStab.includes(moveid)) {\n\t\t\t\t\tcounter.add(moveType);\n\t\t\t\t\tif (types.includes(moveType)) counter.stabCounter++;\n\t\t\t\t\tif (teraType === moveType) counter.add('stabtera');\n\t\t\t\t}\n\t\t\t\tif (move.flags['bite']) counter.add('strongjaw');\n\t\t\t\tif (move.flags['punch']) counter.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 || move.hasSheerForce) {\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 (RecoveryMove.includes(moveid)) counter.add('recovery');\n\t\t\tif (ContraryMoves.includes(moveid)) counter.add('contrary');\n\t\t\tif (PhysicalSetup.includes(moveid)) counter.add('physicalsetup');\n\t\t\tif (SpecialSetup.includes(moveid)) counter.add('specialsetup');\n\t\t\tif (MixedSetup.includes(moveid)) counter.add('mixedsetup');\n\t\t\tif (SpeedSetup.includes(moveid)) counter.add('speedsetup');\n\t\t\tif (Setup.includes(moveid)) counter.add('setup');\n\t\t\tif (Hazards.includes(moveid)) counter.add('hazards');\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\t\treturn counter;\n\t}\n\n\tcullMovePool(\n\t\ttypes: string[],\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\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\tteraType: string,\n\t\trole: string,\n\t): void {\n\t\tif (moves.size + movePool.length <= this.maxMoveCount) return;\n\t\t// If we have two unfilled moves and only one unpaired move, cull the unpaired move.\n\t\tif (moves.size === this.maxMoveCount - 2) {\n\t\t\tconst unpairedMoves = [...movePool];\n\t\t\tfor (const pair of MovePairs) {\n\t\t\t\tif (movePool.includes(pair[0]) && movePool.includes(pair[1])) {\n\t\t\t\t\tthis.fastPop(unpairedMoves, unpairedMoves.indexOf(pair[0]));\n\t\t\t\t\tthis.fastPop(unpairedMoves, unpairedMoves.indexOf(pair[1]));\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (unpairedMoves.length === 1) {\n\t\t\t\tthis.fastPop(movePool, movePool.indexOf(unpairedMoves[0]));\n\t\t\t}\n\t\t}\n\n\t\t// These moves are paired, and shouldn't appear if there is not room for them both.\n\t\tif (moves.size === this.maxMoveCount - 1) {\n\t\t\tfor (const pair of MovePairs) {\n\t\t\t\tif (movePool.includes(pair[0]) && movePool.includes(pair[1])) {\n\t\t\t\t\tthis.fastPop(movePool, movePool.indexOf(pair[0]));\n\t\t\t\t\tthis.fastPop(movePool, movePool.indexOf(pair[1]));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Develop additional move lists\n\t\tconst pivotingMoves = ['chillyreception', 'flipturn', 'partingshot', 'shedtail', 'teleport', 'uturn', 'voltswitch'];\n\t\tconst statusMoves = this.dex.moves.all()\n\t\t\t.filter(move => move.category === 'Status')\n\t\t\t.map(move => move.id);\n\t\tconst magnezoneMoves = ['bodypress', 'mirrorcoat', 'steelbeam'];\n\n\t\t// Team-based move culls\n\t\tif (teamDetails.stealthRock) {\n\t\t\tif (movePool.includes('stealthrock')) this.fastPop(movePool, movePool.indexOf('stealthrock'));\n\t\t}\n\t\tif (moves.size + movePool.length <= this.maxMoveCount) return;\n\t\tif (teamDetails.defog || teamDetails.rapidSpin) {\n\t\t\tif (movePool.includes('defog')) this.fastPop(movePool, movePool.indexOf('defog'));\n\t\t\tif (movePool.includes('rapidspin')) this.fastPop(movePool, movePool.indexOf('rapidspin'));\n\t\t}\n\t\tif (teamDetails.stickyWeb) {\n\t\t\tif (movePool.includes('stickyweb')) this.fastPop(movePool, movePool.indexOf('stickyweb'));\n\t\t}\n\n\t\t// These moves don't mesh well with other aspects of the set\n\t\tif (species.id !== \"spidops\") {\n\t\t\tthis.incompatibleMoves(moves, movePool, statusMoves, ['healingwish', 'memento', 'switcheroo', 'trick']);\n\t\t}\n\t\tif (species.id !== \"scyther\" && species.id !== \"scizor\") {\n\t\t\tthis.incompatibleMoves(moves, movePool, Setup, pivotingMoves);\n\t\t}\n\t\tthis.incompatibleMoves(moves, movePool, Setup, Hazards);\n\t\tthis.incompatibleMoves(moves, movePool, Setup, ['defog', 'nuzzle', 'toxic', 'waterspout', 'yawn']);\n\t\tthis.incompatibleMoves(moves, movePool, PhysicalSetup, PhysicalSetup);\n\t\tthis.incompatibleMoves(moves, movePool, SpecialSetup, 'thunderwave');\n\t\tthis.incompatibleMoves(moves, movePool, 'substitute', pivotingMoves);\n\t\tthis.incompatibleMoves(moves, movePool, SpeedSetup, ['aquajet', 'rest', 'trickroom']);\n\t\tthis.incompatibleMoves(moves, movePool, 'curse', 'rapidspin');\n\t\tthis.incompatibleMoves(moves, movePool, 'dragondance', 'dracometeor');\n\n\n\t\t// These attacks are redundant with each other\n\t\tthis.incompatibleMoves(moves, movePool, 'psychic', 'psyshock');\n\t\tthis.incompatibleMoves(moves, movePool, 'surf', 'hydropump');\n\t\tthis.incompatibleMoves(moves, movePool, 'wavecrash', 'liquidation');\n\t\tthis.incompatibleMoves(moves, movePool, 'freezedry', 'icebeam');\n\t\tthis.incompatibleMoves(moves, movePool, ['airslash', 'bravebird', 'hurricane'], ['airslash', 'bravebird', 'hurricane']);\n\t\tthis.incompatibleMoves(moves, movePool, 'knockoff', 'foulplay');\n\t\tthis.incompatibleMoves(moves, movePool, 'doubleedge', 'headbutt');\n\t\tthis.incompatibleMoves(moves, movePool, 'fireblast', ['fierydance', 'flamethrower']);\n\t\tthis.incompatibleMoves(moves, movePool, 'lavaplume', 'magmastorm');\n\t\tthis.incompatibleMoves(moves, movePool, 'thunderpunch', 'wildcharge');\n\t\tthis.incompatibleMoves(moves, movePool, 'gunkshot', ['direclaw', 'poisonjab']);\n\t\tthis.incompatibleMoves(moves, movePool, 'aurasphere', 'focusblast');\n\t\tthis.incompatibleMoves(moves, movePool, 'closecombat', 'drainpunch');\n\t\tthis.incompatibleMoves(moves, movePool, 'bugbite', 'pounce');\n\t\tthis.incompatibleMoves(moves, movePool, 'bittermalice', 'shadowball');\n\t\tthis.incompatibleMoves(moves, movePool, ['dragonpulse', 'spacialrend'], 'dracometeor');\n\n\n\t\t// These status moves are redundant with each other\n\t\tthis.incompatibleMoves(moves, movePool, ['taunt', 'strengthsap'], 'encore');\n\t\tthis.incompatibleMoves(moves, movePool, 'toxic', 'willowisp');\n\t\tthis.incompatibleMoves(moves, movePool, ['thunderwave', 'toxic', 'willowisp'], 'toxicspikes');\n\n\t\t// This space reserved for assorted hardcodes that otherwise make little sense out of context\n\t\t// Landorus\n\t\tthis.incompatibleMoves(moves, movePool, 'nastyplot', 'rockslide');\n\t\t// Persian and Seviper\n\t\tthis.incompatibleMoves(moves, movePool, 'switcheroo', ['fakeout', 'suckerpunch']);\n\t\t// Beartic\n\t\tthis.incompatibleMoves(moves, movePool, 'snowscape', 'swordsdance');\n\t\t// Cryogonal\n\t\tif (!teamDetails.defog && !teamDetails.rapidSpin && species.id === 'cryogonal') {\n\t\t\tthis.fastPop(movePool, movePool.indexOf('haze'));\n\t\t}\n\t\t// Magnezone\n\t\tthis.incompatibleMoves(moves, movePool, magnezoneMoves, magnezoneMoves);\n\t}\n\n\t// Checks for and removes incompatible moves, starting with the first move in movesA.\n\tincompatibleMoves(\n\t\tmoves: Set<string>,\n\t\tmovePool: string[],\n\t\tmovesA: string | string[],\n\t\tmovesB: string | string[],\n\t): void {\n\t\tconst moveArrayA = (Array.isArray(movesA)) ? movesA : [movesA];\n\t\tconst moveArrayB = (Array.isArray(movesB)) ? movesB : [movesB];\n\t\tif (moves.size + movePool.length <= this.maxMoveCount) return;\n\t\tfor (const moveid1 of moves) {\n\t\t\tif (moveArrayB.includes(moveid1)) {\n\t\t\t\tfor (const moveid2 of moveArrayA) {\n\t\t\t\t\tif (moveid1 !== moveid2 && movePool.includes(moveid2)) {\n\t\t\t\t\t\tthis.fastPop(movePool, movePool.indexOf(moveid2));\n\t\t\t\t\t\tif (moves.size + movePool.length <= this.maxMoveCount) return;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (moveArrayA.includes(moveid1)) {\n\t\t\t\tfor (const moveid2 of moveArrayB) {\n\t\t\t\t\tif (moveid1 !== moveid2 && movePool.includes(moveid2)) {\n\t\t\t\t\t\tthis.fastPop(movePool, movePool.indexOf(moveid2));\n\t\t\t\t\t\tif (moves.size + movePool.length <= this.maxMoveCount) return;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Adds a move to the moveset, returns the MoveCounter\n\taddMove(\n\t\tmove: string,\n\t\tmoves: Set<string>,\n\t\ttypes: string[],\n\t\tabilities: Set<string>,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tisLead: boolean,\n\t\tisDoubles: boolean,\n\t\tmovePool: string[],\n\t\tteraType: string,\n\t\trole: string,\n\t): MoveCounter {\n\t\tmoves.add(move);\n\t\tthis.fastPop(movePool, movePool.indexOf(move));\n\t\tconst counter = this.queryMoves(moves, species.types, teraType, abilities);\n\t\tthis.cullMovePool(types, moves, abilities, counter, movePool, teamDetails, species, isLead, isDoubles, teraType, role);\n\t\treturn counter;\n\t}\n\n\t// Generate random moveset for a given species, role, tera type.\n\trandomMoveset(\n\t\ttypes: string[],\n\t\tabilities: Set<string>,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tisLead: boolean,\n\t\tisDoubles: boolean,\n\t\tmovePool: string[],\n\t\tteraType: string,\n\t\trole: string,\n\t): Set<string> {\n\t\tconst moves = new Set<string>();\n\t\tlet counter = this.queryMoves(moves, species.types, teraType, abilities);\n\t\tthis.cullMovePool(types, moves, abilities, counter, movePool, teamDetails, species, isLead, isDoubles, teraType, role);\n\n\t\t// If there are only four moves, add all moves and return early\n\t\tif (movePool.length <= this.maxMoveCount) {\n\t\t\tfor (const moveid of movePool) {\n\t\t\t\tmoves.add(moveid);\n\t\t\t}\n\t\t\treturn moves;\n\t\t}\n\n\t\tconst runEnforcementChecker = (checkerName: string) => {\n\t\t\tif (!this.moveEnforcementCheckers[checkerName]) return false;\n\t\t\treturn this.moveEnforcementCheckers[checkerName](\n\t\t\t\tmovePool, moves, abilities, types, counter, species, teamDetails, isLead, isDoubles, teraType, role\n\t\t\t);\n\t\t};\n\n\t\tif (role === \"Tera Blast user\") {\n\t\t\tcounter = this.addMove('terablast', moves, types, abilities, teamDetails, species, isLead, isDoubles,\n\t\t\t\tmovePool, teraType, role);\n\t\t}\n\t\t// Add required move (e.g. Relic Song for Meloetta-P)\n\t\tif (species.requiredMove) {\n\t\t\tconst move = this.dex.moves.get(species.requiredMove).id;\n\t\t\tcounter = this.addMove(move, moves, types, abilities, teamDetails, species, isLead, isDoubles,\n\t\t\t\tmovePool, teraType, role);\n\t\t}\n\n\t\t// Add other moves you really want to have, e.g. STAB, recovery, setup, depending on role.\n\n\t\t// Enforce STAB\n\t\tfor (const type of types) {\n\t\t\t// Check if a STAB move of that type should be required\n\t\t\tif (runEnforcementChecker(type)) {\n\t\t\t\tconst stabMoves = [];\n\t\t\t\tfor (const moveid of movePool) {\n\t\t\t\t\tconst move = this.dex.moves.get(moveid);\n\t\t\t\t\tlet moveType = move.type;\n\t\t\t\t\tif (['judgment', 'revelationdance'].includes(moveid)) moveType = types[0];\n\t\t\t\t\tif (moveType === 'Normal') {\n\t\t\t\t\t\tif (abilities.has('Aerilate')) moveType = 'Flying';\n\t\t\t\t\t\tif (abilities.has('Galvanize')) moveType = 'Electric';\n\t\t\t\t\t\tif (abilities.has('Pixilate')) moveType = 'Fairy';\n\t\t\t\t\t\tif (abilities.has('Refrigerate')) moveType = 'Ice';\n\t\t\t\t\t}\n\t\t\t\t\tif (moveid === 'terablast') moveType = teraType;\n\t\t\t\t\tif (!this.noStab.includes(moveid) && (move.basePower > 30 || move.multihit || move.basePowerCallback)) {\n\t\t\t\t\t\tif (type === moveType) {\n\t\t\t\t\t\t\tstabMoves.push(moveid);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (stabMoves.length) {\n\t\t\t\t\tconst moveid = this.sample(stabMoves);\n\t\t\t\t\tcounter = this.addMove(moveid, moves, types, abilities, teamDetails, species, isLead, isDoubles,\n\t\t\t\t\t\tmovePool, teraType, role);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// If no STAB move was added in the previous step, add a STAB move\n\t\tif (!counter.stabCounter) {\n\t\t\tconst stabMoves = [];\n\t\t\tfor (const moveid of movePool) {\n\t\t\t\tconst move = this.dex.moves.get(moveid);\n\t\t\t\tlet moveType = move.type;\n\t\t\t\tif (['judgment', 'revelationdance'].includes(moveid)) moveType = types[0];\n\t\t\t\tif (moveType === 'Normal') {\n\t\t\t\t\tif (abilities.has('Aerilate')) moveType = 'Flying';\n\t\t\t\t\tif (abilities.has('Galvanize')) moveType = 'Electric';\n\t\t\t\t\tif (abilities.has('Pixilate')) moveType = 'Fairy';\n\t\t\t\t\tif (abilities.has('Refrigerate')) moveType = 'Ice';\n\t\t\t\t}\n\t\t\t\tif (moveid === 'terablast') moveType = teraType;\n\t\t\t\tif (!this.noStab.includes(moveid) && (move.basePower > 30 || move.multihit || move.basePowerCallback)) {\n\t\t\t\t\tif (types.includes(moveType)) {\n\t\t\t\t\t\tstabMoves.push(moveid);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (stabMoves.length) {\n\t\t\t\tconst moveid = this.sample(stabMoves);\n\t\t\t\tcounter = this.addMove(moveid, moves, types, abilities, teamDetails, species, isLead, isDoubles,\n\t\t\t\t\tmovePool, teraType, role);\n\t\t\t}\n\t\t}\n\n\t\t// Enforce Tera STAB\n\t\tif (!counter.get('stabtera') && role !== \"Bulky Support\") {\n\t\t\tconst stabMoves = [];\n\t\t\tfor (const moveid of movePool) {\n\t\t\t\tconst move = this.dex.moves.get(moveid);\n\t\t\t\tlet moveType = move.type;\n\t\t\t\tif (['judgment', 'revelationdance'].includes(moveid)) moveType = types[0];\n\t\t\t\tif (!this.noStab.includes(moveid) && (move.basePower > 30 || move.multihit || move.basePowerCallback)) {\n\t\t\t\t\tif (teraType === moveType) {\n\t\t\t\t\t\tstabMoves.push(moveid);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (stabMoves.length) {\n\t\t\t\tconst moveid = this.sample(stabMoves);\n\t\t\t\tcounter = this.addMove(moveid, moves, types, abilities, teamDetails, species, isLead, isDoubles,\n\t\t\t\t\tmovePool, teraType, role);\n\t\t\t}\n\t\t}\n\n\t\t// Enforce Facade if Guts is a possible ability\n\t\tif (movePool.includes('facade') && abilities.has('Guts')) {\n\t\t\tcounter = this.addMove('facade', moves, types, abilities, teamDetails, species, isLead, isDoubles,\n\t\t\t\tmovePool, teraType, role);\n\t\t}\n\n\t\t// Enforce Sticky Web\n\t\tif (movePool.includes('stickyweb')) {\n\t\t\tcounter = this.addMove('stickyweb', moves, types, abilities, teamDetails, species, isLead, isDoubles,\n\t\t\t\tmovePool, teraType, role);\n\t\t}\n\n\t\t// Enforce Revival Blessing\n\t\tif (movePool.includes('revivalblessing')) {\n\t\t\tcounter = this.addMove('revivalblessing', moves, types, abilities, teamDetails, species, isLead, isDoubles,\n\t\t\t\tmovePool, teraType, role);\n\t\t}\n\n\t\t// Enforce Toxic on Grafaiai\n\t\tif (movePool.includes('toxic') && species.id === 'grafaiai') {\n\t\t\tcounter = this.addMove('toxic', moves, types, abilities, teamDetails, species, isLead, isDoubles,\n\t\t\t\tmovePool, teraType, role);\n\t\t}\n\n\t\t// Enforce recovery\n\t\tif ([\"Bulky Support\", \"Bulky Attacker\", \"Bulky Setup\"].includes(role)) {\n\t\t\tconst recoveryMoves = movePool.filter(moveid => RecoveryMove.includes(moveid));\n\t\t\tif (recoveryMoves.length) {\n\t\t\t\tconst moveid = this.sample(recoveryMoves);\n\t\t\t\tcounter = this.addMove(moveid, moves, types, abilities, teamDetails, species, isLead, isDoubles,\n\t\t\t\t\tmovePool, teraType, role);\n\t\t\t}\n\t\t}\n\n\t\t// Enforce setup\n\t\tif (role.includes('Setup') || role === 'Tera Blast user') {\n\t\t\t// First, try to add a non-Speed setup move\n\t\t\tconst nonSpeedSetupMoves = movePool.filter(moveid => Setup.includes(moveid) && !SpeedSetup.includes(moveid));\n\t\t\tif (nonSpeedSetupMoves.length) {\n\t\t\t\tconst moveid = this.sample(nonSpeedSetupMoves);\n\t\t\t\tcounter = this.addMove(moveid, moves, types, abilities, teamDetails, species, isLead, isDoubles,\n\t\t\t\t\tmovePool, teraType, role);\n\t\t\t} else {\n\t\t\t\t// No non-Speed setup moves, so add any (Speed) setup move\n\t\t\t\tconst setupMoves = movePool.filter(moveid => Setup.includes(moveid));\n\t\t\t\tif (setupMoves.length) {\n\t\t\t\t\tconst moveid = this.sample(setupMoves);\n\t\t\t\t\tcounter = this.addMove(moveid, moves, types, abilities, teamDetails, species, isLead, isDoubles,\n\t\t\t\t\t\tmovePool, teraType, role);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Enforce coverage move\n\t\tif (!['AV Pivot', 'Fast Support', 'Bulky Support'].includes(role)) {\n\t\t\tif (counter.damagingMoves.size <= 1) {\n\t\t\t\t// Find the type of the current attacking move\n\t\t\t\tlet currentAttackType: string;\n\t\t\t\tfor (const moveid of moves) {\n\t\t\t\t\tconst move = this.dex.moves.get(moveid);\n\t\t\t\t\tif (move.basePower > 30 || move.multihit || move.basePowerCallback) {\n\t\t\t\t\t\tlet moveType = move.type;\n\t\t\t\t\t\tif (['judgment', 'revelationdance'].includes(moveid)) moveType = types[0];\n\t\t\t\t\t\tif (moveType === 'Normal') {\n\t\t\t\t\t\t\tif (abilities.has('Aerilate')) moveType = 'Flying';\n\t\t\t\t\t\t\tif (abilities.has('Galvanize')) moveType = 'Electric';\n\t\t\t\t\t\t\tif (abilities.has('Pixilate')) moveType = 'Fairy';\n\t\t\t\t\t\t\tif (abilities.has('Refrigerate')) moveType = 'Ice';\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (moveid === 'terablast') moveType = teraType;\n\t\t\t\t\t\tcurrentAttackType = move.type;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Choose an attacking move that is of different type to the current single attack\n\t\t\t\tconst coverageMoves = [];\n\t\t\t\tfor (const moveid of movePool) {\n\t\t\t\t\tconst move = this.dex.moves.get(moveid);\n\t\t\t\t\tlet moveType = move.type;\n\t\t\t\t\tif (['judgment', 'revelationdance'].includes(moveid)) moveType = types[0];\n\t\t\t\t\tif (moveType === 'Normal') {\n\t\t\t\t\t\tif (abilities.has('Aerilate')) moveType = 'Flying';\n\t\t\t\t\t\tif (abilities.has('Galvanize')) moveType = 'Electric';\n\t\t\t\t\t\tif (abilities.has('Pixilate')) moveType = 'Fairy';\n\t\t\t\t\t\tif (abilities.has('Refrigerate')) moveType = 'Ice';\n\t\t\t\t\t}\n\t\t\t\t\tif (!this.noStab.includes(moveid) && (move.basePower > 30 || move.multihit || move.basePowerCallback)) {\n\t\t\t\t\t\tif (currentAttackType! !== moveType) coverageMoves.push(moveid);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (coverageMoves.length) {\n\t\t\t\t\tconst moveid = this.sample(coverageMoves);\n\t\t\t\t\tcounter = this.addMove(moveid, moves, types, abilities, teamDetails, species, isLead, isDoubles,\n\t\t\t\t\t\tmovePool, teraType, role);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Enforce STAB priority\n\t\tif (role === 'Bulky Attacker' || role === 'Bulky Setup') {\n\t\t\tconst priorityMoves = [];\n\t\t\tfor (const moveid of movePool) {\n\t\t\t\tconst move = this.dex.moves.get(moveid);\n\t\t\t\tlet moveType = move.type;\n\t\t\t\tif (moveType === 'Normal') {\n\t\t\t\t\tif (abilities.has('Aerilate')) moveType = 'Flying';\n\t\t\t\t\tif (abilities.has('Galvanize')) moveType = 'Electric';\n\t\t\t\t\tif (abilities.has('Pixilate')) moveType = 'Fairy';\n\t\t\t\t\tif (abilities.has('Refrigerate')) moveType = 'Ice';\n\t\t\t\t}\n\t\t\t\tif (types.includes(moveType) && move.priority > 0 && move.category !== 'Status') {\n\t\t\t\t\tpriorityMoves.push(moveid);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (priorityMoves.length) {\n\t\t\t\tconst moveid = this.sample(priorityMoves);\n\t\t\t\tcounter = this.addMove(moveid, moves, types, abilities, teamDetails, species, isLead, isDoubles,\n\t\t\t\t\tmovePool, teraType, role);\n\t\t\t}\n\t\t}\n\n\t\t// Add (moves.size < this.maxMoveCount) as a condition if moves is getting larger than 4 moves.\n\t\t// If you want moves to be favored but not required, add something like && this.randomChance(1, 2) to your condition.\n\n\t\t// Choose remaining moves randomly from movepool and add them to moves list:\n\t\twhile (moves.size < this.maxMoveCount && movePool.length) {\n\t\t\tif (moves.size + movePool.length <= this.maxMoveCount) {\n\t\t\t\tfor (const moveid of movePool) {\n\t\t\t\t\tmoves.add(moveid);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tconst moveid = this.sample(movePool);\n\t\t\tcounter = this.addMove(moveid, moves, types, abilities, teamDetails, species, isLead, isDoubles,\n\t\t\t\tmovePool, teraType, role);\n\t\t\tfor (const pair of MovePairs) {\n\t\t\t\tif (moveid === pair[0] && movePool.includes(pair[1])) {\n\t\t\t\t\tcounter = this.addMove(pair[1], moves, types, abilities, teamDetails, species, isLead, isDoubles,\n\t\t\t\t\t\tmovePool, teraType, role);\n\t\t\t\t}\n\t\t\t\tif (moveid === pair[1] && movePool.includes(pair[0])) {\n\t\t\t\t\tcounter = this.addMove(pair[0], moves, types, abilities, teamDetails, species, isLead, isDoubles,\n\t\t\t\t\t\tmovePool, teraType, role);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn moves;\n\t}\n\n\tshouldCullAbility(\n\t\tability: string,\n\t\ttypes: string[],\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tisLead: boolean,\n\t\tisDoubles: boolean,\n\t\tteraType: string,\n\t\trole: string,\n\t): boolean {\n\t\tif ([\n\t\t\t'Flare Boost', 'Gluttony', 'Hydration', 'Ice Body', 'Immunity', 'Insomnia', 'Own Tempo',\n\t\t\t'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 'Chlorophyll':\n\t\t\tif (abilities.has('Harvest')) return true;\n\t\t\treturn (!moves.has('sunnyday') && !teamDetails.sun && species.id !== 'lilligant');\n\t\tcase 'Cloud Nine':\n\t\t\treturn (species.id !== 'golduck');\n\t\tcase 'Competitive':\n\t\t\treturn (species.id === 'kilowattrel');\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') || (abilities.has('Prankster') && (moves.has('thunderwave') || moves.has('taunt'))));\n\t\tcase 'Flash Fire':\n\t\t\treturn (species.id !== 'houndoom' && this.dex.getEffectiveness('Fire', species) >= 1);\n\t\tcase 'Guts':\n\t\t\treturn (!moves.has('facade') && !moves.has('sleeptalk'));\n\t\tcase 'Harvest':\n\t\t\treturn (!moves.has('substitute'));\n\t\tcase 'Hustle': case 'Inner Focus':\n\t\t\treturn (counter.get('Physical') < 2);\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 (abilities.has('Hustle')) return true;\n\t\t\tif (abilities.has('Sheer Force') && !!counter.get('sheerforce')) return true;\n\t\t\treturn (abilities.has('Stakeout') || moves.has('substitute'));\n\t\tcase 'Iron Fist':\n\t\t\treturn !counter.ironFist;\n\t\tcase 'Justified':\n\t\t\treturn !counter.get('Physical');\n\t\tcase 'Mold Breaker':\n\t\t\treturn abilities.has('Sharpness');\n\t\tcase 'Moxie':\n\t\t\treturn (!counter.get('Physical') || moves.has('stealthrock'));\n\t\tcase 'Overgrow':\n\t\t\treturn !counter.get('Grass');\n\t\tcase 'Prankster':\n\t\t\treturn !counter.get('Status');\n\t\tcase 'Pressure':\n\t\t\treturn (!!counter.get('setup') || counter.get('Status') < 2 || isDoubles);\n\t\tcase 'Reckless':\n\t\t\treturn !counter.get('recoil');\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;\n\t\tcase 'Sap Sipper':\n\t\t\treturn species.id === 'wyrdeer';\n\t\tcase 'Seed Sower':\n\t\t\treturn role === 'Bulky Support';\n\t\tcase 'Shed Skin':\n\t\t\treturn species.id === 'seviper';\n\t\tcase 'Sheer Force':\n\t\t\tif (species.id === 'braviaryhisui' && role === 'Wallbreaker') return true;\n\t\t\treturn (!counter.get('sheerforce') || ['Guts', 'Sharpness', 'Slush Rush'].some(m => abilities.has(m)));\n\t\tcase 'Slush Rush':\n\t\t\treturn !teamDetails.snow;\n\t\tcase 'Solar Power':\n\t\t\treturn (!teamDetails.sun);\n\t\tcase 'Stakeout':\n\t\t\treturn (counter.damagingMoves.size < 1);\n\t\tcase 'Sturdy':\n\t\t\treturn !!counter.get('recoil');\n\t\tcase 'Swarm':\n\t\t\treturn (!counter.get('Bug') || !!counter.get('recovery'));\n\t\tcase 'Sweet Veil':\n\t\t\treturn types.includes('Grass');\n\t\tcase 'Swift Swim':\n\t\t\treturn (!moves.has('raindance') && !teamDetails.rain);\n\t\tcase 'Synchronize':\n\t\t\treturn (species.id !== 'umbreon' && species.id !== 'rabsca');\n\t\tcase 'Technician':\n\t\t\treturn (!counter.get('technician') || abilities.has('Punk Rock'));\n\t\tcase 'Tinted Lens':\n\t\t\treturn (species.id === 'braviaryhisui' && role === 'Fast Support');\n\t\tcase 'Unburden':\n\t\t\treturn (abilities.has('Prankster') || !counter.get('setup'));\n\t\tcase 'Volt Absorb':\n\t\t\tif (abilities.has('Iron Fist') && counter.ironFist >= 2) return true;\n\t\t\treturn (this.dex.getEffectiveness('Electric', species) < -1);\n\t\tcase 'Water Absorb':\n\t\t\treturn species.id === 'quagsire';\n\t\tcase 'Weak Armor':\n\t\t\treturn moves.has('shellsmash');\n\t\t}\n\n\t\treturn false;\n\t}\n\n\n\tgetAbility(\n\t\ttypes: string[],\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tisLead: boolean,\n\t\tisDoubles: boolean,\n\t\tteraType: string,\n\t\trole: string,\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\t\tif (species.id === 'arcaninehisui') return 'Rock Head';\n\t\tif (species.id === 'staraptor') return 'Reckless';\n\t\tif (species.id === 'enamorus' && moves.has('calmmind')) return 'Cute Charm';\n\t\tif (abilities.has('Corrosion') && moves.has('toxic')) return 'Corrosion';\n\t\tif (abilities.has('Guts') && (moves.has('facade') || moves.has('sleeptalk'))) return 'Guts';\n\t\tif (abilities.has('Serene Grace') && moves.has('headbutt')) return 'Serene Grace';\n\t\tif (abilities.has('Technician') && counter.get('technician')) return 'Technician';\n\t\tif (abilities.has('Own Tempo') && moves.has('petaldance')) return 'Own Tempo';\n\t\tif (abilities.has('Slush Rush') && moves.has('snowscape')) return 'Slush Rush';\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, teamDetails, species, isLead, isDoubles, teraType, role\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 culled, re-allow all\n\t\tif (!abilityAllowed.length) abilityAllowed = abilityData;\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\tgetPriorityItem(\n\t\tability: string,\n\t\ttypes: string[],\n\t\tmoves: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tisLead: boolean,\n\t\tisDoubles: boolean,\n\t\tteraType: string,\n\t\trole: string,\n\t) {\n\t\tif (species.requiredItems) {\n\t\t\t// Z-Crystals aren't available in Gen 9, so require Plates\n\t\t\tif (species.baseSpecies === 'Arceus') {\n\t\t\t\treturn species.requiredItems[0];\n\t\t\t}\n\t\t\treturn this.sample(species.requiredItems);\n\t\t}\n\t\tif (role === 'AV Pivot') return 'Assault Vest';\n\t\tif (role === 'Bulky Setup' && (ability === 'Quark Drive' || ability === 'Protosynthesis')) return 'Booster Energy';\n\t\tif (species.id === 'pikachu') return 'Light Ball';\n\t\tif (species.id === 'regieleki') return 'Magnet';\n\t\tif (ability === 'Imposter' || (species.id === 'magnezone' && moves.has('bodypress'))) return 'Choice Scarf';\n\t\tif (moves.has('bellydrum') && moves.has('substitute')) return 'Salac Berry';\n\t\tif (\n\t\t\t['Cheek Pouch', 'Cud Chew', 'Harvest'].some(m => ability === m) ||\n\t\t\tmoves.has('bellydrum') || moves.has('filletaway')\n\t\t) {\n\t\t\treturn 'Sitrus Berry';\n\t\t}\n\t\tif (['healingwish', 'switcheroo', 'trick'].some(m => moves.has(m))) {\n\t\t\tif (species.baseStats.spe >= 60 && species.baseStats.spe <= 108 && role !== 'Wallbreaker') {\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 ((ability === 'Guts' || moves.has('facade')) && !moves.has('sleeptalk')) {\n\t\t\treturn (types.includes('Fire') || ability === 'Toxic Boost') ? 'Toxic Orb' : 'Flame Orb';\n\t\t}\n\t\tif (\n\t\t\t(ability === 'Magic Guard' && counter.damagingMoves.size > 1) ||\n\t\t\t(ability === 'Sheer Force' && counter.get('sheerforce'))\n\t\t) {\n\t\t\treturn 'Life Orb';\n\t\t}\n\t\tif (moves.has('shellsmash')) return 'White Herb';\n\t\tif (moves.has('populationbomb')) return 'Wide Lens';\n\t\tif (moves.has('stuffcheeks')) return 'Salac Berry';\n\t\tif (ability === 'Unburden') return moves.has('closecombat') ? 'White Herb' : 'Sitrus Berry';\n\t\tif (moves.has('acrobatics')) return ability === 'Grassy Surge' ? 'Grassy Seed' : '';\n\t\tif (moves.has('auroraveil') || moves.has('lightscreen') && moves.has('reflect')) return 'Light Clay';\n\t\tif (\n\t\t\tmoves.has('rest') && !moves.has('sleeptalk') &&\n\t\t\tability !== 'Natural Cure' && ability !== 'Shed Skin'\n\t\t) {\n\t\t\treturn 'Chesto Berry';\n\t\t}\n\t\tif (species.id === 'scyther') return isLead ? 'Eviolite' : 'Heavy-Duty Boots';\n\t\tif (species.nfe) return 'Eviolite';\n\t\tif (this.dex.getEffectiveness('Rock', species) >= 2) return 'Heavy-Duty Boots';\n\t}\n\n\t/** Item generation specific to Random Doubles */\n\t// This will be changed and used later, once doubles is actually coming out.\n\tgetDoublesItem(\n\t\tability: string,\n\t\ttypes: string[],\n\t\tmoves: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tteraType: string,\n\t\trole: string,\n\t) {\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.snow) return 'Blunder Policy';\n\t\tif (this.dex.getEffectiveness('Rock', species) >= 2 && !types.includes('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.includes('Dragon') || types.includes('Fighting') || types.includes('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') && ability !== '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.includes('Dragon') || types.includes('Fighting') || types.includes('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\tgetItem(\n\t\tability: string,\n\t\ttypes: string[],\n\t\tmoves: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tisLead: boolean,\n\t\tisDoubles: boolean,\n\t\tteraType: string,\n\t\trole: string,\n\t): string | undefined {\n\t\tif (\n\t\t\tcounter.get('Physical') >= 4 &&\n\t\t\t['fakeout', 'firstimpression', 'flamecharge', 'rapidspin', 'ruination', 'superfang'].every(m => !moves.has(m))\n\t\t) {\n\t\t\tconst scarfReqs = (\n\t\t\t\trole !== 'Wallbreaker' &&\n\t\t\t\t(species.baseStats.atk >= 100 || ability === 'Huge Power' || ability === 'Pure Power') &&\n\t\t\t\tspecies.baseStats.spe >= 60 && species.baseStats.spe <= 108 &&\n\t\t\t\tability !== 'Speed Boost' && !counter.get('priority') && !moves.has('aquastep')\n\t\t\t);\n\t\t\treturn (scarfReqs && this.randomChance(1, 2)) ? 'Choice Scarf' : 'Choice Band';\n\t\t}\n\t\tif (counter.get('Physical') === 3 && moves.has('shedtail')) return 'Choice Scarf';\n\t\tif (\n\t\t\t(counter.get('Special') >= 4) ||\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\trole !== 'Wallbreaker' &&\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 !== 'Speed Boost' && ability !== 'Tinted Lens' && !counter.get('Physical')\n\t\t\t);\n\t\t\treturn (scarfReqs && this.randomChance(1, 2)) ? 'Choice Scarf' : 'Choice Specs';\n\t\t}\n\t\tif (counter.damagingMoves.size >= 4 && role !== 'Fast Attacker' && role !== 'Wallbreaker') return 'Assault Vest';\n\t\tif (counter.get('speedsetup') && this.dex.getEffectiveness('Ground', species) < 1) return 'Weakness Policy';\n\t\tif (species.id === 'urshifurapidstrike') return 'Punching Glove';\n\t\tif (species.id === 'lokix' && role === 'Wallbreaker') return 'Life Orb';\n\t\tif (species.id === 'toxtricity' && moves.has('shiftgear')) return 'Throat Spray';\n\t\tif (moves.has('substitute') || ability === 'Moody') return 'Leftovers';\n\t\tif (\n\t\t\t!teamDetails.defog && !teamDetails.rapidSpin &&\n\t\t\tthis.dex.getEffectiveness('Rock', species) >= 1\n\t\t) return 'Heavy-Duty Boots';\n\t\tif (\n\t\t\trole === 'Fast Support' &&\n\t\t\t['defog', 'rapidspin', 'uturn', 'voltswitch'].some(m => moves.has(m)) &&\n\t\t\t!types.includes('Flying') && ability !== 'Levitate'\n\t\t) return 'Heavy-Duty Boots';\n\n\t\t// Low Priority\n\t\tif (moves.has('outrage')) return 'Lum Berry';\n\t\tif (\n\t\t\trole !== 'Fast Attacker' && role !== 'Tera Blast user' &&\n\t\t\tthis.dex.getEffectiveness('Ground', species) >= 2\n\t\t) return 'Air Balloon';\n\t\tif (\n\t\t\t(species.id === 'garchomp' && role === 'Fast Support') ||\n\t\t\t(ability === 'Regenerator' && types.includes('Water') && species.baseStats.def >= 110 && this.randomChance(1, 3))\n\t\t) return 'Rocky Helmet';\n\t\tif (\n\t\t\trole === 'Fast Support' && isLead &&\n\t\t\t!counter.get('recovery') && !counter.get('recoil') &&\n\t\t\t(species.baseStats.hp + species.baseStats.def + species.baseStats.spd) < 300\n\t\t) return 'Focus Sash';\n\t\tif (['Bulky Attacker', 'Bulky Support', 'Bulky Setup'].some(m => role === (m))) return 'Leftovers';\n\t\tif (role === 'Fast Support' || role === 'Fast Bulky Setup') {\n\t\t\treturn (counter.damagingMoves.size >= 3) ? 'Life Orb' : 'Leftovers';\n\t\t}\n\t\tif (['Fast Attacker', 'Setup Sweeper', 'Tera Blast user', 'Wallbreaker'].some(m => role === (m))) return 'Life Orb';\n\t\tif (isDoubles) return 'Sitrus Berry';\n\t\treturn 'Leftovers';\n\t}\n\n\tgetLevel(\n\t\tspecies: Species,\n\t\tisDoubles: boolean,\n\t): number {\n\t\tif (this.adjustLevel) return this.adjustLevel;\n\t\t// doubles levelling\n\t\tif (isDoubles && this.randomDoublesSets[species.id][\"level\"]) return this.randomDoublesSets[species.id][\"level\"];\n\t\tif (!isDoubles && this.randomSets[species.id][\"level\"]) return this.randomSets[species.id][\"level\"];\n\t\t// Default to tier-based levelling\n\t\tconst tier = species.tier;\n\t\tconst tierScale: Partial<Record<Species['tier'], number>> = {\n\t\t\tUber: 76,\n\t\t\tOU: 80,\n\t\t\tUUBL: 81,\n\t\t\tUU: 82,\n\t\t\tRUBL: 83,\n\t\t\tRU: 84,\n\t\t\tNUBL: 85,\n\t\t\tNU: 86,\n\t\t\tPUBL: 87,\n\t\t\tPU: 88, \"(PU)\": 88, NFE: 88,\n\t\t};\n\t\treturn tierScale[tier] || 80;\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): RandomTeamsTypes.RandomSet {\n\t\tspecies = this.dex.species.get(species);\n\t\tlet forme = species.name;\n\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\tforme = species.battleOnly;\n\t\t}\n\t\tif (species.cosmeticFormes) {\n\t\t\tforme = this.sample([species.name].concat(species.cosmeticFormes));\n\t\t}\n\t\tconst sets = (this as any)[`random${isDoubles ? 'Doubles' : ''}Sets`][species.id][\"sets\"];\n\t\tconst possibleSets = [];\n\t\tfor (const set of sets) {\n\t\t\tif (teamDetails.teraBlast && set.role === \"Tera Blast user\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tpossibleSets.push(set);\n\t\t}\n\t\tconst set = this.sampleIfArray(possibleSets);\n\t\tconst role = set.role;\n\t\tconst movePool: string[] = [];\n\t\tfor (const movename of set.movepool) {\n\t\t\tmovePool.push(this.dex.moves.get(movename).id);\n\t\t}\n\t\tconst teraTypes = set.teraTypes;\n\t\tconst teraType = this.sampleIfArray(teraTypes);\n\n\t\tif (this.format.gameType === 'multi' || this.format.gameType === 'freeforall') {\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\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 = 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\t// Get moves\n\t\tconst moves = this.randomMoveset(types, abilities, teamDetails, species, isLead, isDoubles, movePool, teraType, role);\n\t\tconst counter = this.queryMoves(moves, species.types, teraType, abilities);\n\n\t\t// Get ability\n\t\tability = this.getAbility(types, moves, abilities, counter, teamDetails, species, isLead, isDoubles, teraType, role);\n\n\t\t// Get items\n\t\t// First, the priority items\n\t\titem = this.getPriorityItem(ability, types, moves, counter, teamDetails, species, isLead, isDoubles, teraType, role);\n\t\tif (item === undefined && isDoubles) {\n\t\t\titem = this.getDoublesItem(ability, types, moves, counter, teamDetails, species, teraType, role);\n\t\t}\n\t\tif (item === undefined) {\n\t\t\titem = this.getItem(ability, types, moves, counter, teamDetails, species, isLead, isDoubles, teraType, role);\n\t\t}\n\n\t\t// fallback\n\t\tif (item === undefined) item = isDoubles ? 'Sitrus Berry' : 'Leftovers';\n\n\t\t// For Trick / Switcheroo\n\t\tif (item === 'Leftovers' && types.includes('Poison') && teraType === 'Poison') {\n\t\t\titem = 'Black Sludge';\n\t\t}\n\t\tif (species.baseSpecies === 'Pikachu') {\n\t\t\tforme = 'Pikachu' + this.sample(['', '-Original', '-Hoenn', '-Sinnoh', '-Unova', '-Kalos', '-Alola', '-Partner', '-World']);\n\t\t}\n\n\t\t// Get level\n\t\tconst level = this.getLevel(species, isDoubles);\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\tif ((moves.has('substitute') && ['Sitrus Berry', 'Salac Berry'].includes(item))) {\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') || moves.has('filletaway')) && (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 {\n\t\t\t\t// Maximize number of Stealth Rock switch-ins\n\t\t\t\tif (srWeakness <= 0 || hp % (4 / srWeakness) > 0 || ['Leftovers', 'Life Orb'].includes(item)) break;\n\t\t\t}\n\t\t\tevs.hp -= 4;\n\t\t}\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' || move.id === 'foulplay';\n\t\t});\n\t\tif (noAttackStatMoves && !moves.has('transform')) {\n\t\t\tevs.atk = 0;\n\t\t\tivs.atk = 0;\n\t\t}\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\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\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\tteraType,\n\t\t\trole,\n\t\t};\n\t}\n\n\tgetPokemonPool(\n\t\ttype: string,\n\t\tpokemonToExclude: RandomTeamsTypes.RandomSet[] = [],\n\t\tisMonotype = false,\n\t\tisDoubles = false,\n\t) {\n\t\tconst exclude = pokemonToExclude.map(p => toID(p.species));\n\t\tconst pokemonPool = [];\n\t\tconst baseSpeciesPool: string[] = [];\n\t\tif (isDoubles) {\n\t\t\tfor (const pokemon of Object.keys(this.randomDoublesSets)) {\n\t\t\t\tconst species = this.dex.species.get(pokemon);\n\t\t\t\tif (species.gen > this.gen || exclude.includes(species.id)) continue;\n\t\t\t\tif (isMonotype) {\n\t\t\t\t\tif (!species.types.includes(type)) continue;\n\t\t\t\t}\n\t\t\t\tpokemonPool.push(pokemon);\n\t\t\t\tif (!baseSpeciesPool.includes(species.baseSpecies)) baseSpeciesPool.push(species.baseSpecies);\n\t\t\t}\n\t\t} else {\n\t\t\tfor (const pokemon of Object.keys(this.randomSets)) {\n\t\t\t\tconst species = this.dex.species.get(pokemon);\n\t\t\t\tif (species.gen > this.gen || exclude.includes(species.id)) continue;\n\t\t\t\tif (isMonotype) {\n\t\t\t\t\tif (!species.types.includes(type)) continue;\n\t\t\t\t}\n\t\t\t\tpokemonPool.push(pokemon);\n\t\t\t\tif (!baseSpeciesPool.includes(species.baseSpecies)) baseSpeciesPool.push(species.baseSpecies);\n\t\t\t}\n\t\t}\n\t\treturn [pokemonPool, baseSpeciesPool];\n\t}\n\n\t// TODO: Make types for this\n\trandomSets: AnyObject = randomSetsJSON;\n\trandomDoublesSets: AnyObject = randomSetsJSON; // Doubles sets are the same as singles for now\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 tierCount: {[k: string]: number} = {};\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\tconst [pokemonPool, baseSpeciesPool] = this.getPokemonPool(type, pokemon, isMonotype, isDoubles);\n\t\twhile (baseSpeciesPool.length && pokemon.length < this.maxTeamSize) {\n\t\t\tconst baseSpecies = this.sampleNoReplace(baseSpeciesPool);\n\t\t\tconst currentSpeciesPool: Species[] = [];\n\t\t\tfor (const poke of pokemonPool) {\n\t\t\t\tconst species = this.dex.species.get(poke);\n\t\t\t\tif (species.baseSpecies === baseSpecies) currentSpeciesPool.push(species);\n\t\t\t}\n\t\t\tlet species = this.sample(currentSpeciesPool);\n\t\t\tif (!species.exists) continue;\n\t\t\t// Illusion shouldn't be on the last slot\n\t\t\tif (species.baseSpecies === 'Zoroark' && pokemon.length >= (this.maxTeamSize - 1)) continue;\n\n\t\t\t// If Zoroark is in the team, the sixth slot should not be a Pokemon with extremely low 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\tthis.getLevel(species, isDoubles) < 72 &&\n\t\t\t\t!this.adjustLevel\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Pokemon with Last Respects shouldn't be leading\n\t\t\tif (['Basculegion', 'Houndstone'].includes(species.baseSpecies) && !pokemon.length) continue;\n\n\t\t\tconst tier = species.tier;\n\t\t\tconst types = species.types;\n\t\t\tconst typeCombo = types.slice().sort().join();\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\t// Limit one Pokemon per tier, two for Monotype\n\t\t\t// Disable this for now, since it is still a new gen\n\t\t\t// Unless you want to have a lot of Ubers!\n\t\t\t// if (\n\t\t\t// \t(tierCount[tier] >= (this.forceMonotype || isMonotype ? 2 : 1) * limitFactor) &&\n\t\t\t// \t!this.randomChance(1, Math.pow(5, tierCount[tier]))\n\t\t\t// ) {\n\t\t\t// \tcontinue;\n\t\t\t// }\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\t\t\t}\n\n\t\t\t// Limit one of any type combination, two in Monotype\n\t\t\tif (!this.forceMonotype && typeComboCount[typeCombo] >= (isMonotype ? 2 : 1) * 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, isDoubles);\n\n\t\t\t// Okay, the set passes, add it to our team\n\t\t\tpokemon.push(set);\n\t\t\tif (pokemon.length === this.maxTeamSize) {\n\t\t\t\t// Set Zoroark's level to be the same as the last Pokemon\n\t\t\t\tconst illusion = teamDetails.illusion;\n\t\t\t\tif (illusion) pokemon[illusion - 1].level = pokemon[this.maxTeamSize - 1].level;\n\n\t\t\t\t// Don't bother tracking details for the last Pokemon\n\t\t\t\tbreak;\n\t\t\t}\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 tier counter\n\t\t\tif (tierCount[tier]) {\n\t\t\t\ttierCount[tier]++;\n\t\t\t} else {\n\t\t\t\ttierCount[tier] = 1;\n\t\t\t}\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\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' || set.moves.includes('snowscape') || set.moves.includes('chillyreception')) {\n\t\t\t\tteamDetails.snow = 1;\n\t\t\t}\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('mortalspin')) teamDetails.rapidSpin = 1;\n\t\t\tif (set.moves.includes('tidyup')) 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\tif (set.role === 'Tera Blast user') teamDetails.teraBlast = 1;\n\n\t\t\t// For setting Zoroark's level\n\t\t\tif (set.ability === 'Illusion') teamDetails.illusion = pokemon.length;\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 = {};\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}} =\n\t\t{};\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[]}[] = [];\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\tconst item = this.dex.items.get(curSet.item);\n\t\t\tif (itemsMax[item.id] && teamData.has[item.id] >= itemsMax[item.id]) continue;\n\n\t\t\tconst ability = this.dex.abilities.get(curSet.ability);\n\t\t\tif (teamData.weather && weatherAbilities.includes(ability.id)) continue; // reject 2+ weather setters\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\t\t\teffectivePool.push({set: curSet, moveVariants: curSetVariants});\n\t\t\tif (hasRequiredMove) priorityPool.push({set: curSet, moveVariants: curSetVariants});\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 = this.sampleIfArray(setData.set.item);\n\t\tconst 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émon 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 = {};\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 requiredMoveFamilies: string[] = [];\n\t\tconst requiredMoves: {[k: string]: string} = {};\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\n\t\twhile (pokemonPool.length && pokemon.length < this.maxTeamSize) {\n\t\t\t// Weighted random sampling\n\t\t\tlet maxUsage = 0;\n\t\t\tconst sets: {[k: string]: number} = {};\n\t\t\tfor (const specie of pokemonPool) {\n\t\t\t\tif (teamData.baseFormes[this.dex.species.get(specie).baseSpecies]) continue; // Species Clause\n\t\t\t\tconst usage: number = this.randomBSSFactorySets[specie].usage;\n\t\t\t\tsets[specie] = usage + maxUsage;\n\t\t\t\tmaxUsage += usage;\n\t\t\t}\n\n\t\t\tconst usage = this.random(1, maxUsage);\n\t\t\tlet last = 0;\n\t\t\tlet specie;\n\t\t\tfor (const key of Object.keys(sets)) {\n\t\t\t\t if (usage > last && usage <= sets[key]) {\n\t\t\t\t\t specie = key;\n\t\t\t\t\t break;\n\t\t\t\t }\n\t\t\t\t last = sets[key];\n\t\t\t}\n\n\t\t\tconst species = this.dex.species.get(specie);\n\t\t\tif (!species.exists) continue;\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\tfor (const type of types) {\n\t\t\t\tif (teamData.typeCount[type] > 1 && this.randomChance(4, 5)) {\n\t\t\t\t\tskip = true;\n\t\t\t\t\tbreak;\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 (typeCombo in teamData.typeComboCount) 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\tteamData.typeComboCount[typeCombo] = 1;\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\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émon 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.randomBSSFactoryTeam(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.randomBSSFactoryTeam(side, ++depth);\n\t\t\t}\n\t\t\tfor (const type in teamData.weaknesses) {\n\t\t\t\tif (teamData.weaknesses[type] >= 3) return this.randomBSSFactoryTeam(side, ++depth);\n\t\t\t}\n\t\t}\n\n\t\treturn pokemon;\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\tlet isIllegalItem;\n\t\t\tlet isBadItem;\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\tisIllegalItem = this.dex.items.get(item).gen > this.gen || this.dex.items.get(item).isNonstandard;\n\t\t\t\t\tisBadItem = item.startsWith(\"TR\") || this.dex.items.get(item).isPokeball;\n\t\t\t\t} while (isIllegalItem || (isBadItem && this.randomChance(19, 20)));\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\n\t\t\t\t\t.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\tconst formes = ['gastrodoneast', 'pumpkaboosuper', 'zygarde10'];\n\t\t\t\tlet learnset = this.dex.species.getLearnset(species.id);\n\t\t\t\tif (formes.includes(species.id) || !learnset) {\n\t\t\t\t\tlearnset = this.dex.species.getLearnset(this.dex.species.get(species.baseSpecies).id);\n\t\t\t\t}\n\t\t\t\tif (learnset) {\n\t\t\t\t\tpool = Object.keys(learnset).filter(\n\t\t\t\t\t\tmoveid => learnset![moveid].find(learned => learned.startsWith(String(this.gen)))\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (species.changesFrom) {\n\t\t\t\t\tlearnset = this.dex.species.getLearnset(toID(species.changesFrom));\n\t\t\t\t\tconst basePool = Object.keys(learnset!).filter(\n\t\t\t\t\t\tmoveid => learnset![moveid].find(learned => learned.startsWith(String(this.gen)))\n\t\t\t\t\t);\n\t\t\t\t\tpool = [...new Set(pool.concat(basePool))];\n\t\t\t\t}\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 = this.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\tconst last = [0, 151, 251, 386, 493, 649, 721, 807, 898, 1010][this.gen];\n\n\t\tif (n <= 0 || n > last) throw new Error(`n must be a number between 1 and ${last} (got ${n})`);\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 = Object.values(this.dex.species.getLearnset(species.id) || {})\n\t\t\t\t\t\t.some(sources => sources.some(source => source.startsWith('9')));\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\tif (num > last) break;\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 (!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));\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\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\tif (!hasCustomBans) {\n\t\t\t\t\tnaturePool = [...this.dex.natures.all()];\n\t\t\t\t} else {\n\t\t\t\t\tconst hasAllNaturesBan = ruleTable.check('pokemontag:allnatures');\n\t\t\t\t\tfor (const nature of this.dex.natures.all()) {\n\t\t\t\t\t\tlet banReason = ruleTable.check('nature:' + nature.id);\n\t\t\t\t\t\tif (banReason) continue;\n\t\t\t\t\t\tif (banReason !== '' && nature.id) {\n\t\t\t\t\t\t\tif (hasAllNaturesBan) continue;\n\t\t\t\t\t\t\tif (nature.isNonstandard) {\n\t\t\t\t\t\t\t\tbanReason = ruleTable.check('pokemontag:' + toID(nature.isNonstandard));\n\t\t\t\t\t\t\t\tif (banReason) continue;\n\t\t\t\t\t\t\t\tif (banReason !== '' && nature.isNonstandard !== 'Unobtainable') {\n\t\t\t\t\t\t\t\t\tif (hasNonexistentBan) continue;\n\t\t\t\t\t\t\t\t\tif (!hasNonexistentWhitelist) continue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnaturePool.push(nature);\n\t\t\t\t\t}\n\t\t\t\t\t// There is no 'nature:nonature' rule so do not constrain pool size\n\t\t\t\t}\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\tlet isBadItem;\n\t\t\tif (doItemsExist) {\n\t\t\t\t// We discard TRs and Balls with 95% probability because of their otherwise overwhelming presence\n\t\t\t\tdo {\n\t\t\t\t\titemData = this.sampleNoReplace(itemPool);\n\t\t\t\t\titem = itemData?.name;\n\t\t\t\t\tisBadItem = item.startsWith(\"TR\") || itemData.isPokeball;\n\t\t\t\t} while (isBadItem && this.randomChance(19, 20) && itemPool.length > this.maxTeamSize);\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(this.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 this.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\nexport default RandomTeams;\n"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/utils.ts","../src/gen8.ts","../src/gen7.ts","../src/gen6.ts","../src/gen5.ts","../src/gen4.ts","../src/gen3.ts","../src/gen2.ts","../src/gen1.ts","../src/gen9.ts"],"names":["item","ability","typeCombo","specie","usage","toID","SetupException","PhysicalSetup","SpecialSetup","PRNG","Tags","MoveCounter","RecoveryMove","ContraryMoves","MixedSetup","SpeedSetup","NoStab","Hazards","sereneGraceBenefits","recoveryMoves","moveid","set","species"],"mappings":"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","sourcesContent":["import {\n\tPlayerOptions,\n\tPokemonSet,\n\tPRNG,\n\tPRNGSeed,\n\tDex,\n\tFormat,\n\tModdedDex,\n} from '@pkmn/sim';\n\nimport {RandomGen1Teams} from './gen1';\nimport {RandomGen2Teams} from './gen2';\nimport {RandomGen3Teams} from './gen3';\nimport {RandomGen4Teams} from './gen4';\nimport {RandomGen5Teams} from './gen5';\nimport {RandomGen6Teams} from './gen6';\nimport {RandomGen7Teams} from './gen7';\nimport {RandomGen8Teams} from './gen8';\nimport {RandomTeams} from './gen9';\n\nconst GENERATORS: {[mod: string]: new(dex: ModdedDex, format: Format, seed: PRNG | PRNGSeed | null) => TeamGenerator} = {\n\tgen1: RandomGen1Teams,\n\tgen2: RandomGen2Teams,\n\tgen3: RandomGen3Teams,\n\tgen4: RandomGen4Teams,\n\tgen5: RandomGen5Teams,\n\tgen6: RandomGen6Teams,\n\tgen7: RandomGen7Teams,\n\tgen8: RandomGen8Teams,\n\tgen9: RandomTeams,\n};\n\ninterface TeamGenerator {\n\tprng: PRNG;\n\tgetTeam(options?: PlayerOptions): PokemonSet[];\n\tsetSeed(prng?: PRNG | PRNGSeed): void;\n}\n\nexport const TeamGenerators = new class {\n\tgetTeamGenerator(format: Format | string, seed: PRNG | PRNGSeed | null = null) {\n\t\tformat = Dex.formats.get(format);\n\t\tif (!format.exists) throw new Error(`Unknown format '${format.name}' - does not exist`);\n\t\tif (format.team !== 'random') throw new Error(`Unsupported format '${format.name}`);\n\t\tconst Generator = format.mod && GENERATORS[format.mod];\n\t\tif (!Generator) throw new Error(`Unknown format '${format.name}' - cannot find generator`);\n\t\treturn new Generator(Dex.mod(format.mod), format, seed);\n\t}\n};\n","type Comparable = number | string | boolean | Comparable[] | {reverse: Comparable};\n\n/** Forces num to be an integer (between min and max). */\nfunction clampIntRange(num: any, min?: number, max?: number): number {\n\tif (typeof num !== 'number') num = 0;\n\tnum = Math.floor(num);\n\tif (min !== undefined && num < min) num = min;\n\tif (max !== undefined && num > max) num = max;\n\treturn num;\n}\n/**\n * Compares two variables; intended to be used as a smarter comparator.\n * The two variables must be the same type (TypeScript will not check this).\n *\n * - Numbers are sorted low-to-high, use `-val` to reverse\n * - Strings are sorted A to Z case-semi-insensitively, use `{reverse: val}` to reverse\n * - Booleans are sorted true-first (REVERSE of casting to numbers), use `!val` to reverse\n * - Arrays are sorted lexically in the order of their elements\n *\n * In other words: `[num, str]` will be sorted A to Z, `[num, {reverse: str}]` will be sorted Z to A.\n */\nfunction compare(a: Comparable, b: Comparable): number {\n\tif (typeof a === 'number') {\n\t\treturn a - (b as number);\n\t}\n\tif (typeof a === 'string') {\n\t\treturn a.localeCompare(b as string);\n\t}\n\tif (typeof a === 'boolean') {\n\t\treturn (a ? 1 : 2) - (b ? 1 : 2);\n\t}\n\tif (Array.isArray(a)) {\n\t\tfor (let i = 0; i < a.length; i++) {\n\t\t\tconst comparison = compare(a[i], (b as Comparable[])[i]);\n\t\t\tif (comparison) return comparison;\n\t\t}\n\t\treturn 0;\n\t}\n\tif ('reverse' in a) {\n\t\treturn compare((b as {reverse: string}).reverse, a.reverse);\n\t}\n\tthrow new Error(`Passed value ${a} is not comparable`);\n}\n\n/**\n * Sorts an array according to the callback's output on its elements.\n *\n * The callback's output is compared according to `PSUtils.compare`\n * (numbers low to high, strings A-Z, booleans true-first, arrays in order).\n */\nfunction sortBy<T>(array: T[], callback: (a: T) => Comparable): T[];\n/**\n * Sorts an array according to `PSUtils.compare`\n * (numbers low to high, strings A-Z, booleans true-first, arrays in order).\n *\n * Note that array.sort() only works on strings, not numbers, so you'll need\n * this to sort numbers.\n */\nfunction sortBy<T extends Comparable>(array: T[]): T[];\nfunction sortBy<T>(array: T[], callback?: (a: T) => Comparable) {\n\tif (!callback) return (array as any[]).sort(compare);\n\treturn array.sort((a, b) => compare(callback(a), callback(b)));\n}\n\nclass Multiset<T> extends Map<T, number> {\n\tadd(key: T) {\n\t\tthis.set(key, (this.get(key) ?? 0) + 1);\n\t\treturn this;\n\t}\n\tremove(key: T) {\n\t\tconst newValue = (this.get(key) ?? 0) - 1;\n\t\tif (newValue <= 0) return this.delete(key);\n\t\tthis.set(key, newValue);\n\t\treturn true;\n\t}\n}\n\nexport const Utils = {clampIntRange, compare, sortBy, Multiset};\n","import {Utils} from './utils';\nimport {\n\tAbility,\n\tAnyObject,\n\tBasicEffect,\n\tFormat,\n\tItem,\n\tModdedDex,\n\tMove,\n\tNature,\n\tPRNG,\n\tPRNGSeed,\n\tPlayerOptions,\n\tPokemonSet,\n\tRandomTeamsTypes,\n\tRuleTable,\n\tSpecies,\n\tStatID,\n\tStatsTable,\n\tTags,\n\ttoID,\n} from '@pkmn/sim';\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}\ninterface BattleFactorySet {\n\tspecies: string;\n\titem: string;\n\tability: string;\n\tnature: string;\n\tmoves: string[];\n\tevs?: Partial<StatsTable>;\n\tivs?: Partial<StatsTable>;\n}\nexport class MoveCounter extends Utils.Multiset<string> {\n\tdamagingMoves: Set<Move>;\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<string>, abilities: Set<string>, types: Set<string>,\n\tcounter: MoveCounter, species: Species, teamDetails: RandomTeamsTypes.TeamDetails\n) => boolean;\n\n// Moves that restore HP:\nconst RecoveryMove = [\n\t'healorder', 'milkdrink', 'moonlight', 'morningsun', 'recover', 'roost', 'shoreup', 'slackoff', 'softboiled', 'strengthsap', 'synthesis',\n];\n// Moves that drop stats:\nconst ContraryMoves = [\n\t'closecombat', 'leafstorm', 'overheat', 'superpower', 'vcreate',\n];\n// Moves that boost Attack:\nconst PhysicalSetup = [\n\t'bellydrum', 'bulkup', 'coil', 'curse', 'dragondance', 'honeclaws', 'howl', 'meditate', 'poweruppunch', 'swordsdance',\n];\n// Moves which boost Special Attack:\nconst SpecialSetup = [\n\t'calmmind', 'chargebeam', 'geomancy', 'nastyplot', 'quiverdance', 'tailglow',\n];\n// Moves that boost Attack AND Special Attack:\nconst MixedSetup = [\n\t'clangoroussoul', 'growth', 'happyhour', 'holdhands', 'noretreat', 'shellsmash', 'workup',\n];\n// Some moves that only boost Speed:\nconst SpeedSetup = [\n\t'agility', 'autotomize', 'flamecharge', 'rockpolish',\n];\n// Moves that shouldn't be the only STAB moves:\nconst NoStab = [\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\treadonly maxTeamSize: number;\n\treadonly adjustLevel: number | null;\n\treadonly maxMoveCount: number;\n\treadonly forceMonotype: string | undefined;\n\n\t/**\n\t * Checkers for move enforcement based on a Pokémon'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(dex: ModdedDex, format: Format, prng: PRNG | PRNGSeed | null) {\n\t\tthis.dex = dex;\n\t\tthis.gen = this.dex.gen;\n\t\tthis.noStab = NoStab;\n\n\t\tconst ruleTable = this.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<T>(items: readonly T[]): T {\n\t\treturn this.prng.sample(items);\n\t}\n\n\tsampleIfArray<T>(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<T>(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\n\t\t\t\t\t.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\tconst formes = ['gastrodoneast', 'pumpkaboosuper', 'zygarde10'];\n\t\t\t\tlet learnset = this.dex.species.getLearnset(species.id);\n\t\t\t\tif (formes.includes(species.id) || !learnset) {\n\t\t\t\t\tlearnset = this.dex.species.getLearnset(this.dex.species.get(species.baseSpecies).id);\n\t\t\t\t}\n\t\t\t\tif (learnset) {\n\t\t\t\t\tpool = Object.keys(learnset).filter(\n\t\t\t\t\t\tmoveid => learnset![moveid].find(learned => learned.startsWith(String(this.gen)))\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (species.changesFrom) {\n\t\t\t\t\tlearnset = this.dex.species.getLearnset(toID(species.changesFrom));\n\t\t\t\t\tconst basePool = Object.keys(learnset!).filter(\n\t\t\t\t\t\tmoveid => learnset![moveid].find(learned => learned.startsWith(String(this.gen)))\n\t\t\t\t\t);\n\t\t\t\t\tpool = [...new Set(pool.concat(basePool))];\n\t\t\t\t}\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 = this.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\tconst last = [0, 151, 251, 386, 493, 649, 721, 807, 898, 1010][this.gen];\n\n\t\tif (n <= 0 || n > last) throw new Error(`n must be a number between 1 and ${last} (got ${n})`);\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 = Object.values(this.dex.species.getLearnset(species.id) || {})\n\t\t\t\t\t\t.some(sources => sources.some(source => source.startsWith('9')));\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\tif (num > last) break;\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 (!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\tif (!hasCustomBans) {\n\t\t\t\t\tnaturePool = [...this.dex.natures.all()];\n\t\t\t\t} else {\n\t\t\t\t\tconst hasAllNaturesBan = ruleTable.check('pokemontag:allnatures');\n\t\t\t\t\tfor (const nature of this.dex.natures.all()) {\n\t\t\t\t\t\tlet banReason = ruleTable.check('nature:' + nature.id);\n\t\t\t\t\t\tif (banReason) continue;\n\t\t\t\t\t\tif (banReason !== '' && nature.id) {\n\t\t\t\t\t\t\tif (hasAllNaturesBan) continue;\n\t\t\t\t\t\t\tif (nature.isNonstandard) {\n\t\t\t\t\t\t\t\tbanReason = ruleTable.check('pokemontag:' + toID(nature.isNonstandard));\n\t\t\t\t\t\t\t\tif (banReason) continue;\n\t\t\t\t\t\t\t\tif (banReason !== '' && nature.isNonstandard !== 'Unobtainable') {\n\t\t\t\t\t\t\t\t\tif (hasNonexistentBan) continue;\n\t\t\t\t\t\t\t\t\tif (!hasNonexistentWhitelist) continue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnaturePool.push(nature);\n\t\t\t\t\t}\n\t\t\t\t\t// There is no 'nature:nonature' rule so do not constrain pool size\n\t\t\t\t}\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(this.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 this.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<string> | null,\n\t\ttypes: string[],\n\t\tabilities: Set<string> = 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 (RecoveryMove.includes(moveid)) counter.add('recovery');\n\t\t\tif (ContraryMoves.includes(moveid)) counter.add('contrary');\n\t\t\tif (PhysicalSetup.includes(moveid)) {\n\t\t\t\tcounter.add('physicalsetup');\n\t\t\t\tcounter.setupType = 'Physical';\n\t\t\t} else if (SpecialSetup.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 (MixedSetup.includes(moveid)) counter.add('mixedsetup');\n\t\t\tif (SpeedSetup.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) {\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('rest') && moves.has('sleeptalk')) &&\n\t\t\t\t!(moves.has('wish') && moves.has('protect'))\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<string>,\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\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émon 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', 'Moody'].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<string>,\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tmovePool: string[],\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\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',\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 (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émon.\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\tgetHighPriorityItem(\n\t\tability: string,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\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 — 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émon 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!isLead &&\n\t\t\tthis.dex.getEffectiveness('Rock', species) >= 2 &&\n\t\t\t!isDoubles\n\t\t);\n\t\tif (species.nfe && !HDBBetterThanEviolite) return '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<string>,\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t) {\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<string>,\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(ability === 'Moody' || !isDoubles)\n\t\t) return 'Leftovers';\n\t}\n\n\tgetLowPriorityItem(\n\t\tability: string,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\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 => this.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\t// Glalie prefers Leftovers\n\t\tif (!isDoubles && (rockWeaknessCase || spinnerCase) && species.id !== 'glalie') 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\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\tlet forme = species.name;\n\t\tlet gmax = false;\n\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\tforme = species.battleOnly;\n\t\t}\n\t\tif (species.cosmeticFormes) {\n\t\t\tforme = this.sample([species.name].concat(species.cosmeticFormes));\n\t\t}\n\t\tif (species.name.endsWith('-Gmax')) {\n\t\t\tforme = species.name.slice(0, -5);\n\t\t\tgmax = true;\n\t\t}\n\n\t\tconst randMoves =\n\t\t\t(isDoubles && species.randomDoubleBattleMoves) ||\n\t\t\t(isNoDynamax && species.randomBattleNoDynamaxMoves) ||\n\t\t\tspecies.randomBattleMoves;\n\t\tconst movePool = (randMoves || Object.keys(this.dex.species.getLearnset(species.id)!)).slice();\n\t\tif (this.format.gameType === 'multi' || this.format.gameType === 'freeforall') {\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<string>();\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\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 && 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\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[1]) {\n\t\t\t// Sort abilities by rating with an element of randomness\n\t\t\tif (abilityData[2] && abilityData[1].rating <= abilityData[2].rating && this.randomChance(1, 2)) {\n\t\t\t\t[abilityData[1], abilityData[2]] = [abilityData[2], abilityData[1]];\n\t\t\t}\n\t\t\tif (abilityData[0].rating <= abilityData[1].rating) {\n\t\t\t\tif (this.randomChance(1, 2)) [abilityData[0], abilityData[1]] = [abilityData[1], abilityData[0]];\n\t\t\t} else if (abilityData[0].rating - 0.6 <= abilityData[1].rating) {\n\t\t\t\tif (this.randomChance(2, 3)) [abilityData[0], abilityData[1]] = [abilityData[1], abilityData[0]];\n\t\t\t}\n\n\t\t\t// Start with the first abiility and work our way through, culling as we go\n\t\t\tability = abilityData[0].name;\n\t\t\tlet rejectAbility = false;\n\t\t\tdo {\n\t\t\t\trejectAbility = this.shouldCullAbility(\n\t\t\t\t\tability, types, moves, abilities, counter, movePool, teamDetails, species, isDoubles, isNoDynamax\n\t\t\t\t);\n\n\t\t\t\tif (rejectAbility) {\n\t\t\t\t\t// Lopunny, and other Facade users, don't want Limber, even if other abilities are poorly rated,\n\t\t\t\t\t// since paralysis would arguably be good for them.\n\t\t\t\t\tconst limberFacade = moves.has('facade') && ability === 'Limber';\n\n\t\t\t\t\tif (ability === abilityData[0].name && (abilityData[1].rating >= 1 || limberFacade)) {\n\t\t\t\t\t\tability = abilityData[1].name;\n\t\t\t\t\t} else if (ability === abilityData[1].name && abilityData[2] && (abilityData[2].rating >= 1 || limberFacade)) {\n\t\t\t\t\t\tability = abilityData[2].name;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Default to the highest rated ability if all are rejected\n\t\t\t\t\t\tability = abilityData[0].name;\n\t\t\t\t\t\trejectAbility = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} while (rejectAbility);\n\n\t\t\t// Hardcoded abilities for certain contexts\n\t\t\tif (forme === 'Copperajah' && gmax) {\n\t\t\t\tability = 'Heavy Metal';\n\t\t\t} else if (abilities.has('Guts') && (\n\t\t\t\tspecies.id === 'gurdurr' || species.id === 'throh' ||\n\t\t\t\tmoves.has('facade') || (moves.has('rest') && moves.has('sleeptalk'))\n\t\t\t)) {\n\t\t\t\tability = 'Guts';\n\t\t\t} else if (abilities.has('Moxie') && (counter.get('Physical') > 3 || moves.has('bounce')) && !isDoubles) {\n\t\t\t\tability = 'Moxie';\n\t\t\t} else if (isDoubles) {\n\t\t\t\tif (abilities.has('Competitive') && ability !== 'Shadow Tag' && ability !== 'Strong Jaw') ability = 'Competitive';\n\t\t\t\tif (abilities.has('Friend Guard')) ability = 'Friend Guard';\n\t\t\t\tif (abilities.has('Gluttony') && moves.has('recycle')) ability = 'Gluttony';\n\t\t\t\tif (abilities.has('Guts')) ability = 'Guts';\n\t\t\t\tif (abilities.has('Harvest')) ability = 'Harvest';\n\t\t\t\tif (abilities.has('Healer') && (\n\t\t\t\t\tabilities.has('Natural Cure') ||\n\t\t\t\t\t(abilities.has('Aroma Veil') && this.randomChance(1, 2))\n\t\t\t\t)) ability = 'Healer';\n\t\t\t\tif (abilities.has('Intimidate')) ability = 'Intimidate';\n\t\t\t\tif (abilities.has('Klutz') && ability === 'Limber') ability = 'Klutz';\n\t\t\t\tif (abilities.has('Magic Guard') && ability !== 'Friend Guard' && ability !== 'Unaware') ability = 'Magic Guard';\n\t\t\t\tif (abilities.has('Ripen')) ability = 'Ripen';\n\t\t\t\tif (abilities.has('Stalwart')) ability = 'Stalwart';\n\t\t\t\tif (abilities.has('Storm Drain')) ability = 'Storm Drain';\n\t\t\t\tif (abilities.has('Telepathy') && (ability === 'Pressure' || abilities.has('Analytic'))) ability = 'Telepathy';\n\t\t\t}\n\t\t} else {\n\t\t\tability = abilityData[0].name;\n\t\t}\n\n\t\t// item = !isDoubles ? 'Leftovers' : 'Sitrus Berry';\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\t\tif (species.baseSpecies === 'Pikachu' && !gmax && this.dex.currentMod !== 'gen8bdsp') {\n\t\t\tforme = 'Pikachu' + this.sample(['', '-Original', '-Hoenn', '-Sinnoh', '-Unova', '-Kalos', '-Alola', '-Partner', '-World']);\n\t\t}\n\n\t\tlet level: number;\n\t\tif (this.adjustLevel) {\n\t\t\tlevel = this.adjustLevel;\n\t\t// doubles levelling\n\t\t} else if (isDoubles && species.randomDoubleBattleLevel) {\n\t\t\tlevel = species.randomDoubleBattleLevel;\n\t\t// No Dmax levelling\n\t\t} else if (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<Record<Species['tier'], number>> = {\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, glalie: 78, urshifurapidstrike: 79, haxorus: 80, inteleon: 80,\n\t\t\t\tcresselia: 83, octillery: 84, 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\tlevel = customScale[species.id] || tierScale[tier] || 80;\n\t\t// BDSP tier levelling\n\t\t} else if (this.dex.currentMod === 'gen8bdsp') {\n\t\t\tconst tierScale: Partial<Record<Species['tier'], number>> = {\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} = {delibird: 100, glalie: 76, luvdisc: 100, spinda: 100, unown: 100};\n\n\t\t\tlevel = customScale[species.id] || tierScale[species.tier] || 80;\n\t\t// Arbitrary levelling base on data files (typically winrate-influenced)\n\t\t} else if (species.randomBattleLevel) {\n\t\t\tlevel = species.randomBattleLevel;\n\t\t// Default to level 80\n\t\t} else {\n\t\t\tlevel = 80;\n\t\t}\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) {\n\t\tconst exclude = pokemonToExclude.map(p => toID(p.species));\n\t\tconst pokemonPool = [];\n\t\tfor (let species of this.dex.species.all()) {\n\t\t\tif (species.gen > this.gen || exclude.includes(species.id)) continue;\n\t\t\tif (this.dex.currentMod === 'gen8bdsp' && species.gen > 4) 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\t\t\tpokemonPool.push(species.id);\n\t\t}\n\t\treturn pokemonPool;\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 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 tierCount: {[k: string]: number} = {};\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\n\t\tconst pokemonPool = this.getPokemonPool(type, pokemon, isMonotype);\n\t\twhile (pokemonPool.length && pokemon.length < this.maxTeamSize) {\n\t\t\tlet species = this.dex.species.get(this.sampleNoReplace(pokemonPool));\n\t\t\tif (!species.exists) continue;\n\n\t\t\t// Check if the forme has moves for random battle\n\t\t\tif (this.format.gameType === 'singles') {\n\t\t\t\tif (!species.randomBattleMoves?.length) continue;\n\t\t\t} else {\n\t\t\t\tif (!species.randomDoubleBattleMoves?.length) continue;\n\t\t\t}\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// Adjust rate for species with multiple sets\n\t\t\t// TODO: investigate automating this by searching for Pokémon with multiple sets\n\t\t\tswitch (species.baseSpecies) {\n\t\t\tcase 'Arceus': case 'Silvally':\n\t\t\t\tif (this.randomChance(8, 9) && !isMonotype) continue;\n\t\t\t\tbreak;\n\t\t\tcase 'Aegislash': case 'Basculin': case 'Gourgeist': case 'Meloetta': case 'Rotom':\n\t\t\t\tif (this.randomChance(1, 2)) continue;\n\t\t\t\tbreak;\n\t\t\tcase 'Greninja':\n\t\t\t\tif (this.gen >= 7 && this.randomChance(1, 2)) continue;\n\t\t\t\tbreak;\n\t\t\tcase 'Darmanitan':\n\t\t\t\tif (species.gen === 8 && this.randomChance(1, 2)) continue;\n\t\t\t\tbreak;\n\t\t\tcase 'Necrozma': case 'Calyrex':\n\t\t\t\tif (this.randomChance(2, 3)) continue;\n\t\t\t\tbreak;\n\t\t\tcase 'Magearna': case 'Toxtricity': case 'Zacian': case 'Zamazenta': case 'Zarude':\n\t\t\tcase 'Appletun': case 'Blastoise': case 'Butterfree': case 'Copperajah': case 'Grimmsnarl':\n\t\t\tcase 'Inteleon': case 'Rillaboom': case 'Snorlax': case 'Urshifu': case 'Giratina': case 'Genesect':\n\t\t\tcase 'Cinderace':\n\t\t\t\tif (this.gen >= 8 && this.randomChance(1, 2)) continue;\n\t\t\t\tbreak;\n\t\t\t}\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 a Zoroark is present\n\t\t\tif (\n\t\t\t\tpokemon.some(pkmn => pkmn.species === 'Zoroark') &&\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 tier = species.tier;\n\t\t\tconst types = species.types;\n\t\t\tconst typeCombo = types.slice().sort().join();\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\t// Limit one Pokemon per tier, two for Monotype\n\t\t\t// This limitation is not applied to BD/SP team generation, because tiering for BD/SP is not yet complete,\n\t\t\t// meaning that most Pokémon are in OU.\n\t\t\tif (\n\t\t\t\tthis.dex.currentMod !== 'gen8bdsp' &&\n\t\t\t\t(tierCount[tier] >= (this.forceMonotype || isMonotype ? 2 : 1) * limitFactor) &&\n\t\t\t\t!this.randomChance(1, Math.pow(5, tierCount[tier]))\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\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\t\t\t}\n\n\t\t\t// Limit one of any type combination, two in Monotype\n\t\t\tif (!this.forceMonotype && typeComboCount[typeCombo] >= (isMonotype ? 2 : 1) * 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\tthis.format.gameType !== 'singles', 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\tif (pokemon.length === this.maxTeamSize) {\n\t\t\t\t// Set Zoroark's level to be the same as the last Pokemon\n\t\t\t\tconst illusion = teamDetails.illusion;\n\t\t\t\tif (illusion) pokemon[illusion - 1].level = pokemon[this.maxTeamSize - 1].level;\n\n\t\t\t\t// Don't bother tracking details for the last Pokemon\n\t\t\t\tbreak;\n\t\t\t}\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 tier counter\n\t\t\tif (tierCount[tier]) {\n\t\t\t\ttierCount[tier]++;\n\t\t\t} else {\n\t\t\t\ttierCount[tier] = 1;\n\t\t\t}\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\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\n\t\t\t// For setting Zoroark's level\n\t\t\tif (set.ability === 'Illusion') teamDetails.illusion = pokemon.length;\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 = {};\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}} = {};\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[]}[] = [];\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\tconst item = this.dex.items.get(curSet.item);\n\t\t\tif (itemsMax[item.id] && teamData.has[item.id] >= itemsMax[item.id]) continue;\n\n\t\t\tconst ability = this.dex.abilities.get(curSet.ability);\n\t\t\tif (teamData.weather && weatherAbilities.includes(ability.id)) continue; // reject 2+ weather setters\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\t\t\teffectivePool.push({set: curSet, moveVariants: curSetVariants});\n\t\t\tif (hasRequiredMove) priorityPool.push({set: curSet, moveVariants: curSetVariants});\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 = this.sampleIfArray(setData.set.item);\n\t\tconst 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émon 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 = {};\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 requiredMoveFamilies: string[] = [];\n\t\tconst requiredMoves: {[k: string]: string} = {};\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\n\t\twhile (pokemonPool.length && pokemon.length < this.maxTeamSize) {\n\t\t\t// Weighted random sampling\n\t\t\tlet maxUsage = 0;\n\t\t\tconst sets: {[k: string]: number} = {};\n\t\t\tfor (const specie of pokemonPool) {\n\t\t\t\tif (teamData.baseFormes[this.dex.species.get(specie).baseSpecies]) continue; // Species Clause\n\t\t\t\tconst usage: number = this.randomBSSFactorySets[specie].usage;\n\t\t\t\tsets[specie] = usage + maxUsage;\n\t\t\t\tmaxUsage += usage;\n\t\t\t}\n\n\t\t\tconst usage = this.random(1, maxUsage);\n\t\t\tlet last = 0;\n\t\t\tlet specie;\n\t\t\tfor (const key of Object.keys(sets)) {\n\t\t\t\t if (usage > last && usage <= sets[key]) {\n\t\t\t\t\t specie = key;\n\t\t\t\t\t break;\n\t\t\t\t }\n\t\t\t\t last = sets[key];\n\t\t\t}\n\n\t\t\tconst species = this.dex.species.get(specie);\n\t\t\tif (!species.exists) continue;\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\tfor (const type of types) {\n\t\t\t\tif (teamData.typeCount[type] > 1 && this.randomChance(4, 5)) {\n\t\t\t\t\tskip = true;\n\t\t\t\t\tbreak;\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 (typeCombo in teamData.typeComboCount) 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\tteamData.typeComboCount[typeCombo] = 1;\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\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émon 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.randomBSSFactoryTeam(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.randomBSSFactoryTeam(side, ++depth);\n\t\t\t}\n\t\t\tfor (const type in teamData.weaknesses) {\n\t\t\t\tif (teamData.weaknesses[type] >= 3) 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","import {MoveCounter, RandomGen8Teams, TeamData} from './gen8';\nimport {Utils} from './utils';\nimport {\n\tAnyObject,\n\tFormat,\n\tModdedDex,\n\tMove,\n\tPRNG,\n\tPRNGSeed,\n\tPlayerOptions,\n\tRandomTeamsTypes,\n\tSparseStatsTable,\n\tSpecies,\n\tStatID,\n\tStatsTable,\n\ttoID,\n} from '@pkmn/sim';\n\nexport interface BattleFactorySpecies {\n\tflags: {megaOnly?: 1, zmoveOnly?: 1, limEevee?: 1};\n\tsets: BattleFactorySet[];\n}\ninterface BattleFactorySet {\n\tspecies: string;\n\titem: string;\n\tability: string;\n\tnature: string;\n\tmoves: string[];\n\tevs?: Partial<StatsTable>;\n\tivs?: Partial<StatsTable>;\n}\n\nconst ZeroAttackHPIVs: {[k: string]: SparseStatsTable} = {\n\tgrass: {hp: 30, spa: 30},\n\tfire: {spa: 30, spe: 30},\n\tice: {def: 30},\n\tground: {spa: 30, spd: 30},\n\tfighting: {def: 30, spa: 30, spd: 30, spe: 30},\n\telectric: {def: 30, spe: 30},\n\tpsychic: {spe: 30},\n\tflying: {spa: 30, spd: 30, spe: 30},\n\trock: {def: 30, spd: 30, spe: 30},\n};\n\nexport class RandomGen7Teams extends RandomGen8Teams {\n\tconstructor(dex: ModdedDex, format: Format, prng: PRNG | PRNGSeed | null) {\n\t\tsuper(dex, format, prng);\n\n\t\tthis.noStab = [...this.noStab, 'voltswitch'];\n\n\t\tthis.moveEnforcementCheckers = {\n\t\t\tBug: movePool => movePool.includes('megahorn') || movePool.includes('pinmissile'),\n\t\t\tDark: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\t(!counter.get('Dark') && !abilities.has('Protean')) ||\n\t\t\t\t(moves.has('pursuit') && species.types.length > 1 && counter.get('Dark') === 1)\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!abilities.has('Aerilate') && !abilities.has('Pixilate') &&\n\t\t\t\t!moves.has('fly') && !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') && !types.has('Flying') && !abilities.has('Pixilate'))\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) => (\n\t\t\t\t!counter.get('Fire') || ['eruption', 'flareblitz', 'quiverdance'].some(m => movePool.includes(m))\n\t\t\t),\n\t\t\tFlying: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\t!counter.get('Flying') && (\n\t\t\t\t\tspecies.id === 'rotomfan' ||\n\t\t\t\t\tabilities.has('Gale Wings') ||\n\t\t\t\t\tabilities.has('Serene Grace') || (\n\t\t\t\t\t\ttypes.has('Normal') && (movePool.includes('beakblast') || movePool.includes('bravebird'))\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t),\n\t\t\tGhost: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t(!counter.get('Ghost') || movePool.includes('spectralthief')) &&\n\t\t\t\t!types.has('Dark') &&\n\t\t\t\t!abilities.has('Steelworker')\n\t\t\t),\n\t\t\tGrass: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\t!counter.get('Grass') && (species.baseStats.atk >= 100 || movePool.includes('leafstorm'))\n\t\t\t),\n\t\t\tGround: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!counter.get('Ground') && !moves.has('rest') && !moves.has('sleeptalk')\n\t\t\t),\n\t\t\tIce: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!abilities.has('Refrigerate') && (\n\t\t\t\t\t!counter.get('Ice') ||\n\t\t\t\t\tmovePool.includes('iciclecrash') ||\n\t\t\t\t\t(abilities.has('Snow Warning') && movePool.includes('blizzard'))\n\t\t\t\t)\n\t\t\t),\n\t\t\tNormal: movePool => movePool.includes('facade'),\n\t\t\tPoison: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!counter.get('Poison') &&\n\t\t\t\t(!!counter.setupType || abilities.has('Adaptability') || abilities.has('Sheer Force') || movePool.includes('gunkshot'))\n\t\t\t),\n\t\t\tPsychic: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\t!counter.get('Psychic') && (\n\t\t\t\t\tabilities.has('Psychic Surge') ||\n\t\t\t\t\tmovePool.includes('psychicfangs') ||\n\t\t\t\t\t(!types.has('Flying') && !abilities.has('Pixilate') && counter.get('stab') < species.types.length)\n\t\t\t\t)\n\t\t\t),\n\t\t\tRock: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\t!counter.get('Rock') &&\n\t\t\t\t!types.has('Fairy') &&\n\t\t\t\t(counter.setupType === 'Physical' || species.baseStats.atk >= 105 || abilities.has('Rock Head'))\n\t\t\t),\n\t\t\tSteel: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\t!counter.get('Steel') && (species.baseStats.atk >= 100 || abilities.has('Steelworker'))\n\t\t\t),\n\t\t\tWater: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\t(!counter.get('Water') && !abilities.has('Protean')) ||\n\t\t\t\t!counter.get('stab') ||\n\t\t\t\tmovePool.includes('crabhammer') ||\n\t\t\t\t(abilities.has('Huge Power') && movePool.includes('aquajet'))\n\t\t\t),\n\t\t\tAdaptability: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\t!counter.setupType &&\n\t\t\t\tspecies.types.length > 1 &&\n\t\t\t\t(!counter.get(species.types[0]) || !counter.get(species.types[1]))\n\t\t\t),\n\t\t\tContrary: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\t!counter.get('contrary') && species.name !== 'Shuckle'\n\t\t\t),\n\t\t\t'Slow Start': movePool => movePool.includes('substitute'),\n\t\t};\n\t}\n\n\tshouldCullMove(\n\t\tmove: Move,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\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): {cull: boolean, isSetup?: boolean} {\n\t\tconst hasRestTalk = moves.has('rest') && moves.has('sleeptalk');\n\t\tswitch (move.id) {\n\t\t// Not very useful without their supporting moves\n\t\tcase 'clangingscales': case 'electricterrain': case 'happyhour': case 'holdhands':\n\t\t\treturn {\n\t\t\t\tcull: !!teamDetails.zMove || hasRestTalk,\n\t\t\t\tisSetup: move.id === 'happyhour' || move.id === 'holdhands',\n\t\t\t};\n\t\tcase 'cottonguard': case 'defendorder':\n\t\t\treturn {cull: !counter.get('recovery') && !moves.has('rest')};\n\t\tcase 'bounce': case 'dig': case 'fly':\n\t\t\treturn {cull: !!teamDetails.zMove || counter.setupType !== 'Physical'};\n\t\tcase 'focuspunch':\n\t\t\treturn {cull: !moves.has('substitute') || counter.damagingMoves.size < 2};\n\t\tcase 'icebeam':\n\t\t\treturn {cull: abilities.has('Tinted Lens') && !!counter.get('Status')};\n\t\tcase 'perishsong':\n\t\t\treturn {cull: !moves.has('protect')};\n\t\tcase 'reflect':\n\t\t\tif (movePool.length > 1) {\n\t\t\t\tconst screen = movePool.indexOf('lightscreen');\n\t\t\t\tif (screen >= 0) this.fastPop(movePool, screen);\n\t\t\t}\n\t\t\treturn {cull: !moves.has('calmmind') && !moves.has('lightscreen')};\n\t\tcase 'rest':\n\t\t\treturn {cull: movePool.includes('sleeptalk')};\n\t\tcase 'sleeptalk':\n\t\t\tif (movePool.length > 1) {\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\treturn {cull: !moves.has('rest')};\n\t\tcase 'storedpower':\n\t\t\treturn {cull: !counter.setupType};\n\t\tcase 'switcheroo': case 'trick':\n\t\t\treturn {cull: (\n\t\t\t\tcounter.get('Physical') + counter.get('Special') < 3 ||\n\t\t\t\t['electroweb', 'snarl', 'suckerpunch'].some(m => moves.has(m))\n\t\t\t)};\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\treturn {cull: (\n\t\t\t\tcounter.setupType !== 'Physical' ||\n\t\t\t\tcounter.get('physicalsetup') > 1 ||\n\t\t\t\t(counter.get('Physical') + counter.get('physicalpool') < 2 && !hasRestTalk) ||\n\t\t\t\t(move.id === 'bulkup' && hasRestTalk) ||\n\t\t\t\t(move.id === 'bellydrum' && !abilities.has('Unburden') && !counter.get('priority'))\n\t\t\t), isSetup: true};\n\t\tcase 'calmmind': case 'geomancy': case 'nastyplot': case 'quiverdance': case 'tailglow':\n\t\t\tif (types.has('Dark') && moves.has('darkpulse')) {\n\t\t\t\tcounter.setupType = 'Special';\n\t\t\t\treturn {cull: false, isSetup: true};\n\t\t\t}\n\t\t\treturn {cull: (\n\t\t\t\tcounter.setupType !== 'Special' ||\n\t\t\t\tcounter.get('specialsetup') > 1 ||\n\t\t\t\t(counter.get('Special') + counter.get('specialpool') < 2 && !hasRestTalk)\n\t\t\t), isSetup: true};\n\t\tcase 'growth': case 'shellsmash': case 'workup':\n\t\t\treturn {cull: (\n\t\t\t\tcounter.setupType !== 'Mixed' ||\n\t\t\t\tcounter.get('mixedsetup') > 1 ||\n\t\t\t\tcounter.damagingMoves.size + counter.get('physicalpool') + counter.get('specialpool') < 2 ||\n\t\t\t\t(move.id === 'growth' && !moves.has('sunnyday'))\n\t\t\t), isSetup: true};\n\t\tcase 'agility': case 'autotomize': case 'rockpolish': case 'shiftgear':\n\t\t\treturn {cull: counter.damagingMoves.size < 2 || hasRestTalk, isSetup: !counter.setupType};\n\t\tcase 'flamecharge':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('dracometeor') ||\n\t\t\t\tmoves.has('overheat') ||\n\t\t\t\t(counter.damagingMoves.size < 3 && !counter.setupType)\n\t\t\t)};\n\n\t\t// Bad after setup\n\t\tcase 'circlethrow': case 'dragontail':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.get('speedsetup') ||\n\t\t\t\t(isDoubles && moves.has('superpower')) ||\n\t\t\t\t(!!counter.setupType && ((!moves.has('rest') && !moves.has('sleeptalk')) || moves.has('stormthrow'))) ||\n\t\t\t\t['encore', 'raindance', 'roar', 'trickroom', 'whirlwind'].some(m => moves.has(m)) ||\n\t\t\t\t(counter.get(move.type) > 1 && counter.get('Status') > 1) ||\n\t\t\t\t(abilities.has('Sheer Force') && !!counter.get('sheerforce'))\n\t\t\t)};\n\t\tcase 'defog':\n\t\t\treturn {cull: !!counter.setupType || moves.has('spikes') || moves.has('stealthrock') || !!teamDetails.defog};\n\t\tcase 'fakeout': case 'tailwind':\n\t\t\treturn {cull: !!counter.setupType || ['substitute', 'switcheroo', 'trick'].some(m => moves.has(m))};\n\t\tcase 'foulplay':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.setupType ||\n\t\t\t\t!!counter.get('speedsetup') ||\n\t\t\t\tcounter.get('Dark') > 2 ||\n\t\t\t\tmoves.has('clearsmog') ||\n\t\t\t\tcounter.damagingMoves.size - 1 === counter.get('priority') ||\n\t\t\t\thasRestTalk\n\t\t\t)};\n\t\tcase 'haze': case 'spikes':\n\t\t\treturn {cull: !!counter.setupType || !!counter.get('speedsetup') || moves.has('trickroom')};\n\t\tcase 'healbell': case 'technoblast':\n\t\t\treturn {cull: !!counter.get('speedsetup')};\n\t\tcase 'healingwish': case 'memento':\n\t\t\treturn {cull: !!counter.setupType || !!counter.get('recovery') || moves.has('substitute')};\n\t\tcase 'helpinghand': case 'yawn':\n\t\t\treturn {cull: !!counter.setupType};\n\t\tcase 'icywind': case 'stringshot':\n\t\t\treturn {cull: !!counter.get('speedsetup') || moves.has('trickroom')};\n\t\tcase 'leechseed': case 'roar': case 'whirlwind':\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('dragontail') ||\n\t\t\t\t(isDoubles && (movePool.includes('protect') || movePool.includes('spikyshield')))\n\t\t\t)};\n\t\tcase 'protect':\n\t\t\tconst doublesCondition = (\n\t\t\t\tmoves.has('fakeout') ||\n\t\t\t\t(moves.has('tailwind') && moves.has('roost')) ||\n\t\t\t\tmovePool.includes('bellydrum') ||\n\t\t\t\tmovePool.includes('shellsmash')\n\t\t\t);\n\t\t\tconst singlesCondition = counter.setupType && !moves.has('wish');\n\t\t\treturn {cull: (\n\t\t\t\t(isDoubles ? doublesCondition : singlesCondition) ||\n\t\t\t\t!!counter.get('speedsetup') ||\n\t\t\t\tmoves.has('rest') || moves.has('roar') || moves.has('whirlwind') ||\n\t\t\t\t(moves.has('lightscreen') && moves.has('reflect'))\n\t\t\t)};\n\t\tcase 'pursuit':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.setupType ||\n\t\t\t\tcounter.get('Status') > 1 ||\n\t\t\t\tcounter.get('Dark') > 2 ||\n\t\t\t\t(moves.has('knockoff') && !types.has('Dark'))\n\t\t\t)};\n\t\tcase 'rapidspin':\n\t\t\treturn {cull: !!counter.setupType || !!teamDetails.rapidSpin};\n\t\tcase 'reversal':\n\t\t\treturn {cull: moves.has('substitute') && !!teamDetails.zMove};\n\t\tcase 'seismictoss': case 'superfang':\n\t\t\treturn {cull: !abilities.has('Parental Bond') && (counter.damagingMoves.size > 1 || !!counter.setupType)};\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['rest', 'substitute', 'trickroom'].some(m => moves.has(m)) ||\n\t\t\t\t!!teamDetails.stealthRock\n\t\t\t)};\n\t\tcase 'stickyweb':\n\t\t\treturn {cull: !!teamDetails.stickyWeb};\n\t\tcase 'toxicspikes':\n\t\t\treturn {cull: !!counter.setupType || !!teamDetails.toxicSpikes};\n\t\tcase 'trickroom':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.setupType ||\n\t\t\t\t!!counter.get('speedsetup') ||\n\t\t\t\tcounter.damagingMoves.size < 2 ||\n\t\t\t\tmoves.has('lightscreen') ||\n\t\t\t\tmoves.has('reflect')\n\t\t\t)};\n\t\tcase 'uturn':\n\t\t\treturn {cull: (\n\t\t\t\t(abilities.has('Speed Boost') && moves.has('protect')) ||\n\t\t\t\t(abilities.has('Protean') && counter.get('Status') > 2) ||\n\t\t\t\t!!counter.setupType ||\n\t\t\t\t!!counter.get('speedsetup')\n\t\t\t)};\n\t\tcase 'voltswitch':\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['electricterrain', 'raindance', 'uturn'].some(m => moves.has(m))\n\t\t\t)};\n\n\t\t// Bit redundant to have both\n\t\t// Attacks:\n\t\tcase 'bugbite': case 'bugbuzz': case 'infestation': case 'signalbeam':\n\t\t\treturn {cull: moves.has('uturn') && !counter.setupType && !abilities.has('Tinted Lens')};\n\t\tcase 'darkestlariat': case 'nightslash':\n\t\t\treturn {cull: moves.has('knockoff') || moves.has('pursuit')};\n\t\tcase 'darkpulse':\n\t\t\treturn {cull: ['crunch', 'knockoff', 'hyperspacefury'].some(m => moves.has(m)) && counter.setupType !== 'Special'};\n\t\tcase 'suckerpunch':\n\t\t\treturn {cull: counter.damagingMoves.size < 2 || moves.has('glare') || !types.has('Dark') && counter.get('Dark') > 1};\n\t\tcase 'dracometeor':\n\t\t\treturn {cull: hasRestTalk};\n\t\tcase 'dragonpulse': case 'spacialrend':\n\t\t\treturn {cull: moves.has('dracometeor') || moves.has('outrage') || (moves.has('dragontail') && !counter.setupType)};\n\t\tcase 'outrage':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('dragonclaw') ||\n\t\t\t\t(moves.has('dracometeor') && counter.damagingMoves.size < 3) ||\n\t\t\t\t(moves.has('clangingscales') && !teamDetails.zMove)\n\t\t\t)};\n\t\tcase 'thunderbolt':\n\t\t\treturn {cull: ['discharge', 'voltswitch', 'wildcharge'].some(m => moves.has(m))};\n\t\tcase 'moonblast':\n\t\t\treturn {cull: isDoubles && moves.has('dazzlinggleam')};\n\t\tcase 'aurasphere': case 'focusblast':\n\t\t\treturn {cull: (\n\t\t\t\thasRestTalk ||\n\t\t\t\t((moves.has('closecombat') || moves.has('superpower')) && counter.setupType !== 'Special')\n\t\t\t)};\n\t\tcase 'drainpunch':\n\t\t\treturn {cull: (\n\t\t\t\t(!moves.has('bulkup') && (moves.has('closecombat') || moves.has('highjumpkick'))) ||\n\t\t\t\t((moves.has('focusblast') || moves.has('superpower')) && counter.setupType !== 'Physical')\n\t\t\t)};\n\t\tcase 'closecombat': case 'highjumpkick':\n\t\t\treturn {cull: (\n\t\t\t\t(moves.has('bulkup') && moves.has('drainpunch')) ||\n\t\t\t\t(counter.setupType === 'Special' && ['aurasphere', 'focusblast'].some(m => moves.has(m) || movePool.includes(m)))\n\t\t\t)};\n\t\tcase 'dynamicpunch': case 'vacuumwave':\n\t\t\treturn {cull: (moves.has('closecombat') || moves.has('facade')) && counter.setupType !== 'Special'};\n\t\tcase 'stormthrow':\n\t\t\treturn {cull: moves.has('circlethrow') && hasRestTalk};\n\t\tcase 'superpower':\n\t\t\treturn {\n\t\t\t\tcull: (counter.get('Fighting') > 1 && !!counter.setupType) || (hasRestTalk && !abilities.has('Contrary')),\n\t\t\t\tisSetup: abilities.has('Contrary'),\n\t\t\t};\n\t\tcase 'fierydance': case 'heatwave':\n\t\t\treturn {cull: moves.has('fireblast') && (!!counter.get('Status') || isDoubles)};\n\t\tcase 'firefang': case 'firepunch': case 'flamethrower':\n\t\t\treturn {cull: (\n\t\t\t\t['blazekick', 'heatwave', 'overheat'].some(m => moves.has(m)) ||\n\t\t\t\t((moves.has('fireblast') || moves.has('lavaplume')) && counter.setupType !== 'Physical')\n\t\t\t)};\n\t\tcase 'fireblast': case 'magmastorm':\n\t\t\treturn {cull: (\n\t\t\t\t(moves.has('flareblitz') && counter.setupType !== 'Special') ||\n\t\t\t\t(moves.has('lavaplume') && !counter.setupType && !counter.get('speedsetup'))\n\t\t\t)};\n\t\tcase 'lavaplume':\n\t\t\treturn {cull: moves.has('firepunch') || moves.has('fireblast') && (!!counter.setupType || !!counter.get('speedsetup'))};\n\t\tcase 'overheat':\n\t\t\treturn {cull: ['fireblast', 'flareblitz', 'lavaplume'].some(m => moves.has(m))};\n\t\tcase 'hurricane':\n\t\t\treturn {cull: moves.has('bravebird') || moves.has('airslash') && !!counter.get('Status')};\n\t\tcase 'hex':\n\t\t\treturn {cull: !moves.has('thunderwave') && !moves.has('willowisp')};\n\t\tcase 'shadowball':\n\t\t\treturn {cull: moves.has('darkpulse') || (moves.has('hex') && moves.has('willowisp'))};\n\t\tcase 'shadowclaw':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('shadowforce') ||\n\t\t\t\tmoves.has('shadowsneak') ||\n\t\t\t\t(moves.has('shadowball') && counter.setupType !== 'Physical')\n\t\t\t)};\n\t\tcase 'shadowsneak':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('trick') ||\n\t\t\t\thasRestTalk ||\n\t\t\t\t(types.has('Ghost') && species.types.length > 1 && counter.get('stab') < 2)\n\t\t\t)};\n\t\tcase 'gigadrain':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('petaldance') ||\n\t\t\t\tmoves.has('powerwhip') ||\n\t\t\t\t(!isDoubles && moves.has('seedbomb')) ||\n\t\t\t\t(moves.has('leafstorm') && counter.get('Special') < 4 && !counter.setupType && !moves.has('trickroom'))\n\t\t\t)};\n\t\tcase 'leafblade': case 'woodhammer':\n\t\t\treturn {cull: (\n\t\t\t\t(moves.has('gigadrain') && counter.setupType !== 'Physical') ||\n\t\t\t\t(moves.has('hornleech') && !!counter.setupType)\n\t\t\t)};\n\t\tcase 'leafstorm':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('trickroom') ||\n\t\t\t\t(isDoubles && moves.has('energyball')) ||\n\t\t\t\t(counter.get('Grass') > 1 && !!counter.setupType)\n\t\t\t)};\n\t\tcase 'seedbomb':\n\t\t\treturn {cull: moves.has('leafstorm') || isDoubles && moves.has('gigadrain')};\n\t\tcase 'solarbeam':\n\t\t\treturn {cull: (\n\t\t\t\t(!abilities.has('Drought') && !moves.has('sunnyday')) ||\n\t\t\t\tmoves.has('gigadrain') ||\n\t\t\t\tmoves.has('leafstorm')\n\t\t\t)};\n\t\tcase 'bonemerang': case 'precipiceblades':\n\t\t\treturn {cull: moves.has('earthquake')};\n\t\tcase 'earthpower':\n\t\t\treturn {cull: moves.has('earthquake') && counter.setupType !== 'Special'};\n\t\tcase 'earthquake':\n\t\t\treturn {cull: isDoubles && moves.has('highhorsepower')};\n\t\tcase 'freezedry':\n\t\t\treturn {cull: moves.has('icebeam') || moves.has('icywind') || counter.get('stab') < 2};\n\t\tcase 'bodyslam': case 'return':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('doubleedge') ||\n\t\t\t\t(moves.has('glare') && moves.has('headbutt')) ||\n\t\t\t\t(move.id === 'return' && moves.has('bodyslam'))\n\t\t\t)};\n\t\tcase 'endeavor':\n\t\t\treturn {cull: !isLead && !abilities.has('Defeatist')};\n\t\tcase 'explosion':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.setupType ||\n\t\t\t\tmoves.has('wish') ||\n\t\t\t\t(abilities.has('Refrigerate') && (moves.has('freezedry') || movePool.includes('return')))\n\t\t\t)};\n\t\tcase 'extremespeed': case 'skyattack':\n\t\t\treturn {cull: moves.has('substitute') || counter.setupType !== 'Physical' && moves.has('vacuumwave')};\n\t\tcase 'facade':\n\t\t\treturn {cull: moves.has('bulkup') || hasRestTalk};\n\t\tcase 'hiddenpower':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('rest') ||\n\t\t\t\t(!counter.get('stab') && counter.damagingMoves.size < 2) ||\n\t\t\t\t// Force Moonblast on Special-setup Fairies\n\t\t\t\t(counter.setupType === 'Special' && types.has('Fairy') && movePool.includes('moonblast'))\n\t\t\t)};\n\t\tcase 'hypervoice':\n\t\t\treturn {cull: moves.has('blizzard')};\n\t\tcase 'judgment':\n\t\t\treturn {cull: counter.setupType !== 'Special' && counter.get('stab') > 1};\n\t\tcase 'quickattack':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.get('speedsetup') ||\n\t\t\t\t(types.has('Rock') && !!counter.get('Status')) ||\n\t\t\t\tmoves.has('feint') ||\n\t\t\t\t(types.has('Normal') && !counter.get('stab'))\n\t\t\t)};\n\t\tcase 'weatherball':\n\t\t\treturn {cull: !moves.has('raindance') && !moves.has('sunnyday')};\n\t\tcase 'poisonjab':\n\t\t\treturn {cull: moves.has('gunkshot')};\n\t\tcase 'acidspray': case 'sludgewave':\n\t\t\treturn {cull: moves.has('poisonjab') || moves.has('sludgebomb')};\n\t\tcase 'psychic':\n\t\t\treturn {cull: moves.has('psyshock')};\n\t\tcase 'psychocut': case 'zenheadbutt':\n\t\t\treturn {cull: (\n\t\t\t\t((moves.has('psychic') || moves.has('psyshock')) && counter.setupType !== 'Physical') ||\n\t\t\t\t(abilities.has('Contrary') && !counter.setupType && !!counter.get('physicalpool'))\n\t\t\t)};\n\t\tcase 'psyshock':\n\t\t\tconst psychic = movePool.indexOf('psychic');\n\t\t\tif (psychic >= 0) this.fastPop(movePool, psychic);\n\t\t\treturn {cull: false};\n\t\tcase 'headsmash':\n\t\t\treturn {cull: moves.has('stoneedge') || isDoubles && moves.has('rockslide')};\n\t\tcase 'rockblast': case 'rockslide':\n\t\t\treturn {cull: (moves.has('headsmash') || moves.has('stoneedge')) && !isDoubles};\n\t\tcase 'stoneedge':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('rockslide') ||\n\t\t\t\t(abilities.has('Guts') && !moves.has('dynamicpunch')) ||\n\t\t\t\t(isDoubles && moves.has('rockslide'))\n\t\t\t)};\n\t\tcase 'bulletpunch':\n\t\t\treturn {cull: types.has('Steel') && counter.get('stab') < 2 && !abilities.has('Technician')};\n\t\tcase 'flashcannon':\n\t\t\treturn {cull: (moves.has('ironhead') || moves.has('meteormash')) && counter.setupType !== 'Special'};\n\t\tcase 'hydropump':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('liquidation') ||\n\t\t\t\tmoves.has('waterfall') ||\n\t\t\t\thasRestTalk || (\n\t\t\t\t\tmoves.has('scald') &&\n\t\t\t\t\t((counter.get('Special') < 4 && !moves.has('uturn')) || (species.types.length > 1 && counter.get('stab') < 3))\n\t\t\t\t)\n\t\t\t)};\n\t\tcase 'muddywater':\n\t\t\treturn {cull: isDoubles && (moves.has('scald') || moves.has('hydropump'))};\n\t\tcase 'originpulse': case 'surf':\n\t\t\treturn {cull: moves.has('hydropump') || moves.has('scald')};\n\t\tcase 'scald':\n\t\t\treturn {cull: ['liquidation', 'waterfall', 'waterpulse'].some(m => moves.has(m))};\n\n\t\t// Status:\n\t\tcase 'electroweb': case 'stunspore': case 'thunderwave':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.setupType ||\n\t\t\t\t!!counter.get('speedsetup') ||\n\t\t\t\thasRestTalk ||\n\t\t\t\t['discharge', 'spore', 'toxic', 'trickroom', 'yawn'].some(m => moves.has(m))\n\t\t\t)};\n\t\tcase 'glare': case 'headbutt':\n\t\t\treturn {cull: moves.has('bodyslam') || !moves.has('glare')};\n\t\tcase 'toxic':\n\t\t\tconst otherStatus = ['hypnosis', 'sleeppowder', 'toxicspikes', 'willowisp', 'yawn'].some(m => moves.has(m));\n\t\t\treturn {cull: otherStatus || !!counter.setupType || moves.has('flamecharge') || moves.has('raindance')};\n\t\tcase 'willowisp':\n\t\t\treturn {cull: moves.has('scald')};\n\t\tcase 'raindance':\n\t\t\treturn {cull: (\n\t\t\t\tcounter.get('Physical') + counter.get('Special') < 2 ||\n\t\t\t\thasRestTalk ||\n\t\t\t\tmoves.has('rest') ||\n\t\t\t\t(!types.has('Water') && !counter.get('Water'))\n\t\t\t)};\n\t\tcase 'sunnyday':\n\t\t\tconst cull = (\n\t\t\t\tcounter.get('Physical') + counter.get('Special') < 2 ||\n\t\t\t\t(!abilities.has('Chlorophyll') && !abilities.has('Flower Gift') && !moves.has('solarbeam')) ||\n\t\t\t\thasRestTalk\n\t\t\t);\n\n\t\t\tif (cull && movePool.length > 1) {\n\t\t\t\tconst solarbeam = movePool.indexOf('solarbeam');\n\t\t\t\tif (solarbeam >= 0) this.fastPop(movePool, solarbeam);\n\t\t\t\tif (movePool.length > 1) {\n\t\t\t\t\tconst weatherball = movePool.indexOf('weatherball');\n\t\t\t\t\tif (weatherball >= 0) this.fastPop(movePool, weatherball);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {cull};\n\t\tcase 'painsplit': case 'recover': case 'roost': case 'synthesis':\n\t\t\treturn {cull: moves.has('leechseed') || moves.has('rest')};\n\t\tcase 'substitute':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('dracometeor') ||\n\t\t\t\t(moves.has('leafstorm') && !abilities.has('Contrary')) ||\n\t\t\t\t['encore', 'pursuit', 'rest', 'taunt', 'uturn', 'voltswitch', 'whirlwind'].some(m => moves.has(m)) ||\n\t\t\t\tmovePool.includes('copycat')\n\t\t\t)};\n\t\tcase 'powersplit':\n\t\t\treturn {cull: moves.has('guardsplit')};\n\t\tcase 'wideguard':\n\t\t\treturn {cull: moves.has('protect')};\n\t\tcase 'bravebird':\n\t\t\t// Hurricane > Brave Bird in the rain\n\t\t\treturn {cull: (moves.has('raindance') || abilities.has('Drizzle')) && movePool.includes('hurricane')};\n\t\t}\n\t\treturn {cull: false};\n\t}\n\n\tshouldCullAbility(\n\t\tability: string,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tmovePool: string[],\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tisDoubles: boolean\n\t): boolean {\n\t\tswitch (ability) {\n\t\tcase 'Battle Bond': case 'Dazzling': case 'Flare Boost': case 'Hyper Cutter':\n\t\tcase 'Ice Body': case 'Innards Out': case 'Moody': case 'Steadfast':\n\t\t\treturn true;\n\t\tcase 'Aerilate': case 'Galvanize': case 'Pixilate': case 'Refrigerate':\n\t\t\treturn !counter.get('Normal');\n\t\tcase 'Analytic': case 'Download':\n\t\t\treturn species.nfe;\n\t\tcase 'Battle Armor': case 'Sturdy':\n\t\t\treturn (!!counter.get('recoil') && !counter.get('recovery'));\n\t\tcase 'Chlorophyll': case 'Leaf Guard':\n\t\t\treturn (\n\t\t\t\tspecies.baseStats.spe > 100 ||\n\t\t\t\tabilities.has('Harvest') ||\n\t\t\t\t(!moves.has('sunnyday') && !teamDetails.sun)\n\t\t\t);\n\t\tcase 'Competitive':\n\t\t\treturn (!counter.get('Special') || moves.has('sleeptalk') && moves.has('rest'));\n\t\tcase 'Compound Eyes': case 'No Guard':\n\t\t\treturn !counter.get('inaccurate');\n\t\tcase 'Contrary': case 'Iron Fist': case 'Skill Link': case 'Strong Jaw':\n\t\t\treturn !counter.get(toID(ability));\n\t\tcase 'Defiant': case 'Justified': case 'Moxie':\n\t\t\treturn !counter.get('Physical') || moves.has('dragontail');\n\t\tcase 'Flash Fire':\n\t\t\treturn abilities.has('Drought');\n\t\tcase 'Gluttony':\n\t\t\treturn !moves.has('bellydrum');\n\t\tcase 'Harvest':\n\t\t\treturn abilities.has('Frisk');\n\t\tcase 'Hustle':\n\t\t\treturn counter.get('Physical') < 2;\n\t\tcase 'Hydration': case 'Rain Dish': case 'Swift Swim':\n\t\t\treturn (species.baseStats.spe > 100 || !moves.has('raindance') && !teamDetails.rain);\n\t\tcase 'Slush Rush': case 'Snow Cloak':\n\t\t\treturn !teamDetails.hail;\n\t\tcase 'Immunity': case 'Snow Warning':\n\t\t\treturn (moves.has('facade') || moves.has('hypervoice'));\n\t\tcase 'Intimidate':\n\t\t\treturn (moves.has('bodyslam') || moves.has('rest') || abilities.has('Reckless') && counter.get('recoil') > 1);\n\t\tcase 'Lightning Rod':\n\t\t\treturn species.types.includes('Ground');\n\t\tcase 'Limber':\n\t\t\treturn species.types.includes('Electric');\n\t\tcase 'Liquid Voice':\n\t\t\treturn !counter.get('sound');\n\t\tcase 'Magic Guard': case 'Speed Boost':\n\t\t\treturn (abilities.has('Tinted Lens') && (!counter.get('Status') || moves.has('uturn')));\n\t\tcase 'Magician':\n\t\t\treturn moves.has('switcheroo');\n\t\tcase 'Magnet Pull':\n\t\t\treturn (!!counter.get('Normal') || !types.has('Electric') && !moves.has('earthpower'));\n\t\tcase 'Mold Breaker':\n\t\t\treturn (\n\t\t\t\tmoves.has('acrobatics') || moves.has('sleeptalk') ||\n\t\t\t\tabilities.has('Adaptability') || abilities.has('Iron Fist') ||\n\t\t\t\t(abilities.has('Sheer Force') && !!counter.get('sheerforce'))\n\t\t\t);\n\t\tcase 'Overgrow':\n\t\t\treturn !counter.get('Grass');\n\t\tcase 'Poison Heal':\n\t\t\treturn (abilities.has('Technician') && !!counter.get('technician'));\n\t\tcase 'Power Construct':\n\t\t\treturn species.forme === '10%';\n\t\tcase 'Prankster':\n\t\t\treturn !counter.get('Status');\n\t\tcase 'Pressure': case 'Synchronize':\n\t\t\treturn (counter.get('Status') < 2 || !!counter.get('recoil') || !!species.isMega);\n\t\tcase 'Regenerator':\n\t\t\treturn abilities.has('Magic Guard');\n\t\tcase 'Quick Feet':\n\t\t\treturn moves.has('bellydrum');\n\t\tcase 'Reckless': case 'Rock Head':\n\t\t\treturn (!counter.get('recoil') || !!species.isMega);\n\t\tcase 'Sand Force': case 'Sand Rush': case 'Sand Veil':\n\t\t\treturn !teamDetails.sand;\n\t\tcase 'Scrappy':\n\t\t\treturn !species.types.includes('Normal');\n\t\tcase 'Serene Grace':\n\t\t\treturn (!counter.get('serenegrace') || species.name === 'Blissey');\n\t\tcase 'Sheer Force':\n\t\t\treturn (!counter.get('sheerforce') || moves.has('doubleedge') || abilities.has('Guts') || !!species.isMega);\n\t\tcase 'Simple':\n\t\t\treturn (!counter.setupType && !moves.has('flamecharge'));\n\t\tcase 'Solar Power':\n\t\t\treturn (!counter.get('Special') || !teamDetails.sun || !!species.isMega);\n\t\tcase 'Swarm':\n\t\t\treturn (!counter.get('Bug') || !!species.isMega);\n\t\tcase 'Sweet Veil':\n\t\t\treturn types.has('Grass');\n\t\tcase 'Technician':\n\t\t\treturn (!counter.get('technician') || moves.has('tailslap') || !!species.isMega);\n\t\tcase 'Tinted Lens':\n\t\t\treturn (\n\t\t\t\tmoves.has('protect') || !!counter.get('damage') ||\n\t\t\t\t(counter.get('Status') > 2 && !counter.setupType) ||\n\t\t\t\tabilities.has('Prankster') ||\n\t\t\t\t(abilities.has('Magic Guard') && !!counter.get('Status'))\n\t\t\t);\n\t\tcase 'Torrent':\n\t\t\treturn (!counter.get('Water') || !!species.isMega);\n\t\tcase 'Unaware':\n\t\t\treturn (!!counter.setupType || abilities.has('Magic Guard'));\n\t\tcase 'Unburden':\n\t\t\treturn (!!species.isMega || abilities.has('Prankster') || !counter.setupType && !moves.has('acrobatics'));\n\t\tcase 'Water Absorb':\n\t\t\treturn moves.has('raindance') || ['Drizzle', 'Unaware', 'Volt Absorb'].some(abil => abilities.has(abil));\n\t\tcase 'Weak Armor':\n\t\t\treturn counter.setupType !== 'Physical';\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tgetHighPriorityItem(\n\t\tability: string,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tisLead: boolean,\n\t\tisDoubles: boolean\n\t): string | undefined {\n\t\tif (species.requiredItems) {\n\t\t\tif (\n\t\t\t\tspecies.baseSpecies === 'Arceus' &&\n\t\t\t\t(moves.has('judgment') || !counter.get(species.types[0]) || teamDetails.zMove)\n\t\t\t) {\n\t\t\t\t// Judgment doesn't change type with Z-Crystals\n\t\t\t\treturn species.requiredItems[0];\n\t\t\t}\n\t\t\treturn this.sample(species.requiredItems);\n\t\t}\n\n\t\t// First, the extra high-priority items\n\t\tif (species.name === 'Dedenne') return moves.has('substitute') ? 'Petaya Berry' : 'Sitrus Berry';\n\t\tif (species.name === 'Deoxys-Attack') return (isLead && moves.has('stealthrock')) ? 'Focus Sash' : 'Life Orb';\n\t\tif (species.name === 'Farfetch\\u2019d') return 'Stick';\n\t\tif (species.name === 'Genesect' && moves.has('technoblast')) return 'Douse Drive';\n\t\tif (species.baseSpecies === 'Marowak') return 'Thick Club';\n\t\tif (species.name === 'Pikachu') return 'Light Ball';\n\t\tif (species.name === 'Shedinja' || species.name === 'Smeargle') return 'Focus Sash';\n\t\tif (species.name === 'Unfezant' && counter.get('Physical') >= 2) return 'Scope Lens';\n\t\tif (species.name === 'Unown') return 'Choice Specs';\n\t\tif (species.name === 'Wobbuffet') return 'Custap Berry';\n\t\tif (ability === 'Harvest' || ability === 'Emergency Exit' && !!counter.get('Status')) return 'Sitrus Berry';\n\t\tif (ability === 'Imposter') return 'Choice Scarf';\n\t\tif (ability === 'Poison Heal') return 'Toxic Orb';\n\t\tif (species.nfe) return (ability === 'Technician' && counter.get('Physical') >= 4) ? 'Choice Band' : 'Eviolite';\n\t\tif (moves.has('switcheroo') || moves.has('trick')) {\n\t\t\tif (species.baseStats.spe >= 60 && species.baseStats.spe <= 108) {\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('bellydrum')) {\n\t\t\tif (ability === 'Gluttony') {\n\t\t\t\treturn `${this.sample(['Aguav', 'Figy', 'Iapapa', 'Mago', 'Wiki'])} Berry`;\n\t\t\t} else if (species.baseStats.spe <= 50 && !teamDetails.zMove && this.randomChance(1, 2)) {\n\t\t\t\treturn 'Normalium Z';\n\t\t\t} else {\n\t\t\t\treturn 'Sitrus Berry';\n\t\t\t}\n\t\t}\n\t\tif (moves.has('copycat') && counter.get('Physical') >= 3) return 'Choice Band';\n\t\tif (moves.has('geomancy') || moves.has('skyattack')) return 'Power Herb';\n\t\tif (moves.has('shellsmash')) {\n\t\t\treturn (ability === 'Solid Rock' && !!counter.get('priority')) ? 'Weakness Policy' : 'White Herb';\n\t\t}\n\t\tif ((ability === 'Guts' || moves.has('facade')) && !moves.has('sleeptalk')) {\n\t\t\treturn (types.has('Fire') || ability === 'Quick Feet' || ability === 'Toxic Boost') ? 'Toxic Orb' : 'Flame Orb';\n\t\t}\n\t\tif (\n\t\t\t(ability === 'Magic Guard' && counter.damagingMoves.size > 1) ||\n\t\t\t(ability === 'Sheer Force' && counter.get('sheerforce'))\n\t\t) {\n\t\t\treturn 'Life Orb';\n\t\t}\n\t\tif (ability === 'Unburden') return moves.has('fakeout') ? 'Normal Gem' : 'Sitrus Berry';\n\t\tif (moves.has('acrobatics')) return '';\n\t\tif (moves.has('electricterrain') || ability === 'Electric Surge' && moves.has('thunderbolt')) return 'Electrium Z';\n\t\tif (\n\t\t\tmoves.has('happyhour') ||\n\t\t\tmoves.has('holdhands') ||\n\t\t\t(moves.has('encore') && ability === 'Contrary')\n\t\t) return 'Normalium Z';\n\t\tif (moves.has('raindance')) {\n\t\t\tif (species.baseSpecies === 'Castform' && !teamDetails.zMove) {\n\t\t\t\treturn 'Waterium Z';\n\t\t\t} else {\n\t\t\t\treturn (ability === 'Forecast') ? 'Damp Rock' : 'Life Orb';\n\t\t\t}\n\t\t}\n\t\tif (moves.has('sunnyday')) {\n\t\t\tif ((species.baseSpecies === 'Castform' || species.baseSpecies === 'Cherrim') && !teamDetails.zMove) {\n\t\t\t\treturn 'Firium Z';\n\t\t\t} else {\n\t\t\t\treturn (ability === 'Forecast') ? 'Heat Rock' : 'Life Orb';\n\t\t\t}\n\t\t}\n\n\t\tif (moves.has('solarbeam') && ability !== 'Drought' && !moves.has('sunnyday') && !teamDetails.sun) {\n\t\t\treturn !teamDetails.zMove ? 'Grassium Z' : 'Power Herb';\n\t\t}\n\n\t\tif (moves.has('auroraveil') || moves.has('lightscreen') && moves.has('reflect')) return 'Light Clay';\n\t\tif (\n\t\t\tmoves.has('rest') && !moves.has('sleeptalk') &&\n\t\t\tability !== 'Natural Cure' && ability !== 'Shed Skin' && ability !== 'Shadow Tag'\n\t\t) {\n\t\t\treturn 'Chesto Berry';\n\t\t}\n\n\t\t// Z-Moves\n\t\tif (!teamDetails.zMove) {\n\t\t\tif (species.name === 'Decidueye' && moves.has('spiritshackle') && counter.setupType) {\n\t\t\t\treturn 'Decidium Z';\n\t\t\t}\n\t\t\tif (species.name === 'Kommo-o') return moves.has('clangingscales') ? 'Kommonium Z' : 'Dragonium Z';\n\t\t\tif (species.baseSpecies === 'Lycanroc' && moves.has('stoneedge') && counter.setupType) {\n\t\t\t\treturn 'Lycanium Z';\n\t\t\t}\n\t\t\tif (species.name === 'Marshadow' && moves.has('spectralthief') && counter.setupType) {\n\t\t\t\treturn 'Marshadium Z';\n\t\t\t}\n\t\t\tif (species.name === 'Necrozma-Dusk-Mane' || species.name === 'Necrozma-Dawn-Wings') {\n\t\t\t\tif (moves.has('autotomize') && moves.has('sunsteelstrike')) {\n\t\t\t\t\treturn 'Solganium Z';\n\t\t\t\t} else if (moves.has('trickroom') && moves.has('moongeistbeam')) {\n\t\t\t\t\treturn 'Lunalium Z';\n\t\t\t\t} else {\n\t\t\t\t\treturn 'Ultranecrozium Z';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (species.name === 'Mimikyu' && moves.has('playrough') && counter.setupType) return 'Mimikium Z';\n\t\t\tif (species.name === 'Raichu-Alola' && moves.has('thunderbolt') && counter.setupType) return 'Aloraichium Z';\n\t\t\tif (moves.has('bugbuzz') && counter.setupType && species.baseStats.spa > 100) return 'Buginium Z';\n\t\t\tif (\n\t\t\t\t(moves.has('darkpulse') && ability === 'Fur Coat' && counter.setupType) ||\n\t\t\t\t(moves.has('suckerpunch') && ability === 'Moxie' && counter.get('Dark') < 2)\n\t\t\t) {\n\t\t\t\treturn 'Darkinium Z';\n\t\t\t}\n\t\t\tif (moves.has('outrage') && counter.setupType && !moves.has('fly')) return 'Dragonium Z';\n\t\t\tif (moves.has('fleurcannon') && !!counter.get('speedsetup')) return 'Fairium Z';\n\t\t\tif (\n\t\t\t\t(moves.has('focusblast') && types.has('Fighting') && counter.setupType) ||\n\t\t\t\t(moves.has('reversal') && moves.has('substitute'))\n\t\t\t) {\n\t\t\t\treturn 'Fightinium Z';\n\t\t\t}\n\t\t\tif (\n\t\t\t\tmoves.has('fly') ||\n\t\t\t\t(moves.has('hurricane') && species.baseStats.spa >= 125 && (!!counter.get('Status') || moves.has('superpower'))) ||\n\t\t\t\t((moves.has('bounce') || moves.has('bravebird')) && counter.setupType)\n\t\t\t) {\n\t\t\t\treturn 'Flyinium Z';\n\t\t\t}\n\t\t\tif (moves.has('shadowball') && counter.setupType && ability === 'Beast Boost') return 'Ghostium Z';\n\t\t\tif (\n\t\t\t\tmoves.has('sleeppowder') && types.has('Grass') &&\n\t\t\t\tcounter.setupType && species.baseStats.spe <= 70\n\t\t\t) {\n\t\t\t\treturn 'Grassium Z';\n\t\t\t}\n\t\t\tif (moves.has('magmastorm')) return 'Firium Z';\n\t\t\tif (moves.has('dig')) return 'Groundium Z';\n\t\t\tif (moves.has('photongeyser') && counter.setupType) return 'Psychium Z';\n\t\t\tif (moves.has('stoneedge') && types.has('Rock') && moves.has('swordsdance')) return 'Rockium Z';\n\t\t\tif (moves.has('hydropump') && ability === 'Battle Bond' && moves.has('uturn')) return 'Waterium Z';\n\t\t\tif ((moves.has('hail') || (moves.has('blizzard') && ability !== 'Snow Warning'))) return 'Icium Z';\n\t\t}\n\t}\n\n\tgetMediumPriorityItem(\n\t\tability: string,\n\t\tmoves: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tspecies: Species,\n\t\tisDoubles: boolean,\n\t\tisLead: 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\t(ability === 'Speed Boost' || ability === 'Stance Change' || species.name === 'Pheromosa') &&\n\t\t\tcounter.get('Physical') + counter.get('Special') > 2 &&\n\t\t\t!moves.has('uturn')\n\t\t) {\n\t\t\treturn 'Life Orb';\n\t\t}\n\n\t\tif (isDoubles && moves.has('uturn') && counter.get('Physical') === 4 && !moves.has('fakeout')) {\n\t\t\treturn (\n\t\t\t\tspecies.baseStats.spe >= 60 && species.baseStats.spe <= 108 &&\n\t\t\t\t!counter.get('priority') && this.randomChance(1, 2)\n\t\t\t) ? 'Choice Scarf' : 'Choice Band';\n\t\t}\n\t\tif (isDoubles && counter.get('Special') === 4 && (moves.has('waterspout') || moves.has('eruption'))) {\n\t\t\treturn 'Choice Scarf';\n\t\t}\n\n\t\tif (\n\t\t\t!isDoubles &&\n\t\t\tcounter.get('Physical') >= 4 &&\n\t\t\t['bodyslam', 'dragontail', 'fakeout', 'flamecharge', 'rapidspin', 'suckerpunch'].every(m => !moves.has(m))\n\t\t) {\n\t\t\treturn (\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\t!counter.get('priority') &&\n\t\t\t\tthis.randomChance(2, 3)\n\t\t\t) ? 'Choice Scarf' : 'Choice Band';\n\t\t}\n\t\tif (\n\t\t\t!isDoubles &&\n\t\t\t(counter.get('Special') >= 4 || (counter.get('Special') >= 3 && moves.has('uturn'))) &&\n\t\t\t!moves.has('acidspray') && !moves.has('clearsmog')\n\t\t) {\n\t\t\treturn (\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' &&\n\t\t\t\t!counter.get('Physical') && !counter.get('priority') &&\n\t\t\t\tthis.randomChance(2, 3)\n\t\t\t) ? '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\tmoves.has('defog') &&\n\t\t\t!moves.has('foulplay') &&\n\t\t\tspecies.baseStats.spe >= 60 && species.baseStats.spe <= 108 &&\n\t\t\t!counter.get('priority')\n\t\t) {\n\t\t\treturn 'Choice Scarf';\n\t\t}\n\t\tif (!isDoubles && (\n\t\t\tability === 'Drizzle' ||\n\t\t\tability === 'Slow Start' ||\n\t\t\tspecies.name.includes('Rotom-') ||\n\t\t\t['aromatherapy', 'bite', 'clearsmog', 'curse', 'protect', 'sleeptalk'].some(m => moves.has(m)))\n\t\t) {\n\t\t\treturn 'Leftovers';\n\t\t}\n\t\tif (['endeavor', 'flail', 'reversal'].some(m => moves.has(m)) && ability !== 'Sturdy') {\n\t\t\treturn (ability === 'Defeatist') ? 'Expert Belt' : 'Focus Sash';\n\t\t}\n\t\tif (moves.has('outrage') && counter.setupType) return 'Lum Berry';\n\t\tif (\n\t\t\tisDoubles &&\n\t\t\tcounter.damagingMoves.size >= 3 &&\n\t\t\tspecies.baseStats.spe >= 70 &&\n\t\t\tability !== 'Multiscale' && ability !== 'Sturdy' && [\n\t\t\t\t'acidspray', 'electroweb', 'fakeout', 'feint', 'flamecharge', 'icywind',\n\t\t\t\t'incinerate', 'naturesmadness', 'rapidspin', 'snarl', 'suckerpunch', 'uturn',\n\t\t\t].every(m => !moves.has(m))\n\t\t) {\n\t\t\treturn defensiveStatTotal >= 275 ? 'Sitrus Berry' : 'Life Orb';\n\t\t}\n\n\t\tif (moves.has('substitute')) return counter.damagingMoves.size > 2 && !!counter.get('drain') ? 'Life Orb' : 'Leftovers';\n\t\tif (\n\t\t\t!isDoubles &&\n\t\t\tthis.dex.getEffectiveness('Ground', species) >= 2 &&\n\t\t\tability !== 'Levitate' &&\n\t\t\t!moves.has('magnetrise')\n\t\t) {\n\t\t\treturn 'Air Balloon';\n\t\t}\n\t\tif ((ability === 'Iron Barbs' || ability === 'Rough Skin') && this.randomChance(1, 2)) return 'Rocky Helmet';\n\t\tif (\n\t\t\tcounter.get('Physical') + counter.get('Special') >= 4 &&\n\t\t\tspecies.baseStats.spd >= 50 && defensiveStatTotal >= 235\n\t\t) {\n\t\t\treturn 'Assault Vest';\n\t\t}\n\t\tif (species.name === 'Palkia' && (moves.has('dracometeor') || moves.has('spacialrend')) && moves.has('hydropump')) {\n\t\t\treturn 'Lustrous Orb';\n\t\t}\n\t\tif (counter.damagingMoves.size >= 4) {\n\t\t\treturn (counter.get('Dragon') || counter.get('Dark') || counter.get('Normal')) ? 'Life Orb' : 'Expert Belt';\n\t\t}\n\t\tif (counter.damagingMoves.size >= 3 && !!counter.get('speedsetup') && defensiveStatTotal >= 300) {\n\t\t\treturn 'Weakness Policy';\n\t\t}\n\t\tif (\n\t\t\t!isDoubles && isLead &&\n\t\t\t!['Regenerator', 'Sturdy'].includes(ability) &&\n\t\t\t!counter.get('recoil') && !counter.get('recovery') &&\n\t\t\tdefensiveStatTotal < 255\n\t\t) {\n\t\t\treturn 'Focus Sash';\n\t\t}\n\t}\n\n\tgetLowPriorityItem(\n\t\tability: string,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tisLead: boolean,\n\t\tisDoubles: boolean\n\t): string | undefined {\n\t\t// This is the \"REALLY can't think of a good item\" cutoff\n\t\tif (moves.has('stickyweb') && ability === 'Sturdy') return 'Mental Herb';\n\t\tif (ability === 'Serene Grace' && moves.has('airslash') && species.baseStats.spe > 100) return 'Metronome';\n\t\tif (ability === 'Sturdy' && moves.has('explosion') && !counter.get('speedsetup')) return 'Custap Berry';\n\t\tif (ability === 'Super Luck') return 'Scope Lens';\n\t\tif (\n\t\t\t!isDoubles &&\n\t\t\tcounter.damagingMoves.size >= 3 &&\n\t\t\tability !== 'Sturdy' &&\n\t\t\t['acidspray', 'dragontail', 'foulplay', 'rapidspin', 'superfang', 'uturn'].every(m => !moves.has(m)) && (\n\t\t\t\tcounter.get('speedsetup') ||\n\t\t\t\tmoves.has('trickroom') ||\n\t\t\t\t(species.baseStats.spe > 40 && species.baseStats.hp + species.baseStats.def + species.baseStats.spd < 275)\n\t\t\t)\n\t\t) {\n\t\t\treturn 'Life Orb';\n\t\t}\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): RandomTeamsTypes.RandomSet {\n\t\tspecies = this.dex.species.get(species);\n\t\tlet forme = species.name;\n\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\tforme = species.battleOnly;\n\t\t}\n\t\tif (species.cosmeticFormes) {\n\t\t\tforme = this.sample([species.name].concat(species.cosmeticFormes));\n\t\t}\n\n\t\tconst randMoves = isDoubles ?\n\t\t\t(species.randomDoubleBattleMoves || species.randomBattleMoves) :\n\t\t\tspecies.randomBattleMoves;\n\t\tconst movePool = (randMoves || Object.keys(this.dex.species.getLearnset(species.id)!)).slice();\n\t\tif (this.format.gameType === 'multi') {\n\t\t\t// Random Multi Battle uses doubles move pools, but Ally Switch fails in multi battles\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\tconst moves = new Set<string>();\n\t\tlet ability = '';\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<string>();\n\t\tfor (const abilityName of Object.values(species.abilities)) {\n\t\t\tif (abilityName === species.abilities.S || (species.unreleasedHidden && abilityName === species.abilities.H)) continue;\n\t\t\tabilities.add(abilityName);\n\t\t}\n\n\t\tlet availableHP = 0;\n\t\tfor (const moveid of movePool) {\n\t\t\tif (moveid.startsWith('hiddenpower')) availableHP++;\n\t\t}\n\n\t\t// These moves can be used even if we aren't setting up to use them:\n\t\tconst SetupException = ['closecombat', 'diamondstorm', 'extremespeed', 'superpower', 'clangingscales'];\n\n\t\tlet counter: MoveCounter;\n\t\t// We use a special variable to track Hidden Power\n\t\t// so that we can check for all Hidden Powers at once\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\twhile (moves.size < this.maxMoveCount && movePool.length) {\n\t\t\t\tconst moveid = this.sampleNoReplace(movePool);\n\t\t\t\tif (moveid.startsWith('hiddenpower')) {\n\t\t\t\t\tavailableHP--;\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\t\t\twhile (moves.size < this.maxMoveCount && rejectedPool.length) {\n\t\t\t\tconst moveid = this.sampleNoReplace(rejectedPool);\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\n\t\t\t\tlet {cull, isSetup} = this.shouldCullMove(\n\t\t\t\t\tmove, types, moves, abilities, counter, movePool, teamDetails,\n\t\t\t\t\tspecies, isLead, isDoubles\n\t\t\t\t);\n\n\t\t\t\t// This move doesn't satisfy our setup requirements:\n\t\t\t\tif (\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]) + (counter.get(species.types[1]) || 0);\n\t\t\t\t\tif (\n\t\t\t\t\t\t!SetupException.includes(moveid) &&\n\t\t\t\t\t\t(!types.has(move.type) || stabs > 1 || counter.get(move.category) < 2)\n\t\t\t\t\t) cull = true;\n\t\t\t\t}\n\t\t\t\t// Hidden Power isn't good enough\n\t\t\t\tif (\n\t\t\t\t\tcounter.setupType === 'Special' &&\n\t\t\t\t\tmoveid === 'hiddenpower' &&\n\t\t\t\t\tspecies.types.length > 1 &&\n\t\t\t\t\tcounter.get('Special') <= 2 &&\n\t\t\t\t\t!types.has(move.type) &&\n\t\t\t\t\t!counter.get('Physical') &&\n\t\t\t\t\tcounter.get('specialpool')\n\t\t\t\t) {\n\t\t\t\t\tcull = true;\n\t\t\t\t}\n\n\t\t\t\tconst singlesEnforcement = (\n\t\t\t\t\t!['judgment', 'lightscreen', 'reflect', 'sleeptalk', 'toxic'].includes(moveid) && (\n\t\t\t\t\t\tmove.category !== 'Status' ||\n\t\t\t\t\t\t// should allow Meganium to cull a recovery move for the sake of STAB\n\t\t\t\t\t\t!(move.flags.heal && species.id !== 'meganium')\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\t// Pokemon should have moves that benefit their Type/Ability/Weather, as well as moves required by its forme\n\t\t\t\tif (\n\t\t\t\t\t!cull &&\n\t\t\t\t\t!move.damage &&\n\t\t\t\t\t!isSetup &&\n\t\t\t\t\t!move.weather &&\n\t\t\t\t\t!move.stallingMove &&\n\t\t\t\t\t(isDoubles || singlesEnforcement) && (\n\t\t\t\t\t\t!counter.setupType || counter.setupType === 'Mixed' ||\n\t\t\t\t\t\t(move.category !== counter.setupType && move.category !== 'Status') ||\n\t\t\t\t\t\t(counter.get(counter.setupType) + counter.get('Status') > 3 && !counter.get('hazards'))\n\t\t\t\t\t) && (\n\t\t\t\t\t\tmove.category === 'Status' ||\n\t\t\t\t\t\t!types.has(move.type) ||\n\t\t\t\t\t\t(move.basePower && move.basePower < 40 && !move.multihit)\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tif (\n\t\t\t\t\t\t(!counter.get('stab') && !moves.has('nightshade') && !moves.has('seismictoss') && (\n\t\t\t\t\t\t\tspecies.types.length > 1 ||\n\t\t\t\t\t\t\t(species.types[0] !== 'Normal' && species.types[0] !== 'Psychic') ||\n\t\t\t\t\t\t\t!moves.has('icebeam') ||\n\t\t\t\t\t\t\tspecies.baseStats.spa >= species.baseStats.spd\n\t\t\t\t\t\t)) || (\n\t\t\t\t\t\t\tmoves.has('suckerpunch') && !abilities.has('Contrary') && counter.get('stab') < species.types.length\n\t\t\t\t\t\t) || (\n\t\t\t\t\t\t\t(['recover', 'roost', 'slackoff', 'softboiled'].some(m => movePool.includes(m))) &&\n\t\t\t\t\t\t\tcounter.get('Status') &&\n\t\t\t\t\t\t\t!counter.setupType &&\n\t\t\t\t\t\t\t['healingwish', 'trick', 'trickroom'].every(m => !moves.has(m))\n\t\t\t\t\t\t) || (\n\t\t\t\t\t\t\tmovePool.includes('milkdrink') ||\n\t\t\t\t\t\t\tmovePool.includes('shoreup') ||\n\t\t\t\t\t\t\t(movePool.includes('stickyweb') && !counter.setupType && !teamDetails.stickyWeb)\n\t\t\t\t\t\t) || (\n\t\t\t\t\t\t\tisLead &&\n\t\t\t\t\t\t\tmovePool.includes('stealthrock') &&\n\t\t\t\t\t\t\tcounter.get('Status') && !counter.setupType &&\n\t\t\t\t\t\t\t!counter.get('speedsetup') && !moves.has('substitute')\n\t\t\t\t\t\t) || (\n\t\t\t\t\t\t\tspecies.requiredMove && movePool.includes(toID(species.requiredMove))\n\t\t\t\t\t\t) || (\n\t\t\t\t\t\t\t!counter.get('Normal') &&\n\t\t\t\t\t\t\t(abilities.has('Aerilate') || abilities.has('Pixilate') || (abilities.has('Refrigerate') && !moves.has('blizzard')))\n\t\t\t\t\t\t)\n\t\t\t\t\t) {\n\t\t\t\t\t\tcull = true;\n\t\t\t\t\t} else {\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\tfor (const abil of abilities) {\n\t\t\t\t\t\t\tif (runEnforcementChecker(abil)) {\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 (moveid === '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\tconst moveIsHP = moveid.startsWith('hiddenpower');\n\t\t\t\tif (cull && (\n\t\t\t\t\tmovePool.length - availableHP ||\n\t\t\t\t\t(availableHP && (moveIsHP || !hasHiddenPower))\n\t\t\t\t)) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tmove.category !== 'Status' &&\n\t\t\t\t\t\t!move.damage &&\n\t\t\t\t\t\t!move.flags.charge &&\n\t\t\t\t\t\t(!moveIsHP || !availableHP)\n\t\t\t\t\t) {\n\t\t\t\t\t\trejectedPool.push(moveid);\n\t\t\t\t\t}\n\t\t\t\t\tif (moveIsHP) hasHiddenPower = false;\n\t\t\t\t\tmoves.delete(moveid);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (cull && rejectedPool.length) {\n\t\t\t\t\tif (moveIsHP) 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// Moveset modifications\n\t\tif (moves.has('autotomize') && moves.has('heavyslam')) {\n\t\t\tif (species.id === 'celesteela') {\n\t\t\t\tmoves.delete('heavyslam');\n\t\t\t\tmoves.add('flashcannon');\n\t\t\t} else {\n\t\t\t\tmoves.delete('autotomize');\n\t\t\t\tmoves.add('rockpolish');\n\t\t\t}\n\t\t}\n\t\tif (moves.has('raindance') && moves.has('thunderbolt') && !isDoubles) {\n\t\t\tmoves.delete('thunderbolt');\n\t\t\tmoves.add('thunder');\n\t\t}\n\t\tif (moves.has('workup') && !counter.get('Special') && species.id === 'zeraora') {\n\t\t\tmoves.delete('workup');\n\t\t\tmoves.add('bulkup');\n\t\t}\n\n\t\tconst battleOnly = species.battleOnly && !species.requiredAbility;\n\t\tconst baseSpecies: Species = battleOnly ? this.dex.species.get(species.battleOnly as string) : species;\n\n\t\tconst abilityData = Object.values(baseSpecies.abilities).map(a => this.dex.abilities.get(a));\n\t\tUtils.sortBy(abilityData, abil => -abil.rating);\n\n\t\tif (abilityData[1]) {\n\t\t\t// Sort abilities by rating with an element of randomness\n\t\t\tif (abilityData[2] && abilityData[1].rating <= abilityData[2].rating && this.randomChance(1, 2)) {\n\t\t\t\t[abilityData[1], abilityData[2]] = [abilityData[2], abilityData[1]];\n\t\t\t}\n\t\t\tif (abilityData[0].rating <= abilityData[1].rating && this.randomChance(1, 2)) {\n\t\t\t\t[abilityData[0], abilityData[1]] = [abilityData[1], abilityData[0]];\n\t\t\t} else if (abilityData[0].rating - 0.6 <= abilityData[1].rating && this.randomChance(2, 3)) {\n\t\t\t\t[abilityData[0], abilityData[1]] = [abilityData[1], abilityData[0]];\n\t\t\t}\n\t\t\tability = abilityData[0].name;\n\n\t\t\twhile (this.shouldCullAbility(\n\t\t\t\tability, types, moves, abilities, counter, movePool, teamDetails, species, isDoubles\n\t\t\t)) {\n\t\t\t\tif (ability === abilityData[0].name && abilityData[1].rating >= 1) {\n\t\t\t\t\tability = abilityData[1].name;\n\t\t\t\t} else if (ability === abilityData[1].name && abilityData[2] && abilityData[2].rating >= 1) {\n\t\t\t\t\tability = abilityData[2].name;\n\t\t\t\t} else {\n\t\t\t\t\t// Default to the highest rated ability if all are rejected\n\t\t\t\t\tability = abilityData[0].name;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tabilities.has('Guts') &&\n\t\t\t\tability !== 'Quick Feet' &&\n\t\t\t\t(moves.has('facade') || (moves.has('protect') && !isDoubles) || (moves.has('sleeptalk') && moves.has('rest')))\n\t\t\t) {\n\t\t\t\tability = 'Guts';\n\t\t\t} else if (abilities.has('Moxie') && (counter.get('Physical') > 3 || moves.has('bounce')) && !isDoubles) {\n\t\t\t\tability = 'Moxie';\n\t\t\t} else if (isDoubles) {\n\t\t\t\tif (abilities.has('Intimidate') && !battleOnly) ability = 'Intimidate';\n\t\t\t\tif (abilities.has('Guts') && ability !== 'Intimidate') ability = 'Guts';\n\t\t\t\tif (abilities.has('Storm Drain')) ability = 'Storm Drain';\n\t\t\t\tif (abilities.has('Harvest')) ability = 'Harvest';\n\t\t\t\tif (abilities.has('Unburden') && ability !== 'Prankster' && !species.isMega) ability = 'Unburden';\n\t\t\t}\n\t\t\tif (species.name === 'Ambipom' && !counter.get('technician')) {\n\t\t\t\t// If it doesn't qualify for Technician, Skill Link is useless on it\n\t\t\t\tability = 'Pickup';\n\t\t\t}\n\t\t\tif (species.name === 'Raticate-Alola') ability = 'Hustle';\n\t\t\tif (species.name === 'Altaria') ability = 'Natural Cure';\n\t\t} else {\n\t\t\tability = abilityData[0].name;\n\t\t}\n\n\t\tif (species.name === 'Genesect' && moves.has('technoblast')) forme = 'Genesect-Douse';\n\t\tif (!isDoubles && species.id === 'pikachu') {\n\t\t\tconst pikachuForme = this.sample(['', '-Original', '-Hoenn', '-Sinnoh', '-Unova', '-Kalos', '-Alola', '-Partner']);\n\t\t\tforme = `Pikachu${pikachuForme}`;\n\t\t\tif (forme !== 'Pikachu') ability = 'Static';\n\t\t}\n\n\t\tif (\n\t\t\t!moves.has('photongeyser') &&\n\t\t\t!teamDetails.zMove &&\n\t\t\t(species.name === 'Necrozma-Dusk-Mane' || species.name === 'Necrozma-Dawn-Wings')\n\t\t) {\n\t\t\tfor (const moveid of moves) {\n\t\t\t\tconst move = this.dex.moves.get(moveid);\n\t\t\t\tif (move.category === 'Status' || types.has(move.type)) continue;\n\t\t\t\tmoves.delete(moveid);\n\t\t\t\tmoves.add('photongeyser');\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tlet item = this.getHighPriorityItem(ability, types, moves, counter, teamDetails, species, isLead, isDoubles);\n\t\tif (item === undefined) item = this.getMediumPriorityItem(ability, moves, counter, species, isDoubles, isLead);\n\t\tif (item === undefined) {\n\t\t\titem = this.getLowPriorityItem(ability, types, moves, abilities, counter, teamDetails, species, isLead, isDoubles);\n\t\t}\n\n\t\t// fallback\n\t\tif (item === undefined) item = isDoubles ? 'Sitrus Berry' : 'Leftovers';\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\tlet level: number;\n\t\tif (this.adjustLevel) {\n\t\t\tlevel = this.adjustLevel;\n\t\t} else if (!isDoubles) {\n\t\t\tconst levelScale: {[k: string]: number} = {uber: 76, ou: 80, uu: 82, ru: 84, nu: 86, pu: 88};\n\t\t\tconst customScale: {[k: string]: number} = {\n\t\t\t\t// Banned Ability\n\t\t\t\tDugtrio: 82, Gothitelle: 82, Pelipper: 84, Politoed: 84, Torkoal: 84, Wobbuffet: 82,\n\t\t\t\t// Holistic judgement\n\t\t\t\t'Castform-Rainy': 100, 'Castform-Snowy': 100, 'Castform-Sunny': 100, Delibird: 100, Luvdisc: 100, Spinda: 100, Unown: 100,\n\t\t\t};\n\t\t\tconst tier = toID(species.tier).replace('bl', '');\n\t\t\tlevel = levelScale[tier] || (species.nfe ? 90 : 80);\n\t\t\tif (customScale[species.name]) level = customScale[species.name];\n\t\t} else {\n\t\t\t// We choose level based on BST. Min level is 70, max level is 99. 600+ BST is 70, less than 300 is 99. Calculate with those values.\n\t\t\t// Every 10.34 BST adds a level from 70 up to 99. Results are floored. Uses the Mega's stats if holding a Mega Stone\n\t\t\tconst baseStats = species.baseStats;\n\n\t\t\tlet bst = species.bst;\n\t\t\t// If Wishiwashi, use the school-forme's much higher stats\n\t\t\tif (species.baseSpecies === 'Wishiwashi') bst = this.dex.species.get('wishiwashischool').bst;\n\t\t\t// Adjust levels of mons based on abilities (Pure Power, Sheer Force, etc.) and also Eviolite\n\t\t\t// For the stat boosted, treat the Pokemon's base stat as if it were multiplied by the boost. (Actual effective base stats are higher.)\n\t\t\tconst speciesAbility = (baseSpecies === species ? ability : species.abilities[0]);\n\t\t\tif (speciesAbility === 'Huge Power' || speciesAbility === 'Pure Power') {\n\t\t\t\tbst += baseStats.atk;\n\t\t\t} else if (speciesAbility === 'Parental Bond') {\n\t\t\t\tbst += 0.25 * (counter.get('Physical') > counter.get('Special') ? baseStats.atk : baseStats.spa);\n\t\t\t} else if (speciesAbility === 'Protean') {\n\t\t\t\tbst += 0.3 * (counter.get('Physical') > counter.get('Special') ? baseStats.atk : baseStats.spa);\n\t\t\t} else if (speciesAbility === 'Fur Coat') {\n\t\t\t\tbst += baseStats.def;\n\t\t\t} else if (speciesAbility === 'Slow Start') {\n\t\t\t\tbst -= baseStats.atk / 2 + baseStats.spe / 2;\n\t\t\t} else if (speciesAbility === 'Truant') {\n\t\t\t\tbst *= 2 / 3;\n\t\t\t}\n\t\t\tif (item === 'Eviolite') {\n\t\t\t\tbst += 0.5 * (baseStats.def + baseStats.spd);\n\t\t\t} else if (item === 'Light Ball') {\n\t\t\t\tbst += baseStats.atk + baseStats.spa;\n\t\t\t}\n\t\t\tlevel = 70 + Math.floor(((600 - Utils.clampIntRange(bst, 300, 600)) / 10.34));\n\t\t}\n\n\t\t// Prepare optimal HP\n\t\tconst srWeakness = 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\tif (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 if (moves.has('substitute') && (\n\t\t\t\titem === 'Petaya Berry' || item === 'Sitrus Berry' ||\n\t\t\t\t(ability === 'Power Construct' && item !== 'Leftovers')\n\t\t\t)) {\n\t\t\t\t// Three Substitutes should activate Petaya Berry for Dedenne\n\t\t\t\t// Two Substitutes should activate Sitrus Berry or Power Construct\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 {\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\t// Minimize confusion damage\n\t\tif (!counter.get('Physical') && !moves.has('copycat') && !moves.has('transform')) {\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 (ability === 'Beast Boost' && counter.get('Special') < 1) {\n\t\t\tevs.spa = 0;\n\t\t\tivs.spa = 0;\n\t\t}\n\n\t\tif (['gyroball', 'metalburst', 'trickroom'].some(m => moves.has(m))) {\n\t\t\tevs.spe = 0;\n\t\t\tivs.spe = 0;\n\t\t}\n\n\t\t// Fix IVs for non-Bottle Cap-able sets\n\t\tif (hasHiddenPower && level < 100) {\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 = ivs.atk === 0 ? ZeroAttackHPIVs[hpType] : 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\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\tmoves: Array.from(moves),\n\t\t\tability,\n\t\t\tevs,\n\t\t\tivs,\n\t\t\titem,\n\t\t\tlevel,\n\t\t};\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 = [];\n\n\t\t// For Monotype\n\t\tconst isMonotype = !!this.forceMonotype || ruleTable.has('sametypeclause');\n\t\tconst typePool = this.dex.types.names();\n\t\tconst type = this.forceMonotype || this.sample(typePool);\n\n\t\tconst baseFormes: {[k: string]: number} = {};\n\t\tlet hasMega = false;\n\n\t\tconst tierCount: {[k: string]: number} = {};\n\t\tconst typeCount: {[k: string]: number} = {};\n\t\tconst typeComboCount: {[k: string]: number} = {};\n\t\tconst teamDetails: RandomTeamsTypes.TeamDetails = {};\n\n\t\t// We make at most two passes through the potential Pokemon pool when creating a team - if the first pass doesn't\n\t\t// result in a team of six Pokemon we perform a second iteration relaxing as many restrictions as possible.\n\t\tfor (const restrict of [true, false]) {\n\t\t\tif (pokemon.length >= this.maxTeamSize) break;\n\t\t\tconst pokemonPool = this.getPokemonPool(type, pokemon, isMonotype);\n\t\t\twhile (pokemonPool.length && pokemon.length < this.maxTeamSize) {\n\t\t\t\tconst species = this.dex.species.get(this.sampleNoReplace(pokemonPool));\n\n\t\t\t\t// Check if the forme has moves for random battle\n\t\t\t\tif (this.format.gameType === 'singles') {\n\t\t\t\t\tif (!species.randomBattleMoves) continue;\n\t\t\t\t} else {\n\t\t\t\t\tif (!species.randomDoubleBattleMoves) continue;\n\t\t\t\t}\n\t\t\t\tif (!species.exists) continue;\n\n\t\t\t\t// Limit to one of each species (Species Clause)\n\t\t\t\tif (baseFormes[species.baseSpecies]) continue;\n\n\t\t\t\t// Limit one Mega per team\n\t\t\t\tif (hasMega && species.isMega) continue;\n\n\t\t\t\t// Adjust rate for species with multiple sets\n\t\t\t\tswitch (species.baseSpecies) {\n\t\t\t\tcase 'Arceus': case 'Silvally':\n\t\t\t\t\tif (this.randomChance(8, 9) && !isMonotype) continue;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Oricorio':\n\t\t\t\t\tif (this.randomChance(3, 4)) continue;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Castform': case 'Floette':\n\t\t\t\t\tif (this.randomChance(2, 3)) continue;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Aegislash': case 'Basculin': case 'Cherrim': case 'Gourgeist': case 'Groudon': case 'Kyogre': case 'Meloetta':\n\t\t\t\t\tif (this.randomChance(1, 2)) continue;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Greninja':\n\t\t\t\t\tif (this.gen >= 7 && this.randomChance(1, 2)) continue;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (species.otherFormes && !hasMega && (\n\t\t\t\t\tspecies.otherFormes.includes(species.name + '-Mega') ||\n\t\t\t\t\tspecies.otherFormes.includes(species.name + '-Mega-X')\n\t\t\t\t)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst tier = species.tier;\n\t\t\t\tconst types = species.types;\n\t\t\t\tconst typeCombo = types.slice().sort().join();\n\t\t\t\t// Dynamically scale limits for different team sizes. The default and minimum value is 1.\n\t\t\t\tconst limitFactor = Math.round(this.maxTeamSize / 6) || 1;\n\n\t\t\t\tif (restrict && !species.isMega) {\n\t\t\t\t\t// Limit one Pokemon per tier, two for Monotype\n\t\t\t\t\tif (\n\t\t\t\t\t\t(tierCount[tier] >= (isMonotype || this.forceMonotype ? 2 : 1) * limitFactor) &&\n\t\t\t\t\t\t!this.randomChance(1, Math.pow(5, tierCount[tier]))\n\t\t\t\t\t) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!isMonotype && !this.forceMonotype) {\n\t\t\t\t\t\t// Limit two of any type\n\t\t\t\t\t\tlet skip = false;\n\t\t\t\t\t\tfor (const typeName of types) {\n\t\t\t\t\t\t\tif (typeCount[typeName] >= 2 * limitFactor) {\n\t\t\t\t\t\t\t\tskip = 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 (skip) continue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Limit one of any type combination, two in Monotype\n\t\t\t\t\tif (!this.forceMonotype && typeComboCount[typeCombo] >= (isMonotype ? 2 : 1) * limitFactor) continue;\n\t\t\t\t}\n\n\t\t\t\tconst set = this.randomSet(\n\t\t\t\t\tspecies,\n\t\t\t\t\tteamDetails,\n\t\t\t\t\tpokemon.length === this.maxTeamSize - 1,\n\t\t\t\t\tthis.format.gameType !== 'singles'\n\t\t\t\t);\n\n\t\t\t\tconst item = this.dex.items.get(set.item);\n\n\t\t\t\t// Limit one Z-Move per team\n\t\t\t\tif (item.zMove && teamDetails.zMove) continue;\n\n\t\t\t\t// Zoroark copies the last Pokemon\n\t\t\t\tif (set.ability === 'Illusion') {\n\t\t\t\t\tif (pokemon.length < 1) continue;\n\t\t\t\t\tset.level = pokemon[pokemon.length - 1].level;\n\t\t\t\t}\n\n\t\t\t\t// Okay, the set passes, add it to our team\n\t\t\t\tpokemon.unshift(set);\n\n\t\t\t\t// Don't bother tracking details for the last Pokemon\n\t\t\t\tif (pokemon.length === this.maxTeamSize) break;\n\n\t\t\t\t// Now that our Pokemon has passed all checks, we can increment our counters\n\t\t\t\tbaseFormes[species.baseSpecies] = 1;\n\n\t\t\t\t// Increment tier counter\n\t\t\t\tif (tierCount[tier]) {\n\t\t\t\t\ttierCount[tier]++;\n\t\t\t\t} else {\n\t\t\t\t\ttierCount[tier] = 1;\n\t\t\t\t}\n\n\t\t\t\t// Increment type counters\n\t\t\t\tfor (const typeName of types) {\n\t\t\t\t\tif (typeName in typeCount) {\n\t\t\t\t\t\ttypeCount[typeName]++;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttypeCount[typeName] = 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (typeCombo in typeComboCount) {\n\t\t\t\t\ttypeComboCount[typeCombo]++;\n\t\t\t\t} else {\n\t\t\t\t\ttypeComboCount[typeCombo] = 1;\n\t\t\t\t}\n\n\t\t\t\t// Track what the team has\n\t\t\t\tif (item.megaStone) hasMega = true;\n\t\t\t\tif (item.zMove) teamDetails.zMove = 1;\n\t\t\t\tif (set.ability === 'Snow Warning' || set.moves.includes('hail')) teamDetails.hail = 1;\n\t\t\t\tif (set.moves.includes('raindance') || set.ability === 'Drizzle' && !item.onPrimal) teamDetails.rain = 1;\n\t\t\t\tif (set.ability === 'Sand Stream') teamDetails.sand = 1;\n\t\t\t\tif (set.moves.includes('sunnyday') || set.ability === 'Drought' && !item.onPrimal) teamDetails.sun = 1;\n\t\t\t\tif (set.moves.includes('spikes')) teamDetails.spikes = (teamDetails.spikes || 0) + 1;\n\t\t\t\tif (set.moves.includes('stealthrock')) teamDetails.stealthRock = 1;\n\t\t\t\tif (set.moves.includes('stickyweb')) teamDetails.stickyWeb = 1;\n\t\t\t\tif (set.moves.includes('toxicspikes')) teamDetails.toxicSpikes = 1;\n\t\t\t\tif (set.moves.includes('defog')) teamDetails.defog = 1;\n\t\t\t\tif (set.moves.includes('rapidspin')) teamDetails.rapidSpin = 1;\n\t\t\t}\n\t\t}\n\t\tif (pokemon.length < this.maxTeamSize && pokemon.length < 12) {\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\trandomFactorySets: {[format: string]: {[species: string]: BattleFactorySpecies}} = {};\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 weatherAbilitiesRequire: {[k: string]: string} = {\n\t\t\thydration: 'raindance', swiftswim: 'raindance',\n\t\t\tleafguard: 'sunnyday', solarpower: 'sunnyday', chlorophyll: 'sunnyday',\n\t\t\tsandforce: 'sandstorm', sandrush: 'sandstorm', sandveil: 'sandstorm',\n\t\t\tslushrush: 'hail', snowcloak: 'hail',\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[]}[] = [];\n\t\tconst priorityPool = [];\n\t\tfor (const curSet of setList) {\n\t\t\tif (this.forceMonotype && !species.types.includes(this.forceMonotype)) continue;\n\n\t\t\tconst item = this.dex.items.get(curSet.item);\n\t\t\tif (teamData.megaCount && teamData.megaCount > 0 && item.megaStone) continue; // reject 2+ mega stones\n\t\t\tif (teamData.zCount && teamData.zCount > 0 && item.zMove) continue; // reject 2+ Z stones\n\t\t\tif (itemsMax[item.id] && teamData.has[item.id] >= itemsMax[item.id]) continue;\n\n\t\t\tconst ability = this.dex.abilities.get(curSet.ability);\n\t\t\tif (weatherAbilitiesRequire[ability.id] && teamData.weather !== weatherAbilitiesRequire[ability.id]) continue;\n\t\t\tif (teamData.weather && weatherAbilities.includes(ability.id)) continue; // reject 2+ weather setters\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\t\t\teffectivePool.push({set: curSet, moveVariants: curSetVariants});\n\t\t\tif (hasRequiredMove) priorityPool.push({set: curSet, moveVariants: curSetVariants});\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 = this.sampleIfArray(setData.set.item);\n\t\tconst 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\tconst 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} 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\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\tconst typePool = this.dex.types.names();\n\t\tconst type = this.sample(typePool);\n\n\t\tconst teamData: TeamData = {\n\t\t\ttypeCount: {}, typeComboCount: {}, baseFormes: {}, megaCount: 0, zCount: 0,\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\tconst 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\t// Limit the number of Megas to one\n\t\t\tif (!teamData.megaCount) teamData.megaCount = 0;\n\t\t\tif (teamData.megaCount >= 1 && speciesFlags.megaOnly) 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\t// Actually limit the number of Megas to one\n\t\t\tif (teamData.megaCount >= 1 && itemData.megaStone) continue;\n\n\t\t\t// Limit the number of Z moves to one\n\t\t\tif (teamData.zCount && teamData.zCount >= 1 && itemData.zMove) continue;\n\n\t\t\tlet 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\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\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.megaStone) teamData.megaCount++;\n\t\t\tif (itemData.zMove) {\n\t\t\t\tif (!teamData.zCount) teamData.zCount = 0;\n\t\t\t\tteamData.zCount++;\n\t\t\t}\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émon 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 = {};\n\n\trandomBSSFactorySet(\n\t\tspecies: Species, teamData: RandomTeamsTypes.FactoryTeamDetails\n\t): RandomTeamsTypes.RandomFactorySet | null {\n\t\tconst id = toID(species.name);\n\t\t// const flags = this.randomBSSFactorySets[tier][id].flags;\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\tspikes: 1,\n\t\t\ttoxicspikes: 1,\n\t\t\tdoubleedge: 1,\n\t\t\ttrickroom: 1,\n\t\t};\n\t\tconst requiredMoves: {[k: string]: number} = {};\n\t\tconst weatherAbilitiesRequire: {[k: string]: string} = {\n\t\t\tswiftswim: 'raindance',\n\t\t\tsandrush: 'sandstorm', sandveil: 'sandstorm',\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[], itemVariants?: number, abilityVariants?: number}[] = [];\n\t\tconst priorityPool = [];\n\t\tfor (const curSet of setList) {\n\t\t\tif (this.forceMonotype && !species.types.includes(this.forceMonotype)) continue;\n\n\t\t\tconst item = this.dex.items.get(curSet.item);\n\t\t\tif (teamData.megaCount && teamData.megaCount > 1 && item.megaStone) continue; // reject 3+ mega stones\n\t\t\tif (teamData.zCount && teamData.zCount > 1 && item.zMove) continue; // reject 3+ Z stones\n\t\t\tif (teamData.has[item.id]) continue; // Item clause\n\n\t\t\tconst ability = this.dex.abilities.get(curSet.ability);\n\t\t\tif (weatherAbilitiesRequire[ability.id] && teamData.weather !== weatherAbilitiesRequire[ability.id]) continue;\n\t\t\tif (teamData.weather && weatherAbilities.includes(ability.id)) continue; // reject 2+ weather setters\n\n\t\t\tif (curSet.species === 'Aron' && teamData.weather !== 'sandstorm') continue; // reject Aron without a Sand Stream user\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\t\t\teffectivePool.push({set: curSet, moveVariants: curSetVariants});\n\t\t\tif (hasRequiredMove) priorityPool.push({set: curSet, moveVariants: curSetVariants});\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\treturn {\n\t\t\tname: setData.set.nickname || 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: this.sampleIfArray(setData.set.item) || '',\n\t\t\tability: setData.set.ability || 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: {}, megaCount: 0, zCount: 0,\n\t\t\teeveeLimCount: 0, has: {}, forceResult, weaknesses: {}, resistances: {},\n\t\t};\n\t\tconst requiredMoveFamilies: string[] = [];\n\t\tconst requiredMoves: {[k: string]: string} = {};\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\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\tconst speciesFlags = this.randomBSSFactorySets[species.id].flags;\n\t\t\tif (!teamData.megaCount) teamData.megaCount = 0;\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 the number of Megas + Z-moves to 3\n\t\t\tif (teamData.megaCount + (teamData.zCount ? teamData.zCount : 0) >= 3 && speciesFlags.megaOnly) continue;\n\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\t// Limit 2 of any type\n\t\t\tconst types = species.types;\n\t\t\tlet skip = false;\n\t\t\tfor (const type of types) {\n\t\t\t\tif (teamData.typeCount[type] >= 2 * limitFactor && this.randomChance(4, 5)) {\n\t\t\t\t\tskip = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (skip) continue;\n\n\t\t\t// Restrict Eevee with certain Pokemon\n\t\t\tif (speciesFlags.limEevee) {\n\t\t\t\tif (!teamData.eeveeLimCount) teamData.eeveeLimCount = 0;\n\t\t\t\tteamData.eeveeLimCount++;\n\t\t\t}\n\t\t\tif (teamData.eeveeLimCount && teamData.eeveeLimCount >= 1 && speciesFlags.limEevee) 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 (teamData.typeComboCount[typeCombo] >= 1 * limitFactor) continue;\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\tteamData.typeComboCount[typeCombo] = (teamData.typeComboCount[typeCombo] + 1) || 1;\n\n\t\t\tteamData.baseFormes[species.baseSpecies] = 1;\n\n\t\t\t// Limit Mega and Z-move\n\t\t\tconst itemData = this.dex.items.get(set.item);\n\t\t\tif (itemData.megaStone) teamData.megaCount++;\n\t\t\tif (itemData.zMove) {\n\t\t\t\tif (!teamData.zCount) teamData.zCount = 0;\n\t\t\t\tteamData.zCount++;\n\t\t\t}\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\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émon 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.randomBSSFactoryTeam(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.randomBSSFactoryTeam(side, ++depth);\n\t\t\t}\n\t\t\tfor (const type in teamData.weaknesses) {\n\t\t\t\tif (teamData.weaknesses[type] >= 3) return this.randomBSSFactoryTeam(side, ++depth);\n\t\t\t}\n\t\t}\n\n\t\treturn pokemon;\n\t}\n}\n\nexport default RandomGen7Teams;\n","import {BattleFactorySpecies, RandomGen7Teams} from './gen7';\nimport {MoveCounter, TeamData} from './gen8';\nimport {Utils} from './utils';\nimport {\n\tAnyObject,\n\tFormat,\n\tModdedDex,\n\tMove,\n\tPRNG,\n\tPRNGSeed,\n\tPlayerOptions,\n\tRandomTeamsTypes,\n\tSpecies,\n\tStatID,\n\ttoID,\n} from '@pkmn/sim';\n\nexport class RandomGen6Teams extends RandomGen7Teams {\n\tconstructor(dex: ModdedDex, format: Format, prng: PRNG | PRNGSeed | null) {\n\t\tsuper(dex, format, prng);\n\t\tthis.noStab = [...this.noStab, 'aquajet', 'fakeout', 'iceshard', 'machpunch', 'quickattack', 'vacuumwave'];\n\n\t\tthis.moveEnforcementCheckers = {\n\t\t\tBug: movePool => movePool.includes('megahorn') || movePool.includes('pinmissile'),\n\t\t\tDark: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\t(!counter.get('Dark') && !abilities.has('Protean'))\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!abilities.has('Aerilate') &&\n\t\t\t\t!abilities.has('Pixilate') &&\n\t\t\t\t!moves.has('rest') &&\n\t\t\t\t!moves.has('sleeptalk')\n\t\t\t),\n\t\t\tElectric: (movePool, moves, abilities, types, counter) => !counter.get('Electric'),\n\t\t\tFairy: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!counter.get('Fairy') && !abilities.has('Pixilate') && (!!counter.setupType || !counter.get('Status'))\n\t\t\t),\n\t\t\tFighting: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\t!counter.get('Fighting') && (\n\t\t\t\t\tspecies.baseStats.atk >= 110 ||\n\t\t\t\t\tabilities.has('Justified') || abilities.has('Unburden') ||\n\t\t\t\t\t!!counter.setupType || !counter.get('Status')\n\t\t\t\t)\n\t\t\t),\n\t\t\tFire: (movePool, moves, abilities, types, counter) => !counter.get('Fire') || movePool.includes('quiverdance'),\n\t\t\tFlying: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!counter.get('Flying') && (\n\t\t\t\t\tabilities.has('Gale Wings') ||\n\t\t\t\t\tabilities.has('Serene Grace') ||\n\t\t\t\t\t(types.has('Normal') && movePool.includes('bravebird'))\n\t\t\t\t)\n\t\t\t),\n\t\t\tGhost: (movePool, moves, abilities, types, counter) => !types.has('Dark') && !counter.get('Ghost'),\n\t\t\tGrass: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!counter.get('Grass') && !types.has('Fairy') && !types.has('Poison') && !types.has('Steel')\n\t\t\t),\n\t\t\tGround: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!counter.get('Ground') && !moves.has('rest') && !moves.has('sleeptalk')\n\t\t\t),\n\t\t\tIce: (movePool, moves, abilities, types, counter) => !counter.get('Ice') && !abilities.has('Refrigerate'),\n\t\t\tNormal: movePool => movePool.includes('facade'),\n\t\t\tPsychic: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\t!!counter.get('Psychic') &&\n\t\t\t\t!types.has('Flying') &&\n\t\t\t\t!abilities.has('Pixilate') &&\n\t\t\t\tcounter.get('stab') < species.types.length\n\t\t\t),\n\t\t\tRock: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!counter.get('Rock') &&\n\t\t\t\t!types.has('Fairy') &&\n\t\t\t\t(abilities.has('Rock Head') || counter.setupType === 'Physical')\n\t\t\t),\n\t\t\tSteel: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!counter.get('Steel') && (abilities.has('Technician') || movePool.includes('meteormash'))\n\t\t\t),\n\t\t\tWater: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t(!counter.get('Water') || !counter.get('stab')) &&\n\t\t\t\t!abilities.has('Protean')\n\t\t\t),\n\t\t\tAdaptability: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\t!counter.setupType &&\n\t\t\t\tspecies.types.length > 1 &&\n\t\t\t\t(!counter.get(species.types[0]) || !counter.get(species.types[1]))\n\t\t\t),\n\t\t\tAerilate: (movePool, moves, abilities, types, counter) => !counter.get('Normal'),\n\t\t\tPixilate: (movePool, moves, abilities, types, counter) => !counter.get('Normal'),\n\t\t\tRefrigerate: (movePool, moves, abilities, types, counter) => !moves.has('blizzard') && !counter.get('Normal'),\n\t\t\tContrary: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\t!counter.get('contrary') && species.name !== 'Shuckle'\n\t\t\t),\n\t\t\t'Bad Dreams': movePool => movePool.includes('darkvoid'),\n\t\t\t'Slow Start': movePool => movePool.includes('substitute'),\n\t\t};\n\t}\n\n\tshouldCullMove(\n\t\tmove: Move,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tmovePool: string[],\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tisLead: boolean,\n\t): {cull: boolean, isSetup?: boolean} {\n\t\tconst restTalk = moves.has('rest') && moves.has('sleeptalk');\n\n\t\tif (move.priority > 0 && counter.get('speedsetup')) return {cull: true};\n\n\t\tswitch (move.id) {\n\t\t// Not very useful without their supporting moves\n\t\tcase 'cottonguard': case 'defendorder':\n\t\t\treturn {cull: !counter.get('recovery') && !moves.has('rest')};\n\t\tcase 'focuspunch':\n\t\t\treturn {cull: !moves.has('substitute') || counter.damagingMoves.size < 2};\n\t\tcase 'perishsong':\n\t\t\treturn {cull: !moves.has('protect')};\n\t\tcase 'reflect':\n\t\t\tif (movePool.length > 1) {\n\t\t\t\tconst screen = movePool.indexOf('lightscreen');\n\t\t\t\tif (screen >= 0) this.fastPop(movePool, screen);\n\t\t\t}\n\t\t\treturn {cull: !moves.has('calmmind') && !moves.has('lightscreen')};\n\t\tcase 'rest':\n\t\t\treturn {cull: movePool.includes('sleeptalk')};\n\t\tcase 'sleeptalk':\n\t\t\tif (movePool.length > 1) {\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\treturn {cull: !moves.has('rest')};\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 || !!counter.get('priority')};\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\treturn {cull: (\n\t\t\t\t(move.id === 'bellydrum' && !abilities.has('Unburden') && !counter.get('priority')) ||\n\t\t\t\t(counter.get('Physical') + counter.get('physicalpool') < 2 && (!moves.has('rest') || !moves.has('sleeptalk'))) || (\n\t\t\t\t\t(counter.setupType !== 'Physical' || counter.get('physicalsetup') > 1) &&\n\t\t\t\t\t(!moves.has('growth') || moves.has('sunnyday'))\n\t\t\t\t)\n\t\t\t), isSetup: true};\n\t\tcase 'calmmind': case 'geomancy': case 'nastyplot': case 'quiverdance': case 'tailglow':\n\t\t\tif (types.has('Dark') && moves.has('darkpulse')) {\n\t\t\t\tcounter.setupType = 'Special';\n\t\t\t\treturn {cull: false, isSetup: true};\n\t\t\t}\n\t\t\treturn {cull: (\n\t\t\t\tcounter.setupType !== 'Special' ||\n\t\t\t\tcounter.get('specialsetup') > 1 ||\n\t\t\t\t(counter.get('Special') + counter.get('specialpool') < 2 && (!moves.has('rest') || !moves.has('sleeptalk')))\n\t\t\t), isSetup: true};\n\t\tcase 'growth': case 'shellsmash': case 'workup':\n\t\t\treturn {cull: (\n\t\t\t\tcounter.setupType !== 'Mixed' ||\n\t\t\t\tcounter.get('mixedsetup') > 1 ||\n\t\t\t\tcounter.damagingMoves.size + counter.get('physicalpool') + counter.get('specialpool') < 2 ||\n\t\t\t\t(move.id === 'growth' && !moves.has('sunnyday'))\n\t\t\t), isSetup: true};\n\t\tcase 'agility': case 'autotomize': case 'rockpolish': case 'shiftgear':\n\t\t\treturn {cull: counter.damagingMoves.size < 2 || restTalk, isSetup: !counter.setupType};\n\t\tcase 'flamecharge':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('dracometeor') ||\n\t\t\t\tmoves.has('overheat') ||\n\t\t\t\t(counter.damagingMoves.size < 3 && !counter.setupType)\n\t\t\t)};\n\n\t\t// Bad after setup\n\t\tcase 'circlethrow': case 'dragontail':\n\t\t\treturn {cull: (\n\t\t\t\t(!!counter.setupType && ((!moves.has('rest') && !moves.has('sleeptalk')) || moves.has('stormthrow'))) ||\n\t\t\t\t(!!counter.get('speedsetup') || ['encore', 'raindance', 'roar', 'trickroom', 'whirlwind'].some(m => moves.has(m))) ||\n\t\t\t\t(counter.get(move.type) > 1 && counter.get('Status') > 1) ||\n\t\t\t\t(abilities.has('Sheer Force') && !!counter.get('sheerforce'))\n\t\t\t)};\n\t\tcase 'defog':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.setupType ||\n\t\t\t\tmoves.has('spikes') || moves.has('stealthrock') ||\n\t\t\t\trestTalk ||\n\t\t\t\t!!teamDetails.defog\n\t\t\t)};\n\t\tcase 'fakeout': case 'tailwind':\n\t\t\treturn {cull: !!counter.setupType || ['substitute', 'switcheroo', 'trick'].some(m => moves.has(m))};\n\t\tcase 'foulplay':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.setupType ||\n\t\t\t\t!!counter.get('speedsetup') ||\n\t\t\t\tcounter.get('Dark') > 2 ||\n\t\t\t\tmoves.has('clearsmog') ||\n\t\t\t\trestTalk ||\n\t\t\t\tcounter.damagingMoves.size - 1 === counter.get('priority')\n\t\t\t)};\n\t\tcase 'haze': case 'spikes':\n\t\t\treturn {cull: !!counter.setupType || !!counter.get('speedsetup') || moves.has('trickroom')};\n\t\tcase 'healbell': case 'technoblast':\n\t\t\treturn {cull: !!counter.get('speedsetup')};\n\t\tcase 'healingwish': case 'memento':\n\t\t\treturn {cull: !!counter.setupType || !!counter.get('recovery') || moves.has('substitute')};\n\t\tcase 'leechseed': case 'roar': case 'whirlwind':\n\t\t\treturn {cull: !!counter.setupType || !!counter.get('speedsetup') || moves.has('dragontail')};\n\t\tcase 'nightshade': case 'seismictoss': case 'superfang':\n\t\t\treturn {cull: counter.damagingMoves.size > 1 || !!counter.setupType};\n\t\tcase 'protect':\n\t\t\tconst screens = moves.has('lightscreen') && moves.has('reflect');\n\t\t\treturn {cull: moves.has('rest') || screens || (!!counter.setupType && !moves.has('wish'))};\n\t\tcase 'pursuit':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('nightslash') ||\n\t\t\t\t!!counter.setupType ||\n\t\t\t\tcounter.get('Status') > 1 ||\n\t\t\t\tcounter.get('Dark') > 2 ||\n\t\t\t\t(moves.has('knockoff') && !types.has('Dark'))\n\t\t\t)};\n\t\tcase 'rapidspin':\n\t\t\treturn {cull: !!counter.setupType || !!teamDetails.rapidSpin};\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['rest', 'substitute', 'trickroom'].some(m => moves.has(m)) ||\n\t\t\t\t!!teamDetails.stealthRock\n\t\t\t)};\n\t\tcase 'stickyweb':\n\t\t\treturn {cull: !!teamDetails.stickyWeb};\n\t\tcase 'toxicspikes':\n\t\t\treturn {cull: !!counter.setupType || !!teamDetails.toxicSpikes};\n\t\tcase 'trickroom':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('lightscreen') || moves.has('reflect') ||\n\t\t\t\t!!counter.setupType ||\n\t\t\t\t!!counter.get('speedsetup') ||\n\t\t\t\tcounter.damagingMoves.size < 2\n\t\t\t)};\n\t\tcase 'uturn':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.setupType || !!counter.get('speedsetup') ||\n\t\t\t\t(abilities.has('Speed Boost') && moves.has('protect')) ||\n\t\t\t\t(abilities.has('Protean') && counter.get('Status') > 2) || (\n\t\t\t\t\ttypes.has('Bug') &&\n\t\t\t\t\tcounter.get('stab') < 2 &&\n\t\t\t\t\tcounter.damagingMoves.size > 2 &&\n\t\t\t\t\t!abilities.has('Adaptability') && !abilities.has('Download')\n\t\t\t\t)\n\t\t\t)};\n\t\tcase 'voltswitch':\n\t\t\treturn {cull: !!counter.setupType || !!counter.get('speedsetup') || moves.has('raindance') || moves.has('uturn')};\n\n\t\t// Bit redundant to have both\n\t\t// Attacks:\n\t\tcase 'bugbite': case 'bugbuzz': case 'signalbeam':\n\t\t\treturn {cull: moves.has('uturn') && !counter.setupType && !abilities.has('Tinted Lens')};\n\t\tcase 'darkpulse':\n\t\t\treturn {cull: ['crunch', 'knockoff', 'hyperspacefury'].some(m => moves.has(m)) && counter.setupType !== 'Special'};\n\t\tcase 'suckerpunch':\n\t\t\treturn {cull: (\n\t\t\t\tcounter.damagingMoves.size < 2 ||\n\t\t\t\t(counter.get('Dark') > 1 && !types.has('Dark')) ||\n\t\t\t\tmoves.has('glare') ||\n\t\t\t\trestTalk\n\t\t\t)};\n\t\tcase 'dragonclaw':\n\t\t\treturn {cull: moves.has('dragontail') || moves.has('outrage')};\n\t\tcase 'dracometeor':\n\t\t\treturn {cull: moves.has('swordsdance') || counter.setupType === 'Physical' && counter.get('Dragon') > 1};\n\t\tcase 'dragonpulse': case 'spacialrend':\n\t\t\treturn {cull: moves.has('dracometeor') || moves.has('outrage') || (moves.has('dragontail') && !counter.setupType)};\n\t\tcase 'outrage':\n\t\t\treturn {cull: moves.has('dracometeor') && counter.damagingMoves.size < 3};\n\t\tcase 'thunderbolt':\n\t\t\treturn {cull: moves.has('discharge') || (moves.has('voltswitch') && moves.has('wildcharge'))};\n\t\tcase 'dazzlinggleam':\n\t\t\treturn {cull: moves.has('playrough') && counter.setupType !== 'Special'};\n\t\tcase 'aurasphere': case 'focusblast':\n\t\t\treturn {cull: restTalk || ((moves.has('closecombat') || moves.has('superpower')) && counter.setupType !== 'Special')};\n\t\tcase 'drainpunch':\n\t\t\treturn {cull: (\n\t\t\t\t(!moves.has('bulkup') && (moves.has('closecombat') || moves.has('highjumpkick'))) ||\n\t\t\t\t((moves.has('focusblast') || moves.has('superpower')) && counter.setupType !== 'Physical')\n\t\t\t)};\n\t\tcase 'closecombat': case 'highjumpkick':\n\t\t\treturn {cull: (\n\t\t\t\t(moves.has('bulkup') && moves.has('drainpunch')) || (\n\t\t\t\t\tcounter.setupType === 'Special' &&\n\t\t\t\t\t(moves.has('aurasphere') || moves.has('focusblast') || movePool.includes('aurasphere'))\n\t\t\t\t)\n\t\t\t)};\n\t\tcase 'machpunch':\n\t\t\treturn {cull: types.has('Fighting') && counter.get('stab') < 2 && !abilities.has('Technician')};\n\t\tcase 'stormthrow':\n\t\t\treturn {cull: moves.has('circlethrow') && restTalk};\n\t\tcase 'superpower':\n\t\t\tconst isSetup = abilities.has('Contrary');\n\t\t\treturn {cull: (counter.get('Fighting') > 1 && !!counter.setupType) || (restTalk && !isSetup), isSetup};\n\t\tcase 'vacuumwave':\n\t\t\treturn {cull: (moves.has('closecombat') || moves.has('machpunch')) && counter.setupType !== 'Special'};\n\t\tcase 'fierydance': case 'firefang': case 'flamethrower':\n\t\t\treturn {cull: (\n\t\t\t\t(move.id === 'flamethrower' && moves.has('drainpunch') && counter.setupType !== 'Special') ||\n\t\t\t\tmoves.has('blazekick') ||\n\t\t\t\tmoves.has('overheat') ||\n\t\t\t\t((moves.has('fireblast') || moves.has('lavaplume')) && counter.setupType !== 'Physical')\n\t\t\t)};\n\t\tcase 'fireblast':\n\t\t\treturn {cull: (\n\t\t\t\t(moves.has('flareblitz') && counter.setupType !== 'Special') ||\n\t\t\t\t(moves.has('lavaplume') && !counter.setupType && !counter.get('speedsetup'))\n\t\t\t)};\n\t\tcase 'lavaplume':\n\t\t\treturn {cull: moves.has('firepunch') || moves.has('fireblast') && (!!counter.setupType || !!counter.get('speedsetup'))};\n\t\tcase 'airslash': case 'hurricane':\n\t\t\treturn {cull: (\n\t\t\t\t[(move.id === 'hurricane' ? 'airslash' : 'hurricane'), 'acrobatics', 'bravebird'].some(m => moves.has(m))\n\t\t\t)};\n\t\tcase 'shadowball':\n\t\t\treturn {cull: moves.has('darkpulse') || (moves.has('hex') && moves.has('willowisp'))};\n\t\tcase 'shadowclaw':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('shadowforce') ||\n\t\t\t\tmoves.has('shadowsneak') ||\n\t\t\t\t(moves.has('shadowball') && counter.setupType !== 'Physical')\n\t\t\t)};\n\t\tcase 'shadowsneak':\n\t\t\treturn {cull: restTalk || (types.has('Ghost') && species.types.length > 1 && counter.get('stab') < 2)};\n\t\tcase 'hex':\n\t\t\treturn {cull: moves.has('shadowball') && !moves.has('willowisp')};\n\t\tcase 'gigadrain': case 'powerwhip':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('seedbomb') ||\n\t\t\t\tmoves.has('petaldance') ||\n\t\t\t\t(moves.has('sunnyday') && moves.has('solarbeam')) ||\n\t\t\t\t(counter.get('Special') < 4 && !counter.setupType && moves.has('leafstorm'))\n\t\t\t)};\n\t\tcase 'leafblade': case 'woodhammer':\n\t\t\treturn {cull: (\n\t\t\t\t(moves.has('hornleech') && counter.get('Physical') < 4) ||\n\t\t\t\t(moves.has('gigadrain') && counter.setupType !== 'Physical')\n\t\t\t)};\n\t\tcase 'leafstorm':\n\t\t\treturn {cull: counter.get('Grass') > 1 && !!counter.setupType};\n\t\tcase 'solarbeam':\n\t\t\treturn {cull: (\n\t\t\t\t(!abilities.has('Drought') && !moves.has('sunnyday')) ||\n\t\t\t\tmoves.has('gigadrain') ||\n\t\t\t\tmoves.has('leafstorm')\n\t\t\t)};\n\t\tcase 'bonemerang': case 'earthpower': case 'precipiceblades':\n\t\t\treturn {cull: moves.has('earthquake')};\n\t\tcase 'freezedry':\n\t\t\treturn {cull: moves.has('icebeam') || moves.has('icywind') || counter.get('stab') < 2};\n\t\tcase 'bodyslam': case 'return':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('doubleedge') ||\n\t\t\t\t(moves.has('glare') && moves.has('headbutt')) ||\n\t\t\t\t(move.id === 'return' && moves.has('bodyslam'))\n\t\t\t)};\n\t\tcase 'endeavor':\n\t\t\treturn {cull: !isLead && !abilities.has('Defeatist')};\n\t\tcase 'explosion':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.setupType ||\n\t\t\t\t(abilities.has('Refrigerate') && (moves.has('freezedry') || movePool.includes('return'))) ||\n\t\t\t\tmoves.has('wish')\n\t\t\t)};\n\t\tcase 'extremespeed':\n\t\t\treturn {cull: counter.setupType !== 'Physical' && moves.has('vacuumwave')};\n\t\tcase 'hiddenpower':\n\t\t\treturn {cull: moves.has('rest') || !counter.get('stab') && counter.damagingMoves.size < 2};\n\t\tcase 'hypervoice':\n\t\t\treturn {cull: moves.has('blizzard') || moves.has('return')};\n\t\tcase 'judgment':\n\t\t\treturn {cull: counter.setupType !== 'Special' && counter.get('stab') > 1};\n\t\tcase 'quickattack':\n\t\t\treturn {cull: (\n\t\t\t\t(types.has('Normal') && (!counter.get('stab') || counter.get('Normal') > 2)) ||\n\t\t\t\t(types.has('Rock') && !!counter.get('Status'))\n\t\t\t)};\n\t\tcase 'weatherball':\n\t\t\treturn {cull: !moves.has('raindance') && !moves.has('sunnyday')};\n\t\tcase 'poisonjab':\n\t\t\treturn {cull: moves.has('gunkshot')};\n\t\tcase 'acidspray': case 'sludgewave':\n\t\t\treturn {cull: moves.has('poisonjab') || moves.has('sludgebomb')};\n\t\tcase 'psychic':\n\t\t\treturn {cull: moves.has('psyshock')};\n\t\tcase 'psychocut': case 'zenheadbutt':\n\t\t\treturn {cull: (moves.has('psychic') || moves.has('psyshock')) && counter.setupType !== 'Physical'};\n\t\tcase 'psyshock':\n\t\t\tconst psychic = movePool.indexOf('psychic');\n\t\t\tif (psychic >= 0) this.fastPop(movePool, psychic);\n\t\t\treturn {cull: false};\n\t\tcase 'headsmash':\n\t\t\treturn {cull: moves.has('stoneedge')};\n\t\tcase 'rockblast': case 'rockslide':\n\t\t\treturn {cull: moves.has('headsmash') || moves.has('stoneedge')};\n\t\tcase 'bulletpunch':\n\t\t\treturn {cull: moves.has('substitute')};\n\t\tcase 'hydropump':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('razorshell') ||\n\t\t\t\tmoves.has('waterfall') ||\n\t\t\t\t(moves.has('scald') && (counter.get('Special') < 4 || species.types.length > 1 && counter.get('stab') < 3)) ||\n\t\t\t\trestTalk\n\t\t\t)};\n\t\tcase 'originpulse': case 'surf':\n\t\t\treturn {cull: moves.has('hydropump') || moves.has('scald')};\n\t\tcase 'scald':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('waterfall') ||\n\t\t\t\tmoves.has('waterpulse') ||\n\t\t\t\t(species.id === 'quagsire' && movePool.includes('recover'))\n\t\t\t)};\n\n\t\t// Status:\n\t\tcase 'glare': case 'headbutt':\n\t\t\treturn {cull: moves.has('bodyslam') || !moves.has('glare')};\n\t\tcase 'stunspore': case 'thunderwave':\n\t\t\tconst otherStatus = ['discharge', 'spore', 'toxic', 'trickroom', 'yawn'].some(m => moves.has(m));\n\t\t\treturn {cull: !!counter.setupType || !!counter.get('speedsetup') || restTalk || otherStatus};\n\t\tcase 'toxic':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.setupType ||\n\t\t\t\t['hypnosis', 'sleeppowder', 'toxicspikes', 'willowisp', 'yawn', 'raindance', 'flamecharge'].some(m => moves.has(m))\n\t\t\t)};\n\t\tcase 'willowisp':\n\t\t\treturn {cull: moves.has('scald')};\n\t\tcase 'raindance':\n\t\t\treturn {cull: (\n\t\t\t\tcounter.get('Physical') + counter.get('Special') < 2 ||\n\t\t\t\t(!types.has('Water') && !counter.get('Water')) ||\n\t\t\t\trestTalk\n\t\t\t)};\n\t\tcase 'sunnyday':\n\t\t\tconst cull = (\n\t\t\t\tcounter.get('Physical') + counter.get('Special') < 2 ||\n\t\t\t\t(!abilities.has('Chlorophyll') && !abilities.has('Flower Gift') && !moves.has('solarbeam')) ||\n\t\t\t\trestTalk\n\t\t\t);\n\n\t\t\tif (cull && movePool.length > 1) {\n\t\t\t\tconst solarbeam = movePool.indexOf('solarbeam');\n\t\t\t\tif (solarbeam >= 0) this.fastPop(movePool, solarbeam);\n\t\t\t\tif (movePool.length > 1) {\n\t\t\t\t\tconst weatherball = movePool.indexOf('weatherball');\n\t\t\t\t\tif (weatherball >= 0) this.fastPop(movePool, weatherball);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {cull};\n\t\tcase 'milkdrink': case 'moonlight': case 'painsplit': case 'recover': case 'roost': case 'synthesis':\n\t\t\treturn {cull: ['leechseed', 'rest', 'wish'].some(m => moves.has(m))};\n\t\tcase 'safeguard':\n\t\t\treturn {cull: moves.has('destinybond')};\n\t\tcase 'substitute':\n\t\t\treturn {cull: (\n\t\t\t\t['dracometeor', 'pursuit', 'rest', 'taunt', 'uturn', 'voltswitch', 'whirlwind'].some(m => moves.has(m)) ||\n\t\t\t\t(moves.has('leafstorm') && !abilities.has('Contrary')) ||\n\t\t\t\tmovePool.includes('copycat')\n\t\t\t)};\n\t\t}\n\n\t\treturn {cull: false};\n\t}\n\n\tshouldCullAbility(\n\t\tability: string,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tmovePool: string[],\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species\n\t): boolean {\n\t\tswitch (ability) {\n\t\tcase 'Flare Boost': case 'Gluttony': case 'Moody': case 'Snow Cloak': case 'Steadfast':\n\t\t\treturn true;\n\t\tcase 'Contrary': case 'Iron Fist': case 'Skill Link': case 'Strong Jaw':\n\t\t\treturn !counter.get(toID(ability));\n\t\tcase 'Aerilate': case 'Pixilate': case 'Refrigerate':\n\t\t\treturn !counter.get('Normal');\n\t\tcase 'Analytic': case 'Download': case 'Hyper Cutter':\n\t\t\treturn species.nfe;\n\t\tcase 'Battle Armor': case 'Sturdy':\n\t\t\treturn (!!counter.get('recoil') && !counter.get('recovery'));\n\t\tcase 'Chlorophyll': case 'Leaf Guard':\n\t\t\treturn (\n\t\t\t\tspecies.baseStats.spe > 100 ||\n\t\t\t\tabilities.has('Harvest') ||\n\t\t\t\t(!moves.has('sunnyday') && !teamDetails.sun)\n\t\t\t);\n\t\tcase 'Competitive':\n\t\t\treturn (!counter.get('Special') || moves.has('rest') && moves.has('sleeptalk'));\n\t\tcase 'Compound Eyes': case 'No Guard':\n\t\t\treturn !counter.get('inaccurate');\n\t\tcase 'Defiant': case 'Moxie':\n\t\t\treturn (!counter.get('Physical') || moves.has('dragontail'));\n\t\tcase 'Flash Fire':\n\t\t\treturn abilities.has('Drought');\n\t\tcase 'Harvest':\n\t\t\treturn abilities.has('Frisk');\n\t\tcase 'Hustle':\n\t\t\treturn counter.get('Physical') < 2;\n\t\tcase 'Hydration': case 'Rain Dish': case 'Swift Swim':\n\t\t\treturn (species.baseStats.spe > 100 || !moves.has('raindance') && !teamDetails.rain);\n\t\tcase 'Ice Body':\n\t\t\treturn !teamDetails.hail;\n\t\tcase 'Immunity': case 'Snow Warning':\n\t\t\treturn (moves.has('facade') || moves.has('hypervoice'));\n\t\tcase 'Intimidate':\n\t\t\treturn (moves.has('bodyslam') || moves.has('rest') || abilities.has('Reckless') && counter.get('recoil') > 1);\n\t\tcase 'Lightning Rod':\n\t\t\treturn species.types.includes('Ground');\n\t\tcase 'Limber':\n\t\t\treturn species.types.includes('Electric');\n\t\tcase 'Magnet Pull':\n\t\t\treturn (!types.has('Electric') && !moves.has('earthpower'));\n\t\tcase 'Mold Breaker':\n\t\t\treturn (\n\t\t\t\tmoves.has('acrobatics') ||\n\t\t\t\tabilities.has('Adaptability') ||\n\t\t\t\t(abilities.has('Sheer Force') && !!counter.get('sheerforce'))\n\t\t\t);\n\t\tcase 'Overgrow':\n\t\t\treturn !counter.get('Grass');\n\t\tcase 'Poison Heal':\n\t\t\treturn (abilities.has('Technician') && !!counter.get('technician'));\n\t\tcase 'Prankster':\n\t\t\treturn !counter.get('Status');\n\t\tcase 'Pressure': case 'Synchronize':\n\t\t\treturn (counter.get('Status') < 2 || !!counter.get('recoil') || !!species.isMega);\n\t\tcase 'Reckless': case 'Rock Head':\n\t\t\treturn (!counter.get('recoil') || !!species.isMega);\n\t\tcase 'Regenerator':\n\t\t\treturn abilities.has('Magic Guard');\n\t\tcase 'Sand Force': case 'Sand Rush': case 'Sand Veil':\n\t\t\treturn !teamDetails.sand;\n\t\tcase 'Scrappy':\n\t\t\treturn !species.types.includes('Normal');\n\t\tcase 'Serene Grace':\n\t\t\treturn (!counter.get('serenegrace') || species.name === 'Blissey');\n\t\tcase 'Sheer Force':\n\t\t\treturn (!counter.get('sheerforce') || moves.has('doubleedge') || abilities.has('Guts') || !!species.isMega);\n\t\tcase 'Simple':\n\t\t\treturn (!counter.setupType && !moves.has('flamecharge'));\n\t\tcase 'Solar Power':\n\t\t\treturn (!counter.get('Special') || !teamDetails.sun || !!species.isMega);\n\t\tcase 'Speed Boost':\n\t\t\treturn moves.has('uturn');\n\t\tcase 'Swarm':\n\t\t\treturn (!counter.get('Bug') || !!species.isMega);\n\t\tcase 'Sweet Veil':\n\t\t\treturn types.has('Grass');\n\t\tcase 'Technician':\n\t\t\treturn (!counter.get('technician') || moves.has('tailslap') || !!species.isMega);\n\t\tcase 'Tinted Lens':\n\t\t\treturn (\n\t\t\t\tmoves.has('protect') ||\n\t\t\t\tabilities.has('Prankster') ||\n\t\t\t\tcounter.get('damage') >= counter.damagingMoves.size ||\n\t\t\t\t(counter.get('Status') > 2 && !counter.setupType)\n\t\t\t);\n\t\tcase 'Torrent':\n\t\t\treturn (!counter.get('Water') || !!species.isMega);\n\t\tcase 'Unaware':\n\t\t\treturn (!!counter.setupType || moves.has('stealthrock'));\n\t\tcase 'Unburden':\n\t\t\treturn (!!species.isMega || abilities.has('Prankster') || !counter.setupType && !moves.has('acrobatics'));\n\t\tcase 'Water Absorb':\n\t\t\treturn (moves.has('raindance') || ['Drizzle', 'Unaware', 'Volt Absorb'].some(a => abilities.has(a)));\n\t\tcase 'Weak Armor':\n\t\t\treturn counter.setupType !== 'Physical';\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tgetHighPriorityItem(\n\t\tability: string,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tisLead: boolean\n\t): string | undefined {\n\t\tif (species.requiredItem) return species.requiredItem;\n\t\tif (species.requiredItems) return this.sample(species.requiredItems);\n\n\t\t// First, the extra high-priority items\n\t\tif (species.name === 'Marowak') return 'Thick Club';\n\t\tif (species.name === 'Dedenne') return 'Petaya Berry';\n\t\tif (species.name === 'Deoxys-Attack') return (isLead && moves.has('stealthrock')) ? 'Focus Sash' : 'Life Orb';\n\t\tif (species.name === 'Farfetch\\u2019d') return 'Stick';\n\t\tif (species.name === 'Genesect' && moves.has('technoblast')) return 'Douse Drive';\n\t\tif (species.baseSpecies === 'Pikachu') return 'Light Ball';\n\t\tif (species.name === 'Shedinja' || species.name === 'Smeargle') return 'Focus Sash';\n\t\tif (species.name === 'Unfezant' && counter.get('Physical') >= 2) return 'Scope Lens';\n\t\tif (species.name === 'Unown') return 'Choice Specs';\n\t\tif (species.name === 'Wobbuffet') {\n\t\t\treturn moves.has('destinybond') ? 'Custap Berry' : this.sample(['Leftovers', 'Sitrus Berry']);\n\t\t}\n\t\tif (ability === 'Harvest') return 'Sitrus Berry';\n\t\tif (ability === 'Imposter') return 'Choice Scarf';\n\t\tif (moves.has('switcheroo') || moves.has('trick')) {\n\t\t\tif (ability === 'Klutz') {\n\t\t\t\treturn 'Assault Vest';\n\t\t\t} else if (species.baseStats.spe >= 60 && species.baseStats.spe <= 108) {\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 (species.nfe) return (ability === 'Technician' && counter.get('Physical') >= 4) ? 'Choice Band' : 'Eviolite';\n\t\tif (moves.has('copycat') && counter.get('Physical') >= 3) return 'Choice Band';\n\t\tif (moves.has('bellydrum')) return 'Sitrus Berry';\n\t\tif (\n\t\t\tmoves.has('geomancy') ||\n\t\t\t(moves.has('solarbeam') && ability !== 'Drought' && !moves.has('sunnyday') && !teamDetails.sun)\n\t\t) {\n\t\t\treturn 'Power Herb';\n\t\t}\n\t\tif (moves.has('shellsmash')) {\n\t\t\treturn (ability === 'Solid Rock' && !!counter.get('priority')) ? 'Weakness Policy' : 'White Herb';\n\t\t}\n\t\tif ((ability === 'Guts' || moves.has('facade') || moves.has('psychoshift')) && !moves.has('sleeptalk')) {\n\t\t\treturn moves.has('drainpunch') ? 'Flame Orb' : 'Toxic Orb';\n\t\t}\n\t\tif (\n\t\t\t(ability === 'Magic Guard' && counter.damagingMoves.size > 1) ||\n\t\t\t(ability === 'Sheer Force' && !!counter.get('sheerforce'))\n\t\t) {\n\t\t\treturn 'Life Orb';\n\t\t}\n\t\tif (ability === 'Poison Heal') return 'Toxic Orb';\n\t\tif (ability === 'Unburden') {\n\t\t\tif (moves.has('fakeout')) {\n\t\t\t\treturn 'Normal Gem';\n\t\t\t} else if (['dracometeor', 'leafstorm', 'overheat'].some(m => moves.has(m))) {\n\t\t\t\treturn 'White Herb';\n\t\t\t} else if (moves.has('substitute') || counter.setupType) {\n\t\t\t\treturn 'Sitrus Berry';\n\t\t\t} else {\n\t\t\t\treturn 'Red Card';\n\t\t\t}\n\t\t}\n\t\tif (moves.has('acrobatics')) return ''; // not undefined - we want \"no item\"\n\t\tif (moves.has('raindance')) return (ability === 'Forecast') ? 'Damp Rock' : 'Life Orb';\n\t\tif (moves.has('sunnyday')) return (ability === 'Forecast') ? 'Heat Rock' : 'Life Orb';\n\t\tif (moves.has('lightscreen') && moves.has('reflect')) return 'Light Clay';\n\t\tif (moves.has('rest') && !moves.has('sleeptalk') && ability !== 'Natural Cure' && ability !== 'Shed Skin') {\n\t\t\treturn 'Chesto Berry';\n\t\t}\n\t}\n\n\tgetMediumPriorityItem(\n\t\tability: string,\n\t\tmoves: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tspecies: Species,\n\t\tisDoubles: boolean,\n\t\tisLead: boolean\n\t): string | undefined {\n\t\tconst defensiveStatTotal = species.baseStats.hp + species.baseStats.def + species.baseStats.spd;\n\t\tconst scarfReqs = species.baseStats.spe >= 60 && species.baseStats.spe <= 108 && !counter.get('priority');\n\n\t\tif (\n\t\t\t(ability === 'Speed Boost' || ability === 'Stance Change') &&\n\t\t\tcounter.get('Physical') + counter.get('Special') > 2\n\t\t) {\n\t\t\treturn 'Life Orb';\n\t\t}\n\t\tif (\n\t\t\tcounter.get('Physical') >= 4 &&\n\t\t\t['bodyslam', 'dragontail', 'fakeout', 'flamecharge', 'rapidspin', 'suckerpunch'].every(m => !moves.has(m))\n\t\t) {\n\t\t\treturn (\n\t\t\t\t(species.baseStats.atk >= 100 || ability === 'Huge Power') &&\n\t\t\t\tscarfReqs &&\n\t\t\t\tthis.randomChance(2, 3)\n\t\t\t) ? 'Choice Scarf' : 'Choice Band';\n\t\t}\n\t\tif (\n\t\t\tcounter.get('Special') >= 4 &&\n\t\t\t!moves.has('acidspray') && !moves.has('clearsmog') && !moves.has('fierydance')\n\t\t) {\n\t\t\treturn (\n\t\t\t\tspecies.baseStats.spa >= 100 &&\n\t\t\t\tscarfReqs &&\n\t\t\t\tthis.randomChance(2, 3)\n\t\t\t) ? 'Choice Scarf' : 'Choice Specs';\n\t\t}\n\t\tif (\n\t\t\tcounter.get('Physical') >= 3 &&\n\t\t\tmoves.has('defog') &&\n\t\t\tscarfReqs &&\n\t\t\t!moves.has('foulplay')\n\t\t) {\n\t\t\treturn 'Choice Scarf';\n\t\t}\n\n\t\tif (counter.get('Special') >= 3 && moves.has('uturn') && !moves.has('acidspray')) return 'Choice Specs';\n\t\tif (\n\t\t\tability === 'Slow Start' ||\n\t\t\t['bite', 'clearsmog', 'curse', 'protect', 'sleeptalk'].some(m => moves.has(m)) ||\n\t\t\tspecies.name.includes('Rotom-')\n\t\t) {\n\t\t\treturn 'Leftovers';\n\t\t}\n\n\t\tif (['endeavor', 'flail', 'reversal'].some(m => moves.has(m)) && ability !== 'Sturdy') {\n\t\t\treturn (ability === 'Defeatist') ? 'Expert Belt' : 'Focus Sash';\n\t\t}\n\t\tif (moves.has('outrage') && counter.setupType) return 'Lum Berry';\n\t\tif (moves.has('substitute')) return counter.damagingMoves.size > 2 && !!counter.get('drain') ? 'Life Orb' : 'Leftovers';\n\t\tif (this.dex.getEffectiveness('Ground', species) >= 2 && ability !== 'Levitate' && !moves.has('magnetrise')) {\n\t\t\treturn 'Air Balloon';\n\t\t}\n\t\tif ((ability === 'Iron Barbs' || ability === 'Rough Skin') && this.randomChance(1, 2)) return 'Rocky Helmet';\n\t\tif (\n\t\t\tcounter.get('Physical') + counter.get('Special') >= 4 &&\n\t\t\tspecies.baseStats.spd >= 50 &&\n\t\t\tdefensiveStatTotal >= 235\n\t\t) {\n\t\t\treturn 'Assault Vest';\n\t\t}\n\t\tif (species.name === 'Palkia' && (moves.has('dracometeor') || moves.has('spacialrend')) && moves.has('hydropump')) {\n\t\t\treturn 'Lustrous Orb';\n\t\t}\n\t\tif (counter.damagingMoves.size >= 4) {\n\t\t\treturn (!!counter.get('Dragon') || !!counter.get('Dark') || !!counter.get('Normal')) ? 'Life Orb' : 'Expert Belt';\n\t\t}\n\t\tif (counter.damagingMoves.size >= 3 && counter.get('speedsetup') && defensiveStatTotal >= 300) return 'Weakness Policy';\n\t\tif (\n\t\t\tisLead &&\n\t\t\tability !== 'Regenerator' && ability !== 'Sturdy' &&\n\t\t\t!counter.get('recoil') && !counter.get('recovery') &&\n\t\t\tdefensiveStatTotal <= 275\n\t\t) {\n\t\t\treturn 'Focus Sash';\n\t\t}\n\t}\n\n\tgetLowPriorityItem(\n\t\tability: string,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tisLead: boolean\n\t): string | undefined {\n\t\tconst defensiveStatTotal = species.baseStats.hp + species.baseStats.def + species.baseStats.spd;\n\n\t\tif (ability === 'Gale Wings' && moves.has('bravebird')) return 'Sharp Beak';\n\t\tif (moves.has('stickyweb') && ability === 'Sturdy') return 'Mental Herb';\n\t\tif (ability === 'Serene Grace' && moves.has('airslash') && species.baseStats.spe > 100) return 'Metronome';\n\t\tif (ability === 'Sturdy' && moves.has('explosion') && !counter.get('speedsetup')) return 'Custap Berry';\n\t\tif (ability === 'Super Luck') return 'Scope Lens';\n\t\tif (\n\t\t\tcounter.damagingMoves.size >= 3 && ability !== 'Sturdy' &&\n\t\t\t['acidspray', 'dragontail', 'foulplay', 'rapidspin', 'superfang', 'uturn'].every(m => !moves.has(m))\n\t\t) {\n\t\t\treturn (\n\t\t\t\tcounter.get('speedsetup') ||\n\t\t\t\tmoves.has('trickroom') ||\n\t\t\t\t(species.baseStats.spe > 40 && defensiveStatTotal <= 275)\n\t\t\t) ? 'Life Orb' : 'Leftovers';\n\t\t}\n\t}\n\n\trandomSet(\n\t\tspecies: string | Species,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails = {},\n\t\tisLead = false\n\t): RandomTeamsTypes.RandomSet {\n\t\tspecies = this.dex.species.get(species);\n\t\tlet forme = species.name;\n\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\tforme = species.battleOnly;\n\t\t}\n\t\tif (species.cosmeticFormes) {\n\t\t\tforme = this.sample([species.name].concat(species.cosmeticFormes));\n\t\t}\n\n\t\tconst movePool = (species.randomBattleMoves || Object.keys(this.dex.species.getLearnset(species.id)!)).slice();\n\t\tconst rejectedPool = [];\n\t\tlet ability = '';\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\tlet abilities = new Set(Object.values(species.abilities));\n\t\tif (species.unreleasedHidden) abilities.delete(species.abilities.H);\n\t\tlet availableHP = 0;\n\t\tfor (const setMoveid of movePool) {\n\t\t\tif (setMoveid.startsWith('hiddenpower')) availableHP++;\n\t\t}\n\n\t\t// These moves can be used even if we aren't setting up to use them:\n\t\tconst SetupException = ['closecombat', 'diamondstorm', 'extremespeed', 'suckerpunch', 'superpower', 'dracometeor'];\n\n\t\tconst moves = new Set<string>();\n\t\tlet counter: MoveCounter;\n\t\t// We use a special variable to track Hidden Power\n\t\t// so that we can check for all Hidden Powers at once\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\twhile (moves.size < this.maxMoveCount && movePool.length) {\n\t\t\t\tconst moveid = this.sampleNoReplace(movePool);\n\t\t\t\tif (moveid.startsWith('hiddenpower')) {\n\t\t\t\t\tavailableHP--;\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\twhile (moves.size < this.maxMoveCount && rejectedPool.length) {\n\t\t\t\tconst moveid = this.sampleNoReplace(rejectedPool);\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\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\n\t\t\t\tlet {cull, isSetup} = this.shouldCullMove(\n\t\t\t\t\tmove, types, moves, abilities, counter, movePool,\n\t\t\t\t\tteamDetails, species, isLead\n\t\t\t\t);\n\n\t\t\t\t// This move doesn't satisfy our setup requirements:\n\t\t\t\tif (\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]) + counter.get(species.types[1]);\n\t\t\t\t\tif (\n\t\t\t\t\t\t!SetupException.includes(moveid) &&\n\t\t\t\t\t\t(!types.has(move.type) || stabs > 1 || counter.get(move.category) < 2)\n\t\t\t\t\t) cull = true;\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tcounter.setupType && !isSetup && counter.setupType !== 'Mixed' && move.category !== counter.setupType &&\n\t\t\t\t\tcounter.get(counter.setupType) < 2 && (move.category !== 'Status' || !move.flags.heal) &&\n\t\t\t\t\tmoveid !== 'sleeptalk' && !types.has('Dark') && !moves.has('darkpulse') && (\n\t\t\t\t\t\tmove.category !== 'Status' || (\n\t\t\t\t\t\t\tcounter.get(counter.setupType) + counter.get('Status') > 3 &&\n\t\t\t\t\t\t\tcounter.get('physicalsetup') + counter.get('specialsetup') < 2\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\t// Mono-attacking with setup and RestTalk is allowed\n\t\t\t\t\t// Reject Status moves only if there is nothing else to reject\n\t\t\t\t\tcull = true;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\tcounter.setupType === 'Special' &&\n\t\t\t\t\tmoveid === 'hiddenpower' &&\n\t\t\t\t\tspecies.types.length > 1 &&\n\t\t\t\t\tcounter.get('Special') <= 2 &&\n\t\t\t\t\t!types.has(move.type) &&\n\t\t\t\t\t!counter.get('Physical') &&\n\t\t\t\t\tcounter.get('specialpool')\n\t\t\t\t) {\n\t\t\t\t\t// Hidden Power isn't good enough\n\t\t\t\t\tcull = true;\n\t\t\t\t}\n\n\t\t\t\tconst runEnforcementChecker = (checkerName: string) => {\n\t\t\t\t\tif (!this.moveEnforcementCheckers[checkerName]) return false;\n\t\t\t\t\treturn this.moveEnforcementCheckers[checkerName](\n\t\t\t\t\t\tmovePool, moves, abilities, types, counter, species as Species, teamDetails\n\t\t\t\t\t);\n\t\t\t\t};\n\n\t\t\t\t// Pokemon should have moves that benefit their Type/Ability/Weather, as well as moves required by its forme\n\t\t\t\tif (\n\t\t\t\t\t!cull && !isSetup && !move.weather && !move.damage &&\n\t\t\t\t\t(move.category !== 'Status' || !move.flags.heal) &&\n\t\t\t\t\t!['judgment', 'sleeptalk', 'toxic'].includes(moveid) &&\n\t\t\t\t\t(counter.get('physicalsetup') + counter.get('specialsetup') < 2 && (\n\t\t\t\t\t\t!counter.setupType || counter.setupType === 'Mixed' ||\n\t\t\t\t\t\t(move.category !== counter.setupType && move.category !== 'Status') ||\n\t\t\t\t\t\tcounter.get(counter.setupType) + counter.get('Status') > 3\n\t\t\t\t\t)) && (\n\t\t\t\t\t\tmove.category === 'Status' ||\n\t\t\t\t\t\t!types.has(move.type) ||\n\t\t\t\t\t\t(move.basePower && move.basePower < 40 && !move.multihit)\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tif (\n\t\t\t\t\t\t(!counter.get('stab') && !moves.has('nightshade') && !moves.has('seismictoss') && (\n\t\t\t\t\t\t\tspecies.types.length > 1 ||\n\t\t\t\t\t\t\t(species.types[0] !== 'Normal' && species.types[0] !== 'Psychic') ||\n\t\t\t\t\t\t\t!moves.has('icebeam') ||\n\t\t\t\t\t\t\tspecies.baseStats.spa >= species.baseStats.spd)\n\t\t\t\t\t\t) ||\n\t\t\t\t\t\t(!counter.get('recovery') && !counter.setupType && !moves.has('healingwish') && (\n\t\t\t\t\t\t\tmovePool.includes('recover') || movePool.includes('roost') || movePool.includes('softboiled')\n\t\t\t\t\t\t) && (counter.get('Status') > 1 || (species.nfe && !!counter.get('Status')))) ||\n\t\t\t\t\t\t(movePool.includes('stickyweb') && !counter.setupType && !teamDetails.stickyWeb) ||\n\t\t\t\t\t\t(species.requiredMove && movePool.includes(toID(species.requiredMove))) ||\n\t\t\t\t\t\t(moves.has('suckerpunch') && counter.get('stab') < species.types.length)\n\t\t\t\t\t) {\n\t\t\t\t\t\tcull = true;\n\t\t\t\t\t} else {\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\tfor (const abil of abilities) {\n\t\t\t\t\t\t\tif (runEnforcementChecker(abil)) {\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 (moveid === '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 cull moves from the move list\n\t\t\t\tif (cull && (\n\t\t\t\t\tmovePool.length - availableHP ||\n\t\t\t\t\t(availableHP && (moveid.startsWith('hiddenpower') || !hasHiddenPower))\n\t\t\t\t)) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tmove.category !== 'Status' &&\n\t\t\t\t\t\t!move.damage && !move.flags.charge &&\n\t\t\t\t\t\t(moveid !== 'hiddenpower' || !availableHP)\n\t\t\t\t\t) rejectedPool.push(moveid);\n\t\t\t\t\tmoves.delete(moveid);\n\t\t\t\t\tif (moveid.startsWith('hiddenpower')) hasHiddenPower = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (cull && rejectedPool.length) {\n\t\t\t\t\tmoves.delete(moveid);\n\t\t\t\t\tif (moveid.startsWith('hiddenpower')) hasHiddenPower = false;\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\tif (hasHiddenPower) {\n\t\t\tlet hpType;\n\t\t\tfor (const move of moves) {\n\t\t\t\tif (move.startsWith('hiddenpower')) {\n\t\t\t\t\thpType = move.substr(11);\n\t\t\t\t\tbreak;\n\t\t\t\t}\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\t// Moveset modifications\n\t\tif (moves.has('autotomize') && moves.has('heavyslam')) {\n\t\t\tmoves.delete('autotomize');\n\t\t\tmoves.add('rockpolish');\n\t\t}\n\t\tif (moves.has('raindance') && moves.has('thunderbolt')) {\n\t\t\tmoves.delete('thunderbolt');\n\t\t\tmoves.add('thunder');\n\t\t}\n\n\t\tif (species.battleOnly && !species.requiredAbility) {\n\t\t\tabilities = new Set(Object.values(this.dex.species.get(species.battleOnly as string).abilities));\n\t\t}\n\t\tconst abilityData = [...abilities].map(a => this.dex.abilities.get(a));\n\t\tUtils.sortBy(abilityData, abil => -abil.rating);\n\n\t\tif (abilityData.length > 1) {\n\t\t\t// Sort abilities by rating with an element of randomness\n\t\t\tif (abilityData[2] && abilityData[1].rating <= abilityData[2].rating && this.randomChance(1, 2)) {\n\t\t\t\t[abilityData[1], abilityData[2]] = [abilityData[2], abilityData[1]];\n\t\t\t}\n\t\t\tif (abilityData[0].rating <= abilityData[1].rating && this.randomChance(1, 2)) {\n\t\t\t\t[abilityData[0], abilityData[1]] = [abilityData[1], abilityData[0]];\n\t\t\t} else if (abilityData[0].rating - 0.6 <= abilityData[1].rating && this.randomChance(2, 3)) {\n\t\t\t\t[abilityData[0], abilityData[1]] = [abilityData[1], abilityData[0]];\n\t\t\t}\n\n\t\t\t// Start with the first abiility and work our way through, culling as we go\n\t\t\tability = abilityData[0].name;\n\n\t\t\twhile (this.shouldCullAbility(ability, types, moves, abilities, counter, movePool, teamDetails, species)) {\n\t\t\t\tif (ability === abilityData[0].name && abilityData[1].rating >= 1) {\n\t\t\t\t\tability = abilityData[1].name;\n\t\t\t\t} else if (ability === abilityData[1].name && abilityData[2] && abilityData[2].rating >= 1) {\n\t\t\t\t\tability = abilityData[2].name;\n\t\t\t\t} else {\n\t\t\t\t\t// Default to the highest rated ability if all are rejected\n\t\t\t\t\tability = abilityData[0].name;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tabilities.has('Guts') &&\n\t\t\t\tability !== 'Quick Feet' &&\n\t\t\t\t(moves.has('facade') || moves.has('protect') || (moves.has('rest') && moves.has('sleeptalk')))\n\t\t\t) {\n\t\t\t\tability = 'Guts';\n\t\t\t} else if (abilities.has('Moxie') && counter.get('Physical') > 3) {\n\t\t\t\tability = 'Moxie';\n\t\t\t}\n\t\t\tif (species.name === 'Ambipom' && !counter.get('technician')) {\n\t\t\t\t// If it doesn't qualify for Technician, Skill Link is useless on it\n\t\t\t\tability = 'Pickup';\n\t\t\t} else if (species.name === 'Lopunny' && moves.has('switcheroo') && this.randomChance(2, 3)) {\n\t\t\t\tability = 'Klutz';\n\t\t\t}\n\t\t} else {\n\t\t\tability = abilityData[0].name;\n\t\t}\n\n\t\tlet item = this.getHighPriorityItem(ability, types, moves, counter, teamDetails, species, isLead);\n\t\tif (item === undefined) item = this.getMediumPriorityItem(ability, moves, counter, species, false, isLead);\n\t\tif (item === undefined) {\n\t\t\titem = this.getLowPriorityItem(ability, types, moves, abilities, counter, teamDetails, species, isLead);\n\t\t}\n\t\tif (item === undefined) item = 'Leftovers';\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 levelScale: {[k: string]: number} = {\n\t\t\tuber: 76, ou: 80, uu: 82, ru: 84, nu: 86, pu: 88,\n\t\t};\n\t\tconst customScale: {[k: string]: number} = {\n\t\t\t// Banned Ability\n\t\t\tDugtrio: 82, Gothitelle: 82, Ninetales: 84, Politoed: 84, Wobbuffet: 82,\n\t\t\t// Holistic judgement\n\t\t\tCastform: 100, Delibird: 100, 'Genesect-Douse': 80, Luvdisc: 100, Spinda: 100, Unown: 100,\n\t\t};\n\t\tconst tier = toID(species.tier).replace('bl', '');\n\t\tconst level = this.adjustLevel || customScale[species.name] || levelScale[tier] || (species.nfe ? 90 : 80);\n\n\t\t// Prepare optimal HP\n\t\tconst srWeakness = 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\tif (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 if (moves.has('substitute') && (item === 'Petaya Berry' || item === 'Sitrus Berry')) {\n\t\t\t\t// Three Substitutes should activate Petaya Berry for Dedenne\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') {\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 {\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\t// Minimize confusion damage\n\t\tif (!counter.get('Physical') && !moves.has('copycat') && !moves.has('transform')) {\n\t\t\tevs.atk = 0;\n\t\t\tivs.atk = hasHiddenPower ? ivs.atk - 30 : 0;\n\t\t}\n\n\t\tif (['gyroball', 'metalburst', 'trickroom'].some(m => moves.has(m))) {\n\t\t\tevs.spe = 0;\n\t\t\tivs.spe = hasHiddenPower ? ivs.spe - 30 : 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\tmoves: Array.from(moves),\n\t\t\tability: ability,\n\t\t\tevs: evs,\n\t\t\tivs: ivs,\n\t\t\titem: item,\n\t\t\tlevel,\n\t\t\tshiny: this.randomChance(1, 1024),\n\t\t};\n\t}\n\n\trandomFactorySets: {[format: string]: {[species: string]: BattleFactorySpecies}} = {};\n\n\trandomFactorySet(\n\t\tspecies: Species,\n\t\tteamData: RandomTeamsTypes.FactoryTeamDetails,\n\t\ttier: string\n\t): RandomTeamsTypes.RandomFactorySet | null {\n\t\tconst id = toID(species.name);\n\t\t// const flags = this.randomFactorySets[tier][id].flags;\n\t\tconst setList = this.randomFactorySets[tier][id].sets;\n\n\t\tconst itemsMax: {[k: string]: number} = {choicespecs: 1, choiceband: 1, choicescarf: 1};\n\t\tconst movesMax: {[k: string]: number} = {\n\t\t\trapidspin: 1, batonpass: 1, stealthrock: 1, defog: 1, spikes: 1, toxicspikes: 1,\n\t\t};\n\t\tconst requiredMoves: {[k: string]: string} = {stealthrock: 'hazardSet', rapidspin: 'hazardClear', defog: 'hazardClear'};\n\t\tconst weatherAbilitiesRequire: {[k: string]: string} = {\n\t\t\thydration: 'raindance', swiftswim: 'raindance',\n\t\t\tleafguard: 'sunnyday', solarpower: 'sunnyday', chlorophyll: 'sunnyday',\n\t\t\tsandforce: 'sandstorm', sandrush: 'sandstorm', sandveil: 'sandstorm',\n\t\t\tsnowcloak: 'hail',\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[], itemVariants?: number, abilityVariants?: number}[] = [];\n\t\tconst priorityPool = [];\n\t\tfor (const curSet of setList) {\n\t\t\tif (this.forceMonotype && !species.types.includes(this.forceMonotype)) continue;\n\n\t\t\tconst itemData = this.dex.items.get(curSet.item);\n\t\t\tif (teamData.megaCount && teamData.megaCount > 0 && itemData.megaStone) continue; // reject 2+ mega stones\n\t\t\tif (itemsMax[itemData.id] && teamData.has[itemData.id] >= itemsMax[itemData.id]) continue;\n\n\t\t\tconst abilityState = this.dex.abilities.get(curSet.ability);\n\t\t\tif (weatherAbilitiesRequire[abilityState.id] && teamData.weather !== weatherAbilitiesRequire[abilityState.id]) continue;\n\t\t\tif (teamData.weather && weatherAbilities.includes(abilityState.id)) continue; // reject 2+ weather setters\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\t\t\teffectivePool.push({set: curSet, moveVariants: curSetVariants});\n\t\t\tif (hasRequiredMove) priorityPool.push({set: curSet, moveVariants: curSetVariants});\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\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: setData.set.item || '',\n\t\t\tability: setData.set.ability || species.abilities['0'],\n\t\t\tshiny: typeof setData.set.shiny === 'undefined' ? this.randomChance(1, 1024) : setData.set.shiny,\n\t\t\tlevel: this.adjustLevel || 100,\n\t\t\thappiness: typeof setData.set.happiness === 'undefined' ? 255 : setData.set.happiness,\n\t\t\tevs: setData.set.evs || {hp: 84, atk: 84, def: 84, spa: 84, spd: 84, spe: 84},\n\t\t\tivs: setData.set.ivs || {hp: 31, atk: 31, def: 31, spa: 31, spd: 31, spe: 31},\n\t\t\tnature: setData.set.nature || 'Serious',\n\t\t\tmoves: moves,\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\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) this.factoryTier = this.sample(['Uber', 'OU', 'UU', 'RU', 'NU', 'PU']);\n\t\tconst chosenTier = this.factoryTier;\n\n\t\tconst pokemon = [];\n\n\t\tconst pokemonPool = Object.keys(this.randomFactorySets[chosenTier]);\n\n\t\tconst teamData: TeamData = {\n\t\t\ttypeCount: {}, typeComboCount: {}, baseFormes: {}, megaCount: 0, has: {}, forceResult,\n\t\t\tweaknesses: {}, resistances: {},\n\t\t};\n\t\tconst requiredMoveFamilies = ['hazardSet', 'hazardClear'];\n\t\tconst requiredMoves: {[k: string]: string} = {stealthrock: 'hazardSet', rapidspin: 'hazardClear', defog: 'hazardClear'};\n\t\tconst weatherAbilitiesSet: {[k: string]: string} = {\n\t\t\tdrizzle: 'raindance', drought: 'sunnyday', snowwarning: 'hail', sandstream: '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\tconst speciesFlags = this.randomFactorySets[chosenTier][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\t// Limit the number of Megas to one\n\t\t\tif (!teamData.megaCount) teamData.megaCount = 0;\n\t\t\tif (teamData.megaCount >= 1 && speciesFlags.megaOnly) continue;\n\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\t// Limit 2 of any type\n\t\t\tconst types = species.types;\n\t\t\tlet skip = false;\n\t\t\tfor (const type of types) {\n\t\t\t\tif (teamData.typeCount[type] >= 2 * limitFactor && this.randomChance(4, 5)) {\n\t\t\t\t\tskip = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (skip) continue;\n\n\t\t\tconst set = this.randomFactorySet(species, teamData, chosenTier);\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 (teamData.typeComboCount[typeCombo] >= 1 * limitFactor) continue;\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\tteamData.typeComboCount[typeCombo] = (teamData.typeComboCount[typeCombo] + 1) || 1;\n\n\t\t\tteamData.baseFormes[species.baseSpecies] = 1;\n\n\t\t\tconst itemData = this.dex.items.get(set.item);\n\t\t\tif (itemData.megaStone) teamData.megaCount++;\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 Pokemon 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 type in teamData.weaknesses) {\n\t\t\t\tif (teamData.weaknesses[type] >= 3) return this.randomFactoryTeam(side, ++depth);\n\t\t\t}\n\t\t}\n\n\t\treturn pokemon;\n\t}\n}\n\nexport default RandomGen6Teams;\n","import {MoveCounter} from './gen8';\nimport {RandomGen6Teams} from './gen6';\nimport {Utils} from './utils';\nimport {\n\tFormat,\n\tModdedDex,\n\tMove,\n\tPRNG,\n\tPRNGSeed,\n\tRandomTeamsTypes,\n\tSparseStatsTable,\n\tSpecies,\n\tStatID,\n\ttoID,\n} from '@pkmn/sim';\n\nexport class RandomGen5Teams extends RandomGen6Teams {\n\tconstructor(dex: ModdedDex, format: Format, prng: PRNG | PRNGSeed | null) {\n\t\tsuper(dex, format, prng);\n\t\tthis.moveEnforcementCheckers = {\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\tDark: (movePool, moves, abilities, types, counter) => !counter.get('Dark'),\n\t\t\tDragon: (movePool, moves, abilities, types, counter) => !counter.get('Dragon'),\n\t\t\tElectric: (movePool, moves, abilities, types, counter) => !counter.get('Electric') || movePool.includes('thunder'),\n\t\t\tFighting: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\t!counter.get('Fighting') &&\n\t\t\t\t(species.baseStats.atk >= 90 || abilities.has('Pure Power') || !!counter.setupType || !counter.get('Status'))\n\t\t\t),\n\t\t\tFire: (movePool, moves, abilities, types, counter) => !counter.get('Fire'),\n\t\t\tFlying: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!counter.get('Flying') && (types.has('Normal') || abilities.has('Serene Grace'))\n\t\t\t),\n\t\t\tGhost: (movePool, moves, abilities, types, counter) => !types.has('Dark') && !counter.get('Ghost'),\n\t\t\tGrass: movePool => movePool.includes('hornleech') || movePool.includes('seedflare'),\n\t\t\tGround: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!counter.get('Ground') && !moves.has('rest') && !moves.has('sleeptalk')\n\t\t\t),\n\t\t\tIce: (movePool, moves, abilities, types, counter) => !counter.get('Ice'),\n\t\t\tNormal: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\tmovePool.includes('return') && species.baseStats.atk > 80\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) => !counter.get('Steel') && abilities.has('Technician'),\n\t\t\tWater: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!counter.get('Water') || (abilities.has('Adaptability') && movePool.includes('waterfall'))\n\t\t\t),\n\t\t\tContrary: (movePool, moves, abilities, types, counter, species, teamDetails) => (\n\t\t\t\t!counter.get('contrary') && species.name !== 'Shuckle'\n\t\t\t),\n\t\t\tGuts: (movePool, moves, abilities, types) => types.has('Normal') && movePool.includes('facade'),\n\t\t\t'Slow Start': movePool => movePool.includes('substitute'),\n\t\t};\n\t}\n\n\tshouldCullMove(\n\t\tmove: Move,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tmovePool: string[],\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tisLead: boolean,\n\t): {cull: boolean, isSetup?: boolean} {\n\t\tconst hasRestTalk = moves.has('rest') && moves.has('sleeptalk');\n\t\tswitch (move.id) {\n\t\t// Not very useful without their supporting moves\n\t\tcase 'batonpass':\n\t\t\treturn {cull: !counter.setupType && !counter.get('speedsetup') && !moves.has('substitute') && !moves.has('wish')};\n\t\tcase 'endeavor':\n\t\t\treturn {cull: !isLead};\n\t\tcase 'focuspunch':\n\t\t\treturn {cull: !moves.has('substitute') || counter.damagingMoves.size < 2 || moves.has('swordsdance')};\n\t\tcase 'rest':\n\t\t\treturn {cull: movePool.includes('sleeptalk')};\n\t\tcase 'sleeptalk':\n\t\t\tif (movePool.length > 1) {\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\treturn {cull: !moves.has('rest')};\n\t\tcase 'storedpower':\n\t\t\treturn {cull: !counter.setupType && !moves.has('cosmicpower')};\n\t\tcase 'weatherball':\n\t\t\treturn {cull: !moves.has('sunnyday')};\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\treturn {cull: (counter.setupType !== 'Physical' || counter.get('physicalsetup') > 1 || (\n\t\t\t\tcounter.get('Physical') + counter.get('physicalpool') < 2 &&\n\t\t\t\t!moves.has('batonpass') &&\n\t\t\t\t!hasRestTalk\n\t\t\t)), isSetup: true};\n\t\tcase 'calmmind': case 'nastyplot': case 'tailglow':\n\t\t\treturn {cull: (counter.setupType !== 'Special' || counter.get('specialsetup') > 1 || (\n\t\t\t\tcounter.get('Special') + counter.get('specialpool') < 2 &&\n\t\t\t\t!moves.has('batonpass') &&\n\t\t\t\t!hasRestTalk\n\t\t\t)), isSetup: true};\n\t\tcase 'growth': case 'shellsmash': case 'workup':\n\t\t\tconst moveTotal = counter.damagingMoves.size + counter.get('physicalpool') + counter.get('specialpool');\n\t\t\treturn {\n\t\t\t\tcull: (\n\t\t\t\t\tcounter.setupType !== 'Mixed' ||\n\t\t\t\t\tcounter.get('mixedsetup') > 1 ||\n\t\t\t\t\tmoveTotal < 2 ||\n\t\t\t\t\t(move.id === 'growth' && !moves.has('sunnyday'))\n\t\t\t\t),\n\t\t\t\tisSetup: true,\n\t\t\t};\n\t\tcase 'agility': case 'autotomize': case 'rockpolish':\n\t\t\treturn {\n\t\t\t\tcull: (\n\t\t\t\t\t(counter.damagingMoves.size < 2 && !counter.setupType && !moves.has('batonpass')) ||\n\t\t\t\t\thasRestTalk\n\t\t\t\t),\n\t\t\t\tisSetup: !counter.setupType,\n\t\t\t};\n\n\t\t// Bad after setup\n\t\tcase 'bulletpunch':\n\t\t\treturn {cull: !!counter.get('speedsetup')};\n\t\tcase 'circlethrow': case 'dragontail':\n\t\t\treturn {cull: moves.has('substitute') || (!!counter.setupType && !moves.has('rest') && !moves.has('sleeptalk'))};\n\t\tcase 'fakeout': case 'healingwish':\n\t\t\treturn {cull: !!counter.setupType || !!counter.get('recovery') || moves.has('substitute')};\n\t\tcase 'haze': case 'magiccoat': case 'pursuit': case 'spikes':\n\t\t\treturn {cull: !!counter.setupType || !!counter.get('speedsetup') || moves.has('rest') || moves.has('trickroom')};\n\t\tcase 'leechseed': case 'roar': case 'whirlwind':\n\t\t\treturn {cull: !!counter.setupType || !!counter.get('speedsetup') || moves.has('dragontail')};\n\t\tcase 'nightshade': case 'seismictoss': case 'superfang':\n\t\t\treturn {cull: !!counter.setupType || counter.damagingMoves.size > 1};\n\t\tcase 'protect':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('rest') ||\n\t\t\t\t(counter.setupType && !abilities.has('Speed Boost') && !moves.has('wish')) ||\n\t\t\t\tmoves.has('lightscreen') && moves.has('reflect')\n\t\t\t)};\n\t\tcase 'rapidspin':\n\t\t\treturn {cull: moves.has('shellsmash') || (!!counter.setupType && counter.get('Status') >= 2)};\n\t\tcase 'stealthrock':\n\t\t\treturn {cull: !!counter.setupType || !!counter.get('speedsetup') || moves.has('rest') || !!teamDetails.stealthRock};\n\t\tcase 'switcheroo': case 'trick':\n\t\t\treturn {cull: (\n\t\t\t\tcounter.get('Physical') + counter.get('Special') < 3 ||\n\t\t\t\t!!counter.get('priority') ||\n\t\t\t\tmoves.has('rapidspin')\n\t\t\t)};\n\t\tcase 'toxic':\n\t\t\treturn {cull: !!counter.setupType || !!counter.get('speedsetup') || moves.has('trickroom')};\n\t\tcase 'toxicspikes':\n\t\t\treturn {cull: !!counter.setupType || !!teamDetails.toxicSpikes};\n\t\tcase 'trickroom':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.setupType ||\n\t\t\t\t!!counter.get('speedsetup') ||\n\t\t\t\tcounter.damagingMoves.size < 2 ||\n\t\t\t\tmoves.has('lightscreen') || moves.has('reflect')\n\t\t\t)};\n\t\tcase 'uturn':\n\t\t\t// Infernape doesn't want mixed sets with U-turn\n\t\t\tconst infernapeCase = species.id === 'infernape' && !!counter.get('Special');\n\t\t\treturn {cull: !!counter.setupType || !!counter.get('speedsetup') || moves.has('batonpass') || infernapeCase};\n\t\tcase 'voltswitch':\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['batonpass', 'magnetrise', 'uturn'].some(m => moves.has(m))\n\t\t\t)};\n\n\t\t// Ineffective having both\n\t\t// Attacks:\n\t\tcase 'bugbite':\n\t\t\treturn {cull: moves.has('uturn')};\n\t\tcase 'crunch':\n\t\t\treturn {cull: !types.has('Dark') && moves.has('suckerpunch')};\n\t\tcase 'dragonpulse': case 'spacialrend':\n\t\t\treturn {cull: moves.has('dracometeor') || moves.has('outrage')};\n\t\tcase 'thunderbolt':\n\t\t\treturn {cull: moves.has('wildcharge')};\n\t\tcase 'drainpunch': case 'focusblast':\n\t\t\treturn {cull: moves.has('closecombat') || moves.has('lowkick')};\n\t\tcase 'blueflare': case 'flareblitz': case 'fierydance': case 'flamethrower': case 'lavaplume':\n\t\t\treturn {cull: ['fireblast', 'overheat', 'vcreate'].some(m => moves.has(m))};\n\t\tcase 'bravebird': case 'pluck':\n\t\t\treturn {cull: moves.has('acrobatics') || moves.has('hurricane')};\n\t\tcase 'gigadrain':\n\t\t\treturn {cull: (!counter.setupType && moves.has('leafstorm')) || moves.has('petaldance') || moves.has('powerwhip')};\n\t\tcase 'solarbeam':\n\t\t\treturn {cull: (!abilities.has('Drought') && !moves.has('sunnyday')) || moves.has('gigadrain')};\n\t\tcase 'leafstorm':\n\t\t\treturn {cull: !!counter.setupType && moves.has('gigadrain')};\n\t\tcase 'bonemerang': case 'earthpower':\n\t\t\treturn {cull: moves.has('earthquake')};\n\t\tcase 'extremespeed': case 'headsmash':\n\t\t\treturn {cull: moves.has('roost')};\n\t\tcase 'facade':\n\t\t\treturn {cull: moves.has('suckerpunch') && !types.has('Normal')};\n\t\tcase 'judgment':\n\t\t\treturn {cull: counter.setupType !== 'Special' && counter.get('stab') > 1};\n\t\tcase 'return':\n\t\t\treturn {cull: moves.has('doubleedge')};\n\t\tcase 'poisonjab':\n\t\t\treturn {cull: moves.has('gunkshot')};\n\t\tcase 'psychic':\n\t\t\treturn {cull: moves.has('psyshock')};\n\t\tcase 'scald': case 'surf':\n\t\t\treturn {cull: moves.has('hydropump') || moves.has('waterfall')};\n\t\tcase 'waterspout':\n\t\t\treturn {cull: !!counter.get('Status')};\n\n\t\t// Status:\n\t\tcase 'encore': case 'icepunch': case 'raindance': case 'suckerpunch':\n\t\t\treturn {cull: moves.has('thunderwave') || hasRestTalk};\n\t\tcase 'glare': case 'headbutt':\n\t\t\treturn {cull: moves.has('bodyslam')};\n\t\tcase 'healbell':\n\t\t\treturn {cull: !!counter.get('speedsetup') || moves.has('magiccoat')};\n\t\tcase 'moonlight': case 'painsplit': case 'recover': case 'roost': case 'softboiled': case 'synthesis':\n\t\t\treturn {cull: ['leechseed', 'rest', 'wish'].some(m => moves.has(m))};\n\t\tcase 'substitute':\n\t\t\treturn {cull: (\n\t\t\t\t(moves.has('doubleedge') && !abilities.has('rockhead')) ||\n\t\t\t\t['pursuit', 'rest', 'superpower', 'uturn', 'voltswitch'].some(m => moves.has(m))\n\t\t\t)};\n\t\tcase 'thunderwave':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.setupType ||\n\t\t\t\t!!counter.get('speedsetup') ||\n\t\t\t\thasRestTalk ||\n\t\t\t\tmoves.has('discharge') || moves.has('trickroom')\n\t\t\t)};\n\t\tcase 'willowisp':\n\t\t\treturn {cull: moves.has('lavaplume') || moves.has('scald') && !types.has('Ghost')};\n\t\t}\n\n\t\treturn {cull: false};\n\t}\n\n\tshouldCullAbility(\n\t\tability: string,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tmovePool: string[],\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species\n\t): boolean {\n\t\tswitch (ability) {\n\t\tcase 'Anger Point': case 'Gluttony': case 'Keen Eye': case 'Moody':\n\t\tcase 'Sand Veil': case 'Snow Cloak': case 'Steadfast': case 'Weak Armor':\n\t\t\treturn true;\n\t\tcase 'Analytic': case 'Download': case 'Hyper Cutter':\n\t\t\treturn species.nfe;\n\t\tcase 'Chlorophyll': case 'Solar Power':\n\t\t\treturn (!moves.has('sunnyday') && !teamDetails.sun);\n\t\tcase 'Compound Eyes': case 'No Guard':\n\t\t\treturn !counter.get('inaccurate');\n\t\tcase 'Contrary': case 'Iron Fist': case 'Skill Link':\n\t\t\treturn !counter.get(toID(ability));\n\t\tcase 'Defiant': case 'Moxie':\n\t\t\treturn (!counter.get('Physical') && !moves.has('batonpass'));\n\t\tcase 'Flash Fire':\n\t\t\treturn abilities.has('Drought');\n\t\tcase 'Hydration': case 'Rain Dish': case 'Swift Swim':\n\t\t\treturn (!moves.has('raindance') && !teamDetails.rain);\n\t\tcase 'Hustle':\n\t\t\treturn counter.get('Physical') < 2;\n\t\tcase 'Ice Body':\n\t\t\treturn !teamDetails.hail;\n\t\tcase 'Immunity':\n\t\t\treturn abilities.has('Toxic Boost');\n\t\tcase 'Intimidate':\n\t\t\treturn moves.has('rest') || species.id === 'staraptor';\n\t\tcase 'Lightning Rod':\n\t\t\treturn species.types.includes('Ground');\n\t\tcase 'Limber':\n\t\t\treturn species.types.includes('Electric');\n\t\tcase 'Mold Breaker':\n\t\t\treturn (abilities.has('Adaptability') || moves.has('rest') && moves.has('sleeptalk'));\n\t\tcase 'Overgrow':\n\t\t\treturn !counter.get('Grass');\n\t\tcase 'Poison Heal':\n\t\t\treturn (abilities.has('Technician') && !!counter.get('technician'));\n\t\tcase 'Prankster':\n\t\t\treturn !counter.get('Status');\n\t\tcase 'Pressure': case 'Synchronize':\n\t\t\treturn (counter.get('Status') < 2 || abilities.has('Trace'));\n\t\tcase 'Reckless': case 'Rock Head':\n\t\t\treturn (!counter.get('recoil') || abilities.has('Sap Sipper'));\n\t\tcase 'Regenerator':\n\t\t\treturn abilities.has('Magic Guard');\n\t\tcase 'Sand Force': case 'Sand Rush':\n\t\t\treturn !teamDetails.sand;\n\t\tcase 'Serene Grace':\n\t\t\treturn (!counter.get('serenegrace') || species.id === 'blissey');\n\t\tcase 'Sheer Force':\n\t\t\treturn (!counter.get('sheerforce') || abilities.has('Guts'));\n\t\tcase 'Sturdy':\n\t\t\treturn (!!counter.get('recoil') && !counter.get('recovery'));\n\t\tcase 'Swarm':\n\t\t\treturn !counter.get('Bug');\n\t\tcase 'Technician':\n\t\t\treturn (!counter.get('technician') || moves.has('tailslap'));\n\t\tcase 'Tinted Lens':\n\t\t\treturn (abilities.has('Insomnia') || abilities.has('Magic Guard') || moves.has('protect'));\n\t\tcase 'Unaware':\n\t\t\treturn (!!counter.setupType || abilities.has('Magic Guard'));\n\t\tcase 'Unburden':\n\t\t\treturn species.baseStats.spe > 100 && !moves.has('acrobatics');\n\t\tcase 'Water Absorb':\n\t\t\treturn (abilities.has('Drizzle') || abilities.has('Unaware') || abilities.has('Volt Absorb'));\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tgetHighPriorityItem(\n\t\tability: string,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tisLead: boolean\n\t): string | undefined {\n\t\tif (species.requiredItem) return species.requiredItem;\n\t\tif (species.requiredItems) return this.sample(species.requiredItems);\n\n\t\tif (species.name === 'Marowak') return 'Thick Club';\n\t\tif (species.name === 'Farfetch\\u2019d') return 'Stick';\n\t\tif (species.name === 'Pikachu') return 'Light Ball';\n\t\tif (species.name === 'Shedinja' || species.name === 'Smeargle') return 'Focus Sash';\n\t\tif (species.name === 'Unown') return 'Choice Specs';\n\t\tif (species.name === 'Wobbuffet' && moves.has('destinybond') && this.randomChance(1, 2)) return 'Custap Berry';\n\t\tif (ability === 'Imposter') return 'Choice Scarf';\n\t\tif (moves.has('switcheroo') || moves.has('trick')) {\n\t\t\tif (species.baseStats.spe >= 60 && species.baseStats.spe <= 108 && !counter.get('priority')) {\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 (species.nfe) return 'Eviolite';\n\t\tif (moves.has('shellsmash')) return 'White Herb';\n\t\tif (ability === 'Harvest' || moves.has('bellydrum')) return 'Sitrus Berry';\n\t\tif ((ability === 'Magic Guard' || ability === 'Sheer Force') && counter.damagingMoves.size > 1) return 'Life Orb';\n\t\tif (\n\t\t\tability === 'Poison Heal' ||\n\t\t\tability === 'Toxic Boost' ||\n\t\t\t(ability === 'Quick Feet' && moves.has('facade')) ||\n\t\t\tmoves.has('psychoshift')\n\t\t) {\n\t\t\treturn 'Toxic Orb';\n\t\t}\n\t\tif (moves.has('rest') && !moves.has('sleeptalk') && ability !== 'Natural Cure' && ability !== 'Shed Skin') {\n\t\t\treturn 'Chesto Berry';\n\t\t}\n\t\tif (ability === 'Guts' && moves.has('facade')) {\n\t\t\treturn (types.has('Fire') || moves.has('uturn') || moves.has('voltswitch')) ? 'Toxic Orb' : 'Flame Orb';\n\t\t}\n\t\tif (moves.has('raindance')) return (ability === 'Forecast') ? 'Damp Rock' : 'Life Orb';\n\t\tif (moves.has('sunnyday')) return (ability === 'Forecast' || ability === 'Flower Gift') ? 'Heat Rock' : 'Life Orb';\n\t\tif (moves.has('lightscreen') && moves.has('reflect')) return 'Light Clay';\n\t\tif (moves.has('acrobatics')) return 'Flying Gem';\n\t\tif (ability === 'Unburden') return moves.has('fakeout') ? 'Normal Gem' : `${species.types[0]} Gem`;\n\t}\n\n\tgetLowPriorityItem(\n\t\tability: string,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tisLead: boolean,\n\t): string | undefined {\n\t\tif (\n\t\t\tability === 'Speed Boost' &&\n\t\t\t!moves.has('substitute') &&\n\t\t\tcounter.get('Physical') + counter.get('Special') > 2\n\t\t) {\n\t\t\treturn 'Life Orb';\n\t\t}\n\t\tif (\n\t\t\tcounter.get('Physical') >= 4 &&\n\t\t\t['dragontail', 'fakeout', 'flamecharge'].every(m => !moves.has(m)) &&\n\t\t\t!moves.has('suckerpunch') &&\n\t\t\t(!moves.has('rapidspin') || this.dex.getEffectiveness('Rock', species) < 1)\n\t\t) {\n\t\t\treturn (\n\t\t\t\t(species.baseStats.atk >= 100 || abilities.has('Huge Power')) &&\n\t\t\t\tspecies.baseStats.spe >= 60 && species.baseStats.spe <= 108 &&\n\t\t\t\t!counter.get('priority') &&\n\t\t\t\tthis.randomChance(2, 3)\n\t\t\t) ? 'Choice Scarf' : 'Choice Band';\n\t\t}\n\t\tif (counter.get('Special') >= 4 || (counter.get('Special') >= 3 && moves.has('uturn'))) {\n\t\t\treturn (\n\t\t\t\tspecies.baseStats.spa >= 100 &&\n\t\t\t\tspecies.baseStats.spe >= 60 && species.baseStats.spe <= 108 &&\n\t\t\t\t!moves.has('uturn') &&\n\t\t\t\t(ability === 'Download' || moves.has('eruption') || moves.has('waterspout') || this.randomChance(2, 3))\n\t\t\t) ? 'Choice Scarf' : 'Choice Specs';\n\t\t}\n\n\t\tif (counter.setupType && moves.has('outrage')) return 'Lum Berry';\n\t\tif (this.dex.getEffectiveness('Ground', species) >= 2 && ability !== 'Levitate') return 'Air Balloon';\n\t\tif (\n\t\t\ttypes.has('Poison') ||\n\t\t\t['bodyslam', 'dragontail', 'protect', 'scald', 'sleeptalk', 'substitute'].some(m => moves.has(m))\n\t\t) {\n\t\t\treturn 'Leftovers';\n\t\t}\n\t\tif (species.name === 'Palkia' && (moves.has('dracometeor') || moves.has('spacialrend')) && moves.has('hydropump')) {\n\t\t\treturn 'Lustrous Orb';\n\t\t}\n\t\tif (counter.damagingMoves.size >= 4 && ability !== 'Sturdy') {\n\t\t\treturn moves.has('uturn') ? 'Expert Belt' : 'Life Orb';\n\t\t}\n\t\tif (\n\t\t\tisLead &&\n\t\t\tcounter.get('hazards') &&\n\t\t\t!counter.get('recovery') &&\n\t\t\tability !== 'Regenerator' &&\n\t\t\tspecies.baseStats.hp + species.baseStats.def + species.baseStats.spd <= 275\n\t\t) {\n\t\t\treturn ability === 'Sturdy' ? 'Custap Berry' : 'Focus Sash';\n\t\t}\n\t\tif (moves.has('voltswitch') && species.baseStats.spe <= 90) {\n\t\t\treturn 'Leftovers';\n\t\t}\n\t\tif (\n\t\t\tcounter.damagingMoves.size >= 3 &&\n\t\t\tspecies.baseStats.spe >= 40 &&\n\t\t\tspecies.baseStats.hp + species.baseStats.def + species.baseStats.spd <= 275 &&\n\t\t\tability !== 'Sturdy' &&\n\t\t\t!moves.has('rapidspin') && !moves.has('uturn')\n\t\t) {\n\t\t\treturn 'Life Orb';\n\t\t}\n\t}\n\n\trandomSet(\n\t\tspecies: string | Species,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails = {},\n\t\tisLead = false\n\t): RandomTeamsTypes.RandomSet {\n\t\tspecies = this.dex.species.get(species);\n\t\tlet forme = species.name;\n\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\tforme = species.battleOnly;\n\t\t}\n\t\tif (species.cosmeticFormes) {\n\t\t\tforme = this.sample([species.name].concat(species.cosmeticFormes));\n\t\t}\n\n\t\tconst movePool = (species.randomBattleMoves || Object.keys(this.dex.species.getLearnset(species.id)!)).slice();\n\t\tconst rejectedPool = [];\n\t\tconst moves = new Set<string>();\n\t\tlet ability = '';\n\n\t\tconst evs = {hp: 85, atk: 85, def: 85, spa: 85, spd: 85, spe: 85};\n\t\tconst ivs: SparseStatsTable = {hp: 31, atk: 31, def: 31, spa: 31, spd: 31, spe: 31};\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\tlet availableHP = 0;\n\t\tfor (const setMoveid of movePool) {\n\t\t\tif (setMoveid.startsWith('hiddenpower')) availableHP++;\n\t\t}\n\n\t\tlet counter: MoveCounter;\n\t\t// We use a special variable to track Hidden Power\n\t\t// so that we can check for all Hidden Powers at once\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\twhile (moves.size < this.maxMoveCount && movePool.length) {\n\t\t\t\tconst moveid = this.sampleNoReplace(movePool);\n\t\t\t\tif (moveid.startsWith('hiddenpower')) {\n\t\t\t\t\tavailableHP--;\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\twhile (moves.size < this.maxMoveCount && rejectedPool.length) {\n\t\t\t\tconst moveid = this.sampleNoReplace(rejectedPool);\n\t\t\t\tif (moveid.startsWith('hiddenpower')) {\n\t\t\t\t\tif (hasHiddenPower) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\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\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\n\t\t\t\tlet {cull, isSetup} = this.shouldCullMove(\n\t\t\t\t\tmove, types, moves, abilities, counter, movePool,\n\t\t\t\t\tteamDetails, species, isLead\n\t\t\t\t);\n\n\t\t\t\t// This move doesn't satisfy our setup requirements:\n\t\t\t\tif (\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]) + (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\t\t\t\tif (\n\t\t\t\t\t!isSetup &&\n\t\t\t\t\tcounter.setupType &&\n\t\t\t\t\tcounter.setupType !== 'Mixed' &&\n\t\t\t\t\tmove.category !== counter.setupType &&\n\t\t\t\t\tcounter.get(counter.setupType) < 2 &&\n\t\t\t\t\t!moves.has('batonpass') &&\n\t\t\t\t\t(move.category !== 'Status' || !move.flags.heal) &&\n\t\t\t\t\tmoveid !== 'sleeptalk' && (\n\t\t\t\t\t\tmove.category !== 'Status' || (\n\t\t\t\t\t\t\tcounter.get(counter.setupType) + counter.get('Status') > 3 &&\n\t\t\t\t\t\t\tcounter.get('physicalsetup') + counter.get('specialsetup') < 2\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\t// Mono-attacking with setup and RestTalk is allowed\n\t\t\t\t\t// Reject Status moves only if there is nothing else to reject\n\t\t\t\t\tcull = true;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\tcounter.setupType === 'Special' &&\n\t\t\t\t\tmoveid === 'hiddenpower' &&\n\t\t\t\t\tspecies.types.length > 1 &&\n\t\t\t\t\tcounter.get('Special') <= 2 &&\n\t\t\t\t\t!types.has(move.type) &&\n\t\t\t\t\t!counter.get('Physical') &&\n\t\t\t\t\tcounter.get('specialpool')\n\t\t\t\t) {\n\t\t\t\t\t// Hidden Power isn't good enough\n\t\t\t\t\tcull = true;\n\t\t\t\t}\n\n\t\t\t\tconst runEnforcementChecker = (checkerName: string) => {\n\t\t\t\t\tif (!this.moveEnforcementCheckers[checkerName]) return false;\n\t\t\t\t\treturn this.moveEnforcementCheckers[checkerName](\n\t\t\t\t\t\tmovePool, moves, abilities, types, counter, species as Species, teamDetails\n\t\t\t\t\t);\n\t\t\t\t};\n\t\t\t\t// Pokemon should have moves that benefit their Type/Ability/Weather, as well as moves required by its forme\n\t\t\t\tif (\n\t\t\t\t\t!cull &&\n\t\t\t\t\t!['judgment', 'quiverdance', 'sleeptalk'].includes(moveid) &&\n\t\t\t\t\t!isSetup && !move.weather && !move.damage && (move.category !== 'Status' || !move.flags.heal) && (\n\t\t\t\t\t\tmove.category === 'Status' ||\n\t\t\t\t\t\t!types.has(move.type) ||\n\t\t\t\t\t\tmove.basePower && move.basePower < 40 && !move.multihit\n\t\t\t\t\t) && (counter.get('physicalsetup') + counter.get('specialsetup') < 2 && (\n\t\t\t\t\t\t!counter.setupType ||\n\t\t\t\t\t\tcounter.setupType === 'Mixed' ||\n\t\t\t\t\t\t(move.category !== counter.setupType && move.category !== 'Status') ||\n\t\t\t\t\t\tcounter.get(counter.setupType) + counter.get('Status') > 3\n\t\t\t\t\t))\n\t\t\t\t) {\n\t\t\t\t\tif (\n\t\t\t\t\t\t(\n\t\t\t\t\t\t\t!counter.get('stab') &&\n\t\t\t\t\t\t\t!counter.get('damage') && (\n\t\t\t\t\t\t\t\tspecies.types.length > 1 ||\n\t\t\t\t\t\t\t\t(species.types[0] !== 'Normal' && species.types[0] !== 'Psychic') ||\n\t\t\t\t\t\t\t\t!moves.has('icebeam') ||\n\t\t\t\t\t\t\t\tspecies.baseStats.spa >= species.baseStats.spd\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t) || (\n\t\t\t\t\t\t\t!counter.get('recovery') &&\n\t\t\t\t\t\t\t!counter.setupType &&\n\t\t\t\t\t\t\t!moves.has('healingwish') &&\n\t\t\t\t\t\t\t(counter.get('Status') > 1 || (species.nfe && !!counter.get('Status'))) &&\n\t\t\t\t\t\t\t(movePool.includes('recover') || movePool.includes('roost') || movePool.includes('softboiled'))\n\t\t\t\t\t\t) || (\n\t\t\t\t\t\t\tmovePool.includes('darkvoid') ||\n\t\t\t\t\t\t\tmovePool.includes('quiverdance') ||\n\t\t\t\t\t\t\t(species.requiredMove && movePool.includes(toID(species.requiredMove)))\n\t\t\t\t\t\t) || (\n\t\t\t\t\t\t\tisLead && runEnforcementChecker('lead')\n\t\t\t\t\t\t)\n\t\t\t\t\t) {\n\t\t\t\t\t\tcull = true;\n\t\t\t\t\t} else {\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\tfor (const abil of abilities) {\n\t\t\t\t\t\t\tif (runEnforcementChecker(abil)) {\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 (moveid === '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\tconst isHP = moveid.startsWith('hiddenpower');\n\t\t\t\tif (\n\t\t\t\t\tcull &&\n\t\t\t\t\t(movePool.length - availableHP || availableHP && (isHP || !hasHiddenPower))\n\t\t\t\t) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tmove.category !== 'Status' && !move.damage && !move.flags.charge &&\n\t\t\t\t\t\t(!isHP || !availableHP)\n\t\t\t\t\t) rejectedPool.push(moveid);\n\t\t\t\t\tmoves.delete(moveid);\n\t\t\t\t\tif (isHP) hasHiddenPower = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (cull && rejectedPool.length) {\n\t\t\t\t\tmoves.delete(moveid);\n\t\t\t\t\tif (moveid.startsWith('hiddenpower')) hasHiddenPower = false;\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\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\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) {\n\t\t\t// Sort abilities by rating with an element of randomness\n\t\t\tif (abilityData[2] && abilityData[1].rating <= abilityData[2].rating && this.randomChance(1, 2)) {\n\t\t\t\t[abilityData[1], abilityData[2]] = [abilityData[2], abilityData[1]];\n\t\t\t}\n\t\t\tif (abilityData[0].rating <= abilityData[1].rating) {\n\t\t\t\tif (this.randomChance(1, 2)) [abilityData[0], abilityData[1]] = [abilityData[1], abilityData[0]];\n\t\t\t} else if (abilityData[0].rating - 0.6 <= abilityData[1].rating) {\n\t\t\t\tif (this.randomChance(2, 3)) [abilityData[0], abilityData[1]] = [abilityData[1], abilityData[0]];\n\t\t\t}\n\n\t\t\t// Start with the first abiility and work our way through, culling as we go\n\t\t\tability = abilityData[0].name;\n\n\n\t\t\twhile (this.shouldCullAbility(ability, types, moves, abilities, counter, movePool, teamDetails, species)) {\n\t\t\t\tif (ability === abilityData[0].name && abilityData[1].rating >= 1) {\n\t\t\t\t\tability = abilityData[1].name;\n\t\t\t\t} else if (ability === abilityData[1].name && abilityData[2] && abilityData[2].rating >= 1) {\n\t\t\t\t\tability = abilityData[2].name;\n\t\t\t\t} else {\n\t\t\t\t\tability = abilityData[0].name;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (abilities.has('Guts') && moves.has('facade') && (ability !== 'Quick Feet' || !counter.setupType)) {\n\t\t\t\tability = 'Guts';\n\t\t\t} else if (abilities.has('Prankster') && counter.get('Status') > 1) {\n\t\t\t\tability = 'Prankster';\n\t\t\t} else if (abilities.has('Quick Feet') && moves.has('facade')) {\n\t\t\t\tability = 'Quick Feet';\n\t\t\t} else if (abilities.has('Swift Swim') && moves.has('raindance')) {\n\t\t\t\tability = 'Swift Swim';\n\t\t\t}\n\t\t} else {\n\t\t\tability = abilityData[0].name;\n\t\t}\n\n\t\tlet item = this.getHighPriorityItem(ability, types, moves, counter, teamDetails, species, isLead);\n\t\tif (item === undefined) {\n\t\t\titem = this.getLowPriorityItem(ability, types, moves, abilities, counter, teamDetails, species, isLead);\n\t\t}\n\t\tif (item === undefined) item = 'Leftovers';\n\t\tif (item === 'Leftovers' && types.has('Poison')) {\n\t\t\titem = 'Black Sludge';\n\t\t}\n\n\t\tconst levelScale: {[tier: string]: number} = {\n\t\t\tUber: 76,\n\t\t\tOU: 80,\n\t\t\t'(OU)': 82,\n\t\t\tUUBL: 82,\n\t\t\tUU: 82,\n\t\t\tRUBL: 84,\n\t\t\tRU: 84,\n\t\t\tNUBL: 86,\n\t\t\tNU: 86,\n\t\t\t'(NU)': 88,\n\t\t\tPUBL: 88,\n\t\t\tPU: 88,\n\t\t\t'(PU)': 90,\n\t\t};\n\t\tconst customScale: {[forme: string]: number} = {\n\t\t\tDelibird: 100, 'Farfetch\\u2019d': 100, Luvdisc: 100, Unown: 100,\n\t\t};\n\t\tconst level = this.adjustLevel || customScale[species.name] || levelScale[species.tier] || (species.nfe ? 90 : 80);\n\n\t\t// Prepare optimal HP\n\t\tconst srWeakness = this.dex.getEffectiveness('Rock', species);\n\t\twhile (evs.hp > 1) {\n\t\t\tconst hp = Math.floor(\n\t\t\t\tMath.floor(\n\t\t\t\t\t2 * species.baseStats.hp + (ivs.hp || 31) + Math.floor(evs.hp / 4) + 100\n\t\t\t\t) * level / 100 + 10\n\t\t\t);\n\t\t\tif (moves.has('bellydrum') && item === 'Sitrus Berry') {\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 {\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\t// Minimize confusion damage\n\t\tif (!counter.get('Physical') && !moves.has('transform')) {\n\t\t\tevs.atk = 0;\n\t\t\tivs.atk = hasHiddenPower ? (ivs.atk || 31) - 28 : 0;\n\t\t}\n\n\t\tif (['gyroball', 'metalburst', 'trickroom'].some(m => moves.has(m))) {\n\t\t\tevs.spe = 0;\n\t\t\tivs.spe = hasHiddenPower ? (ivs.spe || 31) - 28 : 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\tmoves: Array.from(moves),\n\t\t\tability,\n\t\t\tevs,\n\t\t\tivs,\n\t\t\titem,\n\t\t\tlevel,\n\t\t};\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 typePool = this.dex.types.names();\n\t\tconst type = this.forceMonotype || this.sample(typePool);\n\n\t\tconst baseFormes: {[k: string]: number} = {};\n\t\tconst tierCount: {[k: string]: number} = {};\n\t\tconst typeCount: {[k: string]: number} = {};\n\t\tconst typeComboCount: {[k: string]: number} = {};\n\t\tconst teamDetails: RandomTeamsTypes.TeamDetails = {};\n\n\t\tconst pokemonPool = this.getPokemonPool(type, pokemon, isMonotype);\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 || !species.randomBattleMoves) 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// Adjust rate for species with multiple sets\n\t\t\tswitch (species.baseSpecies) {\n\t\t\tcase 'Arceus':\n\t\t\t\tif (this.randomChance(16, 17) && !isMonotype) continue;\n\t\t\t\tbreak;\n\t\t\tcase 'Rotom':\n\t\t\t\tif (this.gen < 5 && this.randomChance(5, 6) && !isMonotype) continue;\n\t\t\t\tbreak;\n\t\t\tcase 'Basculin': case 'Castform': case 'Cherrim': case 'Meloetta':\n\t\t\t\tif (this.randomChance(1, 2)) continue;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Illusion shouldn't be in the last slot\n\t\t\tif (species.name === 'Zoroark' && pokemon.length > 4) continue;\n\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\tconst tier = species.tier;\n\n\t\t\t// Limit two Pokemon per tier\n\t\t\tif (this.gen === 5 && !isMonotype && !this.forceMonotype && tierCount[tier] >= 2 * limitFactor) continue;\n\n\t\t\tconst set = this.randomSet(species, teamDetails, pokemon.length === 0);\n\n\t\t\tconst types = species.types;\n\n\t\t\tif (!isMonotype && !this.forceMonotype) {\n\t\t\t\t// Limit two of any type\n\t\t\t\tlet skip = false;\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\t\t\t}\n\n\t\t\t// Limit one of any type combination, two in Monotype\n\t\t\tlet typeCombo = types.slice().sort().join();\n\t\t\tif (set.ability === 'Drought' || set.ability === 'Drizzle' || set.ability === 'Sand Stream') {\n\t\t\t\t// Drought, Drizzle and Sand Stream don't count towards the type combo limit\n\t\t\t\ttypeCombo = set.ability;\n\t\t\t\tif (typeCombo in typeComboCount) continue;\n\t\t\t} else if (!this.forceMonotype) {\n\t\t\t\tif (typeComboCount[typeCombo] >= (isMonotype ? 2 : 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\n\t\t\tif (pokemon.length === this.maxTeamSize) {\n\t\t\t\t// Set Zoroark's level to be the same as the last Pokemon\n\t\t\t\tconst illusion = teamDetails.illusion;\n\t\t\t\tif (illusion) pokemon[illusion - 1].level = pokemon[this.maxTeamSize - 1].level;\n\t\t\t\tbreak;\n\t\t\t}\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 tier counter\n\t\t\tif (tierCount[tier]) {\n\t\t\t\ttierCount[tier]++;\n\t\t\t} else {\n\t\t\t\ttierCount[tier] = 1;\n\t\t\t}\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// Team details\n\t\t\tif (set.ability === 'Snow Warning' || set.moves.includes('hail')) teamDetails.hail = 1;\n\t\t\tif (set.ability === 'Drizzle' || set.moves.includes('raindance')) teamDetails.rain = 1;\n\t\t\tif (set.ability === 'Sand Stream') teamDetails.sand = 1;\n\t\t\tif (set.moves.includes('stealthrock')) teamDetails.stealthRock = 1;\n\t\t\tif (set.moves.includes('toxicspikes')) teamDetails.toxicSpikes = 1;\n\t\t\tif (set.moves.includes('rapidspin')) teamDetails.rapidSpin = 1;\n\n\t\t\t// For setting Zoroark's level\n\t\t\tif (set.ability === 'Illusion') teamDetails.illusion = pokemon.length;\n\t\t}\n\t\tif (pokemon.length < this.maxTeamSize && pokemon.length < 12) {\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\nexport default RandomGen5Teams;\n","import {MoveCounter} from './gen8';\nimport {RandomGen5Teams} from './gen5';\nimport {Utils} from './utils';\nimport {\n\tFormat,\n\tModdedDex,\n\tMove,\n\tPRNG,\n\tPRNGSeed,\n\tRandomTeamsTypes,\n\tSparseStatsTable,\n\tSpecies,\n\tStatID,\n\ttoID,\n} from '@pkmn/sim';\n\n\n// These moves can be used even if we aren't setting up to use them:\nconst SetupException = ['dracometeor', 'overheat'];\n\n// Give recovery moves priority over certain other defensive status moves\nconst recoveryMoves = [\n\t'healorder', 'milkdrink', 'moonlight', 'morningsun', 'painsplit', 'recover', 'rest', 'roost',\n\t'slackoff', 'softboiled', 'synthesis', 'wish',\n];\nconst defensiveStatusMoves = ['aromatherapy', 'haze', 'healbell', 'roar', 'whirlwind', 'willowisp', 'yawn'];\nexport class RandomGen4Teams extends RandomGen5Teams {\n\tconstructor(dex: ModdedDex, format: Format, prng: PRNG | PRNGSeed | null) {\n\t\tsuper(dex, format, prng);\n\t\tthis.moveEnforcementCheckers = {\n\t\t\tBug: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!counter.get('Bug') && (movePool.includes('bugbuzz') || movePool.includes('megahorn'))\n\t\t\t),\n\t\t\tDark: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t(!counter.get('Dark') || (counter.get('Dark') === 1 && moves.has('pursuit'))) &&\n\t\t\t\tmovePool.includes('suckerpunch') &&\n\t\t\t\tcounter.setupType !== 'Special'\n\t\t\t),\n\t\t\tDragon: (movePool, moves, abilities, types, counter) => !counter.get('Dragon'),\n\t\t\tElectric: (movePool, moves, abilities, types, counter) => !counter.get('Electric'),\n\t\t\tFighting: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!counter.get('Fighting') &&\n\t\t\t\t(!!counter.setupType || !counter.get('Status') || movePool.includes('closecombat') || movePool.includes('highjumpkick'))\n\t\t\t),\n\t\t\tFire: (movePool, moves, abilities, types, counter) => !counter.get('Fire'),\n\t\t\tFlying: (movePool, moves, abilities, types, counter) => !counter.get('Flying') && (\n\t\t\t\t(counter.setupType !== 'Special' && movePool.includes('bravebird')) ||\n\t\t\t\t(abilities.has('Serene Grace') && movePool.includes('airslash'))\n\t\t\t),\n\t\t\tGrass: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!counter.get('Grass') &&\n\t\t\t\t['leafblade', 'leafstorm', 'seedflare', 'woodhammer'].some(m => movePool.includes(m))\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\t!counter.get('Ice') && (!types.has('Water') || !counter.get('Water'))\n\t\t\t),\n\t\t\tRock: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!counter.get('Rock') && (movePool.includes('headsmash') || movePool.includes('stoneedge'))\n\t\t\t),\n\t\t\tSteel: (movePool, moves, abilities, types, counter) => !counter.get('Steel') && movePool.includes('meteormash'),\n\t\t\tWater: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!counter.get('Water') && (moves.has('raindance') || !types.has('Ice') || !counter.get('Ice'))\n\t\t\t),\n\t\t\tAdaptability: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\t!counter.setupType &&\n\t\t\t\tspecies.types.length > 1 &&\n\t\t\t\t(!counter.get(species.types[0]) || !counter.get(species.types[1]))\n\t\t\t),\n\t\t\tGuts: (movePool, moves, abilities, types) => types.has('Normal') && movePool.includes('facade'),\n\t\t\t'Slow Start': movePool => movePool.includes('substitute'),\n\t\t};\n\t}\n\tshouldCullMove(\n\t\tmove: Move,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tmovePool: string[],\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tisLead: boolean,\n\t): {cull: boolean, isSetup?: boolean} {\n\t\tconst restTalk = moves.has('rest') && moves.has('sleeptalk');\n\n\t\tswitch (move.id) {\n\t\t// Not very useful without their supporting moves\n\t\tcase 'batonpass':\n\t\t\treturn {cull: !counter.setupType && !counter.get('speedsetup') && !moves.has('substitute')};\n\t\tcase 'eruption': case 'waterspout':\n\t\t\treturn {cull: counter.get('Physical') + counter.get('Special') < 4};\n\t\tcase 'focuspunch':\n\t\t\treturn {cull: !moves.has('substitute') || counter.damagingMoves.size < 2 || moves.has('hammerarm')};\n\t\tcase 'raindance':\n\t\t\treturn {cull: abilities.has('Hydration') ? !moves.has('rest') : counter.get('Physical') + counter.get('Special') < 2};\n\t\tcase 'refresh':\n\t\t\treturn {cull: !(moves.has('calmmind') && (moves.has('recover') || moves.has('roost')))};\n\t\tcase 'rest':\n\t\t\treturn {cull: movePool.includes('sleeptalk') || (abilities.has('Hydration') && !moves.has('raindance'))};\n\t\tcase 'sleeptalk':\n\t\t\tif (movePool.length > 1) {\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\treturn {cull: !moves.has('rest')};\n\t\tcase 'sunnyday':\n\t\t\treturn {cull: !moves.has('solarbeam')};\n\t\tcase 'weatherball':\n\t\t\treturn {cull: !moves.has('raindance') && !moves.has('sunnyday')};\n\n\t\t// Set up once and only if we have the moves for it\n\t\tcase 'bellydrum': case 'bulkup': case 'curse': case 'dragondance': case 'swordsdance':\n\t\t\tconst notEnoughPhysicalMoves = (\n\t\t\t\tcounter.get('Physical') + counter.get('physicalpool') < 2 &&\n\t\t\t\t!moves.has('batonpass') &&\n\t\t\t\t(!moves.has('rest') || !moves.has('sleeptalk'))\n\t\t\t);\n\t\t\tconst badPhysicalMoveset = counter.setupType !== 'Physical' || counter.get('physicalsetup') > 1;\n\t\t\treturn {cull: moves.has('sunnyday') || notEnoughPhysicalMoves || badPhysicalMoveset, isSetup: true};\n\t\tcase 'calmmind': case 'nastyplot': case 'tailglow':\n\t\t\tconst notEnoughSpecialMoves = (\n\t\t\t\tcounter.get('Special') + counter.get('specialpool') < 2 &&\n\t\t\t\t!moves.has('batonpass') &&\n\t\t\t\t(!moves.has('rest') || !moves.has('sleeptalk'))\n\t\t\t);\n\t\t\tconst badSpecialMoveset = counter.setupType !== 'Special' || counter.get('specialsetup') > 1;\n\t\t\treturn {cull: notEnoughSpecialMoves || badSpecialMoveset, isSetup: true};\n\t\tcase 'agility': case 'rockpolish':\n\t\t\treturn {cull: restTalk || (counter.damagingMoves.size < 2 && !moves.has('batonpass')), isSetup: !counter.setupType};\n\n\t\t// Bad after setup\n\t\tcase 'destinybond':\n\t\t\treturn {cull: !!counter.setupType || moves.has('explosion')};\n\t\tcase 'explosion': case 'selfdestruct':\n\t\t\treturn {cull: (\n\t\t\t\tcounter.setupType === 'Special' ||\n\t\t\t\tArray.from(moves).some(id => recoveryMoves.includes(id) || defensiveStatusMoves.includes(id)) ||\n\t\t\t\t['batonpass', 'protect', 'substitute'].some(m => moves.has(m))\n\t\t\t)};\n\t\tcase 'foresight': case 'roar': case 'whirlwind':\n\t\t\treturn {cull: !!counter.setupType && !abilities.has('Speed Boost')};\n\t\tcase 'healingwish': case 'lunardance':\n\t\t\treturn {cull: !!counter.setupType || moves.has('rest') || moves.has('substitute')};\n\t\tcase 'protect':\n\t\t\treturn {cull: (\n\t\t\t\t!['Guts', 'Quick Feet', 'Speed Boost'].some(abil => abilities.has(abil)) ||\n\t\t\t\t['rest', 'softboiled', 'toxic', 'wish'].some(m => moves.has(m))\n\t\t\t)};\n\t\tcase 'wish':\n\t\t\treturn {cull: (\n\t\t\t\t!['batonpass', 'protect', 'uturn'].some(m => moves.has(m)) ||\n\t\t\t\tmoves.has('rest') ||\n\t\t\t\t!!counter.get('speedsetup')\n\t\t\t)};\n\t\tcase 'rapidspin':\n\t\t\treturn {cull: !!teamDetails.rapidSpin || (!!counter.setupType && counter.get('Physical') + counter.get('Special') < 2)};\n\t\tcase 'reflect': case 'lightscreen': case 'fakeout':\n\t\t\treturn {cull: !!counter.setupType || !!counter.get('speedsetup') || moves.has('substitute')};\n\t\tcase 'spikes':\n\t\t\treturn {cull: !!counter.setupType || !!counter.get('speedsetup') || moves.has('substitute')};\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\tmoves.has('rest') || moves.has('substitute') ||\n\t\t\t\t!!teamDetails.stealthRock\n\t\t\t)};\n\t\tcase 'switcheroo': case 'trick':\n\t\t\treturn {cull: (\n\t\t\t\tcounter.get('Physical') + counter.get('Special') < 3 ||\n\t\t\t\t!!counter.setupType ||\n\t\t\t\t['fakeout', 'lightscreen', 'reflect', 'suckerpunch', 'trickroom'].some(m => moves.has(m))\n\t\t\t)};\n\t\tcase 'toxic': case 'toxicspikes':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.setupType || !!counter.get('speedsetup') || !!teamDetails.toxicSpikes || moves.has('willowisp')\n\t\t\t)};\n\t\tcase 'trickroom':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.setupType ||\n\t\t\t\t!!counter.get('speedsetup') ||\n\t\t\t\tcounter.damagingMoves.size < 2 ||\n\t\t\t\tmoves.has('lightscreen') || moves.has('reflect') ||\n\t\t\t\trestTalk\n\t\t\t)};\n\t\tcase 'uturn':\n\t\t\treturn {cull: (\n\t\t\t\t(types.has('Bug') && counter.get('stab') < 2 && counter.damagingMoves.size > 1) ||\n\t\t\t\t(abilities.has('Speed Boost') && moves.has('protect')) ||\n\t\t\t\t!!counter.setupType ||\n\t\t\t\t!!counter.get('speedsetup') ||\n\t\t\t\tmoves.has('batonpass') || moves.has('substitute')\n\t\t\t)};\n\n\t\t// Bit redundant to have both\n\t\t// Attacks:\n\t\tcase 'bodyslam': case 'slash':\n\t\t\treturn {cull: moves.has('facade') || moves.has('return')};\n\t\tcase 'doubleedge':\n\t\t\treturn {cull: ['bodyslam', 'facade', 'return'].some(m => moves.has(m))};\n\t\tcase 'endeavor':\n\t\t\treturn {cull: !isLead};\n\t\tcase 'headbutt':\n\t\t\treturn {cull: !moves.has('bodyslam') && !moves.has('thunderwave')};\n\t\tcase 'judgment': case 'swift':\n\t\t\treturn {cull: counter.setupType !== 'Special' && counter.get('stab') > 1};\n\t\tcase 'quickattack':\n\t\t\treturn {cull: moves.has('thunderwave')};\n\t\tcase 'firepunch': case 'flamethrower':\n\t\t\treturn {cull: moves.has('fireblast') || moves.has('overheat') && !counter.setupType};\n\t\tcase 'lavaplume': case 'fireblast':\n\t\t\tif (move.id === 'fireblast' && moves.has('lavaplume') && !counter.get('speedsetup')) return {cull: true};\n\t\t\tif (move.id === 'lavaplume' && moves.has('fireblast') && counter.get('speedsetup')) return {cull: true};\n\t\t\tif (moves.has('flareblitz') && counter.setupType !== 'Special') return {cull: true};\n\t\t\tbreak;\n\t\tcase 'overheat':\n\t\t\treturn {cull: counter.setupType === 'Special' || ['batonpass', 'fireblast', 'flareblitz'].some(m => moves.has(m))};\n\t\tcase 'aquajet':\n\t\t\treturn {cull: moves.has('dragondance') || (moves.has('waterfall') && counter.get('Physical') < 3)};\n\t\tcase 'hydropump':\n\t\t\treturn {cull: moves.has('surf')};\n\t\tcase 'waterfall':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('aquatail') ||\n\t\t\t\t(counter.setupType !== 'Physical' && (moves.has('hydropump') || moves.has('surf')))\n\t\t\t)};\n\t\tcase 'chargebeam':\n\t\t\treturn {cull: moves.has('thunderbolt') && counter.get('Special') < 3};\n\t\tcase 'discharge':\n\t\t\treturn {cull: moves.has('thunderbolt')};\n\t\tcase 'energyball':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('leafblade') ||\n\t\t\t\tmoves.has('woodhammer') ||\n\t\t\t\t(moves.has('sunnyday') && moves.has('solarbeam')) ||\n\t\t\t\t(moves.has('leafstorm') && counter.get('Physical') + counter.get('Special') < 4)\n\t\t\t)};\n\t\tcase 'grassknot': case 'leafblade': case 'seedbomb':\n\t\t\treturn {cull: moves.has('woodhammer') || (moves.has('sunnyday') && moves.has('solarbeam'))};\n\t\tcase 'leafstorm':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.setupType ||\n\t\t\t\tmoves.has('batonpass') ||\n\t\t\t\tmoves.has('powerwhip') ||\n\t\t\t\t(moves.has('sunnyday') && moves.has('solarbeam'))\n\t\t\t)};\n\t\tcase 'solarbeam':\n\t\t\treturn {cull: counter.setupType === 'Physical' || !moves.has('sunnyday')};\n\t\tcase 'icepunch':\n\t\t\treturn {cull: !counter.setupType && moves.has('icebeam')};\n\t\tcase 'aurasphere': case 'drainpunch': case 'focusblast':\n\t\t\treturn {cull: moves.has('closecombat') && counter.setupType !== 'Special'};\n\t\tcase 'brickbreak': case 'closecombat': case 'crosschop': case 'lowkick':\n\t\t\treturn {cull: moves.has('substitute') && moves.has('focuspunch')};\n\t\tcase 'machpunch':\n\t\t\treturn {cull: (\n\t\t\t\tcounter.damagingMoves.size <= counter.get('Fighting') ||\n\t\t\t\t(types.has('Fighting') && counter.get('stab') < 2 && !abilities.has('Technician'))\n\t\t\t)};\n\t\tcase 'seismictoss':\n\t\t\treturn {cull: moves.has('nightshade') || counter.get('Physical') + counter.get('Special') >= 1};\n\t\tcase 'superpower':\n\t\t\treturn {cull: moves.has('dragondance') || !!counter.get('speedsetup')};\n\t\tcase 'gunkshot':\n\t\t\treturn {cull: moves.has('poisonjab')};\n\t\tcase 'earthpower':\n\t\t\treturn {cull: moves.has('earthquake')};\n\t\tcase 'airslash':\n\t\t\treturn {cull: !counter.setupType && moves.has('bravebird')};\n\t\tcase 'zenheadbutt':\n\t\t\treturn {cull: moves.has('psychocut')};\n\t\tcase 'rockblast': case 'rockslide':\n\t\t\treturn {cull: moves.has('stoneedge')};\n\t\tcase 'shadowclaw':\n\t\t\treturn {cull: moves.has('shadowforce') || moves.has('suckerpunch') && !types.has('Ghost')};\n\t\tcase 'dracometeor':\n\t\t\treturn {cull: moves.has('calmmind') || restTalk || (!!counter.setupType && counter.get('stab') < 2)};\n\t\tcase 'dragonclaw':\n\t\t\treturn {cull: moves.has('outrage')};\n\t\tcase 'dragonpulse':\n\t\t\treturn {cull: moves.has('dracometeor') && moves.has('outrage')};\n\t\tcase 'crunch': case 'nightslash':\n\t\t\treturn {cull: moves.has('suckerpunch')};\n\t\tcase 'pursuit':\n\t\t\treturn {cull: !!counter.setupType || moves.has('payback')};\n\t\tcase 'flashcannon':\n\t\t\treturn {cull: (moves.has('ironhead') || movePool.includes('ironhead')) && counter.setupType !== 'Special'};\n\n\t\t// Status:\n\t\tcase 'encore':\n\t\t\treturn {cull: ['roar', 'taunt', 'whirlwind'].some(m => moves.has(m)) || restTalk};\n\t\tcase 'haze': case 'taunt':\n\t\t\treturn {cull: restTalk};\n\t\tcase 'leechseed': case 'painsplit':\n\t\t\treturn {cull: !!counter.setupType || !!counter.get('speedsetup') || moves.has('rest')};\n\t\tcase 'recover': case 'slackoff':\n\t\t\treturn {cull: restTalk};\n\t\tcase 'stunspore':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.setupType ||\n\t\t\t\tmoves.has('toxic') ||\n\t\t\t\tmovePool.includes('sleeppowder') ||\n\t\t\t\tmovePool.includes('spore')\n\t\t\t)};\n\t\tcase 'substitute':\n\t\t\treturn {cull: ['pursuit', 'rapidspin', 'rest', 'taunt'].some(m => moves.has(m))};\n\t\tcase 'thunderwave':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.setupType ||\n\t\t\t\tmoves.has('toxic') ||\n\t\t\t\tmoves.has('trickroom') ||\n\t\t\t\t(moves.has('bodyslam') && abilities.has('Serene Grace'))\n\t\t\t)};\n\t\tcase 'yawn':\n\t\t\treturn {cull: moves.has('thunderwave') || moves.has('toxic')};\n\t\t}\n\t\treturn {cull: false};\n\t}\n\n\tshouldCullAbility(\n\t\tability: string,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tmovePool: string[],\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t) {\n\t\tswitch (ability) {\n\t\tcase 'Anger Point': case 'Ice Body': case 'Steadfast':\n\t\t\treturn true;\n\t\tcase 'Blaze':\n\t\t\treturn !counter.get('Fire');\n\t\tcase 'Chlorophyll':\n\t\t\treturn !moves.has('sunnyday') && !teamDetails.sun;\n\t\tcase 'Compound Eyes': case 'No Guard':\n\t\t\treturn !counter.get('inaccurate');\n\t\tcase 'Early Bird':\n\t\t\treturn !moves.has('rest');\n\t\tcase 'Gluttony':\n\t\t\treturn !moves.has('bellydrum');\n\t\tcase 'Hustle':\n\t\t\treturn counter.get('Physical') < 2;\n\t\tcase 'Mold Breaker':\n\t\t\treturn !moves.has('earthquake');\n\t\tcase 'Overgrow':\n\t\t\treturn !counter.get('Grass');\n\t\tcase 'Reckless': case 'Rock Head':\n\t\t\treturn !counter.get('recoil');\n\t\tcase 'Sand Veil':\n\t\t\treturn !teamDetails.sand;\n\t\tcase 'Serene Grace':\n\t\t\treturn !counter.get('serenegrace') || species.id === 'blissey';\n\t\tcase 'Simple':\n\t\t\treturn !counter.setupType && !moves.has('cosmicpower');\n\t\tcase 'Skill Link':\n\t\t\treturn !counter.get('skilllink');\n\t\tcase 'Snow Cloak':\n\t\t\treturn !teamDetails.hail;\n\t\tcase 'Solar Power':\n\t\t\treturn !counter.get('Special') || !moves.has('sunnyday') && !teamDetails.sun;\n\t\tcase 'Speed Boost':\n\t\t\treturn moves.has('uturn');\n\t\tcase 'Swift Swim':\n\t\t\treturn !moves.has('raindance') && !teamDetails.rain;\n\t\tcase 'Swarm':\n\t\t\treturn !counter.get('Bug');\n\t\tcase 'Synchronize':\n\t\t\treturn counter.get('Status') < 2;\n\t\tcase 'Technician':\n\t\t\treturn !counter.get('technician') || moves.has('toxic');\n\t\tcase 'Tinted Lens':\n\t\t\treturn counter.get('damage') >= counter.damagingMoves.size;\n\t\tcase 'Torrent':\n\t\t\treturn !counter.get('Water');\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tgetHighPriorityItem(\n\t\tability: string,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tisLead: boolean,\n\t): string | undefined {\n\t\tif (species.requiredItem) return species.requiredItem;\n\t\tif (species.requiredItems) return this.sample(species.requiredItems);\n\t\tif (species.name === 'Farfetch\\u2019d') return 'Stick';\n\t\tif (species.name === 'Marowak') return 'Thick Club';\n\t\tif (species.name === 'Shedinja' || species.name === 'Smeargle') return 'Focus Sash';\n\t\tif (species.name === 'Unown') return 'Choice Specs';\n\t\tif (species.name === 'Wobbuffet') {\n\t\t\treturn moves.has('destinybond') ? 'Custap Berry' : this.sample(['Leftovers', 'Sitrus Berry']);\n\t\t}\n\n\t\tif (moves.has('switcheroo') || moves.has('trick')) {\n\t\t\tif (\n\t\t\t\tspecies.baseStats.spe >= 60 && species.baseStats.spe <= 108 &&\n\t\t\t\t!counter.get('priority') &&\n\t\t\t\tthis.randomChance(2, 3)\n\t\t\t) {\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('bellydrum')) return 'Sitrus Berry';\n\t\tif (ability === 'Magic Guard' || ability === 'Speed Boost' && counter.get('Status') < 2) return 'Life Orb';\n\t\tif (ability === 'Poison Heal' || ability === 'Toxic Boost') return 'Toxic Orb';\n\n\t\tif (moves.has('rest') && !moves.has('sleeptalk') && ability !== 'Natural Cure' && ability !== 'Shed Skin') {\n\t\t\treturn (moves.has('raindance') && ability === 'Hydration') ? 'Damp Rock' : 'Chesto Berry';\n\t\t}\n\t\tif (moves.has('raindance') && ability === 'Swift Swim' && counter.get('Status') < 2) return 'Life Orb';\n\t\tif (moves.has('sunnyday')) return (ability === 'Chlorophyll' && counter.get('Status') < 2) ? 'Life Orb' : 'Heat Rock';\n\t\tif (moves.has('lightscreen') && moves.has('reflect')) return 'Light Clay';\n\t\tif ((ability === 'Guts' || ability === 'Quick Feet') && moves.has('facade')) return 'Toxic Orb';\n\t\tif (ability === 'Unburden') return 'Sitrus Berry';\n\t\tif (species.baseStats.hp + species.baseStats.def + species.baseStats.spd <= 150) {\n\t\t\treturn isLead ? 'Focus Sash' : 'Life Orb';\n\t\t}\n\t\tif (moves.has('endeavor')) return 'Focus Sash';\n\t}\n\n\tgetMediumPriorityItem(\n\t\tability: string,\n\t\tmoves: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tspecies: Species,\n\t\tisDoubles: boolean,\n\t\tisLead: boolean\n\t): string | undefined {\n\t\tif (\n\t\t\tability === 'Slow Start' ||\n\t\t\t['curse', 'leechseed', 'protect', 'roar', 'sleeptalk', 'whirlwind'].some(m => moves.has(m)) ||\n\t\t\t(ability === 'Serene Grace' && ['bodyslam', 'headbutt', 'ironhead'].some(m => moves.has(m)))\n\t\t) {\n\t\t\treturn 'Leftovers';\n\t\t}\n\n\t\tif (counter.get('Physical') >= 4 && !moves.has('fakeout') && !moves.has('rapidspin') && !moves.has('suckerpunch')) {\n\t\t\treturn (\n\t\t\t\tspecies.baseStats.spe >= 60 && species.baseStats.spe <= 108 &&\n\t\t\t\t!counter.get('priority') && !moves.has('bodyslam') && this.randomChance(2, 3)\n\t\t\t) ? 'Choice Scarf' : 'Choice Band';\n\t\t}\n\n\t\tif (\n\t\t\t(counter.get('Special') >= 4 || (\n\t\t\t\tcounter.get('Special') >= 3 &&\n\t\t\t\t['batonpass', 'uturn', 'waterspout', 'selfdestruct'].some(m => moves.has(m))\n\t\t\t)) &&\n\t\t\t!moves.has('chargebeam')\n\t\t) {\n\t\t\treturn (\n\t\t\t\tspecies.baseStats.spe >= 60 && species.baseStats.spe <= 108 &&\n\t\t\t\tability !== 'Speed Boost' && !counter.get('priority') && this.randomChance(2, 3)\n\t\t\t) ? 'Choice Scarf' : 'Choice Specs';\n\t\t}\n\n\t\tif (moves.has('outrage') && counter.setupType) return 'Lum Berry';\n\t\tif (moves.has('substitute')) {\n\t\t\treturn (counter.damagingMoves.size < 2 ||\n\t\t\t\t!counter.get('drain') &&\n\t\t\t\t(counter.damagingMoves.size < 3 || species.baseStats.hp >= 60 || species.baseStats.def + species.baseStats.spd >= 180)\n\t\t\t) ? 'Leftovers' : 'Life Orb';\n\t\t}\n\t\tif (ability === 'Guts') return 'Toxic Orb';\n\t\tif (\n\t\t\tisLead &&\n\t\t\t!counter.get('recoil') &&\n\t\t\t!Array.from(moves).some(id => !!recoveryMoves.includes(id)) &&\n\t\t\tspecies.baseStats.hp + species.baseStats.def + species.baseStats.spd < 225\n\t\t) {\n\t\t\treturn 'Focus Sash';\n\t\t}\n\t\tif (counter.damagingMoves.size >= 4) {\n\t\t\treturn (\n\t\t\t\tcounter.get('Normal') || counter.get('Dragon') > 1 || moves.has('chargebeam') || moves.has('suckerpunch')\n\t\t\t) ? 'Life Orb' : 'Expert Belt';\n\t\t}\n\t\tif (counter.damagingMoves.size >= 3 && !moves.has('superfang') && !moves.has('metalburst')) {\n\t\t\tconst totalBulk = species.baseStats.hp + species.baseStats.def + species.baseStats.spd;\n\t\t\treturn (\n\t\t\t\tcounter.get('speedsetup') || counter.get('priority') ||\n\t\t\t\tmoves.has('dragondance') || moves.has('trickroom') ||\n\t\t\t\ttotalBulk < 235 ||\n\t\t\t\t(species.baseStats.spe >= 70 && (totalBulk < 260 || (!!counter.get('recovery') && totalBulk < 285)))\n\t\t\t) ? 'Life Orb' : 'Leftovers';\n\t\t}\n\t}\n\n\tgetLowPriorityItem(\n\t\tability: string,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t) {\n\t\tif (types.has('Poison')) return 'Black Sludge';\n\t\tif (this.dex.getEffectiveness('Rock', species) >= 1 || moves.has('roar')) return 'Leftovers';\n\t\tif (counter.get('Status') <= 1 && ['metalburst', 'rapidspin', 'superfang'].every(m => !moves.has(m))) return 'Life Orb';\n\t\treturn 'Leftovers';\n\t}\n\n\trandomSet(\n\t\tspecies: string | Species,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails = {},\n\t\tisLead = false\n\t): RandomTeamsTypes.RandomSet {\n\t\tspecies = this.dex.species.get(species);\n\t\tlet forme = species.name;\n\n\t\tif (typeof species.battleOnly === 'string') forme = species.battleOnly;\n\n\t\tif (species.cosmeticFormes) {\n\t\t\tforme = this.sample([species.name].concat(species.cosmeticFormes));\n\t\t}\n\n\t\tconst movePool = (species.randomBattleMoves || Object.keys(this.dex.species.getLearnset(species.id)!)).slice();\n\t\tconst rejectedPool: string[] = [];\n\t\tconst moves = new Set<string>();\n\t\tlet ability = '';\n\t\tlet item: string | undefined;\n\t\tconst evs = {hp: 85, atk: 85, def: 85, spa: 85, spd: 85, spe: 85};\n\t\tconst ivs: SparseStatsTable = {hp: 31, atk: 31, def: 31, spa: 31, spd: 31, spe: 31};\n\n\t\tconst types = new Set(species.types);\n\n\t\tconst abilities = new Set(Object.values(species.abilities));\n\n\t\tlet availableHP = 0;\n\t\tfor (const setMoveid of movePool) {\n\t\t\tif (setMoveid.startsWith('hiddenpower')) availableHP++;\n\t\t}\n\n\t\tlet counter: MoveCounter;\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\twhile (moves.size < this.maxMoveCount && movePool.length) {\n\t\t\t\tconst moveid = this.sampleNoReplace(movePool);\n\t\t\t\tif (moveid.startsWith('hiddenpower')) {\n\t\t\t\t\tavailableHP--;\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\twhile (moves.size < this.maxMoveCount && rejectedPool.length) {\n\t\t\t\tconst moveid = this.sampleNoReplace(rejectedPool);\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\tif (types.has('Dark') && moves.has('suckerpunch') && species.types.length === 1) {\n\t\t\t\tcounter.add('stab');\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\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\n\t\t\t\t);\n\n\t\t\t\t// Increased/decreased priority moves are unneeded with moves that boost only speed\n\t\t\t\tif (move.priority !== 0 && !!counter.get('speedsetup')) cull = true;\n\n\t\t\t\t// This move doesn't satisfy our setup requirements:\n\t\t\t\tif (\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\tif (\n\t\t\t\t\t\t!SetupException.includes(moveid) &&\n\t\t\t\t\t\t(!types.has(move.type) || counter.get('stab') > 1 || counter.get(move.category) < 2)\n\t\t\t\t\t) {\n\t\t\t\t\t\tcull = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tcounter.setupType && !isSetup && move.category !== counter.setupType &&\n\t\t\t\t\tcounter.get(counter.setupType) < 2 && !moves.has('batonpass')\n\t\t\t\t) {\n\t\t\t\t\t// Mono-attacking with setup and RestTalk or recovery + status healing is allowed\n\t\t\t\t\tif (\n\t\t\t\t\t\tmoveid !== 'rest' && moveid !== 'sleeptalk' &&\n\t\t\t\t\t\t!(recoveryMoves.includes(moveid) && (moves.has('healbell') || moves.has('refresh'))) &&\n\t\t\t\t\t\t!((moveid === 'healbell' || moveid === 'refresh') && Array.from(moves).some(id => recoveryMoves.includes(id))) && (\n\t\t\t\t\t\t\t// Reject Status moves only if there is nothing else to reject\n\t\t\t\t\t\t\tmove.category !== 'Status' || (\n\t\t\t\t\t\t\t\tcounter.get(counter.setupType) + counter.get('Status') > 3 &&\n\t\t\t\t\t\t\t\tcounter.get('physicalsetup') + counter.get('specialsetup') < 2\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\t\tcull = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tmoveid === 'hiddenpower' &&\n\t\t\t\t\tcounter.setupType === 'Special' &&\n\t\t\t\t\tspecies.types.length > 1 &&\n\t\t\t\t\tcounter.get('Special') <= 2 &&\n\t\t\t\t\t!types.has(move.type) &&\n\t\t\t\t\t!counter.get('Physical') &&\n\t\t\t\t\tcounter.get('specialpool') &&\n\t\t\t\t\t(!(types.has('Ghost') && move.type === 'Fighting' || types.has('Electric') && move.type === 'Ice'))\n\t\t\t\t) {\n\t\t\t\t\t// Hidden Power isn't good enough\n\t\t\t\t\tcull = true;\n\t\t\t\t}\n\n\t\t\t\t// Reject defensive status moves if a reliable recovery move is available but not selected.\n\t\t\t\t// Toxic is only defensive if used with another status move other than Protect (Toxic + 3 attacks and Toxic + Protect are ok).\n\t\t\t\tif (\n\t\t\t\t\t!Array.from(moves).some(id => recoveryMoves.includes(id)) &&\n\t\t\t\t\tmovePool.some(id => recoveryMoves.includes(id)) && (\n\t\t\t\t\t\tdefensiveStatusMoves.includes(moveid) ||\n\t\t\t\t\t\t(moveid === 'toxic' && ((counter.get('Status') > 1 && !moves.has('protect')) || counter.get('Status') > 2))\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tcull = true;\n\t\t\t\t}\n\n\t\t\t\tconst runEnforcementChecker = (checkerName: string) => {\n\t\t\t\t\tif (!this.moveEnforcementCheckers[checkerName]) return false;\n\t\t\t\t\treturn this.moveEnforcementCheckers[checkerName](\n\t\t\t\t\t\tmovePool, moves, abilities, types, counter, species as Species, teamDetails\n\t\t\t\t\t);\n\t\t\t\t};\n\n\t\t\t\tconst moveIsRejectable = (\n\t\t\t\t\t!move.weather &&\n\t\t\t\t\t!move.damage &&\n\t\t\t\t\t(move.category !== 'Status' || !move.flags.heal) &&\n\t\t\t\t\t(move.category === 'Status' || !types.has(move.type) || (move.basePower && move.basePower < 40 && !move.multihit)) &&\n\t\t\t\t\t// These moves cannot be rejected in favor of a forced move\n\t\t\t\t\t!['judgment', 'sleeptalk'].includes(moveid) &&\n\t\t\t\t\t// Setup-supported moves should only be rejected under specific circumstances\n\t\t\t\t\t(counter.get('physicalsetup') + counter.get('specialsetup') < 2 && (\n\t\t\t\t\t\t!counter.setupType || counter.setupType === 'Mixed' ||\n\t\t\t\t\t\t(move.category !== counter.setupType && move.category !== 'Status') ||\n\t\t\t\t\t\tcounter.get(counter.setupType) + counter.get('Status') > 3\n\t\t\t\t\t))\n\t\t\t\t);\n\n\t\t\t\tif (!cull && !isSetup && moveIsRejectable) {\n\t\t\t\t\t// There may be more important moves that this Pokemon needs\n\t\t\t\t\tconst canRollForcedMoves = (\n\t\t\t\t\t\t// These moves should always be rolled\n\t\t\t\t\t\tmovePool.includes('spore') || (!Array.from(moves).some(id => recoveryMoves.includes(id)) && (\n\t\t\t\t\t\t\tmovePool.includes('softboiled') ||\n\t\t\t\t\t\t\t(species.baseSpecies === 'Arceus' && movePool.includes('recover'))\n\t\t\t\t\t\t))\n\t\t\t\t\t);\n\t\t\t\t\t// Pokemon should usually have at least one STAB move\n\t\t\t\t\tconst requiresStab = (\n\t\t\t\t\t\t!counter.get('stab') && !counter.get('damage') && (\n\t\t\t\t\t\t\tspecies.types.length > 1 ||\n\t\t\t\t\t\t\t(species.types[0] !== 'Normal' && species.types[0] !== 'Psychic') ||\n\t\t\t\t\t\t\t!moves.has('icebeam') ||\n\t\t\t\t\t\t\tspecies.baseStats.spa >= species.baseStats.spd\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t\tif (\n\t\t\t\t\t\tcanRollForcedMoves ||\n\t\t\t\t\t\trequiresStab ||\n\t\t\t\t\t\t(species.requiredMove && movePool.includes(toID(species.requiredMove))) ||\n\t\t\t\t\t\t(counter.get('defensesetup') && !counter.get('recovery') && !moves.has('rest'))\n\t\t\t\t\t) {\n\t\t\t\t\t\tcull = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Pokemon should have moves that benefit their typing or ability\n\t\t\t\t\t\tfor (const type of types) {\n\t\t\t\t\t\t\tif (runEnforcementChecker(type)) cull = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfor (const abil of abilities) {\n\t\t\t\t\t\t\tif (runEnforcementChecker(abil)) cull = true;\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 (moveid === '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 && (\n\t\t\t\t\tmovePool.length - availableHP || availableHP && (moveid.startsWith('hiddenpower') || !hasHiddenPower)\n\t\t\t\t)) {\n\t\t\t\t\tif (move.category !== 'Status' && (!moveid.startsWith('hiddenpower') || !availableHP)) rejectedPool.push(moveid);\n\t\t\t\t\tmoves.delete(moveid);\n\t\t\t\t\tif (moveid.startsWith('hiddenpower')) hasHiddenPower = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (cull && rejectedPool.length) {\n\t\t\t\t\tmoves.delete(moveid);\n\t\t\t\t\tif (moveid.startsWith('hiddenpower')) hasHiddenPower = false;\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\tif (hasHiddenPower) {\n\t\t\tlet hpType;\n\t\t\tfor (const move of moves) {\n\t\t\t\tif (move.startsWith('hiddenpower')) {\n\t\t\t\t\thpType = move.substr(11);\n\t\t\t\t\tbreak;\n\t\t\t\t}\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\tconst abilityData = Array.from(abilities).map(a => this.dex.abilities.get(a));\n\t\tUtils.sortBy(abilityData, abil => -abil.rating);\n\n\t\tlet ability0 = abilityData[0];\n\t\tlet ability1 = abilityData[1];\n\t\tif (abilityData[1]) {\n\t\t\tif (ability0.rating <= ability1.rating && this.randomChance(1, 2)) {\n\t\t\t\t[ability0, ability1] = [ability1, ability0];\n\t\t\t} else if (ability0.rating - 0.6 <= ability1.rating && this.randomChance(2, 3)) {\n\t\t\t\t[ability0, ability1] = [ability1, ability0];\n\t\t\t}\n\t\t\tability = ability0.name;\n\n\t\t\twhile (this.shouldCullAbility(ability, types, moves, abilities, counter, movePool, teamDetails, species)) {\n\t\t\t\tif (ability === ability0.name && ability1.rating >= 1) {\n\t\t\t\t\tability = ability1.name;\n\t\t\t\t} else {\n\t\t\t\t\t// Default to the highest rated ability if all are rejected\n\t\t\t\t\tability = abilityData[0].name;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (abilities.has('Hydration') && moves.has('raindance') && moves.has('rest')) {\n\t\t\t\tability = 'Hydration';\n\t\t\t} else if (abilities.has('Swift Swim') && moves.has('raindance')) {\n\t\t\t\tability = 'Swift Swim';\n\t\t\t} else if (abilities.has('Technician') && moves.has('machpunch') && types.has('Fighting') && counter.get('stab') < 2) {\n\t\t\t\tability = 'Technician';\n\t\t\t}\n\t\t} else {\n\t\t\tability = ability0.name;\n\t\t}\n\n\t\titem = this.getHighPriorityItem(ability, types, moves, counter, teamDetails, species, isLead);\n\t\tif (item === undefined) item = this.getMediumPriorityItem(ability, moves, counter, species, false, isLead);\n\t\tif (item === undefined) {\n\t\t\titem = this.getLowPriorityItem(ability, types, moves, abilities, counter, teamDetails, species);\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 levelScale: {[k: string]: number} = {\n\t\t\tAG: 74,\n\t\t\tUber: 76,\n\t\t\tOU: 80,\n\t\t\t'(OU)': 82,\n\t\t\tUUBL: 82,\n\t\t\tUU: 84,\n\t\t\tNUBL: 86,\n\t\t\tNU: 88,\n\t\t};\n\t\tconst customScale: {[k: string]: number} = {\n\t\t\tDelibird: 100, Ditto: 100, 'Farfetch\\u2019d': 100, Unown: 100, Castform: 100,\n\t\t};\n\t\tconst level = this.adjustLevel || customScale[species.name] || levelScale[species.tier] || (species.nfe ? 90 : 80);\n\n\t\t// Prepare optimal HP\n\t\tlet hp = Math.floor(\n\t\t\tMath.floor(\n\t\t\t\t2 * species.baseStats.hp + (ivs.hp || 31) + Math.floor(evs.hp / 4) + 100\n\t\t\t) * level / 100 + 10\n\t\t);\n\t\tif (moves.has('substitute') && item === 'Sitrus Berry') {\n\t\t\t// Two Substitutes should activate Sitrus Berry\n\t\t\twhile (hp % 4 > 0) {\n\t\t\t\tevs.hp -= 4;\n\t\t\t\thp = Math.floor(\n\t\t\t\t\tMath.floor(\n\t\t\t\t\t\t2 * species.baseStats.hp + (ivs.hp || 31) + Math.floor(evs.hp / 4) + 100\n\t\t\t\t\t) * level / 100 + 10\n\t\t\t\t);\n\t\t\t}\n\t\t} else if (moves.has('bellydrum') && item === 'Sitrus Berry') {\n\t\t\t// Belly Drum should activate Sitrus Berry\n\t\t\tif (hp % 2 > 0) evs.hp -= 4;\n\t\t} else {\n\t\t\t// Maximize number of Stealth Rock switch-ins\n\t\t\tconst srWeakness = this.dex.getEffectiveness('Rock', species);\n\t\t\tif (srWeakness > 0 && hp % (4 / srWeakness) === 0) evs.hp -= 4;\n\t\t}\n\n\t\t// Minimize confusion damage\n\t\tif (!counter.get('Physical') && !moves.has('transform')) {\n\t\t\tevs.atk = 0;\n\t\t\tivs.atk = hasHiddenPower ? (ivs.atk || 31) - 28 : 0;\n\t\t}\n\n\t\tif (['gyroball', 'metalburst', 'trickroom'].some(m => moves.has(m))) {\n\t\t\tevs.spe = 0;\n\t\t\tivs.spe = hasHiddenPower ? (ivs.spe || 31) - 28 : 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\tmoves: Array.from(moves),\n\t\t\tability,\n\t\t\tevs,\n\t\t\tivs,\n\t\t\titem,\n\t\t\tlevel,\n\t\t};\n\t}\n}\n\nexport default RandomGen4Teams;\n","import {MoveCounter} from './gen8';\nimport {RandomGen4Teams} from './gen4';\nimport {Utils} from './utils';\nimport {\n\tFormat,\n\tModdedDex,\n\tMove,\n\tPRNG,\n\tPRNGSeed,\n\tRandomTeamsTypes,\n\tSpecies,\n\tStatID,\n} from '@pkmn/sim';\n\nexport class RandomGen3Teams extends RandomGen4Teams {\n\tbattleHasDitto: boolean;\n\tbattleHasWobbuffet: boolean;\n\n\tconstructor(dex: ModdedDex, format: Format, prng: PRNG | PRNGSeed | null) {\n\t\tsuper(dex, format, prng);\n\t\tthis.battleHasDitto = false;\n\t\tthis.battleHasWobbuffet = false;\n\t\tthis.moveEnforcementCheckers = {\n\t\t\tBug: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\tmovePool.includes('megahorn') || (!species.types[1] && movePool.includes('hiddenpowerbug'))\n\t\t\t),\n\t\t\tElectric: (movePool, moves, abilities, types, counter) => !counter.get('Electric'),\n\t\t\tFighting: (movePool, moves, abilities, types, counter) => !counter.get('Fighting'),\n\t\t\tFire: (movePool, moves, abilities, types, counter) => !counter.get('Fire'),\n\t\t\tGround: (movePool, moves, abilities, types, counter) => !counter.get('Ground'),\n\t\t\tNormal: (movePool, moves, abilities, types, counter, species) => {\n\t\t\t\tif (species.id === 'blissey' && movePool.includes('softboiled')) return true;\n\t\t\t\treturn !counter.get('Normal') && counter.setupType === 'Physical';\n\t\t\t},\n\t\t\tPsychic: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\ttypes.has('Psychic') &&\n\t\t\t\t(movePool.includes('psychic') || movePool.includes('psychoboost')) &&\n\t\t\t\tspecies.baseStats.spa >= 100\n\t\t\t),\n\t\t\tRock: (movePool, moves, abilities, types, counter, species) => !counter.get('Rock') && species.baseStats.atk >= 100,\n\t\t\tWater: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\t!counter.get('Water') && counter.setupType !== 'Physical' && species.baseStats.spa >= 60\n\t\t\t),\n\t\t\t// If the Pokémon has this move, the other move will be forced\n\t\t\tprotect: movePool => movePool.includes('wish'),\n\t\t\tsunnyday: movePool => movePool.includes('solarbeam'),\n\t\t\tsleeptalk: movePool => movePool.includes('rest'),\n\t\t};\n\t}\n\n\tshouldCullMove(\n\t\tmove: Move,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tmovePool: string[],\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t): {cull: boolean, isSetup?: boolean} {\n\t\tconst restTalk = moves.has('rest') && moves.has('sleeptalk');\n\n\t\tswitch (move.id) {\n\t\t// Set up once and only if we have the moves for it\n\t\tcase 'bulkup': case 'curse': case 'dragondance': case 'swordsdance':\n\t\t\treturn {\n\t\t\t\tcull: (\n\t\t\t\t\t(counter.setupType !== 'Physical' || counter.get('physicalsetup') > 1) ||\n\t\t\t\t\t(counter.get('Physical') + counter.get('physicalpool') < 2 && !moves.has('batonpass') && !restTalk)\n\t\t\t\t),\n\t\t\t\tisSetup: true,\n\t\t\t};\n\t\tcase 'calmmind':\n\t\t\treturn {\n\t\t\t\tcull: (\n\t\t\t\t\tcounter.setupType !== 'Special' ||\n\t\t\t\t\t(counter.get('Special') + counter.get('specialpool') < 2 && !moves.has('batonpass') && !restTalk)\n\t\t\t\t),\n\t\t\t\tisSetup: true,\n\t\t\t};\n\t\tcase 'agility':\n\t\t\treturn {\n\t\t\t\tcull: (counter.damagingMoves.size < 2 && !moves.has('batonpass')) || moves.has('substitute') || restTalk,\n\t\t\t\tisSetup: !counter.setupType,\n\t\t\t};\n\n\t\t// Not very useful without their supporting moves\n\t\tcase 'amnesia': case 'sleeptalk':\n\t\t\tif (moves.has('roar')) return {cull: true};\n\t\t\tif (!moves.has('rest')) return {cull: true};\n\t\t\tif (movePool.length > 1) {\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 'barrier':\n\t\t\treturn {cull: !moves.has('calmmind') && !moves.has('batonpass') && !moves.has('mirrorcoat')};\n\t\tcase 'batonpass':\n\t\t\treturn {cull: (\n\t\t\t\t(!counter.setupType && !counter.get('speedsetup')) &&\n\t\t\t\t['meanlook', 'spiderweb', 'substitute', 'wish'].every(m => !moves.has(m))\n\t\t\t)};\n\t\tcase 'endeavor': case 'flail': case 'reversal':\n\t\t\treturn {cull: restTalk || (!moves.has('endure') && !moves.has('substitute'))};\n\t\tcase 'endure':\n\t\t\treturn {cull: movePool.includes('destinybond')};\n\t\tcase 'extremespeed': case 'raindance': case 'sunnyday':\n\t\t\treturn {cull: counter.damagingMoves.size < 2 || moves.has('rest')};\n\t\tcase 'focuspunch':\n\t\t\treturn {cull: (\n\t\t\t\t(counter.damagingMoves.size < 2 || moves.has('rest') || counter.setupType && !moves.has('spore')) ||\n\t\t\t\t(!moves.has('substitute') && (counter.get('Physical') < 4 || moves.has('fakeout'))) ||\n\t\t\t\t// Breloom likes to have coverage\n\t\t\t\t(species.id === 'breloom' && (moves.has('machpunch') || moves.has('skyuppercut')))\n\t\t\t)};\n\t\tcase 'moonlight':\n\t\t\treturn {cull: moves.has('wish') || moves.has('protect')};\n\t\tcase 'perishsong':\n\t\t\treturn {cull: !moves.has('meanlook') && !moves.has('spiderweb')};\n\t\tcase 'protect':\n\t\t\treturn {cull: !abilities.has('Speed Boost') && ['perishsong', 'toxic', 'wish'].every(m => !moves.has(m))};\n\t\tcase 'refresh':\n\t\t\treturn {cull: !counter.setupType};\n\t\tcase 'rest':\n\t\t\treturn {cull: (\n\t\t\t\tmovePool.includes('sleeptalk') ||\n\t\t\t\t(!moves.has('sleeptalk') && (!!counter.get('recovery') || movePool.includes('curse')))\n\t\t\t)};\n\t\tcase 'solarbeam':\n\t\t\tif (movePool.length > 1) {\n\t\t\t\tconst sunnyday = movePool.indexOf('sunnyday');\n\t\t\t\tif (sunnyday >= 0) this.fastPop(movePool, sunnyday);\n\t\t\t}\n\t\t\treturn {cull: !moves.has('sunnyday')};\n\n\t\t// Bad after setup\n\t\tcase 'aromatherapy': case 'healbell':\n\t\t\treturn {cull: moves.has('rest') || !!teamDetails.statusCure};\n\t\tcase 'confuseray':\n\t\t\treturn {cull: !!counter.setupType || restTalk};\n\t\tcase 'counter': case 'mirrorcoat':\n\t\t\treturn {cull: !!counter.setupType || ['rest', 'substitute', 'toxic'].some(m => moves.has(m))};\n\t\tcase 'destinybond':\n\t\t\treturn {cull: !!counter.setupType || moves.has('explosion') || moves.has('selfdestruct')};\n\t\tcase 'doubleedge': case 'facade': case 'fakeout': case 'waterspout':\n\t\t\treturn {cull: (\n\t\t\t\t(!types.has(move.type) && counter.get('Status') >= 1) ||\n\t\t\t\t(move.id === 'doubleedge' && moves.has('return'))\n\t\t\t)};\n\t\tcase 'encore': case 'painsplit': case 'recover': case 'yawn':\n\t\t\treturn {cull: restTalk};\n\t\tcase 'explosion': case 'machpunch': case 'selfdestruct':\n\t\t\t// Snorlax doesn't want to roll selfdestruct as its only STAB move\n\t\t\tconst snorlaxCase = species.id === 'snorlax' && !moves.has('return') && !moves.has('bodyslam');\n\t\t\treturn {cull: snorlaxCase || moves.has('rest') || moves.has('substitute') || !!counter.get('recovery')};\n\t\tcase 'haze':\n\t\t\treturn {cull: !!counter.setupType || moves.has('raindance') || restTalk};\n\t\tcase 'icywind': case 'pursuit': case 'superpower': case 'transform':\n\t\t\treturn {cull: !!counter.setupType || moves.has('rest')};\n\t\tcase 'leechseed':\n\t\t\treturn {cull: !!counter.setupType || moves.has('explosion')};\n\t\tcase 'stunspore':\n\t\t\treturn {cull: moves.has('sunnyday') || moves.has('toxic')};\n\t\tcase 'lightscreen':\n\t\t\treturn {cull: !!counter.setupType || !!counter.get('speedsetup')};\n\t\tcase 'meanlook': case 'spiderweb':\n\t\t\treturn {cull: !!counter.get('speedsetup') || (!moves.has('batonpass') && !moves.has('perishsong'))};\n\t\tcase 'morningsun':\n\t\t\treturn {cull: counter.get('speedsetup') >= 1};\n\t\tcase 'quickattack':\n\t\t\treturn {cull: (\n\t\t\t\t!!counter.get('speedsetup') ||\n\t\t\t\tmoves.has('substitute') ||\n\t\t\t\t(!types.has('Normal') && !!counter.get('Status'))\n\t\t\t)};\n\t\tcase 'rapidspin':\n\t\t\treturn {cull: !!counter.setupType || moves.has('rest') || !!teamDetails.rapidSpin};\n\t\tcase 'reflect':\n\t\t\treturn {cull: !!counter.setupType || !!counter.get('speedsetup')};\n\t\tcase 'roar':\n\t\t\treturn {cull: moves.has('sleeptalk') || moves.has('rest')};\n\t\tcase 'seismictoss':\n\t\t\treturn {cull: !!counter.setupType || moves.has('thunderbolt')};\n\t\tcase 'spikes':\n\t\t\treturn {cull: !!counter.setupType || moves.has('substitute') || restTalk || !!teamDetails.spikes};\n\t\tcase 'substitute':\n\t\t\tconst restOrDD = moves.has('rest') || (moves.has('dragondance') && !moves.has('bellydrum'));\n\t\t\t// This cull condition otherwise causes mono-solarbeam Entei\n\t\t\treturn {cull: restOrDD || (species.id !== 'entei' && !moves.has('batonpass') && movePool.includes('calmmind'))};\n\t\tcase 'thunderwave':\n\t\t\treturn {cull: !!counter.setupType || moves.has('bodyslam') || moves.has('substitute') || restTalk};\n\t\tcase 'toxic':\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['endure', 'focuspunch', 'raindance', 'yawn', 'hypnosis'].some(m => moves.has(m))\n\t\t\t)};\n\t\tcase 'trick':\n\t\t\treturn {cull: counter.get('Status') > 1};\n\t\tcase 'willowisp':\n\t\t\treturn {cull: !!counter.setupType || moves.has('hypnosis') || moves.has('toxic')};\n\n\t\t// Bit redundant to have both\n\t\tcase 'bodyslam':\n\t\t\treturn {cull: moves.has('return') && !!counter.get('Status')};\n\t\tcase 'headbutt':\n\t\t\treturn {cull: !moves.has('bodyslam') && !moves.has('thunderwave')};\n\t\tcase 'return':\n\t\t\treturn {cull: (\n\t\t\t\tmoves.has('endure') ||\n\t\t\t\t(moves.has('substitute') && moves.has('flail')) ||\n\t\t\t\t(moves.has('bodyslam') && !counter.get('Status'))\n\t\t\t)};\n\t\tcase 'fireblast':\n\t\t\treturn {cull: moves.has('flamethrower') && !!counter.get('Status')};\n\t\tcase 'flamethrower':\n\t\t\treturn {cull: moves.has('fireblast') && !counter.get('Status')};\n\t\tcase 'overheat':\n\t\t\treturn {cull: moves.has('flamethrower') || moves.has('substitute')};\n\t\tcase 'hydropump':\n\t\t\treturn {cull: moves.has('surf') && !!counter.get('Status')};\n\t\tcase 'surf':\n\t\t\treturn {cull: moves.has('hydropump') && !counter.get('Status')};\n\t\tcase 'gigadrain':\n\t\t\treturn {cull: moves.has('morningsun') || moves.has('toxic')};\n\t\tcase 'hiddenpower':\n\t\t\tconst stabCondition = types.has(move.type) && counter.get(move.type) > 1 && (\n\t\t\t\t(moves.has('substitute') && !counter.setupType && !moves.has('toxic')) ||\n\t\t\t\t// This otherwise causes STABless meganium\n\t\t\t\t(species.id !== 'meganium' && moves.has('toxic') && !moves.has('substitute')) ||\n\t\t\t\trestTalk\n\t\t\t);\n\t\t\treturn {cull: stabCondition || (move.type === 'Grass' && moves.has('sunnyday') && moves.has('solarbeam'))};\n\t\tcase 'brickbreak': case 'crosschop': case 'skyuppercut':\n\t\t\treturn {cull: moves.has('substitute') && (moves.has('focuspunch') || movePool.includes('focuspunch'))};\n\t\tcase 'earthquake':\n\t\t\treturn {cull: moves.has('bonemerang')};\n\t\t}\n\n\t\treturn {cull: false};\n\t}\n\n\n\tgetItem(\n\t\tability: string,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tspecies: Species\n\t) {\n\t\t// First, the high-priority items\n\t\tif (species.name === 'Ditto') return this.sample(['Metal Powder', 'Quick Claw']);\n\t\tif (species.name === 'Farfetch\\u2019d') return 'Stick';\n\t\tif (species.name === 'Marowak') return 'Thick Club';\n\t\tif (species.name === 'Pikachu') return 'Light Ball';\n\t\tif (species.name === 'Shedinja') return 'Lum Berry';\n\t\tif (species.name === 'Unown') return 'Twisted Spoon';\n\n\t\tif (moves.has('trick')) return 'Choice Band';\n\t\tif (moves.has('rest') && !moves.has('sleeptalk') && !['Early Bird', 'Natural Cure', 'Shed Skin'].includes(ability)) {\n\t\t\treturn 'Chesto Berry';\n\t\t}\n\n\t\t// Medium priority items\n\t\tif (moves.has('dragondance') && ability !== 'Natural Cure') return 'Lum Berry';\n\t\tif ((moves.has('bellydrum') && counter.get('Physical') - counter.get('priority') > 1) || (\n\t\t\t((moves.has('swordsdance') && counter.get('Status') < 2) || (moves.has('bulkup') && moves.has('substitute'))) &&\n\t\t\t!counter.get('priority') &&\n\t\t\tspecies.baseStats.spe >= 60 && species.baseStats.spe <= 95\n\t\t)) {\n\t\t\treturn 'Salac Berry';\n\t\t}\n\t\tif (moves.has('endure') || (\n\t\t\tmoves.has('substitute') &&\n\t\t\t['bellydrum', 'endeavor', 'flail', 'reversal'].some(m => moves.has(m))\n\t\t)) {\n\t\t\treturn (\n\t\t\t\tspecies.baseStats.spe <= 100 && ability !== 'Speed Boost' && !counter.get('speedsetup') && !moves.has('focuspunch')\n\t\t\t) ? 'Salac Berry' : 'Liechi Berry';\n\t\t}\n\t\tif (moves.has('substitute') && counter.get('Physical') >= 3 && species.baseStats.spe >= 120) return 'Liechi Berry';\n\t\tif ((moves.has('substitute') || moves.has('raindance')) && counter.get('Special') >= 3) return 'Petaya Berry';\n\t\tif (counter.get('Physical') >= 4 && !moves.has('fakeout')) return 'Choice Band';\n\t\tif (counter.get('Physical') >= 3 && !moves.has('rapidspin') && (\n\t\t\t['firepunch', 'icebeam', 'overheat'].some(m => moves.has(m)) ||\n\t\t\tArray.from(moves).some(m => {\n\t\t\t\tconst moveData = this.dex.moves.get(m);\n\t\t\t\treturn moveData.category === 'Special' && types.has(moveData.type);\n\t\t\t})\n\t\t)) {\n\t\t\treturn 'Choice Band';\n\t\t}\n\n\t\t// Default to Leftovers\n\t\treturn 'Leftovers';\n\t}\n\n\tshouldCullAbility(\n\t\tability: string,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tmovePool: string[],\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t) {\n\t\tswitch (ability) {\n\t\tcase 'Chlorophyll':\n\t\t\treturn !moves.has('sunnyday') && !teamDetails['sun'];\n\t\tcase 'Compound Eyes':\n\t\t\treturn !counter.get('inaccurate');\n\t\tcase 'Hustle':\n\t\t\treturn counter.get('Physical') < 2;\n\t\tcase 'Lightning Rod':\n\t\t\treturn species.types.includes('Ground');\n\t\tcase 'Overgrow':\n\t\t\treturn !counter.get('Grass');\n\t\tcase 'Rock Head':\n\t\t\treturn !counter.get('recoil');\n\t\tcase 'Sand Veil':\n\t\t\treturn !teamDetails['sand'];\n\t\tcase 'Serene Grace':\n\t\t\treturn species.id === 'blissey';\n\t\tcase 'Sturdy':\n\t\t\t// Sturdy is bad.\n\t\t\treturn true;\n\t\tcase 'Swift Swim':\n\t\t\treturn !moves.has('raindance') && !teamDetails['rain'];\n\t\tcase 'Swarm':\n\t\t\treturn !counter.get('Bug');\n\t\tcase 'Torrent':\n\t\t\treturn !counter.get('Water');\n\t\tcase 'Water Absorb':\n\t\t\treturn abilities.has('Swift Swim');\n\t\t}\n\n\t\treturn false;\n\t}\n\n\trandomSet(species: string | Species, teamDetails: RandomTeamsTypes.TeamDetails = {}): RandomTeamsTypes.RandomSet {\n\t\tspecies = this.dex.species.get(species);\n\t\tlet forme = species.name;\n\n\t\tif (typeof species.battleOnly === 'string') forme = species.battleOnly;\n\n\t\tconst movePool = (species.randomBattleMoves || Object.keys(this.dex.species.getLearnset(species.id)!)).slice();\n\t\tconst rejectedPool = [];\n\t\tconst moves = new Set<string>();\n\t\tlet ability = '';\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\t\tlet availableHP = 0;\n\t\tfor (const setMoveid of movePool) {\n\t\t\tif (setMoveid.startsWith('hiddenpower')) availableHP++;\n\t\t}\n\n\t\tconst types = new Set(species.types);\n\n\t\tconst abilities = new Set(Object.values(species.abilities));\n\n\t\tlet counter: MoveCounter;\n\t\t// We use a special variable to track Hidden Power\n\t\t// so that we can check for all Hidden Powers at once\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\twhile (moves.size < this.maxMoveCount && movePool.length) {\n\t\t\t\tconst moveid = this.sampleNoReplace(movePool);\n\t\t\t\tif (moveid.startsWith('hiddenpower')) {\n\t\t\t\t\tavailableHP--;\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\twhile (moves.size < this.maxMoveCount && rejectedPool.length) {\n\t\t\t\tconst moveid = this.sampleNoReplace(rejectedPool);\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\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\n\t\t\t\tlet {cull, isSetup} = this.shouldCullMove(move, types, moves, abilities, counter, movePool, teamDetails, species);\n\n\t\t\t\t// This move doesn't satisfy our setup requirements:\n\t\t\t\tif (\n\t\t\t\t\t(counter.setupType === 'Physical' && move.category === 'Special' && !types.has(move.type) && move.type !== 'Fire') ||\n\t\t\t\t\t(counter.setupType === 'Special' && move.category === 'Physical' && moveid !== 'superpower')\n\t\t\t\t) {\n\t\t\t\t\tcull = true;\n\t\t\t\t}\n\t\t\t\tconst moveIsRejectable = (\n\t\t\t\t\t!move.weather &&\n\t\t\t\t\t(move.category !== 'Status' || !move.flags.heal) &&\n\t\t\t\t\t(counter.setupType || !move.stallingMove) &&\n\t\t\t\t\t// These moves cannot be rejected in favor of a forced move\n\t\t\t\t\t!['batonpass', 'sleeptalk', 'solarbeam', 'substitute', 'sunnyday'].includes(moveid) &&\n\t\t\t\t\t(move.category === 'Status' || !types.has(move.type) || (move.basePower && move.basePower < 40 && !move.multihit))\n\t\t\t\t);\n\t\t\t\t// Pokemon should usually have at least one STAB move\n\t\t\t\tconst requiresStab = (\n\t\t\t\t\t!counter.get('stab') &&\n\t\t\t\t\t!moves.has('seismictoss') && !moves.has('nightshade') &&\n\t\t\t\t\tspecies.id !== 'castform' &&\n\t\t\t\t\t// If a Flying-type has Psychic, it doesn't need STAB\n\t\t\t\t\t!(moves.has('psychic') && types.has('Flying')) &&\n\t\t\t\t\t!(types.has('Ghost') && species.baseStats.spa > species.baseStats.atk) &&\n\t\t\t\t\t!(\n\t\t\t\t\t\t// With Calm Mind, Lugia and pure Normal-types are fine without STAB\n\t\t\t\t\t\tcounter.setupType === 'Special' && (\n\t\t\t\t\t\t\tspecies.id === 'lugia' ||\n\t\t\t\t\t\t\t(types.has('Normal') && species.types.length < 2)\n\t\t\t\t\t\t)\n\t\t\t\t\t) &&\n\t\t\t\t\t!(\n\t\t\t\t\t\t// With Swords Dance, Dark-types and pure Water-types are fine without STAB\n\t\t\t\t\t\tcounter.setupType === 'Physical' &&\n\t\t\t\t\t\t((types.has('Water') && species.types.length < 2) || types.has('Dark'))\n\t\t\t\t\t) &&\n\t\t\t\t\tcounter.get('physicalpool') + counter.get('specialpool') > 0\n\t\t\t\t);\n\n\t\t\t\tconst runEnforcementChecker = (checkerName: string) => {\n\t\t\t\t\tif (!this.moveEnforcementCheckers[checkerName]) return false;\n\t\t\t\t\treturn this.moveEnforcementCheckers[checkerName](\n\t\t\t\t\t\tmovePool, moves, abilities, types, counter, species as Species, teamDetails\n\t\t\t\t\t);\n\t\t\t\t};\n\n\t\t\t\tif (!cull && !isSetup && moveIsRejectable) {\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\trequiresStab ||\n\t\t\t\t\t\t(counter.setupType && counter.get(counter.setupType) < 2) ||\n\t\t\t\t\t\t(moves.has('substitute') && movePool.includes('morningsun')) ||\n\t\t\t\t\t\t['meteormash', 'spore', 'recover'].some(m => movePool.includes(m))\n\t\t\t\t\t) {\n\t\t\t\t\t\tcull = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Pokemon should have moves that benefit their typing and their other moves\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\tfor (const m of moves) {\n\t\t\t\t\t\t\tif (runEnforcementChecker(m)) cull = true;\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 (moveid === '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\tconst moveIsHP = moveid.startsWith('hiddenpower');\n\t\t\t\tif (\n\t\t\t\t\tcull &&\n\t\t\t\t\t(movePool.length - availableHP || availableHP && (moveIsHP || !hasHiddenPower))\n\t\t\t\t) {\n\t\t\t\t\tif (move.category !== 'Status' && !move.damage && (!moveIsHP || !availableHP)) {\n\t\t\t\t\t\trejectedPool.push(moveid);\n\t\t\t\t\t}\n\t\t\t\t\tif (moveIsHP) 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\tif (cull && rejectedPool.length) {\n\t\t\t\t\tif (moveIsHP) 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\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\tconst abilityData = Array.from(abilities).map(a => this.dex.abilities.get(a)).filter(a => a.gen === 3);\n\t\tUtils.sortBy(abilityData, abil => -abil.rating);\n\t\tlet ability0 = abilityData[0];\n\t\tlet ability1 = abilityData[1];\n\t\tif (abilityData[1]) {\n\t\t\tif (ability0.rating <= ability1.rating && this.randomChance(1, 2)) {\n\t\t\t\t[ability0, ability1] = [ability1, ability0];\n\t\t\t} else if (ability0.rating - 0.6 <= ability1.rating && this.randomChance(2, 3)) {\n\t\t\t\t[ability0, ability1] = [ability1, ability0];\n\t\t\t}\n\t\t\tability = ability0.name;\n\n\t\t\twhile (this.shouldCullAbility(ability, types, moves, abilities, counter, movePool, teamDetails, species)) {\n\t\t\t\tif (ability === ability0.name && ability1.rating > 1) {\n\t\t\t\t\tability = ability1.name;\n\t\t\t\t} else {\n\t\t\t\t\t// Default to the highest rated ability if all are rejected\n\t\t\t\t\tability = abilityData[0].name;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tability = abilityData[0].name;\n\t\t}\n\n\t\tconst item = this.getItem(ability, types, moves, counter, species);\n\t\tconst levelScale: {[k: string]: number} = {\n\t\t\tUber: 76,\n\t\t\tOU: 80,\n\t\t\tUUBL: 82,\n\t\t\tUU: 84,\n\t\t\tNUBL: 86,\n\t\t\tNU: 88,\n\t\t\tNFE: 90,\n\t\t};\n\t\tconst customScale: {[k: string]: number} = {\n\t\t\tDitto: 99, Unown: 99,\n\t\t};\n\t\tconst tier = species.tier;\n\t\tconst level = this.adjustLevel || customScale[species.name] || levelScale[tier] || (species.nfe ? 90 : 80);\n\n\t\t// Prepare optimal HP\n\t\tlet hp = Math.floor(Math.floor(2 * species.baseStats.hp + ivs.hp + Math.floor(evs.hp / 4) + 100) * level / 100 + 10);\n\t\tif (moves.has('substitute') && ['endeavor', 'flail', 'reversal'].some(m => moves.has(m))) {\n\t\t\t// Endeavor/Flail/Reversal users should be able to use four Substitutes\n\t\t\tif (hp % 4 === 0) evs.hp -= 4;\n\t\t} else if (moves.has('substitute') && (item === 'Salac Berry' || item === 'Petaya Berry' || item === 'Liechi Berry')) {\n\t\t\t// Other pinch berry holders should have berries activate after three Substitutes\n\t\t\twhile (hp % 4 > 0) {\n\t\t\t\tevs.hp -= 4;\n\t\t\t\thp = Math.floor(Math.floor(2 * species.baseStats.hp + ivs.hp + Math.floor(evs.hp / 4) + 100) * level / 100 + 10);\n\t\t\t}\n\t\t}\n\n\t\t// Minimize confusion damage\n\t\tif (!counter.get('Physical') && !moves.has('transform')) {\n\t\t\tevs.atk = 0;\n\t\t\tivs.atk = hasHiddenPower ? ivs.atk - 28 : 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\tmoves: Array.from(moves),\n\t\t\tability: ability,\n\t\t\tevs: evs,\n\t\t\tivs: ivs,\n\t\t\titem: item,\n\t\t\tlevel,\n\t\t\tshiny: this.randomChance(1, 1024),\n\t\t};\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 typePool = this.dex.types.names();\n\t\tconst type = this.forceMonotype || this.sample(typePool);\n\n\t\tconst baseFormes: {[k: string]: number} = {};\n\t\tconst tierCount: {[k: string]: number} = {};\n\t\tconst typeCount: {[k: string]: number} = {};\n\t\tconst typeComboCount: {[k: string]: number} = {};\n\t\tconst teamDetails: RandomTeamsTypes.TeamDetails = {};\n\n\t\tconst pokemonPool = this.getPokemonPool(type, pokemon, isMonotype);\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 || !species.randomBattleMoves) continue;\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// Limit to one Wobbuffet per battle (not just per team)\n\t\t\tif (species.name === 'Wobbuffet' && this.battleHasWobbuffet) continue;\n\t\t\t// Limit to one Ditto per battle in Gen 2\n\t\t\tif (this.dex.gen < 3 && species.name === 'Ditto' && this.battleHasDitto) continue;\n\n\t\t\tconst tier = species.tier;\n\t\t\tconst types = species.types;\n\t\t\tconst typeCombo = types.slice().sort().join();\n\n\t\t\tif (!isMonotype && !this.forceMonotype) {\n\t\t\t\t// Dynamically scale limits for different team sizes. The default and minimum value is 1.\n\t\t\t\tconst limitFactor = Math.round(this.maxTeamSize / 6) || 1;\n\n\t\t\t\t// Limit two Pokemon per tier\n\t\t\t\tif (tierCount[tier] >= 2 * limitFactor) continue;\n\n\t\t\t\t// Limit two of any type\n\t\t\t\tlet skip = false;\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 one of any type combination\n\t\t\t\tif (!this.forceMonotype && 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\tconst set = this.randomSet(species, teamDetails);\n\t\t\tpokemon.push(set);\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 tier counter\n\t\t\tif (tierCount[tier]) {\n\t\t\t\ttierCount[tier]++;\n\t\t\t} else {\n\t\t\t\ttierCount[tier] = 1;\n\t\t\t}\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// Updateeam details\n\t\t\tif (set.ability === 'Drizzle' || set.moves.includes('raindance')) teamDetails.rain = 1;\n\t\t\tif (set.ability === 'Sand Stream') teamDetails.sand = 1;\n\t\t\tif (set.moves.includes('spikes')) teamDetails.spikes = 1;\n\t\t\tif (set.moves.includes('rapidspin')) teamDetails.rapidSpin = 1;\n\t\t\tif (set.moves.includes('aromatherapy') || set.moves.includes('healbell')) teamDetails.statusCure = 1;\n\n\t\t\t// In Gen 3, Shadow Tag users can prevent each other from switching out, possibly causing and endless battle or at least causing a long stall war\n\t\t\t// To prevent this, we prevent more than one Wobbuffet in a single battle.\n\t\t\tif (set.ability === 'Shadow Tag') this.battleHasWobbuffet = true;\n\t\t\tif (species.id === 'ditto') this.battleHasDitto = true;\n\t\t}\n\n\t\tif (pokemon.length < this.maxTeamSize && !isMonotype && !this.forceMonotype && pokemon.length < 12) {\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\nexport default RandomGen3Teams;\n","import {MoveCounter} from './gen8';\nimport {RandomGen3Teams} from './gen3';\nimport {\n\tFormat,\n\tModdedDex,\n\tMove,\n\tPRNG,\n\tPRNGSeed,\n\tRandomTeamsTypes,\n\tSpecies,\n} from '@pkmn/sim';\n\nexport class RandomGen2Teams extends RandomGen3Teams {\n\tconstructor(dex: ModdedDex, format: Format, prng: PRNG | PRNGSeed | null) {\n\t\tsuper(dex, format, prng);\n\t\tthis.moveEnforcementCheckers = {\n\t\t\tElectric: (movePool, moves, abilities, types, counter) => !counter.get('Electric'),\n\t\t\tFire: (movePool, moves, abilities, types, counter) => !counter.get('Fire'),\n\t\t\tGround: (movePool, moves, abilities, types, counter) => !counter.get('Ground'),\n\t\t\tIce: (movePool, moves, abilities, types, counter) => !counter.get('Ice'),\n\t\t\tNormal: (movePool, moves, abilities, types, counter) => !counter.get('Normal') && counter.setupType === 'Physical',\n\t\t\tPsychic: (movePool, moves, abilities, types, counter) => !counter.get('Psychic') && types.has('Grass'),\n\t\t\tRock: (movePool, moves, abilities, types, counter, species) => !counter.get('Rock') && species.baseStats.atk > 60,\n\t\t\tWater: (movePool, moves, abilities, types, counter) => !counter.get('Water'),\n\t\t};\n\t}\n\n\tshouldCullMove(\n\t\tmove: Move,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tabilities = {},\n\t\tcounter: MoveCounter,\n\t\tmovePool: string[],\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t): {cull: boolean, isSetup?: boolean} {\n\t\tconst restTalk = moves.has('rest') && moves.has('sleeptalk');\n\n\t\tswitch (move.id) {\n\t\t// Set up once and only if we have the moves for it\n\t\tcase 'bellydrum': case 'curse': case 'meditate': case 'screech': case 'swordsdance':\n\t\t\treturn {\n\t\t\t\tcull: (\n\t\t\t\t\t(counter.setupType !== 'Physical' || counter.get('physicalsetup') > 1) ||\n\t\t\t\t\t(!counter.get('Physical') || counter.damagingMoves.size < 2 && !moves.has('batonpass') && !moves.has('sleeptalk'))\n\t\t\t\t),\n\t\t\t\tisSetup: true,\n\t\t\t};\n\n\t\t// Not very useful without their supporting moves\n\t\tcase 'batonpass':\n\t\t\treturn {cull: !counter.setupType && !counter.get('speedsetup') && !moves.has('meanlook')};\n\t\tcase 'meanlook':\n\t\t\treturn {cull: movePool.includes('perishsong')};\n\t\tcase 'nightmare':\n\t\t\treturn {cull: !moves.has('lovelykiss') && !moves.has('sleeppowder')};\n\t\tcase 'swagger':\n\t\t\treturn {cull: !moves.has('substitute')};\n\n\t\t// Bad after setup\n\t\tcase 'charm': case 'counter':\n\t\t\treturn {cull: !!counter.setupType};\n\t\tcase 'haze':\n\t\t\treturn {cull: !!counter.setupType || restTalk};\n\t\tcase 'reflect': case 'lightscreen':\n\t\t\treturn {cull: !!counter.setupType || moves.has('rest')};\n\n\t\t// Ineffective to have both\n\t\tcase 'doubleedge':\n\t\t\treturn {cull: moves.has('bodyslam') || moves.has('return')};\n\t\tcase 'explosion': case 'selfdestruct':\n\t\t\treturn {cull: moves.has('softboiled') || restTalk};\n\t\tcase 'extremespeed':\n\t\t\treturn {cull: moves.has('bodyslam') || restTalk};\n\t\tcase 'hyperbeam':\n\t\t\treturn {cull: moves.has('rockslide')};\n\t\tcase 'quickattack':\n\t\t\treturn {cull: moves.has('rest')};\n\t\tcase 'rapidspin':\n\t\t\treturn {cull: !!teamDetails.rapidSpin || moves.has('sleeptalk')};\n\t\tcase 'return':\n\t\t\treturn {cull: moves.has('bodyslam')};\n\t\tcase 'surf':\n\t\t\treturn {cull: moves.has('hydropump')};\n\t\tcase 'thunder':\n\t\t\treturn {cull: moves.has('thunderbolt')};\n\t\tcase 'gigadrain':\n\t\t\treturn {cull: moves.has('razorleaf') || moves.has('swordsdance') && movePool.includes('sludgebomb')};\n\t\tcase 'icebeam':\n\t\t\treturn {cull: moves.has('dragonbreath')};\n\t\tcase 'seismictoss':\n\t\t\treturn {cull: moves.has('rest') || moves.has('sleeptalk')};\n\t\tcase 'destinybond':\n\t\t\treturn {cull: moves.has('explosion')};\n\t\tcase 'pursuit':\n\t\t\treturn {cull: moves.has('crunch') && moves.has('solarbeam')};\n\t\tcase 'thief':\n\t\t\treturn {cull: moves.has('rest') || moves.has('substitute')};\n\t\tcase 'irontail':\n\t\t\treturn {cull: types.has('Ground') && movePool.includes('earthquake')};\n\n\t\t// Status and illegal move rejections\n\t\tcase 'confuseray': case 'roar': case 'whirlwind':\n\t\t\treturn {cull: restTalk};\n\t\tcase 'encore':\n\t\t\treturn {cull: moves.has('bodyslam') || moves.has('surf') || restTalk};\n\t\tcase 'lovelykiss':\n\t\t\treturn {cull: ['healbell', 'moonlight', 'morningsun'].some(m => moves.has(m)) || restTalk};\n\t\tcase 'sleeptalk':\n\t\t\treturn {cull: moves.has('curse') && counter.get('stab') >= 2};\n\t\tcase 'softboiled':\n\t\t\treturn {cull: movePool.includes('swordsdance')};\n\t\tcase 'spikes':\n\t\t\treturn {cull: !!teamDetails.spikes || types.has('Ice') && moves.has('rapidspin')};\n\t\tcase 'substitute':\n\t\t\treturn {cull: moves.has('agility') || moves.has('rest')};\n\t\tcase 'synthesis':\n\t\t\treturn {cull: moves.has('explosion')};\n\t\tcase 'thunderwave':\n\t\t\treturn {cull: moves.has('thunder') || moves.has('toxic')};\n\t\t}\n\n\t\treturn {cull: false};\n\t}\n\n\tgetItem(\n\t\tability: string,\n\t\ttypes: Set<string>,\n\t\tmoves: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tspecies: Species,\n\t) {\n\t\t// First, the high-priority items\n\t\tif (species.name === 'Ditto') return this.sample(['Metal Powder', 'Quick Claw']);\n\t\tif (species.name === 'Farfetch\\u2019d') return 'Stick';\n\t\tif (species.name === 'Marowak') return 'Thick Club';\n\t\tif (species.name === 'Pikachu') return 'Light Ball';\n\t\tif (species.name === 'Unown') return 'Twisted Spoon';\n\t\tif (moves.has('thief')) return '';\n\n\t\t// Medium priority\n\t\tif (moves.has('rest') && !moves.has('sleeptalk')) return 'Mint Berry';\n\t\tif (\n\t\t\t(moves.has('bellydrum') || moves.has('swordsdance')) &&\n\t\t\tspecies.baseStats.spe >= 60 && !types.has('Ground') &&\n\t\t\t!moves.has('sleeptalk') && !moves.has('substitute') &&\n\t\t\tthis.randomChance(1, 2)\n\t\t) {\n\t\t\treturn 'Miracle Berry';\n\t\t}\n\n\t\t// Default to Leftovers\n\t\treturn 'Leftovers';\n\t}\n\n\trandomSet(species: string | Species, teamDetails: RandomTeamsTypes.TeamDetails = {}): RandomTeamsTypes.RandomSet {\n\t\tspecies = this.dex.species.get(species);\n\n\t\tconst movePool = (species.randomBattleMoves || Object.keys(this.dex.species.getLearnset(species.id)!)).slice();\n\t\tconst rejectedPool: string[] = [];\n\t\tconst moves = new Set<string>();\n\n\t\tlet ivs = {hp: 30, atk: 30, def: 30, spa: 30, spd: 30, spe: 30};\n\t\tlet availableHP = 0;\n\t\tfor (const setMoveid of movePool) {\n\t\t\tif (setMoveid.startsWith('hiddenpower')) availableHP++;\n\t\t}\n\n\t\tconst types = new Set(species.types);\n\n\t\tlet counter;\n\t\t// We use a special variable to track Hidden Power\n\t\t// so that we can check for all Hidden Powers at once\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\twhile (moves.size < this.maxMoveCount && movePool.length) {\n\t\t\t\tconst moveid = this.sampleNoReplace(movePool);\n\t\t\t\tif (moveid.startsWith('hiddenpower')) {\n\t\t\t\t\tavailableHP--;\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\t\t\twhile (moves.size < this.maxMoveCount && rejectedPool.length) {\n\t\t\t\tconst moveid = this.sampleNoReplace(rejectedPool);\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, new Set(), movePool);\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(move, types, moves, {}, counter, movePool, teamDetails);\n\n\t\t\t\t// This move doesn't satisfy our setup requirements:\n\t\t\t\tif (counter.setupType === 'Physical' && move.category === 'Special' && !counter.get('Physical')) {\n\t\t\t\t\tcull = true;\n\t\t\t\t}\n\n\n\t\t\t\t// Reject Status, non-STAB, or low basepower moves\n\t\t\t\tconst moveIsRejectable = (\n\t\t\t\t\t(move.category !== 'Status' || !move.flags.heal) &&\n\t\t\t\t\t// These moves cannot be rejected in favor of a forced move\n\t\t\t\t\t!['batonpass', 'sleeptalk', 'spikes', 'sunnyday'].includes(move.id) &&\n\t\t\t\t\t(move.category === 'Status' || !types.has(move.type) || (move.basePower && move.basePower < 40))\n\t\t\t\t);\n\n\t\t\t\tif (!cull && !isSetup && moveIsRejectable && (counter.setupType || !move.stallingMove)) {\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 usually have at least one STAB move\n\t\t\t\t\t\t(\n\t\t\t\t\t\t\t!counter.get('stab') &&\n\t\t\t\t\t\t\t!counter.get('damage') &&\n\t\t\t\t\t\t\t!types.has('Ghost') &&\n\t\t\t\t\t\t\tcounter.get('physicalpool') + counter.get('specialpool') > 0\n\t\t\t\t\t\t) || (movePool.includes('megahorn') || (movePool.includes('softboiled') && moves.has('present'))) ||\n\t\t\t\t\t\t// Rest + Sleep Talk should be selected together\n\t\t\t\t\t\t((moves.has('rest') && movePool.includes('sleeptalk')) || (moves.has('sleeptalk') && movePool.includes('rest'))) ||\n\t\t\t\t\t\t// Sunny Day + Solar Beam should be selected together\n\t\t\t\t\t\t(moves.has('sunnyday') && movePool.includes('solarbeam') ||\n\t\t\t\t\t\t(moves.has('solarbeam') && movePool.includes('sunnyday'))) ||\n\t\t\t\t\t\t['milkdrink', 'recover', 'spore'].some(m => movePool.includes(m))\n\t\t\t\t\t) {\n\t\t\t\t\t\tcull = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Pokemon should have moves that benefit their typing\n\t\t\t\t\t\tfor (const type of types) {\n\t\t\t\t\t\t\tif (this.moveEnforcementCheckers[type]?.(movePool, moves, new Set(), types, counter, species, teamDetails)) cull = true;\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 (\n\t\t\t\t\tcull &&\n\t\t\t\t\t(movePool.length - availableHP || availableHP && (move.id === 'hiddenpower' || !hasHiddenPower))\n\t\t\t\t) {\n\t\t\t\t\tif (move.category !== 'Status' && !move.damage && (move.id !== 'hiddenpower' || !availableHP)) {\n\t\t\t\t\t\trejectedPool.push(moveid);\n\t\t\t\t\t}\n\t\t\t\t\tmoves.delete(moveid);\n\t\t\t\t\tif (moveid.startsWith('hiddenpower')) hasHiddenPower = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (cull && rejectedPool.length) {\n\t\t\t\t\tmoves.delete(moveid);\n\t\t\t\t\tif (moveid.startsWith('hiddenpower')) hasHiddenPower = false;\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// Adjust IVs for Hidden Power\n\t\tfor (const setMoveid of moves) {\n\t\t\tif (!setMoveid.startsWith('hiddenpower')) continue;\n\t\t\tconst hpType = setMoveid.substr(11, setMoveid.length);\n\n\t\t\tconst hpIVs: {[k: string]: Partial<typeof ivs>} = {\n\t\t\t\tdragon: {def: 28},\n\t\t\t\tice: {def: 26},\n\t\t\t\tpsychic: {def: 24},\n\t\t\t\telectric: {atk: 28},\n\t\t\t\tgrass: {atk: 28, def: 28},\n\t\t\t\twater: {atk: 28, def: 26},\n\t\t\t\tfire: {atk: 28, def: 24},\n\t\t\t\tsteel: {atk: 26},\n\t\t\t\tghost: {atk: 26, def: 28},\n\t\t\t\tbug: {atk: 26, def: 26},\n\t\t\t\trock: {atk: 26, def: 24},\n\t\t\t\tground: {atk: 24},\n\t\t\t\tpoison: {atk: 24, def: 28},\n\t\t\t\tflying: {atk: 24, def: 26},\n\t\t\t\tfighting: {atk: 24, def: 24},\n\t\t\t};\n\t\t\tif (hpIVs[hpType]) {\n\t\t\t\tivs = {...ivs, ...hpIVs[hpType]};\n\t\t\t}\n\n\t\t\tif (ivs.atk === 28 || ivs.atk === 24) ivs.hp = 14;\n\t\t\tif (ivs.def === 28 || ivs.def === 24) ivs.hp -= 8;\n\t\t}\n\n\t\tconst levelScale: {[k: string]: number} = {\n\t\t\tNU: 73,\n\t\t\tNUBL: 71,\n\t\t\tUU: 69,\n\t\t\tUUBL: 67,\n\t\t\tOU: 65,\n\t\t\tUber: 61,\n\t\t};\n\t\tconst customScale: {[k: string]: number} = {\n\t\t\tDitto: 83, Unown: 87, Wobbuffet: 83,\n\t\t};\n\t\tconst level = this.adjustLevel || customScale[species.name] || levelScale[species.tier] || 80;\n\n\t\treturn {\n\t\t\tname: species.name,\n\t\t\tspecies: species.name,\n\t\t\tmoves: Array.from(moves),\n\t\t\tability: 'No Ability',\n\t\t\tevs: {hp: 255, atk: 255, def: 255, spa: 255, spd: 255, spe: 255},\n\t\t\tivs,\n\t\t\titem: this.getItem('None', types, moves, counter, species),\n\t\t\tlevel,\n\t\t\t// No shiny chance because Gen 2 shinies have bad IVs\n\t\t\tshiny: false,\n\t\t\tgender: species.gender ? species.gender : 'M',\n\t\t};\n\t}\n}\n\nexport default RandomGen2Teams;\n","import {MoveCounter} from './gen8';\nimport {RandomGen2Teams} from './gen2';\nimport {Utils} from './utils';\nimport {\n\tMove,\n\tPokemonSet,\n\tRandomTeamsTypes,\n\tSpecies,\n\tStatID,\n\tStatsTable,\n} from '@pkmn/sim';\n\ninterface HackmonsCupEntry {\n\ttypes: string[];\n\tbaseStats: StatsTable;\n}\n\nexport class RandomGen1Teams extends RandomGen2Teams {\n\t// Challenge Cup or CC teams are basically fully random teams.\n\trandomCCTeam() {\n\t\tthis.enforceNoDirectCustomBanlistChanges();\n\n\t\tconst team = [];\n\n\t\tconst randomN = this.randomNPokemon(this.maxTeamSize, this.forceMonotype);\n\n\t\tfor (const pokemon of randomN) {\n\t\t\tconst species = this.dex.species.get(pokemon);\n\t\t\tconst learnset = this.dex.species.getLearnset(species.id);\n\n\t\t\t// Level balance: calculate directly from stats rather than using some silly lookup table.\n\t\t\tconst mbstmin = 1307;\n\t\t\tconst stats = species.baseStats;\n\n\t\t\t// Modified base stat total assumes 15 DVs, 255 EVs in every stat\n\t\t\tlet mbst = (stats[\"hp\"] * 2 + 30 + 63 + 100) + 10;\n\t\t\tmbst += (stats[\"atk\"] * 2 + 30 + 63 + 100) + 5;\n\t\t\tmbst += (stats[\"def\"] * 2 + 30 + 63 + 100) + 5;\n\t\t\tmbst += (stats[\"spa\"] * 2 + 30 + 63 + 100) + 5;\n\t\t\tmbst += (stats[\"spd\"] * 2 + 30 + 63 + 100) + 5;\n\t\t\tmbst += (stats[\"spe\"] * 2 + 30 + 63 + 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 + 30 + 63 + 100) * level / 100 + 10);\n\t\t\t\t\t// Since damage is roughly proportional to lvl\n\t\t\t\t\tmbst += Math.floor(((stats[\"atk\"] * 2 + 30 + 63 + 100) * level / 100 + 5) * level / 100);\n\t\t\t\t\tmbst += Math.floor((stats[\"def\"] * 2 + 30 + 63 + 100) * level / 100 + 5);\n\t\t\t\t\tmbst += Math.floor(((stats[\"spa\"] * 2 + 30 + 63 + 100) * level / 100 + 5) * level / 100);\n\t\t\t\t\tmbst += Math.floor((stats[\"spd\"] * 2 + 30 + 63 + 100) * level / 100 + 5);\n\t\t\t\t\tmbst += Math.floor((stats[\"spe\"] * 2 + 30 + 63 + 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 DVs.\n\t\t\tconst ivs = {\n\t\t\t\thp: 0,\n\t\t\t\tatk: this.random(16),\n\t\t\t\tdef: this.random(16),\n\t\t\t\tspa: this.random(16),\n\t\t\t\tspd: 0,\n\t\t\t\tspe: this.random(16),\n\t\t\t};\n\t\t\tivs[\"hp\"] = (ivs[\"atk\"] % 2) * 16 + (ivs[\"def\"] % 2) * 8 + (ivs[\"spe\"] % 2) * 4 + (ivs[\"spa\"] % 2) * 2;\n\t\t\tivs[\"atk\"] *= 2;\n\t\t\tivs[\"def\"] *= 2;\n\t\t\tivs[\"spa\"] *= 2;\n\t\t\tivs[\"spd\"] = ivs[\"spa\"];\n\t\t\tivs[\"spe\"] *= 2;\n\n\t\t\t// Maxed EVs.\n\t\t\tconst evs = {hp: 255, atk: 255, def: 255, spa: 255, spd: 255, spe: 255};\n\n\t\t\t// Four random unique moves from movepool. don't worry about \"attacking\" or \"viable\".\n\t\t\t// Since Gens 1 and 2 learnsets are shared, we need to weed out Gen 2 moves.\n\t\t\tconst pool: string[] = [];\n\t\t\tif (learnset) {\n\t\t\t\tfor (const move in learnset) {\n\t\t\t\t\tif (this.dex.moves.get(move).gen !== 1) continue;\n\t\t\t\t\tif (learnset[move].some(learned => learned.startsWith('1'))) {\n\t\t\t\t\t\tpool.push(move);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tteam.push({\n\t\t\t\tname: species.baseSpecies,\n\t\t\t\tspecies: species.name,\n\t\t\t\tmoves: this.multipleSamplesNoReplace(pool, 4),\n\t\t\t\tgender: false,\n\t\t\t\tability: 'No Ability',\n\t\t\t\tevs: evs,\n\t\t\t\tivs: ivs,\n\t\t\t\titem: '',\n\t\t\t\tlevel,\n\t\t\t\thappiness: 0,\n\t\t\t\tshiny: false,\n\t\t\t\tnature: 'Serious',\n\t\t\t});\n\t\t}\n\n\t\treturn team;\n\t}\n\n\t// Random team generation for Gen 1 Random Battles.\n\trandomTeam() {\n\t\tthis.enforceNoDirectCustomBanlistChanges();\n\n\t\t// Get what we need ready.\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 typePool = this.dex.types.names();\n\t\tconst type = this.forceMonotype || this.sample(typePool);\n\n\t\t/** Pokémon that are not wholly incompatible with the team, but still pretty bad */\n\t\tconst rejectedButNotInvalidPool: string[] = [];\n\t\tconst nuTiers = ['UU', 'UUBL', 'NFE', 'LC', 'NU'];\n\t\tconst uuTiers = ['NFE', 'UU', 'UUBL', 'NU'];\n\n\t\t// Now let's store what we are getting.\n\t\tconst typeCount: {[k: string]: number} = {};\n\t\tconst weaknessCount: {[k: string]: number} = {Electric: 0, Psychic: 0, Water: 0, Ice: 0, Ground: 0};\n\t\tlet uberCount = 0;\n\t\tlet nuCount = 0;\n\n\t\tconst pokemonPool = this.getPokemonPool(type, pokemon, isMonotype);\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 || !species.randomBattleMoves) continue;\n\t\t\t// Only one Ditto is allowed per battle in Generation 1,\n\t\t\t// as it can cause an endless battle if two Dittos are forced\n\t\t\t// to face each other.\n\t\t\tif (species.id === 'ditto' && this.battleHasDitto) continue;\n\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\tconst tier = species.tier;\n\t\t\tswitch (tier) {\n\t\t\tcase 'LC':\n\t\t\tcase 'NFE':\n\t\t\t\t// Don't add pre-evo mon if already 4 or more non-OUs\n\t\t\t\t// Regardless, pre-evo mons are slightly less common.\n\t\t\t\tif (nuCount >= 4 * limitFactor || this.randomChance(1, 3)) continue;\n\t\t\t\tbreak;\n\t\t\tcase 'Uber':\n\t\t\t\t// Only allow a single Uber.\n\t\t\t\tif (uberCount >= 1 * limitFactor) continue;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t// OUs are fine. Otherwise 50% chance to skip mon if already 4 or more non-OUs.\n\t\t\t\tif (uuTiers.includes(tier) && pokemonPool.length > 1 && (nuCount >= 4 * limitFactor && this.randomChance(1, 2))) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet skip = false;\n\n\t\t\tif (!isMonotype && !this.forceMonotype) {\n\t\t\t\t// Limit 2 of any type as well. Diversity and minor weakness count.\n\t\t\t\t// The second of a same type has halved chance of being added.\n\t\t\t\tfor (const typeName of species.types) {\n\t\t\t\t\tif (typeCount[typeName] >= 2 * limitFactor ||\n\t\t\t\t\t\t(typeCount[typeName] >= 1 * limitFactor && this.randomChance(1, 2) && pokemonPool.length > 1)) {\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\n\t\t\t\tif (skip) {\n\t\t\t\t\trejectedButNotInvalidPool.push(species.id);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// We need a weakness count of spammable attacks to avoid being swept by those.\n\t\t\t// Spammable attacks are: Thunderbolt, Psychic, Surf, Blizzard, Earthquake.\n\t\t\tconst pokemonWeaknesses = [];\n\t\t\tfor (const typeName in weaknessCount) {\n\t\t\t\tconst increaseCount = this.dex.getImmunity(typeName, species) && this.dex.getEffectiveness(typeName, species) > 0;\n\t\t\t\tif (!increaseCount) continue;\n\t\t\t\tif (weaknessCount[typeName] >= 2 * limitFactor) {\n\t\t\t\t\tskip = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tpokemonWeaknesses.push(typeName);\n\t\t\t}\n\n\t\t\tif (skip) {\n\t\t\t\trejectedButNotInvalidPool.push(species.id);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// The set passes the limitations.\n\t\t\tpokemon.push(this.randomSet(species));\n\n\t\t\t// Now let's increase the counters.\n\t\t\t// Type counter.\n\t\t\tfor (const typeName of species.types) {\n\t\t\t\tif (typeCount[typeName]) {\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\n\t\t\t// Weakness counter.\n\t\t\tfor (const weakness of pokemonWeaknesses) {\n\t\t\t\tweaknessCount[weakness]++;\n\t\t\t}\n\n\t\t\t// Increment tier bias counters.\n\t\t\tif (tier === 'Uber') {\n\t\t\t\tuberCount++;\n\t\t\t} else if (nuTiers.includes(tier)) {\n\t\t\t\tnuCount++;\n\t\t\t}\n\n\t\t\t// Ditto check\n\t\t\tif (species.id === 'ditto') this.battleHasDitto = true;\n\t\t}\n\n\t\t// if we don't have enough Pokémon, go back to rejects, which are already known to not be invalid.\n\t\twhile (pokemon.length < this.maxTeamSize && rejectedButNotInvalidPool.length) {\n\t\t\tconst species = this.sampleNoReplace(rejectedButNotInvalidPool);\n\t\t\tpokemon.push(this.randomSet(species));\n\t\t}\n\n\t\tif (pokemon.length < this.maxTeamSize && pokemon.length < 12 && !isMonotype) {\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\tshouldCullMove(move: Move, types: Set<string>, moves: Set<string>, counter: MoveCounter): {cull: boolean} {\n\t\tswitch (move.id) {\n\t\t// bit redundant to have both, but neither particularly better than the other\n\t\tcase 'hydropump':\n\t\t\treturn {cull: moves.has('surf')};\n\t\tcase 'surf':\n\t\t\treturn {cull: moves.has('hydropump')};\n\n\t\t// other redundancies that aren't handled within the movesets themselves\n\t\tcase 'selfdestruct':\n\t\t\treturn {cull: moves.has('rest')};\n\t\tcase 'rest':\n\t\t\treturn {cull: moves.has('selfdestruct')};\n\t\tcase 'sharpen': case 'swordsdance':\n\t\t\treturn {cull: counter.get('Special') > counter.get('Physical') || !counter.get('Physical') || moves.has('growth')};\n\t\tcase 'growth':\n\t\t\treturn {cull: counter.get('Special') < counter.get('Physical') || !counter.get('Special') || moves.has('swordsdance')};\n\t\tcase 'poisonpowder': case 'stunspore': case 'sleeppowder': case 'toxic':\n\t\t\treturn {cull: counter.get('Status') > 1};\n\t\t}\n\t\treturn {cull: false};\n\t}\n\n\t/**\n\t * Random set generation for Gen 1 Random Battles.\n\t */\n\trandomSet(species: string | Species): RandomTeamsTypes.RandomSet {\n\t\tspecies = this.dex.species.get(species);\n\t\tif (!species.exists) species = this.dex.species.get('pikachu'); // Because Gen 1.\n\n\t\tconst movePool = species.randomBattleMoves ? species.randomBattleMoves.slice() : [];\n\t\tconst moves = new Set<string>();\n\t\tconst types = new Set(species.types);\n\n\t\tconst counter = new MoveCounter();\n\n\t\t// Moves that boost Attack:\n\t\tconst PhysicalSetup = ['swordsdance', 'sharpen'];\n\t\t// Moves which boost Special Attack:\n\t\tconst SpecialSetup = ['amnesia', 'growth'];\n\n\t\t// Either add all moves or add none\n\t\tif (species.comboMoves && species.comboMoves.length <= this.maxMoveCount && this.randomChance(1, 2)) {\n\t\t\tfor (const m of species.comboMoves) moves.add(m);\n\t\t}\n\n\t\t// Add one of the semi-mandatory moves\n\t\t// Often, these are used so that the Pokemon only gets one of the less useful moves\n\t\tif (moves.size < this.maxMoveCount && species.exclusiveMoves) {\n\t\t\tmoves.add(this.sample(species.exclusiveMoves));\n\t\t}\n\n\t\t// Add the mandatory move. SD Mew and Amnesia Snorlax are exceptions.\n\t\tif (moves.size < this.maxMoveCount && species.essentialMove) {\n\t\t\tmoves.add(species.essentialMove);\n\t\t}\n\n\t\twhile (moves.size < this.maxMoveCount && movePool.length) {\n\t\t\t// Choose next 4 moves from learnset/viable moves and add them to moves list:\n\t\t\twhile (moves.size < this.maxMoveCount && movePool.length) {\n\t\t\t\tconst moveid = this.sampleNoReplace(movePool);\n\t\t\t\tmoves.add(moveid);\n\t\t\t}\n\n\t\t\t// Only do move choosing if we have backup moves in the pool...\n\t\t\tif (movePool.length) {\n\t\t\t\tfor (const setMoveid of moves) {\n\t\t\t\t\tconst move = this.dex.moves.get(setMoveid);\n\t\t\t\t\tconst moveid = move.id;\n\t\t\t\t\tif (!move.damage && !move.damageCallback) counter.add(move.category);\n\t\t\t\t\tif (PhysicalSetup.includes(moveid)) counter.add('physicalsetup');\n\t\t\t\t\tif (SpecialSetup.includes(moveid)) counter.add('specialsetup');\n\t\t\t\t}\n\n\t\t\t\tfor (const moveid of moves) {\n\t\t\t\t\tif (moveid === species.essentialMove) continue;\n\t\t\t\t\tconst move = this.dex.moves.get(moveid);\n\t\t\t\t\tif (\n\t\t\t\t\t\t(!species.essentialMove || moveid !== species.essentialMove) &&\n\t\t\t\t\t\tthis.shouldCullMove(move, types, moves, counter).cull\n\t\t\t\t\t) {\n\t\t\t\t\t\tmoves.delete(moveid);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcounter.add(move.category);\n\t\t\t\t}\n\t\t\t} // End of the check for more than 4 moves on moveset.\n\t\t}\n\n\t\tconst levelScale: {[k: string]: number} = {\n\t\t\tLC: 88,\n\t\t\tNFE: 80,\n\t\t\tPU: 77,\n\t\t\tNU: 77,\n\t\t\tNUBL: 76,\n\t\t\tUU: 74,\n\t\t\tUUBL: 71,\n\t\t\tOU: 68,\n\t\t\tUber: 65,\n\t\t};\n\n\t\tconst customScale: {[k: string]: number} = {\n\t\t\tMewtwo: 62,\n\t\t\tCaterpie: 100, Metapod: 100, Weedle: 100, Kakuna: 100, Magikarp: 100,\n\t\t\tDitto: 100,\n\t\t};\n\t\tconst level = this.adjustLevel || customScale[species.name] || levelScale[species.tier] || 80;\n\n\t\treturn {\n\t\t\tname: species.name,\n\t\t\tspecies: species.name,\n\t\t\tmoves: Array.from(moves),\n\t\t\tability: 'No Ability',\n\t\t\tevs: {hp: 255, atk: 255, def: 255, spa: 255, spd: 255, spe: 255},\n\t\t\tivs: {hp: 30, atk: 30, def: 30, spa: 30, spd: 30, spe: 30},\n\t\t\titem: '',\n\t\t\tlevel,\n\t\t\tshiny: false,\n\t\t\tgender: false,\n\t\t};\n\t}\n\n\trandomHCTeam(): PokemonSet[] {\n\t\tthis.enforceNoDirectCustomBanlistChanges();\n\n\t\tconst team = [];\n\n\t\tconst movePool = [...this.dex.moves.all()];\n\t\tconst typesPool = ['Bird', ...this.dex.types.names()];\n\n\t\tconst randomN = this.randomNPokemon(this.maxTeamSize);\n\t\tconst hackmonsCup: {[k: string]: HackmonsCupEntry} = {};\n\n\t\tfor (const forme of randomN) {\n\t\t\t// Choose forme\n\t\t\tconst species = this.dex.species.get(forme);\n\t\t\tif (!hackmonsCup[species.id]) {\n\t\t\t\thackmonsCup[species.id] = {\n\t\t\t\t\ttypes: [this.sample(typesPool), this.sample(typesPool)],\n\t\t\t\t\tbaseStats: {\n\t\t\t\t\t\thp: Utils.clampIntRange(this.random(256), 1),\n\t\t\t\t\t\tatk: Utils.clampIntRange(this.random(256), 1),\n\t\t\t\t\t\tdef: Utils.clampIntRange(this.random(256), 1),\n\t\t\t\t\t\tspa: Utils.clampIntRange(this.random(256), 1),\n\t\t\t\t\t\tspd: 0,\n\t\t\t\t\t\tspe: Utils.clampIntRange(this.random(256), 1),\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tif (this.forceMonotype && !hackmonsCup[species.id].types.includes(this.forceMonotype)) {\n\t\t\t\t\thackmonsCup[species.id].types[1] = this.forceMonotype;\n\t\t\t\t}\n\t\t\t\thackmonsCup[species.id].baseStats.spd = hackmonsCup[species.id].baseStats.spa;\n\t\t\t}\n\t\t\tif (hackmonsCup[species.id].types[0] === hackmonsCup[species.id].types[1]) {\n\t\t\t\thackmonsCup[species.id].types.splice(1, 1);\n\t\t\t}\n\n\t\t\t// Random unique moves\n\t\t\tconst moves = [];\n\t\t\tdo {\n\t\t\t\tconst move = this.sampleNoReplace(movePool);\n\t\t\t\tif (move.gen <= this.gen && !move.isNonstandard && !move.name.startsWith('Hidden Power ')) {\n\t\t\t\t\tmoves.push(move.id);\n\t\t\t\t}\n\t\t\t} while (moves.length < this.maxMoveCount);\n\n\t\t\t// Random EVs\n\t\t\tconst evs = {\n\t\t\t\thp: this.random(256),\n\t\t\t\tatk: this.random(256),\n\t\t\t\tdef: this.random(256),\n\t\t\t\tspa: this.random(256),\n\t\t\t\tspd: 0,\n\t\t\t\tspe: this.random(256),\n\t\t\t};\n\t\t\tevs['spd'] = evs['spa'];\n\n\t\t\t// Random DVs\n\t\t\tconst ivs: StatsTable = {\n\t\t\t\thp: 0,\n\t\t\t\tatk: this.random(16),\n\t\t\t\tdef: this.random(16),\n\t\t\t\tspa: this.random(16),\n\t\t\t\tspd: 0,\n\t\t\t\tspe: this.random(16),\n\t\t\t};\n\t\t\tivs[\"hp\"] = (ivs[\"atk\"] % 2) * 16 + (ivs[\"def\"] % 2) * 8 + (ivs[\"spe\"] % 2) * 4 + (ivs[\"spa\"] % 2) * 2;\n\t\t\tfor (const iv in ivs) {\n\t\t\t\tif (iv === 'hp' || iv === 'spd') continue;\n\t\t\t\tivs[iv as keyof StatsTable] *= 2;\n\t\t\t}\n\t\t\tivs['spd'] = ivs['spa'];\n\n\t\t\t// Level balance\n\t\t\tconst mbstmin = 425;\n\t\t\tconst baseStats = hackmonsCup[species.id].baseStats;\n\t\t\tconst calcStat = (statName: StatID, lvl?: number) => {\n\t\t\t\tif (lvl) {\n\t\t\t\t\treturn Math.floor(Math.floor(2 * baseStats[statName] + ivs[statName] + Math.floor(evs[statName] / 4)) * lvl / 100 + 5);\n\t\t\t\t}\n\t\t\t\treturn Math.floor(2 * baseStats[statName] + ivs[statName] + Math.floor(evs[statName] / 4)) + 5;\n\t\t\t};\n\t\t\tlet mbst = 0;\n\t\t\tfor (const statName of Object.keys(baseStats)) {\n\t\t\t\tmbst += calcStat(statName as StatID);\n\t\t\t\tif (statName === 'hp') mbst += 5;\n\t\t\t}\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\tfor (const statName of Object.keys(baseStats)) {\n\t\t\t\t\t\tmbst += calcStat(statName as StatID, level);\n\t\t\t\t\t\tif (statName === 'hp') mbst += 5;\n\t\t\t\t\t}\n\t\t\t\t\tif (mbst >= mbstmin) break;\n\t\t\t\t\tlevel++;\n\t\t\t\t}\n\t\t\t\tif (level > 100) level = 100;\n\t\t\t}\n\n\t\t\tteam.push({\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: 'No Ability',\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\tshiny: false,\n\t\t\t\t// Hacky but the only way to communicate stats/level generation properly\n\t\t\t\thc: hackmonsCup[species.id],\n\t\t\t});\n\t\t}\n\n\t\treturn team;\n\t}\n}\n\nexport default RandomGen1Teams;\n","import {Utils} from './utils';\nimport {\n\tAbility,\n\tAnyObject,\n\tBasicEffect,\n\tFormat,\n\tItem,\n\tModdedDex,\n\tMove,\n\tNature,\n\tPRNG,\n\tPRNGSeed,\n\tPlayerOptions,\n\tPokemonSet,\n\tRandomTeamsTypes,\n\tRuleTable,\n\tSpecies,\n\tStatID,\n\tStatsTable,\n\tTags,\n\ttoID,\n} from '@pkmn/sim';\n\n/* eslint-disable */\nconst randomSetsJSON = {\"charizard\":{\"level\":84,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Earthquake\",\"Flamethrower\",\"Focus Blast\",\"Hurricane\",\"Will-O-Wisp\"],\"teraTypes\":[\"Fire\",\"Ground\",\"Water\"]},{\"role\":\"Setup Sweeper\",\"movepool\":[\"Dragon Dance\",\"Earthquake\",\"Flare Blitz\",\"Swords Dance\",\"Thunder Punch\"],\"teraTypes\":[\"Fire\",\"Ground\"]}]},\"pikachu\":{\"level\":88,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Fake Out\",\"Nuzzle\",\"Play Rough\",\"Surf\",\"Volt Switch\",\"Volt Tackle\"],\"teraTypes\":[\"Water\"]}]},\"raichu\":{\"level\":88,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Encore\",\"Focus Blast\",\"Grass Knot\",\"Nasty Plot\",\"Nuzzle\",\"Surf\",\"Thunderbolt\",\"Volt Switch\"],\"teraTypes\":[\"Water\",\"Grass\",\"Electric\"]}]},\"raichualola\":{\"level\":86,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Focus Blast\",\"Grass Knot\",\"Nasty Plot\",\"Psychic\",\"Psyshock\",\"Surf\",\"Thunderbolt\",\"Volt Switch\"],\"teraTypes\":[\"Electric\"]}]},\"wigglytuff\":{\"level\":88,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Dazzling Gleam\",\"Fire Blast\",\"Light Screen\",\"Protect\",\"Reflect\",\"Stealth Rock\",\"Thunder Wave\",\"Wish\"],\"teraTypes\":[\"Steel\"]}]},\"venomoth\":{\"level\":84,\"sets\":[{\"role\":\"Setup Sweeper\",\"movepool\":[\"Bug Buzz\",\"Quiver Dance\",\"Sleep Powder\",\"Sludge Bomb\",\"Substitute\"],\"teraTypes\":[\"Bug\",\"Poison\"]}]},\"dugtrio\":{\"level\":82,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Earthquake\",\"Memento\",\"Stealth Rock\",\"Stone Edge\",\"Sucker Punch\",\"Swords Dance\"],\"teraTypes\":[\"Ground\",\"Ghost\",\"Fairy\",\"Flying\"]}]},\"dugtrioalola\":{\"level\":88,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Earthquake\",\"Iron Head\",\"Stealth Rock\",\"Stone Edge\",\"Sucker Punch\",\"Swords Dance\"],\"teraTypes\":[\"Ground\",\"Steel\"]}]},\"persian\":{\"level\":88,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Aerial Ace\",\"Body Slam\",\"Fake Out\",\"Foul Play\",\"Gunk Shot\",\"Switcheroo\",\"U-turn\"],\"teraTypes\":[\"Normal\",\"Poison\",\"Flying\"]}]},\"persianalola\":{\"level\":88,\"sets\":[{\"role\":\"Fast Bulky Setup\",\"movepool\":[\"Dark Pulse\",\"Hypnosis\",\"Nasty Plot\",\"Power Gem\",\"Thunderbolt\"],\"teraTypes\":[\"Dark\",\"Electric\"]}]},\"golduck\":{\"level\":88,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Encore\",\"Grass Knot\",\"Hydro Pump\",\"Ice Beam\",\"Nasty Plot\",\"Psyshock\",\"Taunt\"],\"teraTypes\":[\"Water\"]}]},\"annihilape\":{\"level\":80,\"sets\":[{\"role\":\"Fast Bulky Setup\",\"movepool\":[\"Bulk Up\",\"Drain Punch\",\"Rage Fist\",\"Rest\"],\"teraTypes\":[\"Ghost\",\"Water\",\"Fairy\",\"Steel\"]},{\"role\":\"Bulky Attacker\",\"movepool\":[\"Bulk Up\",\"Close Combat\",\"Rage Fist\",\"Stone Edge\",\"U-turn\"],\"teraTypes\":[\"Ghost\",\"Fighting\"]}]},\"arcanine\":{\"level\":84,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Close Combat\",\"Extreme Speed\",\"Flare Blitz\",\"Morning Sun\",\"Roar\",\"Wild Charge\",\"Will-O-Wisp\"],\"teraTypes\":[\"Fighting\",\"Normal\"]},{\"role\":\"Fast Attacker\",\"movepool\":[\"Close Combat\",\"Extreme Speed\",\"Flare Blitz\",\"Morning Sun\",\"Wild Charge\"],\"teraTypes\":[\"Fighting\",\"Normal\"]}]},\"arcaninehisui\":{\"level\":82,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Close Combat\",\"Extreme Speed\",\"Flare Blitz\",\"Head Smash\",\"Morning Sun\",\"Wild Charge\"],\"teraTypes\":[\"Rock\"]}]},\"slowbro\":{\"level\":84,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Calm Mind\",\"Psyshock\",\"Slack Off\",\"Surf\",\"Thunder Wave\"],\"teraTypes\":[\"Water\",\"Fairy\"]},{\"role\":\"AV Pivot\",\"movepool\":[\"Body Press\",\"Fire Blast\",\"Future Sight\",\"Ice Beam\",\"Psychic\",\"Surf\"],\"teraTypes\":[\"Fighting\",\"Water\"]}]},\"slowbrogalar\":{\"level\":84,\"sets\":[{\"role\":\"AV Pivot\",\"movepool\":[\"Earthquake\",\"Fire Blast\",\"Foul Play\",\"Psychic\",\"Shell Side Arm\",\"Surf\"],\"teraTypes\":[\"Ground\",\"Water\",\"Poison\",\"Dark\"]},{\"role\":\"Wallbreaker\",\"movepool\":[\"Fire Blast\",\"Psyshock\",\"Sludge Bomb\",\"Trick\",\"Trick Room\"],\"teraTypes\":[\"Psychic\",\"Poison\"]}]},\"muk\":{\"level\":88,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Fire Punch\",\"Gunk Shot\",\"Haze\",\"Ice Punch\",\"Shadow Sneak\",\"Toxic\",\"Toxic Spikes\"],\"teraTypes\":[\"Poison\",\"Dark\"]}]},\"mukalola\":{\"level\":86,\"sets\":[{\"role\":\"AV Pivot\",\"movepool\":[\"Fire Punch\",\"Gunk Shot\",\"Ice Punch\",\"Knock Off\",\"Poison Jab\"],\"teraTypes\":[\"Dark\"]}]},\"cloyster\":{\"level\":80,\"sets\":[{\"role\":\"Tera Blast user\",\"movepool\":[\"Icicle Spear\",\"Rock Blast\",\"Shell Smash\",\"Tera Blast\"],\"teraTypes\":[\"Fire\",\"Ground\"]},{\"role\":\"Setup Sweeper\",\"movepool\":[\"Hydro Pump\",\"Icicle Spear\",\"Rock Blast\",\"Shell Smash\"],\"teraTypes\":[\"Ice\",\"Rock\"]}]},\"gengar\":{\"level\":82,\"sets\":[{\"role\":\"Wallbreaker\",\"movepool\":[\"Focus Blast\",\"Nasty Plot\",\"Shadow Ball\",\"Sludge Bomb\",\"Trick\"],\"teraTypes\":[\"Ghost\"]},{\"role\":\"Fast Attacker\",\"movepool\":[\"Encore\",\"Focus Blast\",\"Shadow Ball\",\"Sludge Bomb\",\"Toxic Spikes\",\"Will-O-Wisp\"],\"teraTypes\":[\"Ghost\"]}]},\"hypno\":{\"level\":88,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Encore\",\"Focus Blast\",\"Foul Play\",\"Light Screen\",\"Psychic\",\"Reflect\",\"Thunder Wave\"],\"teraTypes\":[\"Dark\",\"Steel\"]}]},\"electrode\":{\"level\":88,\"sets\":[{\"role\":\"Fast Support\",\"movepool\":[\"Explosion\",\"Foul Play\",\"Light Screen\",\"Taunt\",\"Thunder Wave\",\"Thunderbolt\",\"Volt Switch\"],\"teraTypes\":[\"Electric\"]}]},\"electrodehisui\":{\"level\":88,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Chloroblast\",\"Energy Ball\",\"Taunt\",\"Thunder Wave\",\"Thunderbolt\",\"Volt Switch\"],\"teraTypes\":[\"Grass\"]},{\"role\":\"Fast Support\",\"movepool\":[\"Giga Drain\",\"Leech Seed\",\"Substitute\",\"Thunderbolt\"],\"teraTypes\":[\"Poison\"]}]},\"scyther\":{\"level\":86,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Aerial Ace\",\"Close Combat\",\"Pounce\",\"Swords Dance\",\"U-turn\"],\"teraTypes\":[\"Fighting\"]}]},\"tauros\":{\"level\":86,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Body Slam\",\"Close Combat\",\"Earthquake\",\"Rock Slide\",\"Zen Headbutt\"],\"teraTypes\":[\"Normal\",\"Fighting\",\"Ground\"]},{\"role\":\"Wallbreaker\",\"movepool\":[\"Close Combat\",\"Double-Edge\",\"Earthquake\",\"Stone Edge\"],\"teraTypes\":[\"Normal\",\"Fighting\",\"Ground\"]}]},\"taurospaldea\":{\"level\":84,\"sets\":[{\"role\":\"Fast Bulky Setup\",\"movepool\":[\"Bulk Up\",\"Raging Bull\",\"Stone Edge\",\"Substitute\"],\"teraTypes\":[\"Fighting\"]},{\"role\":\"Wallbreaker\",\"movepool\":[\"Bulk Up\",\"Close Combat\",\"Earthquake\",\"Iron Head\",\"Stone Edge\"],\"teraTypes\":[\"Fighting\"]}]},\"taurospaldeafire\":{\"level\":84,\"sets\":[{\"role\":\"Fast Bulky Setup\",\"movepool\":[\"Bulk Up\",\"Close Combat\",\"Raging Bull\",\"Substitute\"],\"teraTypes\":[\"Fire\"]},{\"role\":\"Wallbreaker\",\"movepool\":[\"Close Combat\",\"Flare Blitz\",\"Stone Edge\",\"Wild Charge\"],\"teraTypes\":[\"Fighting\"]}]},\"taurospaldeawater\":{\"level\":84,\"sets\":[{\"role\":\"Fast Bulky Setup\",\"movepool\":[\"Bulk Up\",\"Close Combat\",\"Liquidation\",\"Substitute\"],\"teraTypes\":[\"Water\"]},{\"role\":\"Wallbreaker\",\"movepool\":[\"Aqua Jet\",\"Bulk Up\",\"Close Combat\",\"Liquidation\",\"Stone Edge\",\"Wave Crash\"],\"teraTypes\":[\"Water\"]}]},\"gyarados\":{\"level\":82,\"sets\":[{\"role\":\"Setup Sweeper\",\"movepool\":[\"Dragon Dance\",\"Earthquake\",\"Stone Edge\",\"Waterfall\"],\"teraTypes\":[\"Ground\"]},{\"role\":\"Tera Blast user\",\"movepool\":[\"Dragon Dance\",\"Earthquake\",\"Tera Blast\",\"Waterfall\"],\"teraTypes\":[\"Flying\"]}]},\"ditto\":{\"level\":88,\"sets\":[{\"role\":\"Fast Support\",\"movepool\":[\"Transform\"],\"teraTypes\":[\"Flying\",\"Dark\",\"Fire\",\"Bug\",\"Water\",\"Ice\",\"Fighting\",\"Electric\",\"Psychic\",\"Poison\",\"Grass\",\"Ghost\",\"Ground\",\"Rock\",\"Fairy\",\"Steel\",\"Normal\",\"Dragon\"]}]},\"vaporeon\":{\"level\":86,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Calm Mind\",\"Ice Beam\",\"Protect\",\"Surf\",\"Wish\"],\"teraTypes\":[\"Ghost\",\"Ground\"]}]},\"jolteon\":{\"level\":86,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Calm Mind\",\"Hyper Voice\",\"Shadow Ball\",\"Thunderbolt\",\"Volt Switch\"],\"teraTypes\":[\"Electric\",\"Ghost\"]},{\"role\":\"Tera Blast user\",\"movepool\":[\"Calm Mind\",\"Substitute\",\"Tera Blast\",\"Thunderbolt\"],\"teraTypes\":[\"Ice\"]}]},\"flareon\":{\"level\":86,\"sets\":[{\"role\":\"Wallbreaker\",\"movepool\":[\"Facade\",\"Flare Blitz\",\"Quick Attack\",\"Trailblaze\",\"Will-O-Wisp\"],\"teraTypes\":[\"Normal\"]}]},\"articuno\":{\"level\":88,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Air Slash\",\"Freeze-Dry\",\"Haze\",\"Hurricane\",\"Roost\",\"Substitute\",\"U-turn\"],\"teraTypes\":[\"Flying\",\"Steel\"]}]},\"articunogalar\":{\"level\":86,\"sets\":[{\"role\":\"Fast Bulky Setup\",\"movepool\":[\"Air Slash\",\"Calm Mind\",\"Freezing Glare\",\"Hurricane\",\"Recover\"],\"teraTypes\":[\"Psychic\",\"Steel\"]}]},\"zapdos\":{\"level\":82,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Discharge\",\"Heat Wave\",\"Hurricane\",\"Roost\",\"U-turn\"],\"teraTypes\":[\"Electric\"]}]},\"zapdosgalar\":{\"level\":82,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Brave Bird\",\"Bulk Up\",\"Close Combat\",\"Stomping Tantrum\",\"U-turn\"],\"teraTypes\":[\"Fighting\"]}]},\"moltres\":{\"level\":84,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Brave Bird\",\"Fire Blast\",\"Roost\",\"U-turn\",\"Will-O-Wisp\"],\"teraTypes\":[\"Fire\",\"Ground\"]}]},\"moltresgalar\":{\"level\":82,\"sets\":[{\"role\":\"Fast Bulky Setup\",\"movepool\":[\"Agility\",\"Fiery Wrath\",\"Hurricane\",\"Nasty Plot\",\"Rest\"],\"teraTypes\":[\"Dark\"]}]},\"dragonite\":{\"level\":80,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Dragon Dance\",\"Earthquake\",\"Extreme Speed\",\"Fire Punch\",\"Outrage\"],\"teraTypes\":[\"Normal\"]},{\"role\":\"Tera Blast user\",\"movepool\":[\"Dragon Dance\",\"Earthquake\",\"Outrage\",\"Tera Blast\"],\"teraTypes\":[\"Flying\"]}]},\"mewtwo\":{\"level\":72,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Aura Sphere\",\"Fire Blast\",\"Nasty Plot\",\"Psystrike\",\"Recover\",\"Shadow Ball\"],\"teraTypes\":[\"Psychic\",\"Fighting\",\"Fire\",\"Ghost\"]}]},\"mew\":{\"level\":80,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Psychic\",\"Spikes\",\"Stealth Rock\",\"Taunt\",\"Thunder Wave\",\"Toxic Spikes\",\"Will-O-Wisp\"],\"teraTypes\":[\"Steel\",\"Fairy\"]},{\"role\":\"Fast Attacker\",\"movepool\":[\"Brave Bird\",\"Close Combat\",\"Dragon Dance\",\"Flare Blitz\",\"Psychic Fangs\",\"Swords Dance\",\"U-turn\"],\"teraTypes\":[\"Fighting\",\"Fire\"]},{\"role\":\"Setup Sweeper\",\"movepool\":[\"Aura Sphere\",\"Dazzling Gleam\",\"Earth Power\",\"Fire Blast\",\"Nasty Plot\",\"Psyshock\",\"Shadow Ball\"],\"teraTypes\":[\"Psychic\",\"Fighting\",\"Fire\",\"Ghost\",\"Ground\",\"Fairy\"]}]},\"typhlosion\":{\"level\":88,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Eruption\",\"Flamethrower\",\"Focus Blast\",\"Overheat\"],\"teraTypes\":[\"Fire\"]}]},\"typhlosionhisui\":{\"level\":86,\"sets\":[{\"role\":\"Fast Bulky Setup\",\"movepool\":[\"Calm Mind\",\"Flamethrower\",\"Shadow Ball\",\"Substitute\",\"Will-O-Wisp\"],\"teraTypes\":[\"Ghost\"]},{\"role\":\"Fast Attacker\",\"movepool\":[\"Eruption\",\"Fire Blast\",\"Focus Blast\",\"Shadow Ball\"],\"teraTypes\":[\"Fire\",\"Ghost\"]}]},\"ampharos\":{\"level\":88,\"sets\":[{\"role\":\"Wallbreaker\",\"movepool\":[\"Agility\",\"Dazzling Gleam\",\"Focus Blast\",\"Thunderbolt\",\"Volt Switch\"],\"teraTypes\":[\"Electric\",\"Fairy\"]}]},\"azumarill\":{\"level\":82,\"sets\":[{\"role\":\"Bulky Setup\",\"movepool\":[\"Aqua Jet\",\"Belly Drum\",\"Liquidation\",\"Play Rough\"],\"teraTypes\":[\"Water\"]},{\"role\":\"Bulky Attacker\",\"movepool\":[\"Aqua Jet\",\"Ice Spinner\",\"Liquidation\",\"Play Rough\",\"Superpower\"],\"teraTypes\":[\"Water\"]}]},\"sudowoodo\":{\"level\":86,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Earthquake\",\"Head Smash\",\"Spikes\",\"Stealth Rock\",\"Sucker Punch\",\"Wood Hammer\"],\"teraTypes\":[\"Rock\",\"Grass\"]}]},\"jumpluff\":{\"level\":88,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Acrobatics\",\"Leech Seed\",\"Strength Sap\",\"Substitute\"],\"teraTypes\":[\"Steel\"]},{\"role\":\"Fast Support\",\"movepool\":[\"Acrobatics\",\"Encore\",\"Sleep Powder\",\"Strength Sap\",\"U-turn\"],\"teraTypes\":[\"Steel\"]}]},\"sunflora\":{\"level\":90,\"sets\":[{\"role\":\"Wallbreaker\",\"movepool\":[\"Dazzling Gleam\",\"Earth Power\",\"Leaf Storm\",\"Sludge Bomb\"],\"teraTypes\":[\"Grass\",\"Ground\",\"Fairy\",\"Poison\"]}]},\"quagsire\":{\"level\":84,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Earthquake\",\"Ice Beam\",\"Liquidation\",\"Recover\",\"Spikes\",\"Toxic\"],\"teraTypes\":[\"Poison\",\"Steel\",\"Ground\",\"Fairy\"]}]},\"clodsire\":{\"level\":80,\"sets\":[{\"role\":\"Bulky Setup\",\"movepool\":[\"Curse\",\"Earthquake\",\"Gunk Shot\",\"Recover\"],\"teraTypes\":[\"Ground\",\"Flying\"]},{\"role\":\"Bulky Support\",\"movepool\":[\"Earthquake\",\"Haze\",\"Poison Jab\",\"Recover\",\"Spikes\",\"Toxic\",\"Toxic Spikes\"],\"teraTypes\":[\"Ground\",\"Flying\",\"Steel\"]}]},\"espeon\":{\"level\":86,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Calm Mind\",\"Dazzling Gleam\",\"Morning Sun\",\"Psychic\",\"Shadow Ball\",\"Trick\"],\"teraTypes\":[\"Fairy\",\"Psychic\"]}]},\"umbreon\":{\"level\":86,\"sets\":[{\"role\":\"Bulky Setup\",\"movepool\":[\"Calm Mind\",\"Dark Pulse\",\"Protect\",\"Wish\"],\"teraTypes\":[\"Dark\",\"Poison\"]},{\"role\":\"Bulky Support\",\"movepool\":[\"Foul Play\",\"Protect\",\"Thunder Wave\",\"Wish\",\"Yawn\"],\"teraTypes\":[\"Poison\"]}]},\"slowking\":{\"level\":84,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Chilly Reception\",\"Psyshock\",\"Slack Off\",\"Surf\",\"Thunder Wave\"],\"teraTypes\":[\"Water\",\"Fairy\",\"Dragon\"]},{\"role\":\"Wallbreaker\",\"movepool\":[\"Fire Blast\",\"Hydro Pump\",\"Ice Beam\",\"Psychic\",\"Psyshock\",\"Trick\",\"Trick Room\"],\"teraTypes\":[\"Water\",\"Psychic\"]}]},\"slowkinggalar\":{\"level\":82,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Chilly Reception\",\"Fire Blast\",\"Psyshock\",\"Slack Off\",\"Sludge Bomb\",\"Thunder Wave\",\"Toxic\"],\"teraTypes\":[\"Poison\",\"Dark\"]},{\"role\":\"AV Pivot\",\"movepool\":[\"Fire Blast\",\"Future Sight\",\"Ice Beam\",\"Psyshock\",\"Sludge Bomb\"],\"teraTypes\":[\"Poison\",\"Psychic\"]}]},\"girafarig\":{\"level\":88,\"sets\":[{\"role\":\"Bulky Setup\",\"movepool\":[\"Dazzling Gleam\",\"Nasty Plot\",\"Psychic\",\"Psyshock\",\"Shadow Ball\",\"Thunderbolt\"],\"teraTypes\":[\"Psychic\",\"Fairy\",\"Electric\"]}]},\"forretress\":{\"level\":84,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Body Press\",\"Iron Head\",\"Rapid Spin\",\"Spikes\",\"Stealth Rock\",\"Volt Switch\"],\"teraTypes\":[\"Fighting\",\"Water\"]}]},\"dunsparce\":{\"level\":88,\"sets\":[{\"role\":\"Bulky Setup\",\"movepool\":[\"Body Slam\",\"Coil\",\"Earthquake\",\"Roost\"],\"teraTypes\":[\"Ground\"]}]},\"qwilfish\":{\"level\":86,\"sets\":[{\"role\":\"Fast Support\",\"movepool\":[\"Destiny Bond\",\"Gunk Shot\",\"Spikes\",\"Taunt\",\"Thunder Wave\",\"Toxic Spikes\",\"Waterfall\"],\"teraTypes\":[\"Water\",\"Dark\"]}]},\"qwilfishhisui\":{\"level\":86,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Crunch\",\"Gunk Shot\",\"Spikes\",\"Taunt\",\"Toxic Spikes\"],\"teraTypes\":[\"Poison\",\"Flying\"]}]},\"overqwil\":{\"level\":84,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Aqua Jet\",\"Crunch\",\"Gunk Shot\",\"Liquidation\",\"Swords Dance\"],\"teraTypes\":[\"Water\"]}]},\"scizor\":{\"level\":82,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Bullet Punch\",\"Close Combat\",\"Defog\",\"U-turn\"],\"teraTypes\":[\"Steel\"]},{\"role\":\"Setup Sweeper\",\"movepool\":[\"Bullet Punch\",\"Close Combat\",\"Pounce\",\"Swords Dance\"],\"teraTypes\":[\"Steel\"]}]},\"heracross\":{\"level\":82,\"sets\":[{\"role\":\"Setup Sweeper\",\"movepool\":[\"Close Combat\",\"Facade\",\"Swords Dance\",\"Throat Chop\"],\"teraTypes\":[\"Normal\"]},{\"role\":\"Fast Attacker\",\"movepool\":[\"Close Combat\",\"Earthquake\",\"Megahorn\",\"Stone Edge\",\"Throat Chop\"],\"teraTypes\":[\"Rock\",\"Bug\",\"Fighting\"]}]},\"ursaring\":{\"level\":88,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Body Slam\",\"Crunch\",\"Earthquake\",\"Rest\",\"Sleep Talk\"],\"teraTypes\":[\"Ground\",\"Normal\"]}]},\"delibird\":{\"level\":100,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Brave Bird\",\"Drill Run\",\"Ice Shard\",\"Ice Spinner\"],\"teraTypes\":[\"Ice\",\"Flying\",\"Ground\"]},{\"role\":\"Fast Support\",\"movepool\":[\"Freeze-Dry\",\"Memento\",\"Rapid Spin\",\"Spikes\"],\"teraTypes\":[\"Ice\",\"Ghost\"]}]},\"houndoom\":{\"level\":88,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Dark Pulse\",\"Fire Blast\",\"Flamethrower\",\"Nasty Plot\",\"Sludge Bomb\",\"Sucker Punch\"],\"teraTypes\":[\"Dark\",\"Fire\",\"Poison\"]}]},\"donphan\":{\"level\":86,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Earthquake\",\"Ice Spinner\",\"Knock Off\",\"Rapid Spin\",\"Stealth Rock\"],\"teraTypes\":[\"Dark\",\"Ground\"]},{\"role\":\"Bulky Attacker\",\"movepool\":[\"Earthquake\",\"Gunk Shot\",\"Ice Shard\",\"Ice Spinner\",\"Knock Off\",\"Rapid Spin\",\"Stone Edge\"],\"teraTypes\":[\"Ice\",\"Poison\",\"Dark\"]}]},\"blissey\":{\"level\":82,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Seismic Toss\",\"Soft-Boiled\",\"Stealth Rock\",\"Thunder Wave\"],\"teraTypes\":[\"Steel\",\"Fairy\",\"Ghost\",\"Poison\"]}]},\"tyranitar\":{\"level\":80,\"sets\":[{\"role\":\"Bulky Setup\",\"movepool\":[\"Crunch\",\"Dragon Dance\",\"Earthquake\",\"Fire Punch\",\"Stone Edge\"],\"teraTypes\":[\"Rock\",\"Ghost\"]},{\"role\":\"Bulky Support\",\"movepool\":[\"Crunch\",\"Earthquake\",\"Fire Blast\",\"Ice Beam\",\"Stealth Rock\",\"Stone Edge\",\"Taunt\"],\"teraTypes\":[\"Rock\"]}]},\"pelipper\":{\"level\":82,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Hurricane\",\"Hydro Pump\",\"Ice Beam\",\"Knock Off\",\"Roost\",\"Surf\",\"U-turn\"],\"teraTypes\":[\"Water\"]}]},\"gardevoir\":{\"level\":86,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Calm Mind\",\"Focus Blast\",\"Healing Wish\",\"Moonblast\",\"Mystical Fire\",\"Psychic\",\"Psyshock\",\"Trick\"],\"teraTypes\":[\"Fairy\",\"Fire\",\"Fighting\"]}]},\"masquerain\":{\"level\":88,\"sets\":[{\"role\":\"Setup Sweeper\",\"movepool\":[\"Bug Buzz\",\"Hurricane\",\"Hydro Pump\",\"Quiver Dance\"],\"teraTypes\":[\"Water\"]},{\"role\":\"Fast Support\",\"movepool\":[\"Bug Buzz\",\"Hurricane\",\"Hydro Pump\",\"Ice Beam\",\"Sticky Web\",\"Stun Spore\",\"U-turn\"],\"teraTypes\":[\"Flying\"]}]},\"breloom\":{\"level\":80,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Bullet Seed\",\"Close Combat\",\"Mach Punch\",\"Rock Tomb\",\"Spore\",\"Swords Dance\"],\"teraTypes\":[\"Fighting\"]}]},\"slaking\":{\"level\":86,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Body Slam\",\"Earthquake\",\"Fire Punch\",\"Giga Impact\",\"Hammer Arm\",\"Throat Chop\"],\"teraTypes\":[\"Normal\",\"Ground\"]}]},\"hariyama\":{\"level\":88,\"sets\":[{\"role\":\"Wallbreaker\",\"movepool\":[\"Bulk Up\",\"Bullet Punch\",\"Close Combat\",\"Facade\",\"Headlong Rush\",\"Knock Off\"],\"teraTypes\":[\"Normal\"]},{\"role\":\"AV Pivot\",\"movepool\":[\"Bullet Punch\",\"Close Combat\",\"Headlong Rush\",\"Heavy Slam\",\"Knock Off\"],\"teraTypes\":[\"Steel\"]}]},\"sableye\":{\"level\":88,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Encore\",\"Foul Play\",\"Knock Off\",\"Recover\",\"Taunt\",\"Thunder Wave\",\"Will-O-Wisp\"],\"teraTypes\":[\"Steel\"]}]},\"medicham\":{\"level\":86,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Bullet Punch\",\"Close Combat\",\"Ice Punch\",\"Poison Jab\",\"Zen Headbutt\"],\"teraTypes\":[\"Fighting\"]}]},\"swalot\":{\"level\":88,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Earthquake\",\"Encore\",\"Ice Beam\",\"Pain Split\",\"Protect\",\"Sludge Bomb\",\"Toxic\",\"Toxic Spikes\"],\"teraTypes\":[\"Dark\"]},{\"role\":\"Bulky Setup\",\"movepool\":[\"Earthquake\",\"Gunk Shot\",\"Seed Bomb\",\"Swords Dance\"],\"teraTypes\":[\"Poison\",\"Ground\"]}]},\"camerupt\":{\"level\":88,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Earthquake\",\"Lava Plume\",\"Stealth Rock\",\"Yawn\"],\"teraTypes\":[\"Water\"]}]},\"torkoal\":{\"level\":84,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Earthquake\",\"Lava Plume\",\"Rapid Spin\",\"Solar Beam\",\"Stealth Rock\",\"Yawn\"],\"teraTypes\":[\"Dragon\",\"Fire\"]}]},\"grumpig\":{\"level\":88,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Dazzling Gleam\",\"Earth Power\",\"Focus Blast\",\"Nasty Plot\",\"Psychic\",\"Psyshock\",\"Shadow Ball\",\"Trick\"],\"teraTypes\":[\"Psychic\",\"Fairy\",\"Ground\",\"Ghost\",\"Fighting\"]}]},\"cacturne\":{\"level\":88,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Dark Pulse\",\"Focus Blast\",\"Leaf Storm\",\"Sucker Punch\",\"Toxic Spikes\"],\"teraTypes\":[\"Dark\",\"Poison\",\"Grass\"]},{\"role\":\"Setup Sweeper\",\"movepool\":[\"Drain Punch\",\"Seed Bomb\",\"Sucker Punch\",\"Swords Dance\"],\"teraTypes\":[\"Dark\",\"Fighting\"]}]},\"altaria\":{\"level\":86,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Brave Bird\",\"Defog\",\"Earthquake\",\"Haze\",\"Roost\",\"Will-O-Wisp\"],\"teraTypes\":[\"Steel\"]},{\"role\":\"Bulky Setup\",\"movepool\":[\"Brave Bird\",\"Dragon Dance\",\"Earthquake\",\"Roost\"],\"teraTypes\":[\"Flying\",\"Ground\"]}]},\"zangoose\":{\"level\":86,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Close Combat\",\"Facade\",\"Night Slash\",\"Quick Attack\",\"Swords Dance\"],\"teraTypes\":[\"Normal\"]}]},\"seviper\":{\"level\":88,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Earthquake\",\"Flamethrower\",\"Giga Drain\",\"Glare\",\"Gunk Shot\",\"Switcheroo\"],\"teraTypes\":[\"Ground\",\"Fire\",\"Poison\",\"Grass\"]}]},\"whiscash\":{\"level\":88,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Earthquake\",\"Liquidation\",\"Spikes\",\"Stealth Rock\",\"Stone Edge\"],\"teraTypes\":[\"Ground\",\"Steel\"]},{\"role\":\"Setup Sweeper\",\"movepool\":[\"Dragon Dance\",\"Earthquake\",\"Liquidation\",\"Stone Edge\"],\"teraTypes\":[\"Ground\",\"Water\"]}]},\"banette\":{\"level\":88,\"sets\":[{\"role\":\"Wallbreaker\",\"movepool\":[\"Gunk Shot\",\"Knock Off\",\"Shadow Claw\",\"Shadow Sneak\",\"Swords Dance\",\"Thunder Wave\",\"Will-O-Wisp\"],\"teraTypes\":[\"Poison\",\"Dark\"]}]},\"tropius\":{\"level\":88,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Air Slash\",\"Leech Seed\",\"Protect\",\"Substitute\"],\"teraTypes\":[\"Steel\"]}]},\"glalie\":{\"level\":80,\"sets\":[{\"role\":\"Fast Support\",\"movepool\":[\"Disable\",\"Earthquake\",\"Freeze-Dry\",\"Protect\",\"Substitute\"],\"teraTypes\":[\"Poison\",\"Steel\",\"Water\"]}]},\"luvdisc\":{\"level\":100,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Charm\",\"Ice Beam\",\"Protect\",\"Surf\",\"Wish\"],\"teraTypes\":[\"Water\"]}]},\"salamence\":{\"level\":82,\"sets\":[{\"role\":\"Setup Sweeper\",\"movepool\":[\"Dragon Dance\",\"Dual Wingbeat\",\"Earthquake\",\"Outrage\",\"Roost\"],\"teraTypes\":[\"Flying\",\"Ground\",\"Dragon\"]}]},\"kyogre\":{\"level\":72,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Calm Mind\",\"Ice Beam\",\"Origin Pulse\",\"Thunder\",\"Water Spout\"],\"teraTypes\":[\"Water\"]}]},\"groudon\":{\"level\":74,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Lava Plume\",\"Precipice Blades\",\"Spikes\",\"Stealth Rock\",\"Stone Edge\",\"Thunder Wave\"],\"teraTypes\":[\"Ground\",\"Fire\"]},{\"role\":\"Bulky Setup\",\"movepool\":[\"Fire Punch\",\"Precipice Blades\",\"Stone Edge\",\"Swords Dance\",\"Thunder Wave\"],\"teraTypes\":[\"Ground\",\"Fire\"]}]},\"rayquaza\":{\"level\":72,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Dragon Ascent\",\"Dragon Dance\",\"Earthquake\",\"Extreme Speed\",\"Swords Dance\",\"U-turn\"],\"teraTypes\":[\"Flying\",\"Normal\"]}]},\"staraptor\":{\"level\":80,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Brave Bird\",\"Close Combat\",\"Double-Edge\",\"Quick Attack\",\"U-turn\"],\"teraTypes\":[\"Fighting\",\"Flying\"]}]},\"kricketune\":{\"level\":90,\"sets\":[{\"role\":\"Fast Support\",\"movepool\":[\"Brick Break\",\"Pounce\",\"Sticky Web\",\"Taunt\"],\"teraTypes\":[\"Bug\",\"Ghost\"]}]},\"luxray\":{\"level\":86,\"sets\":[{\"role\":\"Wallbreaker\",\"movepool\":[\"Crunch\",\"Facade\",\"Play Rough\",\"Trailblaze\",\"Wild Charge\"],\"teraTypes\":[\"Normal\"]},{\"role\":\"AV Pivot\",\"movepool\":[\"Crunch\",\"Ice Fang\",\"Play Rough\",\"Trailblaze\",\"Volt Switch\",\"Wild Charge\"],\"teraTypes\":[\"Electric\",\"Fairy\"]}]},\"vespiquen\":{\"level\":90,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Air Slash\",\"Roost\",\"Spikes\",\"Toxic\",\"Toxic Spikes\",\"U-turn\"],\"teraTypes\":[\"Steel\"]}]},\"pachirisu\":{\"level\":94,\"sets\":[{\"role\":\"Fast Support\",\"movepool\":[\"Nuzzle\",\"Super Fang\",\"Thunderbolt\",\"U-turn\"],\"teraTypes\":[\"Flying\"]}]},\"floatzel\":{\"level\":86,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Aqua Jet\",\"Crunch\",\"Ice Spinner\",\"Low Kick\",\"Wave Crash\"],\"teraTypes\":[\"Water\"]},{\"role\":\"Tera Blast user\",\"movepool\":[\"Bulk Up\",\"Ice Spinner\",\"Liquidation\",\"Tera Blast\"],\"teraTypes\":[\"Electric\",\"Grass\"]}]},\"gastrodon\":{\"level\":84,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Clear Smog\",\"Earthquake\",\"Ice Beam\",\"Recover\",\"Stealth Rock\",\"Surf\"],\"teraTypes\":[\"Ground\",\"Steel\",\"Poison\"]}]},\"drifblim\":{\"level\":86,\"sets\":[{\"role\":\"Fast Support\",\"movepool\":[\"Air Slash\",\"Defog\",\"Shadow Ball\",\"Strength Sap\",\"Will-O-Wisp\"],\"teraTypes\":[\"Ghost\",\"Fairy\"]},{\"role\":\"Fast Bulky Setup\",\"movepool\":[\"Air Slash\",\"Calm Mind\",\"Shadow Ball\",\"Strength Sap\"],\"teraTypes\":[\"Ghost\",\"Fairy\"]}]},\"mismagius\":{\"level\":86,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Dazzling Gleam\",\"Energy Ball\",\"Mystical Fire\",\"Nasty Plot\",\"Shadow Ball\",\"Thunderbolt\",\"Trick\"],\"teraTypes\":[\"Ghost\",\"Fire\",\"Fairy\",\"Electric\"]}]},\"honchkrow\":{\"level\":86,\"sets\":[{\"role\":\"Wallbreaker\",\"movepool\":[\"Brave Bird\",\"Heat Wave\",\"Sucker Punch\",\"U-turn\"],\"teraTypes\":[\"Dark\",\"Flying\"]}]},\"skuntank\":{\"level\":88,\"sets\":[{\"role\":\"Fast Support\",\"movepool\":[\"Crunch\",\"Fire Blast\",\"Gunk Shot\",\"Sucker Punch\",\"Taunt\",\"Toxic Spikes\"],\"teraTypes\":[\"Dark\",\"Poison\"]}]},\"bronzong\":{\"level\":88,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Earthquake\",\"Hypnosis\",\"Iron Head\",\"Light Screen\",\"Psychic\",\"Reflect\",\"Stealth Rock\"],\"teraTypes\":[\"Water\",\"Electric\"]}]},\"spiritomb\":{\"level\":86,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Foul Play\",\"Pain Split\",\"Shadow Sneak\",\"Sucker Punch\",\"Will-O-Wisp\"],\"teraTypes\":[\"Dark\"]},{\"role\":\"Bulky Setup\",\"movepool\":[\"Calm Mind\",\"Dark Pulse\",\"Rest\",\"Sleep Talk\"],\"teraTypes\":[\"Dark\"]}]},\"garchomp\":{\"level\":80,\"sets\":[{\"role\":\"Fast Support\",\"movepool\":[\"Draco Meteor\",\"Earthquake\",\"Fire Blast\",\"Stealth Rock\",\"Stone Edge\"],\"teraTypes\":[\"Ground\",\"Steel\"]},{\"role\":\"Fast Attacker\",\"movepool\":[\"Earthquake\",\"Fire Fang\",\"Outrage\",\"Stone Edge\",\"Swords Dance\"],\"teraTypes\":[\"Ground\",\"Dragon\"]}]},\"lucario\":{\"level\":82,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Close Combat\",\"Extreme Speed\",\"Meteor Mash\",\"Stone Edge\",\"Swords Dance\"],\"teraTypes\":[\"Normal\",\"Fighting\",\"Steel\"]},{\"role\":\"Setup Sweeper\",\"movepool\":[\"Aura Sphere\",\"Dark Pulse\",\"Flash Cannon\",\"Focus Blast\",\"Nasty Plot\",\"Vacuum Wave\"],\"teraTypes\":[\"Fighting\"]}]},\"hippowdon\":{\"level\":82,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Earthquake\",\"Slack Off\",\"Stealth Rock\",\"Stone Edge\",\"Whirlwind\",\"Yawn\"],\"teraTypes\":[\"Fairy\",\"Rock\"]}]},\"toxicroak\":{\"level\":84,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Close Combat\",\"Gunk Shot\",\"Ice Punch\",\"Sucker Punch\",\"Swords Dance\"],\"teraTypes\":[\"Dark\",\"Fighting\"]},{\"role\":\"Setup Sweeper\",\"movepool\":[\"Dark Pulse\",\"Focus Blast\",\"Nasty Plot\",\"Sludge Bomb\",\"Vacuum Wave\"],\"teraTypes\":[\"Dark\",\"Fighting\",\"Poison\"]}]},\"lumineon\":{\"level\":88,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Dazzling Gleam\",\"Encore\",\"Hydro Pump\",\"Ice Beam\",\"U-turn\"],\"teraTypes\":[\"Water\",\"Fairy\"]}]},\"abomasnow\":{\"level\":88,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Aurora Veil\",\"Blizzard\",\"Earthquake\",\"Ice Shard\",\"Wood Hammer\"],\"teraTypes\":[\"Ice\"]}]},\"weavile\":{\"level\":84,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Ice Shard\",\"Ice Spinner\",\"Low Kick\",\"Night Slash\",\"Swords Dance\"],\"teraTypes\":[\"Ice\",\"Fighting\"]}]},\"sneasler\":{\"level\":80,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Close Combat\",\"Dire Claw\",\"Gunk Shot\",\"Night Slash\",\"U-turn\"],\"teraTypes\":[\"Dark\",\"Fighting\"]},{\"role\":\"Setup Sweeper\",\"movepool\":[\"Acrobatics\",\"Close Combat\",\"Gunk Shot\",\"Swords Dance\"],\"teraTypes\":[\"Flying\"]}]},\"magnezone\":{\"level\":84,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Body Press\",\"Flash Cannon\",\"Mirror Coat\",\"Steel Beam\",\"Thunderbolt\",\"Volt Switch\"],\"teraTypes\":[\"Electric\",\"Water\",\"Flying\"]},{\"role\":\"Tera Blast user\",\"movepool\":[\"Flash Cannon\",\"Tera Blast\",\"Thunderbolt\",\"Volt Switch\"],\"teraTypes\":[\"Fire\"]}]},\"leafeon\":{\"level\":86,\"sets\":[{\"role\":\"Setup Sweeper\",\"movepool\":[\"Double-Edge\",\"Leaf Blade\",\"Substitute\",\"Swords Dance\",\"Synthesis\",\"X-Scissor\"],\"teraTypes\":[\"Normal\"]}]},\"glaceon\":{\"level\":88,\"sets\":[{\"role\":\"Bulky Setup\",\"movepool\":[\"Calm Mind\",\"Freeze-Dry\",\"Protect\",\"Wish\"],\"teraTypes\":[\"Water\"]}]},\"gallade\":{\"level\":84,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Leaf Blade\",\"Night Slash\",\"Psycho Cut\",\"Sacred Sword\",\"Swords Dance\"],\"teraTypes\":[\"Fighting\",\"Grass\",\"Dark\"]}]},\"froslass\":{\"level\":86,\"sets\":[{\"role\":\"Fast Support\",\"movepool\":[\"Destiny Bond\",\"Ice Beam\",\"Shadow Ball\",\"Spikes\",\"Taunt\",\"Will-O-Wisp\"],\"teraTypes\":[\"Ghost\"]}]},\"rotom\":{\"level\":86,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Nasty Plot\",\"Shadow Ball\",\"Thunderbolt\",\"Trick\",\"Volt Switch\",\"Will-O-Wisp\"],\"teraTypes\":[\"Ghost\",\"Electric\"]}]},\"rotomwash\":{\"level\":82,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Discharge\",\"Hydro Pump\",\"Nasty Plot\",\"Trick\",\"Volt Switch\",\"Will-O-Wisp\"],\"teraTypes\":[\"Water\",\"Electric\"]}]},\"rotomheat\":{\"level\":82,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Nasty Plot\",\"Overheat\",\"Thunderbolt\",\"Trick\",\"Volt Switch\",\"Will-O-Wisp\"],\"teraTypes\":[\"Fire\",\"Electric\"]}]},\"rotomfrost\":{\"level\":86,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Blizzard\",\"Nasty Plot\",\"Thunderbolt\",\"Volt Switch\",\"Will-O-Wisp\"],\"teraTypes\":[\"Electric\"]}]},\"rotomfan\":{\"level\":86,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Air Slash\",\"Nasty Plot\",\"Thunderbolt\",\"Volt Switch\",\"Will-O-Wisp\"],\"teraTypes\":[\"Electric\"]}]},\"rotommow\":{\"level\":84,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Leaf Storm\",\"Nasty Plot\",\"Thunderbolt\",\"Trick\",\"Volt Switch\",\"Will-O-Wisp\"],\"teraTypes\":[\"Grass\",\"Electric\"]}]},\"uxie\":{\"level\":88,\"sets\":[{\"role\":\"Fast Support\",\"movepool\":[\"Encore\",\"Light Screen\",\"Psychic\",\"Reflect\",\"Stealth Rock\",\"Thunder Wave\",\"U-turn\",\"Yawn\"],\"teraTypes\":[\"Steel\",\"Electric\"]}]},\"mesprit\":{\"level\":86,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Dazzling Gleam\",\"Energy Ball\",\"Healing Wish\",\"Ice Beam\",\"Nasty Plot\",\"Psychic\",\"Thunderbolt\",\"Trick\",\"U-turn\"],\"teraTypes\":[\"Psychic\",\"Fairy\",\"Electric\"]}]},\"azelf\":{\"level\":82,\"sets\":[{\"role\":\"Fast Support\",\"movepool\":[\"Explosion\",\"Fire Blast\",\"Psychic\",\"Stealth Rock\",\"Taunt\",\"U-turn\"],\"teraTypes\":[\"Psychic\",\"Fire\"]},{\"role\":\"Fast Attacker\",\"movepool\":[\"Dazzling Gleam\",\"Energy Ball\",\"Fire Blast\",\"Nasty Plot\",\"Psychic\",\"Psyshock\",\"Trick\",\"U-turn\"],\"teraTypes\":[\"Psychic\",\"Fairy\",\"Fire\"]}]},\"dialga\":{\"level\":76,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Draco Meteor\",\"Fire Blast\",\"Flash Cannon\",\"Stealth Rock\",\"Thunder Wave\",\"Thunderbolt\",\"Trick\"],\"teraTypes\":[\"Dragon\",\"Steel\",\"Fire\"]}]},\"dialgaorigin\":{\"level\":76,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Draco Meteor\",\"Fire Blast\",\"Flash Cannon\",\"Stealth Rock\",\"Thunder Wave\",\"Thunderbolt\"],\"teraTypes\":[\"Dragon\",\"Steel\",\"Fire\"]}]},\"palkia\":{\"level\":76,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Draco Meteor\",\"Fire Blast\",\"Hydro Pump\",\"Spacial Rend\",\"Thunder Wave\"],\"teraTypes\":[\"Dragon\",\"Water\"]}]},\"palkiaorigin\":{\"level\":76,\"sets\":[{\"role\":\"Wallbreaker\",\"movepool\":[\"Draco Meteor\",\"Fire Blast\",\"Hydro Pump\",\"Spacial Rend\"],\"teraTypes\":[\"Dragon\",\"Water\"]}]},\"heatran\":{\"level\":80,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Earth Power\",\"Flash Cannon\",\"Lava Plume\",\"Magma Storm\",\"Stealth Rock\"],\"teraTypes\":[\"Flying\",\"Grass\",\"Fire\",\"Steel\"]}]},\"giratina\":{\"level\":76,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Dragon Tail\",\"Rest\",\"Shadow Ball\",\"Sleep Talk\",\"Will-O-Wisp\"],\"teraTypes\":[\"Ghost\"]},{\"role\":\"Bulky Setup\",\"movepool\":[\"Calm Mind\",\"Dragon Pulse\",\"Rest\",\"Sleep Talk\"],\"teraTypes\":[\"Dragon\"]}]},\"giratinaorigin\":{\"level\":76,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Defog\",\"Draco Meteor\",\"Dragon Tail\",\"Earthquake\",\"Outrage\",\"Shadow Ball\",\"Shadow Sneak\",\"Will-O-Wisp\"],\"teraTypes\":[\"Dragon\",\"Ghost\"]}]},\"cresselia\":{\"level\":84,\"sets\":[{\"role\":\"Bulky Setup\",\"movepool\":[\"Calm Mind\",\"Moonblast\",\"Moonlight\",\"Psychic\",\"Psyshock\",\"Thunderbolt\"],\"teraTypes\":[\"Fairy\",\"Electric\",\"Poison\",\"Steel\"]}]},\"arceus\":{\"level\":70,\"sets\":[{\"role\":\"Setup Sweeper\",\"movepool\":[\"Earthquake\",\"Extreme Speed\",\"Recover\",\"Shadow Claw\",\"Swords Dance\"],\"teraTypes\":[\"Normal\"]}]},\"arceusbug\":{\"level\":72,\"sets\":[{\"role\":\"Setup Sweeper\",\"movepool\":[\"Calm Mind\",\"Earth Power\",\"Fire Blast\",\"Judgment\",\"Recover\"],\"teraTypes\":[\"Ground\"]}]},\"arceusdark\":{\"level\":70,\"sets\":[{\"role\":\"Bulky Setup\",\"movepool\":[\"Calm Mind\",\"Fire Blast\",\"Judgment\",\"Recover\",\"Sludge Bomb\"],\"teraTypes\":[\"Dark\"]}]},\"arceusdragon\":{\"level\":70,\"sets\":[{\"role\":\"Setup Sweeper\",\"movepool\":[\"Earthquake\",\"Extreme Speed\",\"Gunk Shot\",\"Outrage\",\"Swords Dance\"],\"teraTypes\":[\"Dragon\"]}]},\"arceuselectric\":{\"level\":70,\"sets\":[{\"role\":\"Bulky Setup\",\"movepool\":[\"Calm Mind\",\"Ice Beam\",\"Judgment\",\"Recover\"],\"teraTypes\":[\"Electric\",\"Ice\"]}]},\"arceusfairy\":{\"level\":70,\"sets\":[{\"role\":\"Bulky Setup\",\"movepool\":[\"Calm Mind\",\"Earth Power\",\"Fire Blast\",\"Judgment\",\"Recover\"],\"teraTypes\":[\"Fairy\"]}]},\"arceusfighting\":{\"level\":70,\"sets\":[{\"role\":\"Bulky Setup\",\"movepool\":[\"Body Press\",\"Cosmic Power\",\"Recover\",\"Stored Power\"],\"teraTypes\":[\"Steel\"]}]},\"arceusfire\":{\"level\":72,\"sets\":[{\"role\":\"Setup Sweeper\",\"movepool\":[\"Earthquake\",\"Extreme Speed\",\"Flare Blitz\",\"Liquidation\",\"Recover\",\"Swords Dance\"],\"teraTypes\":[\"Fire\"]}]},\"arceusflying\":{\"level\":72,\"sets\":[{\"role\":\"Bulky Setup\",\"movepool\":[\"Calm Mind\",\"Earth Power\",\"Fire Blast\",\"Judgment\",\"Recover\"],\"teraTypes\":[\"Flying\",\"Ground\"]}]},\"arceusghost\":{\"level\":70,\"sets\":[{\"role\":\"Bulky Setup\",\"movepool\":[\"Calm Mind\",\"Focus Blast\",\"Judgment\",\"Recover\"],\"teraTypes\":[\"Ghost\"]}]},\"arceusgrass\":{\"level\":72,\"sets\":[{\"role\":\"Bulky Setup\",\"movepool\":[\"Calm Mind\",\"Earth Power\",\"Fire Blast\",\"Judgment\",\"Recover\"],\"teraTypes\":[\"Grass\"]}]},\"arceusground\":{\"level\":70,\"sets\":[{\"role\":\"Bulky Setup\",\"movepool\":[\"Calm Mind\",\"Fire Blast\",\"Ice Beam\",\"Judgment\",\"Recover\"],\"teraTypes\":[\"Ground\"]}]},\"arceusice\":{\"level\":72,\"sets\":[{\"role\":\"Bulky Setup\",\"movepool\":[\"Calm Mind\",\"Earth Power\",\"Judgment\",\"Recover\",\"Thunderbolt\"],\"teraTypes\":[\"Electric\",\"Ice\"]}]},\"arceuspoison\":{\"level\":72,\"sets\":[{\"role\":\"Setup Sweeper\",\"movepool\":[\"Earthquake\",\"Flare Blitz\",\"Gunk Shot\",\"Liquidation\",\"Recover\",\"Swords Dance\"],\"teraTypes\":[\"Poison\"]}]},\"arceuspsychic\":{\"level\":70,\"sets\":[{\"role\":\"Bulky Setup\",\"movepool\":[\"Body Press\",\"Cosmic Power\",\"Recover\",\"Stored Power\"],\"teraTypes\":[\"Steel\"]}]},\"arceusrock\":{\"level\":70,\"sets\":[{\"role\":\"Bulky Setup\",\"movepool\":[\"Calm Mind\",\"Earth Power\",\"Fire Blast\",\"Ice Beam\",\"Judgment\",\"Recover\"],\"teraTypes\":[\"Ground\",\"Rock\"]}]},\"arceussteel\":{\"level\":70,\"sets\":[{\"role\":\"Setup Sweeper\",\"movepool\":[\"Calm Mind\",\"Earth Power\",\"Judgment\",\"Recover\",\"Will-O-Wisp\"],\"teraTypes\":[\"Ghost\"]}]},\"arceuswater\":{\"level\":70,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Judgment\",\"Recover\",\"Taunt\",\"Will-O-Wisp\"],\"teraTypes\":[\"Steel\"]}]},\"samurott\":{\"level\":88,\"sets\":[{\"role\":\"AV Pivot\",\"movepool\":[\"Grass Knot\",\"Hydro Pump\",\"Ice Beam\",\"Knock Off\",\"Megahorn\",\"Sacred Sword\"],\"teraTypes\":[\"Water\",\"Dark\"]},{\"role\":\"Fast Attacker\",\"movepool\":[\"Aqua Jet\",\"Knock Off\",\"Liquidation\",\"Megahorn\",\"Sacred Sword\",\"Swords Dance\"],\"teraTypes\":[\"Water\",\"Dark\"]}]},\"samurotthisui\":{\"level\":86,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Aqua Jet\",\"Ceaseless Edge\",\"Razor Shell\",\"Sucker Punch\",\"Swords Dance\",\"X-Scissor\"],\"teraTypes\":[\"Water\",\"Dark\"]}]},\"lilligant\":{\"level\":86,\"sets\":[{\"role\":\"Tera Blast user\",\"movepool\":[\"Giga Drain\",\"Pollen Puff\",\"Quiver Dance\",\"Sleep Powder\",\"Tera Blast\"],\"teraTypes\":[\"Fire\"]},{\"role\":\"Setup Sweeper\",\"movepool\":[\"Petal Dance\",\"Pollen Puff\",\"Quiver Dance\",\"Sleep Powder\"],\"teraTypes\":[\"Grass\"]}]},\"lilliganthisui\":{\"level\":80,\"sets\":[{\"role\":\"Setup Sweeper\",\"movepool\":[\"Close Combat\",\"Ice Spinner\",\"Leaf Blade\",\"Sleep Powder\",\"Victory Dance\"],\"teraTypes\":[\"Fighting\"]},{\"role\":\"Fast Support\",\"movepool\":[\"Close Combat\",\"Defog\",\"Ice Spinner\",\"Leaf Blade\",\"Sleep Powder\"],\"teraTypes\":[\"Fighting\"]}]},\"basculin\":{\"level\":86,\"sets\":[{\"role\":\"Wallbreaker\",\"movepool\":[\"Aqua Jet\",\"Crunch\",\"Head Smash\",\"Psychic Fangs\",\"Wave Crash\"],\"teraTypes\":[\"Water\"]}]},\"basculinbluestriped\":{\"level\":86,\"sets\":[{\"role\":\"Wallbreaker\",\"movepool\":[\"Aqua Jet\",\"Crunch\",\"Head Smash\",\"Psychic Fangs\",\"Wave Crash\"],\"teraTypes\":[\"Water\"]}]},\"basculegion\":{\"level\":76,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Agility\",\"Aqua Jet\",\"Last Respects\",\"Psychic Fangs\",\"Wave Crash\"],\"teraTypes\":[\"Ghost\"]}]},\"basculegionf\":{\"level\":76,\"sets\":[{\"role\":\"Wallbreaker\",\"movepool\":[\"Agility\",\"Hydro Pump\",\"Ice Beam\",\"Last Respects\"],\"teraTypes\":[\"Ghost\"]}]},\"krookodile\":{\"level\":82,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Bulk Up\",\"Close Combat\",\"Crunch\",\"Earthquake\",\"Stealth Rock\",\"Stone Edge\"],\"teraTypes\":[\"Fighting\",\"Ground\"]}]},\"zoroark\":{\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Dark Pulse\",\"Flamethrower\",\"Focus Blast\",\"Nasty Plot\",\"Sludge Bomb\",\"Trick\",\"U-turn\"],\"teraTypes\":[\"Poison\"]}]},\"zoroarkhisui\":{\"sets\":[{\"role\":\"Wallbreaker\",\"movepool\":[\"Bitter Malice\",\"Flamethrower\",\"Focus Blast\",\"Hyper Voice\",\"Nasty Plot\",\"Shadow Ball\",\"Trick\",\"U-turn\"],\"teraTypes\":[\"Normal\"]}]},\"gothitelle\":{\"level\":82,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Nasty Plot\",\"Psychic\",\"Shadow Ball\",\"Thunderbolt\",\"Trick\"],\"teraTypes\":[\"Psychic\",\"Ghost\",\"Electric\"]}]},\"sawsbuck\":{\"level\":88,\"sets\":[{\"role\":\"Setup Sweeper\",\"movepool\":[\"Double-Edge\",\"Headbutt\",\"Horn Leech\",\"Stomping Tantrum\",\"Swords Dance\"],\"teraTypes\":[\"Normal\"]}]},\"amoonguss\":{\"level\":80,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Clear Smog\",\"Giga Drain\",\"Sludge Bomb\",\"Spore\",\"Toxic\"],\"teraTypes\":[\"Steel\",\"Water\"]}]},\"alomomola\":{\"level\":84,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Body Slam\",\"Liquidation\",\"Mirror Coat\",\"Protect\",\"Wish\"],\"teraTypes\":[\"Steel\"]}]},\"eelektross\":{\"level\":86,\"sets\":[{\"role\":\"Bulky Setup\",\"movepool\":[\"Close Combat\",\"Coil\",\"Fire Punch\",\"Liquidation\",\"Wild Charge\"],\"teraTypes\":[\"Electric\"]},{\"role\":\"AV Pivot\",\"movepool\":[\"Close Combat\",\"Flamethrower\",\"Giga Drain\",\"Thunderbolt\",\"U-turn\"],\"teraTypes\":[\"Electric\"]}]},\"haxorus\":{\"level\":82,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Close Combat\",\"Dragon Dance\",\"Earthquake\",\"Outrage\",\"Poison Jab\",\"Swords Dance\"],\"teraTypes\":[\"Fighting\",\"Ground\"]}]},\"beartic\":{\"level\":88,\"sets\":[{\"role\":\"Wallbreaker\",\"movepool\":[\"Aqua Jet\",\"Close Combat\",\"Earthquake\",\"Icicle Crash\",\"Snowscape\",\"Swords Dance\"],\"teraTypes\":[\"Fighting\",\"Ice\",\"Ground\"]}]},\"cryogonal\":{\"level\":86,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Flash Cannon\",\"Freeze-Dry\",\"Haze\",\"Rapid Spin\",\"Recover\"],\"teraTypes\":[\"Steel\"]}]},\"braviary\":{\"level\":86,\"sets\":[{\"role\":\"Fast Bulky Setup\",\"movepool\":[\"Brave Bird\",\"Bulk Up\",\"Close Combat\",\"Roost\"],\"teraTypes\":[\"Flying\",\"Fighting\"]}]},\"braviaryhisui\":{\"level\":80,\"sets\":[{\"role\":\"Fast Support\",\"movepool\":[\"Calm Mind\",\"Defog\",\"Heat Wave\",\"Hurricane\",\"Psychic\"],\"teraTypes\":[\"Psychic\",\"Flying\"]},{\"role\":\"Wallbreaker\",\"movepool\":[\"Calm Mind\",\"Esper Wing\",\"Heat Wave\",\"Hurricane\",\"U-turn\"],\"teraTypes\":[\"Psychic\",\"Flying\"]}]},\"hydreigon\":{\"level\":82,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Dark Pulse\",\"Draco Meteor\",\"Fire Blast\",\"Flash Cannon\",\"Nasty Plot\",\"U-turn\"],\"teraTypes\":[\"Dark\",\"Dragon\",\"Fire\",\"Steel\"]}]},\"volcarona\":{\"level\":80,\"sets\":[{\"role\":\"Fast Bulky Setup\",\"movepool\":[\"Bug Buzz\",\"Fiery Dance\",\"Fire Blast\",\"Giga Drain\",\"Morning Sun\",\"Quiver Dance\"],\"teraTypes\":[\"Fire\",\"Grass\",\"Water\"]}]},\"tornadus\":{\"level\":82,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Bleakwind Storm\",\"Focus Blast\",\"Grass Knot\",\"Heat Wave\",\"Nasty Plot\",\"U-turn\"],\"teraTypes\":[\"Flying\",\"Fire\"]}]},\"tornadustherian\":{\"level\":80,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Bleakwind Storm\",\"Focus Blast\",\"Grass Knot\",\"Heat Wave\",\"Nasty Plot\",\"U-turn\"],\"teraTypes\":[\"Flying\",\"Fire\"]}]},\"thundurus\":{\"level\":80,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Focus Blast\",\"Grass Knot\",\"Nasty Plot\",\"Sludge Bomb\",\"Taunt\",\"Thunder Wave\",\"Thunderbolt\",\"U-turn\"],\"teraTypes\":[\"Electric\",\"Grass\"]},{\"role\":\"Tera Blast user\",\"movepool\":[\"Focus Blast\",\"Nasty Plot\",\"Tera Blast\",\"Thunderbolt\"],\"teraTypes\":[\"Flying\"]}]},\"thundurustherian\":{\"level\":80,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Focus Blast\",\"Grass Knot\",\"Nasty Plot\",\"Psychic\",\"Sludge Bomb\",\"Thunderbolt\",\"Volt Switch\"],\"teraTypes\":[\"Electric\",\"Psychic\",\"Poison\"]},{\"role\":\"Tera Blast user\",\"movepool\":[\"Focus Blast\",\"Nasty Plot\",\"Tera Blast\",\"Thunderbolt\"],\"teraTypes\":[\"Flying\"]}]},\"landorus\":{\"level\":76,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Earth Power\",\"Focus Blast\",\"Nasty Plot\",\"Psychic\",\"Rock Slide\",\"Sludge Bomb\",\"Stealth Rock\"],\"teraTypes\":[\"Ground\",\"Psychic\",\"Poison\"]}]},\"landorustherian\":{\"level\":80,\"sets\":[{\"role\":\"Fast Support\",\"movepool\":[\"Earthquake\",\"Stealth Rock\",\"Stone Edge\",\"Taunt\",\"U-turn\"],\"teraTypes\":[\"Ground\"]},{\"role\":\"Tera Blast user\",\"movepool\":[\"Earthquake\",\"Stone Edge\",\"Swords Dance\",\"Tera Blast\"],\"teraTypes\":[\"Flying\"]}]},\"meloetta\":{\"level\":86,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Calm Mind\",\"Focus Blast\",\"Hyper Voice\",\"Psyshock\",\"U-turn\"],\"teraTypes\":[\"Normal\",\"Psychic\",\"Fighting\"]}]},\"chesnaught\":{\"level\":84,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Body Press\",\"Leech Seed\",\"Spikes\",\"Spiky Shield\",\"Synthesis\",\"Wood Hammer\"],\"teraTypes\":[\"Steel\",\"Water\"]},{\"role\":\"Bulky Setup\",\"movepool\":[\"Body Press\",\"Iron Defense\",\"Synthesis\",\"Trailblaze\"],\"teraTypes\":[\"Steel\"]}]},\"delphox\":{\"level\":86,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Fire Blast\",\"Grass Knot\",\"Nasty Plot\",\"Psyshock\",\"Switcheroo\"],\"teraTypes\":[\"Fire\",\"Psychic\"]}]},\"greninja\":{\"level\":80,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Dark Pulse\",\"Grass Knot\",\"Gunk Shot\",\"Hydro Pump\",\"Ice Beam\",\"Toxic Spikes\",\"U-turn\"],\"teraTypes\":[\"Water\",\"Dark\",\"Poison\"]}]},\"talonflame\":{\"level\":84,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Brave Bird\",\"Defog\",\"Overheat\",\"Roost\",\"Taunt\",\"U-turn\",\"Will-O-Wisp\"],\"teraTypes\":[\"Water\",\"Ground\"]},{\"role\":\"Tera Blast user\",\"movepool\":[\"Brave Bird\",\"Flare Blitz\",\"Swords Dance\",\"Tera Blast\"],\"teraTypes\":[\"Ground\"]}]},\"vivillon\":{\"level\":86,\"sets\":[{\"role\":\"Fast Bulky Setup\",\"movepool\":[\"Bug Buzz\",\"Energy Ball\",\"Hurricane\",\"Quiver Dance\",\"Sleep Powder\",\"Substitute\"],\"teraTypes\":[\"Flying\"]},{\"role\":\"Tera Blast user\",\"movepool\":[\"Hurricane\",\"Quiver Dance\",\"Sleep Powder\",\"Substitute\",\"Tera Blast\"],\"teraTypes\":[\"Ground\"]}]},\"pyroar\":{\"level\":88,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Dark Pulse\",\"Fire Blast\",\"Hyper Voice\",\"Will-O-Wisp\",\"Work Up\"],\"teraTypes\":[\"Fire\"]}]},\"florges\":{\"level\":86,\"sets\":[{\"role\":\"Bulky Setup\",\"movepool\":[\"Calm Mind\",\"Moonblast\",\"Protect\",\"Wish\"],\"teraTypes\":[\"Fairy\",\"Steel\"]}]},\"gogoat\":{\"level\":88,\"sets\":[{\"role\":\"Bulky Setup\",\"movepool\":[\"Bulk Up\",\"Earthquake\",\"Horn Leech\",\"Milk Drink\"],\"teraTypes\":[\"Ground\"]}]},\"dragalge\":{\"level\":84,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Draco Meteor\",\"Focus Blast\",\"Sludge Bomb\",\"Thunderbolt\",\"Toxic\",\"Toxic Spikes\"],\"teraTypes\":[\"Dragon\",\"Poison\"]}]},\"clawitzer\":{\"level\":86,\"sets\":[{\"role\":\"Wallbreaker\",\"movepool\":[\"Aura Sphere\",\"Dark Pulse\",\"Dragon Pulse\",\"U-turn\",\"Water Pulse\"],\"teraTypes\":[\"Dark\",\"Dragon\",\"Fighting\"]}]},\"sylveon\":{\"level\":82,\"sets\":[{\"role\":\"Bulky Setup\",\"movepool\":[\"Calm Mind\",\"Hyper Voice\",\"Protect\",\"Wish\"],\"teraTypes\":[\"Fairy\",\"Steel\"]},{\"role\":\"Tera Blast user\",\"movepool\":[\"Calm Mind\",\"Hyper Voice\",\"Tera Blast\",\"Trailblaze\"],\"teraTypes\":[\"Ground\"]}]},\"hawlucha\":{\"level\":82,\"sets\":[{\"role\":\"Setup Sweeper\",\"movepool\":[\"Acrobatics\",\"Brave Bird\",\"Close Combat\",\"Stone Edge\",\"Swords Dance\"],\"teraTypes\":[\"Fighting\",\"Flying\"]}]},\"dedenne\":{\"level\":88,\"sets\":[{\"role\":\"Fast Support\",\"movepool\":[\"Dazzling Gleam\",\"Nuzzle\",\"Super Fang\",\"Thunderbolt\",\"U-turn\"],\"teraTypes\":[\"Electric\"]}]},\"carbink\":{\"level\":88,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Body Press\",\"Moonblast\",\"Power Gem\",\"Spikes\",\"Stealth Rock\"],\"teraTypes\":[\"Fighting\"]},{\"role\":\"Bulky Support\",\"movepool\":[\"Body Press\",\"Light Screen\",\"Moonblast\",\"Reflect\",\"Stealth Rock\"],\"teraTypes\":[\"Fighting\"]}]},\"goodra\":{\"level\":86,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Draco Meteor\",\"Earthquake\",\"Fire Blast\",\"Power Whip\",\"Sludge Bomb\",\"Thunderbolt\"],\"teraTypes\":[\"Dragon\",\"Ground\",\"Fire\",\"Grass\",\"Poison\",\"Electric\"]}]},\"goodrahisui\":{\"level\":86,\"sets\":[{\"role\":\"AV Pivot\",\"movepool\":[\"Draco Meteor\",\"Dragon Tail\",\"Earthquake\",\"Fire Blast\",\"Heavy Slam\",\"Hydro Pump\",\"Thunderbolt\"],\"teraTypes\":[\"Dragon\",\"Ground\",\"Fire\",\"Steel\",\"Water\",\"Electric\"]},{\"role\":\"Bulky Setup\",\"movepool\":[\"Body Press\",\"Curse\",\"Heavy Slam\",\"Rest\"],\"teraTypes\":[\"Fighting\"]}]},\"klefki\":{\"level\":84,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Foul Play\",\"Magnet Rise\",\"Play Rough\",\"Spikes\",\"Thunder Wave\"],\"teraTypes\":[\"Water\"]}]},\"avalugg\":{\"level\":86,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Avalanche\",\"Body Press\",\"Curse\",\"Rapid Spin\",\"Recover\"],\"teraTypes\":[\"Fighting\"]}]},\"avalugghisui\":{\"level\":88,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Avalanche\",\"Body Press\",\"Curse\",\"Recover\",\"Stone Edge\"],\"teraTypes\":[\"Poison\",\"Flying\"]}]},\"noivern\":{\"level\":84,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Boomburst\",\"Draco Meteor\",\"Flamethrower\",\"Hurricane\",\"Roost\",\"U-turn\"],\"teraTypes\":[\"Normal\"]},{\"role\":\"Fast Support\",\"movepool\":[\"Defog\",\"Draco Meteor\",\"Flamethrower\",\"Hurricane\",\"Roost\",\"U-turn\"],\"teraTypes\":[\"Fire\"]}]},\"diancie\":{\"level\":84,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Body Press\",\"Diamond Storm\",\"Earth Power\",\"Moonblast\",\"Stealth Rock\"],\"teraTypes\":[\"Fighting\"]}]},\"hoopa\":{\"level\":84,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Focus Blast\",\"Nasty Plot\",\"Psyshock\",\"Shadow Ball\",\"Substitute\",\"Trick\"],\"teraTypes\":[\"Psychic\",\"Ghost\",\"Fighting\"]}]},\"hoopaunbound\":{\"level\":80,\"sets\":[{\"role\":\"Wallbreaker\",\"movepool\":[\"Drain Punch\",\"Gunk Shot\",\"Hyperspace Fury\",\"Trick\",\"Zen Headbutt\"],\"teraTypes\":[\"Dark\",\"Fighting\",\"Poison\"]},{\"role\":\"Fast Attacker\",\"movepool\":[\"Dark Pulse\",\"Focus Blast\",\"Nasty Plot\",\"Psyshock\",\"Trick\"],\"teraTypes\":[\"Dark\",\"Fighting\",\"Psychic\"]},{\"role\":\"AV Pivot\",\"movepool\":[\"Focus Blast\",\"Gunk Shot\",\"Hyperspace Fury\",\"Psychic\"],\"teraTypes\":[\"Dark\",\"Fighting\",\"Psychic\",\"Poison\"]}]},\"volcanion\":{\"level\":82,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Earth Power\",\"Flame Charge\",\"Flamethrower\",\"Sludge Bomb\",\"Steam Eruption\"],\"teraTypes\":[\"Water\",\"Fire\"]}]},\"decidueye\":{\"level\":86,\"sets\":[{\"role\":\"Fast Support\",\"movepool\":[\"Defog\",\"Knock Off\",\"Leaf Storm\",\"Roost\",\"Spirit Shackle\",\"U-turn\"],\"teraTypes\":[\"Dark\",\"Ghost\",\"Grass\"]},{\"role\":\"Setup Sweeper\",\"movepool\":[\"Leaf Blade\",\"Shadow Sneak\",\"Spirit Shackle\",\"Swords Dance\"],\"teraTypes\":[\"Ghost\"]}]},\"decidueyehisui\":{\"level\":86,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Leaf Blade\",\"Sucker Punch\",\"Swords Dance\",\"Synthesis\",\"Triple Arrows\",\"U-turn\"],\"teraTypes\":[\"Fighting\",\"Steel\"]}]},\"gumshoos\":{\"level\":88,\"sets\":[{\"role\":\"Wallbreaker\",\"movepool\":[\"Body Slam\",\"Crunch\",\"Earthquake\",\"Psychic Fangs\",\"U-turn\"],\"teraTypes\":[\"Ground\"]}]},\"crabominable\":{\"level\":88,\"sets\":[{\"role\":\"Wallbreaker\",\"movepool\":[\"Close Combat\",\"Drain Punch\",\"Earthquake\",\"Gunk Shot\",\"Ice Hammer\"],\"teraTypes\":[\"Fighting\",\"Ground\"]}]},\"oricorio\":{\"level\":82,\"sets\":[{\"role\":\"Setup Sweeper\",\"movepool\":[\"Hurricane\",\"Quiver Dance\",\"Revelation Dance\",\"Roost\",\"Substitute\"],\"teraTypes\":[\"Ground\"]},{\"role\":\"Fast Support\",\"movepool\":[\"Defog\",\"Hurricane\",\"Revelation Dance\",\"Roost\",\"U-turn\"],\"teraTypes\":[\"Ground\"]}]},\"oricoriopompom\":{\"level\":82,\"sets\":[{\"role\":\"Setup Sweeper\",\"movepool\":[\"Hurricane\",\"Quiver Dance\",\"Revelation Dance\",\"Roost\",\"Substitute\"],\"teraTypes\":[\"Electric\",\"Ground\"]},{\"role\":\"Fast Support\",\"movepool\":[\"Defog\",\"Hurricane\",\"Revelation Dance\",\"Roost\",\"U-turn\"],\"teraTypes\":[\"Electric\"]}]},\"oricoriopau\":{\"level\":82,\"sets\":[{\"role\":\"Setup Sweeper\",\"movepool\":[\"Hurricane\",\"Quiver Dance\",\"Revelation Dance\",\"Roost\",\"Substitute\"],\"teraTypes\":[\"Ground\"]},{\"role\":\"Fast Support\",\"movepool\":[\"Defog\",\"Hurricane\",\"Revelation Dance\",\"Roost\",\"U-turn\"],\"teraTypes\":[\"Ground\"]}]},\"oricoriosensu\":{\"level\":82,\"sets\":[{\"role\":\"Setup Sweeper\",\"movepool\":[\"Hurricane\",\"Quiver Dance\",\"Revelation Dance\",\"Roost\",\"Substitute\"],\"teraTypes\":[\"Ghost\",\"Fighting\"]},{\"role\":\"Fast Support\",\"movepool\":[\"Defog\",\"Hurricane\",\"Revelation Dance\",\"Roost\",\"U-turn\"],\"teraTypes\":[\"Ghost\"]}]},\"lycanroc\":{\"level\":86,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Accelerock\",\"Close Combat\",\"Crunch\",\"Drill Run\",\"Psychic Fangs\",\"Stealth Rock\",\"Stone Edge\",\"Swords Dance\",\"Taunt\"],\"teraTypes\":[\"Fighting\"]}]},\"lycanrocmidnight\":{\"level\":88,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Close Combat\",\"Psychic Fangs\",\"Stealth Rock\",\"Stone Edge\",\"Swords Dance\"],\"teraTypes\":[\"Rock\",\"Fighting\"]}]},\"lycanrocdusk\":{\"level\":82,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Accelerock\",\"Close Combat\",\"Crunch\",\"Drill Run\",\"Psychic Fangs\",\"Stone Edge\",\"Swords Dance\"],\"teraTypes\":[\"Fighting\"]}]},\"toxapex\":{\"level\":82,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Haze\",\"Liquidation\",\"Recover\",\"Toxic\",\"Toxic Spikes\"],\"teraTypes\":[\"Steel\",\"Flying\",\"Grass\",\"Fairy\"]}]},\"mudsdale\":{\"level\":86,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Body Press\",\"Earthquake\",\"Heavy Slam\",\"Stealth Rock\",\"Stone Edge\"],\"teraTypes\":[\"Fighting\"]}]},\"lurantis\":{\"level\":88,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Defog\",\"Leaf Storm\",\"Pollen Puff\",\"Synthesis\"],\"teraTypes\":[\"Grass\"]}]},\"salazzle\":{\"level\":82,\"sets\":[{\"role\":\"Fast Support\",\"movepool\":[\"Flamethrower\",\"Protect\",\"Substitute\",\"Toxic\"],\"teraTypes\":[\"Water\",\"Flying\"]}]},\"tsareena\":{\"level\":84,\"sets\":[{\"role\":\"Fast Support\",\"movepool\":[\"High Jump Kick\",\"Play Rough\",\"Power Whip\",\"Rapid Spin\",\"Synthesis\",\"U-turn\"],\"teraTypes\":[\"Fighting\",\"Grass\"]}]},\"oranguru\":{\"level\":88,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Focus Blast\",\"Nasty Plot\",\"Psychic\",\"Psyshock\",\"Thunderbolt\"],\"teraTypes\":[\"Psychic\",\"Electric\",\"Fighting\"]},{\"role\":\"Wallbreaker\",\"movepool\":[\"Focus Blast\",\"Hyper Voice\",\"Psyshock\",\"Thunderbolt\",\"Trick\",\"Trick Room\"],\"teraTypes\":[\"Psychic\",\"Electric\",\"Fighting\"]}]},\"passimian\":{\"level\":86,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Close Combat\",\"Gunk Shot\",\"Knock Off\",\"Rock Slide\",\"U-turn\"],\"teraTypes\":[\"Dark\"]}]},\"palossand\":{\"level\":88,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Earth Power\",\"Hypnosis\",\"Shadow Ball\",\"Shore Up\",\"Stealth Rock\"],\"teraTypes\":[\"Water\"]}]},\"komala\":{\"level\":88,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Body Slam\",\"Earthquake\",\"Gunk Shot\",\"Ice Spinner\",\"Play Rough\",\"Rapid Spin\",\"Sucker Punch\",\"Superpower\",\"U-turn\",\"Wood Hammer\"],\"teraTypes\":[\"Normal\",\"Ground\",\"Poison\",\"Fairy\",\"Fighting\",\"Grass\"]}]},\"mimikyu\":{\"level\":86,\"sets\":[{\"role\":\"Setup Sweeper\",\"movepool\":[\"Drain Punch\",\"Play Rough\",\"Shadow Claw\",\"Shadow Sneak\",\"Swords Dance\",\"Wood Hammer\"],\"teraTypes\":[\"Fighting\",\"Grass\",\"Fairy\",\"Ghost\"]}]},\"bruxish\":{\"level\":86,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Aqua Jet\",\"Crunch\",\"Ice Fang\",\"Psychic Fangs\",\"Swords Dance\",\"Wave Crash\"],\"teraTypes\":[\"Dark\",\"Psychic\"]}]},\"magearna\":{\"level\":80,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Aura Sphere\",\"Flash Cannon\",\"Fleur Cannon\",\"Ice Beam\",\"Spikes\",\"Volt Switch\"],\"teraTypes\":[\"Fairy\",\"Steel\",\"Fighting\",\"Water\"]},{\"role\":\"Bulky Setup\",\"movepool\":[\"Agility\",\"Calm Mind\",\"Flash Cannon\",\"Fleur Cannon\"],\"teraTypes\":[\"Steel\"]}]},\"rillaboom\":{\"level\":82,\"sets\":[{\"role\":\"Setup Sweeper\",\"movepool\":[\"Acrobatics\",\"Knock Off\",\"Stomping Tantrum\",\"Swords Dance\",\"Wood Hammer\"],\"teraTypes\":[\"Flying\",\"Grass\"]},{\"role\":\"Fast Attacker\",\"movepool\":[\"Knock Off\",\"Stomping Tantrum\",\"U-turn\",\"Wood Hammer\"],\"teraTypes\":[\"Grass\"]}]},\"cinderace\":{\"level\":80,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Court Change\",\"Gunk Shot\",\"High Jump Kick\",\"Pyro Ball\",\"Sucker Punch\",\"U-turn\"],\"teraTypes\":[\"Fire\",\"Fighting\",\"Poison\"]}]},\"inteleon\":{\"level\":86,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Air Slash\",\"Dark Pulse\",\"Hydro Pump\",\"Ice Beam\",\"Surf\",\"U-turn\"],\"teraTypes\":[\"Water\"]},{\"role\":\"Tera Blast user\",\"movepool\":[\"Hydro Pump\",\"Ice Beam\",\"Tera Blast\",\"U-turn\"],\"teraTypes\":[\"Electric\"]}]},\"greedent\":{\"level\":88,\"sets\":[{\"role\":\"Bulky Setup\",\"movepool\":[\"Body Slam\",\"Crunch\",\"Earthquake\",\"Fire Fang\",\"Psychic Fangs\",\"Swords Dance\"],\"teraTypes\":[\"Ground\",\"Psychic\"]}]},\"corviknight\":{\"level\":80,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Body Press\",\"Brave Bird\",\"Bulk Up\",\"Defog\",\"Roost\"],\"teraTypes\":[\"Fighting\"]}]},\"drednaw\":{\"level\":82,\"sets\":[{\"role\":\"Setup Sweeper\",\"movepool\":[\"Crunch\",\"Earthquake\",\"Liquidation\",\"Shell Smash\",\"Stone Edge\"],\"teraTypes\":[\"Water\",\"Rock\",\"Ground\",\"Dark\"]}]},\"coalossal\":{\"level\":88,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Overheat\",\"Rapid Spin\",\"Spikes\",\"Stealth Rock\",\"Stone Edge\",\"Will-O-Wisp\"],\"teraTypes\":[\"Water\"]}]},\"flapple\":{\"level\":84,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Dragon Dance\",\"Grav Apple\",\"Outrage\",\"Sucker Punch\",\"U-turn\"],\"teraTypes\":[\"Dragon\",\"Grass\"]}]},\"appletun\":{\"level\":88,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Apple Acid\",\"Dragon Pulse\",\"Leech Seed\",\"Recover\"],\"teraTypes\":[\"Grass\",\"Steel\"]}]},\"sandaconda\":{\"level\":86,\"sets\":[{\"role\":\"Bulky Setup\",\"movepool\":[\"Coil\",\"Earthquake\",\"Glare\",\"Rest\",\"Stone Edge\"],\"teraTypes\":[\"Ground\"]},{\"role\":\"Bulky Support\",\"movepool\":[\"Earthquake\",\"Glare\",\"Rest\",\"Stealth Rock\",\"Stone Edge\"],\"teraTypes\":[\"Ground\"]}]},\"barraskewda\":{\"level\":82,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Aqua Jet\",\"Close Combat\",\"Crunch\",\"Liquidation\",\"Poison Jab\",\"Psychic Fangs\"],\"teraTypes\":[\"Fighting\"]}]},\"toxtricity\":{\"level\":82,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Boomburst\",\"Overdrive\",\"Shift Gear\",\"Sludge Bomb\",\"Volt Switch\"],\"teraTypes\":[\"Normal\"]}]},\"toxtricitylowkey\":{\"level\":82,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Boomburst\",\"Overdrive\",\"Sludge Bomb\",\"Toxic Spikes\",\"Volt Switch\"],\"teraTypes\":[\"Normal\"]}]},\"polteageist\":{\"level\":82,\"sets\":[{\"role\":\"Tera Blast user\",\"movepool\":[\"Giga Drain\",\"Shadow Ball\",\"Shell Smash\",\"Stored Power\",\"Strength Sap\",\"Tera Blast\"],\"teraTypes\":[\"Fighting\"]},{\"role\":\"Setup Sweeper\",\"movepool\":[\"Giga Drain\",\"Shadow Ball\",\"Shell Smash\",\"Stored Power\",\"Strength Sap\"],\"teraTypes\":[\"Psychic\"]}]},\"hatterene\":{\"level\":84,\"sets\":[{\"role\":\"Wallbreaker\",\"movepool\":[\"Dazzling Gleam\",\"Mystical Fire\",\"Psychic\",\"Psyshock\",\"Trick\",\"Trick Room\"],\"teraTypes\":[\"Psychic\",\"Fairy\",\"Fire\"]}]},\"grimmsnarl\":{\"level\":82,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Light Screen\",\"Parting Shot\",\"Reflect\",\"Spirit Break\",\"Thunder Wave\"],\"teraTypes\":[\"Fairy\"]},{\"role\":\"Fast Bulky Setup\",\"movepool\":[\"Bulk Up\",\"Crunch\",\"Rest\",\"Spirit Break\",\"Sucker Punch\",\"Thunder Wave\"],\"teraTypes\":[\"Dark\"]},{\"role\":\"Bulky Attacker\",\"movepool\":[\"Parting Shot\",\"Spirit Break\",\"Sucker Punch\",\"Taunt\",\"Thunder Wave\"],\"teraTypes\":[\"Fairy\"]}]},\"perrserker\":{\"level\":88,\"sets\":[{\"role\":\"Wallbreaker\",\"movepool\":[\"Close Combat\",\"Crunch\",\"Iron Head\",\"Stealth Rock\",\"U-turn\"],\"teraTypes\":[\"Steel\",\"Fighting\"]}]},\"falinks\":{\"level\":86,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Close Combat\",\"Megahorn\",\"No Retreat\",\"Poison Jab\",\"Rock Slide\"],\"teraTypes\":[\"Fighting\"]}]},\"pincurchin\":{\"level\":88,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Discharge\",\"Liquidation\",\"Spikes\",\"Sucker Punch\",\"Toxic Spikes\"],\"teraTypes\":[\"Electric\",\"Water\"]}]},\"frosmoth\":{\"level\":86,\"sets\":[{\"role\":\"Tera Blast user\",\"movepool\":[\"Bug Buzz\",\"Giga Drain\",\"Hurricane\",\"Ice Beam\",\"Quiver Dance\",\"Tera Blast\"],\"teraTypes\":[\"Ground\"]},{\"role\":\"Setup Sweeper\",\"movepool\":[\"Bug Buzz\",\"Giga Drain\",\"Hurricane\",\"Ice Beam\",\"Quiver Dance\"],\"teraTypes\":[\"Water\"]}]},\"stonjourner\":{\"level\":88,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Earthquake\",\"Heavy Slam\",\"Rock Polish\",\"Stealth Rock\",\"Stone Edge\"],\"teraTypes\":[\"Ground\"]}]},\"eiscue\":{\"level\":86,\"sets\":[{\"role\":\"Setup Sweeper\",\"movepool\":[\"Belly Drum\",\"Ice Spinner\",\"Iron Head\",\"Liquidation\",\"Substitute\",\"Zen Headbutt\"],\"teraTypes\":[\"Water\"]},{\"role\":\"Tera Blast user\",\"movepool\":[\"Belly Drum\",\"Ice Spinner\",\"Liquidation\",\"Substitute\",\"Tera Blast\"],\"teraTypes\":[\"Ground\"]}]},\"indeedee\":{\"level\":86,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Calm Mind\",\"Dazzling Gleam\",\"Healing Wish\",\"Hyper Voice\",\"Psychic\",\"Psyshock\",\"Shadow Ball\"],\"teraTypes\":[\"Psychic\"]}]},\"indeedeef\":{\"level\":86,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Calm Mind\",\"Dazzling Gleam\",\"Healing Wish\",\"Hyper Voice\",\"Psychic\",\"Psyshock\",\"Shadow Ball\"],\"teraTypes\":[\"Psychic\"]}]},\"copperajah\":{\"level\":86,\"sets\":[{\"role\":\"Wallbreaker\",\"movepool\":[\"Earthquake\",\"Iron Head\",\"Play Rough\",\"Rock Slide\",\"Stealth Rock\",\"Superpower\"],\"teraTypes\":[\"Steel\",\"Fairy\"]}]},\"dragapult\":{\"level\":80,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Draco Meteor\",\"Fire Blast\",\"Shadow Ball\",\"Thunderbolt\",\"U-turn\"],\"teraTypes\":[\"Ghost\",\"Dragon\"]},{\"role\":\"Tera Blast user\",\"movepool\":[\"Dragon Dance\",\"Dragon Darts\",\"Fire Blast\",\"Tera Blast\"],\"teraTypes\":[\"Ghost\"]}]},\"zacian\":{\"level\":70,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Close Combat\",\"Crunch\",\"Play Rough\",\"Psychic Fangs\",\"Swords Dance\",\"Wild Charge\"],\"teraTypes\":[\"Fighting\"]}]},\"zaciancrowned\":{\"level\":68,\"sets\":[{\"role\":\"Setup Sweeper\",\"movepool\":[\"Behemoth Blade\",\"Close Combat\",\"Play Rough\",\"Swords Dance\"],\"teraTypes\":[\"Fighting\"]}]},\"zamazenta\":{\"level\":72,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Close Combat\",\"Crunch\",\"Iron Head\",\"Psychic Fangs\",\"Stone Edge\",\"Wild Charge\"],\"teraTypes\":[\"Fighting\",\"Dark\"]},{\"role\":\"Bulky Setup\",\"movepool\":[\"Body Press\",\"Crunch\",\"Iron Defense\",\"Iron Head\",\"Rest\",\"Stone Edge\"],\"teraTypes\":[\"Fighting\"]}]},\"zamazentacrowned\":{\"level\":72,\"sets\":[{\"role\":\"Bulky Setup\",\"movepool\":[\"Behemoth Bash\",\"Body Press\",\"Crunch\",\"Iron Defense\",\"Psychic Fangs\",\"Stone Edge\"],\"teraTypes\":[\"Fighting\"]}]},\"eternatus\":{\"level\":72,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Dynamax Cannon\",\"Fire Blast\",\"Recover\",\"Sludge Bomb\"],\"teraTypes\":[\"Dragon\"]},{\"role\":\"Bulky Support\",\"movepool\":[\"Dynamax Cannon\",\"Flamethrower\",\"Recover\",\"Toxic\",\"Toxic Spikes\"],\"teraTypes\":[\"Dragon\"]}]},\"urshifu\":{\"level\":76,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Close Combat\",\"Poison Jab\",\"Sucker Punch\",\"Swords Dance\",\"U-turn\",\"Wicked Blow\"],\"teraTypes\":[\"Dark\",\"Fighting\"]}]},\"urshifurapidstrike\":{\"level\":80,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Aqua Jet\",\"Close Combat\",\"Ice Spinner\",\"Surging Strikes\",\"Swords Dance\",\"U-turn\"],\"teraTypes\":[\"Water\"]}]},\"zarude\":{\"level\":86,\"sets\":[{\"role\":\"Fast Bulky Setup\",\"movepool\":[\"Close Combat\",\"Crunch\",\"Power Whip\",\"Swords Dance\",\"Synthesis\"],\"teraTypes\":[\"Dark\",\"Grass\",\"Fighting\"]},{\"role\":\"Fast Attacker\",\"movepool\":[\"Close Combat\",\"Crunch\",\"Power Whip\",\"U-turn\"],\"teraTypes\":[\"Dark\",\"Grass\",\"Fighting\"]}]},\"regieleki\":{\"level\":80,\"sets\":[{\"role\":\"Fast Support\",\"movepool\":[\"Explosion\",\"Rapid Spin\",\"Thunderbolt\",\"Volt Switch\"],\"teraTypes\":[\"Electric\"]},{\"role\":\"Tera Blast user\",\"movepool\":[\"Rapid Spin\",\"Tera Blast\",\"Thunderbolt\",\"Volt Switch\"],\"teraTypes\":[\"Ice\"]}]},\"regidrago\":{\"level\":84,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Draco Meteor\",\"Dragon Dance\",\"Earthquake\",\"Fire Fang\",\"Outrage\"],\"teraTypes\":[\"Dragon\"]},{\"role\":\"Tera Blast user\",\"movepool\":[\"Dragon Claw\",\"Dragon Dance\",\"Earthquake\",\"Tera Blast\"],\"teraTypes\":[\"Steel\"]}]},\"glastrier\":{\"level\":86,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Close Combat\",\"Crunch\",\"Heavy Slam\",\"Icicle Crash\",\"Stomping Tantrum\",\"Swords Dance\"],\"teraTypes\":[\"Fighting\",\"Steel\"]}]},\"spectrier\":{\"level\":76,\"sets\":[{\"role\":\"Setup Sweeper\",\"movepool\":[\"Nasty Plot\",\"Psychic\",\"Shadow Ball\",\"Substitute\",\"Will-O-Wisp\"],\"teraTypes\":[\"Ghost\",\"Psychic\"]},{\"role\":\"Tera Blast user\",\"movepool\":[\"Nasty Plot\",\"Shadow Ball\",\"Substitute\",\"Tera Blast\",\"Will-O-Wisp\"],\"teraTypes\":[\"Fighting\"]}]},\"calyrex\":{\"level\":88,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Calm Mind\",\"Encore\",\"Energy Ball\",\"Leech Seed\",\"Psychic\",\"Psyshock\"],\"teraTypes\":[\"Steel\"]}]},\"calyrexice\":{\"level\":74,\"sets\":[{\"role\":\"Wallbreaker\",\"movepool\":[\"Agility\",\"Close Combat\",\"Glacial Lance\",\"Stomping Tantrum\",\"Trick Room\",\"Zen Headbutt\"],\"teraTypes\":[\"Fighting\"]}]},\"calyrexshadow\":{\"level\":68,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Astral Barrage\",\"Nasty Plot\",\"Pollen Puff\",\"Psyshock\",\"Trick\"],\"teraTypes\":[\"Ghost\"]}]},\"wyrdeer\":{\"level\":88,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Body Slam\",\"Earthquake\",\"Megahorn\",\"Psychic\",\"Thunder Wave\",\"Thunderbolt\"],\"teraTypes\":[\"Ground\"]}]},\"kleavor\":{\"level\":86,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Close Combat\",\"Defog\",\"Stone Axe\",\"Swords Dance\",\"U-turn\",\"X-Scissor\"],\"teraTypes\":[\"Bug\",\"Rock\",\"Fighting\"]}]},\"ursaluna\":{\"level\":80,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Close Combat\",\"Facade\",\"Headlong Rush\",\"Protect\",\"Swords Dance\"],\"teraTypes\":[\"Normal\"]}]},\"enamorus\":{\"level\":82,\"sets\":[{\"role\":\"Tera Blast user\",\"movepool\":[\"Play Rough\",\"Superpower\",\"Taunt\",\"Tera Blast\"],\"teraTypes\":[\"Flying\"]},{\"role\":\"Fast Bulky Setup\",\"movepool\":[\"Calm Mind\",\"Earth Power\",\"Moonblast\",\"Substitute\"],\"teraTypes\":[\"Ground\"]}]},\"enamorustherian\":{\"level\":84,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Earth Power\",\"Healing Wish\",\"Moonblast\",\"Mystical Fire\",\"Psychic\",\"Superpower\"],\"teraTypes\":[\"Fairy\",\"Ground\"]}]},\"meowscarada\":{\"level\":80,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Flower Trick\",\"Knock Off\",\"Thunder Punch\",\"Toxic Spikes\",\"U-turn\"],\"teraTypes\":[\"Grass\",\"Dark\"]}]},\"skeledirge\":{\"level\":80,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Flame Charge\",\"Shadow Ball\",\"Slack Off\",\"Torch Song\"],\"teraTypes\":[\"Fire\"]},{\"role\":\"Bulky Support\",\"movepool\":[\"Hex\",\"Slack Off\",\"Torch Song\",\"Will-O-Wisp\"],\"teraTypes\":[\"Ghost\",\"Water\"]}]},\"quaquaval\":{\"level\":80,\"sets\":[{\"role\":\"Fast Support\",\"movepool\":[\"Aqua Step\",\"Close Combat\",\"Ice Spinner\",\"Rapid Spin\",\"Roost\",\"U-turn\"],\"teraTypes\":[\"Water\",\"Fighting\"]},{\"role\":\"Setup Sweeper\",\"movepool\":[\"Aqua Step\",\"Close Combat\",\"Ice Spinner\",\"Roost\",\"Swords Dance\"],\"teraTypes\":[\"Water\",\"Fighting\"]}]},\"oinkologne\":{\"level\":88,\"sets\":[{\"role\":\"Bulky Setup\",\"movepool\":[\"Body Press\",\"Body Slam\",\"Stomping Tantrum\",\"Stuff Cheeks\"],\"teraTypes\":[\"Fighting\"]}]},\"oinkolognef\":{\"level\":88,\"sets\":[{\"role\":\"Bulky Setup\",\"movepool\":[\"Body Press\",\"Body Slam\",\"Stomping Tantrum\",\"Stuff Cheeks\"],\"teraTypes\":[\"Fighting\"]}]},\"dudunsparce\":{\"level\":86,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Earthquake\",\"Glare\",\"Headbutt\",\"Roost\"],\"teraTypes\":[\"Normal\",\"Ghost\",\"Ground\"]},{\"role\":\"Bulky Setup\",\"movepool\":[\"Boomburst\",\"Calm Mind\",\"Earth Power\",\"Roost\",\"Thunder\"],\"teraTypes\":[\"Normal\",\"Ghost\"]}]},\"dudunsparcethreesegment\":{\"level\":86,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Earthquake\",\"Glare\",\"Headbutt\",\"Roost\"],\"teraTypes\":[\"Normal\",\"Ghost\",\"Ground\"]},{\"role\":\"Bulky Setup\",\"movepool\":[\"Boomburst\",\"Calm Mind\",\"Earth Power\",\"Roost\",\"Thunder\"],\"teraTypes\":[\"Normal\"]}]},\"spidops\":{\"level\":90,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Memento\",\"Spikes\",\"Sticky Web\",\"Toxic Spikes\",\"U-turn\"],\"teraTypes\":[\"Ghost\"]}]},\"lokix\":{\"level\":82,\"sets\":[{\"role\":\"Wallbreaker\",\"movepool\":[\"Axe Kick\",\"First Impression\",\"Leech Life\",\"Sucker Punch\"],\"teraTypes\":[\"Bug\"]},{\"role\":\"Fast Attacker\",\"movepool\":[\"Axe Kick\",\"First Impression\",\"Sucker Punch\",\"U-turn\"],\"teraTypes\":[\"Bug\"]},{\"role\":\"Setup Sweeper\",\"movepool\":[\"Leech Life\",\"Sucker Punch\",\"Swords Dance\",\"Throat Chop\"],\"teraTypes\":[\"Dark\"]}]},\"rabsca\":{\"level\":84,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Bug Buzz\",\"Earth Power\",\"Psychic\",\"Revival Blessing\",\"Trick Room\"],\"teraTypes\":[\"Steel\"]}]},\"houndstone\":{\"level\":76,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Body Press\",\"Last Respects\",\"Trick\",\"Will-O-Wisp\"],\"teraTypes\":[\"Ghost\"]}]},\"espathra\":{\"level\":80,\"sets\":[{\"role\":\"Wallbreaker\",\"movepool\":[\"Dazzling Gleam\",\"Lumina Crash\",\"Shadow Ball\",\"U-turn\"],\"teraTypes\":[\"Psychic\",\"Fairy\",\"Ghost\"]},{\"role\":\"Fast Bulky Setup\",\"movepool\":[\"Calm Mind\",\"Dazzling Gleam\",\"Protect\",\"Roost\",\"Stored Power\",\"Substitute\"],\"teraTypes\":[\"Psychic\",\"Fairy\"]},{\"role\":\"Tera Blast user\",\"movepool\":[\"Dazzling Gleam\",\"Lumina Crash\",\"Shadow Ball\",\"Tera Blast\"],\"teraTypes\":[\"Fighting\"]}]},\"farigiraf\":{\"level\":88,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Foul Play\",\"Hyper Voice\",\"Protect\",\"Wish\"],\"teraTypes\":[\"Dark\"]},{\"role\":\"Bulky Attacker\",\"movepool\":[\"Future Sight\",\"Hyper Voice\",\"Protect\",\"Wish\"],\"teraTypes\":[\"Ground\",\"Water\",\"Fairy\"]},{\"role\":\"AV Pivot\",\"movepool\":[\"Dazzling Gleam\",\"Earthquake\",\"Foul Play\",\"Future Sight\",\"Hyper Voice\",\"Psychic\"],\"teraTypes\":[\"Dark\"]}]},\"wugtrio\":{\"level\":88,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Aqua Jet\",\"Liquidation\",\"Memento\",\"Stomping Tantrum\",\"Sucker Punch\",\"Throat Chop\"],\"teraTypes\":[\"Water\",\"Dark\"]}]},\"dondozo\":{\"level\":80,\"sets\":[{\"role\":\"Bulky Setup\",\"movepool\":[\"Curse\",\"Liquidation\",\"Rest\",\"Sleep Talk\",\"Wave Crash\"],\"teraTypes\":[\"Water\",\"Fairy\",\"Ground\",\"Dragon\"]}]},\"veluza\":{\"level\":84,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Aqua Cutter\",\"Aqua Jet\",\"Night Slash\",\"Psycho Cut\"],\"teraTypes\":[\"Water\"]},{\"role\":\"Setup Sweeper\",\"movepool\":[\"Aqua Cutter\",\"Fillet Away\",\"Night Slash\",\"Psycho Cut\"],\"teraTypes\":[\"Water\",\"Psychic\",\"Dark\"]}]},\"palafin\":{\"level\":76,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Bulk Up\",\"Close Combat\",\"Flip Turn\",\"Ice Punch\",\"Jet Punch\",\"Wave Crash\"],\"teraTypes\":[\"Water\",\"Fighting\"]}]},\"arboliva\":{\"level\":88,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Dazzling Gleam\",\"Earth Power\",\"Energy Ball\",\"Hyper Voice\",\"Leech Seed\",\"Strength Sap\"],\"teraTypes\":[\"Grass\",\"Fairy\"]},{\"role\":\"Bulky Support\",\"movepool\":[\"Giga Drain\",\"Hyper Voice\",\"Leech Seed\",\"Substitute\"],\"teraTypes\":[\"Water\"]}]},\"scovillain\":{\"level\":80,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Flamethrower\",\"Leech Seed\",\"Protect\",\"Substitute\"],\"teraTypes\":[\"Steel\",\"Water\"]}]},\"bellibolt\":{\"level\":88,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Muddy Water\",\"Slack Off\",\"Thunder Wave\",\"Thunderbolt\",\"Volt Switch\"],\"teraTypes\":[\"Electric\"]}]},\"revavroom\":{\"level\":82,\"sets\":[{\"role\":\"Tera Blast user\",\"movepool\":[\"Gunk Shot\",\"Iron Head\",\"Shift Gear\",\"Tera Blast\"],\"teraTypes\":[\"Water\",\"Ground\"]},{\"role\":\"Fast Support\",\"movepool\":[\"Gunk Shot\",\"Haze\",\"Parting Shot\",\"Spin Out\",\"Toxic\",\"Toxic Spikes\"],\"teraTypes\":[\"Water\"]}]},\"orthworm\":{\"level\":84,\"sets\":[{\"role\":\"Bulky Setup\",\"movepool\":[\"Body Press\",\"Coil\",\"Iron Tail\",\"Rest\"],\"teraTypes\":[\"Steel\",\"Fighting\",\"Electric\"]},{\"role\":\"Bulky Support\",\"movepool\":[\"Body Press\",\"Iron Head\",\"Rest\",\"Shed Tail\",\"Spikes\",\"Stealth Rock\"],\"teraTypes\":[\"Steel\",\"Electric\"]}]},\"maushold\":{\"level\":80,\"sets\":[{\"role\":\"Setup Sweeper\",\"movepool\":[\"Bite\",\"Encore\",\"Population Bomb\",\"Tidy Up\"],\"teraTypes\":[\"Normal\"]}]},\"mausholdfour\":{\"level\":80,\"sets\":[{\"role\":\"Setup Sweeper\",\"movepool\":[\"Bite\",\"Encore\",\"Population Bomb\",\"Tidy Up\"],\"teraTypes\":[\"Normal\"]}]},\"cetitan\":{\"level\":84,\"sets\":[{\"role\":\"Wallbreaker\",\"movepool\":[\"Earthquake\",\"Icicle Crash\",\"Liquidation\",\"Snowscape\"],\"teraTypes\":[\"Ground\"]},{\"role\":\"Bulky Setup\",\"movepool\":[\"Belly Drum\",\"Earthquake\",\"Ice Shard\",\"Icicle Crash\"],\"teraTypes\":[\"Ice\"]}]},\"baxcalibur\":{\"level\":80,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Earthquake\",\"Glaive Rush\",\"Ice Shard\",\"Icicle Crash\"],\"teraTypes\":[\"Ice\"]},{\"role\":\"Setup Sweeper\",\"movepool\":[\"Dragon Dance\",\"Earthquake\",\"Glaive Rush\",\"Icicle Crash\"],\"teraTypes\":[\"Dragon\",\"Ground\"]}]},\"tatsugiri\":{\"level\":82,\"sets\":[{\"role\":\"Tera Blast user\",\"movepool\":[\"Draco Meteor\",\"Dragon Pulse\",\"Hydro Pump\",\"Nasty Plot\",\"Tera Blast\"],\"teraTypes\":[\"Fire\"]},{\"role\":\"Fast Support\",\"movepool\":[\"Draco Meteor\",\"Hydro Pump\",\"Nasty Plot\",\"Rapid Spin\",\"Surf\"],\"teraTypes\":[\"Water\"]}]},\"cyclizar\":{\"level\":80,\"sets\":[{\"role\":\"Fast Support\",\"movepool\":[\"Draco Meteor\",\"Rapid Spin\",\"Shed Tail\",\"Taunt\"],\"teraTypes\":[\"Dragon\"]},{\"role\":\"Fast Attacker\",\"movepool\":[\"Body Slam\",\"Knock Off\",\"Outrage\",\"Shed Tail\",\"Shift Gear\"],\"teraTypes\":[\"Dark\",\"Dragon\"]}]},\"pawmot\":{\"level\":80,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Close Combat\",\"Double Shock\",\"Ice Punch\",\"Revival Blessing\",\"Volt Switch\"],\"teraTypes\":[\"Electric\"]},{\"role\":\"Fast Support\",\"movepool\":[\"Close Combat\",\"Ice Punch\",\"Nuzzle\",\"Revival Blessing\",\"Thunder Punch\"],\"teraTypes\":[\"Fighting\"]}]},\"kilowattrel\":{\"level\":82,\"sets\":[{\"role\":\"Fast Support\",\"movepool\":[\"Hurricane\",\"Roost\",\"Thunder Wave\",\"Thunderbolt\",\"U-turn\"],\"teraTypes\":[\"Flying\",\"Electric\"]}]},\"bombirdier\":{\"level\":86,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Brave Bird\",\"Hone Claws\",\"Knock Off\",\"Stone Edge\",\"Sucker Punch\",\"U-turn\"],\"teraTypes\":[\"Rock\"]}]},\"squawkabilly\":{\"level\":88,\"sets\":[{\"role\":\"Wallbreaker\",\"movepool\":[\"Brave Bird\",\"Facade\",\"Protect\",\"Quick Attack\",\"U-turn\"],\"teraTypes\":[\"Normal\"]}]},\"squawkabillywhite\":{\"level\":88,\"sets\":[{\"role\":\"Wallbreaker\",\"movepool\":[\"Brave Bird\",\"Double-Edge\",\"Foul Play\",\"Parting Shot\",\"Quick Attack\"],\"teraTypes\":[\"Flying\",\"Dark\",\"Normal\"]}]},\"squawkabillyblue\":{\"level\":88,\"sets\":[{\"role\":\"Wallbreaker\",\"movepool\":[\"Brave Bird\",\"Facade\",\"Protect\",\"Quick Attack\",\"U-turn\"],\"teraTypes\":[\"Normal\"]}]},\"squawkabillyyellow\":{\"level\":88,\"sets\":[{\"role\":\"Wallbreaker\",\"movepool\":[\"Brave Bird\",\"Double-Edge\",\"Foul Play\",\"Parting Shot\",\"Quick Attack\"],\"teraTypes\":[\"Flying\",\"Dark\",\"Normal\"]}]},\"flamigo\":{\"level\":82,\"sets\":[{\"role\":\"Wallbreaker\",\"movepool\":[\"Brave Bird\",\"Close Combat\",\"Swords Dance\",\"Throat Chop\",\"U-turn\"],\"teraTypes\":[\"Fighting\"]}]},\"klawf\":{\"level\":82,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Crabhammer\",\"High Horsepower\",\"Knock Off\",\"Stealth Rock\",\"Stone Edge\",\"Swords Dance\"],\"teraTypes\":[\"Water\",\"Ground\",\"Dark\",\"Rock\"]}]},\"garganacl\":{\"level\":80,\"sets\":[{\"role\":\"Bulky Setup\",\"movepool\":[\"Body Press\",\"Curse\",\"Recover\",\"Stone Edge\"],\"teraTypes\":[\"Fighting\"]},{\"role\":\"Bulky Support\",\"movepool\":[\"Avalanche\",\"Body Press\",\"Recover\",\"Salt Cure\",\"Stealth Rock\",\"Stone Edge\"],\"teraTypes\":[\"Ghost\"]}]},\"glimmora\":{\"level\":80,\"sets\":[{\"role\":\"Fast Support\",\"movepool\":[\"Earth Power\",\"Energy Ball\",\"Mortal Spin\",\"Power Gem\",\"Sludge Wave\",\"Spikes\",\"Stealth Rock\",\"Toxic\"],\"teraTypes\":[\"Water\"]}]},\"grafaiai\":{\"level\":86,\"sets\":[{\"role\":\"AV Pivot\",\"movepool\":[\"Gunk Shot\",\"Knock Off\",\"Super Fang\",\"U-turn\"],\"teraTypes\":[\"Dark\"]},{\"role\":\"Fast Support\",\"movepool\":[\"Encore\",\"Knock Off\",\"Protect\",\"Substitute\",\"Toxic\"],\"teraTypes\":[\"Dark\"]},{\"role\":\"Wallbreaker\",\"movepool\":[\"Gunk Shot\",\"Knock Off\",\"Switcheroo\",\"U-turn\"],\"teraTypes\":[\"Poison\",\"Dark\"]}]},\"dachsbun\":{\"level\":86,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Body Press\",\"Play Rough\",\"Protect\",\"Wish\"],\"teraTypes\":[\"Steel\"]}]},\"mabosstiff\":{\"level\":84,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Crunch\",\"Fire Fang\",\"Play Rough\",\"Psychic Fangs\",\"Wild Charge\"],\"teraTypes\":[\"Dark\",\"Fairy\"]}]},\"brambleghast\":{\"level\":84,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Power Whip\",\"Rapid Spin\",\"Shadow Sneak\",\"Spikes\",\"Strength Sap\"],\"teraTypes\":[\"Ghost\"]},{\"role\":\"Fast Support\",\"movepool\":[\"Leech Seed\",\"Phantom Force\",\"Power Whip\",\"Substitute\"],\"teraTypes\":[\"Ghost\"]}]},\"gholdengo\":{\"level\":80,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Focus Blast\",\"Make It Rain\",\"Nasty Plot\",\"Recover\",\"Shadow Ball\",\"Trick\"],\"teraTypes\":[\"Steel\",\"Ghost\"]},{\"role\":\"Bulky Attacker\",\"movepool\":[\"Make It Rain\",\"Recover\",\"Shadow Ball\",\"Thunder Wave\"],\"teraTypes\":[\"Steel\",\"Water\"]}]},\"greattusk\":{\"level\":80,\"sets\":[{\"role\":\"Bulky Setup\",\"movepool\":[\"Bulk Up\",\"Close Combat\",\"Earthquake\",\"Ice Spinner\",\"Rapid Spin\"],\"teraTypes\":[\"Ground\",\"Fighting\"]},{\"role\":\"Bulky Attacker\",\"movepool\":[\"Close Combat\",\"Headlong Rush\",\"Ice Spinner\",\"Knock Off\",\"Rapid Spin\",\"Stealth Rock\"],\"teraTypes\":[\"Ground\",\"Dark\"]}]},\"brutebonnet\":{\"level\":82,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Close Combat\",\"Crunch\",\"Seed Bomb\",\"Spore\",\"Sucker Punch\"],\"teraTypes\":[\"Dark\",\"Fighting\"]}]},\"sandyshocks\":{\"level\":82,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Earth Power\",\"Spikes\",\"Stealth Rock\",\"Thunder Wave\",\"Thunderbolt\",\"Volt Switch\"],\"teraTypes\":[\"Electric\",\"Ground\"]}]},\"screamtail\":{\"level\":86,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Encore\",\"Light Screen\",\"Play Rough\",\"Protect\",\"Reflect\",\"Thunder Wave\",\"Wish\"],\"teraTypes\":[\"Fairy\",\"Steel\"]}]},\"fluttermane\":{\"level\":76,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Calm Mind\",\"Moonblast\",\"Mystical Fire\",\"Psyshock\",\"Shadow Ball\",\"Thunderbolt\"],\"teraTypes\":[\"Ghost\",\"Fairy\",\"Fire\",\"Electric\",\"Psychic\"]}]},\"slitherwing\":{\"level\":82,\"sets\":[{\"role\":\"Bulky Setup\",\"movepool\":[\"Bulk Up\",\"Close Combat\",\"Earthquake\",\"Flare Blitz\",\"Leech Life\",\"Wild Charge\",\"Will-O-Wisp\"],\"teraTypes\":[\"Fighting\",\"Electric\",\"Fire\"]},{\"role\":\"Fast Attacker\",\"movepool\":[\"Close Combat\",\"Earthquake\",\"First Impression\",\"Flare Blitz\",\"U-turn\",\"Wild Charge\"],\"teraTypes\":[\"Bug\",\"Fighting\",\"Electric\"]}]},\"roaringmoon\":{\"level\":80,\"sets\":[{\"role\":\"Setup Sweeper\",\"movepool\":[\"Crunch\",\"Dragon Dance\",\"Earthquake\",\"Outrage\",\"Roost\"],\"teraTypes\":[\"Dark\",\"Dragon\",\"Ground\"]},{\"role\":\"Bulky Attacker\",\"movepool\":[\"Crunch\",\"Iron Head\",\"Outrage\",\"U-turn\"],\"teraTypes\":[\"Dark\",\"Dragon\",\"Steel\"]}]},\"irontreads\":{\"level\":80,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Earthquake\",\"Heavy Slam\",\"Knock Off\",\"Rapid Spin\",\"Stealth Rock\",\"Stone Edge\",\"Volt Switch\"],\"teraTypes\":[\"Ground\",\"Steel\"]}]},\"ironmoth\":{\"level\":80,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Discharge\",\"Energy Ball\",\"Fiery Dance\",\"Fire Blast\",\"Sludge Wave\",\"U-turn\"],\"teraTypes\":[\"Fire\",\"Grass\"]},{\"role\":\"Fast Support\",\"movepool\":[\"Energy Ball\",\"Fiery Dance\",\"Morning Sun\",\"Sludge Wave\",\"Toxic Spikes\",\"U-turn\"],\"teraTypes\":[\"Fire\",\"Grass\"]}]},\"ironhands\":{\"level\":80,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Close Combat\",\"Drain Punch\",\"Fake Out\",\"Heavy Slam\",\"Ice Punch\",\"Thunder Punch\",\"Volt Switch\",\"Wild Charge\"],\"teraTypes\":[\"Electric\",\"Fighting\"]}]},\"ironjugulis\":{\"level\":82,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Dark Pulse\",\"Earth Power\",\"Fire Blast\",\"Hurricane\",\"Hydro Pump\",\"U-turn\"],\"teraTypes\":[\"Dark\",\"Flying\",\"Ground\"]}]},\"ironthorns\":{\"level\":84,\"sets\":[{\"role\":\"Fast Support\",\"movepool\":[\"Earthquake\",\"Spikes\",\"Stealth Rock\",\"Stone Edge\",\"Thunder Punch\",\"Volt Switch\"],\"teraTypes\":[\"Grass\",\"Water\"]},{\"role\":\"Bulky Setup\",\"movepool\":[\"Dragon Dance\",\"Earthquake\",\"Ice Punch\",\"Stone Edge\",\"Wild Charge\"],\"teraTypes\":[\"Rock\",\"Ground\"]}]},\"ironbundle\":{\"level\":76,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Encore\",\"Flip Turn\",\"Freeze-Dry\",\"Hydro Pump\",\"Ice Beam\",\"Substitute\"],\"teraTypes\":[\"Water\",\"Ice\"]}]},\"ironvaliant\":{\"level\":80,\"sets\":[{\"role\":\"Setup Sweeper\",\"movepool\":[\"Close Combat\",\"Knock Off\",\"Spirit Break\",\"Swords Dance\"],\"teraTypes\":[\"Dark\",\"Fighting\"]},{\"role\":\"Fast Attacker\",\"movepool\":[\"Aura Sphere\",\"Calm Mind\",\"Focus Blast\",\"Moonblast\",\"Psyshock\",\"Shadow Ball\"],\"teraTypes\":[\"Fighting\",\"Fairy\"]}]},\"tinglu\":{\"level\":80,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Earthquake\",\"Ruination\",\"Spikes\",\"Stealth Rock\",\"Throat Chop\",\"Whirlwind\"],\"teraTypes\":[\"Ground\",\"Ghost\"]},{\"role\":\"Bulky Attacker\",\"movepool\":[\"Body Press\",\"Earthquake\",\"Heavy Slam\",\"Ruination\",\"Stone Edge\",\"Throat Chop\"],\"teraTypes\":[\"Ground\",\"Fighting\",\"Steel\"]}]},\"chienpao\":{\"level\":80,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Crunch\",\"Ice Shard\",\"Ice Spinner\",\"Sacred Sword\",\"Sucker Punch\",\"Swords Dance\"],\"teraTypes\":[\"Dark\",\"Ice\",\"Fighting\"]}]},\"wochien\":{\"level\":82,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Energy Ball\",\"Knock Off\",\"Leech Seed\",\"Ruination\",\"Stun Spore\"],\"teraTypes\":[\"Poison\"]}]},\"chiyu\":{\"level\":80,\"sets\":[{\"role\":\"Setup Sweeper\",\"movepool\":[\"Dark Pulse\",\"Fire Blast\",\"Nasty Plot\",\"Psychic\",\"Will-O-Wisp\"],\"teraTypes\":[\"Dark\",\"Fire\"]},{\"role\":\"Wallbreaker\",\"movepool\":[\"Dark Pulse\",\"Flamethrower\",\"Overheat\",\"Psychic\"],\"teraTypes\":[\"Dark\",\"Fire\"]}]},\"koraidon\":{\"level\":72,\"sets\":[{\"role\":\"Fast Attacker\",\"movepool\":[\"Collision Course\",\"Flare Blitz\",\"Outrage\",\"Swords Dance\",\"U-turn\"],\"teraTypes\":[\"Fire\"]}]},\"miraidon\":{\"level\":70,\"sets\":[{\"role\":\"Fast Bulky Setup\",\"movepool\":[\"Calm Mind\",\"Dragon Pulse\",\"Electro Drift\",\"Substitute\"],\"teraTypes\":[\"Electric\"]},{\"role\":\"Fast Attacker\",\"movepool\":[\"Draco Meteor\",\"Electro Drift\",\"Overheat\",\"Volt Switch\"],\"teraTypes\":[\"Electric\"]}]},\"tinkaton\":{\"level\":86,\"sets\":[{\"role\":\"Bulky Attacker\",\"movepool\":[\"Gigaton Hammer\",\"Knock Off\",\"Play Rough\",\"Stealth Rock\",\"Thunder Wave\"],\"teraTypes\":[\"Steel\"]},{\"role\":\"Setup Sweeper\",\"movepool\":[\"Gigaton Hammer\",\"Knock Off\",\"Play Rough\",\"Swords Dance\"],\"teraTypes\":[\"Steel\"]}]},\"armarouge\":{\"level\":84,\"sets\":[{\"role\":\"Wallbreaker\",\"movepool\":[\"Armor Cannon\",\"Aura Sphere\",\"Energy Ball\",\"Focus Blast\",\"Psyshock\"],\"teraTypes\":[\"Fire\",\"Fighting\",\"Psychic\",\"Grass\"]}]},\"ceruledge\":{\"level\":82,\"sets\":[{\"role\":\"Setup Sweeper\",\"movepool\":[\"Bitter Blade\",\"Close Combat\",\"Shadow Sneak\",\"Swords Dance\"],\"teraTypes\":[\"Fire\",\"Fighting\"]}]},\"toedscruel\":{\"level\":86,\"sets\":[{\"role\":\"Bulky Support\",\"movepool\":[\"Earth Power\",\"Giga Drain\",\"Knock Off\",\"Leaf Storm\",\"Rapid Spin\",\"Spore\",\"Toxic\",\"Toxic Spikes\"],\"teraTypes\":[\"Ground\",\"Water\"]}]},\"kingambit\":{\"level\":82,\"sets\":[{\"role\":\"Wallbreaker\",\"movepool\":[\"Iron Head\",\"Kowtow Cleave\",\"Stealth Rock\",\"Sucker Punch\",\"Swords Dance\"],\"teraTypes\":[\"Dark\"]}]}};\n/* eslint-enable */\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}\ninterface BattleFactorySet {\n\tspecies: string;\n\titem: string;\n\tability: string;\n\tnature: string;\n\tmoves: string[];\n\tevs?: Partial<StatsTable>;\n\tivs?: Partial<StatsTable>;\n}\nexport class MoveCounter extends Utils.Multiset<string> {\n\tdamagingMoves: Set<Move>;\n\tstabCounter: number;\n\tironFist: number;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.damagingMoves = new Set();\n\t\tthis.stabCounter = 0;\n\t\tthis.ironFist = 0;\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<string>, abilities: Set<string>, types: string[],\n\tcounter: MoveCounter, species: Species, teamDetails: RandomTeamsTypes.TeamDetails,\n\tisLead: boolean, isDoubles: boolean, teraType: string, role: string,\n) => boolean;\n\n// Moves that restore HP:\nconst RecoveryMove = [\n\t'healorder', 'milkdrink', 'moonlight', 'morningsun', 'recover', 'roost', 'shoreup', 'slackoff', 'softboiled', 'strengthsap', 'synthesis',\n];\n// Moves that drop stats:\nconst ContraryMoves = [\n\t'armorcannon', 'closecombat', 'leafstorm', 'makeitrain', 'overheat', 'spinout', 'superpower', 'vcreate',\n];\n// Moves that boost Attack:\nconst PhysicalSetup = [\n\t'bellydrum', 'bulkup', 'coil', 'curse', 'dragondance', 'honeclaws', 'howl', 'meditate', 'poweruppunch', 'swordsdance', 'tidyup',\n];\n// Moves which boost Special Attack:\nconst SpecialSetup = [\n\t'calmmind', 'chargebeam', 'geomancy', 'nastyplot', 'quiverdance', 'tailglow', 'torchsong',\n];\n// Moves that boost Attack AND Special Attack:\nconst MixedSetup = [\n\t'clangoroussoul', 'growth', 'happyhour', 'holdhands', 'noretreat', 'shellsmash', 'workup',\n];\n// Some moves that only boost Speed:\nconst SpeedSetup = [\n\t'agility', 'autotomize', 'rockpolish',\n];\n// Conglomerate for ease of access\nconst Setup = [\n\t'acidarmor', 'agility', 'autotomize', 'bellydrum', 'bulkup', 'calmmind', 'coil', 'curse', 'dragondance', 'flamecharge',\n\t'growth', 'honeclaws', 'howl', 'irondefense', 'meditate', 'nastyplot', 'noretreat', 'poweruppunch', 'quiverdance', 'rockpolish',\n\t'shellsmash', 'shiftgear', 'swordsdance', 'tailglow', 'tidyup', 'trailblaze', 'workup',\n];\n// Moves that shouldn't be the only STAB moves:\nconst NoStab = [\n\t'accelerock', 'aquajet', 'beakblast', 'bounce', 'breakingswipe', 'chatter', 'chloroblast', 'clearsmog', 'dragontail', 'eruption',\n\t'explosion', 'fakeout', 'flamecharge', 'flipturn', 'iceshard', 'icywind', 'incinerate', 'machpunch', 'meteorbeam',\n\t'mortalspin', 'pluck', 'pursuit', 'quickattack', 'rapidspin', 'reversal', 'saltcure', 'selfdestruct', 'shadowsneak',\n\t'skydrop', 'snarl', 'steelbeam', 'suckerpunch', 'uturn', 'watershuriken', 'vacuumwave', 'voltswitch', 'waterspout',\n];\n// Hazard-setting moves\nconst Hazards = [\n\t'spikes', 'stealthrock', 'stickyweb', 'toxicspikes',\n];\n\n// Moves that should be paired together when possible\nconst MovePairs = [\n\t['lightscreen', 'reflect'],\n\t['sleeptalk', 'rest'],\n\t['protect', 'wish'],\n];\n\nfunction sereneGraceBenefits(move: Move) {\n\treturn move.secondary?.chance && move.secondary.chance >= 20 && move.secondary.chance < 100;\n}\n\nexport class RandomTeams {\n\tdex: ModdedDex;\n\tgen: number;\n\tfactoryTier: string;\n\tformat: Format;\n\tprng: PRNG;\n\tnoStab: string[];\n\treadonly maxTeamSize: number;\n\treadonly adjustLevel: number | null;\n\treadonly maxMoveCount: number;\n\treadonly forceMonotype: string | undefined;\n\n\t/**\n\t * Checkers for move enforcement based on types or other factors\n\t *\n\t * returns true to try to force the move type, false otherwise.\n\t */\n\tmoveEnforcementCheckers: {[k: string]: MoveEnforcementChecker};\n\n\tconstructor(dex: ModdedDex, format: Format, prng: PRNG | PRNGSeed | null) {\n\t\tthis.dex = dex;\n\t\tthis.gen = this.dex.gen;\n\t\tthis.noStab = NoStab;\n\n\t\tconst ruleTable = this.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\tBug: (movePool) => movePool.includes('megahorn'),\n\t\t\tDark: (movePool, moves, abilities, types, counter) => !counter.get('Dark'),\n\t\t\tDragon: (movePool, moves, abilities, types, counter) => (\n\t\t\t\t!counter.get('Dragon') &&\n\t\t\t\t!movePool.includes('dualwingbeat')\n\t\t\t),\n\t\t\tElectric: (movePool, moves, abilities, types, counter) => !counter.get('Electric'),\n\t\t\tFairy: (movePool, moves, abilities, types, counter) => !counter.get('Fairy'),\n\t\t\tFighting: (movePool, moves, abilities, types, counter) => !counter.get('Fighting'),\n\t\t\tFire: (movePool, moves, abilities, types, counter, species) => !counter.get('Fire'),\n\t\t\tFlying: (movePool, moves, abilities, types, counter) => !counter.get('Flying'),\n\t\t\tGhost: (movePool, moves, abilities, types, counter) => !counter.get('Ghost'),\n\t\t\tGrass: (movePool, moves, abilities, types, counter, species) => (\n\t\t\t\t!counter.get('Grass') && (\n\t\t\t\t\tmovePool.includes('leafstorm') || species.baseStats.atk >= 100 ||\n\t\t\t\t\ttypes.includes('Electric') || abilities.has('Seed Sower')\n\t\t\t\t)\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) => !counter.get('Ice'),\n\t\t\tNormal: (movePool, moves, abilities, types, counter) => {\n\t\t\t\tif (movePool.includes('boomburst')) return true;\n\t\t\t\treturn (!counter.get('Normal') && movePool.includes('futuresight'));\n\t\t\t},\n\t\t\tPoison: (movePool, moves, abilities, types, counter) => {\n\t\t\t\tif (types.includes('Ground')) return false;\n\t\t\t\treturn !counter.get('Poison');\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 (movePool.includes('calmmind') || movePool.includes('psychicfangs') || movePool.includes('psychocut')) return true;\n\t\t\t\treturn abilities.has('Psychic Surge') || types.includes('Fire');\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 && !movePool.includes('makeitrain')) return false;\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 (species.id === 'quagsire') return false;\n\t\t\t\treturn !counter.get('Water');\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<T>(items: readonly T[]): T {\n\t\treturn this.prng.sample(items);\n\t}\n\n\tsampleIfArray<T>(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<T>(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\tqueryMoves(\n\t\tmoves: Set<string> | null,\n\t\ttypes: string[],\n\t\tteraType: string,\n\t\tabilities: Set<string> = new Set(),\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\tconst move = this.dex.moves.get(moveid);\n\n\t\t\tlet moveType = move.type;\n\t\t\tif (['judgment', 'revelationdance'].includes(moveid)) moveType = types[0];\n\t\t\tif (moveType === 'Normal') {\n\t\t\t\tif (abilities.has('Aerilate')) moveType = 'Flying';\n\t\t\t\tif (abilities.has('Galvanize')) moveType = 'Electric';\n\t\t\t\tif (abilities.has('Pixilate')) moveType = 'Fairy';\n\t\t\t\tif (abilities.has('Refrigerate')) moveType = 'Ice';\n\t\t\t}\n\t\t\tif (moveid === 'terablast') moveType = teraType;\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:\n\t\t\tif (move.basePower > 30 || move.multihit || move.basePowerCallback) {\n\t\t\t\tif (!this.noStab.includes(moveid) || abilities.has('Technician') && moveid === 'machpunch') {\n\t\t\t\t\tcounter.add(moveType);\n\t\t\t\t\tif (types.includes(moveType)) counter.stabCounter++;\n\t\t\t\t\tif (teraType === moveType) counter.add('stabtera');\n\t\t\t\t}\n\t\t\t\tif (move.flags['bite']) counter.add('strongjaw');\n\t\t\t\tif (move.flags['punch']) counter.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 || move.hasSheerForce) {\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 (RecoveryMove.includes(moveid)) counter.add('recovery');\n\t\t\tif (ContraryMoves.includes(moveid)) counter.add('contrary');\n\t\t\tif (PhysicalSetup.includes(moveid)) counter.add('physicalsetup');\n\t\t\tif (SpecialSetup.includes(moveid)) counter.add('specialsetup');\n\t\t\tif (MixedSetup.includes(moveid)) counter.add('mixedsetup');\n\t\t\tif (SpeedSetup.includes(moveid)) counter.add('speedsetup');\n\t\t\tif (Setup.includes(moveid)) counter.add('setup');\n\t\t\tif (Hazards.includes(moveid)) counter.add('hazards');\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\t\treturn counter;\n\t}\n\n\tcullMovePool(\n\t\ttypes: string[],\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\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\tteraType: string,\n\t\trole: string,\n\t): void {\n\t\tif (moves.size + movePool.length <= this.maxMoveCount) return;\n\t\t// If we have two unfilled moves and only one unpaired move, cull the unpaired move.\n\t\tif (moves.size === this.maxMoveCount - 2) {\n\t\t\tconst unpairedMoves = [...movePool];\n\t\t\tfor (const pair of MovePairs) {\n\t\t\t\tif (movePool.includes(pair[0]) && movePool.includes(pair[1])) {\n\t\t\t\t\tthis.fastPop(unpairedMoves, unpairedMoves.indexOf(pair[0]));\n\t\t\t\t\tthis.fastPop(unpairedMoves, unpairedMoves.indexOf(pair[1]));\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (unpairedMoves.length === 1) {\n\t\t\t\tthis.fastPop(movePool, movePool.indexOf(unpairedMoves[0]));\n\t\t\t}\n\t\t}\n\n\t\t// These moves are paired, and shouldn't appear if there is not room for them both.\n\t\tif (moves.size === this.maxMoveCount - 1) {\n\t\t\tfor (const pair of MovePairs) {\n\t\t\t\tif (movePool.includes(pair[0]) && movePool.includes(pair[1])) {\n\t\t\t\t\tthis.fastPop(movePool, movePool.indexOf(pair[0]));\n\t\t\t\t\tthis.fastPop(movePool, movePool.indexOf(pair[1]));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Develop additional move lists\n\t\tconst pivotingMoves = ['chillyreception', 'flipturn', 'partingshot', 'shedtail', 'teleport', 'uturn', 'voltswitch'];\n\t\tconst statusMoves = this.dex.moves.all()\n\t\t\t.filter(move => move.category === 'Status')\n\t\t\t.map(move => move.id);\n\t\tconst magnezoneMoves = ['bodypress', 'mirrorcoat', 'steelbeam'];\n\n\t\t// Team-based move culls\n\t\tif (teamDetails.stealthRock) {\n\t\t\tif (movePool.includes('stealthrock')) this.fastPop(movePool, movePool.indexOf('stealthrock'));\n\t\t}\n\t\tif (moves.size + movePool.length <= this.maxMoveCount) return;\n\t\tif (teamDetails.defog || teamDetails.rapidSpin) {\n\t\t\tif (movePool.includes('defog')) this.fastPop(movePool, movePool.indexOf('defog'));\n\t\t\tif (movePool.includes('rapidspin')) this.fastPop(movePool, movePool.indexOf('rapidspin'));\n\t\t}\n\t\tif (teamDetails.stickyWeb) {\n\t\t\tif (movePool.includes('stickyweb')) this.fastPop(movePool, movePool.indexOf('stickyweb'));\n\t\t}\n\n\t\t// These moves don't mesh well with other aspects of the set\n\t\tif (species.id !== \"spidops\") {\n\t\t\tthis.incompatibleMoves(moves, movePool, statusMoves, ['healingwish', 'memento', 'switcheroo', 'trick']);\n\t\t}\n\t\tif (species.id !== \"scyther\" && species.id !== \"scizor\") {\n\t\t\tthis.incompatibleMoves(moves, movePool, Setup, pivotingMoves);\n\t\t}\n\t\tthis.incompatibleMoves(moves, movePool, Setup, Hazards);\n\t\tthis.incompatibleMoves(moves, movePool, Setup, ['defog', 'nuzzle', 'toxic', 'waterspout', 'yawn']);\n\t\tthis.incompatibleMoves(moves, movePool, PhysicalSetup, PhysicalSetup);\n\t\tthis.incompatibleMoves(moves, movePool, SpecialSetup, 'thunderwave');\n\t\tthis.incompatibleMoves(moves, movePool, 'substitute', pivotingMoves);\n\t\tthis.incompatibleMoves(moves, movePool, SpeedSetup, ['aquajet', 'rest', 'trickroom']);\n\t\tthis.incompatibleMoves(moves, movePool, 'curse', 'rapidspin');\n\t\tthis.incompatibleMoves(moves, movePool, 'dragondance', 'dracometeor');\n\n\n\t\t// These attacks are redundant with each other\n\t\tthis.incompatibleMoves(moves, movePool, 'psychic', 'psyshock');\n\t\tthis.incompatibleMoves(moves, movePool, 'surf', 'hydropump');\n\t\tthis.incompatibleMoves(moves, movePool, 'wavecrash', 'liquidation');\n\t\tthis.incompatibleMoves(moves, movePool, ['airslash', 'bravebird', 'hurricane'], ['airslash', 'bravebird', 'hurricane']);\n\t\tthis.incompatibleMoves(moves, movePool, 'knockoff', 'foulplay');\n\t\tthis.incompatibleMoves(moves, movePool, 'doubleedge', 'headbutt');\n\t\tthis.incompatibleMoves(moves, movePool, 'fireblast', ['fierydance', 'flamethrower']);\n\t\tthis.incompatibleMoves(moves, movePool, 'lavaplume', 'magmastorm');\n\t\tthis.incompatibleMoves(moves, movePool, 'thunderpunch', 'wildcharge');\n\t\tthis.incompatibleMoves(moves, movePool, 'gunkshot', ['direclaw', 'poisonjab']);\n\t\tthis.incompatibleMoves(moves, movePool, 'aurasphere', 'focusblast');\n\t\tthis.incompatibleMoves(moves, movePool, 'closecombat', 'drainpunch');\n\t\tthis.incompatibleMoves(moves, movePool, 'bugbite', 'pounce');\n\t\tthis.incompatibleMoves(moves, movePool, 'bittermalice', 'shadowball');\n\t\tthis.incompatibleMoves(moves, movePool, ['dragonpulse', 'spacialrend'], 'dracometeor');\n\n\n\t\t// These status moves are redundant with each other\n\t\tthis.incompatibleMoves(moves, movePool, ['taunt', 'strengthsap'], 'encore');\n\t\tthis.incompatibleMoves(moves, movePool, 'toxic', 'willowisp');\n\t\tthis.incompatibleMoves(moves, movePool, ['thunderwave', 'toxic', 'willowisp'], 'toxicspikes');\n\t\tthis.incompatibleMoves(moves, movePool, 'thunderwave', 'yawn');\n\n\t\t// This space reserved for assorted hardcodes that otherwise make little sense out of context\n\t\t// Landorus\n\t\tthis.incompatibleMoves(moves, movePool, 'nastyplot', 'rockslide');\n\t\t// Persian and Seviper\n\t\tthis.incompatibleMoves(moves, movePool, 'switcheroo', ['fakeout', 'suckerpunch']);\n\t\t// Beartic\n\t\tthis.incompatibleMoves(moves, movePool, 'snowscape', 'swordsdance');\n\t\t// Cryogonal\n\t\tif (!teamDetails.defog && !teamDetails.rapidSpin && species.id === 'cryogonal') {\n\t\t\tthis.fastPop(movePool, movePool.indexOf('haze'));\n\t\t}\n\t\t// Magnezone\n\t\tthis.incompatibleMoves(moves, movePool, magnezoneMoves, magnezoneMoves);\n\t\t// Amoonguss, though this can work well as a general rule later\n\t\tthis.incompatibleMoves(moves, movePool, 'toxic', 'clearsmog');\n\t}\n\n\t// Checks for and removes incompatible moves, starting with the first move in movesA.\n\tincompatibleMoves(\n\t\tmoves: Set<string>,\n\t\tmovePool: string[],\n\t\tmovesA: string | string[],\n\t\tmovesB: string | string[],\n\t): void {\n\t\tconst moveArrayA = (Array.isArray(movesA)) ? movesA : [movesA];\n\t\tconst moveArrayB = (Array.isArray(movesB)) ? movesB : [movesB];\n\t\tif (moves.size + movePool.length <= this.maxMoveCount) return;\n\t\tfor (const moveid1 of moves) {\n\t\t\tif (moveArrayB.includes(moveid1)) {\n\t\t\t\tfor (const moveid2 of moveArrayA) {\n\t\t\t\t\tif (moveid1 !== moveid2 && movePool.includes(moveid2)) {\n\t\t\t\t\t\tthis.fastPop(movePool, movePool.indexOf(moveid2));\n\t\t\t\t\t\tif (moves.size + movePool.length <= this.maxMoveCount) return;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (moveArrayA.includes(moveid1)) {\n\t\t\t\tfor (const moveid2 of moveArrayB) {\n\t\t\t\t\tif (moveid1 !== moveid2 && movePool.includes(moveid2)) {\n\t\t\t\t\t\tthis.fastPop(movePool, movePool.indexOf(moveid2));\n\t\t\t\t\t\tif (moves.size + movePool.length <= this.maxMoveCount) return;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Adds a move to the moveset, returns the MoveCounter\n\taddMove(\n\t\tmove: string,\n\t\tmoves: Set<string>,\n\t\ttypes: string[],\n\t\tabilities: Set<string>,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tisLead: boolean,\n\t\tisDoubles: boolean,\n\t\tmovePool: string[],\n\t\tteraType: string,\n\t\trole: string,\n\t): MoveCounter {\n\t\tmoves.add(move);\n\t\tthis.fastPop(movePool, movePool.indexOf(move));\n\t\tconst counter = this.queryMoves(moves, species.types, teraType, abilities);\n\t\tthis.cullMovePool(types, moves, abilities, counter, movePool, teamDetails, species, isLead, isDoubles, teraType, role);\n\t\treturn counter;\n\t}\n\n\t// Generate random moveset for a given species, role, tera type.\n\trandomMoveset(\n\t\ttypes: string[],\n\t\tabilities: Set<string>,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tisLead: boolean,\n\t\tisDoubles: boolean,\n\t\tmovePool: string[],\n\t\tteraType: string,\n\t\trole: string,\n\t): Set<string> {\n\t\tconst moves = new Set<string>();\n\t\tlet counter = this.queryMoves(moves, species.types, teraType, abilities);\n\t\tthis.cullMovePool(types, moves, abilities, counter, movePool, teamDetails, species, isLead, isDoubles, teraType, role);\n\n\t\t// If there are only four moves, add all moves and return early\n\t\tif (movePool.length <= this.maxMoveCount) {\n\t\t\tfor (const moveid of movePool) {\n\t\t\t\tmoves.add(moveid);\n\t\t\t}\n\t\t\treturn moves;\n\t\t}\n\n\t\tconst runEnforcementChecker = (checkerName: string) => {\n\t\t\tif (!this.moveEnforcementCheckers[checkerName]) return false;\n\t\t\treturn this.moveEnforcementCheckers[checkerName](\n\t\t\t\tmovePool, moves, abilities, types, counter, species, teamDetails, isLead, isDoubles, teraType, role\n\t\t\t);\n\t\t};\n\n\t\tif (role === \"Tera Blast user\") {\n\t\t\tcounter = this.addMove('terablast', moves, types, abilities, teamDetails, species, isLead, isDoubles,\n\t\t\t\tmovePool, teraType, role);\n\t\t}\n\t\t// Add required move (e.g. Relic Song for Meloetta-P)\n\t\tif (species.requiredMove) {\n\t\t\tconst move = this.dex.moves.get(species.requiredMove).id;\n\t\t\tcounter = this.addMove(move, moves, types, abilities, teamDetails, species, isLead, isDoubles,\n\t\t\t\tmovePool, teraType, role);\n\t\t}\n\n\t\t// Add other moves you really want to have, e.g. STAB, recovery, setup, depending on role.\n\n\t\t// Enforce STAB\n\t\tfor (const type of types) {\n\t\t\t// Check if a STAB move of that type should be required\n\t\t\tif (runEnforcementChecker(type)) {\n\t\t\t\tconst stabMoves = [];\n\t\t\t\tfor (const moveid of movePool) {\n\t\t\t\t\tconst move = this.dex.moves.get(moveid);\n\t\t\t\t\tlet moveType = move.type;\n\t\t\t\t\tif (['judgment', 'revelationdance'].includes(moveid)) moveType = types[0];\n\t\t\t\t\tif (moveType === 'Normal') {\n\t\t\t\t\t\tif (abilities.has('Aerilate')) moveType = 'Flying';\n\t\t\t\t\t\tif (abilities.has('Galvanize')) moveType = 'Electric';\n\t\t\t\t\t\tif (abilities.has('Pixilate')) moveType = 'Fairy';\n\t\t\t\t\t\tif (abilities.has('Refrigerate')) moveType = 'Ice';\n\t\t\t\t\t}\n\t\t\t\t\tif (moveid === 'terablast') moveType = teraType;\n\t\t\t\t\tif (type === moveType &&\n\t\t\t\t\t\t(move.basePower > 30 || move.multihit || move.basePowerCallback) &&\n\t\t\t\t\t\t(!this.noStab.includes(moveid) || abilities.has('Technician') && moveid === 'machpunch')) {\n\t\t\t\t\t\tstabMoves.push(moveid);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (stabMoves.length) {\n\t\t\t\t\tconst moveid = this.sample(stabMoves);\n\t\t\t\t\tcounter = this.addMove(moveid, moves, types, abilities, teamDetails, species, isLead, isDoubles,\n\t\t\t\t\t\tmovePool, teraType, role);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// If no STAB move was added in the previous step, add a STAB move\n\t\tif (!counter.stabCounter) {\n\t\t\tconst stabMoves = [];\n\t\t\tfor (const moveid of movePool) {\n\t\t\t\tconst move = this.dex.moves.get(moveid);\n\t\t\t\tlet moveType = move.type;\n\t\t\t\tif (['judgment', 'revelationdance'].includes(moveid)) moveType = types[0];\n\t\t\t\tif (moveType === 'Normal') {\n\t\t\t\t\tif (abilities.has('Aerilate')) moveType = 'Flying';\n\t\t\t\t\tif (abilities.has('Galvanize')) moveType = 'Electric';\n\t\t\t\t\tif (abilities.has('Pixilate')) moveType = 'Fairy';\n\t\t\t\t\tif (abilities.has('Refrigerate')) moveType = 'Ice';\n\t\t\t\t}\n\t\t\t\tif (moveid === 'terablast') moveType = teraType;\n\t\t\t\tif (!this.noStab.includes(moveid) && (move.basePower > 30 || move.multihit || move.basePowerCallback)) {\n\t\t\t\t\tif (types.includes(moveType)) {\n\t\t\t\t\t\tstabMoves.push(moveid);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (stabMoves.length) {\n\t\t\t\tconst moveid = this.sample(stabMoves);\n\t\t\t\tcounter = this.addMove(moveid, moves, types, abilities, teamDetails, species, isLead, isDoubles,\n\t\t\t\t\tmovePool, teraType, role);\n\t\t\t}\n\t\t}\n\n\t\t// Enforce Tera STAB\n\t\tif (!counter.get('stabtera') && role !== \"Bulky Support\") {\n\t\t\tconst stabMoves = [];\n\t\t\tfor (const moveid of movePool) {\n\t\t\t\tconst move = this.dex.moves.get(moveid);\n\t\t\t\tlet moveType = move.type;\n\t\t\t\tif (['judgment', 'revelationdance'].includes(moveid)) moveType = types[0];\n\t\t\t\tif (!this.noStab.includes(moveid) && (move.basePower > 30 || move.multihit || move.basePowerCallback)) {\n\t\t\t\t\tif (teraType === moveType) {\n\t\t\t\t\t\tstabMoves.push(moveid);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (stabMoves.length) {\n\t\t\t\tconst moveid = this.sample(stabMoves);\n\t\t\t\tcounter = this.addMove(moveid, moves, types, abilities, teamDetails, species, isLead, isDoubles,\n\t\t\t\t\tmovePool, teraType, role);\n\t\t\t}\n\t\t}\n\n\t\t// Enforce Facade if Guts is a possible ability\n\t\tif (movePool.includes('facade') && abilities.has('Guts')) {\n\t\t\tcounter = this.addMove('facade', moves, types, abilities, teamDetails, species, isLead, isDoubles,\n\t\t\t\tmovePool, teraType, role);\n\t\t}\n\n\t\t// Enforce Sticky Web\n\t\tif (movePool.includes('stickyweb')) {\n\t\t\tcounter = this.addMove('stickyweb', moves, types, abilities, teamDetails, species, isLead, isDoubles,\n\t\t\t\tmovePool, teraType, role);\n\t\t}\n\n\t\t// Enforce Revival Blessing\n\t\tif (movePool.includes('revivalblessing')) {\n\t\t\tcounter = this.addMove('revivalblessing', moves, types, abilities, teamDetails, species, isLead, isDoubles,\n\t\t\t\tmovePool, teraType, role);\n\t\t}\n\n\t\t// Enforce Toxic on Grafaiai\n\t\tif (movePool.includes('toxic') && species.id === 'grafaiai') {\n\t\t\tcounter = this.addMove('toxic', moves, types, abilities, teamDetails, species, isLead, isDoubles,\n\t\t\t\tmovePool, teraType, role);\n\t\t}\n\n\t\t// Enforce recovery\n\t\tif ([\"Bulky Support\", \"Bulky Attacker\", \"Bulky Setup\"].includes(role)) {\n\t\t\tconst recoveryMoves = movePool.filter(moveid => RecoveryMove.includes(moveid));\n\t\t\tif (recoveryMoves.length) {\n\t\t\t\tconst moveid = this.sample(recoveryMoves);\n\t\t\t\tcounter = this.addMove(moveid, moves, types, abilities, teamDetails, species, isLead, isDoubles,\n\t\t\t\t\tmovePool, teraType, role);\n\t\t\t}\n\t\t}\n\n\t\t// Enforce setup\n\t\tif (role.includes('Setup') || role === 'Tera Blast user') {\n\t\t\t// First, try to add a non-Speed setup move\n\t\t\tconst nonSpeedSetupMoves = movePool.filter(moveid => Setup.includes(moveid) && !SpeedSetup.includes(moveid));\n\t\t\tif (nonSpeedSetupMoves.length) {\n\t\t\t\tconst moveid = this.sample(nonSpeedSetupMoves);\n\t\t\t\tcounter = this.addMove(moveid, moves, types, abilities, teamDetails, species, isLead, isDoubles,\n\t\t\t\t\tmovePool, teraType, role);\n\t\t\t} else {\n\t\t\t\t// No non-Speed setup moves, so add any (Speed) setup move\n\t\t\t\tconst setupMoves = movePool.filter(moveid => Setup.includes(moveid));\n\t\t\t\tif (setupMoves.length) {\n\t\t\t\t\tconst moveid = this.sample(setupMoves);\n\t\t\t\t\tcounter = this.addMove(moveid, moves, types, abilities, teamDetails, species, isLead, isDoubles,\n\t\t\t\t\t\tmovePool, teraType, role);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Enforce coverage move\n\t\tif (!['AV Pivot', 'Fast Support', 'Bulky Support'].includes(role)) {\n\t\t\tif (counter.damagingMoves.size <= 1) {\n\t\t\t\t// Find the type of the current attacking move\n\t\t\t\tlet currentAttackType: string;\n\t\t\t\tfor (const moveid of moves) {\n\t\t\t\t\tconst move = this.dex.moves.get(moveid);\n\t\t\t\t\tif (move.basePower > 30 || move.multihit || move.basePowerCallback) {\n\t\t\t\t\t\tlet moveType = move.type;\n\t\t\t\t\t\tif (['judgment', 'revelationdance'].includes(moveid)) moveType = types[0];\n\t\t\t\t\t\tif (moveType === 'Normal') {\n\t\t\t\t\t\t\tif (abilities.has('Aerilate')) moveType = 'Flying';\n\t\t\t\t\t\t\tif (abilities.has('Galvanize')) moveType = 'Electric';\n\t\t\t\t\t\t\tif (abilities.has('Pixilate')) moveType = 'Fairy';\n\t\t\t\t\t\t\tif (abilities.has('Refrigerate')) moveType = 'Ice';\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (moveid === 'terablast') moveType = teraType;\n\t\t\t\t\t\tcurrentAttackType = move.type;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Choose an attacking move that is of different type to the current single attack\n\t\t\t\tconst coverageMoves = [];\n\t\t\t\tfor (const moveid of movePool) {\n\t\t\t\t\tconst move = this.dex.moves.get(moveid);\n\t\t\t\t\tlet moveType = move.type;\n\t\t\t\t\tif (['judgment', 'revelationdance'].includes(moveid)) moveType = types[0];\n\t\t\t\t\tif (moveType === 'Normal') {\n\t\t\t\t\t\tif (abilities.has('Aerilate')) moveType = 'Flying';\n\t\t\t\t\t\tif (abilities.has('Galvanize')) moveType = 'Electric';\n\t\t\t\t\t\tif (abilities.has('Pixilate')) moveType = 'Fairy';\n\t\t\t\t\t\tif (abilities.has('Refrigerate')) moveType = 'Ice';\n\t\t\t\t\t}\n\t\t\t\t\tif (!this.noStab.includes(moveid) && (move.basePower > 30 || move.multihit || move.basePowerCallback)) {\n\t\t\t\t\t\tif (currentAttackType! !== moveType) coverageMoves.push(moveid);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (coverageMoves.length) {\n\t\t\t\t\tconst moveid = this.sample(coverageMoves);\n\t\t\t\t\tcounter = this.addMove(moveid, moves, types, abilities, teamDetails, species, isLead, isDoubles,\n\t\t\t\t\t\tmovePool, teraType, role);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Enforce STAB priority\n\t\tif (role === 'Bulky Attacker' || role === 'Bulky Setup' || species.id === 'breloom') {\n\t\t\tconst priorityMoves = [];\n\t\t\tfor (const moveid of movePool) {\n\t\t\t\tconst move = this.dex.moves.get(moveid);\n\t\t\t\tlet moveType = move.type;\n\t\t\t\tif (moveType === 'Normal') {\n\t\t\t\t\tif (abilities.has('Aerilate')) moveType = 'Flying';\n\t\t\t\t\tif (abilities.has('Galvanize')) moveType = 'Electric';\n\t\t\t\t\tif (abilities.has('Pixilate')) moveType = 'Fairy';\n\t\t\t\t\tif (abilities.has('Refrigerate')) moveType = 'Ice';\n\t\t\t\t}\n\t\t\t\tif (types.includes(moveType) && move.priority > 0 && move.category !== 'Status') {\n\t\t\t\t\tpriorityMoves.push(moveid);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (priorityMoves.length) {\n\t\t\t\tconst moveid = this.sample(priorityMoves);\n\t\t\t\tcounter = this.addMove(moveid, moves, types, abilities, teamDetails, species, isLead, isDoubles,\n\t\t\t\t\tmovePool, teraType, role);\n\t\t\t}\n\t\t}\n\n\t\t// Add (moves.size < this.maxMoveCount) as a condition if moves is getting larger than 4 moves.\n\t\t// If you want moves to be favored but not required, add something like && this.randomChance(1, 2) to your condition.\n\n\t\t// Choose remaining moves randomly from movepool and add them to moves list:\n\t\twhile (moves.size < this.maxMoveCount && movePool.length) {\n\t\t\tif (moves.size + movePool.length <= this.maxMoveCount) {\n\t\t\t\tfor (const moveid of movePool) {\n\t\t\t\t\tmoves.add(moveid);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tconst moveid = this.sample(movePool);\n\t\t\tcounter = this.addMove(moveid, moves, types, abilities, teamDetails, species, isLead, isDoubles,\n\t\t\t\tmovePool, teraType, role);\n\t\t\tfor (const pair of MovePairs) {\n\t\t\t\tif (moveid === pair[0] && movePool.includes(pair[1])) {\n\t\t\t\t\tcounter = this.addMove(pair[1], moves, types, abilities, teamDetails, species, isLead, isDoubles,\n\t\t\t\t\t\tmovePool, teraType, role);\n\t\t\t\t}\n\t\t\t\tif (moveid === pair[1] && movePool.includes(pair[0])) {\n\t\t\t\t\tcounter = this.addMove(pair[0], moves, types, abilities, teamDetails, species, isLead, isDoubles,\n\t\t\t\t\t\tmovePool, teraType, role);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn moves;\n\t}\n\n\tshouldCullAbility(\n\t\tability: string,\n\t\ttypes: string[],\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tisLead: boolean,\n\t\tisDoubles: boolean,\n\t\tteraType: string,\n\t\trole: string,\n\t): boolean {\n\t\tif ([\n\t\t\t'Armor Tail', 'Battle Bond', 'Flare Boost', 'Gluttony', 'Harvest', 'Hydration', 'Ice Body',\n\t\t\t'Immunity', 'Own Tempo', '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 'Chlorophyll':\n\t\t\treturn (!moves.has('sunnyday') && !teamDetails.sun && species.id !== 'lilligant');\n\t\tcase 'Cloud Nine':\n\t\t\treturn (species.id !== 'golduck');\n\t\tcase 'Competitive':\n\t\t\treturn (species.id === 'kilowattrel');\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') || (abilities.has('Prankster') && (moves.has('thunderwave') || moves.has('taunt'))));\n\t\tcase 'Flash Fire':\n\t\t\treturn (species.id !== 'houndoom' && this.dex.getEffectiveness('Fire', species) < 0);\n\t\tcase 'Guts':\n\t\t\treturn (!moves.has('facade') && !moves.has('sleeptalk'));\n\t\tcase 'Hustle': case 'Inner Focus':\n\t\t\treturn (counter.get('Physical') < 2);\n\t\tcase 'Infiltrator':\n\t\t\treturn (moves.has('rest') && moves.has('sleeptalk')) || (isDoubles && abilities.has('Clear Body'));\n\t\tcase 'Insomnia':\n\t\t\treturn (role === 'Wallbreaker');\n\t\tcase 'Intimidate':\n\t\t\tif (abilities.has('Hustle')) return true;\n\t\t\tif (abilities.has('Sheer Force') && !!counter.get('sheerforce')) return true;\n\t\t\treturn (abilities.has('Stakeout') || moves.has('substitute'));\n\t\tcase 'Iron Fist':\n\t\t\treturn !counter.ironFist;\n\t\tcase 'Justified':\n\t\t\treturn !counter.get('Physical');\n\t\tcase 'Mold Breaker':\n\t\t\treturn (abilities.has('Sharpness') || abilities.has('Unburden'));\n\t\tcase 'Moxie':\n\t\t\treturn (!counter.get('Physical') || moves.has('stealthrock'));\n\t\tcase 'Overgrow':\n\t\t\treturn !counter.get('Grass');\n\t\tcase 'Prankster':\n\t\t\treturn !counter.get('Status');\n\t\tcase 'Pressure':\n\t\t\treturn (!!counter.get('setup') || counter.get('Status') < 2 || isDoubles);\n\t\tcase 'Reckless':\n\t\t\treturn !counter.get('recoil');\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;\n\t\tcase 'Sap Sipper':\n\t\t\treturn species.id === 'wyrdeer';\n\t\tcase 'Seed Sower':\n\t\t\treturn role === 'Bulky Support';\n\t\tcase 'Shed Skin':\n\t\t\treturn species.id === 'seviper';\n\t\tcase 'Sheer Force':\n\t\t\tif (species.id === 'braviaryhisui' && role === 'Wallbreaker') return true;\n\t\t\treturn (!counter.get('sheerforce') || ['Guts', 'Sharpness', 'Slush Rush'].some(m => abilities.has(m)));\n\t\tcase 'Slush Rush':\n\t\t\treturn !teamDetails.snow;\n\t\tcase 'Solar Power':\n\t\t\treturn (!teamDetails.sun);\n\t\tcase 'Stakeout':\n\t\t\treturn (counter.damagingMoves.size < 1);\n\t\tcase 'Sturdy':\n\t\t\treturn !!counter.get('recoil');\n\t\tcase 'Swarm':\n\t\t\treturn (!counter.get('Bug') || !!counter.get('recovery'));\n\t\tcase 'Sweet Veil':\n\t\t\treturn types.includes('Grass');\n\t\tcase 'Swift Swim':\n\t\t\treturn (!moves.has('raindance') && !teamDetails.rain);\n\t\tcase 'Synchronize':\n\t\t\treturn (species.id !== 'umbreon' && species.id !== 'rabsca');\n\t\tcase 'Technician':\n\t\t\treturn (!counter.get('technician') || abilities.has('Punk Rock'));\n\t\tcase 'Tinted Lens':\n\t\t\treturn (species.id === 'braviaryhisui' && role === 'Fast Support');\n\t\tcase 'Unburden':\n\t\t\treturn (abilities.has('Prankster') || !counter.get('setup'));\n\t\tcase 'Volt Absorb':\n\t\t\tif (abilities.has('Iron Fist') && counter.ironFist >= 2) return true;\n\t\t\treturn (this.dex.getEffectiveness('Electric', species) < -1);\n\t\tcase 'Water Absorb':\n\t\t\treturn species.id === 'quagsire';\n\t\tcase 'Weak Armor':\n\t\t\treturn moves.has('shellsmash');\n\t\t}\n\n\t\treturn false;\n\t}\n\n\n\tgetAbility(\n\t\ttypes: string[],\n\t\tmoves: Set<string>,\n\t\tabilities: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tisLead: boolean,\n\t\tisDoubles: boolean,\n\t\tteraType: string,\n\t\trole: string,\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\t\tif (species.id === 'arcaninehisui') return 'Rock Head';\n\t\tif (species.id === 'staraptor') return 'Reckless';\n\t\tif (species.id === 'enamorus' && moves.has('calmmind')) return 'Cute Charm';\n\t\tif (abilities.has('Corrosion') && moves.has('toxic') && this.randomChance(1, 2)) return 'Corrosion';\n\t\tif (abilities.has('Guts') && (moves.has('facade') || moves.has('sleeptalk'))) return 'Guts';\n\t\tif (abilities.has('Harvest') && moves.has('substitute')) return 'Harvest';\n\t\tif (abilities.has('Serene Grace') && moves.has('headbutt')) return 'Serene Grace';\n\t\tif (abilities.has('Technician') && counter.get('technician')) return 'Technician';\n\t\tif (abilities.has('Own Tempo') && moves.has('petaldance')) return 'Own Tempo';\n\t\tif (abilities.has('Slush Rush') && moves.has('snowscape')) return 'Slush Rush';\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, teamDetails, species, isLead, isDoubles, teraType, role\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 culled, re-allow all\n\t\tif (!abilityAllowed.length) abilityAllowed = abilityData;\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\tgetPriorityItem(\n\t\tability: string,\n\t\ttypes: string[],\n\t\tmoves: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tisLead: boolean,\n\t\tisDoubles: boolean,\n\t\tteraType: string,\n\t\trole: string,\n\t) {\n\t\tif (species.requiredItems) {\n\t\t\t// Z-Crystals aren't available in Gen 9, so require Plates\n\t\t\tif (species.baseSpecies === 'Arceus') {\n\t\t\t\treturn species.requiredItems[0];\n\t\t\t}\n\t\t\treturn this.sample(species.requiredItems);\n\t\t}\n\t\tif (role === 'AV Pivot') return 'Assault Vest';\n\t\tif (\n\t\t\t!isLead && role === 'Bulky Setup' &&\n\t\t\t(ability === 'Quark Drive' || ability === 'Protosynthesis')\n\t\t) {\n\t\t\treturn 'Booster Energy';\n\t\t}\n\t\tif (species.id === 'pikachu') return 'Light Ball';\n\t\tif (species.id === 'regieleki') return 'Magnet';\n\t\tif (species.id === 'pincurchin') return 'Shuca Berry';\n\t\tif (ability === 'Imposter' || (species.id === 'magnezone' && moves.has('bodypress'))) return 'Choice Scarf';\n\t\tif (moves.has('bellydrum') && moves.has('substitute')) return 'Salac Berry';\n\t\tif (\n\t\t\t['Cheek Pouch', 'Cud Chew', 'Harvest'].some(m => ability === m) ||\n\t\t\tmoves.has('bellydrum') || moves.has('filletaway')\n\t\t) {\n\t\t\treturn 'Sitrus Berry';\n\t\t}\n\t\tif (['healingwish', 'switcheroo', 'trick'].some(m => moves.has(m))) {\n\t\t\tif (species.baseStats.spe >= 60 && species.baseStats.spe <= 108 && role !== 'Wallbreaker') {\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 ((ability === 'Guts' || moves.has('facade')) && !moves.has('sleeptalk')) {\n\t\t\treturn (types.includes('Fire') || ability === 'Toxic Boost') ? 'Toxic Orb' : 'Flame Orb';\n\t\t}\n\t\tif (\n\t\t\t(ability === 'Magic Guard' && counter.damagingMoves.size > 1) ||\n\t\t\t(ability === 'Sheer Force' && counter.get('sheerforce'))\n\t\t) {\n\t\t\treturn 'Life Orb';\n\t\t}\n\t\tif (moves.has('shellsmash')) return 'White Herb';\n\t\tif (moves.has('populationbomb')) return 'Wide Lens';\n\t\tif (moves.has('stuffcheeks')) return 'Salac Berry';\n\t\tif (ability === 'Unburden') return moves.has('closecombat') ? 'White Herb' : 'Sitrus Berry';\n\t\tif (moves.has('acrobatics')) return ability === 'Grassy Surge' ? 'Grassy Seed' : '';\n\t\tif (moves.has('auroraveil') || moves.has('lightscreen') && moves.has('reflect')) return 'Light Clay';\n\t\tif (\n\t\t\tmoves.has('rest') && !moves.has('sleeptalk') &&\n\t\t\tability !== 'Natural Cure' && ability !== 'Shed Skin'\n\t\t) {\n\t\t\treturn 'Chesto Berry';\n\t\t}\n\t\tif (species.id === 'scyther') return isLead ? 'Eviolite' : 'Heavy-Duty Boots';\n\t\tif (species.nfe) return 'Eviolite';\n\t\tif (this.dex.getEffectiveness('Rock', species) >= 2) return 'Heavy-Duty Boots';\n\t}\n\n\t/** Item generation specific to Random Doubles */\n\t// This will be changed and used later, once doubles is actually coming out.\n\tgetDoublesItem(\n\t\tability: string,\n\t\ttypes: string[],\n\t\tmoves: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tteraType: string,\n\t\trole: string,\n\t) {\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.snow) return 'Blunder Policy';\n\t\tif (this.dex.getEffectiveness('Rock', species) >= 2 && !types.includes('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.includes('Dragon') || types.includes('Fighting') || types.includes('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') && ability !== '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.includes('Dragon') || types.includes('Fighting') || types.includes('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\tgetItem(\n\t\tability: string,\n\t\ttypes: string[],\n\t\tmoves: Set<string>,\n\t\tcounter: MoveCounter,\n\t\tteamDetails: RandomTeamsTypes.TeamDetails,\n\t\tspecies: Species,\n\t\tisLead: boolean,\n\t\tisDoubles: boolean,\n\t\tteraType: string,\n\t\trole: string,\n\t): string | undefined {\n\t\tif (\n\t\t\t(counter.get('Physical') >= 4 ||\n\t\t\t(counter.get('Physical') >= 3 && moves.has('memento'))) &&\n\t\t\t['fakeout', 'firstimpression', 'flamecharge', 'rapidspin', 'ruination', 'superfang'].every(m => !moves.has(m))\n\t\t) {\n\t\t\tconst scarfReqs = (\n\t\t\t\trole !== 'Wallbreaker' &&\n\t\t\t\t(species.baseStats.atk >= 100 || ability === 'Huge Power' || ability === 'Pure Power') &&\n\t\t\t\tspecies.baseStats.spe >= 60 && species.baseStats.spe <= 108 &&\n\t\t\t\tability !== 'Speed Boost' && !counter.get('priority') && !moves.has('aquastep')\n\t\t\t);\n\t\t\treturn (scarfReqs && this.randomChance(1, 2)) ? 'Choice Scarf' : 'Choice Band';\n\t\t}\n\t\tif (counter.get('Physical') === 3 && moves.has('shedtail')) return 'Choice Scarf';\n\t\tif (\n\t\t\t(counter.get('Special') >= 4) ||\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\trole !== 'Wallbreaker' &&\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 !== 'Speed Boost' && ability !== 'Tinted Lens' && !counter.get('Physical')\n\t\t\t);\n\t\t\treturn (scarfReqs && this.randomChance(1, 2)) ? 'Choice Scarf' : 'Choice Specs';\n\t\t}\n\t\tif (!counter.get('Status') && role !== 'Fast Attacker' && role !== 'Wallbreaker') return 'Assault Vest';\n\t\tif (counter.get('speedsetup') && this.dex.getEffectiveness('Ground', species) < 1) return 'Weakness Policy';\n\t\tif (species.id === 'urshifurapidstrike') return 'Punching Glove';\n\t\tif (species.id === 'lokix' && role === 'Wallbreaker') return 'Life Orb';\n\t\tif (species.id === 'toxtricity' && moves.has('shiftgear')) return 'Throat Spray';\n\t\tif (moves.has('substitute') || ability === 'Moody') return 'Leftovers';\n\t\tif (\n\t\t\t!teamDetails.defog && !teamDetails.rapidSpin &&\n\t\t\tthis.dex.getEffectiveness('Rock', species) >= 1\n\t\t) return 'Heavy-Duty Boots';\n\t\tif (\n\t\t\trole === 'Fast Support' &&\n\t\t\t['defog', 'rapidspin', 'uturn', 'voltswitch'].some(m => moves.has(m)) &&\n\t\t\t!types.includes('Flying') && ability !== 'Levitate'\n\t\t) return 'Heavy-Duty Boots';\n\n\t\t// Low Priority\n\t\tif (moves.has('outrage')) return 'Lum Berry';\n\t\tif (\n\t\t\t(species.id === 'garchomp' && role === 'Fast Support') ||\n\t\t\t(ability === 'Regenerator' && types.includes('Water') && species.baseStats.def >= 110 && this.randomChance(1, 3))\n\t\t) return 'Rocky Helmet';\n\t\tif (\n\t\t\trole === 'Fast Support' && isLead &&\n\t\t\t!counter.get('recovery') && !counter.get('recoil') &&\n\t\t\t(species.baseStats.hp + species.baseStats.def + species.baseStats.spd) < 300\n\t\t) return 'Focus Sash';\n\t\tif (\n\t\t\trole !== 'Fast Attacker' && role !== 'Tera Blast user' && ability !== 'Levitate' &&\n\t\t\tthis.dex.getEffectiveness('Ground', species) >= 2\n\t\t) return 'Air Balloon';\n\t\tif (['Bulky Attacker', 'Bulky Support', 'Bulky Setup'].some(m => role === (m))) return 'Leftovers';\n\t\tif (role === 'Fast Support' || role === 'Fast Bulky Setup') {\n\t\t\treturn (counter.damagingMoves.size >= 3) ? 'Life Orb' : 'Leftovers';\n\t\t}\n\t\tif (\n\t\t\t['flamecharge', 'rapidspin', 'trailblaze'].every(m => !moves.has(m)) &&\n\t\t\t['Fast Attacker', 'Setup Sweeper', 'Tera Blast user', 'Wallbreaker'].some(m => role === (m))\n\t\t) return 'Life Orb';\n\t\tif (isDoubles) return 'Sitrus Berry';\n\t\treturn 'Leftovers';\n\t}\n\n\tgetLevel(\n\t\tspecies: Species,\n\t\tisDoubles: boolean,\n\t): number {\n\t\tif (this.adjustLevel) return this.adjustLevel;\n\t\t// doubles levelling\n\t\tif (isDoubles && this.randomDoublesSets[species.id][\"level\"]) return this.randomDoublesSets[species.id][\"level\"];\n\t\tif (!isDoubles && this.randomSets[species.id][\"level\"]) return this.randomSets[species.id][\"level\"];\n\t\t// Default to tier-based levelling\n\t\tconst tier = species.tier;\n\t\tconst tierScale: Partial<Record<Species['tier'], number>> = {\n\t\t\tUber: 76,\n\t\t\tOU: 80,\n\t\t\tUUBL: 81,\n\t\t\tUU: 82,\n\t\t\tRUBL: 83,\n\t\t\tRU: 84,\n\t\t\tNUBL: 85,\n\t\t\tNU: 86,\n\t\t\tPUBL: 87,\n\t\t\tPU: 88, \"(PU)\": 88, NFE: 88,\n\t\t};\n\t\treturn tierScale[tier] || 80;\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): RandomTeamsTypes.RandomSet {\n\t\tspecies = this.dex.species.get(species);\n\t\tlet forme = species.name;\n\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\tforme = species.battleOnly;\n\t\t}\n\t\tif (species.cosmeticFormes) {\n\t\t\tforme = this.sample([species.name].concat(species.cosmeticFormes));\n\t\t}\n\t\tconst sets = (this as any)[`random${isDoubles ? 'Doubles' : ''}Sets`][species.id][\"sets\"];\n\t\tconst possibleSets = [];\n\t\tfor (const set of sets) {\n\t\t\tif (teamDetails.teraBlast && set.role === \"Tera Blast user\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tpossibleSets.push(set);\n\t\t}\n\t\tconst set = this.sampleIfArray(possibleSets);\n\t\tconst role = set.role;\n\t\tconst movePool: string[] = [];\n\t\tfor (const movename of set.movepool) {\n\t\t\tmovePool.push(this.dex.moves.get(movename).id);\n\t\t}\n\t\tconst teraTypes = set.teraTypes;\n\t\tconst teraType = this.sampleIfArray(teraTypes);\n\n\t\tif (this.format.gameType === 'multi' || this.format.gameType === 'freeforall') {\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\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 = 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\t// Get moves\n\t\tconst moves = this.randomMoveset(types, abilities, teamDetails, species, isLead, isDoubles, movePool, teraType, role);\n\t\tconst counter = this.queryMoves(moves, species.types, teraType, abilities);\n\n\t\t// Get ability\n\t\tability = this.getAbility(types, moves, abilities, counter, teamDetails, species, isLead, isDoubles, teraType, role);\n\n\t\t// Get items\n\t\t// First, the priority items\n\t\titem = this.getPriorityItem(ability, types, moves, counter, teamDetails, species, isLead, isDoubles, teraType, role);\n\t\tif (item === undefined && isDoubles) {\n\t\t\titem = this.getDoublesItem(ability, types, moves, counter, teamDetails, species, teraType, role);\n\t\t}\n\t\tif (item === undefined) {\n\t\t\titem = this.getItem(ability, types, moves, counter, teamDetails, species, isLead, isDoubles, teraType, role);\n\t\t}\n\n\t\t// fallback\n\t\tif (item === undefined) item = isDoubles ? 'Sitrus Berry' : 'Leftovers';\n\n\t\tif (species.baseSpecies === 'Pikachu') {\n\t\t\tforme = 'Pikachu' + this.sample(['', '-Original', '-Hoenn', '-Sinnoh', '-Unova', '-Kalos', '-Alola', '-Partner', '-World']);\n\t\t}\n\n\t\t// Get level\n\t\tconst level = this.getLevel(species, isDoubles);\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\tif ((moves.has('substitute') && ['Sitrus Berry', 'Salac Berry'].includes(item))) {\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') || moves.has('filletaway')) && (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 {\n\t\t\t\t// Maximize number of Stealth Rock switch-ins\n\t\t\t\tif (srWeakness <= 0 || hp % (4 / srWeakness) > 0 || ['Leftovers', 'Life Orb'].includes(item)) break;\n\t\t\t}\n\t\t\tevs.hp -= 4;\n\t\t}\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\tif (move.id === 'shellsidearm') return false;\n\t\t\treturn move.category !== 'Physical' || move.id === 'bodypress' || move.id === 'foulplay';\n\t\t});\n\t\tif (noAttackStatMoves && !moves.has('transform')) {\n\t\t\tevs.atk = 0;\n\t\t\tivs.atk = 0;\n\t\t}\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\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\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\tteraType,\n\t\t\trole,\n\t\t};\n\t}\n\n\tgetPokemonPool(\n\t\ttype: string,\n\t\tpokemonToExclude: RandomTeamsTypes.RandomSet[] = [],\n\t\tisMonotype = false,\n\t\tisDoubles = false,\n\t) {\n\t\tconst exclude = pokemonToExclude.map(p => toID(p.species));\n\t\tconst pokemonPool = [];\n\t\tconst baseSpeciesPool: string[] = [];\n\t\tif (isDoubles) {\n\t\t\tfor (const pokemon of Object.keys(this.randomDoublesSets)) {\n\t\t\t\tlet species = this.dex.species.get(pokemon);\n\t\t\t\tif (species.gen > this.gen || exclude.includes(species.id)) continue;\n\t\t\t\tif (isMonotype) {\n\t\t\t\t\tif (!species.types.includes(type)) continue;\n\t\t\t\t\tif (typeof species.battleOnly === 'string') {\n\t\t\t\t\t\tspecies = this.dex.species.get(species.battleOnly);\n\t\t\t\t\t\tif (!species.types.includes(type)) continue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tpokemonPool.push(pokemon);\n\t\t\t\tif (!baseSpeciesPool.includes(species.baseSpecies)) baseSpeciesPool.push(species.baseSpecies);\n\t\t\t}\n\t\t} else {\n\t\t\tfor (const pokemon of Object.keys(this.randomSets)) {\n\t\t\t\tlet species = this.dex.species.get(pokemon);\n\t\t\t\tif (species.gen > this.gen || exclude.includes(species.id)) continue;\n\t\t\t\tif (isMonotype) {\n\t\t\t\t\tif (!species.types.includes(type)) continue;\n\t\t\t\t\tif (typeof species.battleOnly === 'string') {\n\t\t\t\t\t\tspecies = this.dex.species.get(species.battleOnly);\n\t\t\t\t\t\tif (!species.types.includes(type)) continue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tpokemonPool.push(pokemon);\n\t\t\t\tif (!baseSpeciesPool.includes(species.baseSpecies)) baseSpeciesPool.push(species.baseSpecies);\n\t\t\t}\n\t\t}\n\t\treturn [pokemonPool, baseSpeciesPool];\n\t}\n\n\t// TODO: Make types for this\n\trandomSets: AnyObject = randomSetsJSON;\n\trandomDoublesSets: AnyObject = randomSetsJSON; // Doubles sets are the same as singles for now\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 tierCount: {[k: string]: number} = {};\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\tconst [pokemonPool, baseSpeciesPool] = this.getPokemonPool(type, pokemon, isMonotype, isDoubles);\n\t\twhile (baseSpeciesPool.length && pokemon.length < this.maxTeamSize) {\n\t\t\tconst baseSpecies = this.sampleNoReplace(baseSpeciesPool);\n\t\t\tconst currentSpeciesPool: Species[] = [];\n\t\t\tfor (const poke of pokemonPool) {\n\t\t\t\tconst species = this.dex.species.get(poke);\n\t\t\t\tif (species.baseSpecies === baseSpecies) currentSpeciesPool.push(species);\n\t\t\t}\n\t\t\tlet species = this.sample(currentSpeciesPool);\n\t\t\tif (!species.exists) continue;\n\t\t\t// Illusion shouldn't be on the last slot\n\t\t\tif (species.baseSpecies === 'Zoroark' && pokemon.length >= (this.maxTeamSize - 1)) continue;\n\n\t\t\t// If Zoroark is in the team, the sixth slot should not be a Pokemon with extremely low 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\tthis.getLevel(species, isDoubles) < 72 &&\n\t\t\t\t!this.adjustLevel\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Pokemon with Last Respects, Intrepid Sword, and Dauntless Shield shouldn't be leading\n\t\t\tif (['Basculegion', 'Houndstone', 'Zacian', 'Zamazenta'].includes(species.baseSpecies) && !pokemon.length) continue;\n\n\t\t\tconst tier = species.tier;\n\t\t\tconst types = species.types;\n\t\t\tconst typeCombo = types.slice().sort().join();\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\t// Limit one Pokemon per tier, two for Monotype\n\t\t\t// Disable this for now, since it is still a new gen\n\t\t\t// Unless you want to have a lot of Ubers!\n\t\t\t// if (\n\t\t\t// \t(tierCount[tier] >= (this.forceMonotype || isMonotype ? 2 : 1) * limitFactor) &&\n\t\t\t// \t!this.randomChance(1, Math.pow(5, tierCount[tier]))\n\t\t\t// ) {\n\t\t\t// \tcontinue;\n\t\t\t// }\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\t\t\t}\n\n\t\t\t// Limit one of any type combination, two in Monotype\n\t\t\tif (!this.forceMonotype && typeComboCount[typeCombo] >= (isMonotype ? 2 : 1) * 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, isDoubles);\n\n\t\t\t// Okay, the set passes, add it to our team\n\t\t\tpokemon.push(set);\n\t\t\tif (pokemon.length === this.maxTeamSize) {\n\t\t\t\t// Set Zoroark's level to be the same as the last Pokemon\n\t\t\t\tconst illusion = teamDetails.illusion;\n\t\t\t\tif (illusion) pokemon[illusion - 1].level = pokemon[this.maxTeamSize - 1].level;\n\n\t\t\t\t// Don't bother tracking details for the last Pokemon\n\t\t\t\tbreak;\n\t\t\t}\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 tier counter\n\t\t\tif (tierCount[tier]) {\n\t\t\t\ttierCount[tier]++;\n\t\t\t} else {\n\t\t\t\ttierCount[tier] = 1;\n\t\t\t}\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\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' || set.moves.includes('snowscape') || set.moves.includes('chillyreception')) {\n\t\t\t\tteamDetails.snow = 1;\n\t\t\t}\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('mortalspin')) teamDetails.rapidSpin = 1;\n\t\t\tif (set.moves.includes('tidyup')) 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\tif (set.role === 'Tera Blast user') teamDetails.teraBlast = 1;\n\n\t\t\t// For setting Zoroark's level\n\t\t\tif (set.ability === 'Illusion') teamDetails.illusion = pokemon.length;\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\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\tlet isIllegalItem;\n\t\t\tlet isBadItem;\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\tisIllegalItem = this.dex.items.get(item).gen > this.gen || this.dex.items.get(item).isNonstandard;\n\t\t\t\t\tisBadItem = item.startsWith(\"TR\") || this.dex.items.get(item).isPokeball;\n\t\t\t\t} while (isIllegalItem || (isBadItem && this.randomChance(19, 20)));\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\n\t\t\t\t\t.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\tconst formes = ['gastrodoneast', 'pumpkaboosuper', 'zygarde10'];\n\t\t\t\tlet learnset = this.dex.species.getLearnset(species.id);\n\t\t\t\tif (formes.includes(species.id) || !learnset) {\n\t\t\t\t\tlearnset = this.dex.species.getLearnset(this.dex.species.get(species.baseSpecies).id);\n\t\t\t\t}\n\t\t\t\tif (learnset) {\n\t\t\t\t\tpool = Object.keys(learnset).filter(\n\t\t\t\t\t\tmoveid => learnset![moveid].find(learned => learned.startsWith(String(this.gen)))\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (species.changesFrom) {\n\t\t\t\t\tlearnset = this.dex.species.getLearnset(toID(species.changesFrom));\n\t\t\t\t\tconst basePool = Object.keys(learnset!).filter(\n\t\t\t\t\t\tmoveid => learnset![moveid].find(learned => learned.startsWith(String(this.gen)))\n\t\t\t\t\t);\n\t\t\t\t\tpool = [...new Set(pool.concat(basePool))];\n\t\t\t\t}\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 = this.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\tconst last = [0, 151, 251, 386, 493, 649, 721, 807, 898, 1010][this.gen];\n\n\t\tif (n <= 0 || n > last) throw new Error(`n must be a number between 1 and ${last} (got ${n})`);\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 = Object.values(this.dex.species.getLearnset(species.id) || {})\n\t\t\t\t\t\t.some(sources => sources.some(source => source.startsWith('9')));\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\tif (num > last) break;\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 (!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));\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\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\tif (!hasCustomBans) {\n\t\t\t\t\tnaturePool = [...this.dex.natures.all()];\n\t\t\t\t} else {\n\t\t\t\t\tconst hasAllNaturesBan = ruleTable.check('pokemontag:allnatures');\n\t\t\t\t\tfor (const nature of this.dex.natures.all()) {\n\t\t\t\t\t\tlet banReason = ruleTable.check('nature:' + nature.id);\n\t\t\t\t\t\tif (banReason) continue;\n\t\t\t\t\t\tif (banReason !== '' && nature.id) {\n\t\t\t\t\t\t\tif (hasAllNaturesBan) continue;\n\t\t\t\t\t\t\tif (nature.isNonstandard) {\n\t\t\t\t\t\t\t\tbanReason = ruleTable.check('pokemontag:' + toID(nature.isNonstandard));\n\t\t\t\t\t\t\t\tif (banReason) continue;\n\t\t\t\t\t\t\t\tif (banReason !== '' && nature.isNonstandard !== 'Unobtainable') {\n\t\t\t\t\t\t\t\t\tif (hasNonexistentBan) continue;\n\t\t\t\t\t\t\t\t\tif (!hasNonexistentWhitelist) continue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnaturePool.push(nature);\n\t\t\t\t\t}\n\t\t\t\t\t// There is no 'nature:nonature' rule so do not constrain pool size\n\t\t\t\t}\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\tlet isBadItem;\n\t\t\tif (doItemsExist) {\n\t\t\t\t// We discard TRs and Balls with 95% probability because of their otherwise overwhelming presence\n\t\t\t\tdo {\n\t\t\t\t\titemData = this.sampleNoReplace(itemPool);\n\t\t\t\t\titem = itemData?.name;\n\t\t\t\t\tisBadItem = item.startsWith(\"TR\") || itemData.isPokeball;\n\t\t\t\t} while (isBadItem && this.randomChance(19, 20) && itemPool.length > this.maxTeamSize);\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(this.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 this.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\nexport default RandomTeams;\n"]}