|
"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"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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; |
|
} |
|
|
|
packName(name) { |
|
if (!name) |
|
return ""; |
|
return name.replace(/[^A-Za-z0-9]+/g, ""); |
|
} |
|
|
|
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(); |
|
} |
|
|
|
|
|
|
|
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); |
|
} |
|
} |
|
|
|
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; |
|
|
|
|