@pkmn/randoms 0.7.5 → 0.7.6
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.
- package/build/index.js +18 -5
- package/build/index.js.map +1 -1
- package/build/index.mjs +21 -8
- package/build/index.mjs.map +1 -1
- package/package.json +2 -2
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/utils.ts","../src/gen9.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"],"names":["Dex","item","ability","typeCombo","specie","usage","toID","SetupException","PhysicalSetup","SpecialSetup"],"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\tDex,\n\tFormat,\n\tItem,\n\tModdedDex,\n\tMove,\n\tNature,\n\tPRNG,\n\tPRNGSeed,\n\tPlayerOptions,\n\tPokemonSet,\n\tRandomTeamsTypes,\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 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 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);\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?: Dex.RuleTable) {\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 (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 RandomTeams;\n","import {RandomTeams} from './gen9';\nimport {Format, ModdedDex, PRNG, PRNGSeed} from '@pkmn/sim';\n\nexport class RandomGen8Teams extends RandomTeams {\n\tconstructor(dex: ModdedDex, format: Format, prng: PRNG | PRNGSeed | null) {\n\t\tsuper(dex, format, prng);\n\t}\n}\n\nexport default RandomGen8Teams;\n","import {RandomGen8Teams} from './gen8';\nimport {MoveCounter, TeamData} from './gen9';\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 './gen9';\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 './gen9';\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 './gen9';\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 './gen9';\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 './gen9';\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 './gen9';\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/utils.ts","../src/gen9.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"],"names":["item","ability","typeCombo","specie","usage","toID","SetupException","PhysicalSetup","SpecialSetup"],"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 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 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\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 && !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\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\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 RandomTeams;\n","import {RandomTeams} from './gen9';\nimport {Format, ModdedDex, PRNG, PRNGSeed} from '@pkmn/sim';\n\nexport class RandomGen8Teams extends RandomTeams {\n\tconstructor(dex: ModdedDex, format: Format, prng: PRNG | PRNGSeed | null) {\n\t\tsuper(dex, format, prng);\n\t}\n}\n\nexport default RandomGen8Teams;\n","import {RandomGen8Teams} from './gen8';\nimport {MoveCounter, TeamData} from './gen9';\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 './gen9';\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 './gen9';\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 './gen9';\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 './gen9';\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 './gen9';\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 './gen9';\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"]}
|