();
- for (const set of team) {
- let species = this.dex.species.get(set.species);
- while (species.prevo) {
- species = this.dex.species.get(species.prevo);
- }
- if (familyTable.has(species.id)) {
- return [
- `You are limited to one Pokémon from each family by the Family Clause.`,
- `(You have more than one evolution of ${species.name}.)`,
- ];
- }
- familyTable.add(species.id);
- }
- },
- battle: {
- tiebreak() {
- if (this.ended) return false;
-
- this.inputLog.push(`>tiebreak`);
- this.add('message', "Time's up! Going to tiebreaker...");
- const notFainted = this.sides.map(side => (
- side.pokemon.filter(pokemon => !pokemon.fainted).length
- ));
- this.add('-message', this.sides.map((side, i) => (
- `${side.name}: ${notFainted[i]} Pokemon left`
- )).join('; '));
- const maxNotFainted = Math.max(...notFainted);
- let tiedSides = this.sides.filter((side, i) => notFainted[i] === maxNotFainted);
- if (tiedSides.length <= 1) {
- return this.win(tiedSides[1]);
- }
-
- const hpPercentage = tiedSides.map(side => (
- side.pokemon.map(pokemon => pokemon.hp / pokemon.maxhp).reduce((a, b) => a + b) * 100 / 6
- ));
- this.add('-message', tiedSides.map((side, i) => (
- `${side.name}: ${Math.round(hpPercentage[i])}% total HP left`
- )).join('; '));
- const maxPercentage = Math.max(...hpPercentage);
- tiedSides = tiedSides.filter((side, i) => hpPercentage[i] === maxPercentage);
- if (tiedSides.length <= 1) {
- return this.win(tiedSides[1]);
- }
-
- const hpTotal = tiedSides.map(side => (
- side.pokemon.map(pokemon => pokemon.hp).reduce((a, b) => a + b)
- ));
- this.add('-message', tiedSides.map((side, i) => (
- `${side.name}: ${Math.round(hpTotal[i])} total HP left`
- )).join('; '));
- const maxTotal = Math.max(...hpTotal);
- tiedSides = tiedSides.filter((side, i) => hpTotal[i] === maxTotal);
- if (tiedSides.length <= 1) {
- return this.win(tiedSides[1]);
- }
- return this.tie();
- },
- checkWin(faintData) {
- const team1PokemonLeft = this.sides[0].pokemonLeft;
- const team2PokemonLeft = this.sides[1].pokemonLeft;
- if (!team1PokemonLeft && !team2PokemonLeft) {
- this.win(faintData?.target.side || null);
- return true;
- }
- for (const side of this.sides) {
- if (!side.pokemonLeft) {
- this.win(side);
- return true;
- }
- }
- },
- },
+ ruleset: ['Standard OMs', 'Sleep Moves Clause', 'Terastal Clause', 'Evasion Clause', 'Tier Shift Mod'],
+ banlist: [
+ 'Arceus', 'Calyrex-Shadow', 'Koraidon', 'Kyogre', 'Medicham', 'Miraidon', 'Necrozma-Dusk-Mane', 'Zacian-Crowned', 'Drizzle', 'Moody', 'Arena Trap', 'Shadow Tag',
+ 'Baton Pass', 'Last Respects', 'Shed Tail', 'Heat Rock', 'King\'s Rock', 'Light Clay', 'Razor Fang',
+ ],
+ unbanlist: ['Arceus-Bug', 'Arceus-Grass', 'Arceus-Ice'],
},
{
name: "[Gen 9] Trademarked",
@@ -3128,20 +3217,6 @@ export const Formats: import('../sim/dex-formats').FormatList = [
ruleset: ['Standard Doubles', 'NatDex Mod', '!Gravity Sleep Clause'],
banlist: ['Shedinja', 'Assist'],
},
- {
- name: "[Gen 9] National Dex Ubers UU",
- mod: 'gen9',
- searchShow: false,
- ruleset: ['[Gen 9] National Dex Ubers'],
- banlist: [
- 'Alomomola', 'Arceus-Normal', 'Arceus-Dark', 'Arceus-Ground', 'Calyrex-Ice', 'Chansey', 'Deoxys-Attack', 'Ditto', 'Dondozo', 'Eternatus', 'Giratina-Origin', 'Groudon-Primal',
- 'Hatterene', 'Ho-Oh', 'Kingambit', 'Kyogre-Primal', 'Lunala', 'Marshadow', 'Mewtwo-Mega-Y', 'Necrozma-Dusk-Mane', 'Necrozma-Ultra', 'Salamence-Mega', 'Smeargle', 'Yveltal',
- 'Zacian-Crowned', 'Zygarde-50%',
- // UUBL
- 'Arceus-Dragon', 'Arceus-Fairy', 'Arceus-Fire', 'Arceus-Flying', 'Arceus-Ghost', 'Arceus-Water', 'Blaziken-Mega', 'Chi-Yu', 'Chien-Pao', 'Dracovish', 'Flutter Mane', 'Groudon',
- 'Kyogre', 'Kyurem-Black', 'Rayquaza', 'Shaymin-Sky', 'Zacian', 'Zekrom', 'Power Construct', 'Light Clay', 'Ultranecrozium Z', 'Last Respects',
- ],
- },
{
name: "[Gen 9] National Dex 1v1",
mod: 'gen9',
@@ -3401,21 +3476,6 @@ export const Formats: import('../sim/dex-formats').FormatList = [
banlist: ['Uber', 'Arena Trap', 'Moody', 'Power Construct', 'Shadow Tag', 'King\'s Rock', 'Light Clay', 'Quick Claw', 'Razor Fang', 'Baton Pass', 'Last Respects', 'Shed Tail'],
},
- // Randomized Format Spotlight
- ///////////////////////////////////////////////////////////////////
-
- {
- section: "Randomized Format Spotlight",
- column: 3,
- },
- {
- name: "[Gen 9] BSS Factory (Bo3)",
- desc: `Randomized 3v3 Singles featuring Pokémon and movesets popular in Battle Stadium Singles.`,
- mod: 'gen9',
- team: 'randomBSSFactory',
- ruleset: ['Flat Rules', 'VGC Timer', 'Best of = 3'],
- },
-
// Randomized Metas
///////////////////////////////////////////////////////////////////
@@ -3430,50 +3490,6 @@ export const Formats: import('../sim/dex-formats').FormatList = [
team: 'random',
bestOfDefault: true,
},
- {
- name: "[Gen 9] Monkey's Paw Random Battle",
- desc: `Every Pokemon can wish for something with the Monkey's Paw once.`,
- mod: 'monkeyspaw',
- team: 'random',
- ruleset: ['[Gen 9] Random Battle'],
- onBegin() {
- for (const side of this.sides) {
- // @ts-expect-error I hate references with all of my life force
- side.wishes = { luck: 1, knowledge: 1, power: 1, life: 1 };
- // @ts-expect-error
- side.wishesRemaining = 4;
- }
- let buf = `What does which wish do?
`;
- buf += `What does which wish do?
`;
- buf += `• Mega Evolution: Wish for life – Revive one fainted Pokemon
`;
- buf += `• Mega Evolution X: Wish for power – Gain a +2 boost in the current Pokemon's dominant attack and defense stat
`;
- buf += `• Mega Evolution Y: Wish for luck – Give the current Pokemon innate Serene Grace + Focus Energy for the rest of the game
`;
- buf += `• Terastallize: Wish for knowledge – Scout the active Pokemon for one of their moves
`;
- buf += ` `;
- this.add('message', `You've found a Monkey's Paw. You have 4 wishes.`);
- this.add(`raw|${buf}`);
- },
- onSwitchIn(pokemon) {
- if (pokemon.m.revivedByMonkeysPaw) {
- pokemon.addVolatile('slowstart', null, this.dex.conditions.get('monkeypaw'));
- }
- if (pokemon.m.monkeyPawLuck) {
- pokemon.addVolatile('focusenergy');
- pokemon.addVolatile('confusion', null, this.dex.conditions.get('monkeypaw'));
- }
- },
- onModifyMovePriority: -2,
- onModifyMove(move, pokemon) {
- if (!pokemon.m.monkeyPawLuck) return;
- if (move.secondaries) {
- this.debug('doubling secondary chance');
- for (const secondary of move.secondaries) {
- if (secondary.chance) secondary.chance *= 2;
- }
- }
- if (move.self?.chance) move.self.chance *= 2;
- },
- },
{
name: "[Gen 9] Super Staff Bros Ultimate",
desc: "The fifth iteration of Super Staff Bros is here! Battle with a random team of pokemon created by the sim staff.",
@@ -3590,6 +3606,15 @@ export const Formats: import('../sim/dex-formats').FormatList = [
this.add(`raw|Battle Factory Tier: ${this.teamGenerator.factoryTier}
`);
},
},
+ {
+ name: "[Gen 9] 1v1 Factory",
+ desc: `Randomized teams of Pokémon for a generated Smogon tier with sets that are competitively viable.`,
+ threads: [`• 1v1 Factory Set Discussion`],
+ mod: 'gen9',
+ team: 'random1v1Factory',
+ bestOfDefault: true,
+ ruleset: ['[Gen 9] 1v1'],
+ },
{
name: "[Gen 9] BSS Factory",
desc: `Randomized 3v3 Singles featuring Pokémon and movesets popular in Battle Stadium Singles.`,
@@ -4062,42 +4087,6 @@ export const Formats: import('../sim/dex-formats').FormatList = [
},
},
- // RoA Spotlight
- ///////////////////////////////////////////////////////////////////
-
- {
- section: "RoA Spotlight",
- column: 4,
- },
- {
- name: "[Gen 2] Ubers",
- mod: 'gen2',
- // searchShow: false,
- ruleset: ['Standard'],
- },
- {
- name: "[Gen 5] LC",
- mod: 'gen5',
- // searchShow: false,
- ruleset: ['Standard', 'Little Cup', 'Sleep Moves Clause'],
- banlist: [
- 'Gligar', 'Meditite', 'Misdreavus', 'Murkrow', 'Scraggy', 'Scyther', 'Sneasel', 'Tangela', 'Vulpix', 'Yanma',
- 'Sand Rush', 'Sand Veil', 'Berry Juice', 'Soul Dew', 'Baton Pass', 'Dragon Rage', 'Sonic Boom', 'Swagger',
- ],
- },
- {
- name: "[Gen 7] VGC 2017",
- mod: 'gen7sm',
- gameType: 'doubles',
- // searchShow: false,
- bestOfDefault: true,
- ruleset: [
- 'Flat Rules', 'Old Alola Pokedex', '!! Adjust Level = 50', 'Min Source Gen = 7',
- 'VGC Timer', '!! Timer Starting = 900',
- ],
- banlist: ['Mega', 'Custap Berry', 'Enigma Berry', 'Jaboca Berry', 'Micle Berry', 'Rowap Berry'],
- },
-
// Past Gens OU
///////////////////////////////////////////////////////////////////
@@ -4565,16 +4554,6 @@ export const Formats: import('../sim/dex-formats').FormatList = [
ruleset: ['[Gen 7] Doubles OU'],
banlist: ['DOU', 'DBL'],
},
- {
- name: "[Gen 7] VGC 2019",
- mod: 'gen7',
- gameType: 'doubles',
- searchShow: false,
- bestOfDefault: true,
- ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 7', 'VGC Timer', 'Limit Two Restricted'],
- restricted: ['Restricted Legendary'],
- banlist: ['Unown', 'Battle Bond'],
- },
{
name: "[Gen 7] VGC 2018",
mod: 'gen7',
@@ -4584,6 +4563,18 @@ export const Formats: import('../sim/dex-formats').FormatList = [
ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 7', 'VGC Timer', '!! Timer Starting = 300'],
banlist: ['Oranguru + Symbiosis', 'Passimian + Defiant', 'Unown', 'Custap Berry', 'Enigma Berry', 'Jaboca Berry', 'Micle Berry', 'Rowap Berry', 'Battle Bond'],
},
+ {
+ name: "[Gen 7] VGC 2017",
+ mod: 'gen7sm',
+ gameType: 'doubles',
+ searchShow: false,
+ bestOfDefault: true,
+ ruleset: [
+ 'Flat Rules', 'Old Alola Pokedex', '!! Adjust Level = 50', 'Min Source Gen = 7',
+ 'VGC Timer', '!! Timer Starting = 900',
+ ],
+ banlist: ['Mega', 'Custap Berry', 'Enigma Berry', 'Jaboca Berry', 'Micle Berry', 'Rowap Berry'],
+ },
{
name: "[Gen 7] Battle Spot Doubles",
mod: 'gen7',
@@ -4854,6 +4845,16 @@ export const Formats: import('../sim/dex-formats').FormatList = [
banlist: ['Latios'],
unbanlist: ['Cloyster'],
},
+ {
+ name: "[Gen 5] LC",
+ mod: 'gen5',
+ searchShow: false,
+ ruleset: ['Standard', 'Little Cup', 'Sleep Moves Clause'],
+ banlist: [
+ 'Gligar', 'Meditite', 'Misdreavus', 'Murkrow', 'Scraggy', 'Scyther', 'Sneasel', 'Tangela', 'Vulpix', 'Yanma',
+ 'Sand Rush', 'Sand Veil', 'Berry Juice', 'Soul Dew', 'Baton Pass', 'Dragon Rage', 'Sonic Boom', 'Swagger',
+ ],
+ },
{
name: "[Gen 5] 1v1",
desc: `Bring three Pokémon to Team Preview and choose one to battle.`,
@@ -5162,13 +5163,6 @@ export const Formats: import('../sim/dex-formats').FormatList = [
section: "Past Generations",
column: 4,
},
- {
- name: "[Gen 3] Ubers",
- mod: 'gen3',
- searchShow: false,
- ruleset: ['Standard', 'Deoxys Camouflage Clause', 'One Baton Pass Clause'],
- banlist: ['Wobbuffet + Leftovers', 'Wynaut + Leftovers', 'Baton Pass'],
- },
{
name: "[Gen 3] RU",
mod: 'gen3',
@@ -5285,6 +5279,12 @@ export const Formats: import('../sim/dex-formats').FormatList = [
debug: true,
ruleset: ['HP Percentage Mod', 'Cancel Mod', 'Max Team Size = 24', 'Max Move Count = 24', 'Max Level = 9999', 'Default Level = 100'],
},
+ {
+ name: "[Gen 2] Ubers",
+ mod: 'gen2',
+ searchShow: false,
+ ruleset: ['Standard'],
+ },
{
name: "[Gen 2] UU",
mod: 'gen2',
@@ -5433,17 +5433,6 @@ export const Formats: import('../sim/dex-formats').FormatList = [
searchShow: false,
ruleset: ['[Gen 1] OU', 'Allow Tradeback'],
},
- {
- name: "[Gen 1] NC 1997",
- mod: 'gen1jpn',
- bestOfDefault: true,
- searchShow: false,
- ruleset: [
- 'Picked Team Size = 3', 'Min Level = 50', 'Max Level = 55', 'Max Total Level = 155',
- 'Obtainable', 'Team Preview', 'Stadium Sleep Clause', 'Species Clause', 'Nickname Clause', 'Cancel Mod', 'NC 1997 Move Legality',
- ],
- banlist: ['Uber'],
- },
{
name: "[Gen 1] Custom Game",
mod: 'gen1',
diff --git a/data/aliases.ts b/data/aliases.ts
index a56fc4ab90..72eb6bfa03 100644
--- a/data/aliases.ts
+++ b/data/aliases.ts
@@ -91,10 +91,10 @@ export const Aliases: import('../sim/dex').AliasesTable = {
zaou: "[Gen 9] Legends Z-A OU",
legendsou: "[Gen 9] Legends Z-A OU",
plzaou: "[Gen 9] Legends Z-A OU",
- omotm: "[Gen 9] Tier Shift",
- lcotm: "[Gen 9] Bio Mech Mons",
- ommotm: "[Gen 9] NatDex Camove Chaos",
- ommspotlight: "[Gen 9] NatDex Camove Chaos",
+ omotm: "[Gen 9] Flipped",
+ lcotm: "[Gen 9] The Loser's Game",
+ ommotm: "[Gen 9] STABmons Mix and Mega",
+ ommspotlight: "[Gen 9] STABmons Mix and Mega",
// mega evos --- 1st ordered alphabetically by species, 2nd by alias
megasnow: "Abomasnow-Mega",