Jofthomas's picture
Jofthomas HF staff
Upload 4781 files
5c2ed06 verified
{
"version": 3,
"sources": ["../../../../server/chat-plugins/randombattles/index.ts"],
"sourcesContent": ["/**\n * Random Battles chat-plugin\n * Written by dhelmise with inspiration from sirDonovan and The Immortal\n *\n * Set probability code written by Annika\n */\n\nimport { FS, Utils } from '../../../lib';\n\ninterface SetCriteria {\n\tmoves: { mustHave: Move[], mustNotHave: Move[] };\n\tability: { mustHave?: Ability, mustNotHave: Ability[] };\n\titem: { mustHave?: Item, mustNotHave: Item[] };\n\tnature: { mustHave?: Nature, mustNotHave: Nature[] };\n\tteraType: { mustHave?: TypeInfo, mustNotHave: TypeInfo[] };\n}\n\nfunction getHTMLCriteriaDescription(criteria: SetCriteria) {\n\tconst format = (list: { name: string }[]) => list.map(m => Utils.html`<strong>${m.name}</strong>`);\n\tconst parts = [];\n\n\tconst { moves, ability, item, nature, teraType } = criteria;\n\n\tif (moves.mustHave.length) {\n\t\tparts.push(`had the move${Chat.plural(moves.mustHave)} ${Chat.toListString(format(moves.mustHave))}`);\n\t}\n\tif (moves.mustNotHave.length) {\n\t\tparts.push(`did not have the move${Chat.plural(moves.mustNotHave)} ${Chat.toListString(format(moves.mustNotHave), 'or')}`);\n\t}\n\n\tif (ability.mustHave) {\n\t\tparts.push(Utils.html`had the ability <strong>${ability.mustHave.name}</strong>`);\n\t}\n\tif (ability.mustNotHave.length) {\n\t\tparts.push(`did not have the ${Chat.plural(ability.mustNotHave, 'abilities', 'ability')} ${Chat.toListString(format(ability.mustNotHave), 'or')}`);\n\t}\n\n\tif (item.mustHave) {\n\t\tparts.push(Utils.html`had the item <strong>${item.mustHave.name}</strong>`);\n\t}\n\tif (item.mustNotHave.length) {\n\t\tparts.push(`did not have the item${Chat.plural(item.mustNotHave)} ${Chat.toListString(format(item.mustNotHave), 'or')}`);\n\t}\n\n\tif (nature.mustHave) {\n\t\tparts.push(Utils.html`had the nature <strong>${nature.mustHave.name}</strong>`);\n\t}\n\tif (nature.mustNotHave.length) {\n\t\tparts.push(`did not have the nature${Chat.plural(nature.mustNotHave)} ${Chat.toListString(format(nature.mustNotHave), 'or')}`);\n\t}\n\n\tif (teraType.mustHave) {\n\t\tparts.push(Utils.html`had the Tera Type <strong>${teraType.mustHave.name}</strong>`);\n\t}\n\tif (teraType.mustNotHave.length) {\n\t\tparts.push(`did not have the Tera Type${Chat.plural(teraType.mustNotHave)} ${Chat.toListString(format(teraType.mustNotHave), 'or')}`);\n\t}\n\n\treturn Chat.toListString(parts, 'and');\n}\n\nfunction setProbability(\n\tspecies: Species,\n\tformat: Format,\n\tcriteria: SetCriteria,\n\trounds = 700\n): { rounds: number, matches: number } {\n\tconst results = { rounds, matches: 0 };\n\tconst generator = Teams.getGenerator(format);\n\n\tfor (let i = 0; i < rounds; i++) {\n\t\tconst set = generator.randomSet(\n\t\t\tspecies,\n\t\t\t{},\n\t\t\tfalse,\n\t\t\tformat.gameType !== 'singles',\n\t\t\tformat.ruleTable?.has('dynamaxclause')\n\t\t);\n\n\t\tif (criteria.item.mustHave && set.item !== criteria.item.mustHave.name) continue;\n\t\tif (criteria.item.mustNotHave.some(item => item.name === set.item)) continue;\n\n\t\tif (criteria.ability.mustHave && set.ability !== criteria.ability.mustHave.name) continue;\n\t\tif (criteria.ability.mustNotHave.some(ability => ability.name === set.ability)) continue;\n\n\t\tif (criteria.nature.mustHave && set.nature !== criteria.nature.mustHave.name) continue;\n\t\tif (criteria.nature.mustNotHave.some(nature => nature.name === set.nature)) continue;\n\n\t\tif (criteria.teraType.mustHave && set.teraType !== criteria.teraType.mustHave.name) continue;\n\t\tif (criteria.teraType.mustNotHave.some(type => type.name === set.teraType)) continue;\n\n\t\tconst setHasMove = (move: Move) => {\n\t\t\tconst id = move.id === 'hiddenpower' ? `${move.id}${toID(move.type)}` : move.id;\n\t\t\treturn set.moves.includes(id);\n\t\t};\n\t\tif (!criteria.moves.mustHave.every(setHasMove)) continue;\n\t\tif (criteria.moves.mustNotHave.some(setHasMove)) continue;\n\n\t\tresults.matches++;\n\t}\n\n\treturn results;\n}\n\nconst GEN_NAMES: { [k: string]: string } = {\n\tgen1: '[Gen 1]', gen2: '[Gen 2]', gen3: '[Gen 3]', gen4: '[Gen 4]', gen5: '[Gen 5]', gen6: '[Gen 6]', gen7: '[Gen 7]',\n\tgen8: '[Gen 8]', gen9: '[Gen 9]',\n};\n\nexport const STAT_NAMES: { [k: string]: string } = {\n\thp: \"HP\", atk: \"Atk\", def: \"Def\", spa: \"SpA\", spd: \"SpD\", spe: \"Spe\",\n};\n\nconst TIERS: { [k: string]: string } = {\n\tuber: \"Uber\", ubers: \"Uber\",\n\tou: \"OU\", uu: \"UU\", ru: \"RU\", nu: \"NU\", pu: \"PU\",\n\tmono: \"Mono\", monotype: \"Mono\", lc: \"LC\", littlecup: \"LC\",\n};\n\nfunction formatAbility(ability: Ability | string) {\n\tability = Dex.abilities.get(ability);\n\treturn `<a href=\"https://${Config.routes.dex}/abilities/${ability.id}\" target=\"_blank\" class=\"subtle\" style=\"white-space:nowrap\">${ability.name}</a>`;\n}\n\nexport function formatNature(n: string) {\n\tconst nature = Dex.natures.get(n);\n\treturn nature.name;\n}\n\nfunction formatMove(move: Move | string) {\n\tmove = Dex.moves.get(move);\n\treturn `<a href=\"https://${Config.routes.dex}/moves/${move.id}\" target=\"_blank\" class=\"subtle\" style=\"white-space:nowrap\">${move.name}</a>`;\n}\n\nfunction formatItem(item: Item | string) {\n\tif (typeof item === 'string' && item === \"No Item\") {\n\t\treturn `No Item`;\n\t} else {\n\t\titem = Dex.items.get(item);\n\t\treturn `<a href=\"https://${Config.routes.dex}/items/${item.id}\" target=\"_blank\" class=\"subtle\" style=\"white-space:nowrap\">${item.name}</a>`;\n\t}\n}\n\nfunction formatType(type: TypeInfo | string) {\n\ttype = Dex.types.get(type);\n\treturn type.name;\n}\n\n/**\n * Gets the sets for a Pokemon for a format that uses the new schema.\n * Old formats will use getData()\n */\nfunction getSets(species: string | Species, format: string | Format = 'gen9randombattle'): {\n\tlevel: number,\n\tsets: any[],\n} | null {\n\tconst dex = Dex.forFormat(format);\n\tformat = Dex.formats.get(format);\n\tspecies = dex.species.get(species);\n\tconst isDoubles = format.gameType === 'doubles';\n\tlet folderName = format.mod;\n\tif (format.team === 'randomBaby') folderName += 'baby';\n\tif (species.isNonstandard === 'CAP') folderName += 'cap';\n\tconst setsFile = JSON.parse(\n\t\tFS(`data/random-battles/${folderName}/${isDoubles ? 'doubles-' : ''}sets.json`)\n\t\t\t.readIfExistsSync() || '{}'\n\t);\n\tconst data = setsFile[species.id];\n\tif (!data?.sets?.length) return null;\n\treturn data;\n}\n\n/**\n * Gets the random battles data for a Pokemon for formats with the old schema.\n */\nfunction getData(species: string | Species, format: string | Format): AnyObject | null {\n\tconst dex = Dex.forFormat(format);\n\tformat = Dex.formats.get(format);\n\tspecies = dex.species.get(species);\n\tconst dataFile = JSON.parse(\n\t\tFS(`data/random-battles/${format.mod}/data.json`).readIfExistsSync() || '{}'\n\t);\n\tconst data = dataFile[species.id];\n\tif (!data) return null;\n\treturn data;\n}\n\n/**\n * Gets the default level for a Pokemon in the given format.\n * Returns 0 if the format doesn't use default levels or it can't be determined.\n */\nfunction getLevel(species: string | Species, format: string | Format): number {\n\tconst dex = Dex.forFormat(format);\n\tformat = Dex.formats.get(format);\n\tspecies = dex.species.get(species);\n\tswitch (format.id) {\n\t// Only formats where levels are not all manually assigned should be copied here\n\tcase 'gen2randombattle':\n\t\tconst levelScale: { [k: string]: number } = {\n\t\t\tZU: 81,\n\t\t\tZUBL: 79,\n\t\t\tPU: 77,\n\t\t\tPUBL: 75,\n\t\t\tNU: 73,\n\t\t\tNUBL: 71,\n\t\t\tUU: 69,\n\t\t\tUUBL: 67,\n\t\t\tOU: 65,\n\t\t\tUber: 61,\n\t\t};\n\t\treturn levelScale[species.tier] || 80;\n\t}\n\treturn 0;\n}\n\nfunction getRBYMoves(species: string | Species) {\n\tspecies = Dex.mod(`gen1`).species.get(species);\n\tconst data = getData(species, 'gen1randombattle');\n\tif (!data) return false;\n\tlet buf = `<br/><b>Level</b>: ${data.level}`;\n\tif (data.comboMoves) {\n\t\tbuf += `<br/><b>Combo moves</b>: `;\n\t\tbuf += data.comboMoves.map(formatMove).sort().join(\", \");\n\t}\n\tif (data.exclusiveMoves) {\n\t\tbuf += `<br/><b>Exclusive moves</b>: `;\n\t\tbuf += data.exclusiveMoves.map(formatMove).sort().join(\", \");\n\t}\n\tif (data.essentialMoves) {\n\t\tbuf += `<br/><b>Essential move${Chat.plural(data.essentialMoves)}</b>: `;\n\t\tbuf += data.essentialMoves.map(formatMove).sort().join(\", \");\n\t}\n\tif (data.moves) {\n\t\tbuf += `<br/><b>Randomized moves</b>: `;\n\t\tbuf += data.moves.map(formatMove).sort().join(\", \");\n\t}\n\tif (\n\t\t!data.moves && !data.comboMoves &&\n\t\t!data.exclusiveMoves && !data.essentialMove\n\t) {\n\t\treturn false;\n\t}\n\treturn buf;\n}\n\nfunction getLetsGoMoves(species: string | Species) {\n\tspecies = Dex.species.get(species);\n\tconst data = getData(species, 'gen7letsgorandombattle');\n\tif (!data) return false;\n\tconst isLetsGoLegal = (\n\t\t(species.num <= 151 || ['Meltan', 'Melmetal'].includes(species.name)) &&\n\t\t(!species.forme || ['Alola', 'Mega', 'Mega-X', 'Mega-Y', 'Starter'].includes(species.forme))\n\t);\n\tif (!isLetsGoLegal) return false;\n\tif (!data.moves?.length) return false;\n\treturn data.moves.map(formatMove).sort().join(`, `);\n}\n\nfunction battleFactorySets(species: string | Species, tier: string | null, gen = 'gen9', isBSS = false) {\n\tspecies = Dex.species.get(species);\n\tif (typeof species.battleOnly === 'string') {\n\t\tspecies = Dex.species.get(species.battleOnly);\n\t}\n\tgen = toID(gen);\n\tconst genNum = parseInt(gen[3]);\n\tif (isNaN(genNum) || genNum < 6 || (isBSS && genNum < 7)) return null;\n\tconst statsFile = JSON.parse(\n\t\tFS(`data/random-battles/gen${genNum}/${isBSS ? `bss-` : ``}factory-sets.json`).readIfExistsSync() ||\n\t\t\"{}\"\n\t);\n\tif (!Object.keys(statsFile).length) return null;\n\tlet buf = ``;\n\tif (!isBSS) {\n\t\tif (!tier) throw new Chat.ErrorMessage(`Please provide a valid tier.`);\n\t\tif (!(toID(tier) in TIERS)) throw new Chat.ErrorMessage(`That tier isn't supported.`);\n\t\tif (!(TIERS[toID(tier)] in statsFile)) {\n\t\t\tthrow new Chat.ErrorMessage(`${TIERS[toID(tier)]} is not included in [Gen ${genNum}] Battle Factory.`);\n\t\t}\n\t\tconst t = statsFile[TIERS[toID(tier)]];\n\t\tif (!(species.id in t)) {\n\t\t\tconst formatName = Dex.formats.get(`${gen}battlefactory`).name;\n\t\t\tthrow new Chat.ErrorMessage(`${species.name} doesn't have any sets in ${TIERS[toID(tier)]} for ${formatName}.`);\n\t\t}\n\t\tconst setObj = t[species.id];\n\t\tif (genNum >= 9) {\n\t\t\tbuf += `Species rarity: ${setObj.weight} (higher is more common, max 10)<br />`;\n\t\t}\n\t\tbuf += `<span style=\"color:#999999;\">Sets for ${species.name} in${genNum === 8 ? `` : ` ${GEN_NAMES[gen]}`} ${TIERS[toID(tier)]}:</span><br />`;\n\t\tfor (const [i, set] of setObj.sets.entries()) {\n\t\t\tif (genNum >= 9) {\n\t\t\t\tbuf += `<details><summary>Set ${i + 1} (${set.weight}%)</summary>`;\n\t\t\t} else {\n\t\t\t\tbuf += `<details><summary>Set ${i + 1}</summary>`;\n\t\t\t}\n\t\t\tbuf += `<ul style=\"list-style-type:none;\">`;\n\t\t\tbuf += `<li>${set.species}${set.gender ? ` (${set.gender})` : ``} @ ${Array.isArray(set.item) ? set.item.map(formatItem).join(\" / \") : formatItem(set.item)}</li>`;\n\t\t\tbuf += `<li>Ability: ${Array.isArray(set.ability) ? set.ability.map(formatAbility).join(\" / \") : formatAbility(set.ability)}</li>`;\n\t\t\tif (TIERS[toID(tier)] === \"LC\" && !set.level) buf += `<li>Level: 5</li>`;\n\t\t\tif (set.level && set.level < 100) buf += `<li>Level: ${set.level}</li>`;\n\t\t\tif (set.shiny) buf += `<li>Shiny: Yes</li>`;\n\t\t\tif (set.happiness) buf += `<li>Happiness: ${set.happiness}</li>`;\n\t\t\tif (genNum === 9 && set.teraType) {\n\t\t\t\tbuf += `<li>Tera Type: ${set.teraType.map(formatType).join(' / ')}</li>`;\n\t\t\t}\n\t\t\tif (set.evs) {\n\t\t\t\tbuf += `<li>EVs: `;\n\t\t\t\tconst evs: string[] = [];\n\t\t\t\tlet ev: string;\n\t\t\t\tfor (ev in set.evs) {\n\t\t\t\t\tif (set.evs[ev] === 0) continue;\n\t\t\t\t\tevs.push(`${set.evs[ev]} ${STAT_NAMES[ev]}`);\n\t\t\t\t}\n\t\t\t\tbuf += `${evs.join(\" / \")}</li>`;\n\t\t\t}\n\t\t\tbuf += `<li>${Array.isArray(set.nature) ? set.nature.map(formatNature).join(\" / \") : formatNature(set.nature)} Nature</li>`;\n\t\t\tif (set.ivs) {\n\t\t\t\tbuf += `<li>IVs: `;\n\t\t\t\tconst ivs: string[] = [];\n\t\t\t\tlet iv: string;\n\t\t\t\tfor (iv in set.ivs) {\n\t\t\t\t\tif (set.ivs[iv] === 31) continue;\n\t\t\t\t\tivs.push(`${set.ivs[iv]} ${STAT_NAMES[iv]}`);\n\t\t\t\t}\n\t\t\t\tbuf += `${ivs.join(\" / \")}</li>`;\n\t\t\t}\n\t\t\tfor (const moveid of set.moves) {\n\t\t\t\tbuf += `<li>- ${Array.isArray(moveid) ? moveid.map(formatMove).join(\" / \") : formatMove(moveid)}</li>`;\n\t\t\t}\n\t\t\tbuf += `</ul></details>`;\n\t\t}\n\t} else {\n\t\tconst format = Dex.formats.get(`${gen}bssfactory`);\n\t\tif (!(species.id in statsFile)) throw new Chat.ErrorMessage(`${species.name} doesn't have any sets in ${format.name}.`);\n\t\tconst setObj = statsFile[species.id];\n\t\tif (genNum >= 9) {\n\t\t\tbuf += `Species rarity: ${setObj.weight} (higher is more common, max 10)<br />`;\n\t\t\tbuf += `Sets for ${species.name} in ${format.name}:<br />`;\n\t\t\tfor (const [i, set] of setObj.sets.entries()) {\n\t\t\t\tbuf += `<details><summary>Set ${i + 1} (${set.weight}%)</summary>`;\n\t\t\t\tbuf += `<ul style=\"list-style-type:none;padding-left:0;\">`;\n\t\t\t\tbuf += `<li>${Dex.forFormat(format).species.get(set.species).name} @ ${set.item.map(formatItem).join(\" / \")}</li>`;\n\t\t\t\tbuf += `<li>Ability: ${set.ability.map(formatAbility).join(\" / \")}</li>`;\n\t\t\t\tbuf += `<li>Level: 50</li>`;\n\t\t\t\tbuf += `<li>Tera Type: ${set.teraType.map(formatType).join(' / ')}</li>`;\n\t\t\t\tif (set.evs) {\n\t\t\t\t\tbuf += `<li>EVs: `;\n\t\t\t\t\tconst evs: string[] = [];\n\t\t\t\t\tlet ev: string;\n\t\t\t\t\tfor (ev in set.evs) {\n\t\t\t\t\t\tif (!set.evs[ev]) continue;\n\t\t\t\t\t\tevs.push(`${set.evs[ev]} ${STAT_NAMES[ev]}`);\n\t\t\t\t\t}\n\t\t\t\t\tbuf += `${evs.join(\" / \")}</li>`;\n\t\t\t\t}\n\t\t\t\tbuf += `<li>${formatNature(set.nature)} Nature</li>`;\n\t\t\t\tif (set.ivs) {\n\t\t\t\t\tbuf += `<li>IVs: `;\n\t\t\t\t\tconst ivs: string[] = [];\n\t\t\t\t\tlet iv: string;\n\t\t\t\t\tfor (iv in set.ivs) {\n\t\t\t\t\t\tif (set.ivs[iv] === 31) continue;\n\t\t\t\t\t\tivs.push(`${set.ivs[iv]} ${STAT_NAMES[iv]}`);\n\t\t\t\t\t}\n\t\t\t\t\tbuf += `${ivs.join(\" / \")}</li>`;\n\t\t\t\t}\n\t\t\t\tfor (const moveSlot of set.moves) {\n\t\t\t\t\tbuf += `<li>- ${moveSlot.map(formatMove).join(' / ')}</li>`;\n\t\t\t\t}\n\t\t\t\tbuf += `</ul></details>`;\n\t\t\t}\n\t\t} else {\n\t\t\tbuf += `<span style=\"color:#999999;\">Sets for ${species.name} in ${format.name}:</span><br />`;\n\t\t\tfor (const [i, set] of setObj.sets.entries()) {\n\t\t\t\tbuf += `<details><summary>Set ${i + 1}</summary>`;\n\t\t\t\tbuf += `<ul style=\"list-style-type:none;padding-left:0;\">`;\n\t\t\t\tbuf += `<li>${set.species}${set.gender ? ` (${set.gender})` : ``} @ ${Array.isArray(set.item) ? set.item.map(formatItem).join(\" / \") : formatItem(set.item)}</li>`;\n\t\t\t\tbuf += `<li>Ability: ${Array.isArray(set.ability) ? set.ability.map(formatAbility).join(\" / \") : formatAbility(set.ability)}</li>`;\n\t\t\t\tif (!set.level) buf += `<li>Level: 50</li>`;\n\t\t\t\tif (set.level && set.level < 50) buf += `<li>Level: ${set.level}</li>`;\n\t\t\t\tif (set.shiny) buf += `<li>Shiny: Yes</li>`;\n\t\t\t\tif (set.happiness) buf += `<li>Happiness: ${set.happiness}</li>`;\n\t\t\t\tif (set.evs) {\n\t\t\t\t\tbuf += `<li>EVs: `;\n\t\t\t\t\tconst evs: string[] = [];\n\t\t\t\t\tlet ev: string;\n\t\t\t\t\tfor (ev in set.evs) {\n\t\t\t\t\t\tif (set.evs[ev] === 0) continue;\n\t\t\t\t\t\tevs.push(`${set.evs[ev]} ${STAT_NAMES[ev]}`);\n\t\t\t\t\t}\n\t\t\t\t\tbuf += `${evs.join(\" / \")}</li>`;\n\t\t\t\t}\n\t\t\t\tbuf += `<li>${Array.isArray(set.nature) ? set.nature.map(formatNature).join(\" / \") : formatNature(set.nature)} Nature</li>`;\n\t\t\t\tif (set.ivs) {\n\t\t\t\t\tbuf += `<li>IVs: `;\n\t\t\t\t\tconst ivs: string[] = [];\n\t\t\t\t\tlet iv: string;\n\t\t\t\t\tfor (iv in set.ivs) {\n\t\t\t\t\t\tif (set.ivs[iv] === 31) continue;\n\t\t\t\t\t\tivs.push(`${set.ivs[iv]} ${STAT_NAMES[iv]}`);\n\t\t\t\t\t}\n\t\t\t\t\tbuf += `${ivs.join(\" / \")}</li>`;\n\t\t\t\t}\n\t\t\t\tfor (const moveid of set.moves) {\n\t\t\t\t\tbuf += `<li>- ${Array.isArray(moveid) ? moveid.map(formatMove).join(\" / \") : formatMove(moveid)}</li>`;\n\t\t\t\t}\n\t\t\t\tbuf += `</ul></details>`;\n\t\t\t}\n\t\t}\n\t}\n\treturn buf;\n}\n\nfunction CAP1v1Sets(species: string | Species) {\n\tspecies = Dex.species.get(species);\n\tconst statsFile = JSON.parse(\n\t\tFS(`data/random-battles/gen8/cap-1v1-sets.json`).readIfExistsSync() ||\n\t\t\"{}\"\n\t);\n\tif (!Object.keys(statsFile).length) return null;\n\tif (species.isNonstandard !== \"CAP\") {\n\t\treturn {\n\t\t\te: `[Gen 8] CAP 1v1 only allows Pok\\u00e9mon created by the Create-A-Pok\\u00e9mon Project.`,\n\t\t\tparse: `/cap`,\n\t\t};\n\t}\n\tif (species.isNonstandard === \"CAP\" && !(species.name in statsFile)) {\n\t\treturn { e: `${species.name} doesn't have any sets in [Gen 8] CAP 1v1.` };\n\t}\n\tlet buf = `<span style=\"color:#999999;\">Sets for ${species.name} in [Gen 8] CAP 1v1:</span><br />`;\n\tfor (const [i, set] of statsFile[species.name].entries()) {\n\t\tbuf += `<details><summary>Set ${i + 1}</summary>`;\n\t\tbuf += `<ul style=\"list-style-type:none;\">`;\n\t\tbuf += `<li>${set.species || species.name}${set.gender ? ` (${set.gender})` : ``} @ ${Array.isArray(set.item) ? set.item.map(formatItem).join(\" / \") : formatItem(set.item)}</li>`;\n\t\tbuf += `<li>Ability: ${Array.isArray(set.ability) ? set.ability.map(formatAbility).join(\" / \") : formatAbility(set.ability)}</li>`;\n\t\tif (set.level && set.level < 100) buf += `<li>Level: ${set.level}</li>`;\n\t\tif (set.shiny) buf += `<li>Shiny: Yes</li>`;\n\t\tif (set.happiness) buf += `<li>Happiness: ${set.happiness}</li>`;\n\t\tif (set.evs) {\n\t\t\tbuf += `<li>EVs: `;\n\t\t\tconst evs: string[] = [];\n\t\t\tlet ev: string;\n\t\t\tfor (ev in set.evs) {\n\t\t\t\tif (set.evs[ev] === 0) continue;\n\t\t\t\tevs.push(`${set.evs[ev]} ${STAT_NAMES[ev]}`);\n\t\t\t}\n\t\t\tbuf += `${evs.join(\" / \")}</li>`;\n\t\t}\n\t\tbuf += `<li>${Array.isArray(set.nature) ? set.nature.map(formatNature).join(\" / \") : formatNature(set.nature)} Nature</li>`;\n\t\tif (set.ivs) {\n\t\t\tbuf += `<li>IVs: `;\n\t\t\tconst ivs: string[] = [];\n\t\t\tlet iv: string;\n\t\t\tfor (iv in set.ivs) {\n\t\t\t\tif (set.ivs[iv] === 31) continue;\n\t\t\t\tivs.push(`${set.ivs[iv]} ${STAT_NAMES[iv]}`);\n\t\t\t}\n\t\t\tbuf += `${ivs.join(\" / \")}</li>`;\n\t\t}\n\t\tfor (const moveid of set.moves) {\n\t\t\tbuf += `<li>- ${Array.isArray(moveid) ? moveid.map(formatMove).join(\" / \") : formatMove(moveid)}</li>`;\n\t\t}\n\t\tbuf += `</ul></details>`;\n\t}\n\treturn buf;\n}\n\nexport const commands: Chat.ChatCommands = {\n\trandbats: 'randombattles',\n\trandomdoublesbattle: 'randombattles',\n\tranddubs: 'randombattles',\n\tbabyrandombattle: 'randombattles',\n\tbabyrands: 'randombattles',\n\t// randombattlenodmax: 'randombattles',\n\t// randsnodmax: 'randombattles',\n\trandombattles(target, room, user, connection, cmd) {\n\t\tif (!this.runBroadcast()) return;\n\t\tconst battle = room?.battle;\n\t\tlet isDoubles = cmd === 'randomdoublesbattle' || cmd === 'randdubs';\n\t\tlet isBaby = cmd === 'babyrandombattle' || cmd === 'babyrands';\n\t\tlet isNoDMax = cmd.includes('nodmax');\n\t\tif (battle) {\n\t\t\tif (battle.format.includes('nodmax')) isNoDMax = true;\n\t\t\tif (battle.format.includes('doubles') || battle.gameType === 'freeforall') isDoubles = true;\n\t\t\tif (battle.format.includes('baby')) isBaby = true;\n\t\t}\n\n\t\tconst args = target.split(',');\n\t\tif (!args[0]) return this.parse(`/help randombattles`);\n\n\t\tconst { dex } = this.splitFormat(target, true);\n\t\tconst isLetsGo = (dex.currentMod === 'gen7letsgo');\n\n\t\tconst searchResults = dex.dataSearch(args[0], ['Pokedex']);\n\n\t\tif (!searchResults?.length) {\n\t\t\tthis.errorReply(`No Pok\\u00e9mon named '${args[0]}' was found${Dex.gen > dex.gen ? ` in Gen ${dex.gen}` : \"\"}. (Check your spelling?)`);\n\t\t\treturn;\n\t\t}\n\n\t\tlet inexactMsg = '';\n\t\tif (searchResults[0].isInexact) {\n\t\t\tinexactMsg = `No Pok\\u00e9mon named '${args[0]}' was found${Dex.gen > dex.gen ? ` in Gen ${dex.gen}` : \"\"}. Searching for '${searchResults[0].name}' instead.`;\n\t\t}\n\t\tconst species = dex.species.get(searchResults[0].name);\n\t\tconst extraFormatModifier = isLetsGo ? 'letsgo' : (dex.currentMod === 'gen8bdsp' ? 'bdsp' : '');\n\t\tconst babyModifier = isBaby ? 'baby' : '';\n\t\tconst doublesModifier = isDoubles ? 'doubles' : '';\n\t\tconst noDMaxModifier = isNoDMax ? 'nodmax' : '';\n\t\tconst formatName = `gen${dex.gen}${extraFormatModifier}${babyModifier}random${doublesModifier}battle${noDMaxModifier}`;\n\t\tconst format = dex.formats.get(formatName);\n\n\t\tconst movesets = [];\n\t\tlet setCount = 0;\n\t\tif (dex.gen === 1) {\n\t\t\tconst rbyMoves = getRBYMoves(species);\n\t\t\tif (!rbyMoves) {\n\t\t\t\tthis.sendReply(inexactMsg);\n\t\t\t\treturn this.errorReply(`Error: ${species.name} has no Random Battle data in ${GEN_NAMES[toID(args[1])]}`);\n\t\t\t}\n\t\t\tmovesets.push(`<span style=\"color:#999999;\">Moves for ${species.name} in ${format.name}:</span>${rbyMoves}`);\n\t\t\tsetCount = 1;\n\t\t} else if (isLetsGo) {\n\t\t\tconst lgpeMoves = getLetsGoMoves(species);\n\t\t\tif (!lgpeMoves) {\n\t\t\t\tthis.sendReply(inexactMsg);\n\t\t\t\treturn this.errorReply(`Error: ${species.name} has no Random Battle data in [Gen 7 Let's Go]`);\n\t\t\t}\n\t\t\tmovesets.push(`<span style=\"color:#999999;\">Moves for ${species.name} in ${format.name}:</span><br />${lgpeMoves}`);\n\t\t\tsetCount = 1;\n\t\t} else {\n\t\t\tconst setsToCheck = [species];\n\t\t\tif (dex.gen >= 8 && !isNoDMax) setsToCheck.push(dex.species.get(`${args[0]}gmax`));\n\t\t\tif (species.otherFormes) setsToCheck.push(...species.otherFormes.map(pkmn => dex.species.get(pkmn)));\n\t\t\tif ([2, 3, 4, 5, 6, 7, 9].includes(dex.gen)) {\n\t\t\t\tfor (const pokemon of setsToCheck) {\n\t\t\t\t\tconst data = getSets(pokemon, format.id);\n\t\t\t\t\tif (!data) continue;\n\t\t\t\t\tconst sets = data.sets;\n\t\t\t\t\tconst level = data.level || getLevel(pokemon, format);\n\t\t\t\t\tlet buf = `<span style=\"color:#999999;\">Moves for ${pokemon.name} in ${format.name}:</span><br/>`;\n\t\t\t\t\tbuf += `<b>Level</b>: ${level}`;\n\t\t\t\t\tfor (const set of sets) {\n\t\t\t\t\t\tbuf += `<details><summary>${set.role}</summary>`;\n\t\t\t\t\t\tif (dex.gen === 9) {\n\t\t\t\t\t\t\tbuf += `<b>Tera Type${Chat.plural(set.teraTypes)}</b>: ${set.teraTypes.join(', ')}<br/>`;\n\t\t\t\t\t\t} else if (([2, 3, 4, 5, 6, 7].includes(dex.gen)) && set.preferredTypes) {\n\t\t\t\t\t\t\tbuf += `<b>Preferred Type${Chat.plural(set.preferredTypes)}</b>: ${set.preferredTypes.join(', ')}<br/>`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbuf += `<b>Moves</b>: ${set.movepool.sort().map(formatMove).join(', ')}<br/>`;\n\t\t\t\t\t\tif (set.abilities) {\n\t\t\t\t\t\t\tbuf += `<b>Abilit${Chat.plural(set.abilities, 'ies', 'y')}</b>: ${set.abilities.sort().join(', ')}`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbuf += '</details>';\n\t\t\t\t\t\tsetCount++;\n\t\t\t\t\t}\n\t\t\t\t\tmovesets.push(buf);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor (let pokemon of setsToCheck) {\n\t\t\t\t\tlet data = getData(pokemon, format.name);\n\t\t\t\t\tif (!data && isNoDMax) {\n\t\t\t\t\t\tpokemon = dex.species.get(pokemon.id + 'gmax');\n\t\t\t\t\t\tdata = getData(pokemon, format.name);\n\t\t\t\t\t}\n\t\t\t\t\tif (!data) continue;\n\t\t\t\t\tif (!data.moves || pokemon.isNonstandard === 'Future') continue;\n\t\t\t\t\tlet randomMoves = data.moves;\n\t\t\t\t\tconst level = data.level || getLevel(pokemon, format);\n\t\t\t\t\tif (isDoubles && data.doublesMoves) randomMoves = data.doublesMoves;\n\t\t\t\t\tif (isNoDMax && data.noDynamaxMoves) randomMoves = data.noDynamaxMoves;\n\t\t\t\t\tconst m = randomMoves.slice().sort().map(formatMove);\n\t\t\t\t\tmovesets.push(\n\t\t\t\t\t\t`<details>` +\n\t\t\t\t\t\t`<summary><span style=\"color:#999999;\">Moves for ${pokemon.name} in ${format.name}:<span style=\"color:#999999;\"></summary>` +\n\t\t\t\t\t\t(level ? `<b>Level</b>: ${level}<br>` : '') +\n\t\t\t\t\t\t`${m.join(`, `)}</details>`\n\t\t\t\t\t);\n\t\t\t\t\tsetCount++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!movesets.length) {\n\t\t\tthis.sendReply(inexactMsg);\n\t\t\treturn this.errorReply(`Error: ${species.name} has no Random Battle data in ${format.name}`);\n\t\t}\n\t\tlet buf = movesets.join('<hr/>');\n\t\tif (setCount <= 2) {\n\t\t\tbuf = buf.replace(/<details>/g, '<details open>');\n\t\t}\n\t\tthis.sendReply(inexactMsg);\n\t\tthis.sendReplyBox(buf);\n\t},\n\trandombattleshelp: [\n\t\t`/randombattles OR /randbats [pokemon], [gen] - Displays a Pok\\u00e9mon's Random Battle Moves. Defaults to Gen 9. If used in a battle, defaults to the gen of that battle.`,\n\t\t`/randomdoublesbattle OR /randdubs [pokemon], [gen] - Same as above, but instead displays Random Doubles Battle moves.`,\n\t],\n\n\tbssfactory: 'battlefactory',\n\tbattlefactory(target, room, user, connection, cmd) {\n\t\tif (!this.runBroadcast()) return;\n\t\tconst isBSS = cmd === 'bssfactory';\n\t\tif (isBSS) {\n\t\t\tconst args = target.split(',');\n\t\t\tif (!args[0]) return this.parse(`/help battlefactory`);\n\t\t\tconst species = Dex.species.get(args[0]);\n\t\t\tif (!species.exists) {\n\t\t\t\treturn this.errorReply(`Error: Pok\\u00e9mon '${args[0].trim()}' not found.`);\n\t\t\t}\n\t\t\tlet mod = 'gen9';\n\t\t\tif (args[1] && toID(args[1]) in Dex.dexes && Dex.dexes[toID(args[1])].gen >= 7) mod = toID(args[1]);\n\t\t\tconst bssSets = battleFactorySets(species, null, mod, true);\n\t\t\tif (!bssSets) return this.parse(`/help battlefactory`);\n\t\t\treturn this.sendReplyBox(bssSets);\n\t\t} else {\n\t\t\tconst args = target.split(',');\n\t\t\tif (!args[0]) return this.parse(`/help battlefactory`);\n\t\t\tconst species = Dex.species.get(args[0]);\n\t\t\tif (!species.exists) {\n\t\t\t\treturn this.errorReply(`Error: Pok\\u00e9mon '${args[0].trim()}' not found.`);\n\t\t\t}\n\t\t\tlet tier = '';\n\t\t\tif (args[1] && toID(args[1]) in TIERS) {\n\t\t\t\ttier = TIERS[toID(args[1])];\n\t\t\t} else {\n\t\t\t\ttier = 'ou';\n\t\t\t}\n\t\t\tconst mod = args[2] || 'gen9';\n\t\t\tlet bfSets;\n\t\t\tif (species.name === 'Necrozma-Ultra') {\n\t\t\t\tbfSets = battleFactorySets(Dex.species.get('necrozma-dawnwings'), tier, mod);\n\t\t\t\tif (bfSets) {\n\t\t\t\t\tbfSets += battleFactorySets(Dex.species.get('necrozma-duskmane'), tier, mod)!;\n\t\t\t\t}\n\t\t\t} else if (species.name === 'Zygarde-Complete') {\n\t\t\t\tbfSets = battleFactorySets(Dex.species.get('zygarde'), tier, mod);\n\t\t\t\tif (bfSets) {\n\t\t\t\t\tbfSets += battleFactorySets(Dex.species.get('zygarde-10'), tier, mod)!;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tbfSets = battleFactorySets(species, tier, mod);\n\t\t\t}\n\t\t\tif (!bfSets) return this.parse(`/help battlefactory`);\n\t\t\treturn this.sendReplyBox(bfSets);\n\t\t}\n\t},\n\tbattlefactoryhelp: [\n\t\t`/battlefactory [pokemon], [tier], [gen] - Displays a Pok\\u00e9mon's Battle Factory sets. Supports Gens 6-8. Defaults to Gen 8. If no tier is provided, defaults to OU.`,\n\t\t`- Supported tiers: OU, Ubers, UU, RU, NU, PU, Monotype (Gen 7 only), LC (Gen 7 only)`,\n\t\t`/bssfactory [pokemon], [gen] - Displays a Pok\\u00e9mon's BSS Factory sets. Supports Gen 7-9. Defaults to Gen 9.`,\n\t],\n\n\tcap1v1(target, room, user) {\n\t\tif (!this.runBroadcast()) return;\n\t\tif (!target) return this.parse(`/help cap1v1`);\n\t\tconst species = Dex.species.get(target);\n\t\tif (!species.exists) return this.errorReply(`Error: Pok\\u00e9mon '${target.trim()}' not found.`);\n\t\tconst cap1v1Set = CAP1v1Sets(species);\n\t\tif (!cap1v1Set) return this.parse(`/help cap1v1`);\n\t\tif (typeof cap1v1Set !== 'string') {\n\t\t\tthis.errorReply(`Error: ${cap1v1Set.e}`);\n\t\t\tif (cap1v1Set.parse) this.parse(cap1v1Set.parse);\n\t\t\treturn;\n\t\t}\n\t\treturn this.sendReplyBox(cap1v1Set);\n\t},\n\tcap1v1help: [\n\t\t`/cap1v1 [pokemon] - Displays a Pok\\u00e9mon's CAP 1v1 sets.`,\n\t],\n\n\tsetodds: 'randombattlesetprobabilities',\n\trandbatsodds: 'randombattlesetprobabilities',\n\trandbatsprobabilities: 'randombattlesetprobabilities',\n\trandombattlesetprobabilities(target, room, user) {\n\t\t// Restricted to global staff and randbats room auth\n\t\tconst randbatsRoom = Rooms.get('randombattles');\n\t\tif (!randbatsRoom?.auth.has(user.id)) {\n\t\t\tthis.checkCan('lock');\n\t\t}\n\n\t\tif (!target) return this.parse(`/help randombattlesetprobabilities`);\n\t\tthis.runBroadcast();\n\n\t\tconst args = target.split(',');\n\t\tif (args.length < 2) return this.parse(`/help randombattlesetprobabilities`);\n\n\t\t// Optional format\n\t\tlet format = Dex.formats.get('gen9randombattle');\n\t\tlet formatOrSpecies = args.shift();\n\t\tconst possibleFormat = Dex.formats.get(formatOrSpecies);\n\t\tif (possibleFormat.exists) {\n\t\t\tif (!possibleFormat.team) {\n\t\t\t\tthrow new Chat.ErrorMessage(`${possibleFormat.name} does not have randomly-generated teams.`);\n\t\t\t}\n\t\t\tformat = possibleFormat;\n\t\t\tformatOrSpecies = args.shift();\n\t\t}\n\t\tconst dex = Dex.forFormat(format);\n\n\t\t// Species\n\t\tconst species = dex.species.get(formatOrSpecies);\n\t\tif (!species.exists) {\n\t\t\tthrow new Chat.ErrorMessage(`Species ${species.name} does not exist in the specified format.`);\n\t\t}\n\n\t\tlet setExists: boolean;\n\t\tif ([2, 3, 4, 5, 6, 7, 9].includes(dex.gen)) {\n\t\t\tsetExists = !!getSets(species, format);\n\t\t} else {\n\t\t\tconst data = getData(species, format);\n\t\t\tif (!data) {\n\t\t\t\tsetExists = false;\n\t\t\t} else if (format.gameType === 'doubles' || format.gameType === 'freeforall') {\n\t\t\t\tsetExists = !!data.doublesMoves;\n\t\t\t} else {\n\t\t\t\tsetExists = !!data.moves;\n\t\t\t}\n\t\t}\n\t\tif (!setExists) {\n\t\t\tthrow new Chat.ErrorMessage(`${species.name} does not have random battle moves in ${format.name}.`);\n\t\t}\n\n\t\t// Criteria\n\t\tconst criteria: SetCriteria = {\n\t\t\tmoves: { mustHave: [], mustNotHave: [] },\n\t\t\titem: { mustNotHave: [] },\n\t\t\tability: { mustNotHave: [] },\n\t\t\tnature: { mustNotHave: [] },\n\t\t\tteraType: { mustNotHave: [] },\n\t\t};\n\n\t\tif (args.length < 1) {\n\t\t\tthis.errorReply(`You must specify at least one condition.`);\n\t\t\treturn this.parse(`/help randombattlesetprobabilities`);\n\t\t}\n\n\t\tfor (const arg of args) {\n\t\t\tlet [key, value] = arg.split('=');\n\t\t\tkey = toID(key);\n\t\t\tif (!value || !key) {\n\t\t\t\tthis.errorReply(`Invalid condition format: ${arg}`);\n\t\t\t\treturn this.parse(`/help randombattlesetprobabilities`);\n\t\t\t}\n\n\t\t\tswitch (key) {\n\t\t\tcase 'moves':\n\t\t\t\tfor (const rawMove of value.split('&')) {\n\t\t\t\t\tconst move = dex.moves.get(rawMove);\n\t\t\t\t\tif (!move.exists) {\n\t\t\t\t\t\tthrow new Chat.ErrorMessage(`\"${rawMove}\" is not a move in the specified format.`);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst isNegation = rawMove.trim().startsWith('!');\n\t\t\t\t\tif (isNegation) {\n\t\t\t\t\t\tcriteria.moves.mustNotHave.push(move);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcriteria.moves.mustHave.push(move);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'item':\n\t\t\t\tconst item = dex.items.get(value);\n\t\t\t\tif (!item.exists) {\n\t\t\t\t\tthrow new Chat.ErrorMessage(`\"${value}\" is not an item in the specified format.`);\n\t\t\t\t}\n\n\t\t\t\tconst itemNegation = value.trim().startsWith('!');\n\t\t\t\tif (itemNegation) {\n\t\t\t\t\tcriteria.item.mustNotHave.push(item);\n\t\t\t\t} else {\n\t\t\t\t\tif (criteria.item.mustHave) {\n\t\t\t\t\t\tthrow new Chat.ErrorMessage(`Impossible situation: two items (${criteria.item.mustHave.name} and ${item.name}) are required.`);\n\t\t\t\t\t}\n\t\t\t\t\tcriteria.item.mustHave = item;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'ability':\n\t\t\t\tconst ability = dex.abilities.get(value);\n\t\t\t\tif (!ability.exists) {\n\t\t\t\t\tthrow new Chat.ErrorMessage(`\"${value}\" is not an ability in the specified format.`);\n\t\t\t\t}\n\n\t\t\t\tconst abilityNegation = value.trim().startsWith('!');\n\t\t\t\tif (abilityNegation) {\n\t\t\t\t\tcriteria.ability.mustNotHave.push(ability);\n\t\t\t\t} else {\n\t\t\t\t\tif (criteria.ability.mustHave) {\n\t\t\t\t\t\tthrow new Chat.ErrorMessage(`Impossible situation: two abilities (${criteria.ability.mustHave.name} and ${ability.name}) are required.`);\n\t\t\t\t\t}\n\t\t\t\t\tcriteria.ability.mustHave = ability;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'nature':\n\t\t\t\tconst nature = dex.natures.get(value);\n\t\t\t\tif (!nature.exists) {\n\t\t\t\t\tthrow new Chat.ErrorMessage(`\"${value}\" is not a nature in the specified format.`);\n\t\t\t\t}\n\n\t\t\t\tconst natureNegation = value.trim().startsWith('!');\n\t\t\t\tif (natureNegation) {\n\t\t\t\t\tcriteria.nature.mustNotHave.push(nature);\n\t\t\t\t} else {\n\t\t\t\t\tif (criteria.nature.mustHave) {\n\t\t\t\t\t\tthrow new Chat.ErrorMessage(`Impossible situation: two natures (${criteria.nature.mustHave.name} and ${nature.name}) are required.`);\n\t\t\t\t\t}\n\t\t\t\t\tcriteria.nature.mustHave = nature;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'tera': case 'teratype':\n\t\t\t\tif (dex.gen < 9) throw new Chat.ErrorMessage(\"Tera Types do not exist in the specified format.\");\n\t\t\t\tconst type = dex.types.get(value);\n\t\t\t\tif (!type.exists) {\n\t\t\t\t\tthrow new Chat.ErrorMessage(`\"${value}\" is not a type in the specified format.`);\n\t\t\t\t}\n\n\t\t\t\tconst typeNegation = value.trim().startsWith('!');\n\t\t\t\tif (typeNegation) {\n\t\t\t\t\tcriteria.teraType.mustNotHave.push(type);\n\t\t\t\t} else {\n\t\t\t\t\tif (criteria.teraType.mustHave) {\n\t\t\t\t\t\tthrow new Chat.ErrorMessage(`Impossible situation: two Tera Types (${criteria.teraType.mustHave.name} and ${type.name}) are required.`);\n\t\t\t\t\t}\n\t\t\t\t\tcriteria.teraType.mustHave = type;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new Chat.ErrorMessage(`Invalid criterion: ${key}`);\n\t\t\t}\n\t\t}\n\n\t\tconst results = setProbability(species, format, criteria);\n\t\tconst percentage = Math.round((results.matches / results.rounds) * 100);\n\t\treturn this.sendReplyBox(\n\t\t\tUtils.html`Generated ${results.rounds} sets for <strong>${species.name}</strong> in ${format.name}:<br />` +\n\t\t\t`Approximately <strong>${percentage}%</strong> (${results.matches} sets) ${getHTMLCriteriaDescription(criteria)}.`\n\t\t);\n\t},\n\trandombattlesetprobabilitieshelp() {\n\t\treturn this.sendReplyBox(\n\t\t\t`<code>/randombattlesetprobabilities [optional format], [species], [conditions]</code>: Gives the probability of a set matching the conditions appearing for the given species.<br />` +\n\t\t\t`<code>[conditions]</code> is a comma-separated list of conditions of the form <code>[component]=[matching value]</code>, where <code>[component]</code> can be any of the following: ` +\n\t\t\t`<ul>` +\n\t\t\t`<li><code>moves</code>: matches all generated sets that contain every move specified. <code>[matching value]</code> should be a list of moves separated with <code>&amp;</code>.` +\n\t\t\t`<li><code>item</code>: matches all generated sets that have the specified item. <code>[matching value]</code> should be an item name.` +\n\t\t\t`<li><code>ability</code>: matches all generated sets with the specified ability. <code>[matching value]</code> should be an ability name.` +\n\t\t\t`<li><code>nature</code>: matches all generated sets with the specified nature. <code>[matching value]</code> should be a nature name.` +\n\t\t\t`<li><code>tera</code>: matches all generated sets with the specified Tera Type. <code>[matching value]</code> should be a type. Gen 9 only.` +\n\t\t\t`</ul>` +\n\t\t\t`The given probability is for a set that matches EVERY provided condition. ` +\n\t\t\t`Conditions can be negated by prefixing the <code>[matching value]</code> with <code>!</code>.<br />` +\n\t\t\t`Requires: % @ # ~ (globally or in the Random Battles room)`\n\t\t);\n\t},\n\n\tgenteam: 'generateteam',\n\tgenerateteam(target, room, user) {\n\t\tif (!Rooms.get('randombattles')?.auth.has(user.id)) this.checkCan('lock');\n\t\tthis.runBroadcast(true);\n\n\t\tif (!target) return this.parse('/help generateteam');\n\t\tconst format = Dex.formats.get(target);\n\t\tif (format.effectType !== 'Format') throw new Chat.ErrorMessage(`\"${target}\" is not a recognized format.`);\n\t\tif (!format.team) throw new Chat.ErrorMessage(`\"${format.name}\" requires you to bring your own team.`);\n\n\t\tconst team = Teams.getGenerator(format).getTeam();\n\t\tconst dex = Dex.forFormat(format);\n\t\tconst teamHTML = team\n\t\t\t.map((set: PokemonSet) => {\n\t\t\t\t// moves are sometimes given as IDs\n\t\t\t\tset.moves = set.moves.map(m => dex.moves.get(m).name);\n\t\t\t\tset.item = dex.items.get(set.item).name;\n\t\t\t\treturn `<details><summary>${set.name}</summary>${Utils.escapeHTML(Teams.exportSet(set))}<br /></details>`;\n\t\t\t})\n\t\t\t.join('');\n\t\treturn this.sendReplyBox(`<strong>Team for ${format.name}</strong>:` + teamHTML);\n\t},\n\tgenerateteamhelp: [`/genteam [format] - Generates a team for the given format. Requires: % @ ~ or Random Battles room auth`],\n};\n"],
"mappings": "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",
"names": ["buf"]
}