Jofthomas's picture
Upload 4781 files
5c2ed06 verified
"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, {
RandomBabyTeams: () => RandomBabyTeams,
default: () => teams_default
});
module.exports = __toCommonJS(teams_exports);
var import_teams = require("../gen9/teams");
var import_lib = require("../../../lib");
const CONTRARY_MOVES = [
"armorcannon",
"closecombat",
"leafstorm",
"makeitrain",
"overheat",
"spinout",
"superpower",
"vcreate"
];
const HAZARDS = [
"spikes",
"stealthrock",
"stickyweb",
"toxicspikes"
];
const PIVOT_MOVES = [
"chillyreception",
"flipturn",
"partingshot",
"shedtail",
"teleport",
"uturn",
"voltswitch"
];
const PHYSICAL_SETUP = [
"bellydrum",
"bulkup",
"coil",
"curse",
"dragondance",
"honeclaws",
"howl",
"meditate",
"poweruppunch",
"swordsdance",
"tidyup",
"victorydance"
];
const RECOVERY_MOVES = [
"healorder",
"milkdrink",
"moonlight",
"morningsun",
"recover",
"roost",
"shoreup",
"slackoff",
"softboiled",
"strengthsap",
"synthesis"
];
const SETUP = [
"acidarmor",
"agility",
"autotomize",
"bellydrum",
"bulkup",
"calmmind",
"clangoroussoul",
"coil",
"cosmicpower",
"curse",
"dragondance",
"flamecharge",
"growth",
"honeclaws",
"howl",
"irondefense",
"meditate",
"nastyplot",
"noretreat",
"poweruppunch",
"quiverdance",
"raindance",
"rockpolish",
"shellsmash",
"shiftgear",
"snowscape",
"sunnyday",
"swordsdance",
"tailglow",
"tidyup",
"trailblaze",
"workup",
"victorydance"
];
const SPEED_SETUP = [
"agility",
"autotomize",
"flamecharge",
"rockpolish",
"trailblaze"
];
const MOVE_PAIRS = [
["lightscreen", "reflect"],
["sleeptalk", "rest"],
["protect", "wish"]
];
class RandomBabyTeams extends import_teams.RandomTeams {
constructor(format, prng) {
super(format, prng);
this.randomSets = require("./sets.json");
this.moveEnforcementCheckers["Bug"] = (movePool, moves, abilities, types, counter) => !counter.get("Bug");
this.moveEnforcementCheckers["Grass"] = (movePool, moves, abilities, types, counter, species) => !counter.get("Grass") && species.id !== "rowlet";
}
cullMovePool(types, moves, abilities, counter, movePool, teamDetails, species, isLead, isDoubles, teraType, role) {
if (moves.size + movePool.length <= this.maxMoveCount)
return;
if (moves.size === this.maxMoveCount - 2) {
const unpairedMoves = [...movePool];
for (const pair of MOVE_PAIRS) {
if (movePool.includes(pair[0]) && movePool.includes(pair[1])) {
this.fastPop(unpairedMoves, unpairedMoves.indexOf(pair[0]));
this.fastPop(unpairedMoves, unpairedMoves.indexOf(pair[1]));
}
}
if (unpairedMoves.length === 1) {
this.fastPop(movePool, movePool.indexOf(unpairedMoves[0]));
}
}
if (moves.size === this.maxMoveCount - 1) {
for (const pair of MOVE_PAIRS) {
if (movePool.includes(pair[0]) && movePool.includes(pair[1])) {
this.fastPop(movePool, movePool.indexOf(pair[0]));
this.fastPop(movePool, movePool.indexOf(pair[1]));
}
}
}
const statusMoves = this.cachedStatusMoves;
if (teamDetails.screens && movePool.length >= this.maxMoveCount + 2) {
if (movePool.includes("reflect"))
this.fastPop(movePool, movePool.indexOf("reflect"));
if (movePool.includes("lightscreen"))
this.fastPop(movePool, movePool.indexOf("lightscreen"));
if (moves.size + movePool.length <= this.maxMoveCount)
return;
}
if (teamDetails.stickyWeb) {
if (movePool.includes("stickyweb"))
this.fastPop(movePool, movePool.indexOf("stickyweb"));
if (moves.size + movePool.length <= this.maxMoveCount)
return;
}
if (teamDetails.stealthRock) {
if (movePool.includes("stealthrock"))
this.fastPop(movePool, movePool.indexOf("stealthrock"));
if (moves.size + movePool.length <= this.maxMoveCount)
return;
}
if (teamDetails.defog || teamDetails.rapidSpin) {
if (movePool.includes("defog"))
this.fastPop(movePool, movePool.indexOf("defog"));
if (movePool.includes("rapidspin"))
this.fastPop(movePool, movePool.indexOf("rapidspin"));
if (moves.size + movePool.length <= this.maxMoveCount)
return;
}
if (teamDetails.toxicSpikes) {
if (movePool.includes("toxicspikes"))
this.fastPop(movePool, movePool.indexOf("toxicspikes"));
if (moves.size + movePool.length <= this.maxMoveCount)
return;
}
if (teamDetails.spikes && teamDetails.spikes >= 2) {
if (movePool.includes("spikes"))
this.fastPop(movePool, movePool.indexOf("spikes"));
if (moves.size + movePool.length <= this.maxMoveCount)
return;
}
const incompatiblePairs = [
// These moves don't mesh well with other aspects of the set
[SETUP, "defog"],
[SETUP, PIVOT_MOVES],
[SETUP, HAZARDS],
[PHYSICAL_SETUP, PHYSICAL_SETUP],
[statusMoves, ["destinybond", "healingwish", "switcheroo", "trick"]],
["curse", "rapidspin"],
// These moves are redundant with each other
[
["alluringvoice", "dazzlinggleam", "drainingkiss", "moonblast"],
["alluringvoice", "dazzlinggleam", "drainingkiss", "moonblast"]
],
[["bulletseed", "gigadrain", "leafstorm", "seedbomb"], ["bulletseed", "gigadrain", "leafstorm", "seedbomb"]],
[["hypnosis", "thunderwave", "toxic", "willowisp", "yawn"], ["hypnosis", "thunderwave", "toxic", "willowisp", "yawn"]],
["roar", "yawn"],
["dragonclaw", "outrage"],
["dracometeor", "dragonpulse"],
["toxic", "toxicspikes"],
["rockblast", "stoneedge"],
["bodyslam", "doubleedge"],
["gunkshot", "poisonjab"],
[["hydropump", "liquidation"], "surf"]
];
for (const pair of incompatiblePairs)
this.incompatibleMoves(moves, movePool, pair[0], pair[1]);
}
// Generate random moveset for a given species, role, tera type.
randomMoveset(types, abilities, teamDetails, species, isLead, isDoubles, movePool, teraType, role) {
const moves = /* @__PURE__ */ new Set();
let counter = this.queryMoves(moves, species, teraType, abilities);
this.cullMovePool(types, moves, abilities, counter, movePool, teamDetails, species, isLead, isDoubles, teraType, role);
if (movePool.length <= this.maxMoveCount) {
for (const moveid of movePool) {
moves.add(moveid);
}
return moves;
}
const runEnforcementChecker = (checkerName) => {
if (!this.moveEnforcementCheckers[checkerName])
return false;
return this.moveEnforcementCheckers[checkerName](
movePool,
moves,
abilities,
types,
counter,
species,
teamDetails,
isLead,
isDoubles,
teraType,
role
);
};
if (role === "Tera Blast user") {
counter = this.addMove(
"terablast",
moves,
types,
abilities,
teamDetails,
species,
isLead,
isDoubles,
movePool,
teraType,
role
);
}
if (species.requiredMove) {
const move = this.dex.moves.get(species.requiredMove).id;
counter = this.addMove(
move,
moves,
types,
abilities,
teamDetails,
species,
isLead,
isDoubles,
movePool,
teraType,
role
);
}
if (movePool.includes("facade") && abilities.includes("Guts")) {
counter = this.addMove(
"facade",
moves,
types,
abilities,
teamDetails,
species,
isLead,
isDoubles,
movePool,
teraType,
role
);
}
if (movePool.includes("stickyweb")) {
counter = this.addMove(
"stickyweb",
moves,
types,
abilities,
teamDetails,
species,
isLead,
isDoubles,
movePool,
teraType,
role
);
}
if (movePool.includes("knockoff") && role !== "Bulky Support") {
counter = this.addMove(
"knockoff",
moves,
types,
abilities,
teamDetails,
species,
isLead,
isDoubles,
movePool,
teraType,
role
);
}
if (role === "Bulky Support" && !teamDetails.defog && !teamDetails.rapidSpin) {
if (movePool.includes("rapidspin")) {
counter = this.addMove(
"rapidspin",
moves,
types,
abilities,
teamDetails,
species,
isLead,
isDoubles,
movePool,
teraType,
role
);
}
if (movePool.includes("defog")) {
counter = this.addMove(
"defog",
moves,
types,
abilities,
teamDetails,
species,
isLead,
isDoubles,
movePool,
teraType,
role
);
}
}
if (types.length === 1 && (types.includes("Normal") || types.includes("Fighting"))) {
if (movePool.includes("knockoff")) {
counter = this.addMove(
"knockoff",
moves,
types,
abilities,
teamDetails,
species,
isLead,
isDoubles,
movePool,
teraType,
role
);
}
}
if (role === "Wallbreaker") {
const priorityMoves = [];
for (const moveid of movePool) {
const move = this.dex.moves.get(moveid);
const moveType = this.getMoveType(move, species, abilities, teraType);
if (types.includes(moveType) && (move.priority > 0 || moveid === "grassyglide" && abilities.includes("Grassy Surge")) && (move.basePower || move.basePowerCallback)) {
priorityMoves.push(moveid);
}
}
if (priorityMoves.length) {
const moveid = this.sample(priorityMoves);
counter = this.addMove(
moveid,
moves,
types,
abilities,
teamDetails,
species,
isLead,
isDoubles,
movePool,
teraType,
role
);
}
}
for (const type of types) {
const stabMoves = [];
for (const moveid of movePool) {
const move = this.dex.moves.get(moveid);
const moveType = this.getMoveType(move, species, abilities, teraType);
if (!this.noStab.includes(moveid) && (move.basePower || move.basePowerCallback) && type === moveType) {
stabMoves.push(moveid);
}
}
while (runEnforcementChecker(type)) {
if (!stabMoves.length)
break;
const moveid = this.sampleNoReplace(stabMoves);
counter = this.addMove(
moveid,
moves,
types,
abilities,
teamDetails,
species,
isLead,
isDoubles,
movePool,
teraType,
role
);
}
}
if (!counter.get("stabtera") && role !== "Bulky Support") {
const stabMoves = [];
for (const moveid of movePool) {
const move = this.dex.moves.get(moveid);
const moveType = this.getMoveType(move, species, abilities, teraType);
if (!this.noStab.includes(moveid) && (move.basePower || move.basePowerCallback) && teraType === moveType) {
stabMoves.push(moveid);
}
}
if (stabMoves.length) {
const moveid = this.sample(stabMoves);
counter = this.addMove(
moveid,
moves,
types,
abilities,
teamDetails,
species,
isLead,
isDoubles,
movePool,
teraType,
role
);
}
}
if (!counter.get("stab")) {
const stabMoves = [];
for (const moveid of movePool) {
const move = this.dex.moves.get(moveid);
const moveType = this.getMoveType(move, species, abilities, teraType);
if (!this.noStab.includes(moveid) && (move.basePower || move.basePowerCallback) && types.includes(moveType)) {
stabMoves.push(moveid);
}
}
if (stabMoves.length) {
const moveid = this.sample(stabMoves);
counter = this.addMove(
moveid,
moves,
types,
abilities,
teamDetails,
species,
isLead,
isDoubles,
movePool,
teraType,
role
);
}
}
if (abilities.includes("Contrary")) {
const contraryMoves = movePool.filter((moveid) => CONTRARY_MOVES.includes(moveid));
for (const moveid of contraryMoves) {
counter = this.addMove(
moveid,
moves,
types,
abilities,
teamDetails,
species,
isLead,
isDoubles,
movePool,
teraType,
role
);
}
}
if (["Bulky Support", "Bulky Attacker", "Bulky Setup"].includes(role)) {
const recoveryMoves = movePool.filter((moveid) => RECOVERY_MOVES.includes(moveid));
if (recoveryMoves.length) {
const moveid = this.sample(recoveryMoves);
counter = this.addMove(
moveid,
moves,
types,
abilities,
teamDetails,
species,
isLead,
isDoubles,
movePool,
teraType,
role
);
}
}
if (role.includes("Setup") || role === "Tera Blast user") {
const nonSpeedSetupMoves = movePool.filter((moveid) => SETUP.includes(moveid) && !SPEED_SETUP.includes(moveid));
if (nonSpeedSetupMoves.length) {
const moveid = this.sample(nonSpeedSetupMoves);
counter = this.addMove(
moveid,
moves,
types,
abilities,
teamDetails,
species,
isLead,
isDoubles,
movePool,
teraType,
role
);
} else {
const setupMoves = movePool.filter((moveid) => SETUP.includes(moveid));
if (setupMoves.length) {
const moveid = this.sample(setupMoves);
counter = this.addMove(
moveid,
moves,
types,
abilities,
teamDetails,
species,
isLead,
isDoubles,
movePool,
teraType,
role
);
}
}
}
if (!counter.damagingMoves.size) {
const attackingMoves = [];
for (const moveid of movePool) {
const move = this.dex.moves.get(moveid);
if (!this.noStab.includes(moveid) && move.category !== "Status")
attackingMoves.push(moveid);
}
if (attackingMoves.length) {
const moveid = this.sample(attackingMoves);
counter = this.addMove(
moveid,
moves,
types,
abilities,
teamDetails,
species,
isLead,
isDoubles,
movePool,
teraType,
role
);
}
}
if (!["Fast Support", "Bulky Support"].includes(role) || species.id === "magnemite") {
if (counter.damagingMoves.size === 1) {
const currentAttackType = counter.damagingMoves.values().next().value.type;
const coverageMoves = [];
for (const moveid of movePool) {
const move = this.dex.moves.get(moveid);
const moveType = this.getMoveType(move, species, abilities, teraType);
if (!this.noStab.includes(moveid) && (move.basePower || move.basePowerCallback)) {
if (currentAttackType !== moveType)
coverageMoves.push(moveid);
}
}
if (coverageMoves.length) {
const moveid = this.sample(coverageMoves);
counter = this.addMove(
moveid,
moves,
types,
abilities,
teamDetails,
species,
isLead,
isDoubles,
movePool,
teraType,
role
);
}
}
}
while (moves.size < this.maxMoveCount && movePool.length) {
if (moves.size + movePool.length <= this.maxMoveCount) {
for (const moveid2 of movePool) {
moves.add(moveid2);
}
break;
}
const moveid = this.sample(movePool);
counter = this.addMove(
moveid,
moves,
types,
abilities,
teamDetails,
species,
isLead,
isDoubles,
movePool,
teraType,
role
);
for (const pair of MOVE_PAIRS) {
if (moveid === pair[0] && movePool.includes(pair[1])) {
counter = this.addMove(
pair[1],
moves,
types,
abilities,
teamDetails,
species,
isLead,
isDoubles,
movePool,
teraType,
role
);
}
if (moveid === pair[1] && movePool.includes(pair[0])) {
counter = this.addMove(
pair[0],
moves,
types,
abilities,
teamDetails,
species,
isLead,
isDoubles,
movePool,
teraType,
role
);
}
}
}
return moves;
}
getAbility(types, moves, abilities, counter, teamDetails, species, isLead, isDoubles, teraType, role) {
if (abilities.length <= 1)
return abilities[0];
if (species.id === "rowlet" && counter.get("Grass"))
return "Overgrow";
if (species.id === "riolu")
return moves.has("copycat") ? "Prankster" : "Inner Focus";
if (species.id === "pikipek" && counter.get("skilllink"))
return "Skill Link";
if (species.id === "psyduck" && teamDetails.rain)
return "Swift Swim";
const abilityAllowed = [];
for (const ability of abilities) {
if (!this.shouldCullAbility(
ability,
types,
moves,
abilities,
counter,
teamDetails,
species,
isLead,
isDoubles,
teraType,
role
)) {
abilityAllowed.push(ability);
}
}
if (abilityAllowed.length >= 1)
return this.sample(abilityAllowed);
if (!abilityAllowed.length) {
const weatherAbilities = abilities.filter(
(a) => ["Chlorophyll", "Hydration", "Sand Force", "Sand Rush", "Slush Rush", "Solar Power", "Swift Swim"].includes(a)
);
if (weatherAbilities.length)
return this.sample(weatherAbilities);
}
return this.sample(abilities);
}
getPriorityItem(ability, types, moves, counter, teamDetails, species, isLead, isDoubles, teraType, role) {
if (species.requiredItems) {
return this.sample(species.requiredItems);
}
if (moves.has("focusenergy"))
return "Scope Lens";
if (moves.has("thief"))
return "";
if (moves.has("trick") || moves.has("switcheroo"))
return "Choice Scarf";
if (moves.has("acrobatics"))
return ability === "Unburden" ? "Oran Berry" : "";
if (moves.has("auroraveil") || moves.has("lightscreen") && moves.has("reflect"))
return "Light Clay";
if (ability === "Guts" && moves.has("facade"))
return "Flame Orb";
if (ability === "Quick Feet")
return "Toxic Orb";
if (["Harvest", "Ripen", "Unburden"].includes(ability) || moves.has("bellydrum"))
return "Oran Berry";
}
getItem(ability, types, moves, counter, teamDetails, species, isLead, teraType, role) {
if (role === "Fast Attacker" && (!counter.get("Status") || counter.get("Status") === 1 && moves.has("destinybond"))) {
return "Choice Scarf";
}
if (["Setup Sweeper", "Wallbreaker"].includes(role)) {
return "Life Orb";
}
return "Eviolite";
}
getLevel(species) {
if (this.adjustLevel)
return this.adjustLevel;
return this.randomSets[species.id]?.level || 10;
}
getForme(species) {
if (typeof species.battleOnly === "string") {
return species.battleOnly;
}
if (species.cosmeticFormes)
return this.sample([species.name].concat(species.cosmeticFormes));
if (["Poltchageist", "Sinistea"].includes(species.baseSpecies)) {
return this.sample([species.name].concat(species.otherFormes));
}
return species.name;
}
randomSet(s, teamDetails = {}, isLead = false, isDoubles = false) {
const species = this.dex.species.get(s);
const forme = this.getForme(species);
const sets = this.randomSets[species.id]["sets"];
const possibleSets = [];
const ruleTable = this.dex.formats.getRuleTable(this.format);
for (const set2 of sets) {
if ((teamDetails.teraBlast || ruleTable.has("terastalclause")) && set2.role === "Tera Blast user") {
continue;
}
possibleSets.push(set2);
}
const set = this.sampleIfArray(possibleSets);
const role = set.role;
const movePool = [];
for (const movename of set.movepool) {
movePool.push(this.dex.moves.get(movename).id);
}
const teraTypes = set.teraTypes;
let teraType = this.sampleIfArray(teraTypes);
let ability = "";
let item = void 0;
const evs = { hp: 85, atk: 85, def: 85, spa: 85, spd: 85, spe: 85 };
const ivs = { hp: 31, atk: 31, def: 31, spa: 31, spd: 31, spe: 31 };
const types = species.types;
const abilities = set.abilities;
const moves = this.randomMoveset(types, abilities, teamDetails, species, isLead, isDoubles, movePool, teraType, role);
const counter = this.queryMoves(moves, species, teraType, abilities);
ability = this.getAbility(types, moves, abilities, counter, teamDetails, species, isLead, isDoubles, teraType, role);
item = this.getPriorityItem(ability, types, moves, counter, teamDetails, species, isLead, isDoubles, teraType, role);
if (item === void 0) {
item = this.getItem(ability, types, moves, counter, teamDetails, species, isLead, teraType, role);
}
const level = this.getLevel(species);
let hp = Math.floor(Math.floor(2 * species.baseStats.hp + ivs.hp + Math.floor(evs.hp / 4) + 100) * level / 100 + 10);
let targetHP = hp;
const minimumHP = Math.floor(Math.floor(2 * species.baseStats.hp + 100) * level / 100 + 10);
if (item === "Life Orb") {
targetHP = Math.floor(hp / 10) * 10 - 1;
} else if (moves.has("bellydrum")) {
targetHP = Math.floor(hp / 2) * 2;
}
if (hp > targetHP && hp - targetHP <= 3 && targetHP >= minimumHP) {
if (Math.floor(Math.floor(2 * species.baseStats.hp + ivs.hp + 100) * level / 100 + 10) >= targetHP) {
evs.hp = 0;
hp = Math.floor(Math.floor(2 * species.baseStats.hp + ivs.hp + Math.floor(evs.hp / 4) + 100) * level / 100 + 10);
while (hp > targetHP) {
ivs.hp -= 1;
hp = Math.floor(Math.floor(2 * species.baseStats.hp + ivs.hp + Math.floor(evs.hp / 4) + 100) * level / 100 + 10);
}
} else {
while (hp > targetHP) {
evs.hp -= 4;
hp = Math.floor(Math.floor(2 * species.baseStats.hp + ivs.hp + Math.floor(evs.hp / 4) + 100) * level / 100 + 10);
}
}
}
const noAttackStatMoves = [...moves].every((m) => {
const move = this.dex.moves.get(m);
if (move.damageCallback || move.damage)
return true;
if (move.id === "shellsidearm")
return false;
if (move.id === "terablast" && (species.id === "porygon" || species.baseStats.atk > species.baseStats.spa))
return false;
return move.category !== "Physical" || move.id === "bodypress" || move.id === "foulplay";
});
if (noAttackStatMoves) {
evs.atk = 0;
ivs.atk = 0;
}
if (moves.has("gyroball") || moves.has("trickroom")) {
evs.spe = 0;
ivs.spe = 0;
}
if (this.forceTeraType)
teraType = this.forceTeraType;
const shuffledMoves = Array.from(moves);
this.prng.shuffle(shuffledMoves);
return {
name: species.baseSpecies,
species: forme,
gender: species.gender,
shiny: this.randomChance(1, 1024),
level,
moves: shuffledMoves,
ability,
evs,
ivs,
item,
teraType,
role
};
}
randomBabyTeam() {
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().filter((name) => name !== "Stellar");
const type = this.forceMonotype || this.sample(typePool);
const baseFormes = /* @__PURE__ */ new Set();
const typeCount = new import_lib.Utils.Multiset();
const typeComboCount = new import_lib.Utils.Multiset();
const typeWeaknesses = new import_lib.Utils.Multiset();
const typeDoubleWeaknesses = new import_lib.Utils.Multiset();
const teamDetails = {};
const pokemonList = Object.keys(this.randomSets);
const [pokemonPool, baseSpeciesPool] = this.getPokemonPool(type, pokemon, isMonotype, pokemonList);
while (baseSpeciesPool.length && pokemon.length < this.maxTeamSize) {
const baseSpecies = this.sampleNoReplace(baseSpeciesPool);
const species = this.dex.species.get(this.sample(pokemonPool[baseSpecies]));
if (!species.exists)
continue;
if (baseFormes.has(species.baseSpecies))
continue;
if (species.baseSpecies === "Zorua" && pokemon.length >= this.maxTeamSize - 1)
continue;
const types = species.types;
const typeCombo = types.slice().sort().join();
const weakToFreezeDry = this.dex.getEffectiveness("Ice", species) > 0 || this.dex.getEffectiveness("Ice", species) > -2 && types.includes("Water");
const limitFactor = Math.round(this.maxTeamSize / 6) || 1;
if (!isMonotype && !this.forceMonotype) {
let skip = false;
for (const typeName of types) {
if (typeCount.get(typeName) >= 2 * limitFactor) {
skip = true;
break;
}
}
if (skip)
continue;
for (const typeName of this.dex.types.names()) {
if (this.dex.getEffectiveness(typeName, species) > 0) {
if (typeWeaknesses.get(typeName) >= 3 * limitFactor) {
skip = true;
break;
}
}
if (this.dex.getEffectiveness(typeName, species) > 1) {
if (typeDoubleWeaknesses.get(typeName) >= limitFactor) {
skip = true;
break;
}
}
}
if (skip)
continue;
if (this.dex.getEffectiveness("Fire", species) === 0 && Object.values(species.abilities).filter((a) => ["Dry Skin", "Fluffy"].includes(a)).length && typeWeaknesses.get("Fire") >= 3 * limitFactor)
continue;
if (weakToFreezeDry) {
if (typeWeaknesses.get("Freeze-Dry") >= 4 * limitFactor)
continue;
}
}
if (!this.forceMonotype && isMonotype && typeComboCount.get(typeCombo) >= 3 * limitFactor)
continue;
const set = this.randomSet(species, teamDetails, false, false);
pokemon.push(set);
if (pokemon.length === this.maxTeamSize)
break;
baseFormes.add(species.baseSpecies);
for (const typeName of types) {
typeCount.add(typeName);
}
typeComboCount.add(typeCombo);
for (const typeName of this.dex.types.names()) {
if (this.dex.getEffectiveness(typeName, species) > 0) {
typeWeaknesses.add(typeName);
}
if (this.dex.getEffectiveness(typeName, species) > 1) {
typeDoubleWeaknesses.add(typeName);
}
}
if (["Dry Skin", "Fluffy"].includes(set.ability) && this.dex.getEffectiveness("Fire", species) === 0) {
typeWeaknesses.add("Fire");
}
if (weakToFreezeDry)
typeWeaknesses.add("Freeze-Dry");
if (set.ability === "Drizzle" || set.moves.includes("raindance"))
teamDetails.rain = 1;
if (set.ability === "Drought" || set.moves.includes("sunnyday"))
teamDetails.sun = 1;
if (set.ability === "Sand Stream")
teamDetails.sand = 1;
if (set.ability === "Snow Warning" || set.moves.includes("snowscape") || set.moves.includes("chillyreception")) {
teamDetails.snow = 1;
}
if (set.moves.includes("spikes")) {
teamDetails.spikes = (teamDetails.spikes || 0) + 1;
}
if (set.moves.includes("stealthrock"))
teamDetails.stealthRock = 1;
if (set.moves.includes("stickyweb"))
teamDetails.stickyWeb = 1;
if (set.moves.includes("toxicspikes") || set.ability === "Toxic Debris")
teamDetails.toxicSpikes = 1;
if (set.moves.includes("defog"))
teamDetails.defog = 1;
if (set.moves.includes("rapidspin") || set.moves.includes("mortalspin"))
teamDetails.rapidSpin = 1;
if (set.moves.includes("auroraveil") || set.moves.includes("reflect") && set.moves.includes("lightscreen")) {
teamDetails.screens = 1;
}
if (set.role === "Tera Blast user") {
teamDetails.teraBlast = 1;
}
}
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;
}
}
var teams_default = RandomBabyTeams;
//# sourceMappingURL=teams.js.map