{ "version": 3, "sources": ["../../../../../server/chat-plugins/randombattles/index.ts"], "sourcesContent": ["/**\r\n * Random Battles chat-plugin\r\n * Written by Kris with inspiration from sirDonovan and The Immortal\r\n *\r\n * Set probability code written by Annika\r\n */\r\n\r\nimport {FS, Utils} from '../../../lib';\r\nimport {SSBSet, ssbSets} from '../../../data/mods/ssb/random-teams';\r\n\r\n\r\ninterface SetCriteria {\r\n\tmoves: {mustHave: Move[], mustNotHave: Move[]};\r\n\tability: {mustHave?: Ability, mustNotHave: Ability[]};\r\n\titem: {mustHave?: Item, mustNotHave: Item[]};\r\n\tnature: {mustHave?: Nature, mustNotHave: Nature[]};\r\n\tteraType: {mustHave?: TypeInfo, mustNotHave: TypeInfo[]};\r\n}\r\n\r\n\r\nfunction getHTMLCriteriaDescription(criteria: SetCriteria) {\r\n\tconst format = (list: {name: string}[]) => list.map(m => Utils.html`${m.name}`);\r\n\tconst parts = [];\r\n\r\n\tconst {moves, ability, item, nature, teraType} = criteria;\r\n\r\n\tif (moves.mustHave.length) {\r\n\t\tparts.push(`had the move${Chat.plural(moves.mustHave)} ${Chat.toListString(format(moves.mustHave))}`);\r\n\t}\r\n\tif (moves.mustNotHave.length) {\r\n\t\tparts.push(`did not have the move${Chat.plural(moves.mustNotHave)} ${Chat.toListString(format(moves.mustNotHave), 'or')}`);\r\n\t}\r\n\r\n\tif (ability.mustHave) {\r\n\t\tparts.push(Utils.html`had the ability ${ability.mustHave.name}`);\r\n\t}\r\n\tif (ability.mustNotHave.length) {\r\n\t\tparts.push(`did not have the ${Chat.plural(ability.mustNotHave, 'abilities', 'ability')} ${Chat.toListString(format(ability.mustNotHave), 'or')}`);\r\n\t}\r\n\r\n\tif (item.mustHave) {\r\n\t\tparts.push(Utils.html`had the item ${item.mustHave.name}`);\r\n\t}\r\n\tif (item.mustNotHave.length) {\r\n\t\tparts.push(`did not have the item${Chat.plural(item.mustNotHave)} ${Chat.toListString(format(item.mustNotHave), 'or')}`);\r\n\t}\r\n\r\n\tif (nature.mustHave) {\r\n\t\tparts.push(Utils.html`had the nature ${nature.mustHave.name}`);\r\n\t}\r\n\tif (nature.mustNotHave.length) {\r\n\t\tparts.push(`did not have the nature${Chat.plural(nature.mustNotHave)} ${Chat.toListString(format(nature.mustNotHave), 'or')}`);\r\n\t}\r\n\r\n\tif (teraType.mustHave) {\r\n\t\tparts.push(Utils.html`had the Tera Type ${teraType.mustHave.name}`);\r\n\t}\r\n\tif (teraType.mustNotHave.length) {\r\n\t\tparts.push(`did not have the Tera Type${Chat.plural(teraType.mustNotHave)} ${Chat.toListString(format(teraType.mustNotHave), 'or')}`);\r\n\t}\r\n\r\n\treturn Chat.toListString(parts, 'and');\r\n}\r\n\r\nfunction setProbability(\r\n\tspecies: Species,\r\n\tformat: Format,\r\n\tcriteria: SetCriteria,\r\n\trounds = 700\r\n): {rounds: number, matches: number} {\r\n\tconst results = {rounds, matches: 0};\r\n\tconst generator = Teams.getGenerator(format);\r\n\r\n\tfor (let i = 0; i < rounds; i++) {\r\n\t\tconst set = generator.randomSet(\r\n\t\t\tspecies,\r\n\t\t\t{},\r\n\t\t\tfalse,\r\n\t\t\tformat.gameType !== 'singles',\r\n\t\t\tformat.ruleTable?.has('dynamaxclause')\r\n\t\t);\r\n\r\n\t\tif (criteria.item.mustHave && set.item !== criteria.item.mustHave.name) continue;\r\n\t\tif (criteria.item.mustNotHave.some(item => item.name === set.item)) continue;\r\n\r\n\t\tif (criteria.ability.mustHave && set.ability !== criteria.ability.mustHave.name) continue;\r\n\t\tif (criteria.ability.mustNotHave.some(ability => ability.name === set.ability)) continue;\r\n\r\n\t\tif (criteria.nature.mustHave && set.nature !== criteria.nature.mustHave.name) continue;\r\n\t\tif (criteria.nature.mustNotHave.some(nature => nature.name === set.nature)) continue;\r\n\r\n\t\tif (criteria.teraType.mustHave && set.teraType !== criteria.teraType.mustHave.name) continue;\r\n\t\tif (criteria.teraType.mustNotHave.some(type => type.name === set.teraType)) continue;\r\n\r\n\t\tconst setHasMove = (move: Move) => {\r\n\t\t\tconst id = move.id === 'hiddenpower' ? `${move.id}${toID(move.type)}` : move.id;\r\n\t\t\treturn set.moves.includes(id);\r\n\t\t};\r\n\t\tif (!criteria.moves.mustHave.every(setHasMove)) continue;\r\n\t\tif (criteria.moves.mustNotHave.some(setHasMove)) continue;\r\n\r\n\t\tresults.matches++;\r\n\t}\r\n\r\n\treturn results;\r\n}\r\n\r\nconst GEN_NAMES: {[k: string]: string} = {\r\n\tgen1: '[Gen 1]', gen2: '[Gen 2]', gen3: '[Gen 3]', gen4: '[Gen 4]', gen5: '[Gen 5]', gen6: '[Gen 6]', gen7: '[Gen 7]',\r\n};\r\n\r\nconst STAT_NAMES: {[k: string]: string} = {\r\n\thp: \"HP\", atk: \"Atk\", def: \"Def\", spa: \"SpA\", spd: \"SpD\", spe: \"Spe\",\r\n};\r\n\r\nconst TIERS: {[k: string]: string} = {\r\n\tuber: \"Uber\", ubers: \"Uber\",\r\n\tou: \"OU\", uu: \"UU\", ru: \"RU\", nu: \"NU\", pu: \"PU\",\r\n\tmono: \"Mono\", monotype: \"Mono\", lc: \"LC\", littlecup: \"LC\",\r\n};\r\n\r\nfunction formatAbility(ability: Ability | string) {\r\n\tability = Dex.abilities.get(ability);\r\n\treturn `${ability.name}`;\r\n}\r\nfunction formatNature(n: string) {\r\n\tconst nature = Dex.natures.get(n);\r\n\treturn nature.name;\r\n}\r\n\r\nfunction formatMove(move: Move | string) {\r\n\tmove = Dex.moves.get(move);\r\n\treturn `${move.name}`;\r\n}\r\n\r\nfunction formatItem(item: Item | string) {\r\n\tif (typeof item === 'string' && item === \"No Item\") {\r\n\t\treturn `No Item`;\r\n\t} else {\r\n\t\titem = Dex.items.get(item);\r\n\t\treturn `${item.name}`;\r\n\t}\r\n}\r\n\r\n/**\r\n * Gets the sets for a Pokemon for a format that uses the new schema.\r\n * Old formats will use getData()\r\n */\r\nfunction getSets(species: string | Species, format = 'gen9randombattle'): any[] | null {\r\n\tconst dex = Dex.forFormat(format);\r\n\tspecies = dex.species.get(species);\r\n\tconst setsFile = JSON.parse(\r\n\t\tFS(`data/${dex.isBase ? '' : `mods/${dex.currentMod}/`}random-sets.json`).readIfExistsSync() || '{}'\r\n\t);\r\n\tconst sets = setsFile[species.id]?.sets;\r\n\tif (!sets?.length) return null;\r\n\treturn sets;\r\n}\r\n\r\n/**\r\n * Gets the random battles data for a Pokemon for formats before gen 9.\r\n */\r\nfunction getData(species: string | Species, format: string | Format): any | null {\r\n\tconst dex = Dex.forFormat(format);\r\n\tspecies = dex.species.get(species);\r\n\tconst dataFile = JSON.parse(\r\n\t\tFS(`data/mods/${dex.currentMod}/random-data.json`).readIfExistsSync() || '{}'\r\n\t);\r\n\tconst data = dataFile[species.id];\r\n\tif (!data) return null;\r\n\treturn data;\r\n}\r\n\r\nfunction getRBYMoves(species: string | Species) {\r\n\tspecies = Dex.mod(`gen1`).species.get(species);\r\n\tconst data = getData(species, 'gen1randombattle');\r\n\tif (!data) return false;\r\n\tlet buf = ``;\r\n\tif (data.moves) {\r\n\t\tbuf += `
Randomized moves: `;\r\n\t\tbuf += data.moves.map(formatMove).sort().join(\", \");\r\n\t}\r\n\tif (data.comboMoves) {\r\n\t\tbuf += `
Combo moves: `;\r\n\t\tbuf += data.comboMoves.map(formatMove).sort().join(\", \");\r\n\t}\r\n\tif (data.exclusiveMoves) {\r\n\t\tbuf += `
Exclusive moves: `;\r\n\t\tbuf += data.exclusiveMoves.map(formatMove).sort().join(\", \");\r\n\t}\r\n\tif (data.essentialMove) {\r\n\t\tbuf += `
Essential move: `;\r\n\t\tbuf += formatMove(data.essentialMove);\r\n\t}\r\n\tif (\r\n\t\t!data.moves && !data.comboMoves &&\r\n\t\t!data.exclusiveMoves && !data.essentialMove\r\n\t) {\r\n\t\treturn false;\r\n\t}\r\n\treturn buf;\r\n}\r\n\r\nfunction getLetsGoMoves(species: string | Species) {\r\n\tspecies = Dex.species.get(species);\r\n\tconst data = getData(species, 'gen7letsgorandombattle');\r\n\tif (!data) return false;\r\n\tconst isLetsGoLegal = (\r\n\t\t(species.num <= 151 || ['Meltan', 'Melmetal'].includes(species.name)) &&\r\n\t\t(!species.forme || ['Alola', 'Mega', 'Mega-X', 'Mega-Y', 'Starter'].includes(species.forme))\r\n\t);\r\n\tif (!isLetsGoLegal) return false;\r\n\tif (!data.moves?.length) return false;\r\n\treturn data.moves.map(formatMove).sort().join(`, `);\r\n}\r\n\r\nfunction battleFactorySets(species: string | Species, tier: string | null, gen = 'gen8', isBSS = false) {\r\n\tspecies = Dex.species.get(species);\r\n\tif (typeof species.battleOnly === 'string') {\r\n\t\tspecies = Dex.species.get(species.battleOnly);\r\n\t}\r\n\tgen = toID(gen);\r\n\tconst genNum = parseInt(gen[3]);\r\n\tif (isNaN(genNum) || genNum < 6 || (isBSS && genNum < 7)) return null;\r\n\tconst statsFile = JSON.parse(\r\n\t\tFS(`data${gen === 'gen9' ? '/' : `/mods/${gen}`}/${isBSS ? `bss-` : ``}factory-sets.json`).readIfExistsSync() ||\r\n\t\t\"{}\"\r\n\t);\r\n\tif (!Object.keys(statsFile).length) return null;\r\n\tlet buf = ``;\r\n\tif (!isBSS) {\r\n\t\tif (!tier) return {e: `Please provide a valid tier.`};\r\n\t\tif (!(toID(tier) in TIERS)) return {e: `That tier isn't supported.`};\r\n\t\tif (!(TIERS[toID(tier)] in statsFile)) {\r\n\t\t\treturn {e: `${TIERS[toID(tier)]} is not included in [Gen ${genNum}] Battle Factory.`};\r\n\t\t}\r\n\t\tconst t = statsFile[TIERS[toID(tier)]];\r\n\t\tif (!(species.id in t)) {\r\n\t\t\tconst formatName = Dex.formats.get(`${gen}battlefactory`).name;\r\n\t\t\treturn {e: `${species.name} doesn't have any sets in ${TIERS[toID(tier)]} for ${formatName}.`};\r\n\t\t}\r\n\t\tconst setObj = t[species.id];\r\n\t\tbuf += `Sets for ${species.name} in${genNum === 8 ? `` : ` ${GEN_NAMES[gen]}`} ${TIERS[toID(tier)]}:
`;\r\n\t\tfor (const [i, set] of setObj.sets.entries()) {\r\n\t\t\tbuf += `
Set ${i + 1}`;\r\n\t\t\tbuf += `
`;\r\n\t\t}\r\n\t} else {\r\n\t\tconst format = Dex.formats.get(`${gen}bssfactory`);\r\n\t\tif (!(species.id in statsFile)) return {e: `${species.name} doesn't have any sets in ${format.name}.`};\r\n\t\tconst setObj = statsFile[species.id];\r\n\t\tbuf += `Sets for ${species.name} in ${format.name}:
`;\r\n\t\tfor (const [i, set] of setObj.sets.entries()) {\r\n\t\t\tbuf += `
Set ${i + 1}`;\r\n\t\t\tbuf += `
`;\r\n\t\t}\r\n\t}\r\n\treturn buf;\r\n}\r\n\r\nfunction CAP1v1Sets(species: string | Species) {\r\n\tspecies = Dex.species.get(species);\r\n\tconst statsFile = JSON.parse(\r\n\t\tFS(`data/mods/gen8/cap-1v1-sets.json`).readIfExistsSync() ||\r\n\t\t\"{}\"\r\n\t);\r\n\tif (!Object.keys(statsFile).length) return null;\r\n\tif (species.isNonstandard !== \"CAP\") {\r\n\t\treturn {\r\n\t\t\te: `[Gen 8] CAP 1v1 only allows Pok\\u00e9mon created by the Create-A-Pok\\u00e9mon Project.`,\r\n\t\t\tparse: `/cap`,\r\n\t\t};\r\n\t}\r\n\tif (species.isNonstandard === \"CAP\" && !(species.name in statsFile)) {\r\n\t\treturn {e: `${species.name} doesn't have any sets in [Gen 8] CAP 1v1.`};\r\n\t}\r\n\tlet buf = `Sets for ${species.name} in [Gen 8] CAP 1v1:
`;\r\n\tfor (const [i, set] of statsFile[species.name].entries()) {\r\n\t\tbuf += `
Set ${i + 1}`;\r\n\t\tbuf += `
`;\r\n\t}\r\n\treturn buf;\r\n}\r\n\r\nfunction generateSSBSet(set: SSBSet, dex: ModdedDex, baseDex: ModdedDex) {\r\n\tif (set.skip) {\r\n\t\tconst baseSet = toID(Object.values(ssbSets[set.skip]).join());\r\n\t\tconst skipSet = toID(Object.values(set).join()).slice(0, -toID(set.skip).length);\r\n\t\tif (baseSet === skipSet) return ``;\r\n\t}\r\n\tlet buf = ``;\r\n\tbuf += `
Set`;\r\n\tbuf += ``;\r\n\tbuf += `
`;\r\n\treturn buf;\r\n}\r\n\r\nfunction generateSSBMoveInfo(sigMove: Move, dex: ModdedDex) {\r\n\tlet buf = ``;\r\n\tif (sigMove.shortDesc || sigMove.desc) {\r\n\t\tbuf += `
`;\r\n\t\tbuf += Chat.getDataMoveHTML(sigMove);\r\n\t\tconst details: {[k: string]: string} = {\r\n\t\t\tPriority: String(sigMove.priority),\r\n\t\t\tGen: String(sigMove.gen) || 'CAP',\r\n\t\t};\r\n\r\n\t\tif (sigMove.isNonstandard === \"Past\" && dex.gen >= 8) details[\"✗ Past Gens Only\"] = \"\";\r\n\t\tif (sigMove.secondary || sigMove.secondaries) details[\"✓ Secondary effect\"] = \"\";\r\n\t\tif (sigMove.flags['contact']) details[\"✓ Contact\"] = \"\";\r\n\t\tif (sigMove.flags['sound']) details[\"✓ Sound\"] = \"\";\r\n\t\tif (sigMove.flags['bullet']) details[\"✓ Bullet\"] = \"\";\r\n\t\tif (sigMove.flags['pulse']) details[\"✓ Pulse\"] = \"\";\r\n\t\tif (!sigMove.flags['protect'] && !/(ally|self)/i.test(sigMove.target)) details[\"✓ Bypasses Protect\"] = \"\";\r\n\t\tif (sigMove.flags['bypasssub']) details[\"✓ Bypasses Substitutes\"] = \"\";\r\n\t\tif (sigMove.flags['defrost']) details[\"✓ Thaws user\"] = \"\";\r\n\t\tif (sigMove.flags['bite']) details[\"✓ Bite\"] = \"\";\r\n\t\tif (sigMove.flags['punch']) details[\"✓ Punch\"] = \"\";\r\n\t\tif (sigMove.flags['powder']) details[\"✓ Powder\"] = \"\";\r\n\t\tif (sigMove.flags['reflectable']) details[\"✓ Bounceable\"] = \"\";\r\n\t\tif (sigMove.flags['charge']) details[\"✓ Two-turn move\"] = \"\";\r\n\t\tif (sigMove.flags['recharge']) details[\"✓ Has recharge turn\"] = \"\";\r\n\t\tif (sigMove.flags['gravity']) details[\"✗ Suppressed by Gravity\"] = \"\";\r\n\t\tif (sigMove.flags['dance']) details[\"✓ Dance move\"] = \"\";\r\n\r\n\t\tif (sigMove.zMove?.basePower) {\r\n\t\t\tdetails[\"Z-Power\"] = String(sigMove.zMove.basePower);\r\n\t\t} else if (sigMove.zMove?.effect) {\r\n\t\t\tconst zEffects: {[k: string]: string} = {\r\n\t\t\t\tclearnegativeboost: \"Restores negative stat stages to 0\",\r\n\t\t\t\tcrit2: \"Crit ratio +2\",\r\n\t\t\t\theal: \"Restores HP 100%\",\r\n\t\t\t\tcurse: \"Restores HP 100% if user is Ghost type, otherwise Attack +1\",\r\n\t\t\t\tredirect: \"Redirects opposing attacks to user\",\r\n\t\t\t\thealreplacement: \"Restores replacement's HP 100%\",\r\n\t\t\t};\r\n\t\t\tdetails[\"Z-Effect\"] = zEffects[sigMove.zMove.effect];\r\n\t\t} else if (sigMove.zMove?.boost) {\r\n\t\t\tdetails[\"Z-Effect\"] = \"\";\r\n\t\t\tconst boost = sigMove.zMove.boost;\r\n\t\t\tfor (const h in boost) {\r\n\t\t\t\tdetails[\"Z-Effect\"] += ` ${Dex.stats.mediumNames[h as 'atk']} +${boost[h as 'atk']}`;\r\n\t\t\t}\r\n\t\t} else if (sigMove.isZ && typeof sigMove.isZ === 'string') {\r\n\t\t\tdetails[\"✓ Z-Move\"] = \"\";\r\n\t\t\tconst zCrystal = dex.items.get(sigMove.isZ);\r\n\t\t\tdetails[\"Z-Crystal\"] = zCrystal.name;\r\n\t\t\tif (zCrystal.itemUser) {\r\n\t\t\t\tdetails[\"User\"] = zCrystal.itemUser.join(\", \");\r\n\t\t\t\tdetails[\"Required Move\"] = dex.items.get(sigMove.isZ).zMoveFrom!;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tdetails[\"Z-Effect\"] = \"None\";\r\n\t\t}\r\n\r\n\t\tconst targetTypes: {[k: string]: string} = {\r\n\t\t\tnormal: \"One Adjacent Pok\\u00e9mon\",\r\n\t\t\tself: \"User\",\r\n\t\t\tadjacentAlly: \"One Ally\",\r\n\t\t\tadjacentAllyOrSelf: \"User or Ally\",\r\n\t\t\tadjacentFoe: \"One Adjacent Opposing Pok\\u00e9mon\",\r\n\t\t\tallAdjacentFoes: \"All Adjacent Opponents\",\r\n\t\t\tfoeSide: \"Opposing Side\",\r\n\t\t\tallySide: \"User's Side\",\r\n\t\t\tallyTeam: \"User's Side\",\r\n\t\t\tallAdjacent: \"All Adjacent Pok\\u00e9mon\",\r\n\t\t\tany: \"Any Pok\\u00e9mon\",\r\n\t\t\tall: \"All Pok\\u00e9mon\",\r\n\t\t\tscripted: \"Chosen Automatically\",\r\n\t\t\trandomNormal: \"Random Adjacent Opposing Pok\\u00e9mon\",\r\n\t\t\tallies: \"User and Allies\",\r\n\t\t};\r\n\t\tdetails[\"Target\"] = targetTypes[sigMove.target] || \"Unknown\";\r\n\t\tif (sigMove.isNonstandard === 'Unobtainable') {\r\n\t\t\tdetails[`Unobtainable in Gen ${dex.gen}`] = \"\";\r\n\t\t}\r\n\t\tbuf += `${Object.entries(details).map(([detail, value]) => (\r\n\t\t\tvalue === '' ? detail : `${detail}: ${value}`\r\n\t\t)).join(\" |  \")}`;\r\n\t\tif (sigMove.desc && sigMove.desc !== sigMove.shortDesc) {\r\n\t\t\tbuf += `
In-Depth Description${sigMove.desc}
`;\r\n\t\t}\r\n\t}\r\n\treturn buf;\r\n}\r\n\r\nfunction generateSSBItemInfo(set: SSBSet, dex: ModdedDex, baseDex: ModdedDex) {\r\n\tlet buf = ``;\r\n\tif (!Array.isArray(set.item)) {\r\n\t\tconst baseItem = baseDex.items.get(set.item);\r\n\t\tconst sigItem = dex.items.get(set.item);\r\n\t\tif (!baseItem.exists || (baseItem.desc || baseItem.shortDesc) !== (sigItem.desc || sigItem.shortDesc)) {\r\n\t\t\tbuf += `
`;\r\n\t\t\tbuf += Chat.getDataItemHTML(sigItem);\r\n\t\t\tconst details: {[k: string]: string} = {\r\n\t\t\t\tGen: String(sigItem.gen),\r\n\t\t\t};\r\n\r\n\t\t\tif (dex.gen >= 4) {\r\n\t\t\t\tif (sigItem.fling) {\r\n\t\t\t\t\tdetails[\"Fling Base Power\"] = String(sigItem.fling.basePower);\r\n\t\t\t\t\tif (sigItem.fling.status) details[\"Fling Effect\"] = sigItem.fling.status;\r\n\t\t\t\t\tif (sigItem.fling.volatileStatus) details[\"Fling Effect\"] = sigItem.fling.volatileStatus;\r\n\t\t\t\t\tif (sigItem.isBerry) details[\"Fling Effect\"] = \"Activates the Berry's effect on the target.\";\r\n\t\t\t\t\tif (sigItem.id === 'whiteherb') details[\"Fling Effect\"] = \"Restores the target's negative stat stages to 0.\";\r\n\t\t\t\t\tif (sigItem.id === 'mentalherb') {\r\n\t\t\t\t\t\tconst flingEffect = \"Removes the effects of Attract, Disable, Encore, Heal Block, Taunt, and Torment from the target.\";\r\n\t\t\t\t\t\tdetails[\"Fling Effect\"] = flingEffect;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tdetails[\"Fling\"] = \"This item cannot be used with Fling.\";\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (sigItem.naturalGift && dex.gen >= 3) {\r\n\t\t\t\tdetails[\"Natural Gift Type\"] = sigItem.naturalGift.type;\r\n\t\t\t\tdetails[\"Natural Gift Base Power\"] = String(sigItem.naturalGift.basePower);\r\n\t\t\t}\r\n\t\t\tif (sigItem.isNonstandard && sigItem.isNonstandard !== \"Custom\") {\r\n\t\t\t\tdetails[`Unobtainable in Gen ${dex.gen}`] = \"\";\r\n\t\t\t}\r\n\t\t\tbuf += `${Object.entries(details).map(([detail, value]) => (\r\n\t\t\t\tvalue === '' ? detail : `${detail}: ${value}`\r\n\t\t\t)).join(\" |  \")}`;\r\n\t\t}\r\n\t}\r\n\treturn buf;\r\n}\r\n\r\nfunction generateSSBAbilityInfo(set: SSBSet, dex: ModdedDex, baseDex: ModdedDex) {\r\n\tlet buf = ``;\r\n\tif (!Array.isArray(set.ability) && !baseDex.abilities.get(set.ability).exists) {\r\n\t\tconst sigAbil = Dex.deepClone(dex.abilities.get(set.ability));\r\n\t\tif (!sigAbil.desc && !sigAbil.shortDesc) {\r\n\t\t\tsigAbil.desc = `This ability doesn't have a description. Try contacting the SSB dev team.`;\r\n\t\t}\r\n\t\tbuf += `
`;\r\n\t\tbuf += Chat.getDataAbilityHTML(sigAbil);\r\n\t\tconst details: {[k: string]: string} = {\r\n\t\t\tGen: String(sigAbil.gen) || 'CAP',\r\n\t\t};\r\n\t\tbuf += `${Object.entries(details).map(([detail, value]) => (\r\n\t\t\tvalue === '' ? detail : `${detail}: ${value}`\r\n\t\t)).join(\" |  \")}`;\r\n\t\tif (sigAbil.desc && sigAbil.shortDesc && sigAbil.desc !== sigAbil.shortDesc) {\r\n\t\t\tbuf += `
In-Depth Description${sigAbil.desc}
`;\r\n\t\t}\r\n\t}\r\n\treturn buf;\r\n}\r\n\r\nfunction generateSSBPokemonInfo(species: string, dex: ModdedDex, baseDex: ModdedDex) {\r\n\tlet buf = ``;\r\n\tconst origSpecies = baseDex.species.get(species);\r\n\tconst newSpecies = dex.species.get(species);\r\n\tif (\r\n\t\tnewSpecies.types.join('/') !== origSpecies.types.join('/') ||\r\n\t\tObject.values(newSpecies.abilities).join('/') !== Object.values(origSpecies.abilities).join('/') ||\r\n\t\tObject.values(newSpecies.baseStats).join('/') !== Object.values(origSpecies.baseStats).join('/')\r\n\t) {\r\n\t\tbuf += `
`;\r\n\t\tbuf += Chat.getDataPokemonHTML(newSpecies, dex.gen, 'SSB');\r\n\t\tlet weighthit = 20;\r\n\t\tif (newSpecies.weighthg >= 2000) {\r\n\t\t\tweighthit = 120;\r\n\t\t} else if (newSpecies.weighthg >= 1000) {\r\n\t\t\tweighthit = 100;\r\n\t\t} else if (newSpecies.weighthg >= 500) {\r\n\t\t\tweighthit = 80;\r\n\t\t} else if (newSpecies.weighthg >= 250) {\r\n\t\t\tweighthit = 60;\r\n\t\t} else if (newSpecies.weighthg >= 100) {\r\n\t\t\tweighthit = 40;\r\n\t\t}\r\n\t\tconst details: {[k: string]: string} = {\r\n\t\t\t\"Dex#\": String(newSpecies.num),\r\n\t\t\tGen: String(newSpecies.gen) || 'CAP',\r\n\t\t\tHeight: `${newSpecies.heightm} m`,\r\n\t\t};\r\n\t\tdetails[\"Weight\"] = `${newSpecies.weighthg / 10} kg (${weighthit} BP)`;\r\n\t\tif (newSpecies.color && dex.gen >= 5) details[\"Dex Colour\"] = newSpecies.color;\r\n\t\tif (newSpecies.eggGroups && dex.gen >= 2) details[\"Egg Group(s)\"] = newSpecies.eggGroups.join(\", \");\r\n\t\tconst evos: string[] = [];\r\n\t\tfor (const evoName of newSpecies.evos) {\r\n\t\t\tconst evo = dex.species.get(evoName);\r\n\t\t\tif (evo.gen <= dex.gen) {\r\n\t\t\t\tconst condition = evo.evoCondition ? ` ${evo.evoCondition}` : ``;\r\n\t\t\t\tswitch (evo.evoType) {\r\n\t\t\t\tcase 'levelExtra':\r\n\t\t\t\t\tevos.push(`${evo.name} (level-up${condition})`);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'levelFriendship':\r\n\t\t\t\t\tevos.push(`${evo.name} (level-up with high Friendship${condition})`);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'levelHold':\r\n\t\t\t\t\tevos.push(`${evo.name} (level-up holding ${evo.evoItem}${condition})`);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'useItem':\r\n\t\t\t\t\tevos.push(`${evo.name} (${evo.evoItem})`);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'levelMove':\r\n\t\t\t\t\tevos.push(`${evo.name} (level-up with ${evo.evoMove}${condition})`);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'other':\r\n\t\t\t\t\tevos.push(`${evo.name} (${evo.evoCondition})`);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'trade':\r\n\t\t\t\t\tevos.push(`${evo.name} (trade${evo.evoItem ? ` holding ${evo.evoItem}` : condition})`);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tevos.push(`${evo.name} (${evo.evoLevel}${condition})`);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!evos.length) {\r\n\t\t\tdetails[`Does Not Evolve`] = \"\";\r\n\t\t} else {\r\n\t\t\tdetails[\"Evolution\"] = evos.join(\", \");\r\n\t\t}\r\n\t\tbuf += `${Object.entries(details).map(([detail, value]) => (\r\n\t\t\tvalue === '' ? detail : `${detail}: ${value}`\r\n\t\t)).join(\" |  \")}`;\r\n\t}\r\n\treturn buf;\r\n}\r\n\r\nfunction generateSSBInnateInfo(name: string, dex: ModdedDex, baseDex: ModdedDex) {\r\n\tlet buf = ``;\r\n\t// Special casing for users whose usernames are already existing, i.e. Perish Song\r\n\tlet effect = dex.conditions.get(name + 'user');\r\n\tlet longDesc = ``;\r\n\tconst baseAbility = Dex.deepClone(baseDex.abilities.get('noability'));\r\n\t// @ts-ignore hack to record the name of the innate abilities without using name\r\n\tif (effect.exists && effect.innateName && (effect.desc || effect.shortDesc)) {\r\n\t\t// @ts-ignore hack\r\n\t\tbaseAbility.name = effect.innateName;\r\n\t\tif (effect.desc) baseAbility.desc = effect.desc;\r\n\t\tif (effect.shortDesc) baseAbility.shortDesc = effect.shortDesc;\r\n\t\tbuf += `
Innate Ability:
${Chat.getDataAbilityHTML(baseAbility)}`;\r\n\t\tif (effect.desc && effect.shortDesc && effect.desc !== effect.shortDesc) {\r\n\t\t\tlongDesc = effect.desc;\r\n\t\t}\r\n\t} else {\r\n\t\teffect = dex.conditions.get(name);\r\n\t\t// @ts-ignore hack\r\n\t\tif (effect.exists && effect.innateName && (effect.desc || effect.shortDesc)) {\r\n\t\t\t// @ts-ignore hack\r\n\t\t\tbaseAbility.name = effect.innateName;\r\n\t\t\tif (effect.desc) baseAbility.desc = effect.desc;\r\n\t\t\tif (effect.shortDesc) baseAbility.shortDesc = effect.shortDesc;\r\n\t\t\tbuf += `
Innate Ability:
${Chat.getDataAbilityHTML(baseAbility)}`;\r\n\t\t\tif (effect.desc && effect.shortDesc && effect.desc !== effect.shortDesc) {\r\n\t\t\t\tlongDesc = effect.desc;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tif (buf) {\r\n\t\tconst details: {[k: string]: string} = {Gen: '8'};\r\n\t\tbuf += `${Object.entries(details).map(([detail, value]) => (\r\n\t\t\tvalue === '' ? detail : `${detail}: ${value}`\r\n\t\t)).join(\" |  \")}`;\r\n\t}\r\n\tif (longDesc) {\r\n\t\tbuf += `
In-Depth Description${longDesc}
`;\r\n\t}\r\n\treturn buf;\r\n}\r\n\r\nfunction SSBSets(target: string) {\r\n\tconst baseDex = Dex;\r\n\tconst dex = Dex.forFormat('gen8superstaffbros4');\r\n\tif (!Object.keys(ssbSets).map(toID).includes(toID(target))) {\r\n\t\treturn {e: `Error: ${target.trim()} doesn't have a [Gen 8] Super Staff Bros 4 set.`};\r\n\t}\r\n\tlet displayName = '';\r\n\tconst names = [];\r\n\tfor (const member in ssbSets) {\r\n\t\tif (toID(member).startsWith(toID(target))) names.push(member);\r\n\t\tif (toID(member) === toID(target)) displayName = member;\r\n\t}\r\n\tlet buf = '';\r\n\tfor (const name of names) {\r\n\t\tif (buf) buf += `
`;\r\n\t\tconst set = ssbSets[name];\r\n\t\tconst mutatedSpecies = dex.species.get(set.species);\r\n\t\tif (!set.skip) {\r\n\t\t\tbuf += Utils.html`

${displayName === 'yuki' ? name : displayName}

`;\r\n\t\t} else {\r\n\t\t\tbuf += `
${name.split('-').slice(1).join('-') + ' forme'}`;\r\n\t\t}\r\n\t\tbuf += generateSSBSet(set, dex, baseDex);\r\n\t\tconst item = dex.items.get(set.item as string);\r\n\t\tif (!set.skip || set.signatureMove !== ssbSets[set.skip].signatureMove) {\r\n\t\t\tconst sigMove = baseDex.moves.get(set.signatureMove).exists && !Array.isArray(set.item) &&\r\n\t\t\t\ttypeof item.zMove === 'string' ?\r\n\t\t\t\tdex.moves.get(item.zMove) : dex.moves.get(set.signatureMove);\r\n\t\t\tbuf += generateSSBMoveInfo(sigMove, dex);\r\n\t\t\tif (sigMove.id === 'blackbird') buf += generateSSBMoveInfo(dex.moves.get('gaelstrom'), dex);\r\n\t\t}\r\n\t\tbuf += generateSSBItemInfo(set, dex, baseDex);\r\n\t\tbuf += generateSSBAbilityInfo(set, dex, baseDex);\r\n\t\tbuf += generateSSBInnateInfo(name, dex, baseDex);\r\n\t\tbuf += generateSSBPokemonInfo(set.species, dex, baseDex);\r\n\t\tif (!Array.isArray(set.item) && item.megaStone) {\r\n\t\t\tbuf += generateSSBPokemonInfo(item.megaStone, dex, baseDex);\r\n\t\t// Psynergy, Struchni, and Raj.shoot have itemless Mega Evolutions\r\n\t\t} else if (['Aggron', 'Rayquaza'].includes(set.species)) {\r\n\t\t\tbuf += generateSSBPokemonInfo(`${set.species}-Mega`, dex, baseDex);\r\n\t\t} else if (set.species === 'Charizard') {\r\n\t\t\tbuf += generateSSBPokemonInfo('Charizard-Mega-X', dex, baseDex);\r\n\t\t}\r\n\t\tif (set.skip) buf += `
`;\r\n\t}\r\n\treturn buf;\r\n}\r\n\r\nexport const commands: Chat.ChatCommands = {\r\n\trandbats: 'randombattles',\r\n\trandombattles(target, room, user) {\r\n\t\tif (!this.runBroadcast()) return;\r\n\t\tconst battle = room?.battle;\r\n\t\tif (battle) {\r\n\t\t\tif (battle.format.includes('nodmax')) return this.parse(`/randombattlenodmax ${target}`);\r\n\t\t\tif (battle.format.includes('doubles') || battle.gameType === 'freeforall') {\r\n\t\t\t\treturn this.parse(`/randomdoublesbattle ${target}`);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst args = target.split(',');\r\n\t\tif (!args[0]) return this.parse(`/help randombattles`);\r\n\r\n\t\tconst {dex} = this.splitFormat(target, true);\r\n\t\tconst isLetsGo = (dex.currentMod === 'gen7letsgo');\r\n\r\n\t\tconst species = dex.species.get(args[0]);\r\n\t\tif (!species.exists) {\r\n\t\t\treturn this.errorReply(`Error: Pok\\u00e9mon '${args[0].trim()}' does not exist.`);\r\n\t\t}\r\n\t\tconst extraFormatModifier = isLetsGo ? 'letsgo' : (dex.currentMod === 'gen8bdsp' ? 'bdsp' : '');\r\n\t\tlet formatName = dex.formats.get(`gen${dex.gen}${extraFormatModifier}randombattle`).name;\r\n\r\n\t\tconst movesets = [];\r\n\t\tlet setCount = 0;\r\n\t\tif (dex.gen === 1) {\r\n\t\t\tconst rbyMoves = getRBYMoves(species);\r\n\t\t\tif (!rbyMoves) {\r\n\t\t\t\treturn this.errorReply(`Error: ${species.name} has no Random Battle data in ${GEN_NAMES[toID(args[1])]}`);\r\n\t\t\t}\r\n\t\t\tmovesets.push(`Moves for ${species.name} in ${formatName}:${rbyMoves}`);\r\n\t\t\tsetCount = 1;\r\n\t\t} else if (isLetsGo) {\r\n\t\t\tformatName = `[Gen 7 Let's Go] Random Battle`;\r\n\t\t\tconst lgpeMoves = getLetsGoMoves(species);\r\n\t\t\tif (!lgpeMoves) {\r\n\t\t\t\treturn this.errorReply(`Error: ${species.name} has no Random Battle data in [Gen 7 Let's Go]`);\r\n\t\t\t}\r\n\t\t\tmovesets.push(`Moves for ${species.name} in ${formatName}:
${lgpeMoves}`);\r\n\t\t\tsetCount = 1;\r\n\t\t} else {\r\n\t\t\tconst setsToCheck = [species];\r\n\t\t\tif (dex.gen > 7) setsToCheck.push(dex.species.get(`${args[0]}gmax`));\r\n\t\t\tif (species.otherFormes) setsToCheck.push(...species.otherFormes.map(pkmn => dex.species.get(pkmn)));\r\n\t\t\tif (dex.gen >= 9) {\r\n\t\t\t\tfor (const pokemon of setsToCheck) {\r\n\t\t\t\t\tconst sets = getSets(pokemon);\r\n\t\t\t\t\tif (!sets) continue;\r\n\t\t\t\t\tlet buf = `Moves for ${pokemon.name} in ${formatName}:
`;\r\n\t\t\t\t\tfor (const set of sets) {\r\n\t\t\t\t\t\tbuf += `
${set.role}` +\r\n\t\t\t\t\t\t\t`Tera Type${Chat.plural(set.teraTypes)}: ${set.teraTypes.join(', ')}
` +\r\n\t\t\t\t\t\t\t`Moves: ${set.movepool.sort().map(formatMove).join(', ')}
`;\r\n\t\t\t\t\t\tsetCount++;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tmovesets.push(buf);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tfor (const pokemon of setsToCheck) {\r\n\t\t\t\t\tconst data = getData(pokemon, formatName);\r\n\t\t\t\t\tif (!data) continue;\r\n\t\t\t\t\tif (!data.moves || pokemon.isNonstandard === 'Future') continue;\r\n\t\t\t\t\tconst randomMoves = data.moves.slice();\r\n\t\t\t\t\tconst m = randomMoves.sort().map(formatMove);\r\n\t\t\t\t\tmovesets.push(\r\n\t\t\t\t\t\t`
` +\r\n\t\t\t\t\t\t`Moves for ${pokemon.name} in ${formatName}:` +\r\n\t\t\t\t\t\t`${m.join(`, `)}
`\r\n\t\t\t\t\t);\r\n\t\t\t\t\tsetCount++;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!movesets.length) {\r\n\t\t\treturn this.errorReply(`Error: ${species.name} has no Random Battle data in ${formatName}`);\r\n\t\t}\r\n\t\tlet buf = movesets.join('
');\r\n\t\tif (setCount <= 2) {\r\n\t\t\tbuf = buf.replace(/
/g, '
');\r\n\t\t}\r\n\t\tthis.sendReplyBox(buf);\r\n\t},\r\n\trandombattleshelp: [\r\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.`,\r\n\t],\r\n\r\n\tranddubs: 'randomdoublesbattle',\r\n\trandomdoublesbattle(target, room, user) {\r\n\t\tif (!this.runBroadcast()) return;\r\n\t\tconst args = target.split(',');\r\n\t\tif (!args[0]) return this.parse(`/help randomdoublesbattle`);\r\n\r\n\t\tconst {dex} = this.splitFormat(target, true);\r\n\t\tif (dex.gen < 4) return this.parse(`/help randomdoublesbattle`);\r\n\r\n\t\tconst species = dex.species.get(args[0]);\r\n\t\tconst formatName = dex.gen > 6 ? dex.formats.get(`gen${dex.gen}randomdoublesbattle`).name : dex.gen === 6 ?\r\n\t\t\t'[Gen 6] Random Doubles Battle' : dex.gen === 5 ?\r\n\t\t\t\t'[Gen 5] Random Doubles Battle' : '[Gen 4] Random Doubles Battle';\r\n\t\tif (!species.exists) {\r\n\t\t\treturn this.errorReply(`Error: Pok\\u00e9mon '${args[0].trim()}' does not exist.`);\r\n\t\t}\r\n\r\n\t\tconst setsToCheck = [species];\r\n\t\tif (dex.gen > 7) setsToCheck.push(dex.species.get(`${args[0]}gmax`));\r\n\t\tif (species.otherFormes) setsToCheck.push(...species.otherFormes.map(pkmn => dex.species.get(pkmn)));\r\n\r\n\t\tconst movesets = [];\r\n\t\tfor (const pokemon of setsToCheck) {\r\n\t\t\tconst data = getData(pokemon, formatName);\r\n\t\t\tif (!data) continue;\r\n\t\t\tif (!data.doublesMoves) continue;\r\n\t\t\tconst moves: string[] = [...data.doublesMoves];\r\n\t\t\tconst m = moves.sort().map(formatMove);\r\n\t\t\tmovesets.push(`Doubles moves for ${pokemon.name} in ${formatName}:
${m.join(`, `)}`);\r\n\t\t}\r\n\t\tthis.sendReplyBox(movesets.join('
'));\r\n\t},\r\n\trandomdoublesbattlehelp: [\r\n\t\t`/randomdoublesbattle OR /randdubs [pokemon], [gen] - Displays a Pok\\u00e9mon's Random Doubles Battle Moves. Supports Gens 4-8. Defaults to Gen 8. If used in a battle, defaults to that gen.`,\r\n\t],\r\n\r\n\trandsnodmax: 'randombattlenodmax',\r\n\trandombattlenodmax(target, room, user) {\r\n\t\tif (!this.runBroadcast()) return;\r\n\t\tif (!target) return this.parse(`/help randombattlenodmax`);\r\n\r\n\t\tconst dex = Dex.forFormat('gen8randombattlenodmax');\r\n\t\tlet species = dex.species.get(target);\r\n\r\n\t\tif (!species.exists) {\r\n\t\t\tthrow new Chat.ErrorMessage(`Error: Pok\\u00e9mon '${target.trim()}' does not exist.`);\r\n\t\t}\r\n\r\n\t\tconst data = getData(species, 'gen8randombattle');\r\n\t\tlet randomMoves = data ? (data.noDynamaxMoves || data.moves) : null;\r\n\t\tif (!randomMoves) {\r\n\t\t\tconst gmaxSpecies = dex.species.get(`${target}gmax`);\r\n\t\t\tconst gmaxData = getData(gmaxSpecies, 'gen8randombattle');\r\n\t\t\tif (!gmaxSpecies.exists || !gmaxData || !gmaxData.moves) {\r\n\t\t\t\treturn this.errorReply(`Error: No move data found for ${species.name} in [Gen 8] Random Battle (No Dmax).`);\r\n\t\t\t}\r\n\t\t\tspecies = gmaxSpecies;\r\n\t\t\trandomMoves = gmaxData.noDynamaxMoves || gmaxData.moves;\r\n\t\t}\r\n\r\n\t\tconst m = [...randomMoves].sort().map(formatMove);\r\n\t\tthis.sendReplyBox(`Moves for ${species.name} in [Gen 8] Random Battle (No Dmax):
${m.join(`, `)}`);\r\n\t},\r\n\trandombattlenodmaxhelp: [\r\n\t\t`/randombattlenodmax OR /randsnodmax [pokemon] - Displays a Pok\\u00e9mon's Random Battle (No Dmax) moves.`,\r\n\t],\r\n\r\n\tbssfactory: 'battlefactory',\r\n\tbattlefactory(target, room, user, connection, cmd) {\r\n\t\tif (!this.runBroadcast()) return;\r\n\t\tconst isBSS = cmd === 'bssfactory';\r\n\t\tif (isBSS) {\r\n\t\t\tconst args = target.split(',');\r\n\t\t\tif (!args[0]) return this.parse(`/help battlefactory`);\r\n\t\t\tconst species = Dex.species.get(args[0]);\r\n\t\t\tif (!species.exists) {\r\n\t\t\t\treturn this.errorReply(`Error: Pok\\u00e9mon '${args[0].trim()}' not found.`);\r\n\t\t\t}\r\n\t\t\tlet mod = 'gen8';\r\n\t\t\tif (args[1] && toID(args[1]) in Dex.dexes && Dex.dexes[toID(args[1])].gen >= 7) mod = toID(args[1]);\r\n\t\t\tconst bssSets = battleFactorySets(species, null, mod, true);\r\n\t\t\tif (!bssSets) return this.parse(`/help battlefactory`);\r\n\t\t\tif (typeof bssSets !== 'string') {\r\n\t\t\t\treturn this.errorReply(`Error: ${bssSets.e}`);\r\n\t\t\t}\r\n\t\t\treturn this.sendReplyBox(bssSets);\r\n\t\t} else {\r\n\t\t\tconst args = target.split(',');\r\n\t\t\tif (!args[0]) return this.parse(`/help battlefactory`);\r\n\t\t\tconst species = Dex.species.get(args[0]);\r\n\t\t\tif (!species.exists) {\r\n\t\t\t\treturn this.errorReply(`Error: Pok\\u00e9mon '${args[0].trim()}' not found.`);\r\n\t\t\t}\r\n\t\t\tlet tier = '';\r\n\t\t\tif (args[1] && toID(args[1]) in TIERS) {\r\n\t\t\t\ttier = TIERS[toID(args[1])];\r\n\t\t\t} else {\r\n\t\t\t\ttier = 'ou';\r\n\t\t\t}\r\n\t\t\tconst mod = args[2] || 'gen8';\r\n\t\t\tlet bfSets;\r\n\t\t\tif (species.name === 'Necrozma-Ultra') {\r\n\t\t\t\tbfSets = battleFactorySets(Dex.species.get('necrozma-dawnwings'), tier, mod);\r\n\t\t\t\tif (typeof bfSets === 'string') {\r\n\t\t\t\t\tbfSets += battleFactorySets(Dex.species.get('necrozma-duskmane'), tier, mod);\r\n\t\t\t\t}\r\n\t\t\t} else if (species.name === 'Zygarde-Complete') {\r\n\t\t\t\tbfSets = battleFactorySets(Dex.species.get('zygarde'), tier, mod);\r\n\t\t\t\tif (typeof bfSets === 'string') {\r\n\t\t\t\t\tbfSets += battleFactorySets(Dex.species.get('zygarde-10'), tier, mod);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tbfSets = battleFactorySets(species, tier, mod);\r\n\t\t\t}\r\n\t\t\tif (!bfSets) return this.parse(`/help battlefactory`);\r\n\t\t\tif (typeof bfSets !== 'string') {\r\n\t\t\t\treturn this.errorReply(`Error: ${bfSets.e}`);\r\n\t\t\t}\r\n\t\t\treturn this.sendReplyBox(bfSets);\r\n\t\t}\r\n\t},\r\n\tbattlefactoryhelp: [\r\n\t\t`/battlefactory [pokemon], [tier], [gen] - Displays a Pok\\u00e9mon's Battle Factory sets. Supports Gens 6-7. Defaults to Gen 7. If no tier is provided, defaults to OU.`,\r\n\t\t`- Supported tiers: OU, Ubers, UU, RU, NU, PU, Monotype (Gen 7 only), LC (Gen 7 only)`,\r\n\t\t`/bssfactory [pokemon], [gen] - Displays a Pok\\u00e9mon's BSS Factory sets. Supports Gen 7. Defaults to Gen 7.`,\r\n\t],\r\n\r\n\tcap1v1(target, room, user) {\r\n\t\tif (!this.runBroadcast()) return;\r\n\t\tif (!target) return this.parse(`/help cap1v1`);\r\n\t\tconst species = Dex.species.get(target);\r\n\t\tif (!species.exists) return this.errorReply(`Error: Pok\\u00e9mon '${target.trim()}' not found.`);\r\n\t\tconst cap1v1Set = CAP1v1Sets(species);\r\n\t\tif (!cap1v1Set) return this.parse(`/help cap1v1`);\r\n\t\tif (typeof cap1v1Set !== 'string') {\r\n\t\t\tthis.errorReply(`Error: ${cap1v1Set.e}`);\r\n\t\t\tif (cap1v1Set.parse) this.parse(cap1v1Set.parse);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\treturn this.sendReplyBox(cap1v1Set);\r\n\t},\r\n\tcap1v1help: [\r\n\t\t`/cap1v1 [pokemon] - Displays a Pok\\u00e9mon's CAP 1v1 sets.`,\r\n\t],\r\n\r\n\tssb(target, room, user) {\r\n\t\tif (!this.runBroadcast()) return;\r\n\t\tif (!target) return this.parse(`/help ssb`);\r\n\t\tconst set = SSBSets(target);\r\n\t\tif (typeof set !== 'string') {\r\n\t\t\tthrow new Chat.ErrorMessage(set.e);\r\n\t\t}\r\n\t\treturn this.sendReplyBox(set);\r\n\t},\r\n\tssbhelp: [\r\n\t\t`/ssb [staff member] - Displays a staff member's Super Staff Bros. set and custom features.`,\r\n\t],\r\n\r\n\tsetodds: 'randombattlesetprobabilities',\r\n\trandbatsodds: 'randombattlesetprobabilities',\r\n\trandbatsprobabilities: 'randombattlesetprobabilities',\r\n\trandombattlesetprobabilities(target, room, user) {\r\n\t\t// Restricted to global staff and randbats room auth\r\n\t\tconst randbatsRoom = Rooms.get('randombattles');\r\n\t\tif (!(randbatsRoom && randbatsRoom.auth.has(user.id))) {\r\n\t\t\tthis.checkCan('lock');\r\n\t\t}\r\n\r\n\t\tif (!target) return this.parse(`/help randombattlesetprobabilities`);\r\n\t\tthis.runBroadcast();\r\n\r\n\t\tconst args = target.split(',');\r\n\t\tif (args.length < 2) return this.parse(`/help randombattlesetprobabilities`);\r\n\r\n\t\t// Optional format\r\n\t\tlet format = Dex.formats.get('gen9randombattle');\r\n\t\tlet formatOrSpecies = args.shift();\r\n\t\tconst possibleFormat = Dex.formats.get(formatOrSpecies);\r\n\t\tif (possibleFormat.exists) {\r\n\t\t\tif (!possibleFormat.team) {\r\n\t\t\t\tthrow new Chat.ErrorMessage(`${possibleFormat.name} does not have randomly-generated teams.`);\r\n\t\t\t}\r\n\t\t\tformat = possibleFormat;\r\n\t\t\tformatOrSpecies = args.shift();\r\n\t\t}\r\n\t\tconst dex = Dex.forFormat(format);\r\n\r\n\t\t// Species\r\n\t\tconst species = dex.species.get(formatOrSpecies);\r\n\t\tif (!species.exists) {\r\n\t\t\tthrow new Chat.ErrorMessage(`Species ${species.name} does not exist in the specified format.`);\r\n\t\t}\r\n\r\n\t\tlet setExists: boolean;\r\n\t\tif (dex.gen >= 9) {\r\n\t\t\tsetExists = !!getSets(species);\r\n\t\t} else {\r\n\t\t\tconst data = getData(species, format);\r\n\t\t\tif (!data) {\r\n\t\t\t\tsetExists = false;\r\n\t\t\t} else if (format.gameType === 'doubles' || format.gameType === 'freeforall') {\r\n\t\t\t\tsetExists = !!data.doublesMoves;\r\n\t\t\t} else {\r\n\t\t\t\tsetExists = !!data.moves;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!setExists) {\r\n\t\t\tthrow new Chat.ErrorMessage(`${species.name} does not have random battle moves in ${format.name}.`);\r\n\t\t}\r\n\r\n\t\t// Criteria\r\n\t\tconst criteria: SetCriteria = {\r\n\t\t\tmoves: {mustHave: [], mustNotHave: []},\r\n\t\t\titem: {mustNotHave: []},\r\n\t\t\tability: {mustNotHave: []},\r\n\t\t\tnature: {mustNotHave: []},\r\n\t\t\tteraType: {mustNotHave: []},\r\n\t\t};\r\n\r\n\t\tif (args.length < 1) {\r\n\t\t\tthis.errorReply(`You must specify at least one condition.`);\r\n\t\t\treturn this.parse(`/help randombattlesetprobabilities`);\r\n\t\t}\r\n\r\n\t\tfor (const arg of args) {\r\n\t\t\tlet [key, value] = arg.split('=');\r\n\t\t\tkey = toID(key);\r\n\t\t\tif (!value || !key) {\r\n\t\t\t\tthis.errorReply(`Invalid condition format: ${arg}`);\r\n\t\t\t\treturn this.parse(`/help randombattlesetprobabilities`);\r\n\t\t\t}\r\n\r\n\t\t\tswitch (key) {\r\n\t\t\tcase 'moves':\r\n\t\t\t\tfor (const rawMove of value.split('&')) {\r\n\t\t\t\t\tconst move = dex.moves.get(rawMove);\r\n\t\t\t\t\tif (!move.exists) {\r\n\t\t\t\t\t\tthrow new Chat.ErrorMessage(`\"${rawMove}\" is not a move in the specified format.`);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst isNegation = rawMove.trim().startsWith('!');\r\n\t\t\t\t\tif (isNegation) {\r\n\t\t\t\t\t\tcriteria.moves.mustNotHave.push(move);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tcriteria.moves.mustHave.push(move);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'item':\r\n\t\t\t\tconst item = dex.items.get(value);\r\n\t\t\t\tif (!item.exists) {\r\n\t\t\t\t\tthrow new Chat.ErrorMessage(`\"${value}\" is not an item in the specified format.`);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst itemNegation = value.trim().startsWith('!');\r\n\t\t\t\tif (itemNegation) {\r\n\t\t\t\t\tcriteria.item.mustNotHave.push(item);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (criteria.item.mustHave) {\r\n\t\t\t\t\t\tthrow new Chat.ErrorMessage(`Impossible situation: two items (${criteria.item.mustHave.name} and ${item.name}) are required.`);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcriteria.item.mustHave = item;\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'ability':\r\n\t\t\t\tconst ability = dex.abilities.get(value);\r\n\t\t\t\tif (!ability.exists) {\r\n\t\t\t\t\tthrow new Chat.ErrorMessage(`\"${value}\" is not an ability in the specified format.`);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst abilityNegation = value.trim().startsWith('!');\r\n\t\t\t\tif (abilityNegation) {\r\n\t\t\t\t\tcriteria.ability.mustNotHave.push(ability);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (criteria.ability.mustHave) {\r\n\t\t\t\t\t\tthrow new Chat.ErrorMessage(`Impossible situation: two abilities (${criteria.ability.mustHave.name} and ${ability.name}) are required.`);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcriteria.ability.mustHave = ability;\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'nature':\r\n\t\t\t\tconst nature = dex.natures.get(value);\r\n\t\t\t\tif (!nature.exists) {\r\n\t\t\t\t\tthrow new Chat.ErrorMessage(`\"${value}\" is not a nature in the specified format.`);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst natureNegation = value.trim().startsWith('!');\r\n\t\t\t\tif (natureNegation) {\r\n\t\t\t\t\tcriteria.nature.mustNotHave.push(nature);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (criteria.nature.mustHave) {\r\n\t\t\t\t\t\tthrow new Chat.ErrorMessage(`Impossible situation: two natures (${criteria.nature.mustHave.name} and ${nature.name}) are required.`);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcriteria.nature.mustHave = nature;\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'tera': case 'teratype':\r\n\t\t\t\tif (dex.gen < 9) throw new Chat.ErrorMessage(\"Tera Types do not exist in the specified format.\");\r\n\t\t\t\tconst type = dex.types.get(value);\r\n\t\t\t\tif (!type.exists) {\r\n\t\t\t\t\tthrow new Chat.ErrorMessage(`\"${value}\" is not a type in the specified format.`);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst typeNegation = value.trim().startsWith('!');\r\n\t\t\t\tif (typeNegation) {\r\n\t\t\t\t\tcriteria.teraType.mustNotHave.push(type);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (criteria.teraType.mustHave) {\r\n\t\t\t\t\t\tthrow new Chat.ErrorMessage(`Impossible situation: two Tera Types (${criteria.teraType.mustHave.name} and ${type.name}) are required.`);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcriteria.teraType.mustHave = type;\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\tthrow new Chat.ErrorMessage(`Invalid criterion: ${key}`);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst results = setProbability(species, format, criteria);\r\n\t\tconst percentage = Math.round((results.matches / results.rounds) * 100);\r\n\t\treturn this.sendReplyBox(\r\n\t\t\tUtils.html`Generated ${results.rounds} sets for ${species.name} in ${format.name}:
` +\r\n\t\t\t`Approximately ${percentage}% (${results.matches} sets) ${getHTMLCriteriaDescription(criteria)}.`\r\n\t\t);\r\n\t},\r\n\trandombattlesetprobabilitieshelp() {\r\n\t\treturn this.sendReplyBox(\r\n\t\t\t`/randombattlesetprobabilities [optional format], [species], [conditions]: Gives the probability of a set matching the conditions appearing for the given species.
` +\r\n\t\t\t`[conditions] is a comma-separated list of conditions of the form [component]=[matching value], where [component] can be any of the following: ` +\r\n\t\t\t`` +\r\n\t\t\t`The given probability is for a set that matches EVERY provided condition. ` +\r\n\t\t\t`Conditions can be negated by prefixing the [matching value] with !.
` +\r\n\t\t\t`Requires: % @ # & (globally or in the Random Battles room)`\r\n\t\t);\r\n\t},\r\n\r\n\tgenteam: 'generateteam',\r\n\tgenerateteam(target, room, user) {\r\n\t\tif (!Rooms.get('randombattles')?.auth.has(user.id)) this.checkCan('lock');\r\n\t\tthis.runBroadcast(true);\r\n\r\n\t\tif (!target) return this.parse('/help generateteam');\r\n\t\tconst format = Dex.formats.get(target);\r\n\t\tif (!format.exists) throw new Chat.ErrorMessage(`\"${target}\" is not a recognized format.`);\r\n\t\tif (!format.team) throw new Chat.ErrorMessage(`\"${format.name}\" requires you to bring your own team.`);\r\n\r\n\t\tconst team = Teams.getGenerator(format).getTeam();\r\n\t\tconst dex = Dex.forFormat(format);\r\n\t\tconst teamHTML = team\r\n\t\t\t.map((set: PokemonSet) => {\r\n\t\t\t\t// moves are sometimes given as IDs\r\n\t\t\t\tset.moves = set.moves.map(m => dex.moves.get(m).name);\r\n\t\t\t\tset.item = dex.items.get(set.item).name;\r\n\t\t\t\treturn `
${set.name}${Utils.escapeHTML(Teams.exportSet(set))}
`;\r\n\t\t\t})\r\n\t\t\t.join('');\r\n\t\treturn this.sendReplyBox(`Team for ${format.name}:` + teamHTML);\r\n\t},\r\n\tgenerateteamhelp: [`/genteam [format] - Generates a team for the given format. Requires: % @ & or Random Battles room auth`],\r\n};\r\n"], "mappings": "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", "names": ["buf"] }