Spaces:
Running
Running
{ | |
"version": 3, | |
"sources": ["../../../server/chat-plugins/othermetas.ts"], | |
"sourcesContent": ["/**\n * Other Metagames chat plugin\n * Lets users see elements of Pokemon in various Other Metagames.\n * Originally by Spandan.\n * @author dhelmise\n*/\n\nimport { Utils } from '../../lib';\n\ninterface StoneDeltas {\n\tbaseStats: { [stat in StatID]: number };\n\tbst: number;\n\tweighthg: number;\n\theightm: number;\n\ttype?: string;\n}\n\ntype TierShiftTiers = 'UU' | 'RUBL' | 'RU' | 'NUBL' | 'NU' | 'PUBL' | 'PU' | 'ZUBL' | 'ZU' | 'NFE' | 'LC';\n\nfunction getMegaStone(stone: string, mod = 'gen9'): Item | null {\n\tlet dex = Dex;\n\tif (mod && toID(mod) in Dex.dexes) dex = Dex.mod(toID(mod));\n\tconst item = dex.items.get(stone);\n\tif (!item.exists) {\n\t\tif (toID(stone) === 'dragonascent') {\n\t\t\tconst move = dex.moves.get(stone);\n\t\t\treturn {\n\t\t\t\tid: move.id,\n\t\t\t\tname: move.name,\n\t\t\t\tfullname: move.name,\n\t\t\t\tmegaEvolves: 'Rayquaza',\n\t\t\t\tmegaStone: 'Rayquaza-Mega',\n\t\t\t\texists: true,\n\t\t\t\t// Adding extra values to appease typescript\n\t\t\t\tgen: 6,\n\t\t\t\tnum: -1,\n\t\t\t\teffectType: 'Item',\n\t\t\t\tsourceEffect: '',\n\t\t\t} as Item;\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\tif (!(item.forcedForme && !item.zMove) && !item.megaStone &&\n\t\t!item.isPrimalOrb && !item.name.startsWith(\"Rusted\")) return null;\n\treturn item;\n}\n\nexport const commands: Chat.ChatCommands = {\n\tom: 'othermetas',\n\tothermetas(target, room, user) {\n\t\ttarget = toID(target);\n\t\tconst omLink = `- <a href=\"https://www.smogon.com/forums/forums/733/\">Other Metagames Forum</a><br />`;\n\n\t\tif (!target) {\n\t\t\tthis.runBroadcast();\n\t\t\treturn this.sendReplyBox(omLink);\n\t\t}\n\n\t\tif (target === 'all') {\n\t\t\tthis.runBroadcast();\n\t\t\tif (this.broadcasting) {\n\t\t\t\tthrow new Chat.ErrorMessage(`\"!om all\" is too spammy to broadcast.`);\n\t\t\t}\n\t\t\t// Display OMotM formats, with forum thread links as caption\n\t\t\tthis.parse(`/formathelp omofthemonth`);\n\n\t\t\t// Display the rest of OM formats, with OM hub/index forum links as caption\n\t\t\tthis.parse(`/formathelp othermetagames`);\n\t\t\treturn this.sendReply(`|raw|<center>${omLink}</center>`);\n\t\t}\n\n\t\tif (target === 'month') this.target = 'omofthemonth';\n\t\treturn this.run('formathelp');\n\t},\n\tothermetashelp: [\n\t\t`/om - Provides links to information on the Other Metagames.`,\n\t\t`!om - Show everyone that information. Requires: + % @ # ~`,\n\t],\n\n\tmnm: 'mixandmega',\n\tmixandmega(target, room, user) {\n\t\tif (!toID(target) || !target.includes('@')) return this.parse('/help mixandmega');\n\t\tthis.runBroadcast();\n\t\tlet dex = Dex;\n\t\tconst sep = target.split('@');\n\t\tconst stoneName = sep.slice(1).join('@').trim().split(',');\n\t\tconst mod = stoneName[1];\n\t\tif (mod) {\n\t\t\tif (toID(mod) in Dex.dexes) {\n\t\t\t\tdex = Dex.mod(toID(mod));\n\t\t\t} else {\n\t\t\t\tthrow new Chat.ErrorMessage(`A mod by the name of '${mod.trim()}' does not exist.`);\n\t\t\t}\n\t\t\tif (dex === Dex.dexes['gen9ssb']) {\n\t\t\t\tthrow new Chat.ErrorMessage(`The SSB mod supports custom elements for Mega Stones that have the capability of crashing the server.`);\n\t\t\t}\n\t\t}\n\t\tconst stone = getMegaStone(stoneName[0], mod);\n\t\tconst species = dex.species.get(sep[0]);\n\t\tif (!stone) {\n\t\t\tthrow new Chat.ErrorMessage(`Error: Mega Stone/Primal Orb/Rusted Item/Origin Item/Mask not found.`);\n\t\t}\n\t\tif (!species.exists) throw new Chat.ErrorMessage(`Error: Pok\\u00e9mon not found.`);\n\t\tlet baseSpecies: Species;\n\t\tlet megaSpecies: Species;\n\t\tswitch (stone.id) {\n\t\tcase 'blueorb':\n\t\t\tmegaSpecies = dex.species.get(\"Kyogre-Primal\");\n\t\t\tbaseSpecies = dex.species.get(\"Kyogre\");\n\t\t\tbreak;\n\t\tcase 'redorb':\n\t\t\tmegaSpecies = dex.species.get(\"Groudon-Primal\");\n\t\t\tbaseSpecies = dex.species.get(\"Groudon\");\n\t\t\tbreak;\n\t\tcase 'rustedshield':\n\t\t\tmegaSpecies = dex.species.get(\"Zamazenta-Crowned\");\n\t\t\tbaseSpecies = dex.species.get(\"Zamazenta\");\n\t\t\tbreak;\n\t\tcase 'rustedsword':\n\t\t\tmegaSpecies = dex.species.get(\"Zacian-Crowned\");\n\t\t\tbaseSpecies = dex.species.get(\"Zacian\");\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tconst forcedForme = stone.forcedForme;\n\t\t\tif (forcedForme) {\n\t\t\t\tmegaSpecies = dex.species.get(forcedForme);\n\t\t\t\tbaseSpecies = dex.species.get(forcedForme.split('-')[0]);\n\t\t\t} else {\n\t\t\t\tmegaSpecies = dex.species.get(stone.megaStone);\n\t\t\t\tbaseSpecies = dex.species.get(stone.megaEvolves);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tconst deltas: StoneDeltas = {\n\t\t\tbaseStats: Object.create(null),\n\t\t\tweighthg: megaSpecies.weighthg - baseSpecies.weighthg,\n\t\t\theightm: ((megaSpecies.heightm * 10) - (baseSpecies.heightm * 10)) / 10,\n\t\t\tbst: megaSpecies.bst - baseSpecies.bst,\n\t\t};\n\t\tlet statId: StatID;\n\t\tfor (statId in megaSpecies.baseStats) {\n\t\t\tdeltas.baseStats[statId] = megaSpecies.baseStats[statId] - baseSpecies.baseStats[statId];\n\t\t}\n\t\tif (['Arceus', 'Silvally'].includes(baseSpecies.name)) {\n\t\t\tdeltas.type = megaSpecies.types[0];\n\t\t} else if (megaSpecies.types.length > baseSpecies.types.length) {\n\t\t\tdeltas.type = megaSpecies.types[1];\n\t\t} else if (megaSpecies.types.length < baseSpecies.types.length) {\n\t\t\tdeltas.type = dex.gen === 8 ? 'mono' : baseSpecies.types[0];\n\t\t} else if (megaSpecies.types[1] !== baseSpecies.types[1]) {\n\t\t\tdeltas.type = megaSpecies.types[1];\n\t\t}\n\t\tconst mixedSpecies = Utils.deepClone(species);\n\t\tmixedSpecies.abilities = Utils.deepClone(megaSpecies.abilities);\n\t\tif (['Arceus', 'Silvally'].includes(baseSpecies.name)) {\n\t\t\tconst secondType = mixedSpecies.types[1];\n\t\t\tmixedSpecies.types = [deltas.type];\n\t\t\tif (secondType && secondType !== deltas.type) mixedSpecies.types.push(secondType);\n\t\t} else if (mixedSpecies.types[0] === deltas.type) { // Add any type gains\n\t\t\tmixedSpecies.types = [deltas.type];\n\t\t} else if (deltas.type === 'mono') {\n\t\t\tmixedSpecies.types = [mixedSpecies.types[0]];\n\t\t} else if (deltas.type) {\n\t\t\tmixedSpecies.types = [mixedSpecies.types[0], deltas.type];\n\t\t}\n\t\tlet statName: StatID;\n\t\tmixedSpecies.bst = 0;\n\t\tfor (statName in species.baseStats) { // Add the changed stats and weight\n\t\t\tmixedSpecies.baseStats[statName] = Utils.clampIntRange(\n\t\t\t\tmixedSpecies.baseStats[statName] + deltas.baseStats[statName], 1, 255\n\t\t\t);\n\t\t\tmixedSpecies.bst += mixedSpecies.baseStats[statName];\n\t\t}\n\t\tmixedSpecies.weighthg = Math.max(1, species.weighthg + deltas.weighthg);\n\t\tmixedSpecies.heightm = Math.max(0.1, ((species.heightm * 10) + (deltas.heightm * 10)) / 10);\n\t\tmixedSpecies.tier = \"MnM\";\n\t\tlet weighthit = 20;\n\t\tif (mixedSpecies.weighthg >= 2000) {\n\t\t\tweighthit = 120;\n\t\t} else if (mixedSpecies.weighthg >= 1000) {\n\t\t\tweighthit = 100;\n\t\t} else if (mixedSpecies.weighthg >= 500) {\n\t\t\tweighthit = 80;\n\t\t} else if (mixedSpecies.weighthg >= 250) {\n\t\t\tweighthit = 60;\n\t\t} else if (mixedSpecies.weighthg >= 100) {\n\t\t\tweighthit = 40;\n\t\t}\n\t\tconst details: { [k: string]: string } = {\n\t\t\t\"Dex#\": `${mixedSpecies.num}`,\n\t\t\tGen: `${mixedSpecies.gen}`,\n\t\t\tHeight: `${mixedSpecies.heightm} m`,\n\t\t\tWeight: `${mixedSpecies.weighthg / 10} kg <em>(${weighthit} BP)</em>`,\n\t\t\t\"Dex Colour\": mixedSpecies.color,\n\t\t};\n\t\tif (mixedSpecies.eggGroups) details[\"Egg Group(s)\"] = mixedSpecies.eggGroups.join(\", \");\n\t\tdetails['<font color=\"#686868\">Does Not Evolve</font>'] = \"\";\n\t\tthis.sendReply(`|raw|${Chat.getDataPokemonHTML(mixedSpecies)}`);\n\t\tthis.sendReply(`|raw|<font size=\"1\">` + Object.entries(details).map(([detail, value]) => (\n\t\t\tvalue === '' ? detail : `<font color=\"#686868\">${detail}:</font> ${value}`\n\t\t)).join(\" |  \") + `</font>`);\n\t},\n\tmixandmegahelp: [\n\t\t`/mnm <pokemon> @ <mega stone or other>[, generation] - Shows the Mix and Mega evolved Pok\\u00e9mon's type and stats.`,\n\t],\n\n\torb: 'stone',\n\tmegastone: 'stone',\n\tstone(target) {\n\t\tconst sep = target.split(',');\n\t\tlet dex = Dex;\n\t\tif (sep[1]) {\n\t\t\tif (toID(sep[1]) in Dex.dexes) {\n\t\t\t\tdex = Dex.mod(toID(sep[1]));\n\t\t\t} else {\n\t\t\t\tthrow new Chat.ErrorMessage(`A mod by the name of '${sep[1].trim()}' does not exist.`);\n\t\t\t}\n\t\t\tif (dex === Dex.dexes['gen9ssb']) {\n\t\t\t\tthrow new Chat.ErrorMessage(`The SSB mod supports custom elements for Mega Stones that have the capability of crashing the server.`);\n\t\t\t}\n\t\t}\n\t\tconst targetid = toID(sep[0]);\n\t\tif (!targetid) return this.parse('/help stone');\n\t\tthis.runBroadcast();\n\t\tconst stone = getMegaStone(targetid, sep[1]);\n\t\tconst stones = [];\n\t\tif (!stone) {\n\t\t\tconst formeIdRegex = new RegExp(\n\t\t\t\t`(?:mega[xy]?|primal|origin|crowned|epilogue|cornerstone|wellspring|hearthflame|douse|shock|chill|burn|${dex.types.all().map(x => x.id).filter(x => x !== 'normal').join('|')})$`\n\t\t\t);\n\t\t\tconst species = dex.species.get(targetid.replace(formeIdRegex, ''));\n\t\t\tif (!species.exists) throw new Chat.ErrorMessage(`Error: Mega Stone not found.`);\n\t\t\tif (!species.otherFormes) throw new Chat.ErrorMessage(`Error: Mega Evolution not found.`);\n\t\t\tfor (const poke of species.otherFormes) {\n\t\t\t\tconst formeRegex = new RegExp(\n\t\t\t\t\t`(?:-Douse|-Shock|-Chill|-Burn|-Cornerstone|-Wellspring|-Hearthflame|-Crowned|-Epilogue|-Origin|-Primal|-Mega(?:-[XY])?|${dex.types.names().filter(x => x !== 'Normal').map(x => '-' + x).join('|')})$`\n\t\t\t\t);\n\t\t\t\tif (!formeRegex.test(poke)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst megaPoke = dex.species.get(poke);\n\t\t\t\tconst flag = megaPoke.requiredMove === 'Dragon Ascent' ? megaPoke.requiredMove : megaPoke.requiredItem;\n\t\t\t\tif (/mega[xy]$/.test(targetid) && toID(megaPoke.name) !== toID(dex.species.get(targetid))) continue;\n\t\t\t\tif (!flag) continue;\n\t\t\t\tstones.push(getMegaStone(flag, sep[1]));\n\t\t\t}\n\t\t\tif (!stones.length) throw new Chat.ErrorMessage(`Error: Mega Evolution not found.`);\n\t\t}\n\t\tconst toDisplay = (stones.length ? stones : [stone]);\n\t\tfor (const aStone of toDisplay) {\n\t\t\tif (!aStone) return;\n\t\t\tlet baseSpecies: Species;\n\t\t\tlet megaSpecies: Species;\n\t\t\tswitch (aStone.id) {\n\t\t\tcase 'blueorb':\n\t\t\t\tmegaSpecies = dex.species.get(\"Kyogre-Primal\");\n\t\t\t\tbaseSpecies = dex.species.get(\"Kyogre\");\n\t\t\t\tbreak;\n\t\t\tcase 'redorb':\n\t\t\t\tmegaSpecies = dex.species.get(\"Groudon-Primal\");\n\t\t\t\tbaseSpecies = dex.species.get(\"Groudon\");\n\t\t\t\tbreak;\n\t\t\tcase 'rustedshield':\n\t\t\t\tmegaSpecies = dex.species.get(\"Zamazenta-Crowned\");\n\t\t\t\tbaseSpecies = dex.species.get(\"Zamazenta\");\n\t\t\t\tbreak;\n\t\t\tcase 'rustedsword':\n\t\t\t\tmegaSpecies = dex.species.get(\"Zacian-Crowned\");\n\t\t\t\tbaseSpecies = dex.species.get(\"Zacian\");\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tconst forcedForme = aStone.forcedForme;\n\t\t\t\tif (forcedForme) {\n\t\t\t\t\tmegaSpecies = dex.species.get(forcedForme);\n\t\t\t\t\tbaseSpecies = dex.species.get(forcedForme.split('-')[0]);\n\t\t\t\t} else {\n\t\t\t\t\tmegaSpecies = dex.species.get(aStone.megaStone);\n\t\t\t\t\tbaseSpecies = dex.species.get(aStone.megaEvolves);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tconst deltas: StoneDeltas = {\n\t\t\t\tbaseStats: Object.create(null),\n\t\t\t\tweighthg: megaSpecies.weighthg - baseSpecies.weighthg,\n\t\t\t\theightm: ((megaSpecies.heightm * 10) - (baseSpecies.heightm * 10)) / 10,\n\t\t\t\tbst: megaSpecies.bst - baseSpecies.bst,\n\t\t\t};\n\t\t\tlet statId: StatID;\n\t\t\tfor (statId in megaSpecies.baseStats) {\n\t\t\t\tdeltas.baseStats[statId] = megaSpecies.baseStats[statId] - baseSpecies.baseStats[statId];\n\t\t\t}\n\t\t\tif (['Arceus', 'Silvally'].includes(baseSpecies.name)) {\n\t\t\t\tdeltas.type = megaSpecies.types[0];\n\t\t\t} else if (megaSpecies.types.length > baseSpecies.types.length) {\n\t\t\t\tdeltas.type = megaSpecies.types[1];\n\t\t\t} else if (megaSpecies.types.length < baseSpecies.types.length) {\n\t\t\t\tdeltas.type = dex.gen === 8 ? 'mono' : megaSpecies.types[0];\n\t\t\t} else if (megaSpecies.types[1] !== baseSpecies.types[1]) {\n\t\t\t\tdeltas.type = megaSpecies.types[1];\n\t\t\t}\n\t\t\tconst details = {\n\t\t\t\tGen: aStone.gen,\n\t\t\t\tHeight: `${deltas.heightm < 0 ? \"\" : \"+\"}${deltas.heightm} m`,\n\t\t\t\tWeight: `${deltas.weighthg < 0 ? \"\" : \"+\"}${deltas.weighthg / 10} kg`,\n\t\t\t};\n\t\t\tlet tier;\n\t\t\tif (['redorb', 'blueorb'].includes(aStone.id)) {\n\t\t\t\ttier = \"Orb\";\n\t\t\t} else if (aStone.name === \"Dragon Ascent\") {\n\t\t\t\ttier = \"Move\";\n\t\t\t} else if (aStone.name.endsWith('Mask')) {\n\t\t\t\ttier = \"Mask\";\n\t\t\t} else if (aStone.megaStone) {\n\t\t\t\ttier = \"Stone\";\n\t\t\t} else {\n\t\t\t\ttier = \"Item\";\n\t\t\t}\n\t\t\tlet buf = `<li class=\"result\">`;\n\t\t\tbuf += `<span class=\"col numcol\">${tier}</span> `;\n\t\t\tif (aStone.name === \"Dragon Ascent\") {\n\t\t\t\tbuf += `<span class=\"col itemiconcol\"></span>`;\n\t\t\t} else {\n\t\t\t\t// temp image support until real images are uploaded\n\t\t\t\tconst itemName = aStone.name;\n\t\t\t\tbuf += `<span class=\"col itemiconcol\"><psicon item=\"${toID(itemName)}\"/></span> `;\n\t\t\t}\n\t\t\tif (aStone.name === \"Dragon Ascent\") {\n\t\t\t\tbuf += `<span class=\"col movenamecol\" style=\"white-space:nowrap\"><a href=\"https://${Config.routes.dex}/moves/${targetid}\" target=\"_blank\">Dragon Ascent</a></span> `;\n\t\t\t} else {\n\t\t\t\tbuf += `<span class=\"col pokemonnamecol\" style=\"white-space:nowrap\"><a href=\"https://${Config.routes.dex}/items/${aStone.id}\" target=\"_blank\">${aStone.name}</a></span> `;\n\t\t\t}\n\t\t\tif (deltas.type && deltas.type !== 'mono') {\n\t\t\t\tbuf += `<span class=\"col typecol\"><img src=\"https://${Config.routes.client}/sprites/types/${deltas.type}.png\" alt=\"${deltas.type}\" height=\"14\" width=\"32\"></span> `;\n\t\t\t} else {\n\t\t\t\tbuf += `<span class=\"col typecol\"></span>`;\n\t\t\t}\n\t\t\tbuf += `<span style=\"float:left;min-height:26px\">`;\n\t\t\tbuf += `<span class=\"col abilitycol\">${megaSpecies.abilities['0']}</span>`;\n\t\t\tbuf += `<span class=\"col abilitycol\">${megaSpecies.abilities['H'] ? `<em>${megaSpecies.abilities['H']}</em>` : ''}</span>`;\n\t\t\tbuf += `</span>`;\n\t\t\tbuf += `<span style=\"float:left;min-height:26px\">`;\n\t\t\tbuf += `<span class=\"col statcol\"><em>HP</em><br />0</span> `;\n\t\t\tbuf += `<span class=\"col statcol\"><em>Atk</em><br />${deltas.baseStats.atk}</span> `;\n\t\t\tbuf += `<span class=\"col statcol\"><em>Def</em><br />${deltas.baseStats.def}</span> `;\n\t\t\tbuf += `<span class=\"col statcol\"><em>SpA</em><br />${deltas.baseStats.spa}</span> `;\n\t\t\tbuf += `<span class=\"col statcol\"><em>SpD</em><br />${deltas.baseStats.spd}</span> `;\n\t\t\tbuf += `<span class=\"col statcol\"><em>Spe</em><br />${deltas.baseStats.spe}</span> `;\n\t\t\tbuf += `<span class=\"col bstcol\"><em>BST<br />${deltas.bst}</em></span> `;\n\t\t\tbuf += `</span>`;\n\t\t\tbuf += `</li>`;\n\t\t\tthis.sendReply(`|raw|<div class=\"message\"><ul class=\"utilichart\">${buf}<li style=\"clear:both\"></li></ul></div>`);\n\t\t\tthis.sendReply(`|raw|<font size=\"1\">${Object.entries(details).map(([detail, value]) => `<font color=\"#686868\">${detail}:</font> ${value}`).join(\" |  \")}</font>`);\n\t\t}\n\t},\n\tstonehelp: [`/stone <mega stone or other>[, generation] - Shows the changes that a mega stone/orb applies to a Pok\\u00e9mon.`],\n\n\t350: '350cup',\n\t'350cup'(target, room, user) {\n\t\tconst args = target.split(',');\n\t\tif (!toID(args[0])) return this.parse('/help 350cup');\n\t\tthis.runBroadcast();\n\t\tlet dex = Dex;\n\t\tif (args[1] && toID(args[1]) in Dex.dexes) {\n\t\t\tdex = Dex.dexes[toID(args[1])];\n\t\t} else if (room?.battle) {\n\t\t\tconst format = Dex.formats.get(room.battle.format);\n\t\t\tdex = Dex.mod(format.mod);\n\t\t}\n\t\tconst species = Utils.deepClone(dex.species.get(args[0]));\n\t\tif (!species.exists || species.gen > dex.gen) {\n\t\t\tconst monName = species.gen > dex.gen ? species.name : args[0].trim();\n\t\t\tconst additionalReason = species.gen > dex.gen ? ` in Generation ${dex.gen}` : ``;\n\t\t\tthrow new Chat.ErrorMessage(`Error: Pok\\u00e9mon '${monName}' not found${additionalReason}.`);\n\t\t}\n\t\tconst bst = species.bst;\n\t\tspecies.bst = 0;\n\t\tfor (const i in species.baseStats) {\n\t\t\tif (dex.gen === 1 && i === 'spd') continue;\n\t\t\tspecies.baseStats[i] *= (bst <= 350 ? 2 : 1);\n\t\t\tspecies.bst += species.baseStats[i];\n\t\t}\n\t\tthis.sendReply(`|html|${Chat.getDataPokemonHTML(species, dex.gen)}`);\n\t},\n\t'350cuphelp': [\n\t\t`/350 OR /350cup <pokemon>[, gen] - Shows the base stats that a Pok\\u00e9mon would have in 350 Cup.`,\n\t],\n\n\tts: 'tiershift',\n\tts1: 'tiershift',\n\tts2: 'tiershift',\n\tts3: 'tiershift',\n\tts4: 'tiershift',\n\tts5: 'tiershift',\n\tts6: 'tiershift',\n\tts7: 'tiershift',\n\tts8: 'tiershift',\n\ttiershift(target, room, user, connection, cmd) {\n\t\tconst args = target.split(',');\n\t\tif (!toID(args[0])) return this.parse('/help tiershift');\n\t\tthis.runBroadcast();\n\t\tconst targetGen = parseInt(cmd[cmd.length - 1]);\n\t\tif (targetGen && !args[1]) args[1] = `gen${targetGen}`;\n\t\tlet dex = Dex;\n\t\tif (args[1] && toID(args[1]) in Dex.dexes) {\n\t\t\tdex = Dex.dexes[toID(args[1])];\n\t\t} else if (room?.battle) {\n\t\t\tconst format = Dex.formats.get(room.battle.format);\n\t\t\tdex = Dex.mod(format.mod);\n\t\t}\n\t\tconst species = Utils.deepClone(dex.species.get(args[0]));\n\t\tif (!species.exists || species.gen > dex.gen) {\n\t\t\tconst monName = species.gen > dex.gen ? species.name : args[0].trim();\n\t\t\tconst additionalReason = species.gen > dex.gen ? ` in Generation ${dex.gen}` : ``;\n\t\t\tthrow new Chat.ErrorMessage(`Error: Pok\\u00e9mon '${monName}' not found${additionalReason}.`);\n\t\t}\n\t\tconst boosts: { [tier in TierShiftTiers]: number } = {\n\t\t\tUU: 15,\n\t\t\tRUBL: 15,\n\t\t\tRU: 20,\n\t\t\tNUBL: 20,\n\t\t\tNU: 25,\n\t\t\tPUBL: 25,\n\t\t\tPU: 30,\n\t\t\tZUBL: 30,\n\t\t\tZU: 30,\n\t\t\tNFE: 30,\n\t\t\tLC: 30,\n\t\t};\n\t\tif (dex.gen < 9) {\n\t\t\tboosts['UU'] = boosts['RUBL'] = 10;\n\t\t\tboosts['RU'] = boosts['NUBL'] = 20;\n\t\t\tboosts['NU'] = boosts['PUBL'] = 30;\n\t\t\tboosts['PU'] = boosts['NFE'] = boosts['LC'] = 40;\n\t\t}\n\t\tlet tier = species.tier;\n\t\tif (tier[0] === '(') tier = tier.slice(1, -1);\n\t\tif (!(tier in boosts)) return this.sendReply(`|html|${Chat.getDataPokemonHTML(species, dex.gen)}`);\n\t\tconst boost = boosts[tier as TierShiftTiers];\n\t\tspecies.bst = species.baseStats.hp;\n\t\tfor (const statName in species.baseStats) {\n\t\t\tif (statName === 'hp') continue;\n\t\t\tif (dex.gen === 1 && statName === 'spd') continue;\n\t\t\tspecies.baseStats[statName] = Utils.clampIntRange(species.baseStats[statName] + boost, 1, 255);\n\t\t\tspecies.bst += species.baseStats[statName];\n\t\t}\n\t\tthis.sendReply(`|raw|${Chat.getDataPokemonHTML(species, dex.gen)}`);\n\t},\n\ttiershifthelp: [\n\t\t`/ts OR /tiershift <pokemon>[, generation] - Shows the base stats that a Pok\\u00e9mon would have in Tier Shift.`,\n\t\t`Alternatively, you can use /ts[gen number] to see a Pok\\u00e9mon's stats in that generation.`,\n\t],\n\n\tfuse: 'franticfusions',\n\tfuse1: 'franticfusions',\n\tfuse2: 'franticfusions',\n\tfuse3: 'franticfusions',\n\tfuse4: 'franticfusions',\n\tfuse5: 'franticfusions',\n\tfuse6: 'franticfusions',\n\tfuse7: 'franticfusions',\n\tfuse8: 'franticfusions',\n\tfranticfusions(target, room, user, connection, cmd) {\n\t\tconst args = target.split(',');\n\t\tif (!toID(args[0]) && !toID(args[1])) return this.parse('/help franticfusions');\n\t\tconst targetGen = parseInt(cmd[cmd.length - 1]);\n\t\tif (targetGen && !args[2]) target = `${target},gen${targetGen}`;\n\t\tconst { dex, targets } = this.splitFormat(target, true);\n\t\tthis.runBroadcast();\n\t\tif (targets.length > 2) return this.parse('/help franticfusions');\n\t\tconst species = Utils.deepClone(dex.species.get(targets[0]));\n\t\tconst fusion = dex.species.get(targets[1]);\n\t\tif (!species.exists || species.gen > dex.gen) {\n\t\t\tconst monName = species.gen > dex.gen ? species.name : args[0].trim();\n\t\t\tconst additionalReason = species.gen > dex.gen ? ` in Generation ${dex.gen}` : ``;\n\t\t\tthrow new Chat.ErrorMessage(`Error: Pok\\u00e9mon '${monName}' not found${additionalReason}.`);\n\t\t}\n\t\tif (fusion.name.length) {\n\t\t\tif (!fusion.exists || fusion.gen > dex.gen) {\n\t\t\t\tconst monName = fusion.gen > dex.gen ? fusion.name : args[1].trim();\n\t\t\t\tconst additionalReason = fusion.gen > dex.gen ? ` in Generation ${dex.gen}` : ``;\n\t\t\t\tthrow new Chat.ErrorMessage(`Error: Pok\\u00e9mon '${monName}' not found${additionalReason}.`);\n\t\t\t}\n\t\t\tif (fusion.name === species.name) {\n\t\t\t\tthrow new Chat.ErrorMessage('Pok\\u00e9mon can\\'t fuse with themselves.');\n\t\t\t}\n\t\t}\n\t\tif (fusion.name.length) {\n\t\t\tspecies.bst = species.baseStats.hp;\n\t\t} else {\n\t\t\tspecies.bst = 0;\n\t\t}\n\t\tfor (const statName in species.baseStats) {\n\t\t\tif (statName === 'hp') continue;\n\t\t\tif (!fusion.name.length) {\n\t\t\t\tspecies.baseStats[statName] = Math.floor(species.baseStats[statName as StatID] / 4);\n\t\t\t\tspecies.bst += species.baseStats[statName];\n\t\t\t} else {\n\t\t\t\tconst addition = Math.floor(fusion.baseStats[statName as StatID] / 4);\n\t\t\t\tspecies.baseStats[statName] = Utils.clampIntRange(species.baseStats[statName] + addition, 1, 255);\n\t\t\t\tspecies.bst += species.baseStats[statName];\n\t\t\t}\n\t\t}\n\t\tconst abilities = new Set<string>([...Object.values(species.abilities), ...Object.values(fusion.abilities)]);\n\t\tlet buf = '<div class=\"message\"><ul class=\"utilichart\"><li class=\"result\">';\n\t\tbuf += '<span class=\"col numcol\">Fusion</span> ';\n\t\tbuf += `<span class=\"col iconcol\"><psicon pokemon=\"${species.id}\"/></span> `;\n\t\tbuf += `<span class=\"col pokemonnamecol\" style=\"white-space:nowrap\"><a href=\"https://${Config.routes.dex}/pokemon/${species.id}\" target=\"_blank\">${species.name}</a></span> `;\n\t\tbuf += '<span class=\"col typecol\">';\n\t\tif (species.types && fusion.name.length) {\n\t\t\tfor (const type of species.types) {\n\t\t\t\tbuf += `<img src=\"https://${Config.routes.client}/sprites/types/${type}.png\" alt=\"${type}\" height=\"14\" width=\"32\">`;\n\t\t\t}\n\t\t}\n\t\tbuf += '</span> ';\n\t\tif (dex.gen >= 3) {\n\t\t\tbuf += '<span style=\"float:left;min-height:26px\">';\n\t\t\tconst ability1 = [...abilities.values()][0];\n\t\t\tabilities.delete(ability1);\n\t\t\tlet ability2;\n\t\t\tif (abilities.size) {\n\t\t\t\tability2 = [...abilities.values()][0];\n\t\t\t\tabilities.delete(ability2);\n\t\t\t}\n\t\t\tlet ability3;\n\t\t\tif (abilities.size) {\n\t\t\t\tability3 = [...abilities.values()][0];\n\t\t\t\tabilities.delete(ability3);\n\t\t\t}\n\t\t\tlet ability4;\n\t\t\tif (abilities.size) {\n\t\t\t\tability4 = [...abilities.values()][0];\n\t\t\t\tabilities.delete(ability4);\n\t\t\t}\n\t\t\tlet ability5;\n\t\t\tif (abilities.size) {\n\t\t\t\tability5 = [...abilities.values()][0];\n\t\t\t\tabilities.delete(ability5);\n\t\t\t}\n\t\t\tlet ability6;\n\t\t\tif (abilities.size) {\n\t\t\t\tability6 = [...abilities.values()][0];\n\t\t\t\tabilities.delete(ability6);\n\t\t\t}\n\t\t\tlet ability7;\n\t\t\tif (abilities.size) {\n\t\t\t\tability7 = [...abilities.values()][0];\n\t\t\t\tabilities.delete(ability7);\n\t\t\t}\n\t\t\tif (ability1) {\n\t\t\t\tif (ability2) {\n\t\t\t\t\tbuf += '<span class=\"col twoabilitycol\">' + ability1 + '<br />' + ability2 + '</span>';\n\t\t\t\t} else {\n\t\t\t\t\tbuf += '<span class=\"col abilitycol\">' + ability1 + '</span>';\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (ability3) {\n\t\t\t\tif (ability4) {\n\t\t\t\t\tbuf += '<span class=\"col twoabilitycol\">' + ability3 + '<br />' + ability4 + '</span>';\n\t\t\t\t} else {\n\t\t\t\t\tbuf += '<span class=\"col abilitycol\">' + ability3 + '</span>';\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (ability5) {\n\t\t\t\tif (ability6) {\n\t\t\t\t\tbuf += '<span class=\"col twoabilitycol\">' + ability5 + '<br />' + ability6 + '</span>';\n\t\t\t\t} else {\n\t\t\t\t\tbuf += '<span class=\"col abilitycol\">' + ability5 + '</span>';\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (ability7) {\n\t\t\t\tbuf += '<span class=\"col abilitycol\">' + ability7 + '</span>';\n\t\t\t}\n\t\t\tbuf += '</span>';\n\t\t}\n\t\tbuf += '<span style=\"float:left;min-height:26px\">';\n\t\tif (fusion.name.length) {\n\t\t\tbuf += '<span class=\"col statcol\"><em>HP</em><br />' + species.baseStats.hp + '</span> ';\n\t\t} else {\n\t\t\tbuf += '<span class=\"col statcol\"><em>HP</em><br />0</span> ';\n\t\t}\n\t\tbuf += '<span class=\"col statcol\"><em>Atk</em><br />' + species.baseStats.atk + '</span> ';\n\t\tbuf += '<span class=\"col statcol\"><em>Def</em><br />' + species.baseStats.def + '</span> ';\n\t\tif (dex.gen <= 1) {\n\t\t\tbuf += '<span class=\"col statcol\"><em>Spc</em><br />' + species.baseStats.spa + '</span> ';\n\t\t} else {\n\t\t\tbuf += '<span class=\"col statcol\"><em>SpA</em><br />' + species.baseStats.spa + '</span> ';\n\t\t\tbuf += '<span class=\"col statcol\"><em>SpD</em><br />' + species.baseStats.spd + '</span> ';\n\t\t}\n\t\tbuf += '<span class=\"col statcol\"><em>Spe</em><br />' + species.baseStats.spe + '</span> ';\n\t\tbuf += '<span class=\"col bstcol\"><em>BST<br />' + species.bst + '</em></span> ';\n\t\tbuf += '</span>';\n\t\tbuf += '</li><li style=\"clear:both\"></li></ul></div>';\n\t\tthis.sendReply(`|raw|${buf}`);\n\t},\n\tfranticfusionshelp: [\n\t\t`/fuse <pokemon>, <fusion>[, generation] - Shows the stats and abilities that <pokemon> would get when fused with <fusion>.`,\n\t\t`/fuse <pokemon>[, generation] - Shows the stats and abilities that <pokemon> donates.`,\n\t\t`Alternatively, you can use /fuse[gen number] to see a Pok\\u00e9mon's stats in that generation.`,\n\t],\n\n\tscale: 'scalemons',\n\tscale1: 'scalemons',\n\tscale2: 'scalemons',\n\tscale3: 'scalemons',\n\tscale4: 'scalemons',\n\tscale5: 'scalemons',\n\tscale6: 'scalemons',\n\tscale7: 'scalemons',\n\tscale8: 'scalemons',\n\tscalemons(target, room, user, connection, cmd) {\n\t\tconst args = target.split(',');\n\t\tif (!args.length || !toID(args[0])) return this.parse(`/help scalemons`);\n\t\tthis.runBroadcast();\n\t\tconst targetGen = parseInt(cmd[cmd.length - 1]);\n\t\tif (targetGen && !args[1]) args[1] = `gen${targetGen}`;\n\t\tlet dex = Dex;\n\t\tif (args[1] && toID(args[1]) in Dex.dexes) {\n\t\t\tdex = Dex.dexes[toID(args[1])];\n\t\t} else if (room?.battle) {\n\t\t\tconst format = Dex.formats.get(room.battle.format);\n\t\t\tdex = Dex.mod(format.mod);\n\t\t}\n\t\tconst species = Utils.deepClone(dex.species.get(args[0]));\n\t\tif (!species.exists || species.gen > dex.gen) {\n\t\t\tconst monName = species.gen > dex.gen ? species.name : args[0].trim();\n\t\t\tconst additionalReason = species.gen > dex.gen ? ` in Generation ${dex.gen}` : ``;\n\t\t\tthrow new Chat.ErrorMessage(`Error: Pok\\u00e9mon '${monName}' not found${additionalReason}.`);\n\t\t}\n\t\tconst bstNoHP = species.bst - species.baseStats.hp;\n\t\tconst scale = (dex.gen !== 1 ? 600 : 500) - species.baseStats['hp'];\n\t\tspecies.bst = 0;\n\t\tfor (const stat in species.baseStats) {\n\t\t\tif (stat === 'hp') continue;\n\t\t\tif (dex.gen === 1 && stat === 'spd') continue;\n\t\t\tspecies.baseStats[stat] = Utils.clampIntRange(species.baseStats[stat] * scale / bstNoHP, 1, 255);\n\t\t\tspecies.bst += species.baseStats[stat];\n\t\t}\n\t\tspecies.bst += species.baseStats.hp;\n\t\tthis.sendReply(`|raw|${Chat.getDataPokemonHTML(species, dex.gen)}`);\n\t},\n\tscalemonshelp: [\n\t\t`/scale OR /scalemons <pokemon>[, gen] - Shows the base stats that a Pok\\u00e9mon would have in Scalemons.`,\n\t\t`Alternatively, you can use /scale[gen number] to see a Pok\\u00e9mon's scaled stats in that generation.`,\n\t],\n\n\tflip: 'flipped',\n\tflip1: 'flipped',\n\tflip2: 'flipped',\n\tflip3: 'flipped',\n\tflip4: 'flipped',\n\tflip5: 'flipped',\n\tflip6: 'flipped',\n\tflip7: 'flipped',\n\tflip8: 'flipped',\n\tflipped(target, room, user, connection, cmd) {\n\t\tconst args = target.split(',');\n\t\tif (!args[0]) return this.parse(`/help flipped`);\n\t\tthis.runBroadcast();\n\t\tconst mon = args[0];\n\t\tlet mod = args[1];\n\t\tconst targetGen = parseInt(cmd[cmd.length - 1]);\n\t\tif (targetGen && !mod) mod = `gen${targetGen}`;\n\t\tlet dex = Dex;\n\t\tif (mod && toID(mod) in Dex.dexes) {\n\t\t\tdex = Dex.dexes[toID(mod)];\n\t\t} else if (room?.battle) {\n\t\t\tdex = Dex.forFormat(room.battle.format);\n\t\t}\n\t\tconst species = Utils.deepClone(dex.species.get(mon));\n\t\tif (!species.exists || species.gen > dex.gen) {\n\t\t\tconst monName = species.gen > dex.gen ? species.name : mon.trim();\n\t\t\tconst additionalReason = species.gen > dex.gen ? ` in Generation ${dex.gen}` : ``;\n\t\t\tthrow new Chat.ErrorMessage(`Error: Pok\\u00e9mon '${monName}' not found${additionalReason}.`);\n\t\t}\n\t\tif (dex.gen === 1) {\n\t\t\tconst flippedStats: { [k: string]: number } = {\n\t\t\t\thp: species.baseStats.spe,\n\t\t\t\tatk: species.baseStats.spa,\n\t\t\t\tdef: species.baseStats.def,\n\t\t\t\tspa: species.baseStats.atk,\n\t\t\t\tspd: species.baseStats.atk,\n\t\t\t\tspe: species.baseStats.hp,\n\t\t\t};\n\t\t\tfor (const stat in species.baseStats) {\n\t\t\t\tspecies.baseStats[stat] = flippedStats[stat];\n\t\t\t}\n\t\t\tthis.sendReply(`|raw|${Chat.getDataPokemonHTML(species, dex.gen)}`);\n\t\t\treturn;\n\t\t}\n\t\tconst stats = Object.values(species.baseStats).reverse();\n\t\tfor (const [i, statName] of Object.keys(species.baseStats).entries()) {\n\t\t\tspecies.baseStats[statName] = stats[i];\n\t\t}\n\t\tthis.sendReply(`|raw|${Chat.getDataPokemonHTML(species, dex.gen)}`);\n\t},\n\tflippedhelp: [\n\t\t`/flip OR /flipped <pokemon>[, gen] - Shows the base stats that a Pok\\u00e9mon would have in Flipped.`,\n\t\t`Alternatively, you can use /flip[gen number] to see a Pok\\u00e9mon's stats in that generation.`,\n\t],\n\n\tns: 'natureswap',\n\tns3: 'natureswap',\n\tns4: 'natureswap',\n\tns5: 'natureswap',\n\tns6: 'natureswap',\n\tns7: 'natureswap',\n\tns8: 'natureswap',\n\tnatureswap(target, room, user, connection, cmd) {\n\t\tconst args = target.split(',');\n\t\tconst nature = args[0];\n\t\tconst pokemon = args[1];\n\t\tconst targetGen = parseInt(cmd[cmd.length - 1]);\n\t\tif (targetGen && !args[2]) args[2] = `gen${targetGen}`;\n\t\tlet dex = Dex;\n\t\tif (args[2] && toID(args[2]) in Dex.dexes) {\n\t\t\tdex = Dex.dexes[toID(args[2])];\n\t\t} else if (room?.battle) {\n\t\t\tconst format = Dex.formats.get(room.battle.format);\n\t\t\tdex = Dex.mod(format.mod);\n\t\t}\n\t\tif (!toID(nature) || !toID(pokemon)) return this.parse(`/help natureswap`);\n\t\tthis.runBroadcast();\n\t\tconst natureObj = dex.natures.get(nature);\n\t\tif (dex.gen < 3) throw new Chat.ErrorMessage(`Error: Natures don't exist prior to Generation 3.`);\n\t\tif (!natureObj.exists) throw new Chat.ErrorMessage(`Error: Nature ${nature} not found.`);\n\t\tconst species = Utils.deepClone(dex.species.get(pokemon));\n\t\tif (!species.exists || species.gen > dex.gen) {\n\t\t\tconst monName = species.gen > dex.gen ? species.name : args[0].trim();\n\t\t\tconst additionalReason = species.gen > dex.gen ? ` in Generation ${dex.gen}` : ``;\n\t\t\tthrow new Chat.ErrorMessage(`Error: Pok\\u00e9mon '${monName}' not found${additionalReason}.`);\n\t\t}\n\t\tif (natureObj.minus && natureObj.plus) {\n\t\t\tconst swap = species.baseStats[natureObj.minus];\n\t\t\tspecies.baseStats[natureObj.minus] = species.baseStats[natureObj.plus];\n\t\t\tspecies.baseStats[natureObj.plus] = swap;\n\t\t\tspecies.tier = 'NS';\n\t\t}\n\t\tthis.sendReply(`|raw|${Chat.getDataPokemonHTML(species, dex.gen)}`);\n\t},\n\tnatureswaphelp: [\n\t\t`/ns OR /natureswap <nature>, <pokemon>[, gen] - Shows the base stats that a Pok\\u00e9mon would have in Nature Swap.`,\n\t\t`Alternatively, you can use /ns[gen number] to see a Pok\\u00e9mon's stats in that generation.`,\n\t],\n\n\tce: 'crossevolve',\n\tcrossevo: 'crossevolve',\n\tcrossevolve(target, user, room) {\n\t\tif (!this.runBroadcast()) return;\n\t\tif (!target?.includes(',')) return this.parse(`/help crossevo`);\n\n\t\tconst pokes = target.split(',');\n\t\tconst species = Dex.species.get(pokes[0]);\n\t\tconst crossSpecies = Dex.species.get(pokes[1]);\n\n\t\tif (!species.exists) throw new Chat.ErrorMessage(`Error: Pok\\u00e9mon '${pokes[0]}' not found.`);\n\t\tif (!crossSpecies.exists) throw new Chat.ErrorMessage(`Error: Pok\\u00e9mon '${pokes[1]}' not found.`);\n\n\t\tif (!species.evos.length) throw new Chat.ErrorMessage(`Error: ${species.name} does not evolve.`);\n\t\tif (!crossSpecies.prevo) throw new Chat.ErrorMessage(`Error: ${crossSpecies.name} does not have a prevolution.`);\n\n\t\tlet setStage = 1;\n\t\tlet crossStage = 1;\n\t\tif (species.prevo) {\n\t\t\tsetStage++;\n\t\t\tif (Dex.species.get(species.prevo).prevo) {\n\t\t\t\tsetStage++;\n\t\t\t}\n\t\t}\n\t\tconst prevo = Dex.species.get(crossSpecies.prevo);\n\t\tif (crossSpecies.prevo) {\n\t\t\tcrossStage++;\n\t\t\tif (prevo.prevo) {\n\t\t\t\tcrossStage++;\n\t\t\t}\n\t\t}\n\t\tif (setStage + 1 !== crossStage) {\n\t\t\tthrow new Chat.ErrorMessage(`Error: Cross evolution must follow evolutionary stages. (${species.name} is Stage ${setStage} and can only cross evolve to Stage ${setStage + 1})`);\n\t\t}\n\t\tconst mixedSpecies = Utils.deepClone(species);\n\t\tmixedSpecies.abilities = Utils.deepClone(crossSpecies.abilities);\n\t\tmixedSpecies.baseStats = Utils.deepClone(mixedSpecies.baseStats);\n\t\tmixedSpecies.bst = 0;\n\t\tlet statName: StatID;\n\t\tfor (statName in species.baseStats) {\n\t\t\tconst statChange = crossSpecies.baseStats[statName] - prevo.baseStats[statName];\n\t\t\tmixedSpecies.baseStats[statName] = Utils.clampIntRange(mixedSpecies.baseStats[statName] + statChange, 1, 255);\n\t\t\tmixedSpecies.bst += mixedSpecies.baseStats[statName];\n\t\t}\n\t\tmixedSpecies.types = [species.types[0]];\n\t\tif (species.types[1]) mixedSpecies.types.push(species.types[1]);\n\t\tif (crossSpecies.types[0] !== prevo.types[0]) mixedSpecies.types[0] = crossSpecies.types[0];\n\t\tif (crossSpecies.types[1] !== prevo.types[1]) {\n\t\t\tmixedSpecies.types[1] = crossSpecies.types[1] || crossSpecies.types[0];\n\t\t}\n\t\tif (mixedSpecies.types[0] === mixedSpecies.types[1]) mixedSpecies.types = [mixedSpecies.types[0]];\n\t\tmixedSpecies.weighthg += crossSpecies.weighthg - prevo.weighthg;\n\t\tif (mixedSpecies.weighthg < 1) {\n\t\t\tmixedSpecies.weighthg = 1;\n\t\t}\n\t\tmixedSpecies.tier = \"CE\";\n\t\tlet weighthit = 20;\n\t\tif (mixedSpecies.weighthg >= 2000) {\n\t\t\tweighthit = 120;\n\t\t} else if (mixedSpecies.weighthg >= 1000) {\n\t\t\tweighthit = 100;\n\t\t} else if (mixedSpecies.weighthg >= 500) {\n\t\t\tweighthit = 80;\n\t\t} else if (mixedSpecies.weighthg >= 250) {\n\t\t\tweighthit = 60;\n\t\t} else if (mixedSpecies.weighthg >= 100) {\n\t\t\tweighthit = 40;\n\t\t}\n\t\tconst details: { [k: string]: string } = {\n\t\t\t\"Dex#\": mixedSpecies.num,\n\t\t\tGen: mixedSpecies.gen,\n\t\t\tHeight: `${mixedSpecies.heightm} m`,\n\t\t\tWeight: `${mixedSpecies.weighthg / 10} kg <em>(${weighthit} BP)</em>`,\n\t\t\t\"Dex Colour\": mixedSpecies.color,\n\t\t};\n\t\tif (mixedSpecies.eggGroups) details[\"Egg Group(s)\"] = mixedSpecies.eggGroups.join(\", \");\n\t\tdetails['<font color=\"#686868\">Does Not Evolve</font>'] = \"\";\n\t\tthis.sendReply(`|raw|${Chat.getDataPokemonHTML(mixedSpecies)}`);\n\t\tthis.sendReply(`|raw|<font size=\"1\">` + Object.entries(details).map(([detail, value]) => (\n\t\t\tvalue === '' ? detail : `<font color=\"#686868\">${detail}:</font> ${value}`\n\t\t)).join(\" |  \") + `</font>`);\n\t},\n\tcrossevolvehelp: [\n\t\t\"/crossevo <base pokemon>, <evolved pokemon> - Shows the type and stats for the Cross Evolved Pok\\u00e9mon.\",\n\t],\n\n\treevo: 'showevo',\n\tshowevo(target, room, user, connection, cmd) {\n\t\tif (!this.runBroadcast()) return;\n\t\tconst targetid = toID(target);\n\t\tconst isReEvo = cmd === 'reevo';\n\t\tif (!targetid) return this.parse(`/help ${isReEvo ? 're' : 'show'}evo`);\n\t\tconst evo = Dex.species.get(target);\n\t\tif (!evo.exists) {\n\t\t\tthrow new Chat.ErrorMessage(`Error: Pok\\u00e9mon ${target} not found.`);\n\t\t}\n\t\tif (!evo.prevo) {\n\t\t\tconst evoBaseSpecies = Dex.species.get(\n\t\t\t\t(Array.isArray(evo.battleOnly) ? evo.battleOnly[0] : evo.battleOnly) || evo.changesFrom || evo.name\n\t\t\t);\n\t\t\tif (!evoBaseSpecies.prevo) throw new Chat.ErrorMessage(`Error: ${evoBaseSpecies.name} is not an evolution.`);\n\t\t\tconst prevoSpecies = Dex.species.get(evoBaseSpecies.prevo);\n\t\t\tconst deltas = Utils.deepClone(evo);\n\t\t\tif (!isReEvo) {\n\t\t\t\tdeltas.tier = 'CE';\n\t\t\t\tdeltas.weightkg = evo.weightkg - prevoSpecies.weightkg;\n\t\t\t\tdeltas.types = [];\n\t\t\t\tif (evo.types[0] !== prevoSpecies.types[0]) deltas.types[0] = evo.types[0];\n\t\t\t\tif (evo.types[1] !== prevoSpecies.types[1]) {\n\t\t\t\t\tdeltas.types[1] = evo.types[1] || evo.types[0];\n\t\t\t\t}\n\t\t\t\tif (deltas.types.length) {\n\t\t\t\t\t// Undefined type remover\n\t\t\t\t\tdeltas.types = deltas.types.filter((type: string | undefined) => type !== undefined);\n\n\t\t\t\t\tif (deltas.types[0] === deltas.types[1]) deltas.types = [deltas.types[0]];\n\t\t\t\t} else {\n\t\t\t\t\tdeltas.types = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\tdeltas.bst = 0;\n\t\t\tlet i: StatID;\n\t\t\tfor (i in evo.baseStats) {\n\t\t\t\tconst statChange = evoBaseSpecies.baseStats[i] - prevoSpecies.baseStats[i];\n\t\t\t\tconst formeChange = evo.baseStats[i] - evoBaseSpecies.baseStats[i];\n\t\t\t\tif (!isReEvo) {\n\t\t\t\t\tif (!evo.prevo) {\n\t\t\t\t\t\tdeltas.baseStats[i] = formeChange;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdeltas.baseStats[i] = statChange;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tdeltas.baseStats[i] = Utils.clampIntRange(evoBaseSpecies.baseStats[i] + statChange, 1, 255);\n\t\t\t\t\tdeltas.baseStats[i] = Utils.clampIntRange(deltas.baseStats[i] + formeChange, 1, 255);\n\t\t\t\t}\n\t\t\t\tdeltas.bst += deltas.baseStats[i];\n\t\t\t}\n\t\t\tconst details = {\n\t\t\t\tGen: evo.gen,\n\t\t\t\tWeight: `${deltas.weighthg < 0 ? \"\" : \"+\"}${deltas.weighthg / 10} kg`,\n\t\t\t\tStage: (Dex.species.get(prevoSpecies.prevo).exists ? 3 : 2),\n\t\t\t};\n\t\t\tthis.sendReply(`|raw|${Chat.getDataPokemonHTML(deltas)}`);\n\t\t\tif (!isReEvo) {\n\t\t\t\tthis.sendReply(`|raw|<font size=\"1\"><font color=\"#686868\">Gen:</font> ${details[\"Gen\"]} |  <font color=\"#686868\">Weight:</font> ${details[\"Weight\"]} |  <font color=\"#686868\">Stage:</font> ${details[\"Stage\"]}</font>`);\n\t\t\t}\n\t\t} else {\n\t\t\tconst prevoSpecies = Dex.species.get(evo.prevo);\n\t\t\tconst deltas = Utils.deepClone(evo);\n\t\t\tif (!isReEvo) {\n\t\t\t\tdeltas.tier = 'CE';\n\t\t\t\tdeltas.weightkg = evo.weightkg - prevoSpecies.weightkg;\n\t\t\t\tdeltas.types = [];\n\t\t\t\tif (evo.types[0] !== prevoSpecies.types[0]) deltas.types[0] = evo.types[0];\n\t\t\t\tif (evo.types[1] !== prevoSpecies.types[1]) {\n\t\t\t\t\tdeltas.types[1] = evo.types[1] || evo.types[0];\n\t\t\t\t}\n\t\t\t\tif (deltas.types.length) {\n\t\t\t\t\t// Undefined type remover\n\t\t\t\t\tdeltas.types = deltas.types.filter((type: string | undefined) => type !== undefined);\n\n\t\t\t\t\tif (deltas.types[0] === deltas.types[1]) deltas.types = [deltas.types[0]];\n\t\t\t\t} else {\n\t\t\t\t\tdeltas.types = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\tdeltas.bst = 0;\n\t\t\tlet i: StatID;\n\t\t\tfor (i in evo.baseStats) {\n\t\t\t\tconst statChange = evo.baseStats[i] - prevoSpecies.baseStats[i];\n\t\t\t\tif (!isReEvo) {\n\t\t\t\t\tdeltas.baseStats[i] = statChange;\n\t\t\t\t} else {\n\t\t\t\t\tdeltas.baseStats[i] = Utils.clampIntRange(deltas.baseStats[i] + statChange, 1, 255);\n\t\t\t\t}\n\t\t\t\tdeltas.bst += deltas.baseStats[i];\n\t\t\t}\n\t\t\tconst details = {\n\t\t\t\tGen: evo.gen,\n\t\t\t\tWeight: `${deltas.weighthg < 0 ? \"\" : \"+\"}${deltas.weighthg / 10} kg`,\n\t\t\t\tStage: (Dex.species.get(prevoSpecies.prevo).exists ? 3 : 2),\n\t\t\t};\n\t\t\tthis.sendReply(`|raw|${Chat.getDataPokemonHTML(deltas)}`);\n\t\t\tif (!isReEvo) {\n\t\t\t\tthis.sendReply(`|raw|<font size=\"1\"><font color=\"#686868\">Gen:</font> ${details[\"Gen\"]} |  <font color=\"#686868\">Weight:</font> ${details[\"Weight\"]} |  <font color=\"#686868\">Stage:</font> ${details[\"Stage\"]}</font>`);\n\t\t\t}\n\t\t}\n\t},\n\treevohelp: [\n\t\t`/reevo <Pok\\u00e9mon> - Shows the stats that a Pok\\u00e9mon would have in Re-Evolution`,\n\t],\n\tshowevohelp: [\n\t\t`/showevo <Pok\\u00e9mon> - Shows the changes that a Pok\\u00e9mon applies in Cross Evolution`,\n\t],\n\n\tpokemove(target, room, user) {\n\t\tif (!this.runBroadcast()) return;\n\t\tconst species = Dex.species.get(target);\n\t\tif (!species.exists) return this.parse('/help pokemove');\n\t\tconst move = Utils.deepClone(Dex.moves.get('tackle'));\n\t\tmove.name = species.name;\n\t\tmove.type = species.types[0];\n\t\tmove.flags = { protect: 1 };\n\t\tmove.basePower = Math.max(species.baseStats['atk'], species.baseStats['spa']);\n\t\tmove.pp = 5;\n\t\tmove.gen = species.gen;\n\t\tmove.num = species.num;\n\t\tmove.desc = move.shortDesc = `Gives ${species.abilities['0']} as a second ability after use.`;\n\t\tmove.category = species.baseStats['spa'] >= species.baseStats['atk'] ? 'Special' : 'Physical';\n\t\tthis.sendReply(`|raw|${Chat.getDataMoveHTML(move)}`);\n\t},\n\tpokemovehelp: [\n\t\t`/pokemove <Pok\\u00e9mon> - Shows the Pokemove data for <Pok\\u00e9mon>.`,\n\t],\n};\n"], | |
"mappings": "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", | |
"names": [] | |
} | |