Spaces:
Running
Running
{ | |
"version": 3, | |
"sources": ["../../../server/chat-plugins/datasearch.ts"], | |
"sourcesContent": ["/**\n * Data searching commands.\n * Pokemon Showdown - http://pokemonshowdown.com/\n *\n * Commands for advanced searching for pokemon, moves, items and learnsets.\n * These commands run on a child process by default.\n *\n * @license MIT\n */\n\nimport { ProcessManager, Utils } from '../../lib';\nimport { TeamValidator } from '../../sim/team-validator';\nimport { Chat } from '../chat';\n\ninterface DexOrGroup {\n\tabilities: { [k: string]: boolean };\n\ttiers: { [k: string]: boolean };\n\tdoublesTiers: { [k: string]: boolean };\n\tcolors: { [k: string]: boolean };\n\t'egg groups': { [k: string]: boolean };\n\tformes: { [k: string]: boolean };\n\tgens: { [k: string]: boolean };\n\tmoves: { [k: string]: boolean };\n\ttypes: { [k: string]: boolean };\n\tresists: { [k: string]: boolean };\n\tweak: { [k: string]: boolean };\n\tstats: { [k: string]: { [k in Direction]: number } };\n\tskip: boolean;\n}\n\ninterface MoveOrGroup {\n\ttypes: { [k: string]: boolean };\n\tcategories: { [k: string]: boolean };\n\tcontestTypes: { [k: string]: boolean };\n\tflags: { [k: string]: boolean };\n\tgens: { [k: string]: boolean };\n\tother: { [k: string]: boolean };\n\tmon: { [k: string]: boolean };\n\tproperty: { [k: string]: { [k in Direction]: number } };\n\tboost: { [k: string]: boolean };\n\tlower: { [k: string]: boolean };\n\tzboost: { [k: string]: boolean };\n\tstatus: { [k: string]: boolean };\n\tvolatileStatus: { [k: string]: boolean };\n\ttargets: { [k: string]: boolean };\n\tskip: boolean;\n\tmultihit: boolean;\n}\n\ntype Direction = 'less' | 'greater' | 'equal';\n\nconst MAX_PROCESSES = 1;\nconst RESULTS_MAX_LENGTH = 10;\nconst MAX_RANDOM_RESULTS = 30;\nconst dexesHelp = Object.keys((global.Dex?.dexes || {})).filter(x => x !== 'sourceMaps').join('</code>, <code>');\n\nfunction toListString(arr: string[]) {\n\tif (!arr.length) return '';\n\tif (arr.length === 1) return arr[0];\n\tif (arr.length === 2) return `${arr[0]} and ${arr[1]}`;\n\treturn `${arr.slice(0, -1).join(\", \")}, and ${arr.slice(-1)[0]}`;\n}\n\nfunction checkCanAll(room: Room | null) {\n\tif (!room) return false; // no, no good reason for using `all` in pms\n\tconst { isPersonal, isHelp } = room.settings;\n\t// allowed if it's a groupchat\n\treturn !room.battle && !!isPersonal && !isHelp;\n}\n\nexport const commands: Chat.ChatCommands = {\n\tds: 'dexsearch',\n\tds1: 'dexsearch',\n\tds2: 'dexsearch',\n\tds3: 'dexsearch',\n\tds4: 'dexsearch',\n\tds5: 'dexsearch',\n\tds6: 'dexsearch',\n\tds7: 'dexsearch',\n\tds8: 'dexsearch',\n\tdsearch: 'dexsearch',\n\tnds: 'dexsearch',\n\tasync dexsearch(target, room, user, connection, cmd, message) {\n\t\tthis.checkBroadcast();\n\t\tif (!target) return this.parse('/help dexsearch');\n\t\tif (target.length > 300) return this.errorReply('Dexsearch queries may not be longer than 300 characters.');\n\t\tconst targetGen = parseInt(cmd[cmd.length - 1]);\n\t\tif (targetGen) target += `, mod=gen${targetGen}`;\n\t\tconst split = target.split(',').map(term => term.trim());\n\t\tconst index = split.findIndex(x => /^max\\s*gen/i.test(x));\n\t\tif (index >= 0) {\n\t\t\tconst genNum = parseInt(/\\d*$/.exec(split[index])?.[0] || '');\n\t\t\tif (!isNaN(genNum) && !(genNum < 1 || genNum > Dex.gen)) {\n\t\t\t\tsplit[index] = `mod=gen${genNum}`;\n\t\t\t\ttarget = split.join(',');\n\t\t\t}\n\t\t}\n\t\tconst defaultFormat = this.extractFormat(room?.settings.defaultFormat || room?.battle?.format);\n\t\tif (!target.includes('mod=')) {\n\t\t\tconst dex = defaultFormat.dex;\n\t\t\tif (dex) target += `, mod=${dex.currentMod}`;\n\t\t}\n\t\tif (cmd === 'nds' ||\n\t\t\t(defaultFormat.format && Dex.formats.getRuleTable(defaultFormat.format).has('standardnatdex'))) {\n\t\t\ttarget += ', natdex';\n\t\t}\n\t\tconst response = await runSearch({\n\t\t\ttarget,\n\t\t\tcmd: 'dexsearch',\n\t\t\tcanAll: !this.broadcastMessage || checkCanAll(room),\n\t\t\tmessage: (this.broadcastMessage ? \"\" : message),\n\t\t}, user);\n\t\tif (!response.error && !this.runBroadcast()) return;\n\t\tif (response.error) {\n\t\t\tthrow new Chat.ErrorMessage(response.error);\n\t\t} else if (response.reply) {\n\t\t\tthis.sendReplyBox(response.reply);\n\t\t} else if (response.dt) {\n\t\t\t(Chat.commands.data as Chat.ChatHandler).call(\n\t\t\t\tthis, response.dt, room, user, connection, 'dt', this.broadcastMessage ? \"\" : message\n\t\t\t);\n\t\t}\n\t},\n\tdexsearchhelp() {\n\t\tthis.sendReply(\n\t\t\t`|html| <details class=\"readmore\"><summary><code>/dexsearch [parameter], [parameter], [parameter], ...</code>: searches for Pok\\u00e9mon that fulfill the selected criteria<br/>` +\n\t\t\t`Search categories are: type, tier, color, moves, ability, gen, resists, weak, recovery, zrecovery, priority, stat, weight, height, egg group, pivot.<br/>` +\n\t\t\t`Valid colors are: green, red, blue, white, brown, yellow, purple, pink, gray and black.<br/>` +\n\t\t\t`Valid tiers are: Uber/OU/UUBL/UU/RUBL/RU/NUBL/NU/PUBL/PU/ZUBL/ZU/NFE/LC/CAP/CAP NFE/CAP LC.<br/>` +\n\t\t\t`Valid doubles tiers are: DUber/DOU/DBL/DUU/DNU.</summary>` +\n\t\t\t`Types can be searched for by either having the type precede <code>type</code> or just using the type itself as a parameter; e.g., both <code>fire type</code> and <code>fire</code> show all Fire types; however, using <code>psychic</code> as a parameter will show all Pok\\u00e9mon that learn the move Psychic and not Psychic types.<br/>` +\n\t\t\t`<code>resists</code> followed by a type or move will show Pok\\u00e9mon that resist that typing or move (e.g. <code>resists normal</code>).<br/>` +\n\t\t\t`<code>weak</code> followed by a type or move will show Pok\\u00e9mon that are weak to that typing or move (e.g. <code>weak fire</code>).<br/>` +\n\t\t\t`<code>asc</code> or <code>desc</code> following a stat will show the Pok\\u00e9mon in ascending or descending order of that stat respectively (e.g. <code>speed asc</code>).<br/>` +\n\t\t\t`Inequality ranges use the characters <code>>=</code> for <code>\u2265</code> and <code><=</code> for <code>\u2264</code>; e.g., <code>hp <= 95</code> searches all Pok\\u00e9mon with HP less than or equal to 95.<br/>` +\n\t\t\t`Parameters can be excluded through the use of <code>!</code>; e.g., <code>!water type</code> excludes all Water types.<br/>` +\n\t\t\t`The parameter <code>mega</code> can be added to search for Mega Evolutions only, the parameter <code>gmax</code> can be added to search for Pok\\u00e9mon capable of Gigantamaxing only, and the parameter <code>Fully Evolved</code> (or <code>FE</code>) can be added to search for fully-evolved Pok\\u00e9mon.<br/>` +\n\t\t\t`<code>Alola</code>, <code>Galar</code>, <code>Therian</code>, <code>Totem</code>, or <code>Primal</code> can be used as parameters to search for those formes.<br/>` +\n\t\t\t`Parameters separated with <code>|</code> will be searched as alternatives for each other; e.g., <code>trick | switcheroo</code> searches for all Pok\\u00e9mon that learn either Trick or Switcheroo.<br/>` +\n\t\t\t`You can search for info in a specific generation by appending the generation to ds or by using the <code>maxgen</code> keyword; e.g. <code>/ds1 normal</code> or <code>/ds normal, maxgen1</code> searches for all Pok\\u00e9mon that were Normal type in Generation I.<br/>` +\n\t\t\t`You can search for info in a specific mod by using <code>mod=[mod name]</code>; e.g. <code>/nds mod=ssb, protean</code>. All valid mod names are: <code>${dexesHelp}</code><br />` +\n\t\t\t`By default, <code>/dexsearch</code> will search only Pok\\u00e9mon obtainable in the current generation. Add the parameter <code>unreleased</code> to include unreleased Pok\\u00e9mon. Add the parameter <code>natdex</code> (or use the command <code>/nds</code>) to include all past Pok\\u00e9mon.<br/>` +\n\t\t\t`Searching for a Pok\\u00e9mon with both egg group and type parameters can be differentiated by adding the suffix <code>group</code> onto the egg group parameter; e.g., seaching for <code>grass, grass group</code> will show all Grass types in the Grass egg group.<br/>` +\n\t\t\t`The parameter <code>monotype</code> will only show Pok\\u00e9mon that are single-typed.<br/>` +\n\t\t\t`The order of the parameters does not matter.<br/>`\n\t\t);\n\t},\n\n\trollmove: 'randommove',\n\trandmove: 'randommove',\n\tasync randommove(target, room, user, connection, cmd, message) {\n\t\tthis.checkBroadcast(true);\n\t\ttarget = target.slice(0, 300);\n\t\tconst targets = target.split(\",\");\n\t\tconst targetsBuffer = [];\n\t\tlet qty;\n\t\tfor (const arg of targets) {\n\t\t\tif (!arg) continue;\n\t\t\tconst num = Number(arg);\n\t\t\tif (Number.isInteger(num)) {\n\t\t\t\tif (qty) throw new Chat.ErrorMessage(\"Only specify the number of Pok\\u00e9mon Moves once.\");\n\t\t\t\tqty = num;\n\t\t\t\tif (qty < 1 || MAX_RANDOM_RESULTS < qty) {\n\t\t\t\t\tthrow new Chat.ErrorMessage(`Number of random Pok\\u00e9mon Moves must be between 1 and ${MAX_RANDOM_RESULTS}.`);\n\t\t\t\t}\n\t\t\t\ttargetsBuffer.push(`random${qty}`);\n\t\t\t} else {\n\t\t\t\ttargetsBuffer.push(arg);\n\t\t\t}\n\t\t}\n\t\tif (!qty) targetsBuffer.push(\"random1\");\n\t\tconst defaultFormat = this.extractFormat(room?.settings.defaultFormat || room?.battle?.format);\n\t\tif (!target.includes('mod=')) {\n\t\t\tconst dex = defaultFormat.dex;\n\t\t\tif (dex) targetsBuffer.push(`mod=${dex.currentMod}`);\n\t\t}\n\t\tconst response = await runSearch({\n\t\t\ttarget: targetsBuffer.join(\",\"),\n\t\t\tcmd: 'randmove',\n\t\t\tcanAll: !this.broadcastMessage || checkCanAll(room),\n\t\t\tmessage: (this.broadcastMessage ? \"\" : message),\n\t\t}, user);\n\t\tif (!response.error && !this.runBroadcast(true)) return;\n\t\tif (response.error) {\n\t\t\tthrow new Chat.ErrorMessage(response.error);\n\t\t} else if (response.reply) {\n\t\t\tthis.sendReplyBox(response.reply);\n\t\t} else if (response.dt) {\n\t\t\t(Chat.commands.data as Chat.ChatHandler).call(\n\t\t\t\tthis, response.dt, room, user, connection, 'dt', this.broadcastMessage ? \"\" : message\n\t\t\t);\n\t\t}\n\t},\n\trandommovehelp: [\n\t\t`/randommove - Generates random Pok\\u00e9mon Moves based on given search conditions.`,\n\t\t`/randommove uses the same parameters as /movesearch (see '/help ms').`,\n\t\t`Adding a number as a parameter returns that many random Pok\\u00e9mon Moves, e.g., '/randmove 6' returns 6 random Pok\\u00e9mon Moves.`,\n\t],\n\n\trollpokemon: 'randompokemon',\n\trandpoke: 'randompokemon',\n\tasync randompokemon(target, room, user, connection, cmd, message) {\n\t\tthis.checkBroadcast(true);\n\t\ttarget = target.slice(0, 300);\n\t\tconst targets = target.split(\",\");\n\t\tconst targetsBuffer = [];\n\t\tlet qty;\n\t\tfor (const arg of targets) {\n\t\t\tif (!arg) continue;\n\t\t\tconst num = Number(arg);\n\t\t\tif (Number.isInteger(num)) {\n\t\t\t\tif (qty) throw new Chat.ErrorMessage(\"Only specify the number of Pok\\u00e9mon once.\");\n\t\t\t\tqty = num;\n\t\t\t\tif (qty < 1 || MAX_RANDOM_RESULTS < qty) {\n\t\t\t\t\tthrow new Chat.ErrorMessage(`Number of random Pok\\u00e9mon must be between 1 and ${MAX_RANDOM_RESULTS}.`);\n\t\t\t\t}\n\t\t\t\ttargetsBuffer.push(`random${qty}`);\n\t\t\t} else {\n\t\t\t\ttargetsBuffer.push(arg);\n\t\t\t}\n\t\t}\n\t\tif (!qty) targetsBuffer.push(\"random1\");\n\t\tconst defaultFormat = this.extractFormat(room?.settings.defaultFormat || room?.battle?.format);\n\t\tif (!target.includes('mod=')) {\n\t\t\tconst dex = defaultFormat.dex;\n\t\t\tif (dex) targetsBuffer.push(`mod=${dex.currentMod}`);\n\t\t}\n\t\tconst response = await runSearch({\n\t\t\ttarget: targetsBuffer.join(\",\"),\n\t\t\tcmd: 'randpoke',\n\t\t\tcanAll: !this.broadcastMessage || checkCanAll(room),\n\t\t\tmessage: (this.broadcastMessage ? \"\" : message),\n\t\t}, user);\n\t\tif (!response.error && !this.runBroadcast(true)) return;\n\t\tif (response.error) {\n\t\t\tthrow new Chat.ErrorMessage(response.error);\n\t\t} else if (response.reply) {\n\t\t\tthis.sendReplyBox(response.reply);\n\t\t} else if (response.dt) {\n\t\t\t(Chat.commands.data as Chat.ChatHandler).call(\n\t\t\t\tthis, response.dt, room, user, connection, 'dt', this.broadcastMessage ? \"\" : message\n\t\t\t);\n\t\t}\n\t},\n\trandompokemonhelp: [\n\t\t`/randompokemon - Generates random Pok\\u00e9mon based on given search conditions.`,\n\t\t`/randompokemon uses the same parameters as /dexsearch (see '/help ds').`,\n\t\t`Adding a number as a parameter returns that many random Pok\\u00e9mon, e.g., '/randpoke 6' returns 6 random Pok\\u00e9mon.`,\n\t],\n\n\trandability: 'randomability',\n\tasync randomability(target, room, user, connection, cmd, message) {\n\t\tthis.checkBroadcast(true);\n\t\ttarget = target.slice(0, 300);\n\t\tconst targets = target.split(\",\");\n\t\tconst targetsBuffer = [];\n\t\tlet qty;\n\t\tfor (const arg of targets) {\n\t\t\tif (!arg) continue;\n\t\t\tconst num = Number(arg);\n\t\t\tif (Number.isInteger(num)) {\n\t\t\t\tif (qty) throw new Chat.ErrorMessage(\"Only specify the number of abilities once.\");\n\t\t\t\tqty = num;\n\t\t\t\tif (qty < 1 || MAX_RANDOM_RESULTS < qty) {\n\t\t\t\t\tthrow new Chat.ErrorMessage(`Number of random abilities must be between 1 and ${MAX_RANDOM_RESULTS}.`);\n\t\t\t\t}\n\t\t\t\ttargetsBuffer.push(`random${qty}`);\n\t\t\t} else {\n\t\t\t\ttargetsBuffer.push(arg);\n\t\t\t}\n\t\t}\n\t\tif (!qty) targetsBuffer.push(\"random1\");\n\n\t\tconst response = await runSearch({\n\t\t\ttarget: targetsBuffer.join(\",\"),\n\t\t\tcmd: 'randability',\n\t\t\tcanAll: !this.broadcastMessage || checkCanAll(room),\n\t\t\tmessage: (this.broadcastMessage ? \"\" : message),\n\t\t});\n\t\tif (!response.error && !this.runBroadcast(true)) return;\n\t\tif (response.error) {\n\t\t\tthrow new Chat.ErrorMessage(response.error);\n\t\t} else if (response.reply) {\n\t\t\tthis.sendReplyBox(response.reply);\n\t\t} else if (response.dt) {\n\t\t\t(Chat.commands.data as Chat.ChatHandler).call(\n\t\t\t\tthis, response.dt, room, user, connection, 'dt', this.broadcastMessage ? \"\" : message\n\t\t\t);\n\t\t}\n\t},\n\trandomabilityhelp: [\n\t\t`/randability - Generates random Pok\\u00e9mon ability based on given search conditions.`,\n\t\t`/randability uses the same parameters as /abilitysearch (see '/help ds').`,\n\t\t`Adding a number as a parameter returns that many random Pok\\u00e9mon abilities, e.g., '/randabilitiy 6' returns 6 random abilities.`,\n\t],\n\tms: 'movesearch',\n\tms1: 'movesearch',\n\tms2: 'movesearch',\n\tms3: 'movesearch',\n\tms4: 'movesearch',\n\tms5: 'movesearch',\n\tms6: 'movesearch',\n\tms7: 'movesearch',\n\tms8: 'movesearch',\n\tmsearch: 'movesearch',\n\tnms: 'movesearch',\n\tasync movesearch(target, room, user, connection, cmd, message) {\n\t\tthis.checkBroadcast();\n\t\tif (!target) return this.parse('/help movesearch');\n\t\ttarget = target.slice(0, 300);\n\t\tconst targetGen = parseInt(cmd[cmd.length - 1]);\n\t\tif (targetGen) target += `, mod=gen${targetGen}`;\n\t\tconst split = target.split(',').map(term => term.trim());\n\t\tconst index = split.findIndex(x => /^max\\s*gen/i.test(x));\n\t\tif (index >= 0) {\n\t\t\tconst genNum = parseInt(/\\d*$/.exec(split[index])?.[0] || '');\n\t\t\tif (!isNaN(genNum) && !(genNum < 1 || genNum > Dex.gen)) {\n\t\t\t\tsplit[index] = `mod=gen${genNum}`;\n\t\t\t\ttarget = split.join(',');\n\t\t\t}\n\t\t}\n\t\tif (!target.includes('mod=')) {\n\t\t\tconst dex = this.extractFormat(room?.settings.defaultFormat || room?.battle?.format).dex;\n\t\t\tif (dex) target += `, mod=${dex.currentMod}`;\n\t\t}\n\t\tif (cmd === 'nms') target += ', natdex';\n\t\tconst response = await runSearch({\n\t\t\ttarget,\n\t\t\tcmd: 'movesearch',\n\t\t\tcanAll: !this.broadcastMessage || checkCanAll(room),\n\t\t\tmessage: (this.broadcastMessage ? \"\" : message),\n\t\t}, user);\n\t\tif (!response.error && !this.runBroadcast()) return;\n\t\tif (response.error) {\n\t\t\tthrow new Chat.ErrorMessage(response.error);\n\t\t} else if (response.reply) {\n\t\t\tthis.sendReplyBox(response.reply);\n\t\t} else if (response.dt) {\n\t\t\t(Chat.commands.data as Chat.ChatHandler).call(\n\t\t\t\tthis, response.dt, room, user, connection, 'dt', this.broadcastMessage ? \"\" : message\n\t\t\t);\n\t\t}\n\t},\n\tmovesearchhelp() {\n\t\tthis.sendReplyBox(\n\t\t\t`<code>/movesearch [parameter], [parameter], [parameter], ...</code>: searches for moves that fulfill the selected criteria.<br/><br/>` +\n\t\t\t`Search categories are: type, category, gen, contest condition, flag, status inflicted, type boosted, Pok\\u00e9mon targeted, and numeric range for base power, pp, priority, and accuracy.<br/><br/>` +\n\t\t\t`<details class=\"readmore\"><summary>Parameter Options</summary>` +\n\t\t\t`- Types can be followed by <code> type</code> for clarity; e.g. <code>dragon type</code>.<br/>` +\n\t\t\t`- Stat boosts must be preceded with <code>boosts </code>, and stat-lowering moves with <code>lowers </code>; e.g., <code>boosts attack</code> searches for moves that boost the Attack stat of either Pok\\u00e9mon.<br/>` +\n\t\t\t`- Z-stat boosts must be preceded with <code>zboosts </code>; e.g. <code>zboosts accuracy</code> searches for all Status moves with Z-Effects that boost the user's accuracy. Moves that have a Z-Effect of fully restoring the user's health can be searched for with <code>zrecovery</code>.<br/>` +\n\t\t\t`- <code>zmove</code>, <code>max</code>, or <code>gmax</code> as parameters will search for Z-Moves, Max Moves, and G-Max Moves respectively.<br/>` +\n\t\t\t`- Move targets must be preceded with <code>targets </code>; e.g. <code>targets user</code> searches for moves that target the user.<br/>` +\n\t\t\t`- Valid move targets are: one ally, user or ally, one adjacent opponent, all Pokemon, all adjacent Pokemon, all adjacent opponents, user and allies, user's side, user's team, any Pokemon, opponent's side, one adjacent Pokemon, random adjacent Pokemon, scripted, and user.<br/>` +\n\t\t\t`- Valid flags are: allyanim, bypasssub (bypasses Substitute), bite, bullet, cantusetwice, charge, contact, dance, defrost, distance (can target any Pokemon in Triples), failcopycat, failencore, failinstruct, failmefirst, failmimic, futuremove, gravity, heal, highcrit, instruct, metronome, mimic, mirror (reflected by Mirror Move), mustpressure, multihit, noassist, nonsky, noparentalbond, nosketch, nosleeptalk, ohko, pivot, pledgecombo, powder, priority, protect, pulse, punch, recharge, recovery, reflectable, secondary, slicing, snatch, sound, and wind.<br/>` +\n\t\t\t`- <code>protection</code> as a parameter will search protection moves like Protect, Detect, etc.<br/>` +\n\t\t\t`- A search that includes <code>!protect</code> will show all moves that bypass protection.<br/>` +\n\t\t\t`</details><br/>` +\n\t\t\t`<details class=\"readmore\"><summary>Parameter Filters</summary>` +\n\t\t\t`- Inequality ranges use the characters <code>></code> and <code><</code>.<br/>` +\n\t\t\t`- Parameters can be excluded through the use of <code>!</code>; e.g. <code>!water type</code> excludes all Water-type moves.<br/>` +\n\t\t\t`- <code>asc</code> or <code>desc</code> following a move property will arrange the names in ascending or descending order of that property, respectively; e.g., <code>basepower asc</code> will arrange moves in ascending order of their base powers.<br/>` +\n\t\t\t`- Parameters separated with <code>|</code> will be searched as alternatives for each other; e.g. <code>fire | water</code> searches for all moves that are either Fire type or Water type.<br/>` +\n\t\t\t`- If a Pok\\u00e9mon is included as a parameter, only moves from its movepool will be included in the search.<br/>` +\n\t\t\t`- You can search for info in a specific generation by appending the generation to ms; e.g. <code>/ms1 normal</code> searches for all moves that were Normal type in Generation I.<br/>` +\n\t\t\t`- You can search for info in a specific mod by using <code>mod=[mod name]</code>; e.g. <code>/nms mod=ssb, dark, bp=100</code>. All valid mod names are: <code>${dexesHelp}</code><br />` +\n\t\t\t`- <code>/ms</code> will search all non-dexited moves (clickable in that game); you can include dexited moves by using <code>/nms</code> or by adding <code>natdex</code> as a parameter.<br/>` +\n\t\t\t`- The order of the parameters does not matter.` +\n\t\t\t`</details>`\n\t\t);\n\t},\n\n\tisearch: 'itemsearch',\n\tis: 'itemsearch',\n\tis2: 'itemsearch',\n\tis3: 'itemsearch',\n\tis4: 'itemsearch',\n\tis5: 'itemsearch',\n\tis6: 'itemsearch',\n\tis7: 'itemsearch',\n\tis8: 'itemsearch',\n\tasync itemsearch(target, room, user, connection, cmd, message) {\n\t\tthis.checkBroadcast();\n\t\tif (!target) return this.parse('/help itemsearch');\n\t\ttarget = target.slice(0, 300);\n\t\tconst targetGen = parseInt(cmd[cmd.length - 1]);\n\t\tif (targetGen) target = `maxgen${targetGen} ${target}`;\n\n\t\tconst response = await runSearch({\n\t\t\ttarget,\n\t\t\tcmd: 'itemsearch',\n\t\t\tcanAll: !this.broadcastMessage || checkCanAll(room),\n\t\t\tmessage: (this.broadcastMessage ? \"\" : message),\n\t\t}, user);\n\t\tif (!response.error && !this.runBroadcast()) return;\n\t\tif (response.error) {\n\t\t\tthrow new Chat.ErrorMessage(response.error);\n\t\t} else if (response.reply) {\n\t\t\tthis.sendReplyBox(response.reply);\n\t\t} else if (response.dt) {\n\t\t\t(Chat.commands.data as Chat.ChatHandler).call(\n\t\t\t\tthis, response.dt, room, user, connection, 'dt', this.broadcastMessage ? \"\" : message\n\t\t\t);\n\t\t}\n\t},\n\titemsearchhelp() {\n\t\tthis.sendReplyBox(\n\t\t\t`<code>/itemsearch [item description]</code>: finds items that match the given keywords.<br/>` +\n\t\t\t`This command accepts natural language. (tip: fewer words tend to work better)<br/>` +\n\t\t\t`The <code>gen</code> keyword can be used to search for items introduced in a given generation; e.g., <code>/is gen4</code> searches for items introduced in Generation 4.<br/>` +\n\t\t\t`To search for items within a generation, append the generation to <code>/is</code> or use the <code>maxgen</code> keyword; e.g., <code>/is4 Water-type</code> or <code>/is maxgen4 Water-type</code> searches for items whose Generation 4 description includes \"Water-type\".<br/>` +\n\t\t\t`Searches with <code>fling</code> in them will find items with the specified Fling behavior.<br/>` +\n\t\t\t`Searches with <code>natural gift</code> in them will find items with the specified Natural Gift behavior.`\n\t\t);\n\t},\n\n\tranditem: 'randomitem',\n\tasync randomitem(target, room, user, connection, cmd, message) {\n\t\tthis.checkBroadcast(true);\n\t\ttarget = target.slice(0, 300);\n\t\tconst targets = target.split(\",\");\n\t\tconst targetsBuffer = [];\n\t\tlet qty;\n\t\tfor (const arg of targets) {\n\t\t\tif (!arg) continue;\n\t\t\tconst num = Number(arg);\n\t\t\tif (Number.isInteger(num)) {\n\t\t\t\tif (qty) throw new Chat.ErrorMessage(\"Only specify the number of items once.\");\n\t\t\t\tqty = num;\n\t\t\t\tif (qty < 1 || MAX_RANDOM_RESULTS < qty) {\n\t\t\t\t\tthrow new Chat.ErrorMessage(`Number of random items must be between 1 and ${MAX_RANDOM_RESULTS}.`);\n\t\t\t\t}\n\t\t\t\ttargetsBuffer.push(`random${qty}`);\n\t\t\t} else {\n\t\t\t\ttargetsBuffer.push(arg);\n\t\t\t}\n\t\t}\n\t\tif (!qty) targetsBuffer.push(\"random1\");\n\n\t\tconst response = await runSearch({\n\t\t\ttarget: targetsBuffer.join(\",\"),\n\t\t\tcmd: 'randitem',\n\t\t\tcanAll: !this.broadcastMessage || checkCanAll(room),\n\t\t\tmessage: (this.broadcastMessage ? \"\" : message),\n\t\t});\n\t\tif (!response.error && !this.runBroadcast(true)) return;\n\t\tif (response.error) {\n\t\t\tthrow new Chat.ErrorMessage(response.error);\n\t\t} else if (response.reply) {\n\t\t\tthis.sendReplyBox(response.reply);\n\t\t} else if (response.dt) {\n\t\t\t(Chat.commands.data as Chat.ChatHandler).call(\n\t\t\t\tthis, response.dt, room, user, connection, 'dt', this.broadcastMessage ? \"\" : message\n\t\t\t);\n\t\t}\n\t},\n\trandomitemhelp: [\n\t\t`/randitem - Generates random items based on given search conditions.`,\n\t\t`/randitem uses the same parameters as /itemsearch (see '/help ds').`,\n\t\t`Adding a number as a parameter returns that many random items, e.g., '/randitem 6' returns 6 random items.`,\n\t],\n\tasearch: 'abilitysearch',\n\tas: 'abilitysearch',\n\tas3: 'abilitysearch',\n\tas4: 'abilitysearch',\n\tas5: 'abilitysearch',\n\tas6: 'abilitysearch',\n\tas7: 'abilitysearch',\n\tas8: 'abilitysearch',\n\tasync abilitysearch(target, room, user, connection, cmd, message) {\n\t\tthis.checkBroadcast();\n\t\tif (!target) return this.parse('/help abilitysearch');\n\t\ttarget = target.slice(0, 300);\n\t\tconst targetGen = parseInt(cmd[cmd.length - 1]);\n\t\tif (targetGen) target += ` maxgen${targetGen}`;\n\n\t\tconst response = await runSearch({\n\t\t\ttarget,\n\t\t\tcmd: 'abilitysearch',\n\t\t\tcanAll: !this.broadcastMessage || checkCanAll(room),\n\t\t\tmessage: (this.broadcastMessage ? \"\" : message),\n\t\t}, user);\n\t\tif (!response.error && !this.runBroadcast()) return;\n\t\tif (response.error) {\n\t\t\tthrow new Chat.ErrorMessage(response.error);\n\t\t} else if (response.reply) {\n\t\t\tthis.sendReplyBox(response.reply);\n\t\t} else if (response.dt) {\n\t\t\t(Chat.commands.data as Chat.ChatHandler).call(\n\t\t\t\tthis, response.dt, room, user, connection, 'dt', this.broadcastMessage ? \"\" : message\n\t\t\t);\n\t\t}\n\t},\n\tabilitysearchhelp() {\n\t\tthis.sendReplyBox(\n\t\t\t`<code>/abilitysearch [ability description]</code>: finds abilities that match the given keywords.<br/>` +\n\t\t\t`This command accepts natural language. (tip: fewer words tend to work better)<br/>` +\n\t\t\t`The <code>gen</code> keyword can be used to search for abilities introduced in a given generation; e.g., <code>/as gen4</code> searches for abilities introduced in Generation 4.<br/>` +\n\t\t\t`To search for abilities within a generation, append the generation to <code>/as</code> or use the <code>maxgen</code> keyword; e.g., <code>/as4 Water-type</code> or <code>/as maxgen4 Water-type</code> searches for abilities whose Generation 4 description includes \"Water-type\".`\n\t\t);\n\t},\n\n\tlearnset: 'learn',\n\tlearnall: 'learn',\n\tlearn5: 'learn',\n\trbylearn: 'learn',\n\tgsclearn: 'learn',\n\tadvlearn: 'learn',\n\tdpplearn: 'learn',\n\tbw2learn: 'learn',\n\toraslearn: 'learn',\n\tusumlearn: 'learn',\n\tsslearn: 'learn',\n\tasync learn(target, room, user, connection, cmd, message) {\n\t\tif (!target) return this.parse('/help learn');\n\t\tif (target.length > 300) throw new Chat.ErrorMessage(`Query too long.`);\n\n\t\tconst GENS: { [k: string]: number } = { rby: 1, gsc: 2, adv: 3, dpp: 4, bw2: 5, oras: 6, usum: 7, ss: 8 };\n\t\tconst cmdGen = GENS[cmd.slice(0, -5)];\n\t\tif (cmdGen) target = `gen${cmdGen}, ${target}`;\n\n\t\tthis.checkBroadcast();\n\t\tconst { format, dex, targets } = this.splitFormat(target);\n\n\t\tconst formatid = format ? format.id : dex.currentMod;\n\t\tif (cmd === 'learn5') targets.unshift('level5');\n\n\t\tconst response = await runSearch({\n\t\t\ttarget: targets.join(','),\n\t\t\tcmd: 'learn',\n\t\t\tcanAll: !this.broadcastMessage || checkCanAll(room),\n\t\t\tmessage: formatid,\n\t\t}, user);\n\t\tif (!response.error && !this.runBroadcast()) return;\n\t\tif (response.error) {\n\t\t\tthrow new Chat.ErrorMessage(response.error);\n\t\t} else if (response.reply) {\n\t\t\tthis.sendReplyBox(response.reply);\n\t\t}\n\t},\n\tlearnhelp: [\n\t\t`/learn [ruleset], [pokemon], [move, move, ...] - Displays how the Pok\\u00e9mon can learn the given moves, if it can at all.`,\n\t\t`!learn [ruleset], [pokemon], [move, move, ...] - Show everyone that information. Requires: + % @ # ~`,\n\t\t`Specifying a ruleset is entirely optional. The ruleset can be a format, a generation (e.g.: gen3) or \"min source gen [number]\".`,\n\t\t`A value of 'min source gen [number]' indicates that trading (or Pok\u00E9mon Bank) from generations before [number] is not allowed.`,\n\t\t`/learn5 displays how the Pok\\u00e9mon can learn the given moves at level 5, if it can at all.`,\n\t\t`/learnall displays all of the possible fathers for egg moves.`,\n\t\t`/learn can also be prefixed by a generation acronym (e.g.: /dpplearn) to indicate which generation is used. Valid options are: rby gsc adv dpp bw2 oras usum ss`,\n\t],\n\trandtype: 'randomtype',\n\tasync randomtype(target, room, user, connection, cmd, message) {\n\t\tthis.checkBroadcast(true);\n\t\ttarget = target.slice(0, 300);\n\t\tconst targets = target.split(\",\");\n\t\tconst targetsBuffer = [];\n\t\tlet qty;\n\t\tfor (const arg of targets) {\n\t\t\tif (!arg) continue;\n\t\t\tconst num = Number(arg);\n\t\t\tif (Number.isInteger(num)) {\n\t\t\t\tif (qty) throw new Chat.ErrorMessage(\"Only specify the number of types once.\");\n\t\t\t\tqty = num;\n\t\t\t\tif (qty < 1 || MAX_RANDOM_RESULTS < qty) {\n\t\t\t\t\tthrow new Chat.ErrorMessage(`Number of random types must be between 1 and ${MAX_RANDOM_RESULTS}.`);\n\t\t\t\t}\n\t\t\t\ttargetsBuffer.push(`random${qty}`);\n\t\t\t} else {\n\t\t\t\ttargetsBuffer.push(arg);\n\t\t\t}\n\t\t}\n\t\tif (!qty) targetsBuffer.push(\"random1\");\n\n\t\tconst response = await runSearch({\n\t\t\ttarget: targetsBuffer.join(\",\"),\n\t\t\tcmd: 'randtype',\n\t\t\tcanAll: !this.broadcastMessage || checkCanAll(room),\n\t\t\tmessage: (this.broadcastMessage ? \"\" : message),\n\t\t});\n\t\tif (!response.error && !this.runBroadcast(true)) return;\n\t\tif (response.error) {\n\t\t\tthrow new Chat.ErrorMessage(response.error);\n\t\t} else if (response.reply) {\n\t\t\tthis.sendReplyBox(response.reply);\n\t\t} else if (response.dt) {\n\t\t\t(Chat.commands.data as Chat.ChatHandler).call(\n\t\t\t\tthis, response.dt, room, user, connection, 'dt', this.broadcastMessage ? \"\" : message\n\t\t\t);\n\t\t}\n\t},\n\trandomtypehelp: [\n\t\t`/randtype - Generates random types based on given search conditions.`,\n\t\t`Adding a number as a parameter returns that many random items, e.g., '/randtype 6' returns 6 random types.`,\n\t],\n};\n\nfunction getMod(target: string) {\n\tconst arr = target.split(',').map(x => x.trim());\n\tconst modTerm = arr.find(x => {\n\t\tconst sanitizedStr = x.toLowerCase().replace(/[^a-z0-9=]+/g, '');\n\t\treturn sanitizedStr.startsWith('mod=') && Dex.dexes[toID(sanitizedStr.split('=')[1])];\n\t});\n\tconst count = arr.filter(x => {\n\t\tconst sanitizedStr = x.toLowerCase().replace(/[^a-z0-9=]+/g, '');\n\t\treturn sanitizedStr.startsWith('mod=');\n\t}).length;\n\tif (modTerm) arr.splice(arr.indexOf(modTerm), 1);\n\treturn { splitTarget: arr, usedMod: modTerm ? toID(modTerm.split(/ ?= ?/)[1]) : undefined, count };\n}\n\nfunction runDexsearch(target: string, cmd: string, canAll: boolean, message: string, isTest: boolean) {\n\tconst searches: DexOrGroup[] = [];\n\tconst { splitTarget, usedMod, count: c } = getMod(target);\n\tif (c > 1) {\n\t\treturn { error: `You can't run searches for multiple mods.` };\n\t}\n\n\tconst mod = Dex.mod(usedMod || 'base');\n\tconst allTiers: { [k: string]: TierTypes.Singles | TierTypes.Other } = Object.assign(Object.create(null), {\n\t\tanythinggoes: 'AG', ag: 'AG',\n\t\tuber: 'Uber', ubers: 'Uber', ou: 'OU',\n\t\tuubl: 'UUBL', uu: 'UU',\n\t\trubl: 'RUBL', ru: 'RU',\n\t\tnubl: 'NUBL', nu: 'NU',\n\t\tpubl: 'PUBL', pu: 'PU',\n\t\tzubl: 'ZUBL', zu: 'ZU',\n\t\tnfe: 'NFE',\n\t\tlc: 'LC',\n\t\tcap: 'CAP', caplc: 'CAP LC', capnfe: 'CAP NFE',\n\t});\n\tconst allDoublesTiers: { [k: string]: TierTypes.Singles | TierTypes.Other } = Object.assign(Object.create(null), {\n\t\tdoublesubers: 'DUber', doublesuber: 'DUber', duber: 'DUber', dubers: 'DUber',\n\t\tdoublesou: 'DOU', dou: 'DOU',\n\t\tdoublesbl: 'DBL', dbl: 'DBL',\n\t\tdoublesuu: 'DUU', duu: 'DUU',\n\t\tdoublesnu: '(DUU)', dnu: '(DUU)',\n\t});\n\tconst allTypes = Object.create(null);\n\tfor (const type of mod.types.all()) {\n\t\tallTypes[type.id] = type.name;\n\t}\n\tconst allColors = ['green', 'red', 'blue', 'white', 'brown', 'yellow', 'purple', 'pink', 'gray', 'black'];\n\tconst allEggGroups: { [k: string]: string } = Object.assign(Object.create(null), {\n\t\tamorphous: 'Amorphous',\n\t\tbug: 'Bug',\n\t\tditto: 'Ditto',\n\t\tdragon: 'Dragon',\n\t\tfairy: 'Fairy',\n\t\tfield: 'Field',\n\t\tflying: 'Flying',\n\t\tgrass: 'Grass',\n\t\thumanlike: 'Human-Like',\n\t\tmineral: 'Mineral',\n\t\tmonster: 'Monster',\n\t\tundiscovered: 'Undiscovered',\n\t\twater1: 'Water 1',\n\t\twater2: 'Water 2',\n\t\twater3: 'Water 3',\n\t});\n\tconst allFormes = ['alola', 'galar', 'hisui', 'paldea', 'primal', 'therian', 'totem'];\n\tconst allStats = ['hp', 'atk', 'def', 'spa', 'spd', 'spe', 'bst', 'weight', 'height', 'gen'];\n\tconst allStatAliases: { [k: string]: string } = {\n\t\tattack: 'atk', defense: 'def', specialattack: 'spa', spc: 'spa', special: 'spa', spatk: 'spa',\n\t\tspecialdefense: 'spd', spdef: 'spd', speed: 'spe', wt: 'weight', ht: 'height', generation: 'gen',\n\t};\n\tlet showAll = false;\n\tlet sort = null;\n\tlet megaSearch = null;\n\tlet gmaxSearch = null;\n\tlet tierSearch = null;\n\tlet capSearch: boolean | null = null;\n\tlet nationalSearch = null;\n\tlet unreleasedSearch = null;\n\tlet fullyEvolvedSearch = null;\n\tlet singleTypeSearch = null;\n\tlet randomOutput = 0;\n\tconst validParameter = (cat: string, param: string, isNotSearch: boolean, input: string) => {\n\t\tconst uniqueTraits = ['colors', 'gens'];\n\t\tfor (const group of searches) {\n\t\t\tconst g = group[cat as keyof DexOrGroup];\n\t\t\tif (g === undefined) continue;\n\t\t\tif (typeof g !== 'boolean' && g[param] === undefined) {\n\t\t\t\tif (uniqueTraits.includes(cat)) {\n\t\t\t\t\tfor (const currentParam in g) {\n\t\t\t\t\t\tif (g[currentParam] !== isNotSearch && !isNotSearch) return `A Pokémon cannot have multiple ${cat}.`;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (typeof g !== 'boolean' && g[param] === isNotSearch) {\n\t\t\t\treturn `A search cannot both include and exclude '${input}'.`;\n\t\t\t} else {\n\t\t\t\treturn `The search included '${(isNotSearch ? \"!\" : \"\") + input}' more than once.`;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t};\n\n\tfor (const andGroup of splitTarget) {\n\t\tconst orGroup: DexOrGroup = {\n\t\t\tabilities: {}, tiers: {}, doublesTiers: {}, colors: {}, 'egg groups': {}, formes: {},\n\t\t\tgens: {}, moves: {}, types: {}, resists: {}, weak: {}, stats: {}, skip: false,\n\t\t};\n\t\tconst parameters = andGroup.split(\"|\");\n\t\tif (parameters.length > 3) return { error: \"No more than 3 alternatives for each parameter may be used.\" };\n\t\tfor (const parameter of parameters) {\n\t\t\tlet isNotSearch = false;\n\t\t\ttarget = parameter.trim().toLowerCase();\n\t\t\tif (target.startsWith('!')) {\n\t\t\t\tisNotSearch = true;\n\t\t\t\ttarget = target.substr(1);\n\t\t\t}\n\n\t\t\tconst targetAbility = mod.abilities.get(target);\n\t\t\tif (targetAbility.exists) {\n\t\t\t\tconst invalid = validParameter(\"abilities\", targetAbility.id, isNotSearch, targetAbility.name);\n\t\t\t\tif (invalid) return { error: invalid };\n\t\t\t\torGroup.abilities[targetAbility.name] = !isNotSearch;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (toID(target) in allTiers) {\n\t\t\t\ttarget = allTiers[toID(target)];\n\t\t\t\tif (target.startsWith(\"CAP\")) {\n\t\t\t\t\tif (capSearch === isNotSearch) return { error: \"A search cannot both include and exclude CAP tiers.\" };\n\t\t\t\t\tcapSearch = !isNotSearch;\n\t\t\t\t}\n\t\t\t\tconst invalid = validParameter(\"tiers\", target, isNotSearch, target);\n\t\t\t\tif (invalid) return { error: invalid };\n\t\t\t\ttierSearch = tierSearch || !isNotSearch;\n\t\t\t\torGroup.tiers[target] = !isNotSearch;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (toID(target) in allDoublesTiers) {\n\t\t\t\ttarget = allDoublesTiers[toID(target)];\n\t\t\t\tconst invalid = validParameter(\"doubles tiers\", target, isNotSearch, target);\n\t\t\t\tif (invalid) return { error: invalid };\n\t\t\t\ttierSearch = tierSearch || !isNotSearch;\n\t\t\t\torGroup.doublesTiers[target] = !isNotSearch;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (allColors.includes(target)) {\n\t\t\t\ttarget = target.charAt(0).toUpperCase() + target.slice(1);\n\t\t\t\tconst invalid = validParameter(\"colors\", target, isNotSearch, target);\n\t\t\t\tif (invalid) return { error: invalid };\n\t\t\t\torGroup.colors[target] = !isNotSearch;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst targetMove = mod.moves.get(target);\n\t\t\tif (targetMove.exists) {\n\t\t\t\tconst invalid = validParameter(\"moves\", targetMove.id, isNotSearch, target);\n\t\t\t\tif (invalid) return { error: invalid };\n\t\t\t\torGroup.moves[targetMove.id] = !isNotSearch;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet targetType;\n\t\t\tif (target.endsWith('type')) {\n\t\t\t\ttargetType = toID(target.substring(0, target.indexOf('type')));\n\t\t\t} else {\n\t\t\t\ttargetType = toID(target);\n\t\t\t}\n\t\t\tif (targetType in allTypes) {\n\t\t\t\ttarget = allTypes[targetType];\n\t\t\t\tconst invalid = validParameter(\"types\", target, isNotSearch, target);\n\t\t\t\tif (invalid) return { error: invalid };\n\t\t\t\tif ((orGroup.types[target] && isNotSearch) || (orGroup.types[target] === false && !isNotSearch)) {\n\t\t\t\t\treturn { error: 'A search cannot both exclude and include a type.' };\n\t\t\t\t}\n\t\t\t\torGroup.types[target] = !isNotSearch;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (['mono', 'monotype'].includes(toID(target))) {\n\t\t\t\tif (singleTypeSearch === isNotSearch) return { error: \"A search cannot include and exclude 'monotype'.\" };\n\t\t\t\tif (parameters.length > 1) return { error: \"The parameter 'monotype' cannot have alternative parameters.\" };\n\t\t\t\tsingleTypeSearch = !isNotSearch;\n\t\t\t\torGroup.skip = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (target === 'natdex') {\n\t\t\t\tif (parameters.length > 1) return { error: \"The parameter 'natdex' cannot have alternative parameters.\" };\n\t\t\t\tnationalSearch = true;\n\t\t\t\torGroup.skip = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (target === 'unreleased') {\n\t\t\t\tif (parameters.length > 1) return { error: \"The parameter 'unreleased' cannot have alternative parameters.\" };\n\t\t\t\tunreleasedSearch = true;\n\t\t\t\torGroup.skip = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet groupIndex = target.indexOf('group');\n\t\t\tif (groupIndex === -1) groupIndex = target.length;\n\t\t\tif (groupIndex !== target.length || toID(target) in allEggGroups) {\n\t\t\t\ttarget = toID(target.substring(0, groupIndex));\n\t\t\t\tif (target in allEggGroups) {\n\t\t\t\t\ttarget = allEggGroups[toID(target)];\n\t\t\t\t\tconst invalid = validParameter(\"egg groups\", target, isNotSearch, target);\n\t\t\t\t\tif (invalid) return { error: invalid };\n\t\t\t\t\torGroup['egg groups'][target] = !isNotSearch;\n\t\t\t\t\tcontinue;\n\t\t\t\t} else {\n\t\t\t\t\treturn { error: `'${target}' is not a recognized egg group.` };\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (toID(target) in allEggGroups) {\n\t\t\t\ttarget = allEggGroups[toID(target)];\n\t\t\t\tconst invalid = validParameter(\"egg groups\", target, isNotSearch, target);\n\t\t\t\tif (invalid) return { error: invalid };\n\t\t\t\torGroup['egg groups'][target] = !isNotSearch;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet targetInt = 0;\n\t\t\tif (target.substr(0, 1) === 'g' && Number.isInteger(parseFloat(target.substr(1)))) {\n\t\t\t\ttargetInt = parseInt(target.substr(1).trim());\n\t\t\t} else if (target.substr(0, 3) === 'gen' && Number.isInteger(parseFloat(target.substr(3)))) {\n\t\t\t\ttargetInt = parseInt(target.substr(3).trim());\n\t\t\t}\n\t\t\tif (0 < targetInt && targetInt <= mod.gen) {\n\t\t\t\tconst invalid = validParameter(\"gens\", String(targetInt), isNotSearch, target);\n\t\t\t\tif (invalid) return { error: invalid };\n\t\t\t\torGroup.gens[targetInt] = !isNotSearch;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (target.endsWith(' asc') || target.endsWith(' desc')) {\n\t\t\t\tif (parameters.length > 1) {\n\t\t\t\t\treturn { error: `The parameter '${target.split(' ')[1]}' cannot have alternative parameters.` };\n\t\t\t\t}\n\t\t\t\tconst stat = allStatAliases[toID(target.split(' ')[0])] || toID(target.split(' ')[0]);\n\t\t\t\tif (!allStats.includes(stat)) return { error: `'${target}' did not contain a valid stat.` };\n\t\t\t\tsort = `${stat}${target.endsWith(' asc') ? '+' : '-'}`;\n\t\t\t\torGroup.skip = true;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (target === 'all') {\n\t\t\t\tif (!canAll) return { error: \"A search with the parameter 'all' cannot be broadcast.\" };\n\t\t\t\tif (parameters.length > 1) return { error: \"The parameter 'all' cannot have alternative parameters.\" };\n\t\t\t\tshowAll = true;\n\t\t\t\torGroup.skip = true;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (target.substr(0, 6) === 'random' && cmd === 'randpoke') {\n\t\t\t\t// Validation for this is in the /randpoke command\n\t\t\t\trandomOutput = parseInt(target.substr(6));\n\t\t\t\torGroup.skip = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (allFormes.includes(toID(target))) {\n\t\t\t\ttarget = toID(target);\n\t\t\t\torGroup.formes[target] = !isNotSearch;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (target === 'megas' || target === 'mega') {\n\t\t\t\tif (megaSearch === isNotSearch) return { error: \"A search cannot include and exclude 'mega'.\" };\n\t\t\t\tif (parameters.length > 1) return { error: \"The parameter 'mega' cannot have alternative parameters.\" };\n\t\t\t\tmegaSearch = !isNotSearch;\n\t\t\t\torGroup.skip = true;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (target === 'gmax' || target === 'gigantamax') {\n\t\t\t\tif (gmaxSearch === isNotSearch) return { error: \"A search cannot include and exclude 'gigantamax'.\" };\n\t\t\t\tif (parameters.length > 1) return { error: \"The parameter 'gigantamax' cannot have alternative parameters.\" };\n\t\t\t\tgmaxSearch = !isNotSearch;\n\t\t\t\torGroup.skip = true;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (['fully evolved', 'fullyevolved', 'fe'].includes(target)) {\n\t\t\t\tif (fullyEvolvedSearch === isNotSearch) return { error: \"A search cannot include and exclude 'fully evolved'.\" };\n\t\t\t\tif (parameters.length > 1) return { error: \"The parameter 'fully evolved' cannot have alternative parameters.\" };\n\t\t\t\tfullyEvolvedSearch = !isNotSearch;\n\t\t\t\torGroup.skip = true;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (target === 'recovery') {\n\t\t\t\tconst recoveryMoves = [\n\t\t\t\t\t\"healorder\", \"junglehealing\", \"lifedew\", \"milkdrink\", \"moonlight\", \"morningsun\", \"recover\",\n\t\t\t\t\t\"roost\", \"shoreup\", \"slackoff\", \"softboiled\", \"strengthsap\", \"synthesis\", \"wish\",\n\t\t\t\t];\n\t\t\t\tfor (const move of recoveryMoves) {\n\t\t\t\t\tconst invalid = validParameter(\"moves\", move, isNotSearch, target);\n\t\t\t\t\tif (invalid) return { error: invalid };\n\t\t\t\t\tif (isNotSearch) {\n\t\t\t\t\t\torGroup.skip = true;\n\t\t\t\t\t\tconst bufferObj: { moves: { [k: string]: boolean } } = { moves: {} };\n\t\t\t\t\t\tbufferObj.moves[move] = false;\n\t\t\t\t\t\tsearches.push(bufferObj as DexOrGroup);\n\t\t\t\t\t} else {\n\t\t\t\t\t\torGroup.moves[move] = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (target === 'zrecovery') {\n\t\t\t\tconst recoveryMoves = [\n\t\t\t\t\t\"aromatherapy\", \"bellydrum\", \"conversion2\", \"haze\", \"healbell\", \"mist\",\n\t\t\t\t\t\"psychup\", \"refresh\", \"spite\", \"stockpile\", \"teleport\", \"transform\",\n\t\t\t\t];\n\t\t\t\tfor (const moveid of recoveryMoves) {\n\t\t\t\t\tconst invalid = validParameter(\"moves\", moveid, isNotSearch, target);\n\t\t\t\t\tif (invalid) return { error: invalid };\n\t\t\t\t\tif (isNotSearch) {\n\t\t\t\t\t\torGroup.skip = true;\n\t\t\t\t\t\tconst bufferObj: { moves: { [k: string]: boolean } } = { moves: {} };\n\t\t\t\t\t\tbufferObj.moves[moveid] = false;\n\t\t\t\t\t\tsearches.push(bufferObj as DexOrGroup);\n\t\t\t\t\t} else {\n\t\t\t\t\t\torGroup.moves[moveid] = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (target === 'priority') {\n\t\t\t\tfor (const moveid in mod.data.Moves) {\n\t\t\t\t\tconst move = mod.moves.get(moveid);\n\t\t\t\t\tif (move.category === \"Status\" || move.id === \"bide\") continue;\n\t\t\t\t\tif (move.priority > 0) {\n\t\t\t\t\t\tconst invalid = validParameter(\"moves\", moveid, isNotSearch, target);\n\t\t\t\t\t\tif (invalid) return { error: invalid };\n\t\t\t\t\t\tif (isNotSearch) {\n\t\t\t\t\t\t\torGroup.skip = true;\n\t\t\t\t\t\t\tconst bufferObj: { moves: { [k: string]: boolean } } = { moves: {} };\n\t\t\t\t\t\t\tbufferObj.moves[moveid] = false;\n\t\t\t\t\t\t\tsearches.push(bufferObj as DexOrGroup);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\torGroup.moves[moveid] = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (target.substr(0, 8) === 'resists ') {\n\t\t\t\tconst targetResist = target.substr(8, 1).toUpperCase() + target.substr(9);\n\t\t\t\tif (mod.types.isName(targetResist)) {\n\t\t\t\t\tconst invalid = validParameter(\"resists\", targetResist, isNotSearch, target);\n\t\t\t\t\tif (invalid) return { error: invalid };\n\t\t\t\t\torGroup.resists[targetResist] = !isNotSearch;\n\t\t\t\t\tcontinue;\n\t\t\t\t} else {\n\t\t\t\t\tif (toID(targetResist) in mod.data.Moves) {\n\t\t\t\t\t\tconst move = mod.moves.get(targetResist);\n\t\t\t\t\t\tif (move.category === 'Status') {\n\t\t\t\t\t\t\treturn { error: `'${targetResist}' is a status move and can't be used with 'resists'.` };\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst invalid = validParameter(\"resists\", targetResist, isNotSearch, target);\n\t\t\t\t\t\t\tif (invalid) return { error: invalid };\n\t\t\t\t\t\t\torGroup.resists[targetResist] = !isNotSearch;\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn { error: `'${targetResist}' is not a recognized type or move.` };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (target.substr(0, 5) === 'weak ') {\n\t\t\t\tconst targetWeak = target.substr(5, 1).toUpperCase() + target.substr(6);\n\t\t\t\tif (mod.types.isName(targetWeak)) {\n\t\t\t\t\tconst invalid = validParameter(\"weak\", targetWeak, isNotSearch, target);\n\t\t\t\t\tif (invalid) return { error: invalid };\n\t\t\t\t\torGroup.weak[targetWeak] = !isNotSearch;\n\t\t\t\t\tcontinue;\n\t\t\t\t} else {\n\t\t\t\t\tif (toID(targetWeak) in mod.data.Moves) {\n\t\t\t\t\t\tconst move = mod.moves.get(targetWeak);\n\t\t\t\t\t\tif (move.category === 'Status') {\n\t\t\t\t\t\t\treturn { error: `'${targetWeak}' is a status move and can't be used with 'weak'.` };\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst invalid = validParameter(\"weak\", targetWeak, isNotSearch, target);\n\t\t\t\t\t\t\tif (invalid) return { error: invalid };\n\t\t\t\t\t\t\torGroup.weak[targetWeak] = !isNotSearch;\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn { error: `'${targetWeak}' is not a recognized type or move.` };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (target === 'pivot') {\n\t\t\t\tfor (const move in mod.data.Moves) {\n\t\t\t\t\tconst moveData = mod.moves.get(move);\n\t\t\t\t\tif (moveData.selfSwitch && moveData.id !== 'revivalblessing' && moveData.id !== 'batonpass') {\n\t\t\t\t\t\tconst invalid = validParameter(\"moves\", move, isNotSearch, target);\n\t\t\t\t\t\tif (invalid) return { error: invalid };\n\t\t\t\t\t\tif (isNotSearch) {\n\t\t\t\t\t\t\torGroup.skip = true;\n\t\t\t\t\t\t\tconst bufferObj: { moves: { [k: string]: boolean } } = { moves: {} };\n\t\t\t\t\t\t\tbufferObj.moves[move] = false;\n\t\t\t\t\t\t\tsearches.push(bufferObj as DexOrGroup);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\torGroup.moves[move] = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst inequality = target.search(/>|<|=/);\n\t\t\tlet inequalityString;\n\t\t\tif (inequality >= 0) {\n\t\t\t\tif (isNotSearch) return { error: \"You cannot use the negation symbol '!' in stat ranges.\" };\n\t\t\t\tif (target.charAt(inequality + 1) === '=') {\n\t\t\t\t\tinequalityString = target.substr(inequality, 2);\n\t\t\t\t} else {\n\t\t\t\t\tinequalityString = target.charAt(inequality);\n\t\t\t\t}\n\t\t\t\tconst targetParts = target.replace(/\\s/g, '').split(inequalityString);\n\t\t\t\tlet num;\n\t\t\t\tlet stat;\n\t\t\t\tconst directions: Direction[] = [];\n\t\t\t\tif (!isNaN(parseFloat(targetParts[0]))) {\n\t\t\t\t\t// e.g. 100 < spe\n\t\t\t\t\tnum = parseFloat(targetParts[0]);\n\t\t\t\t\tstat = targetParts[1];\n\t\t\t\t\tif (inequalityString.startsWith('>')) directions.push('less');\n\t\t\t\t\tif (inequalityString.startsWith('<')) directions.push('greater');\n\t\t\t\t} else if (!isNaN(parseFloat(targetParts[1]))) {\n\t\t\t\t\t// e.g. spe > 100\n\t\t\t\t\tnum = parseFloat(targetParts[1]);\n\t\t\t\t\tstat = targetParts[0];\n\t\t\t\t\tif (inequalityString.startsWith('<')) directions.push('less');\n\t\t\t\t\tif (inequalityString.startsWith('>')) directions.push('greater');\n\t\t\t\t} else {\n\t\t\t\t\treturn { error: `No value given to compare with '${target}'.` };\n\t\t\t\t}\n\t\t\t\tif (inequalityString.endsWith('=')) directions.push('equal');\n\t\t\t\tif (stat in allStatAliases) stat = allStatAliases[stat];\n\t\t\t\tif (!allStats.includes(stat)) return { error: `'${target}' did not contain a valid stat.` };\n\t\t\t\tif (!orGroup.stats[stat]) orGroup.stats[stat] = Object.create(null);\n\t\t\t\tfor (const direction of directions) {\n\t\t\t\t\tif (orGroup.stats[stat][direction]) return { error: `Invalid stat range for ${stat}.` };\n\t\t\t\t\torGroup.stats[stat][direction] = num;\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\treturn { error: `'${target}' could not be found in any of the search categories.` };\n\t\t}\n\t\tif (!orGroup.skip) {\n\t\t\tsearches.push(orGroup);\n\t\t}\n\t}\n\tif (\n\t\tshowAll && searches.length === 0 && singleTypeSearch === null &&\n\t\tmegaSearch === null && gmaxSearch === null && fullyEvolvedSearch === null && sort === null\n\t) {\n\t\treturn {\n\t\t\terror: \"No search parameters other than 'all' were found. Try '/help dexsearch' for more information on this command.\",\n\t\t};\n\t}\n\n\tconst dex: { [k: string]: Species } = {};\n\tfor (const species of mod.species.all()) {\n\t\tconst megaSearchResult = megaSearch === null || megaSearch === !!species.isMega;\n\t\tconst gmaxSearchResult = gmaxSearch === null || gmaxSearch === species.name.endsWith('-Gmax');\n\t\tconst fullyEvolvedSearchResult = fullyEvolvedSearch === null || fullyEvolvedSearch !== species.nfe;\n\t\tif (\n\t\t\tspecies.gen <= mod.gen &&\n\t\t\t(\n\t\t\t\t(nationalSearch && species.natDexTier !== 'Illegal') ||\n\t\t\t\t((species.tier !== 'Unreleased' || unreleasedSearch) && species.tier !== 'Illegal')\n\t\t\t) &&\n\t\t\t(!species.tier.startsWith(\"CAP\") || capSearch) &&\n\t\t\tmegaSearchResult &&\n\t\t\tgmaxSearchResult &&\n\t\t\tfullyEvolvedSearchResult\n\t\t) {\n\t\t\tdex[species.id] = species;\n\t\t}\n\t}\n\n\t// Prioritize searches with the least alternatives.\n\tconst accumulateKeyCount = (count: number, searchData: AnyObject) =>\n\t\tcount + (typeof searchData === 'object' ? Object.keys(searchData).length : 0);\n\tUtils.sortBy(searches, search => (\n\t\tObject.values(search).reduce(accumulateKeyCount, 0)\n\t));\n\n\t// Prepare move validator and pokemonSource outside the hot loop\n\t// but don't prepare them at all if there are no moves to check...\n\t// These only ever get accessed if there are moves to filter by.\n\tlet validator;\n\tlet pokemonSource;\n\tif (Object.values(searches).some(search => Object.keys(search.moves).length !== 0)) {\n\t\tconst format = Object.entries(Dex.data.Rulesets).find(([a, f]) => f.mod === usedMod)?.[1].name || 'gen9ou';\n\t\tconst ruleTable = Dex.formats.getRuleTable(Dex.formats.get(format));\n\t\tconst additionalRules = [];\n\t\tif (nationalSearch && !ruleTable.has('standardnatdex')) additionalRules.push('standardnatdex');\n\t\tif (nationalSearch && ruleTable.valueRules.has('minsourcegen')) additionalRules.push('!!minsourcegen=3');\n\t\tvalidator = TeamValidator.get(`${format}${additionalRules.length ? `@@@${additionalRules.join(',')}` : ''}`);\n\t}\n\tfor (const alts of searches) {\n\t\tif (alts.skip) continue;\n\t\tconst altsMoves = Object.keys(alts.moves).map(x => mod.moves.get(x)).filter(move => move.gen <= mod.gen);\n\t\tfor (const mon in dex) {\n\t\t\tlet matched = false;\n\t\t\tif (alts.gens && Object.keys(alts.gens).length) {\n\t\t\t\tif (alts.gens[dex[mon].gen]) continue;\n\t\t\t\tif (Object.values(alts.gens).includes(false) && alts.gens[dex[mon].gen] !== false) continue;\n\t\t\t}\n\n\t\t\tif (alts.colors && Object.keys(alts.colors).length) {\n\t\t\t\tif (alts.colors[dex[mon].color]) continue;\n\t\t\t\tif (Object.values(alts.colors).includes(false) && alts.colors[dex[mon].color] !== false) continue;\n\t\t\t}\n\n\t\t\tfor (const eggGroup in alts['egg groups']) {\n\t\t\t\tif (dex[mon].eggGroups.includes(eggGroup) === alts['egg groups'][eggGroup]) {\n\t\t\t\t\tmatched = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (alts.tiers && Object.keys(alts.tiers).length) {\n\t\t\t\tlet tier = dex[mon].tier;\n\t\t\t\tif (nationalSearch) tier = dex[mon].natDexTier;\n\t\t\t\tif (tier.startsWith('(')) tier = tier.slice(1, -1) as TierTypes.Singles;\n\t\t\t\t// if (tier === 'New') tier = 'OU';\n\t\t\t\tif (alts.tiers[tier]) continue;\n\t\t\t\tif (Object.values(alts.tiers).includes(false) && alts.tiers[tier] !== false) continue;\n\t\t\t\t// LC handling, checks for LC Pokemon in higher tiers that need to be handled separately,\n\t\t\t\t// as well as event-only Pokemon that are not eligible for LC despite being the first stage\n\t\t\t\tlet format = Dex.formats.get(`gen${mod.gen}lc`);\n\t\t\t\tif (format.effectType !== 'Format') format = Dex.formats.get('gen9lc');\n\t\t\t\tif (\n\t\t\t\t\talts.tiers.LC &&\n\t\t\t\t\t!dex[mon].prevo &&\n\t\t\t\t\tdex[mon].nfe &&\n\t\t\t\t\t!Dex.formats.getRuleTable(format).isBannedSpecies(dex[mon])\n\t\t\t\t) {\n\t\t\t\t\tconst lsetData = mod.species.getLearnsetData(dex[mon].id);\n\t\t\t\t\tif (lsetData.exists && lsetData.eventData && lsetData.eventOnly) {\n\t\t\t\t\t\tlet validEvents = 0;\n\t\t\t\t\t\tfor (const event of lsetData.eventData) {\n\t\t\t\t\t\t\tif (event.level && event.level <= 5) validEvents++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (validEvents > 0) continue;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (alts.doublesTiers && Object.keys(alts.doublesTiers).length) {\n\t\t\t\tlet tier = dex[mon].doublesTier;\n\t\t\t\tif (tier && tier.startsWith('(') && tier !== '(DUU)') tier = tier.slice(1, -1) as TierTypes.Doubles;\n\t\t\t\tif (alts.doublesTiers[tier]) continue;\n\t\t\t\tif (Object.values(alts.doublesTiers).includes(false) && alts.doublesTiers[tier] !== false) continue;\n\t\t\t}\n\n\t\t\tfor (const type in alts.types) {\n\t\t\t\tif (dex[mon].types.includes(type) === alts.types[type]) {\n\t\t\t\t\tmatched = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (matched) continue;\n\n\t\t\tfor (const targetResist in alts.resists) {\n\t\t\t\tlet effectiveness = 0;\n\t\t\t\tconst move = mod.moves.get(targetResist);\n\t\t\t\tconst attackingType = move.type || targetResist;\n\t\t\t\tconst notImmune = (move.id === 'thousandarrows' || mod.getImmunity(attackingType, dex[mon])) &&\n\t\t\t\t\t!(move.id === 'sheercold' && mod.gen >= 7 && dex[mon].types.includes('Ice'));\n\t\t\t\tif (notImmune && !move.ohko && move.damage === undefined) {\n\t\t\t\t\tfor (const defenderType of dex[mon].types) {\n\t\t\t\t\t\tconst baseMod = mod.getEffectiveness(attackingType, defenderType);\n\t\t\t\t\t\tconst moveMod = move.onEffectiveness?.call(\n\t\t\t\t\t\t\t{ dex: mod } as Battle, baseMod, null, defenderType, move as ActiveMove,\n\t\t\t\t\t\t);\n\t\t\t\t\t\teffectiveness += typeof moveMod === 'number' ? moveMod : baseMod;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!alts.resists[targetResist]) {\n\t\t\t\t\tif (notImmune && effectiveness >= 0) matched = true;\n\t\t\t\t} else {\n\t\t\t\t\tif (!notImmune || effectiveness < 0) matched = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (matched) continue;\n\n\t\t\tfor (const targetWeak in alts.weak) {\n\t\t\t\tlet effectiveness = 0;\n\t\t\t\tconst move = mod.moves.get(targetWeak);\n\t\t\t\tconst attackingType = move.type || targetWeak;\n\t\t\t\tconst notImmune = (move.id === 'thousandarrows' || mod.getImmunity(attackingType, dex[mon])) &&\n\t\t\t\t\t!(move.id === 'sheercold' && mod.gen >= 7 && dex[mon].types.includes('Ice'));\n\t\t\t\tif (notImmune && !move.ohko && move.damage === undefined) {\n\t\t\t\t\tfor (const defenderType of dex[mon].types) {\n\t\t\t\t\t\tconst baseMod = mod.getEffectiveness(attackingType, defenderType);\n\t\t\t\t\t\tconst moveMod = move.onEffectiveness?.call(\n\t\t\t\t\t\t\t{ dex: mod } as Battle, baseMod, null, defenderType, move as ActiveMove,\n\t\t\t\t\t\t);\n\t\t\t\t\t\teffectiveness += typeof moveMod === 'number' ? moveMod : baseMod;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (alts.weak[targetWeak]) {\n\t\t\t\t\tif (notImmune && effectiveness >= 1) matched = true;\n\t\t\t\t} else {\n\t\t\t\t\tif (!notImmune || effectiveness < 1) matched = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (matched) continue;\n\n\t\t\tfor (const ability in alts.abilities) {\n\t\t\t\tif (Object.values(dex[mon].abilities).includes(ability) === alts.abilities[ability]) {\n\t\t\t\t\tmatched = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (matched) continue;\n\n\t\t\tfor (const forme in alts.formes) {\n\t\t\t\tif (toID(dex[mon].forme).includes(forme) === alts.formes[forme]) {\n\t\t\t\t\tmatched = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (matched) continue;\n\n\t\t\tfor (const stat in alts.stats) {\n\t\t\t\tlet monStat = 0;\n\t\t\t\tif (stat === 'bst') {\n\t\t\t\t\tmonStat = dex[mon].bst;\n\t\t\t\t} else if (stat === 'weight') {\n\t\t\t\t\tmonStat = dex[mon].weighthg / 10;\n\t\t\t\t} else if (stat === 'height') {\n\t\t\t\t\tmonStat = dex[mon].heightm;\n\t\t\t\t} else if (stat === 'gen') {\n\t\t\t\t\tmonStat = dex[mon].gen;\n\t\t\t\t} else {\n\t\t\t\t\tmonStat = dex[mon].baseStats[stat as StatID];\n\t\t\t\t}\n\t\t\t\tif (typeof alts.stats[stat].less === 'number') {\n\t\t\t\t\tif (monStat < alts.stats[stat].less) {\n\t\t\t\t\t\tmatched = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (typeof alts.stats[stat].greater === 'number') {\n\t\t\t\t\tif (monStat > alts.stats[stat].greater) {\n\t\t\t\t\t\tmatched = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (typeof alts.stats[stat].equal === 'number') {\n\t\t\t\t\tif (monStat === alts.stats[stat].equal) {\n\t\t\t\t\t\tmatched = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (matched) continue;\n\n\t\t\tfor (const move of altsMoves) {\n\t\t\t\tpokemonSource = validator?.allSources();\n\t\t\t\tif (validator && !validator.checkCanLearn(move, dex[mon], pokemonSource) === alts.moves[move.id]) {\n\t\t\t\t\tmatched = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (pokemonSource && !pokemonSource.size()) break;\n\t\t\t}\n\t\t\tif (matched) continue;\n\n\t\t\tdelete dex[mon];\n\t\t}\n\t}\n\n\tconst stat = sort?.slice(0, -1);\n\n\tfunction getSortValue(name: string) {\n\t\tif (!stat) return 0;\n\t\tconst mon = mod.species.get(name);\n\t\tif (stat === 'bst') {\n\t\t\treturn mon.bst;\n\t\t} else if (stat === 'weight') {\n\t\t\treturn mon.weighthg;\n\t\t} else if (stat === 'height') {\n\t\t\treturn mon.heightm;\n\t\t} else if (stat === 'gen') {\n\t\t\treturn mon.gen;\n\t\t} else {\n\t\t\treturn mon.baseStats[stat as StatID];\n\t\t}\n\t}\n\n\tlet results: string[] = [];\n\tfor (const mon of Object.keys(dex).sort()) {\n\t\tif (singleTypeSearch !== null && (dex[mon].types.length === 1) !== singleTypeSearch) continue;\n\t\tconst isRegionalForm = ([\"Alola\", \"Galar\", \"Hisui\"].includes(dex[mon].forme) || dex[mon].forme.startsWith(\"Paldea\")) &&\n\t\t\tdex[mon].baseSpecies !== \"Pikachu\";\n\t\tconst maskForm = dex[mon].baseSpecies === \"Ogerpon\" && !dex[mon].forme.endsWith(\"Tera\");\n\t\tconst allowGmax = (gmaxSearch || tierSearch);\n\t\tif (!isRegionalForm && !maskForm && dex[mon].baseSpecies && results.includes(dex[mon].baseSpecies) &&\n\t\t\tgetSortValue(mon) === getSortValue(dex[mon].baseSpecies)) continue;\n\t\tconst teraFormeChangesFrom = dex[mon].forme.endsWith(\"Tera\") ? !Array.isArray(dex[mon].battleOnly) ?\n\t\t\tdex[mon].battleOnly! : null : null;\n\t\tif (teraFormeChangesFrom && results.includes(teraFormeChangesFrom) &&\n\t\t\tgetSortValue(mon) === getSortValue(teraFormeChangesFrom)) continue;\n\t\tif (dex[mon].isNonstandard === 'Gigantamax' && !allowGmax) continue;\n\t\tresults.push(dex[mon].name);\n\t}\n\n\tif (usedMod === 'gen7letsgo') {\n\t\tresults = results.filter(name => {\n\t\t\tconst species = mod.species.get(name);\n\t\t\treturn (species.num <= 151 || ['Meltan', 'Melmetal'].includes(species.name)) &&\n\t\t\t\t(!species.forme || (['Alola', 'Mega', 'Mega-X', 'Mega-Y', 'Starter'].includes(species.forme) &&\n\t\t\t\t\tspecies.name !== 'Pikachu-Alola'));\n\t\t});\n\t}\n\n\tif (usedMod === 'gen8bdsp') {\n\t\tresults = results.filter(name => {\n\t\t\tconst species = mod.species.get(name);\n\t\t\tif (species.id === 'pichuspikyeared') return false;\n\t\t\tif (capSearch) return species.gen <= 4;\n\t\t\treturn species.gen <= 4 && species.num >= 1;\n\t\t});\n\t}\n\n\tif (randomOutput && randomOutput < results.length) {\n\t\tresults = Utils.shuffle(results).slice(0, randomOutput);\n\t}\n\n\tlet resultsStr = (message === \"\" ? message : `<span style=\"color:#999999;\">${Utils.escapeHTML(message)}:</span><br />`);\n\tif (results.length > 1) {\n\t\tresults.sort();\n\t\tif (sort) {\n\t\t\tconst direction = sort.slice(-1);\n\t\t\tUtils.sortBy(results, name => getSortValue(name) * (direction === '+' ? 1 : -1));\n\t\t}\n\t\tlet notShown = 0;\n\t\tif (!showAll && results.length > MAX_RANDOM_RESULTS) {\n\t\t\tnotShown = results.length - RESULTS_MAX_LENGTH;\n\t\t\tresults = results.slice(0, RESULTS_MAX_LENGTH);\n\t\t}\n\t\tresultsStr += results.map(\n\t\t\tresult => `<a href=\"//${Config.routes.dex}/pokemon/${toID(result)}\" target=\"_blank\" class=\"subtle\" style=\"white-space:nowrap\"><psicon pokemon=\"${result}\" style=\"vertical-align:-7px;margin:-2px\" />${result}</a>`\n\t\t).join(\", \");\n\t\tif (notShown) {\n\t\t\tresultsStr += `, and ${notShown} more. <span style=\"color:#999999;\">Redo the search with ', all' at the end to show all results.</span>`;\n\t\t}\n\t} else if (results.length === 1) {\n\t\treturn { dt: `${results[0]}${usedMod ? `,${usedMod}` : ''}` };\n\t} else {\n\t\tresultsStr += \"No Pokémon found.\";\n\t}\n\tif (isTest) return { results, reply: resultsStr };\n\treturn { reply: resultsStr };\n}\n\nfunction runMovesearch(target: string, cmd: string, canAll: boolean, message: string, isTest: boolean) {\n\tconst searches: MoveOrGroup[] = [];\n\tconst { splitTarget, usedMod, count } = getMod(target);\n\tif (count > 1) {\n\t\treturn { error: `You can't run searches for multiple mods.` };\n\t}\n\n\tconst mod = Dex.mod(usedMod || 'base');\n\tconst allCategories = ['physical', 'special', 'status'];\n\tconst allContestTypes = ['beautiful', 'clever', 'cool', 'cute', 'tough'];\n\tconst allProperties = ['basePower', 'accuracy', 'priority', 'pp'];\n\tconst allFlags = [\n\t\t'allyanim', 'bypasssub', 'bite', 'bullet', 'cantusetwice', 'charge', 'contact', 'dance', 'defrost', 'distance', 'failcopycat', 'failencore',\n\t\t'failinstruct', 'failmefirst', 'failmimic', 'futuremove', 'gravity', 'heal', 'metronome', 'mirror', 'mustpressure', 'noassist', 'nonsky',\n\t\t'noparentalbond', 'nosketch', 'nosleeptalk', 'pledgecombo', 'powder', 'protect', 'pulse', 'punch', 'recharge', 'reflectable', 'slicing',\n\t\t'snatch', 'sound', 'wind',\n\n\t\t// Not flags directly from move data, but still useful to sort by\n\t\t'highcrit', 'multihit', 'ohko', 'protection', 'secondary',\n\t\t'zmove', 'maxmove', 'gmaxmove',\n\t];\n\tconst allStatus = ['psn', 'tox', 'brn', 'par', 'frz', 'slp'];\n\tconst allVolatileStatus = ['flinch', 'confusion', 'partiallytrapped'];\n\tconst allBoosts = ['hp', 'atk', 'def', 'spa', 'spd', 'spe', 'accuracy', 'evasion'];\n\tconst allTargets: { [k: string]: string } = {\n\t\toneally: 'adjacentAlly',\n\t\tuserorally: 'adjacentAllyOrSelf',\n\t\toneadjacentopponent: 'adjacentFoe',\n\t\tall: 'all',\n\t\talladjacent: 'allAdjacent',\n\t\talladjacentopponents: 'allAdjacentFoes',\n\t\tuserandallies: 'allies',\n\t\tusersside: 'allySide',\n\t\tusersteam: 'allyTeam',\n\t\tany: 'any',\n\t\topponentsside: 'foeSide',\n\t\toneadjacent: 'normal',\n\t\trandomadjacent: 'randomNormal',\n\t\tscripted: 'scripted',\n\t\tuser: 'self',\n\t};\n\tconst allTypes: { [k: string]: string } = Object.create(null);\n\tfor (const type of mod.types.all()) {\n\t\tallTypes[type.id] = type.name;\n\t}\n\tlet showAll = false;\n\tlet sort: string | null = null;\n\tconst targetMons: { name: string, shouldBeExcluded: boolean }[] = [];\n\tlet nationalSearch = null;\n\tlet randomOutput = 0;\n\tfor (const arg of splitTarget) {\n\t\tconst orGroup: MoveOrGroup = {\n\t\t\ttypes: {}, categories: {}, contestTypes: {}, flags: {}, gens: {}, other: {}, mon: {}, property: {},\n\t\t\tboost: {}, lower: {}, zboost: {}, status: {}, volatileStatus: {}, targets: {}, skip: false, multihit: false,\n\t\t};\n\t\tconst parameters = arg.split(\"|\");\n\t\tif (parameters.length > 3) return { error: \"No more than 3 alternatives for each parameter may be used.\" };\n\t\tfor (const parameter of parameters) {\n\t\t\tlet isNotSearch = false;\n\t\t\ttarget = parameter.toLowerCase().trim();\n\t\t\tif (target.startsWith('!')) {\n\t\t\t\tisNotSearch = true;\n\t\t\t\ttarget = target.substr(1);\n\t\t\t}\n\t\t\tlet targetType;\n\t\t\tif (target.endsWith('type')) {\n\t\t\t\ttargetType = toID(target.substring(0, target.indexOf('type')));\n\t\t\t} else {\n\t\t\t\ttargetType = toID(target);\n\t\t\t}\n\t\t\tif (allTypes[targetType]) {\n\t\t\t\ttarget = allTypes[targetType];\n\t\t\t\tif ((orGroup.types[target] && isNotSearch) || (orGroup.types[target] === false && !isNotSearch)) {\n\t\t\t\t\treturn { error: 'A search cannot both exclude and include a type.' };\n\t\t\t\t}\n\t\t\t\torGroup.types[target] = !isNotSearch;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (allCategories.includes(target)) {\n\t\t\t\ttarget = target.charAt(0).toUpperCase() + target.substr(1);\n\t\t\t\tif (\n\t\t\t\t\t(orGroup.categories[target] && isNotSearch) ||\n\t\t\t\t\t(orGroup.categories[target] === false && !isNotSearch)\n\t\t\t\t) {\n\t\t\t\t\treturn { error: 'A search cannot both exclude and include a category.' };\n\t\t\t\t}\n\t\t\t\torGroup.categories[target] = !isNotSearch;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (allContestTypes.includes(target)) {\n\t\t\t\ttarget = target.charAt(0).toUpperCase() + target.substr(1);\n\t\t\t\tif (\n\t\t\t\t\t(orGroup.contestTypes[target] && isNotSearch) ||\n\t\t\t\t\t(orGroup.contestTypes[target] === false && !isNotSearch)\n\t\t\t\t) {\n\t\t\t\t\treturn { error: 'A search cannot both exclude and include a contest condition.' };\n\t\t\t\t}\n\t\t\t\torGroup.contestTypes[target] = !isNotSearch;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (target.startsWith('targets ')) {\n\t\t\t\ttarget = toID(target.substr('targets '.length));\n\t\t\t\tif (target === 'allpokemon' || target === 'anypokemon' || target.includes('adjacent')) {\n\t\t\t\t\ttarget = target.replace('pokemon', '');\n\t\t\t\t}\n\t\t\t\tif (Object.keys(allTargets).includes(target)) {\n\t\t\t\t\tconst moveTarget = allTargets[target];\n\t\t\t\t\tif (\n\t\t\t\t\t\t(orGroup.targets[moveTarget] && isNotSearch) ||\n\t\t\t\t\t\t(orGroup.targets[moveTarget] === false && !isNotSearch)\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn { error: 'A search cannot both exclude and include a move target.' };\n\t\t\t\t\t}\n\t\t\t\t\torGroup.targets[moveTarget] = !isNotSearch;\n\t\t\t\t\tcontinue;\n\t\t\t\t} else {\n\t\t\t\t\treturn { error: `'${target}' isn't a valid move target.` };\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (target === 'bypassessubstitute') target = 'bypasssub';\n\t\t\tif (target === 'z') target = 'zmove';\n\t\t\tif (target === 'max') target = 'maxmove';\n\t\t\tif (target === 'gmax') target = 'gmaxmove';\n\t\t\tif (target === 'multi' || toID(target) === 'multihit') target = 'multihit';\n\t\t\tif (target === 'crit' || toID(target) === 'highcrit') target = 'highcrit';\n\t\t\tif (['thaw', 'thaws', 'melt', 'melts', 'defrosts'].includes(target)) target = 'defrost';\n\t\t\tif (target === 'slices' || target === 'slice') target = 'slicing';\n\t\t\tif (toID(target) === 'sheerforce') target = 'secondary';\n\t\t\tif (target === 'bounceable' || toID(target) === 'magiccoat' || toID(target) === 'magicbounce') target = 'reflectable';\n\t\t\tif (allFlags.includes(target)) {\n\t\t\t\tif ((orGroup.flags[target] && isNotSearch) || (orGroup.flags[target] === false && !isNotSearch)) {\n\t\t\t\t\treturn { error: `A search cannot both exclude and include '${target}'.` };\n\t\t\t\t}\n\t\t\t\torGroup.flags[target] = !isNotSearch;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet targetInt = 0;\n\t\t\tif (target.substr(0, 1) === 'g' && Number.isInteger(parseFloat(target.substr(1)))) {\n\t\t\t\ttargetInt = parseInt(target.substr(1).trim());\n\t\t\t} else if (target.substr(0, 3) === 'gen' && Number.isInteger(parseFloat(target.substr(3)))) {\n\t\t\t\ttargetInt = parseInt(target.substr(3).trim());\n\t\t\t}\n\n\t\t\tif (0 < targetInt && targetInt <= mod.gen) {\n\t\t\t\tif ((orGroup.gens[targetInt] && isNotSearch) || (orGroup.flags[targetInt] === false && !isNotSearch)) {\n\t\t\t\t\treturn { error: `A search cannot both exclude and include '${target}'.` };\n\t\t\t\t}\n\t\t\t\torGroup.gens[targetInt] = !isNotSearch;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (target === 'all') {\n\t\t\t\tif (!canAll) return { error: \"A search with the parameter 'all' cannot be broadcast.\" };\n\t\t\t\tif (parameters.length > 1) return { error: \"The parameter 'all' cannot have alternative parameters.\" };\n\t\t\t\tshowAll = true;\n\t\t\t\torGroup.skip = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (target === 'natdex') {\n\t\t\t\tif (parameters.length > 1) return { error: \"The parameter 'natdex' cannot have alternative parameters.\" };\n\t\t\t\tnationalSearch = !isNotSearch;\n\t\t\t\torGroup.skip = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (target.endsWith(' asc') || target.endsWith(' desc')) {\n\t\t\t\tif (parameters.length > 1) {\n\t\t\t\t\treturn { error: `The parameter '${target.split(' ')[1]}' cannot have alternative parameters.` };\n\t\t\t\t}\n\t\t\t\tlet prop = target.split(' ')[0];\n\t\t\t\tswitch (toID(prop)) {\n\t\t\t\tcase 'basepower': prop = 'basePower'; break;\n\t\t\t\tcase 'bp': prop = 'basePower'; break;\n\t\t\t\tcase 'power': prop = 'basePower'; break;\n\t\t\t\tcase 'acc': prop = 'accuracy'; break;\n\t\t\t\t}\n\t\t\t\tif (!allProperties.includes(prop)) return { error: `'${target}' did not contain a valid property.` };\n\t\t\t\tsort = `${prop}${target.endsWith(' asc') ? '+' : '-'}`;\n\t\t\t\torGroup.skip = true;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (target === 'recovery') {\n\t\t\t\tif (orGroup.other.recovery === undefined) {\n\t\t\t\t\torGroup.other.recovery = !isNotSearch;\n\t\t\t\t} else if ((orGroup.other.recovery && isNotSearch) || (!orGroup.other.recovery && !isNotSearch)) {\n\t\t\t\t\treturn { error: 'A search cannot both exclude and include recovery moves.' };\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (target === 'recoil') {\n\t\t\t\tif (orGroup.other.recoil === undefined) {\n\t\t\t\t\torGroup.other.recoil = !isNotSearch;\n\t\t\t\t} else if ((orGroup.other.recoil && isNotSearch) || (!orGroup.other.recoil && !isNotSearch)) {\n\t\t\t\t\treturn { error: 'A search cannot both exclude and include recoil moves.' };\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (target.substr(0, 6) === 'random' && cmd === 'randmove') {\n\t\t\t\t// Validation for this is in the /randmove command\n\t\t\t\trandomOutput = parseInt(target.substr(6));\n\t\t\t\torGroup.skip = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (target === 'zrecovery') {\n\t\t\t\tif (orGroup.other.zrecovery === undefined) {\n\t\t\t\t\torGroup.other.zrecovery = !isNotSearch;\n\t\t\t\t} else if ((orGroup.other.zrecovery && isNotSearch) || (!orGroup.other.zrecovery && !isNotSearch)) {\n\t\t\t\t\treturn { error: 'A search cannot both exclude and include z-recovery moves.' };\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (target === 'pivot') {\n\t\t\t\tif (orGroup.other.pivot === undefined) {\n\t\t\t\t\torGroup.other.pivot = !isNotSearch;\n\t\t\t\t} else if ((orGroup.other.pivot && isNotSearch) || (!orGroup.other.pivot && !isNotSearch)) {\n\t\t\t\t\treturn { error: 'A search cannot both exclude and include pivot moves.' };\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (target === 'multihit') {\n\t\t\t\tif (!orGroup.multihit) {\n\t\t\t\t\torGroup.multihit = true;\n\t\t\t\t} else if ((orGroup.multihit && isNotSearch) || (!orGroup.multihit && !isNotSearch)) {\n\t\t\t\t\treturn { error: 'A search cannot both exclude and include multi-hit moves.' };\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst species = mod.species.get(target);\n\t\t\tif (species.exists) {\n\t\t\t\tif (parameters.length > 1) return { error: \"A Pok\\u00e9mon learnset cannot have alternative parameters.\" };\n\t\t\t\tif (targetMons.some(mon => mon.name === species.name && isNotSearch !== mon.shouldBeExcluded)) {\n\t\t\t\t\treturn { error: \"A search cannot both exclude and include the same Pok\\u00e9mon.\" };\n\t\t\t\t}\n\t\t\t\tif (targetMons.some(mon => mon.name === species.name)) {\n\t\t\t\t\treturn { error: \"A search should not include a Pok\\u00e9mon twice.\" };\n\t\t\t\t}\n\t\t\t\ttargetMons.push({ name: species.name, shouldBeExcluded: isNotSearch });\n\t\t\t\torGroup.skip = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst inequality = target.search(/>|<|=/);\n\t\t\tif (inequality >= 0) {\n\t\t\t\tlet inequalityString;\n\t\t\t\tif (isNotSearch) return { error: \"You cannot use the negation symbol '!' in stat ranges.\" };\n\t\t\t\tif (target.charAt(inequality + 1) === '=') {\n\t\t\t\t\tinequalityString = target.substr(inequality, 2);\n\t\t\t\t} else {\n\t\t\t\t\tinequalityString = target.charAt(inequality);\n\t\t\t\t}\n\t\t\t\tconst targetParts = target.replace(/\\s/g, '').split(inequalityString);\n\t\t\t\tlet num;\n\t\t\t\tlet prop;\n\t\t\t\tconst directions: Direction[] = [];\n\t\t\t\tif (!isNaN(parseFloat(targetParts[0]))) {\n\t\t\t\t\t// e.g. 100 < bp\n\t\t\t\t\tnum = parseFloat(targetParts[0]);\n\t\t\t\t\tprop = targetParts[1];\n\t\t\t\t\tif (inequalityString.startsWith('>')) directions.push('less');\n\t\t\t\t\tif (inequalityString.startsWith('<')) directions.push('greater');\n\t\t\t\t} else if (!isNaN(parseFloat(targetParts[1]))) {\n\t\t\t\t\t// e.g. bp > 100\n\t\t\t\t\tnum = parseFloat(targetParts[1]);\n\t\t\t\t\tprop = targetParts[0];\n\t\t\t\t\tif (inequalityString.startsWith('<')) directions.push('less');\n\t\t\t\t\tif (inequalityString.startsWith('>')) directions.push('greater');\n\t\t\t\t} else {\n\t\t\t\t\treturn { error: `No value given to compare with '${target}'.` };\n\t\t\t\t}\n\t\t\t\tif (inequalityString.endsWith('=')) directions.push('equal');\n\t\t\t\tswitch (toID(prop)) {\n\t\t\t\tcase 'basepower': prop = 'basePower'; break;\n\t\t\t\tcase 'bp': prop = 'basePower'; break;\n\t\t\t\tcase 'power': prop = 'basePower'; break;\n\t\t\t\tcase 'acc': prop = 'accuracy'; break;\n\t\t\t\t}\n\t\t\t\tif (!allProperties.includes(prop)) return { error: `'${target}' did not contain a valid property.` };\n\t\t\t\tif (!orGroup.property[prop]) orGroup.property[prop] = Object.create(null);\n\t\t\t\tfor (const direction of directions) {\n\t\t\t\t\tif (orGroup.property[prop][direction]) return { error: `Invalid property range for ${prop}.` };\n\t\t\t\t\torGroup.property[prop][direction] = num;\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (target.substr(0, 8) === 'priority') {\n\t\t\t\tlet sign: Direction;\n\t\t\t\ttarget = target.substr(8).trim();\n\t\t\t\tif (target === \"+\" || target === \"\") {\n\t\t\t\t\tsign = 'greater';\n\t\t\t\t} else if (target === \"-\") {\n\t\t\t\t\tsign = 'less';\n\t\t\t\t} else {\n\t\t\t\t\treturn { error: `Priority type '${target}' not recognized.` };\n\t\t\t\t}\n\t\t\t\tif (orGroup.property['priority']) {\n\t\t\t\t\treturn { error: \"Priority cannot be set with both shorthand and inequality range.\" };\n\t\t\t\t} else {\n\t\t\t\t\torGroup.property['priority'] = Object.create(null);\n\t\t\t\t\torGroup.property['priority'][sign] = 0;\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (target.substr(0, 7) === 'boosts ' || target.substr(0, 7) === 'lowers ') {\n\t\t\t\tlet isBoost = true;\n\t\t\t\tif (target.substr(0, 7) === 'lowers ') {\n\t\t\t\t\tisBoost = false;\n\t\t\t\t}\n\t\t\t\tswitch (target.substr(7)) {\n\t\t\t\tcase 'attack': target = 'atk'; break;\n\t\t\t\tcase 'defense': target = 'def'; break;\n\t\t\t\tcase 'specialattack': target = 'spa'; break;\n\t\t\t\tcase 'spatk': target = 'spa'; break;\n\t\t\t\tcase 'specialdefense': target = 'spd'; break;\n\t\t\t\tcase 'spdef': target = 'spd'; break;\n\t\t\t\tcase 'speed': target = 'spe'; break;\n\t\t\t\tcase 'acc': target = 'accuracy'; break;\n\t\t\t\tcase 'evasiveness': target = 'evasion'; break;\n\t\t\t\tdefault: target = target.substr(7);\n\t\t\t\t}\n\t\t\t\tif (!allBoosts.includes(target)) return { error: `'${target}' is not a recognized stat.` };\n\t\t\t\tif (isBoost) {\n\t\t\t\t\tif ((orGroup.boost[target] && isNotSearch) || (orGroup.boost[target] === false && !isNotSearch)) {\n\t\t\t\t\t\treturn { error: 'A search cannot both exclude and include a stat boost.' };\n\t\t\t\t\t}\n\t\t\t\t\torGroup.boost[target] = !isNotSearch;\n\t\t\t\t} else {\n\t\t\t\t\tif ((orGroup.lower[target] && isNotSearch) || (orGroup.lower[target] === false && !isNotSearch)) {\n\t\t\t\t\t\treturn { error: 'A search cannot both exclude and include a stat boost.' };\n\t\t\t\t\t}\n\t\t\t\t\torGroup.lower[target] = !isNotSearch;\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (target.substr(0, 8) === 'zboosts ') {\n\t\t\t\tswitch (target.substr(8)) {\n\t\t\t\tcase 'attack': target = 'atk'; break;\n\t\t\t\tcase 'defense': target = 'def'; break;\n\t\t\t\tcase 'specialattack': target = 'spa'; break;\n\t\t\t\tcase 'spatk': target = 'spa'; break;\n\t\t\t\tcase 'specialdefense': target = 'spd'; break;\n\t\t\t\tcase 'spdef': target = 'spd'; break;\n\t\t\t\tcase 'speed': target = 'spe'; break;\n\t\t\t\tcase 'acc': target = 'accuracy'; break;\n\t\t\t\tcase 'evasiveness': target = 'evasion'; break;\n\t\t\t\tdefault: target = target.substr(8);\n\t\t\t\t}\n\t\t\t\tif (!allBoosts.includes(target)) return { error: `'${target}' is not a recognized stat.` };\n\t\t\t\tif ((orGroup.zboost[target] && isNotSearch) || (orGroup.zboost[target] === false && !isNotSearch)) {\n\t\t\t\t\treturn { error: 'A search cannot both exclude and include a stat boost.' };\n\t\t\t\t}\n\t\t\t\torGroup.zboost[target] = !isNotSearch;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst oldTarget = target;\n\t\t\tif (target.endsWith('s')) target = target.slice(0, -1);\n\t\t\tswitch (target) {\n\t\t\tcase 'toxic': target = 'tox'; break;\n\t\t\tcase 'poison': target = 'psn'; break;\n\t\t\tcase 'burn': target = 'brn'; break;\n\t\t\tcase 'paralyze': target = 'par'; break;\n\t\t\tcase 'freeze': target = 'frz'; break;\n\t\t\tcase 'sleep': target = 'slp'; break;\n\t\t\tcase 'confuse': target = 'confusion'; break;\n\t\t\tcase 'trap': target = 'partiallytrapped'; break;\n\t\t\tcase 'flinche': target = 'flinch'; break;\n\t\t\t}\n\n\t\t\tif (allStatus.includes(target)) {\n\t\t\t\tif ((orGroup.status[target] && isNotSearch) || (orGroup.status[target] === false && !isNotSearch)) {\n\t\t\t\t\treturn { error: 'A search cannot both exclude and include a status.' };\n\t\t\t\t}\n\t\t\t\torGroup.status[target] = !isNotSearch;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (allVolatileStatus.includes(target)) {\n\t\t\t\tif (\n\t\t\t\t\t(orGroup.volatileStatus[target] && isNotSearch) ||\n\t\t\t\t\t(orGroup.volatileStatus[target] === false && !isNotSearch)\n\t\t\t\t) {\n\t\t\t\t\treturn { error: 'A search cannot both exclude and include a volatile status.' };\n\t\t\t\t}\n\t\t\t\torGroup.volatileStatus[target] = !isNotSearch;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\treturn { error: `'${oldTarget}' could not be found in any of the search categories.` };\n\t\t}\n\t\tif (!orGroup.skip) {\n\t\t\tsearches.push(orGroup);\n\t\t}\n\t}\n\tif (showAll && !searches.length && !targetMons.length && !sort) {\n\t\treturn {\n\t\t\terror: \"No search parameters other than 'all' were found. Try '/help movesearch' for more information on this command.\",\n\t\t};\n\t}\n\n\t// Since we assume we have no target mons at first\n\t// then the valid moveset we can search is the set of all moves.\n\tconst validMoves = new Set(Object.keys(mod.data.Moves)) as Set<ID>;\n\tfor (const mon of targetMons) {\n\t\tconst species = mod.species.get(mon.name);\n\t\tconst lsetData = mod.species.getMovePool(species.id, !!nationalSearch);\n\t\t// This pokemon's learnset needs to be excluded, so we perform a difference operation\n\t\t// on the valid moveset and this pokemon's moveset.\n\t\tif (mon.shouldBeExcluded) {\n\t\t\tfor (const move of lsetData) {\n\t\t\t\tvalidMoves.delete(move);\n\t\t\t}\n\t\t} else {\n\t\t\t// This pokemon's learnset needs to be included, so we perform an intersection operation\n\t\t\t// on the valid moveset and this pokemon's moveset.\n\t\t\tfor (const move of validMoves) {\n\t\t\t\tif (!lsetData.has(move)) {\n\t\t\t\t\tvalidMoves.delete(move);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// At this point, we've trimmed down the valid moveset to be\n\t// the moves that are appropriate considering the requested pokemon.\n\tconst dex: { [moveid: string]: Move } = {};\n\tfor (const moveid of validMoves) {\n\t\tconst move = mod.moves.get(moveid);\n\t\tif (move.gen <= mod.gen) {\n\t\t\tif (\n\t\t\t\t(!nationalSearch && move.isNonstandard && move.isNonstandard !== \"Gigantamax\") ||\n\t\t\t\t(nationalSearch && move.isNonstandard && ![\"Gigantamax\", \"Past\", \"Unobtainable\"].includes(move.isNonstandard)) ||\n\t\t\t\t(move.isMax && mod.gen !== 8)\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t} else {\n\t\t\t\tdex[moveid] = move;\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (const alts of searches) {\n\t\tif (alts.skip) continue;\n\t\tfor (const moveid in dex) {\n\t\t\tconst move = dex[moveid];\n\t\t\tconst recoveryUndefined = alts.other.recovery === undefined;\n\t\t\tconst zrecoveryUndefined = alts.other.zrecovery === undefined;\n\t\t\tlet matched = false;\n\t\t\tif (Object.keys(alts.types).length) {\n\t\t\t\tif (alts.types[move.type]) continue;\n\t\t\t\tif (Object.values(alts.types).includes(false) && alts.types[move.type] !== false) continue;\n\t\t\t}\n\n\t\t\tif (Object.keys(alts.categories).length) {\n\t\t\t\tif (alts.categories[move.category]) continue;\n\t\t\t\tif (Object.values(alts.categories).includes(false) && alts.categories[move.category] !== false) continue;\n\t\t\t}\n\n\t\t\tif (Object.keys(alts.contestTypes).length) {\n\t\t\t\tif (alts.contestTypes[move.contestType || 'Cool']) continue;\n\t\t\t\tif (\n\t\t\t\t\tObject.values(alts.contestTypes).includes(false) &&\n\t\t\t\t\talts.contestTypes[move.contestType || 'Cool'] !== false\n\t\t\t\t) continue;\n\t\t\t}\n\n\t\t\tif (Object.keys(alts.targets).length) {\n\t\t\t\tif (alts.targets[move.target]) continue;\n\t\t\t\tif (Object.values(alts.targets).includes(false) && alts.targets[move.target] !== false) continue;\n\t\t\t}\n\n\t\t\tfor (const flag in alts.flags) {\n\t\t\t\tif (flag === 'secondary') {\n\t\t\t\t\tif (!(move.secondary || move.secondaries || move.hasSheerForce) === !alts.flags[flag]) {\n\t\t\t\t\t\tmatched = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} else if (flag === 'zmove') {\n\t\t\t\t\tif (!move.isZ === !alts.flags[flag]) {\n\t\t\t\t\t\tmatched = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} else if (flag === 'highcrit') {\n\t\t\t\t\tconst crit = move.willCrit || (move.critRatio && move.critRatio > 1);\n\t\t\t\t\tif (!crit === !alts.flags[flag]) {\n\t\t\t\t\t\tmatched = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} else if (flag === 'multihit') {\n\t\t\t\t\tif (!move.multihit === !alts.flags[flag]) {\n\t\t\t\t\t\tmatched = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} else if (flag === 'maxmove') {\n\t\t\t\t\tif (!(typeof move.isMax === 'boolean' && move.isMax) === !alts.flags[flag]) {\n\t\t\t\t\t\tmatched = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} else if (flag === 'gmaxmove') {\n\t\t\t\t\tif (!(typeof move.isMax === 'string') === !alts.flags[flag]) {\n\t\t\t\t\t\tmatched = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} else if (flag === 'protection') {\n\t\t\t\t\tif (!(move.stallingMove && move.id !== \"endure\") === !alts.flags[flag]) {\n\t\t\t\t\t\tmatched = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} else if (flag === 'ohko') {\n\t\t\t\t\tif (!move.ohko === !alts.flags[flag]) {\n\t\t\t\t\t\tmatched = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif ((flag in move.flags) === alts.flags[flag]) {\n\t\t\t\t\t\tif (flag === 'protect' && ['all', 'allyTeam', 'allySide', 'foeSide', 'self'].includes(move.target)) continue;\n\t\t\t\t\t\tmatched = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (matched) continue;\n\t\t\tif (Object.keys(alts.gens).length) {\n\t\t\t\tif (alts.gens[String(move.gen)]) continue;\n\t\t\t\tif (Object.values(alts.gens).includes(false) && alts.gens[String(move.gen)] !== false) continue;\n\t\t\t}\n\t\t\tif (!zrecoveryUndefined || !recoveryUndefined) {\n\t\t\t\tfor (const recoveryType in alts.other) {\n\t\t\t\t\tlet hasRecovery = false;\n\t\t\t\t\tif (recoveryType === \"recovery\") {\n\t\t\t\t\t\thasRecovery = !!move.drain || !!move.flags.heal;\n\t\t\t\t\t} else if (recoveryType === \"zrecovery\") {\n\t\t\t\t\t\thasRecovery = (move.zMove?.effect === 'heal');\n\t\t\t\t\t}\n\t\t\t\t\tif (hasRecovery === alts.other[recoveryType]) {\n\t\t\t\t\t\tmatched = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (matched) continue;\n\t\t\tif (alts.other.recoil !== undefined) {\n\t\t\t\tconst recoil = move.recoil || move.hasCrashDamage;\n\t\t\t\tif (recoil && alts.other.recoil || !(recoil || alts.other.recoil)) matched = true;\n\t\t\t}\n\t\t\tif (matched) continue;\n\t\t\tfor (const prop in alts.property) {\n\t\t\t\tif (typeof alts.property[prop].less === \"number\") {\n\t\t\t\t\tif (\n\t\t\t\t\t\tmove[prop as keyof Move] !== true &&\n\t\t\t\t\t\t(move[prop as keyof Move] as number) < alts.property[prop].less\n\t\t\t\t\t) {\n\t\t\t\t\t\tmatched = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (typeof alts.property[prop].greater === \"number\") {\n\t\t\t\t\tif ((move[prop as keyof Move] === true && move.category !== \"Status\") ||\n\t\t\t\t\t\tmove[prop as keyof Move] as number > alts.property[prop].greater) {\n\t\t\t\t\t\tmatched = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (typeof alts.property[prop].equal === \"number\") {\n\t\t\t\t\tif (move[prop as keyof Move] === alts.property[prop].equal) {\n\t\t\t\t\t\tmatched = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (matched) continue;\n\t\t\tfor (const boost in alts.boost) {\n\t\t\t\tif (move.boosts) {\n\t\t\t\t\tif ((move.boosts[boost as BoostID]! > 0) === alts.boost[boost]) {\n\t\t\t\t\t\tmatched = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} else if (move.secondary?.self?.boosts) {\n\t\t\t\t\tif ((move.secondary.self.boosts[boost as BoostID]! > 0) === alts.boost[boost]) {\n\t\t\t\t\t\tmatched = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} else if (move.selfBoost?.boosts) {\n\t\t\t\t\tif ((move.selfBoost.boosts[boost as BoostID]! > 0) === alts.boost[boost]) {\n\t\t\t\t\t\tmatched = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (matched) continue;\n\t\t\tfor (const lower in alts.lower) {\n\t\t\t\tif (move.boosts) {\n\t\t\t\t\tif ((move.boosts[lower as BoostID]! < 0) === alts.lower[lower]) {\n\t\t\t\t\t\tmatched = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} else if (move.secondary?.boosts) {\n\t\t\t\t\tif ((move.secondary.boosts[lower as BoostID]! < 0) === alts.lower[lower]) {\n\t\t\t\t\t\tmatched = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} else if (move.self?.boosts) {\n\t\t\t\t\tif ((move.self.boosts[lower as BoostID]! < 0) === alts.lower[lower]) {\n\t\t\t\t\t\tmatched = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (matched) continue;\n\t\t\tfor (const boost in alts.zboost) {\n\t\t\t\tconst zMove = move.zMove;\n\t\t\t\tif (zMove?.boost) {\n\t\t\t\t\tif ((zMove.boost[boost as BoostID]! > 0) === alts.zboost[boost]) {\n\t\t\t\t\t\tmatched = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (matched) continue;\n\n\t\t\tfor (const searchStatus in alts.status) {\n\t\t\t\tlet canStatus = !!(\n\t\t\t\t\tmove.status === searchStatus ||\n\t\t\t\t\t(move.secondaries?.some(entry => entry.status === searchStatus))\n\t\t\t\t);\n\t\t\t\tif (searchStatus === 'slp') {\n\t\t\t\t\tcanStatus = canStatus || moveid === 'yawn';\n\t\t\t\t}\n\t\t\t\tif (searchStatus === 'brn' || searchStatus === 'frz' || searchStatus === 'par') {\n\t\t\t\t\tcanStatus = canStatus || moveid === 'triattack';\n\t\t\t\t}\n\t\t\t\tif (canStatus === alts.status[searchStatus]) {\n\t\t\t\t\tmatched = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (matched) continue;\n\n\t\t\tfor (const searchStatus in alts.volatileStatus) {\n\t\t\t\tconst canStatus = !!(\n\t\t\t\t\t(move.secondary && move.secondary.volatileStatus === searchStatus) ||\n\t\t\t\t\t(move.secondaries?.some(entry => entry.volatileStatus === searchStatus)) ||\n\t\t\t\t\t(move.volatileStatus === searchStatus)\n\t\t\t\t);\n\t\t\t\tif (canStatus === alts.volatileStatus[searchStatus]) {\n\t\t\t\t\tmatched = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (matched) continue;\n\t\t\tif (alts.other.pivot !== undefined) {\n\t\t\t\tconst pivot = move.selfSwitch && move.id !== 'revivalblessing' && move.id !== 'batonpass';\n\t\t\t\tif (pivot && alts.other.pivot || !(pivot || alts.other.pivot)) matched = true;\n\t\t\t}\n\t\t\tif (matched) continue;\n\n\t\t\tdelete dex[moveid];\n\t\t}\n\t}\n\n\tlet results = [];\n\tfor (const move in dex) {\n\t\tresults.push(dex[move].name);\n\t}\n\n\tlet resultsStr = \"\";\n\tif (targetMons.length) {\n\t\tresultsStr += `<span style=\"color:#999999;\">Matching moves found in learnset(s) for</span> ${targetMons.map(mon => `${mon.shouldBeExcluded ? \"!\" : \"\"}${mon.name}`).join(', ')}:<br />`;\n\t} else {\n\t\tresultsStr += (message === \"\" ? message : `<span style=\"color:#999999;\">${Utils.escapeHTML(message)}:</span><br />`);\n\t}\n\tif (randomOutput && randomOutput < results.length) {\n\t\tresults = Utils.shuffle(results).slice(0, randomOutput);\n\t}\n\tif (results.length > 1) {\n\t\tresults.sort();\n\t\tif (sort) {\n\t\t\tconst prop = sort.slice(0, -1);\n\t\t\tconst direction = sort.slice(-1);\n\t\t\tUtils.sortBy(results, moveName => {\n\t\t\t\tlet moveProp = dex[toID(moveName)][prop as keyof Move] as number;\n\t\t\t\t// convert booleans to 0 or 1\n\t\t\t\tif (typeof moveProp === 'boolean') moveProp = moveProp ? 1 : 0;\n\t\t\t\treturn moveProp * (direction === '+' ? 1 : -1);\n\t\t\t});\n\t\t}\n\t\tlet notShown = 0;\n\t\tif (!showAll && results.length > MAX_RANDOM_RESULTS) {\n\t\t\tnotShown = results.length - RESULTS_MAX_LENGTH;\n\t\t\tresults = results.slice(0, RESULTS_MAX_LENGTH);\n\t\t}\n\t\tresultsStr += results.map(\n\t\t\tresult => `<a href=\"//${Config.routes.dex}/moves/${toID(result)}\" target=\"_blank\" class=\"subtle\" style=\"white-space:nowrap\">${result}</a>` +\n\t\t\t\t(sort ?\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-base-to-string\n\t\t\t\t\t` (${dex[toID(result)][sort.slice(0, -1) as keyof Move] === true ? '-' : dex[toID(result)][sort.slice(0, -1) as keyof Move]})` :\n\t\t\t\t\t'')\n\t\t).join(\", \");\n\t\tif (notShown) {\n\t\t\tresultsStr += `, and ${notShown} more. <span style=\"color:#999999;\">Redo the search with ', all' at the end to show all results.</span>`;\n\t\t}\n\t} else if (results.length === 1) {\n\t\treturn { dt: `${results[0]}${usedMod ? `,${usedMod}` : ''}` };\n\t} else {\n\t\tresultsStr += \"No moves found.\";\n\t}\n\tif (isTest) return { results, reply: resultsStr };\n\treturn { reply: resultsStr };\n}\n\nfunction runItemsearch(target: string, cmd: string, canAll: boolean, message: string) {\n\tlet showAll = false;\n\tlet maxGen = 0;\n\tlet gen = 0;\n\tlet randomOutput = 0;\n\n\tconst targetSplit = target.split(',');\n\tif (targetSplit[targetSplit.length - 1].trim() === 'all') {\n\t\tif (!canAll) return { error: \"A search ending in ', all' cannot be broadcast.\" };\n\t\tshowAll = true;\n\t\ttargetSplit.pop();\n\t}\n\n\tconst sanitizedTargets = [];\n\tfor (const index of targetSplit.keys()) {\n\t\tconst localTarget = targetSplit[index].trim();\n\t\tif (localTarget.startsWith('random') && cmd === 'randitem') {\n\t\t\trandomOutput = parseInt(localTarget.substr(6));\n\t\t} else {\n\t\t\tsanitizedTargets.push(localTarget);\n\t\t}\n\t}\n\ttarget = sanitizedTargets.join(',');\n\ttarget = target.toLowerCase().replace('-', ' ').replace(/[^a-z0-9.\\s/]/g, '');\n\tconst rawSearch = target.replace(/(max ?)?gen \\d/g, match => toID(match)).split(' ');\n\tconst searchedWords: string[] = [];\n\tlet foundItems: string[] = [];\n\n\t// Refine searched words\n\tfor (const [i, search] of rawSearch.entries()) {\n\t\tlet newWord = search.trim();\n\t\tif (newWord.substr(0, 6) === 'maxgen') {\n\t\t\tconst parsedGen = parseInt(newWord.substr(6));\n\t\t\tif (!isNaN(parsedGen)) {\n\t\t\t\tif (maxGen) return { error: \"You cannot specify 'maxgen' multiple times.\" };\n\t\t\t\tmaxGen = parsedGen;\n\t\t\t\tif (maxGen < 2 || maxGen > Dex.gen) return { error: \"Invalid generation\" };\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t} else if (newWord.substr(0, 3) === 'gen') {\n\t\t\tconst parsedGen = parseInt(newWord.substr(3));\n\t\t\tif (!isNaN(parsedGen)) {\n\t\t\t\tif (gen) return { error: \"You cannot specify 'gen' multiple times.\" };\n\t\t\t\tgen = parsedGen;\n\t\t\t\tif (gen < 2 || gen > Dex.gen) return { error: \"Invalid generation\" };\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\tif (isNaN(parseFloat(newWord))) newWord = newWord.replace('.', '');\n\t\tswitch (newWord) {\n\t\t// Words that don't really help identify item removed to speed up search\n\t\tcase 'a':\n\t\tcase 'an':\n\t\tcase 'is':\n\t\tcase 'it':\n\t\tcase 'its':\n\t\tcase 'the':\n\t\tcase 'that':\n\t\tcase 'which':\n\t\tcase 'user':\n\t\tcase 'holder':\n\t\tcase 'holders':\n\t\t\tnewWord = '';\n\t\t\tbreak;\n\t\t// replace variations of common words with standardized versions\n\t\tcase 'opponent': newWord = 'attacker'; break;\n\t\tcase 'flung': newWord = 'fling'; break;\n\t\tcase 'heal': case 'heals':\n\t\tcase 'recovers': newWord = 'restores'; break;\n\t\tcase 'boost':\n\t\tcase 'boosts': newWord = 'raises'; break;\n\t\tcase 'weakens': newWord = 'halves'; break;\n\t\tcase 'more': newWord = 'increases'; break;\n\t\tcase 'super':\n\t\t\tif (rawSearch[i + 1] === 'effective') {\n\t\t\t\tnewWord = 'supereffective';\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'special':\n\t\t\tif (rawSearch[i + 1] === 'defense') {\n\t\t\t\tnewWord = 'specialdefense';\n\t\t\t} else if (rawSearch[i + 1] === 'attack') {\n\t\t\t\tnewWord = 'specialattack';\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'spatk':\n\t\tcase 'spa':\n\t\t\tnewWord = 'specialattack';\n\t\t\tbreak;\n\t\tcase 'atk':\n\t\tcase 'attack':\n\t\t\tif (['sp', 'special'].includes(rawSearch[i - 1])) {\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\tnewWord = 'attack';\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'spd':\n\t\tcase 'spdef':\n\t\t\tnewWord = 'specialdefense';\n\t\t\tbreak;\n\t\tcase 'def':\n\t\tcase 'defense':\n\t\t\tif (['sp', 'special'].includes(rawSearch[i - 1])) {\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\tnewWord = 'defense';\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'burns': newWord = 'burn'; break;\n\t\tcase 'poisons': newWord = 'poison'; break;\n\t\tdefault:\n\t\t\tif (/x[\\d.]+/.test(newWord)) {\n\t\t\t\tnewWord = newWord.substr(1) + 'x';\n\t\t\t}\n\t\t}\n\t\tif (!newWord || searchedWords.includes(newWord)) continue;\n\t\tsearchedWords.push(newWord);\n\t}\n\n\tif (searchedWords.length === 0 && !gen && !maxGen && randomOutput === 0) {\n\t\treturn { error: \"No distinguishing words were used. Try a more specific search.\" };\n\t}\n\n\tconst dex = maxGen ? Dex.mod(`gen${maxGen}`) : Dex;\n\tif (searchedWords.includes('fling')) {\n\t\tlet basePower = 0;\n\t\tlet effect;\n\n\t\tfor (let word of searchedWords) {\n\t\t\tlet wordEff = \"\";\n\t\t\tswitch (word) {\n\t\t\tcase 'burn': case 'burns':\n\t\t\tcase 'brn': wordEff = 'brn'; break;\n\t\t\tcase 'paralyze': case 'paralyzes':\n\t\t\tcase 'par': wordEff = 'par'; break;\n\t\t\tcase 'poison': case 'poisons':\n\t\t\tcase 'psn': wordEff = 'psn'; break;\n\t\t\tcase 'toxic':\n\t\t\tcase 'tox': wordEff = 'tox'; break;\n\t\t\tcase 'flinches':\n\t\t\tcase 'flinch': wordEff = 'flinch'; break;\n\t\t\tcase 'badly': wordEff = 'tox'; break;\n\t\t\t}\n\t\t\tif (wordEff && effect) {\n\t\t\t\tif (!(wordEff === 'psn' && effect === 'tox')) return { error: \"Only specify fling effect once.\" };\n\t\t\t} else if (wordEff) {\n\t\t\t\teffect = wordEff;\n\t\t\t} else {\n\t\t\t\tif (word.substr(word.length - 2) === 'bp' && word.length > 2) word = word.substr(0, word.length - 2);\n\t\t\t\tif (Number.isInteger(Number(word))) {\n\t\t\t\t\tif (basePower) return { error: \"Only specify a number for base power once.\" };\n\t\t\t\t\tbasePower = parseInt(word);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const item of dex.items.all()) {\n\t\t\tif (!item.fling || (gen && item.gen !== gen) || (maxGen && item.gen <= maxGen)) continue;\n\n\t\t\tif (basePower && effect) {\n\t\t\t\tif (item.fling.basePower === basePower &&\n\t\t\t\t\t(item.fling.status === effect || item.fling.volatileStatus === effect)) foundItems.push(item.name);\n\t\t\t} else if (basePower) {\n\t\t\t\tif (item.fling.basePower === basePower) foundItems.push(item.name);\n\t\t\t} else {\n\t\t\t\tif (item.fling.status === effect || item.fling.volatileStatus === effect) foundItems.push(item.name);\n\t\t\t}\n\t\t}\n\t\tif (foundItems.length === 0) return { error: `No items inflict ${basePower}bp damage when used with Fling.` };\n\t} else if (target.search(/natural ?gift/i) >= 0) {\n\t\tlet basePower = 0;\n\t\tlet type = \"\";\n\n\t\tfor (let word of searchedWords) {\n\t\t\tif (word in dex.data.TypeChart) {\n\t\t\t\tif (type) return { error: \"Only specify natural gift type once.\" };\n\t\t\t\ttype = word.charAt(0).toUpperCase() + word.slice(1);\n\t\t\t} else {\n\t\t\t\tif (word.endsWith('bp') && word.length > 2) word = word.slice(0, -2);\n\t\t\t\tif (Number.isInteger(Number(word))) {\n\t\t\t\t\tif (basePower) return { error: \"Only specify a number for base power once.\" };\n\t\t\t\t\tbasePower = parseInt(word);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const item of dex.items.all()) {\n\t\t\tif (!item.isBerry || !item.naturalGift || (gen && item.gen !== gen) || (maxGen && item.gen <= maxGen)) continue;\n\n\t\t\tif (basePower && type) {\n\t\t\t\tif (item.naturalGift.basePower === basePower && item.naturalGift.type === type) foundItems.push(item.name);\n\t\t\t} else if (basePower) {\n\t\t\t\tif (item.naturalGift.basePower === basePower) foundItems.push(item.name);\n\t\t\t} else {\n\t\t\t\tif (item.naturalGift.type === type) foundItems.push(item.name);\n\t\t\t}\n\t\t}\n\t\tif (foundItems.length === 0) {\n\t\t\treturn { error: `No berries inflict ${basePower}bp damage when used with Natural Gift.` };\n\t\t}\n\t} else {\n\t\tlet bestMatched = 0;\n\t\tfor (const item of dex.items.all()) {\n\t\t\tlet matched = 0;\n\t\t\t// splits words in the description into a toID()-esk format except retaining / and . in numbers\n\t\t\tlet descWords = item.desc || '';\n\t\t\t// add more general quantifier words to descriptions\n\t\t\tif (/[1-9.]+x/.test(descWords)) descWords += ' increases';\n\t\t\tif (item.isBerry) descWords += ' berry';\n\t\t\tdescWords = descWords.replace(/super[-\\s]effective/g, 'supereffective');\n\t\t\tconst descWordsArray = descWords.toLowerCase()\n\t\t\t\t.replace('-', ' ')\n\t\t\t\t.replace(/[^a-z0-9\\s/]/g, '')\n\t\t\t\t.replace(/(\\D)\\./, (p0, p1) => p1).split(' ');\n\n\t\t\tfor (const word of searchedWords) {\n\t\t\t\tswitch (word) {\n\t\t\t\tcase 'specialattack':\n\t\t\t\t\tif (descWordsArray[descWordsArray.indexOf('sp') + 1] === 'atk') matched++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'specialdefense':\n\t\t\t\t\tif (descWordsArray[descWordsArray.indexOf('sp') + 1] === 'def') matched++;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tif (descWordsArray.includes(word)) matched++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (matched >= (searchedWords.length * 3 / 5) && (!maxGen || item.gen <= maxGen) && (!gen || item.gen === gen)) {\n\t\t\t\tif (matched === bestMatched) {\n\t\t\t\t\tfoundItems.push(item.name);\n\t\t\t\t} else if (matched > bestMatched) {\n\t\t\t\t\tfoundItems = [item.name];\n\t\t\t\t\tbestMatched = matched;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tlet resultsStr = (message === \"\" ? message : `<span style=\"color:#999999;\">${Utils.escapeHTML(message)}:</span><br />`);\n\tif (randomOutput !== 0) {\n\t\tconst randomItems = [];\n\t\tif (foundItems.length === 0) {\n\t\t\tfor (let i = 0; i < randomOutput; i++) {\n\t\t\t\trandomItems.push(dex.items.all()[Math.floor(Math.random() * dex.items.all().length)]);\n\t\t\t}\n\t\t} else {\n\t\t\tif (foundItems.length < randomOutput) {\n\t\t\t\trandomOutput = foundItems.length;\n\t\t\t}\n\t\t\tfor (let i = 0; i < randomOutput; i++) {\n\t\t\t\trandomItems.push(foundItems[Math.floor(Math.random() * foundItems.length)]);\n\t\t\t}\n\t\t}\n\t\tresultsStr += randomItems.map(\n\t\t\tresult => `<a href=\"//${Config.routes.dex}/items/${toID(result)}\" target=\"_blank\" class=\"subtle\" style=\"white-space:nowrap\"><psicon item=\"${result}\" style=\"vertical-align:-7px\" />${result}</a>`\n\t\t).join(\", \");\n\t\treturn { reply: resultsStr };\n\t}\n\n\tif (foundItems.length > 0) {\n\t\tfoundItems.sort();\n\t\tlet notShown = 0;\n\t\tif (!showAll && foundItems.length > RESULTS_MAX_LENGTH + 5) {\n\t\t\tnotShown = foundItems.length - RESULTS_MAX_LENGTH;\n\t\t\tfoundItems = foundItems.slice(0, RESULTS_MAX_LENGTH);\n\t\t}\n\t\tresultsStr += foundItems.map(\n\t\t\tresult => `<a href=\"//${Config.routes.dex}/items/${toID(result)}\" target=\"_blank\" class=\"subtle\" style=\"white-space:nowrap\"><psicon item=\"${result}\" style=\"vertical-align:-7px\" />${result}</a>`\n\t\t).join(\", \");\n\t\tif (notShown) {\n\t\t\tresultsStr += `, and ${notShown} more. <span style=\"color:#999999;\">Redo the search with ', all' at the end to show all results.</span>`;\n\t\t}\n\t} else {\n\t\tresultsStr += \"No items found. Try a more general search\";\n\t}\n\treturn { reply: resultsStr };\n}\n\nfunction runAbilitysearch(target: string, cmd: string, canAll: boolean, message: string) {\n\t// based heavily on runItemsearch()\n\tlet showAll = false;\n\tlet maxGen = 0;\n\tlet gen = 0;\n\tlet randomOutput = 0;\n\n\tconst targetSplit = target.split(',');\n\tif (targetSplit[targetSplit.length - 1].trim() === 'all') {\n\t\tif (!canAll) return { error: \"A search ending in ', all' cannot be broadcast.\" };\n\t\tshowAll = true;\n\t\ttargetSplit.pop();\n\t}\n\n\tconst sanitizedTargets = [];\n\tfor (const index of targetSplit.keys()) {\n\t\tconst localTarget = targetSplit[index].trim();\n\t\t// Check if the target contains \"random<digit>\".\n\t\tif (localTarget.startsWith('random') && cmd === 'randability') {\n\t\t\t// Validation for this is in the /randpoke command\n\t\t\trandomOutput = parseInt(localTarget.substr(6));\n\t\t} else {\n\t\t\tsanitizedTargets.push(localTarget);\n\t\t}\n\t}\n\ttarget = sanitizedTargets.join(',');\n\n\ttarget = target.toLowerCase().replace('-', ' ').replace(/[^a-z0-9.\\s/]/g, '');\n\tconst rawSearch = target.replace(/(max ?)?gen \\d/g, match => toID(match)).split(' ');\n\tconst searchedWords: string[] = [];\n\tlet foundAbilities: string[] = [];\n\n\tfor (const [i, search] of rawSearch.entries()) {\n\t\tlet newWord = search.trim();\n\t\tif (newWord.substr(0, 6) === 'maxgen') {\n\t\t\tconst parsedGen = parseInt(newWord.substr(6));\n\t\t\tif (parsedGen) {\n\t\t\t\tif (maxGen) return { error: \"You cannot specify 'maxgen' multiple times.\" };\n\t\t\t\tmaxGen = parsedGen;\n\t\t\t\tif (maxGen < 3 || maxGen > Dex.gen) return { error: \"Invalid generation\" };\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t} else if (newWord.substr(0, 3) === 'gen') {\n\t\t\tconst parsedGen = parseInt(newWord.substr(3));\n\t\t\tif (parsedGen) {\n\t\t\t\tif (gen) return { error: \"You cannot specify 'gen' multiple times.\" };\n\t\t\t\tgen = parsedGen;\n\t\t\t\tif (gen < 3 || gen > Dex.gen) return { error: \"Invalid generation\" };\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\tif (isNaN(parseFloat(newWord))) newWord = newWord.replace('.', '');\n\t\tswitch (newWord) {\n\t\t// remove extraneous words\n\t\tcase 'a':\n\t\tcase 'an':\n\t\tcase 'is':\n\t\tcase 'it':\n\t\tcase 'its':\n\t\tcase 'the':\n\t\tcase 'that':\n\t\tcase 'which':\n\t\tcase 'user':\n\t\t\tnewWord = '';\n\t\t\tbreak;\n\t\t// replace variations of common words with standardized versions\n\t\tcase 'opponent': newWord = 'attacker'; break;\n\t\tcase 'heal':\n\t\tcase 'heals':\n\t\tcase 'recovers': newWord = 'restores'; break;\n\t\tcase 'boost':\n\t\tcase 'boosts': newWord = 'raised'; break;\n\t\tcase 'super':\n\t\t\tif (rawSearch[i + 1] === 'effective') {\n\t\t\t\tnewWord = 'supereffective';\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'special':\n\t\t\tif (rawSearch[i + 1] === 'defense') {\n\t\t\t\tnewWord = 'specialdefense';\n\t\t\t} else if (rawSearch[i + 1] === 'attack') {\n\t\t\t\tnewWord = 'specialattack';\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'spd':\n\t\tcase 'spdef': newWord = 'specialdefense'; break;\n\t\tcase 'spa':\n\t\tcase 'spatk': newWord = 'specialattack'; break;\n\t\tcase 'atk': newWord = 'attack'; break;\n\t\tcase 'def': newWord = 'defense'; break;\n\t\tcase 'spe': newWord = 'speed'; break;\n\t\tcase 'burn':\n\t\tcase 'burns': newWord = 'burned'; break;\n\t\tcase 'poison':\n\t\tcase 'poisons': newWord = 'poisoned'; break;\n\t\tdefault:\n\t\t\tif (/x[\\d.]+/.test(newWord)) {\n\t\t\t\tnewWord = newWord.substr(1) + 'x';\n\t\t\t}\n\t\t}\n\t\tif (!newWord || searchedWords.includes(newWord)) continue;\n\t\tsearchedWords.push(newWord);\n\t}\n\n\tif (searchedWords.length === 0 && !gen && !maxGen && randomOutput === 0) {\n\t\treturn { error: \"No distinguishing words were used. Try a more specific search.\" };\n\t}\n\n\tlet bestMatched = 0;\n\tconst dex = maxGen ? Dex.mod(`gen${maxGen}`) : Dex;\n\tfor (const ability of dex.abilities.all()) {\n\t\tlet matched = 0;\n\t\t// splits words in the description into a toID()-esque format except retaining / and . in numbers\n\t\tlet descWords = ability.desc || ability.shortDesc || '';\n\t\t// add more general quantifier words to descriptions\n\t\tif (/[1-9.]+x/.test(descWords)) descWords += ' increases';\n\t\tdescWords = descWords.replace(/super[-\\s]effective/g, 'supereffective');\n\t\tconst descWordsArray = Chat.normalize(descWords).split(' ');\n\n\t\tfor (const word of searchedWords) {\n\t\t\tswitch (word) {\n\t\t\tcase 'specialattack':\n\t\t\t\tif (descWordsArray[descWordsArray.indexOf('special') + 1] === 'attack') matched++;\n\t\t\t\tbreak;\n\t\t\tcase 'specialdefense':\n\t\t\t\tif (descWordsArray[descWordsArray.indexOf('special') + 1] === 'defense') matched++;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tif (descWordsArray.includes(word)) matched++;\n\t\t\t}\n\t\t}\n\n\t\tif (matched >= (searchedWords.length * 3 / 5) && (!maxGen || ability.gen <= maxGen) && (!gen || ability.gen === gen)) {\n\t\t\tif (matched === bestMatched) {\n\t\t\t\tfoundAbilities.push(ability.name);\n\t\t\t} else if (matched > bestMatched) {\n\t\t\t\tfoundAbilities = [ability.name];\n\t\t\t\tbestMatched = matched;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (foundAbilities.length === 1) return { dt: foundAbilities[0] };\n\tlet resultsStr = (message === \"\" ? message : `<span style=\"color:#999999;\">${Utils.escapeHTML(message)}:</span><br />`);\n\n\tif (randomOutput !== 0) {\n\t\tconst randomAbilities = [];\n\t\t// If there are no results, we still want to return a random ability.\n\t\tif (foundAbilities.length === 0) {\n\t\t\t// Fetch <randomOutput> random abilities.\n\t\t\tfor (let i = 0; i < randomOutput; i++) {\n\t\t\t\trandomAbilities.push(Dex.abilities.all()[Math.floor(Math.random() * Dex.abilities.all().length)]);\n\t\t\t}\n\t\t} else {\n\t\t\t// Return <randomOutput> random abilities.\n\t\t\t// If there are less found abilities than the number of random abilities requested, return all found abilities.\n\t\t\tif (foundAbilities.length < randomOutput) {\n\t\t\t\trandomOutput = foundAbilities.length;\n\t\t\t}\n\t\t\tfor (let i = 0; i < randomOutput; i++) {\n\t\t\t\trandomAbilities.push(foundAbilities[Math.floor(Math.random() * foundAbilities.length)]);\n\t\t\t}\n\t\t}\n\t\tresultsStr += randomAbilities.map(\n\t\t\tresult => `<a href=\"//${Config.routes.dex}/abilities/${toID(result)}\" target=\"_blank\" class=\"subtle\" style=\"white-space:nowrap\">${result}</a>`\n\t\t).join(\", \");\n\t\treturn { reply: resultsStr };\n\t}\n\n\tif (foundAbilities.length > 0) {\n\t\tfoundAbilities.sort();\n\t\tlet notShown = 0;\n\t\tif (!showAll && foundAbilities.length > RESULTS_MAX_LENGTH + 5) {\n\t\t\tnotShown = foundAbilities.length - RESULTS_MAX_LENGTH;\n\t\t\tfoundAbilities = foundAbilities.slice(0, RESULTS_MAX_LENGTH);\n\t\t}\n\t\tresultsStr += foundAbilities.map(\n\t\t\tresult => `<a href=\"//${Config.routes.dex}/abilities/${toID(result)}\" target=\"_blank\" class=\"subtle\" style=\"white-space:nowrap\">${result}</a>`\n\t\t).join(\", \");\n\t\tif (notShown) {\n\t\t\tresultsStr += `, and ${notShown} more. <span style=\"color:#999999;\">Redo the search with ', all' at the end to show all results.</span>`;\n\t\t}\n\t} else {\n\t\tresultsStr += \"No abilities found. Try a more general search.\";\n\t}\n\treturn { reply: resultsStr };\n}\n\nfunction runLearn(target: string, cmd: string, canAll: boolean, formatid: string) {\n\tlet format: Format = Dex.formats.get(formatid);\n\tconst targets = target.split(',');\n\tlet formatName = format.name;\n\tlet minSourceGen = undefined;\n\tlet level = 100;\n\n\twhile (targets.length) {\n\t\tconst targetid = toID(targets[0]);\n\t\tif (targetid === 'pentagon') {\n\t\t\tif (format.effectType === 'Format') {\n\t\t\t\treturn { error: \"'pentagon' can't be used with formats.\" };\n\t\t\t}\n\t\t\tminSourceGen = 6;\n\t\t\ttargets.shift();\n\t\t\tcontinue;\n\t\t}\n\t\tif (targetid.startsWith('minsourcegen')) {\n\t\t\tif (format.effectType === 'Format') {\n\t\t\t\treturn { error: \"'min source gen' can't be used with formats.\" };\n\t\t\t}\n\t\t\tminSourceGen = parseInt(targetid.slice(12));\n\t\t\tif (isNaN(minSourceGen) || minSourceGen < 1) return { error: `Invalid min source gen \"${targetid.slice(12)}\"` };\n\t\t\ttargets.shift();\n\t\t\tcontinue;\n\t\t}\n\t\tif (targetid === 'level5') {\n\t\t\tlevel = 5;\n\t\t\ttargets.shift();\n\t\t\tcontinue;\n\t\t}\n\t\tbreak;\n\t}\n\tlet gen;\n\tif (format.effectType !== 'Format') {\n\t\tif (!(formatid in Dex.dexes)) {\n\t\t\t// can happen if you hotpatch formats without hotpatching chat\n\t\t\treturn { error: `\"${formatid}\" is not a supported format.` };\n\t\t}\n\t\tconst dex = Dex.mod(formatid);\n\t\tgen = dex.gen;\n\t\tformatName = `Gen ${gen}`;\n\t\tformat = new Dex.Format({ mod: formatid, effectType: 'Format', exists: true });\n\t\tconst ruleTable = dex.formats.getRuleTable(format);\n\t\tif (minSourceGen) {\n\t\t\tformatName += ` (Min Source Gen = ${minSourceGen})`;\n\t\t\truleTable.minSourceGen = minSourceGen;\n\t\t} else if (gen >= 9) {\n\t\t\truleTable.minSourceGen = gen;\n\t\t}\n\t} else {\n\t\tgen = Dex.forFormat(format).gen;\n\t}\n\tconst validator = TeamValidator.get(format);\n\n\tconst species = validator.dex.species.get(targets.shift());\n\tconst setSources = validator.allSources(species);\n\tconst set: Partial<PokemonSet> = {\n\t\tname: species.baseSpecies,\n\t\tspecies: species.name,\n\t\tlevel,\n\t};\n\tconst all = (cmd === 'learnall');\n\n\tif (!species.exists || species.id === 'missingno') {\n\t\treturn { error: `Pok\\u00e9mon '${species.id}' not found.` };\n\t}\n\n\tif (species.gen > gen) {\n\t\treturn { error: `${species.name} didn't exist yet in generation ${gen}.` };\n\t}\n\n\tif (!targets.length) {\n\t\treturn { error: \"You must specify at least one move.\" };\n\t}\n\n\tconst moveNames = [];\n\tfor (const arg of targets) {\n\t\tif (['ha', 'hidden', 'hiddenability'].includes(toID(arg))) {\n\t\t\tsetSources.isHidden = true;\n\t\t\tcontinue;\n\t\t}\n\t\tconst move = validator.dex.moves.get(arg);\n\t\tmoveNames.push(move.name);\n\t\tif (!move.exists) {\n\t\t\treturn { error: `Move '${move.id}' not found.` };\n\t\t}\n\t\tif (move.gen > gen) {\n\t\t\treturn { error: `${move.name} didn't exist yet in generation ${gen}.` };\n\t\t}\n\t}\n\n\tconst problems = validator.validateMoves(species, moveNames, setSources, set);\n\tif (setSources.sources.length) {\n\t\tsetSources.sources = setSources.sources.map(source => {\n\t\t\tif (source.charAt(1) !== 'E') return source;\n\t\t\tconst fathers = validator.findEggMoveFathers(source, species, setSources, true);\n\t\t\tif (!fathers) return '';\n\t\t\treturn source + ':' + fathers.join(',');\n\t\t}).filter(Boolean);\n\t\tif (!setSources.size()) {\n\t\t\tproblems.push(`${species.name} doesn't have a valid father for its egg moves (${setSources.limitedEggMoves!.join(', ')})`);\n\t\t}\n\t}\n\n\tlet buffer = `In ${formatName}, `;\n\tif (setSources.isHidden) {\n\t\tbuffer += `${species.abilities['H'] || 'HA'} `;\n\t}\n\tbuffer += `${species.name}` + (problems.length ? ` <span class=\"message-learn-cannotlearn\">can't</span> learn ` : ` <span class=\"message-learn-canlearn\">can</span> learn `) + toListString(moveNames);\n\tif (!problems.length) {\n\t\tconst sourceNames: { [k: string]: string } = {\n\t\t\t'7V': \"virtual console transfer from gen 1-2\", '8V': \"Pokémon Home transfer from LGPE\", E: \"\", S: \"event\", D: \"dream world\", X: \"traded-back \", Y: \"traded-back event\",\n\t\t};\n\t\tconst sourcesBefore = setSources.sourcesBefore;\n\t\tlet sources = setSources.sources;\n\t\tif (sources.length || sourcesBefore < gen) buffer += \" only when obtained\";\n\t\tbuffer += \" from:<ul class=\\\"message-learn-list\\\">\";\n\t\tif (sources.length) {\n\t\t\tsources = sources.map(source => {\n\t\t\t\tif (source.startsWith('1ET')) {\n\t\t\t\t\treturn '2X' + source.slice(3);\n\t\t\t\t}\n\t\t\t\tif (source.startsWith('1ST')) {\n\t\t\t\t\treturn '2Y' + source.slice(3);\n\t\t\t\t}\n\t\t\t\treturn source;\n\t\t\t}).sort();\n\t\t\tfor (let source of sources) {\n\t\t\t\tbuffer += `<li>Gen ${source.charAt(0)} ${sourceNames[source] || sourceNames[source.charAt(1)]}`;\n\n\t\t\t\tif (source.charAt(1) === 'E') {\n\t\t\t\t\tlet fathers;\n\t\t\t\t\t[source, fathers] = source.split(':');\n\t\t\t\t\tfathers = fathers.split(',');\n\t\t\t\t\tif (fathers.length > 4 && !all) fathers = fathers.slice(-4).concat('...');\n\t\t\t\t\tif (source.length > 2) {\n\t\t\t\t\t\tbuffer += `${source.slice(2)} `;\n\t\t\t\t\t}\n\t\t\t\t\tbuffer += `egg`;\n\t\t\t\t\tif (!fathers[0]) {\n\t\t\t\t\t\tbuffer += `: chainbreed`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbuffer += `: breed ${fathers.join(', ')}`;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (source.startsWith('5E') && species.maleOnlyHidden) {\n\t\t\t\t\tbuffer += \" (no hidden ability)\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (sourcesBefore) {\n\t\t\tconst sourceGen = sourcesBefore < gen ? `Gen ${sourcesBefore} or earlier` : `anywhere`;\n\t\t\tif (moveNames.length === 1) {\n\t\t\t\tif (sourcesBefore >= 8) {\n\t\t\t\t\tbuffer += `<li>${sourceGen} (move is level-up/tutor/TM/HM/egg in Gen ${sourcesBefore})`;\n\t\t\t\t} else {\n\t\t\t\t\tbuffer += `<li>${sourceGen} (move is level-up/tutor/TM/HM in Gen ${sourcesBefore})`;\n\t\t\t\t}\n\t\t\t} else if (gen >= 8) {\n\t\t\t\tconst orEarlier = sourcesBefore < gen ? ` or level-up/tutor/TM/HM in Gen ${sourcesBefore}${\n\t\t\t\t\tsourcesBefore < 7 ? \" to 7\" : \"\"\n\t\t\t\t}` : ``;\n\t\t\t\tbuffer += `<li>${sourceGen} (all moves are level-up/tutor/TM/HM/egg in Gen ${sourcesBefore}${orEarlier})`;\n\t\t\t} else {\n\t\t\t\tbuffer += `<li>${sourceGen} (all moves are level-up/tutor/TM/HM in Gen ${Math.min(gen, sourcesBefore)}${sourcesBefore < gen ? ` to ${gen}` : \"\"})`;\n\t\t\t}\n\t\t}\n\t\tif (setSources.babyOnly && sourcesBefore) {\n\t\t\tbuffer += `<li>must be obtained as ` + Dex.species.get(setSources.babyOnly).name;\n\t\t}\n\t\tbuffer += \"</ul>\";\n\t} else if (problems.length >= 1) {\n\t\tconst expectedError = `${species.name} can't learn ${moveNames[0]}.`;\n\t\tif (problems.length > 1 || moveNames.length > 1 || problems[0] !== expectedError) {\n\t\t\tbuffer += ` because:<ul class=\"message-learn-list\">`;\n\t\t\tbuffer += `<li>` + problems.join(`</li><li>`) + `</li>`;\n\t\t\tbuffer += `</ul>`;\n\t\t}\n\t}\n\treturn { reply: buffer };\n}\n\nfunction runSearch(query: { target: string, cmd: string, canAll: boolean, message: string }, user?: User) {\n\tif (user) {\n\t\tif (user.lastCommand.startsWith('/datasearch ')) {\n\t\t\tthrow new Chat.ErrorMessage(\n\t\t\t\t`You already have a datasearch query pending. Wait until it's complete before running another.`\n\t\t\t);\n\t\t}\n\t\tuser.lastCommand = `/datasearch ${query.cmd}`;\n\t}\n\treturn PM.query(query).finally(() => {\n\t\tif (user) {\n\t\t\tuser.lastCommand = '';\n\t\t}\n\t});\n}\n\nfunction runRandtype(target: string, cmd: string, canAll: boolean, message: string) {\n\tconst icon: any = {};\n\tfor (const type of Dex.types.names()) {\n\t\ticon[type] = `<img src=\"https://${Config.routes.client}/sprites/types/${type}.png\" width=\"32\" height=\"14\">`;\n\t}\n\tlet randomOutput = 0;\n\ttarget = target.trim();\n\tconst targetSplit = target.split(',');\n\tfor (const index of targetSplit.keys()) {\n\t\tconst local_target = targetSplit[index].trim();\n\t\t// Check if the target contains \"random<digit>\".\n\t\tif (local_target.startsWith('random') && cmd === 'randtype') {\n\t\t\t// Validation for this is in the /randpoke command\n\t\t\trandomOutput = parseInt(local_target.substr(6));\n\t\t}\n\t}\n\tconst randTypes = [];\n\tfor (let i = 0; i < randomOutput; i++) {\n\t\t// Add a random type to the output.\n\t\trandTypes.push(Dex.types.names()[Math.floor(Math.random() * Dex.types.names().length)]);\n\t}\n\tlet resultsStr = (message === \"\" ? message : `<span style=\"color:#999999;\">${Utils.escapeHTML(message)}:</span><br />`);\n\tresultsStr += randTypes.map(\n\t\ttype => icon[type]\n\t).join(' ');\n\treturn { reply: resultsStr };\n}\n\n/*********************************************************\n * Process manager\n *********************************************************/\n\nexport const PM = new ProcessManager.QueryProcessManager<AnyObject, AnyObject>(module, query => {\n\ttry {\n\t\tif (Config.debugdexsearchprocesses && process.send) {\n\t\t\tprocess.send('DEBUG\\n' + JSON.stringify(query));\n\t\t}\n\t\tswitch (query.cmd) {\n\t\tcase 'randpoke':\n\t\tcase 'dexsearch':\n\t\t\treturn runDexsearch(query.target, query.cmd, query.canAll, query.message, false);\n\t\tcase 'randmove':\n\t\tcase 'movesearch':\n\t\t\treturn runMovesearch(query.target, query.cmd, query.canAll, query.message, false);\n\t\tcase 'randitem':\n\t\tcase 'itemsearch':\n\t\t\treturn runItemsearch(query.target, query.cmd, query.canAll, query.message);\n\t\tcase 'randability':\n\t\tcase 'abilitysearch':\n\t\t\treturn runAbilitysearch(query.target, query.cmd, query.canAll, query.message);\n\t\tcase 'learn':\n\t\t\treturn runLearn(query.target, query.cmd, query.canAll, query.message);\n\t\tcase 'randtype':\n\t\t\treturn runRandtype(query.target, query.cmd, query.canAll, query.message);\n\t\tdefault:\n\t\t\tthrow new Error(`Unrecognized Dexsearch command \"${query.cmd}\"`);\n\t\t}\n\t} catch (err) {\n\t\tMonitor.crashlog(err, 'A search query', query);\n\t}\n\treturn {\n\t\terror: \"Sorry! Our search engine crashed on your query. We've been automatically notified and will fix this crash.\",\n\t};\n});\n\nif (!PM.isParentProcess) {\n\t// This is a child process!\n\tglobal.Config = require('../config-loader').Config;\n\tglobal.Monitor = {\n\t\tcrashlog(error: Error, source = 'A datasearch process', details: AnyObject | null = null) {\n\t\t\tconst repr = JSON.stringify([error.name, error.message, source, details]);\n\t\t\tprocess.send!(`THROW\\n@!!@${repr}\\n${error.stack}`);\n\t\t},\n\t} as any;\n\tif (Config.crashguard) {\n\t\tprocess.on('uncaughtException', err => {\n\t\t\tMonitor.crashlog(err, 'A dexsearch process');\n\t\t});\n\t}\n\n\tglobal.Dex = require('../../sim/dex').Dex;\n\tglobal.toID = Dex.toID;\n\tDex.includeData();\n\n\t// eslint-disable-next-line no-eval\n\trequire('../../lib/repl').Repl.start('dexsearch', (cmd: string) => eval(cmd));\n} else {\n\tPM.spawn(MAX_PROCESSES);\n}\n\nexport const testables = {\n\trunAbilitysearch: (target: string, cmd: string, canAll: boolean, message: string) =>\n\t\trunAbilitysearch(target, cmd, canAll, message),\n\trunDexsearch: (target: string, cmd: string, canAll: boolean, message: string) =>\n\t\trunDexsearch(target, cmd, canAll, message, true),\n\trunMovesearch: (target: string, cmd: string, canAll: boolean, message: string) =>\n\t\trunMovesearch(target, cmd, canAll, message, true),\n};\n"], | |
"mappings": "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", | |
"names": ["cmd", "stat"] | |
} | |