Spaces:
Paused
Paused
| ; | |
| var __create = Object.create; | |
| var __defProp = Object.defineProperty; | |
| var __getOwnPropDesc = Object.getOwnPropertyDescriptor; | |
| var __getOwnPropNames = Object.getOwnPropertyNames; | |
| var __getProtoOf = Object.getPrototypeOf; | |
| 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 __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( | |
| // If the importer is in node compatibility mode or this is not an ESM | |
| // file that has been converted to a CommonJS file using a Babel- | |
| // compatible transform (i.e. "__esModule" has not been set), then set | |
| // "default" to the CommonJS "module.exports" for node compatibility. | |
| isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, | |
| mod | |
| )); | |
| var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); | |
| var teams_exports = {}; | |
| __export(teams_exports, { | |
| RandomGen1Teams: () => RandomGen1Teams, | |
| default: () => teams_default | |
| }); | |
| module.exports = __toCommonJS(teams_exports); | |
| var import_teams = __toESM(require("../gen2/teams")); | |
| var import_lib = require("../../../lib"); | |
| class RandomGen1Teams extends import_teams.default { | |
| constructor() { | |
| super(...arguments); | |
| this.randomData = require("./data.json"); | |
| } | |
| // Challenge Cup or CC teams are basically fully random teams. | |
| randomCCTeam() { | |
| this.enforceNoDirectCustomBanlistChanges(); | |
| const team = []; | |
| const randomN = this.randomNPokemon(this.maxTeamSize, this.forceMonotype); | |
| for (const pokemon of randomN) { | |
| const species = this.dex.species.get(pokemon); | |
| const mbstmin = 1307; | |
| const stats = species.baseStats; | |
| let mbst = stats["hp"] * 2 + 30 + 63 + 100 + 10; | |
| mbst += stats["atk"] * 2 + 30 + 63 + 100 + 5; | |
| mbst += stats["def"] * 2 + 30 + 63 + 100 + 5; | |
| mbst += stats["spa"] * 2 + 30 + 63 + 100 + 5; | |
| mbst += stats["spd"] * 2 + 30 + 63 + 100 + 5; | |
| mbst += stats["spe"] * 2 + 30 + 63 + 100 + 5; | |
| let level; | |
| if (this.adjustLevel) { | |
| level = this.adjustLevel; | |
| } else { | |
| level = Math.floor(100 * mbstmin / mbst); | |
| while (level < 100) { | |
| mbst = Math.floor((stats["hp"] * 2 + 30 + 63 + 100) * level / 100 + 10); | |
| mbst += Math.floor(((stats["atk"] * 2 + 30 + 63 + 100) * level / 100 + 5) * level / 100); | |
| mbst += Math.floor((stats["def"] * 2 + 30 + 63 + 100) * level / 100 + 5); | |
| mbst += Math.floor(((stats["spa"] * 2 + 30 + 63 + 100) * level / 100 + 5) * level / 100); | |
| mbst += Math.floor((stats["spd"] * 2 + 30 + 63 + 100) * level / 100 + 5); | |
| mbst += Math.floor((stats["spe"] * 2 + 30 + 63 + 100) * level / 100 + 5); | |
| if (mbst >= mbstmin) | |
| break; | |
| level++; | |
| } | |
| } | |
| const ivs = { | |
| hp: 0, | |
| atk: this.random(16), | |
| def: this.random(16), | |
| spa: this.random(16), | |
| spd: 0, | |
| spe: this.random(16) | |
| }; | |
| ivs["hp"] = ivs["atk"] % 2 * 16 + ivs["def"] % 2 * 8 + ivs["spe"] % 2 * 4 + ivs["spa"] % 2 * 2; | |
| ivs["atk"] *= 2; | |
| ivs["def"] *= 2; | |
| ivs["spa"] *= 2; | |
| ivs["spd"] = ivs["spa"]; | |
| ivs["spe"] *= 2; | |
| const evs = { hp: 255, atk: 255, def: 255, spa: 255, spd: 255, spe: 255 }; | |
| const pool = [...this.dex.species.getMovePool(species.id)]; | |
| team.push({ | |
| name: species.baseSpecies, | |
| species: species.name, | |
| moves: this.multipleSamplesNoReplace(pool, 4), | |
| gender: false, | |
| ability: "No Ability", | |
| evs, | |
| ivs, | |
| item: "", | |
| level, | |
| happiness: 0, | |
| shiny: false, | |
| nature: "Serious" | |
| }); | |
| } | |
| return team; | |
| } | |
| // Random team generation for Gen 1 Random Battles. | |
| randomTeam() { | |
| this.enforceNoDirectCustomBanlistChanges(); | |
| const seed = this.prng.getSeed(); | |
| const ruleTable = this.dex.formats.getRuleTable(this.format); | |
| const pokemon = []; | |
| const isMonotype = !!this.forceMonotype || ruleTable.has("sametypeclause"); | |
| const typePool = this.dex.types.names(); | |
| const type = this.forceMonotype || this.sample(typePool); | |
| const rejectedButNotInvalidPool = []; | |
| const typeCount = {}; | |
| const weaknessCount = { Electric: 0, Psychic: 0, Water: 0, Ice: 0, Ground: 0, Fire: 0 }; | |
| let numMaxLevelPokemon = 0; | |
| const pokemonPool = Object.keys(this.getPokemonPool(type, pokemon, isMonotype, Object.keys(this.randomData))[0]); | |
| while (pokemonPool.length && pokemon.length < this.maxTeamSize) { | |
| const species = this.dex.species.get(this.sampleNoReplace(pokemonPool)); | |
| if (!species.exists) | |
| continue; | |
| if (species.id === "ditto" && this.battleHasDitto) | |
| continue; | |
| const limitFactor = Math.round(this.maxTeamSize / 6) || 1; | |
| let skip = false; | |
| if (!isMonotype && !this.forceMonotype) { | |
| for (const typeName of species.types) { | |
| if (typeCount[typeName] >= 2 * limitFactor) { | |
| skip = true; | |
| break; | |
| } | |
| } | |
| if (skip) { | |
| rejectedButNotInvalidPool.push(species.id); | |
| continue; | |
| } | |
| } | |
| const pokemonWeaknesses = []; | |
| for (const typeName in weaknessCount) { | |
| const increaseCount = this.dex.getImmunity(typeName, species) && this.dex.getEffectiveness(typeName, species) > 0; | |
| if (!increaseCount) | |
| continue; | |
| if (weaknessCount[typeName] >= 2 * limitFactor) { | |
| skip = true; | |
| break; | |
| } | |
| pokemonWeaknesses.push(typeName); | |
| } | |
| if (skip) { | |
| rejectedButNotInvalidPool.push(species.id); | |
| continue; | |
| } | |
| if (!this.adjustLevel && this.getLevel(species) === 100 && numMaxLevelPokemon >= limitFactor) { | |
| rejectedButNotInvalidPool.push(species.id); | |
| continue; | |
| } | |
| pokemon.push(this.randomSet(species)); | |
| for (const typeName of species.types) { | |
| if (typeCount[typeName]) { | |
| typeCount[typeName]++; | |
| } else { | |
| typeCount[typeName] = 1; | |
| } | |
| } | |
| for (const weakness of pokemonWeaknesses) { | |
| weaknessCount[weakness]++; | |
| } | |
| if (this.getLevel(species) === 100) | |
| numMaxLevelPokemon++; | |
| if (species.id === "ditto") | |
| this.battleHasDitto = true; | |
| } | |
| while (pokemon.length < this.maxTeamSize && rejectedButNotInvalidPool.length) { | |
| const species = this.sampleNoReplace(rejectedButNotInvalidPool); | |
| pokemon.push(this.randomSet(species)); | |
| } | |
| if (pokemon.length < this.maxTeamSize && pokemon.length < 12 && !isMonotype) { | |
| throw new Error(`Could not build a random team for ${this.format} (seed=${seed})`); | |
| } | |
| return pokemon; | |
| } | |
| /** | |
| * Random set generation for Gen 1 Random Battles. | |
| */ | |
| randomSet(species) { | |
| species = this.dex.species.get(species); | |
| if (!species.exists) | |
| species = this.dex.species.get("pikachu"); | |
| const data = this.randomData[species.id]; | |
| const movePool = data.moves?.slice() || []; | |
| const moves = /* @__PURE__ */ new Set(); | |
| if (data.comboMoves && data.comboMoves.length <= this.maxMoveCount && this.randomChance(1, 2)) { | |
| for (const m of data.comboMoves) | |
| moves.add(m); | |
| } | |
| if (moves.size < this.maxMoveCount && data.exclusiveMoves) { | |
| moves.add(this.sample(data.exclusiveMoves)); | |
| } | |
| if (moves.size < this.maxMoveCount && data.essentialMoves) { | |
| for (const moveid of data.essentialMoves) { | |
| moves.add(moveid); | |
| if (moves.size === this.maxMoveCount) | |
| break; | |
| } | |
| } | |
| while (moves.size < this.maxMoveCount && movePool.length) { | |
| while (moves.size < this.maxMoveCount && movePool.length) { | |
| const moveid = this.sampleNoReplace(movePool); | |
| moves.add(moveid); | |
| } | |
| } | |
| const level = this.getLevel(species); | |
| const evs = { hp: 255, atk: 255, def: 255, spa: 255, spd: 255, spe: 255 }; | |
| const ivs = { hp: 30, atk: 30, def: 30, spa: 30, spd: 30, spe: 30 }; | |
| if (moves.has("substitute")) { | |
| while (evs.hp > 3) { | |
| const hp = Math.floor(Math.floor(2 * species.baseStats.hp + ivs.hp + Math.floor(evs.hp / 4) + 100) * level / 100 + 10); | |
| if (hp % 4 !== 0) | |
| break; | |
| evs.hp -= 4; | |
| } | |
| } | |
| const noAttackStatMoves = [...moves].every((m) => { | |
| const move = this.dex.moves.get(m); | |
| if (move.damageCallback || move.damage) | |
| return true; | |
| return move.category !== "Physical"; | |
| }); | |
| if (noAttackStatMoves && !moves.has("mimic") && !moves.has("transform")) { | |
| evs.atk = 0; | |
| ivs.atk = 2; | |
| } | |
| const shuffledMoves = Array.from(moves); | |
| this.prng.shuffle(shuffledMoves); | |
| return { | |
| name: species.name, | |
| species: species.name, | |
| moves: shuffledMoves, | |
| ability: "No Ability", | |
| evs, | |
| ivs, | |
| item: "", | |
| level, | |
| shiny: false, | |
| gender: false | |
| }; | |
| } | |
| randomHCTeam() { | |
| this.enforceNoDirectCustomBanlistChanges(); | |
| const team = []; | |
| const movePool = [...this.dex.moves.all()]; | |
| const typesPool = ["Bird", ...this.dex.types.names()]; | |
| const randomN = this.randomNPokemon(this.maxTeamSize); | |
| const hackmonsCup = {}; | |
| for (const forme of randomN) { | |
| const species = this.dex.species.get(forme); | |
| if (!hackmonsCup[species.id]) { | |
| hackmonsCup[species.id] = { | |
| types: [this.sample(typesPool), this.sample(typesPool)], | |
| baseStats: { | |
| hp: import_lib.Utils.clampIntRange(this.random(256), 1), | |
| atk: import_lib.Utils.clampIntRange(this.random(256), 1), | |
| def: import_lib.Utils.clampIntRange(this.random(256), 1), | |
| spa: import_lib.Utils.clampIntRange(this.random(256), 1), | |
| spd: 0, | |
| spe: import_lib.Utils.clampIntRange(this.random(256), 1) | |
| } | |
| }; | |
| if (this.forceMonotype && !hackmonsCup[species.id].types.includes(this.forceMonotype)) { | |
| hackmonsCup[species.id].types[1] = this.forceMonotype; | |
| } | |
| hackmonsCup[species.id].baseStats.spd = hackmonsCup[species.id].baseStats.spa; | |
| } | |
| if (hackmonsCup[species.id].types[0] === hackmonsCup[species.id].types[1]) { | |
| hackmonsCup[species.id].types.splice(1, 1); | |
| } | |
| const moves = []; | |
| do { | |
| const move = this.sampleNoReplace(movePool); | |
| if (move.gen <= this.gen && !move.isNonstandard && !move.name.startsWith("Hidden Power ")) { | |
| moves.push(move.id); | |
| } | |
| } while (moves.length < this.maxMoveCount); | |
| const evs = { | |
| hp: this.random(256), | |
| atk: this.random(256), | |
| def: this.random(256), | |
| spa: this.random(256), | |
| spd: 0, | |
| spe: this.random(256) | |
| }; | |
| evs["spd"] = evs["spa"]; | |
| const ivs = { | |
| hp: 0, | |
| atk: this.random(16), | |
| def: this.random(16), | |
| spa: this.random(16), | |
| spd: 0, | |
| spe: this.random(16) | |
| }; | |
| ivs["hp"] = ivs["atk"] % 2 * 16 + ivs["def"] % 2 * 8 + ivs["spe"] % 2 * 4 + ivs["spa"] % 2 * 2; | |
| for (const iv in ivs) { | |
| if (iv === "hp" || iv === "spd") | |
| continue; | |
| ivs[iv] *= 2; | |
| } | |
| ivs["spd"] = ivs["spa"]; | |
| const mbstmin = 425; | |
| const baseStats = hackmonsCup[species.id].baseStats; | |
| const calcStat = (statName, lvl) => { | |
| if (lvl) { | |
| return Math.floor(Math.floor(2 * baseStats[statName] + ivs[statName] + Math.floor(evs[statName] / 4)) * lvl / 100 + 5); | |
| } | |
| return Math.floor(2 * baseStats[statName] + ivs[statName] + Math.floor(evs[statName] / 4)) + 5; | |
| }; | |
| let mbst = 0; | |
| for (const statName of Object.keys(baseStats)) { | |
| mbst += calcStat(statName); | |
| if (statName === "hp") | |
| mbst += 5; | |
| } | |
| let level; | |
| if (this.adjustLevel) { | |
| level = this.adjustLevel; | |
| } else { | |
| level = Math.floor(100 * mbstmin / mbst); | |
| while (level < 100) { | |
| for (const statName of Object.keys(baseStats)) { | |
| mbst += calcStat(statName, level); | |
| if (statName === "hp") | |
| mbst += 5; | |
| } | |
| if (mbst >= mbstmin) | |
| break; | |
| level++; | |
| } | |
| if (level > 100) | |
| level = 100; | |
| } | |
| team.push({ | |
| name: species.baseSpecies, | |
| species: species.name, | |
| gender: species.gender, | |
| item: "", | |
| ability: "No Ability", | |
| moves, | |
| evs, | |
| ivs, | |
| nature: "", | |
| level, | |
| shiny: false, | |
| // Hacky but the only way to communicate stats/level generation properly | |
| hc: hackmonsCup[species.id] | |
| }); | |
| } | |
| return team; | |
| } | |
| } | |
| var teams_default = RandomGen1Teams; | |
| //# sourceMappingURL=teams.js.map | |