"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var teams_exports = {}; __export(teams_exports, { Teams: () => Teams, default: () => teams_default }); module.exports = __toCommonJS(teams_exports); var import_dex = require("./dex"); /** * Teams * Pokemon Showdown - http://pokemonshowdown.com/ * * Functions for converting and generating teams. * * @license MIT */ const Teams = new class Teams2 { pack(team) { if (!team) return ""; function getIv(ivs, s) { return ivs[s] === 31 || ivs[s] === void 0 ? "" : ivs[s].toString(); } let buf = ""; for (const set of team) { if (buf) buf += "]"; buf += set.name || set.species; const id = this.packName(set.species || set.name); buf += `|${this.packName(set.name || set.species) === id ? "" : id}`; buf += `|${this.packName(set.item)}`; buf += `|${this.packName(set.ability)}`; buf += "|" + set.moves.map(this.packName).join(","); buf += `|${set.nature || ""}`; let evs = "|"; if (set.evs) { evs = `|${set.evs["hp"] || ""},${set.evs["atk"] || ""},${set.evs["def"] || ""},${set.evs["spa"] || ""},${set.evs["spd"] || ""},${set.evs["spe"] || ""}`; } if (evs === "|,,,,,") { buf += "|"; } else { buf += evs; } if (set.gender) { buf += `|${set.gender}`; } else { buf += "|"; } let ivs = "|"; if (set.ivs) { ivs = `|${getIv(set.ivs, "hp")},${getIv(set.ivs, "atk")},${getIv(set.ivs, "def")},${getIv(set.ivs, "spa")},${getIv(set.ivs, "spd")},${getIv(set.ivs, "spe")}`; } if (ivs === "|,,,,,") { buf += "|"; } else { buf += ivs; } if (set.shiny) { buf += "|S"; } else { buf += "|"; } if (set.level && set.level !== 100) { buf += `|${set.level}`; } else { buf += "|"; } if (set.happiness !== void 0 && set.happiness !== 255) { buf += `|${set.happiness}`; } else { buf += "|"; } if (set.pokeball || set.hpType || set.gigantamax || set.dynamaxLevel !== void 0 && set.dynamaxLevel !== 10 || set.teraType) { buf += `,${set.hpType || ""}`; buf += `,${this.packName(set.pokeball || "")}`; buf += `,${set.gigantamax ? "G" : ""}`; buf += `,${set.dynamaxLevel !== void 0 && set.dynamaxLevel !== 10 ? set.dynamaxLevel : ""}`; buf += `,${set.teraType || ""}`; } } return buf; } unpack(buf) { if (!buf) return null; if (typeof buf !== "string") return buf; if (buf.startsWith("[") && buf.endsWith("]")) { try { buf = this.pack(JSON.parse(buf)); } catch { return null; } } const team = []; let i = 0; let j = 0; for (let count = 0; count < 24; count++) { const set = {}; team.push(set); j = buf.indexOf("|", i); if (j < 0) return null; set.name = buf.substring(i, j); i = j + 1; j = buf.indexOf("|", i); if (j < 0) return null; set.species = this.unpackName(buf.substring(i, j), import_dex.Dex.species) || set.name; i = j + 1; j = buf.indexOf("|", i); if (j < 0) return null; set.item = this.unpackName(buf.substring(i, j), import_dex.Dex.items); i = j + 1; j = buf.indexOf("|", i); if (j < 0) return null; const ability = buf.substring(i, j); const species = import_dex.Dex.species.get(set.species); set.ability = ["", "0", "1", "H", "S"].includes(ability) ? species.abilities[ability || "0"] || (ability === "" ? "" : "!!!ERROR!!!") : this.unpackName(ability, import_dex.Dex.abilities); i = j + 1; j = buf.indexOf("|", i); if (j < 0) return null; set.moves = buf.substring(i, j).split(",", 24).map((name) => this.unpackName(name, import_dex.Dex.moves)); i = j + 1; j = buf.indexOf("|", i); if (j < 0) return null; set.nature = this.unpackName(buf.substring(i, j), import_dex.Dex.natures); i = j + 1; j = buf.indexOf("|", i); if (j < 0) return null; if (j !== i) { const evs = buf.substring(i, j).split(",", 6); set.evs = { hp: Number(evs[0]) || 0, atk: Number(evs[1]) || 0, def: Number(evs[2]) || 0, spa: Number(evs[3]) || 0, spd: Number(evs[4]) || 0, spe: Number(evs[5]) || 0 }; } i = j + 1; j = buf.indexOf("|", i); if (j < 0) return null; if (i !== j) set.gender = buf.substring(i, j); i = j + 1; j = buf.indexOf("|", i); if (j < 0) return null; if (j !== i) { const ivs = buf.substring(i, j).split(",", 6); set.ivs = { hp: ivs[0] === "" ? 31 : Number(ivs[0]) || 0, atk: ivs[1] === "" ? 31 : Number(ivs[1]) || 0, def: ivs[2] === "" ? 31 : Number(ivs[2]) || 0, spa: ivs[3] === "" ? 31 : Number(ivs[3]) || 0, spd: ivs[4] === "" ? 31 : Number(ivs[4]) || 0, spe: ivs[5] === "" ? 31 : Number(ivs[5]) || 0 }; } i = j + 1; j = buf.indexOf("|", i); if (j < 0) return null; if (i !== j) set.shiny = true; i = j + 1; j = buf.indexOf("|", i); if (j < 0) return null; if (i !== j) set.level = parseInt(buf.substring(i, j)); i = j + 1; j = buf.indexOf("]", i); let misc; if (j < 0) { if (i < buf.length) misc = buf.substring(i).split(",", 6); } else { if (i !== j) misc = buf.substring(i, j).split(",", 6); } if (misc) { set.happiness = misc[0] ? Number(misc[0]) : 255; set.hpType = misc[1] || ""; set.pokeball = this.unpackName(misc[2] || "", import_dex.Dex.items); set.gigantamax = !!misc[3]; set.dynamaxLevel = misc[4] ? Number(misc[4]) : 10; set.teraType = misc[5]; } if (j < 0) break; i = j + 1; } return team; } /** Very similar to toID but without the lowercase conversion */ packName(name) { if (!name) return ""; return name.replace(/[^A-Za-z0-9]+/g, ""); } /** Will not entirely recover a packed name, but will be a pretty readable guess */ unpackName(name, dexTable) { if (!name) return ""; if (dexTable) { const obj = dexTable.get(name); if (obj.exists) return obj.name; } return name.replace(/([0-9]+)/g, " $1 ").replace(/([A-Z])/g, " $1").replace(/[ ][ ]/g, " ").trim(); } /** * Exports a team in human-readable PS export format */ export(team, options) { let output = ""; for (const set of team) { output += this.exportSet(set, options) + ` `; } return output; } exportSet(set, { hideStats } = {}) { let out = ``; if (set.name && set.name !== set.species) { out += `${set.name} (${set.species})`; } else { out += set.species; } if (set.gender === "M") out += ` (M)`; if (set.gender === "F") out += ` (F)`; if (set.item) out += ` @ ${set.item}`; out += ` `; if (set.ability) { out += `Ability: ${set.ability} `; } if (set.level && set.level !== 100) { out += `Level: ${set.level} `; } if (set.shiny) { out += `Shiny: Yes `; } if (typeof set.happiness === "number" && set.happiness !== 255 && !isNaN(set.happiness)) { out += `Happiness: ${set.happiness} `; } if (set.pokeball) { out += `Pokeball: ${set.pokeball} `; } if (set.hpType) { out += `Hidden Power: ${set.hpType} `; } if (typeof set.dynamaxLevel === "number" && set.dynamaxLevel !== 10 && !isNaN(set.dynamaxLevel)) { out += `Dynamax Level: ${set.dynamaxLevel} `; } if (set.gigantamax) { out += `Gigantamax: Yes `; } if (set.teraType) { out += `Tera Type: ${set.teraType} `; } if (!hideStats) { if (set.evs) { const stats = import_dex.Dex.stats.ids().map( (stat) => set.evs[stat] ? `${set.evs[stat]} ${import_dex.Dex.stats.shortNames[stat]}` : `` ).filter(Boolean); if (stats.length) { out += `EVs: ${stats.join(" / ")} `; } } if (set.nature) { out += `${set.nature} Nature `; } if (set.ivs) { const stats = import_dex.Dex.stats.ids().map( (stat) => set.ivs[stat] !== 31 && set.ivs[stat] !== void 0 ? `${set.ivs[stat] || 0} ${import_dex.Dex.stats.shortNames[stat]}` : `` ).filter(Boolean); if (stats.length) { out += `IVs: ${stats.join(" / ")} `; } } } for (let move of set.moves) { if (move.startsWith(`Hidden Power `) && move.charAt(13) !== "[") { move = `Hidden Power [${move.slice(13)}]`; } out += `- ${move} `; } return out; } parseExportedTeamLine(line, isFirstLine, set, aggressive) { if (isFirstLine) { let item; [line, item] = line.split(" @ "); if (item) { set.item = item; if ((0, import_dex.toID)(set.item) === "noitem") set.item = ""; } if (line.endsWith(" (M)")) { set.gender = "M"; line = line.slice(0, -4); } if (line.endsWith(" (F)")) { set.gender = "F"; line = line.slice(0, -4); } if (line.endsWith(")") && line.includes("(")) { const [name, species] = line.slice(0, -1).split("("); set.species = import_dex.Dex.species.get(species).name; set.name = name.trim(); } else { set.species = import_dex.Dex.species.get(line).name; set.name = ""; } } else if (line.startsWith("Trait: ")) { line = line.slice(7); set.ability = aggressive ? (0, import_dex.toID)(line) : line; } else if (line.startsWith("Ability: ")) { line = line.slice(9); set.ability = aggressive ? (0, import_dex.toID)(line) : line; } else if (line === "Shiny: Yes") { set.shiny = true; } else if (line.startsWith("Level: ")) { line = line.slice(7); set.level = +line; } else if (line.startsWith("Happiness: ")) { line = line.slice(11); set.happiness = +line; } else if (line.startsWith("Pokeball: ")) { line = line.slice(10); set.pokeball = aggressive ? (0, import_dex.toID)(line) : line; } else if (line.startsWith("Hidden Power: ")) { line = line.slice(14); set.hpType = aggressive ? (0, import_dex.toID)(line) : line; } else if (line.startsWith("Tera Type: ")) { line = line.slice(11); set.teraType = aggressive ? line.replace(/[^a-zA-Z0-9]/g, "") : line; } else if (line === "Gigantamax: Yes") { set.gigantamax = true; } else if (line.startsWith("EVs: ")) { line = line.slice(5); const evLines = line.split("/"); set.evs = { hp: 0, atk: 0, def: 0, spa: 0, spd: 0, spe: 0 }; for (const evLine of evLines) { const [statValue, statName] = evLine.trim().split(" "); const statid = import_dex.Dex.stats.getID(statName); if (!statid) continue; const value = parseInt(statValue); set.evs[statid] = value; } } else if (line.startsWith("IVs: ")) { line = line.slice(5); const ivLines = line.split("/"); set.ivs = { hp: 31, atk: 31, def: 31, spa: 31, spd: 31, spe: 31 }; for (const ivLine of ivLines) { const [statValue, statName] = ivLine.trim().split(" "); const statid = import_dex.Dex.stats.getID(statName); if (!statid) continue; let value = parseInt(statValue); if (isNaN(value)) value = 31; set.ivs[statid] = value; } } else if (/^[A-Za-z]+ (N|n)ature/.test(line)) { let natureIndex = line.indexOf(" Nature"); if (natureIndex === -1) natureIndex = line.indexOf(" nature"); if (natureIndex === -1) return; line = line.substr(0, natureIndex); if (line !== "undefined") set.nature = aggressive ? (0, import_dex.toID)(line) : line; } else if (line.startsWith("-") || line.startsWith("~")) { line = line.slice(line.charAt(1) === " " ? 2 : 1); if (line.startsWith("Hidden Power [")) { const hpType = line.slice(14, -1); line = "Hidden Power " + hpType; if (!set.ivs && import_dex.Dex.types.isName(hpType)) { set.ivs = { hp: 31, atk: 31, def: 31, spa: 31, spd: 31, spe: 31 }; const hpIVs = import_dex.Dex.types.get(hpType).HPivs || {}; for (const statid in hpIVs) { set.ivs[statid] = hpIVs[statid]; } } } if (line === "Frustration" && set.happiness === void 0) { set.happiness = 0; } set.moves.push(line); } } /** Accepts a team in any format (JSON, packed, or exported) */ import(buffer, aggressive) { const sanitize = aggressive ? import_dex.toID : import_dex.Dex.getName; if (buffer.startsWith("[")) { try { const team = JSON.parse(buffer); if (!Array.isArray(team)) throw new Error(`Team should be an Array but isn't`); for (const set of team) { set.name = sanitize(set.name); set.species = sanitize(set.species); set.item = sanitize(set.item); set.ability = sanitize(set.ability); set.gender = sanitize(set.gender); set.nature = sanitize(set.nature); const evs = { hp: 0, atk: 0, def: 0, spa: 0, spd: 0, spe: 0 }; if (set.evs) { for (const statid in evs) { if (typeof set.evs[statid] === "number") evs[statid] = set.evs[statid]; } } set.evs = evs; const ivs = { hp: 31, atk: 31, def: 31, spa: 31, spd: 31, spe: 31 }; if (set.ivs) { for (const statid in ivs) { if (typeof set.ivs[statid] === "number") ivs[statid] = set.ivs[statid]; } } set.ivs = ivs; if (!Array.isArray(set.moves)) { set.moves = []; } else { set.moves = set.moves.map(sanitize); } } return team; } catch { } } const lines = buffer.split("\n"); const sets = []; let curSet = null; while (lines.length && !lines[0]) lines.shift(); while (lines.length && !lines[lines.length - 1]) lines.pop(); if (lines.length === 1 && lines[0].includes("|")) { return this.unpack(lines[0]); } for (let line of lines) { line = line.trim(); if (line === "" || line === "---") { curSet = null; } else if (line.startsWith("===")) { } else if (!curSet) { curSet = { name: "", species: "", item: "", ability: "", gender: "", nature: "", evs: { hp: 0, atk: 0, def: 0, spa: 0, spd: 0, spe: 0 }, ivs: { hp: 31, atk: 31, def: 31, spa: 31, spd: 31, spe: 31 }, level: 100, moves: [] }; sets.push(curSet); this.parseExportedTeamLine(line, true, curSet, aggressive); } else { this.parseExportedTeamLine(line, false, curSet, aggressive); } } return sets; } getGenerator(format, seed = null) { let TeamGenerator; format = import_dex.Dex.formats.get(format); const formatID = (0, import_dex.toID)(format); if (formatID.includes("gen9computergeneratedteams")) { TeamGenerator = require(import_dex.Dex.forFormat(format).dataDir + "/cg-teams").default; } else if (formatID.includes("gen9superstaffbrosultimate")) { TeamGenerator = require("../data/mods/gen9ssb/random-teams").default; } else if (formatID.includes("gen9babyrandombattle")) { TeamGenerator = require("../data/random-battles/gen9baby/teams").default; } else if (formatID.includes("gen9randombattle") && format.ruleTable?.has("+pokemontag:cap")) { TeamGenerator = require("../data/random-battles/gen9cap/teams").default; } else { TeamGenerator = require(`../data/random-battles/${format.mod}/teams`).default; } return new TeamGenerator(format, seed); } generate(format, options = null) { return this.getGenerator(format, options?.seed).getTeam(options); } }(); var teams_default = Teams; //# sourceMappingURL=teams.js.map