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