@pkmn/sim 0.5.20 → 0.5.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/config/formats.js +330 -285
- package/build/config/formats.js.map +1 -1
- package/build/data/aliases.js +2 -2
- package/build/data/aliases.js.map +1 -1
- package/build/data/formats-data.js +16 -12
- package/build/data/formats-data.js.map +1 -1
- package/build/data/learnsets.js +29 -0
- package/build/data/learnsets.js.map +1 -1
- package/build/data/mods/gen1/conditions.js +4 -0
- package/build/data/mods/gen1/conditions.js.map +1 -1
- package/build/data/mods/gen1/formats-data.js +3 -3
- package/build/data/mods/gen1/formats-data.js.map +1 -1
- package/build/data/mods/gen1/moves.js +0 -4
- package/build/data/mods/gen1/moves.js.map +1 -1
- package/build/data/mods/gen2/learnsets.js +2 -2
- package/build/data/mods/gen2/learnsets.js.map +1 -1
- package/build/data/mods/gen2/scripts.js +16 -0
- package/build/data/mods/gen2/scripts.js.map +1 -1
- package/build/data/mods/gen4/formats-data.js +1 -1
- package/build/data/mods/gen4/formats-data.js.map +1 -1
- package/build/data/mods/gen6/formats-data.js +1 -1
- package/build/data/mods/gen6/formats-data.js.map +1 -1
- package/build/data/mods/gen6/learnsets.js +0 -75
- package/build/data/mods/gen6/learnsets.js.map +1 -1
- package/build/data/pokedex.js +12 -0
- package/build/data/pokedex.js.map +1 -1
- package/build/data/rulesets.js +29 -0
- package/build/data/rulesets.js.map +1 -1
- package/build/data/tags.js +2 -2
- package/build/data/tags.js.map +1 -1
- package/config/formats.ts +321 -282
- package/data/aliases.ts +2 -2
- package/data/formats-data.ts +16 -12
- package/data/learnsets.ts +29 -0
- package/data/mods/gen1/conditions.ts +4 -0
- package/data/mods/gen1/formats-data.ts +3 -3
- package/data/mods/gen1/moves.ts +0 -3
- package/data/mods/gen2/learnsets.ts +2 -2
- package/data/mods/gen2/scripts.ts +16 -0
- package/data/mods/gen4/formats-data.ts +1 -1
- package/data/mods/gen6/formats-data.ts +1 -1
- package/data/mods/gen6/learnsets.ts +0 -75
- package/data/pokedex.ts +12 -0
- package/data/rulesets.ts +28 -0
- package/data/tags.ts +2 -2
- package/package.json +1 -1
package/build/config/formats.js
CHANGED
|
@@ -154,7 +154,7 @@ exports.Formats = [
|
|
|
154
154
|
mod: 'gen8',
|
|
155
155
|
ruleset: ['Little Cup', 'Standard', 'Dynamax Clause'],
|
|
156
156
|
banlist: [
|
|
157
|
-
'Corsola-Galar', 'Cutiefly', 'Drifloon', 'Gastly', 'Gothita', 'Rufflet', 'Scraggy', 'Scyther', 'Sneasel', 'Swirlix', 'Tangela', '
|
|
157
|
+
'Corsola-Galar', 'Cutiefly', 'Drifloon', 'Gastly', 'Gothita', 'Rufflet', 'Scraggy', 'Scyther', 'Sneasel', 'Swirlix', 'Tangela', 'Vulpix-Alola', 'Woobat', 'Zigzagoon-Base',
|
|
158
158
|
'Chlorophyll', 'Moody', 'Baton Pass', 'Sticky Web',
|
|
159
159
|
],
|
|
160
160
|
},
|
|
@@ -233,8 +233,8 @@ exports.Formats = [
|
|
|
233
233
|
banlist: [
|
|
234
234
|
// LC OU
|
|
235
235
|
'Abra', 'Carvanha', 'Diglett-Base', 'Dwebble', 'Ferroseed', 'Foongus', 'Frillish', 'Grookey', 'Koffing',
|
|
236
|
-
'Larvesta', 'Magby', 'Magnemite', 'Mareanie', 'Mienfoo', 'Mudbray', '
|
|
237
|
-
'Ponyta
|
|
236
|
+
'Larvesta', 'Magby', 'Magnemite', 'Mareanie', 'Mienfoo', 'Mudbray', 'Natu', 'Onix', 'Pawniard',
|
|
237
|
+
'Ponyta-Base', 'Porygon', 'Slowpoke-Base', 'Staryu', 'Timburr', 'Trapinch', 'Tyrunt', 'Vullaby',
|
|
238
238
|
// LC UUBL
|
|
239
239
|
'Archen', 'Farfetch\u2019d-Galar', 'Scorbunny', 'Shellder', 'Wingull',
|
|
240
240
|
],
|
|
@@ -379,10 +379,10 @@ exports.Formats = [
|
|
|
379
379
|
'Standard Doubles', 'Accuracy Moves Clause', 'Dynamax Clause', 'Sleep Clause Mod',
|
|
380
380
|
],
|
|
381
381
|
banlist: [
|
|
382
|
-
'Calyrex-Ice', 'Calyrex-Shadow', 'Dialga', 'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Jirachi', 'Kyogre',
|
|
383
|
-
'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Rayquaza',
|
|
384
|
-
'Solgaleo', 'Tornadus-Base', 'Urshifu-Base', 'Urshifu-Rapid-Strike', 'Whimsicott', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned',
|
|
385
|
-
'Zamazenta-Crowned', 'Zekrom', 'Moody', 'Power Construct', 'Focus Sash', 'Ally Switch', 'Final Gambit', 'Perish Song', 'Swagger',
|
|
382
|
+
'Calyrex-Ice', 'Calyrex-Shadow', 'Cottonee', 'Dialga', 'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Jirachi', 'Kyogre',
|
|
383
|
+
'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Rayquaza',
|
|
384
|
+
'Reshiram', 'Solgaleo', 'Tornadus-Base', 'Urshifu-Base', 'Urshifu-Rapid-Strike', 'Whimsicott', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned',
|
|
385
|
+
'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Moody', 'Power Construct', 'Focus Sash', 'Ally Switch', 'Final Gambit', 'Perish Song', 'Swagger',
|
|
386
386
|
],
|
|
387
387
|
},
|
|
388
388
|
{
|
|
@@ -578,36 +578,271 @@ exports.Formats = [
|
|
|
578
578
|
column: 2,
|
|
579
579
|
},
|
|
580
580
|
{
|
|
581
|
-
name: "[Gen 8]
|
|
582
|
-
desc: `Pokémon
|
|
581
|
+
name: "[Gen 8] Broken Record",
|
|
582
|
+
desc: `Pokémon can hold a TR to use that move in battle.`,
|
|
583
583
|
threads: [
|
|
584
|
-
`• <a href="https://www.smogon.com/forums/threads/
|
|
584
|
+
`• <a href="https://www.smogon.com/forums/threads/3701270/">Broken Record</a>`,
|
|
585
585
|
],
|
|
586
586
|
mod: 'gen8',
|
|
587
|
-
ruleset: ['Standard', '
|
|
587
|
+
ruleset: ['Standard', '!Sleep Clause Mod', 'Sleep Moves Clause', 'Dynamax Clause'],
|
|
588
588
|
banlist: [
|
|
589
589
|
'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Eternatus', 'Genesect', 'Giratina', 'Giratina-Origin',
|
|
590
|
-
'Groudon', 'Ho-Oh', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala', 'Magearna', 'Marshadow',
|
|
591
|
-
'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', '
|
|
592
|
-
'
|
|
593
|
-
'
|
|
590
|
+
'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala', 'Magearna', 'Marshadow',
|
|
591
|
+
'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Regieleki', 'Reshiram', 'Solgaleo',
|
|
592
|
+
'Spectrier', 'Urshifu-Base', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Zygarde-Base',
|
|
593
|
+
'Arena Trap', 'Magnet Pull', 'Moody', 'Power Construct', 'Shadow Tag', 'TR29 (Baton Pass)', 'TR82 (Stored Power)', 'Baton Pass',
|
|
594
594
|
],
|
|
595
|
+
onValidateSet(set) {
|
|
596
|
+
if (!set.item)
|
|
597
|
+
return;
|
|
598
|
+
const item = this.dex.items.get(set.item);
|
|
599
|
+
if (!/^tr\d\d/i.test(item.name))
|
|
600
|
+
return;
|
|
601
|
+
const moveName = item.desc.split('move ')[1].split('.')[0];
|
|
602
|
+
if (set.moves.map(this.toID).includes(this.toID(moveName))) {
|
|
603
|
+
return [
|
|
604
|
+
`${set.species} can't run ${item.name} (${moveName}) as its item because it already has that move in its moveset.`,
|
|
605
|
+
];
|
|
606
|
+
}
|
|
607
|
+
},
|
|
608
|
+
onValidateTeam(team) {
|
|
609
|
+
const trs = new Set();
|
|
610
|
+
for (const set of team) {
|
|
611
|
+
if (!set.item)
|
|
612
|
+
continue;
|
|
613
|
+
const item = this.dex.items.get(set.item).name;
|
|
614
|
+
if (!/^tr\d\d/i.test(item))
|
|
615
|
+
continue;
|
|
616
|
+
if (trs.has(item)) {
|
|
617
|
+
return [`Your team already has a Pok\u00e9mon with ${item}.`];
|
|
618
|
+
}
|
|
619
|
+
trs.add(item);
|
|
620
|
+
}
|
|
621
|
+
},
|
|
622
|
+
onTakeItem(item) {
|
|
623
|
+
return !/^tr\d\d/i.test(item.name);
|
|
624
|
+
},
|
|
625
|
+
onModifyMove(move) {
|
|
626
|
+
if (move.id === 'knockoff') {
|
|
627
|
+
move.onBasePower = function (basePower, source, target, m) {
|
|
628
|
+
const item = target.getItem();
|
|
629
|
+
if (!this.singleEvent('TakeItem', item, target.itemState, target, target, m, item))
|
|
630
|
+
return;
|
|
631
|
+
// Very hardcode but I'd prefer to not make a mod for one damage calculation change
|
|
632
|
+
if (item.id && !/^tr\d\d/i.test(item.id)) {
|
|
633
|
+
return this.chainModify(1.5);
|
|
634
|
+
}
|
|
635
|
+
};
|
|
636
|
+
}
|
|
637
|
+
},
|
|
638
|
+
onBegin() {
|
|
639
|
+
for (const pokemon of this.getAllPokemon()) {
|
|
640
|
+
const item = pokemon.getItem();
|
|
641
|
+
if (/^tr\d\d/i.test(item.name)) {
|
|
642
|
+
const move = this.dex.moves.get(item.desc.split('move ')[1].split('.')[0]);
|
|
643
|
+
pokemon.moveSlots = pokemon.baseMoveSlots = [
|
|
644
|
+
...pokemon.baseMoveSlots, {
|
|
645
|
+
id: move.id,
|
|
646
|
+
move: move.name,
|
|
647
|
+
pp: move.pp * 8 / 5,
|
|
648
|
+
maxpp: move.pp * 8 / 5,
|
|
649
|
+
target: move.target,
|
|
650
|
+
disabled: false,
|
|
651
|
+
disabledSource: '',
|
|
652
|
+
used: false,
|
|
653
|
+
},
|
|
654
|
+
];
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
},
|
|
595
658
|
},
|
|
596
659
|
{
|
|
597
|
-
name: "[Gen 8]
|
|
598
|
-
desc: `
|
|
660
|
+
name: "[Gen 8] Inheritance",
|
|
661
|
+
desc: `Pokémon may use the ability and moves of another, as long as they forfeit their own learnset.`,
|
|
599
662
|
threads: [
|
|
600
|
-
`• <a href="https://www.smogon.com/forums/threads/
|
|
663
|
+
`• <a href="https://www.smogon.com/forums/threads/3656811/">Inheritance</a>`,
|
|
601
664
|
],
|
|
602
665
|
mod: 'gen8',
|
|
603
|
-
|
|
666
|
+
// searchShow: false,
|
|
667
|
+
ruleset: ['Standard', '!Sleep Clause Mod', 'Sleep Moves Clause', '2 Ability Clause', 'Dynamax Clause'],
|
|
604
668
|
banlist: [
|
|
605
|
-
'
|
|
606
|
-
'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem
|
|
607
|
-
'Mewtwo', '
|
|
608
|
-
'
|
|
609
|
-
'
|
|
669
|
+
'Blacephalon', 'Blaziken', 'Butterfree', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chansey', 'Combusken', 'Cresselia', 'Darmanitan-Galar', 'Dialga', 'Dracovish',
|
|
670
|
+
'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala',
|
|
671
|
+
'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Natu', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Regieleki',
|
|
672
|
+
'Regigigas', 'Reshiram', 'Sableye', 'Shedinja', 'Solgaleo', 'Spectrier', 'Tapu Koko', 'Toxtricity', 'Torkoal', 'Urshifu-Base', 'Xatu', 'Xerneas', 'Yveltal',
|
|
673
|
+
'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zeraora', 'Zekrom', 'Arena Trap', 'Contrary', 'Drizzle', 'Huge Power', 'Imposter', 'Innards Out',
|
|
674
|
+
'Libero', 'Moody', 'Power Construct', 'Pure Power', 'Quick Draw', 'Shadow Tag', 'Sheer Force', 'Simple', 'Unaware', 'Unburden', 'Water Bubble', 'King\'s Rock',
|
|
675
|
+
'Quick Claw', 'Baton Pass', 'Bolt Beak', 'Fishious Rend', 'Shell Smash', 'Thousand Arrows',
|
|
610
676
|
],
|
|
677
|
+
getEvoFamily(speciesid) {
|
|
678
|
+
let species = Dex.species.get(speciesid);
|
|
679
|
+
while (species.prevo) {
|
|
680
|
+
species = Dex.species.get(species.prevo);
|
|
681
|
+
}
|
|
682
|
+
return species.id;
|
|
683
|
+
},
|
|
684
|
+
validateSet(set, teamHas) {
|
|
685
|
+
const unreleased = (pokemon) => pokemon.tier === "Unreleased" && pokemon.isNonstandard === "Unobtainable";
|
|
686
|
+
if (!teamHas.abilityMap) {
|
|
687
|
+
teamHas.abilityMap = Object.create(null);
|
|
688
|
+
for (const pokemon of Dex.species.all()) {
|
|
689
|
+
if (pokemon.isNonstandard || unreleased(pokemon))
|
|
690
|
+
continue;
|
|
691
|
+
if (pokemon.requiredAbility || pokemon.requiredItem || pokemon.requiredMove)
|
|
692
|
+
continue;
|
|
693
|
+
if (this.ruleTable.isBannedSpecies(pokemon))
|
|
694
|
+
continue;
|
|
695
|
+
for (const key of Object.values(pokemon.abilities)) {
|
|
696
|
+
const abilityId = this.dex.toID(key);
|
|
697
|
+
if (abilityId in teamHas.abilityMap) {
|
|
698
|
+
teamHas.abilityMap[abilityId][pokemon.evos ? 'push' : 'unshift'](pokemon.id);
|
|
699
|
+
}
|
|
700
|
+
else {
|
|
701
|
+
teamHas.abilityMap[abilityId] = [pokemon.id];
|
|
702
|
+
}
|
|
703
|
+
}
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
const problem = this.validateForme(set);
|
|
707
|
+
if (problem.length)
|
|
708
|
+
return problem;
|
|
709
|
+
const species = this.dex.species.get(set.species);
|
|
710
|
+
if (!species.exists || species.num < 1)
|
|
711
|
+
return [`The Pok\u00e9mon "${set.species}" does not exist.`];
|
|
712
|
+
if (species.isNonstandard || unreleased(species)) {
|
|
713
|
+
return [`${species.name} is not obtainable in Generation ${this.dex.gen}.`];
|
|
714
|
+
}
|
|
715
|
+
const name = set.name;
|
|
716
|
+
if (this.ruleTable.isBannedSpecies(species)) {
|
|
717
|
+
return this.validateSet(set, teamHas);
|
|
718
|
+
}
|
|
719
|
+
const ability = this.dex.abilities.get(set.ability);
|
|
720
|
+
if (!ability.exists || ability.isNonstandard)
|
|
721
|
+
return [`${name} needs to have a valid ability.`];
|
|
722
|
+
const pokemonWithAbility = teamHas.abilityMap[ability.id];
|
|
723
|
+
if (!pokemonWithAbility)
|
|
724
|
+
return [`${ability.name} is not available on a legal Pok\u00e9mon.`];
|
|
725
|
+
this.format.debug = true;
|
|
726
|
+
if (!teamHas.abilitySources)
|
|
727
|
+
teamHas.abilitySources = Object.create(null);
|
|
728
|
+
const validSources = teamHas.abilitySources[this.dex.toID(set.species)] = []; // Evolution families
|
|
729
|
+
let canonicalSource = ''; // Specific for the basic implementation of Donor Clause (see onValidateTeam).
|
|
730
|
+
for (const donor of pokemonWithAbility) {
|
|
731
|
+
const donorSpecies = this.dex.species.get(donor);
|
|
732
|
+
let format = this.format;
|
|
733
|
+
if (!format.getEvoFamily)
|
|
734
|
+
format = this.dex.formats.get('gen8inheritance');
|
|
735
|
+
const evoFamily = format.getEvoFamily(donorSpecies.id);
|
|
736
|
+
if (validSources.includes(evoFamily))
|
|
737
|
+
continue;
|
|
738
|
+
set.species = donorSpecies.name;
|
|
739
|
+
set.name = donorSpecies.baseSpecies;
|
|
740
|
+
const problems = this.validateSet(set, teamHas) || [];
|
|
741
|
+
if (!problems.length) {
|
|
742
|
+
validSources.push(evoFamily);
|
|
743
|
+
canonicalSource = donorSpecies.name;
|
|
744
|
+
}
|
|
745
|
+
// Specific for the basic implementation of Donor Clause (see onValidateTeam).
|
|
746
|
+
if (validSources.length > 1)
|
|
747
|
+
break;
|
|
748
|
+
}
|
|
749
|
+
this.format.debug = false;
|
|
750
|
+
set.name = name;
|
|
751
|
+
set.species = species.name;
|
|
752
|
+
if (!validSources.length) {
|
|
753
|
+
if (pokemonWithAbility.length > 1)
|
|
754
|
+
return [`${name}'s set is illegal.`];
|
|
755
|
+
return [`${name} has an illegal set with an ability from ${this.dex.species.get(pokemonWithAbility[0]).name}.`];
|
|
756
|
+
}
|
|
757
|
+
// Protocol: Include the data of the donor species in the `ability` data slot.
|
|
758
|
+
// Afterwards, we are going to reset the name to what the user intended.
|
|
759
|
+
set.ability = `${set.ability}0${canonicalSource}`;
|
|
760
|
+
return null;
|
|
761
|
+
},
|
|
762
|
+
onValidateTeam(team, f, teamHas) {
|
|
763
|
+
if (this.ruleTable.has('2abilityclause')) {
|
|
764
|
+
const abilityTable = new Map();
|
|
765
|
+
const base = {
|
|
766
|
+
airlock: 'cloudnine',
|
|
767
|
+
battlearmor: 'shellarmor',
|
|
768
|
+
clearbody: 'whitesmoke',
|
|
769
|
+
dazzling: 'queenlymajesty',
|
|
770
|
+
emergencyexit: 'wimpout',
|
|
771
|
+
filter: 'solidrock',
|
|
772
|
+
gooey: 'tanglinghair',
|
|
773
|
+
insomnia: 'vitalspirit',
|
|
774
|
+
ironbarbs: 'roughskin',
|
|
775
|
+
libero: 'protean',
|
|
776
|
+
minus: 'plus',
|
|
777
|
+
moxie: 'chillingneigh',
|
|
778
|
+
powerofalchemy: 'receiver',
|
|
779
|
+
propellertail: 'stalwart',
|
|
780
|
+
teravolt: 'moldbreaker',
|
|
781
|
+
turboblaze: 'moldbreaker',
|
|
782
|
+
};
|
|
783
|
+
for (const set of team) {
|
|
784
|
+
let ability = this.toID(set.ability.split('0')[0]);
|
|
785
|
+
if (!ability)
|
|
786
|
+
continue;
|
|
787
|
+
if (ability in base)
|
|
788
|
+
ability = base[ability];
|
|
789
|
+
if ((abilityTable.get(ability) || 0) >= 2) {
|
|
790
|
+
return [
|
|
791
|
+
`You are limited to two of each ability by 2 Ability Clause.`,
|
|
792
|
+
`(You have more than two ${this.dex.abilities.get(ability).name} variants)`,
|
|
793
|
+
];
|
|
794
|
+
}
|
|
795
|
+
abilityTable.set(ability, (abilityTable.get(ability) || 0) + 1);
|
|
796
|
+
}
|
|
797
|
+
}
|
|
798
|
+
// Donor Clause
|
|
799
|
+
const evoFamilyLists = [];
|
|
800
|
+
for (const set of team) {
|
|
801
|
+
const abilitySources = teamHas.abilitySources?.[this.dex.toID(set.species)];
|
|
802
|
+
if (!abilitySources)
|
|
803
|
+
continue;
|
|
804
|
+
let format = this.format;
|
|
805
|
+
if (!format.getEvoFamily)
|
|
806
|
+
format = this.dex.formats.get('gen8inheritance');
|
|
807
|
+
evoFamilyLists.push(abilitySources.map(format.getEvoFamily));
|
|
808
|
+
}
|
|
809
|
+
// Checking actual full incompatibility would require expensive algebra.
|
|
810
|
+
// Instead, we only check the trivial case of multiple Pokémon only legal for exactly one family. FIXME?
|
|
811
|
+
const requiredFamilies = Object.create(null);
|
|
812
|
+
for (const evoFamilies of evoFamilyLists) {
|
|
813
|
+
if (evoFamilies.length !== 1)
|
|
814
|
+
continue;
|
|
815
|
+
const [familyId] = evoFamilies;
|
|
816
|
+
if (!(familyId in requiredFamilies))
|
|
817
|
+
requiredFamilies[familyId] = 1;
|
|
818
|
+
requiredFamilies[familyId]++;
|
|
819
|
+
if (requiredFamilies[familyId] > 2) {
|
|
820
|
+
return [
|
|
821
|
+
`You are limited to up to two inheritances from each evolution family by the Donor Clause.`,
|
|
822
|
+
`(You inherit more than twice from ${this.dex.species.get(familyId).name}).`,
|
|
823
|
+
];
|
|
824
|
+
}
|
|
825
|
+
}
|
|
826
|
+
},
|
|
827
|
+
onBegin() {
|
|
828
|
+
for (const pokemon of this.getAllPokemon()) {
|
|
829
|
+
if (pokemon.baseAbility.includes('0')) {
|
|
830
|
+
const donor = pokemon.baseAbility.split('0')[1];
|
|
831
|
+
pokemon.m.donor = this.toID(donor);
|
|
832
|
+
pokemon.baseAbility = this.toID(pokemon.baseAbility.split('0')[0]);
|
|
833
|
+
pokemon.ability = pokemon.baseAbility;
|
|
834
|
+
}
|
|
835
|
+
}
|
|
836
|
+
},
|
|
837
|
+
onSwitchIn(pokemon) {
|
|
838
|
+
if (!pokemon.m.donor)
|
|
839
|
+
return;
|
|
840
|
+
const donorTemplate = this.dex.species.get(pokemon.m.donor);
|
|
841
|
+
if (!donorTemplate.exists)
|
|
842
|
+
return;
|
|
843
|
+
// Place volatiles on the Pokémon to show the donor details.
|
|
844
|
+
this.add('-start', pokemon, donorTemplate.name, '[silent]');
|
|
845
|
+
},
|
|
611
846
|
},
|
|
612
847
|
// Other Metagames
|
|
613
848
|
///////////////////////////////////////////////////////////////////
|
|
@@ -628,8 +863,8 @@ exports.Formats = [
|
|
|
628
863
|
'Calyrex-Shadow', 'Cramorant-Gorging', 'Darmanitan-Galar-Zen', 'Eternatus-Eternamax', 'Shedinja', 'Zacian-Crowned',
|
|
629
864
|
'Arena Trap', 'Contrary', 'Gorilla Tactics', 'Huge Power', 'Illusion', 'Innards Out', 'Intrepid Sword', 'Libero',
|
|
630
865
|
'Magnet Pull', 'Moody', 'Neutralizing Gas', 'Parental Bond', 'Protean', 'Pure Power', 'Shadow Tag', 'Stakeout',
|
|
631
|
-
'Water Bubble', 'Wonder Guard', 'Comatose + Sleep Talk', 'Rusted Sword', '
|
|
632
|
-
'Octolock', 'Shell Smash',
|
|
866
|
+
'Water Bubble', 'Wonder Guard', 'Comatose + Sleep Talk', 'Rusted Sword', 'Belly Drum', 'Bolt Beak', 'Court Change',
|
|
867
|
+
'Double Iron Bash', 'Octolock', 'Shell Smash',
|
|
633
868
|
],
|
|
634
869
|
},
|
|
635
870
|
{
|
|
@@ -740,9 +975,9 @@ exports.Formats = [
|
|
|
740
975
|
'Arena Trap', 'Magnet Pull', 'Moody', 'Power Construct', 'Shadow Tag', 'King\'s Rock', 'Baton Pass',
|
|
741
976
|
],
|
|
742
977
|
restricted: [
|
|
743
|
-
'Acupressure', 'Astral Barrage', 'Belly Drum', 'Bolt Beak', 'Clangorous Soul', 'Double Iron Bash', 'Electrify', 'Extreme Speed', '
|
|
744
|
-
'Geomancy', 'Glacial Lance', 'Oblivion Wing', 'Precipice Blades', 'Shell Smash', 'Shift Gear', 'Thousand Arrows', 'Thunderous Kick',
|
|
745
|
-
'Wicked Blow',
|
|
978
|
+
'Acupressure', 'Astral Barrage', 'Belly Drum', 'Bolt Beak', 'Clangorous Soul', 'Double Iron Bash', 'Electrify', 'Extreme Speed', 'Final Gambit',
|
|
979
|
+
'Fishious Rend', 'Geomancy', 'Glacial Lance', 'Oblivion Wing', 'Precipice Blades', 'Shell Smash', 'Shift Gear', 'Thousand Arrows', 'Thunderous Kick',
|
|
980
|
+
'V-create', 'Wicked Blow',
|
|
746
981
|
],
|
|
747
982
|
},
|
|
748
983
|
{
|
|
@@ -929,7 +1164,7 @@ exports.Formats = [
|
|
|
929
1164
|
],
|
|
930
1165
|
mod: 'gen8bdsp',
|
|
931
1166
|
ruleset: ['Little Cup', 'Standard'],
|
|
932
|
-
banlist: ['Gligar', 'Meditite', 'Misdreavus', 'Murkrow', 'Scyther', 'Sneasel', 'Tangela', 'Vulpix', 'Yanma', 'Moody', 'Baton Pass', 'Sticky Web'],
|
|
1167
|
+
banlist: ['Gligar', 'Meditite', 'Misdreavus', 'Munchlax', 'Murkrow', 'Scyther', 'Sneasel', 'Tangela', 'Vulpix', 'Yanma', 'Moody', 'Baton Pass', 'Sticky Web'],
|
|
933
1168
|
},
|
|
934
1169
|
{
|
|
935
1170
|
name: "[Gen 8 BDSP] Monotype",
|
|
@@ -1157,194 +1392,6 @@ exports.Formats = [
|
|
|
1157
1392
|
}
|
|
1158
1393
|
},
|
|
1159
1394
|
},
|
|
1160
|
-
{
|
|
1161
|
-
name: "[Gen 8] Inheritance",
|
|
1162
|
-
desc: `Pokémon may use the ability and moves of another, as long as they forfeit their own learnset.`,
|
|
1163
|
-
threads: [
|
|
1164
|
-
`• <a href="https://www.smogon.com/forums/threads/3656811/">Inheritance</a>`,
|
|
1165
|
-
],
|
|
1166
|
-
mod: 'gen8',
|
|
1167
|
-
searchShow: false,
|
|
1168
|
-
ruleset: ['Standard', '2 Ability Clause', 'Dynamax Clause'],
|
|
1169
|
-
banlist: [
|
|
1170
|
-
'Blacephalon', 'Blaziken', 'Butterfree', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chansey', 'Combusken', 'Cresselia', 'Darmanitan-Galar', 'Dialga', 'Dracovish',
|
|
1171
|
-
'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala',
|
|
1172
|
-
'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Natu', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Regieleki',
|
|
1173
|
-
'Regigigas', 'Reshiram', 'Sableye', 'Shedinja', 'Solgaleo', 'Spectrier', 'Tapu Koko', 'Toxtricity', 'Torkoal', 'Urshifu-Base', 'Xatu', 'Xerneas', 'Yveltal',
|
|
1174
|
-
'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zeraora', 'Zekrom', 'Arena Trap', 'Contrary', 'Drizzle', 'Huge Power', 'Imposter', 'Innards Out',
|
|
1175
|
-
'Libero', 'Moody', 'Power Construct', 'Pure Power', 'Quick Draw', 'Shadow Tag', 'Sheer Force', 'Simple', 'Unaware', 'Unburden', 'Water Bubble', 'King\'s Rock',
|
|
1176
|
-
'Quick Claw', 'Baton Pass', 'Bolt Beak', 'Fishious Rend', 'Shell Smash', 'Thousand Arrows',
|
|
1177
|
-
],
|
|
1178
|
-
getEvoFamily(speciesid) {
|
|
1179
|
-
let species = Dex.species.get(speciesid);
|
|
1180
|
-
while (species.prevo) {
|
|
1181
|
-
species = Dex.species.get(species.prevo);
|
|
1182
|
-
}
|
|
1183
|
-
return species.id;
|
|
1184
|
-
},
|
|
1185
|
-
validateSet(set, teamHas) {
|
|
1186
|
-
const unreleased = (pokemon) => pokemon.tier === "Unreleased" && pokemon.isNonstandard === "Unobtainable";
|
|
1187
|
-
if (!teamHas.abilityMap) {
|
|
1188
|
-
teamHas.abilityMap = Object.create(null);
|
|
1189
|
-
for (const pokemon of Dex.species.all()) {
|
|
1190
|
-
if (pokemon.isNonstandard || unreleased(pokemon))
|
|
1191
|
-
continue;
|
|
1192
|
-
if (pokemon.requiredAbility || pokemon.requiredItem || pokemon.requiredMove)
|
|
1193
|
-
continue;
|
|
1194
|
-
if (this.ruleTable.isBannedSpecies(pokemon))
|
|
1195
|
-
continue;
|
|
1196
|
-
for (const key of Object.values(pokemon.abilities)) {
|
|
1197
|
-
const abilityId = this.dex.toID(key);
|
|
1198
|
-
if (abilityId in teamHas.abilityMap) {
|
|
1199
|
-
teamHas.abilityMap[abilityId][pokemon.evos ? 'push' : 'unshift'](pokemon.id);
|
|
1200
|
-
}
|
|
1201
|
-
else {
|
|
1202
|
-
teamHas.abilityMap[abilityId] = [pokemon.id];
|
|
1203
|
-
}
|
|
1204
|
-
}
|
|
1205
|
-
}
|
|
1206
|
-
}
|
|
1207
|
-
const problem = this.validateForme(set);
|
|
1208
|
-
if (problem.length)
|
|
1209
|
-
return problem;
|
|
1210
|
-
const species = this.dex.species.get(set.species);
|
|
1211
|
-
if (!species.exists || species.num < 1)
|
|
1212
|
-
return [`The Pok\u00e9mon "${set.species}" does not exist.`];
|
|
1213
|
-
if (species.isNonstandard || unreleased(species)) {
|
|
1214
|
-
return [`${species.name} is not obtainable in Generation ${this.dex.gen}.`];
|
|
1215
|
-
}
|
|
1216
|
-
const name = set.name;
|
|
1217
|
-
if (this.ruleTable.isBannedSpecies(species)) {
|
|
1218
|
-
return this.validateSet(set, teamHas);
|
|
1219
|
-
}
|
|
1220
|
-
const ability = this.dex.abilities.get(set.ability);
|
|
1221
|
-
if (!ability.exists || ability.isNonstandard)
|
|
1222
|
-
return [`${name} needs to have a valid ability.`];
|
|
1223
|
-
const pokemonWithAbility = teamHas.abilityMap[ability.id];
|
|
1224
|
-
if (!pokemonWithAbility)
|
|
1225
|
-
return [`${ability.name} is not available on a legal Pok\u00e9mon.`];
|
|
1226
|
-
this.format.debug = true;
|
|
1227
|
-
if (!teamHas.abilitySources)
|
|
1228
|
-
teamHas.abilitySources = Object.create(null);
|
|
1229
|
-
const validSources = teamHas.abilitySources[this.dex.toID(set.species)] = []; // Evolution families
|
|
1230
|
-
let canonicalSource = ''; // Specific for the basic implementation of Donor Clause (see onValidateTeam).
|
|
1231
|
-
for (const donor of pokemonWithAbility) {
|
|
1232
|
-
const donorSpecies = this.dex.species.get(donor);
|
|
1233
|
-
let format = this.format;
|
|
1234
|
-
if (!format.getEvoFamily)
|
|
1235
|
-
format = this.dex.formats.get('gen8inheritance');
|
|
1236
|
-
const evoFamily = format.getEvoFamily(donorSpecies.id);
|
|
1237
|
-
if (validSources.includes(evoFamily))
|
|
1238
|
-
continue;
|
|
1239
|
-
set.species = donorSpecies.name;
|
|
1240
|
-
set.name = donorSpecies.baseSpecies;
|
|
1241
|
-
const problems = this.validateSet(set, teamHas) || [];
|
|
1242
|
-
if (!problems.length) {
|
|
1243
|
-
validSources.push(evoFamily);
|
|
1244
|
-
canonicalSource = donorSpecies.name;
|
|
1245
|
-
}
|
|
1246
|
-
// Specific for the basic implementation of Donor Clause (see onValidateTeam).
|
|
1247
|
-
if (validSources.length > 1)
|
|
1248
|
-
break;
|
|
1249
|
-
}
|
|
1250
|
-
this.format.debug = false;
|
|
1251
|
-
set.name = name;
|
|
1252
|
-
set.species = species.name;
|
|
1253
|
-
if (!validSources.length) {
|
|
1254
|
-
if (pokemonWithAbility.length > 1)
|
|
1255
|
-
return [`${name}'s set is illegal.`];
|
|
1256
|
-
return [`${name} has an illegal set with an ability from ${this.dex.species.get(pokemonWithAbility[0]).name}.`];
|
|
1257
|
-
}
|
|
1258
|
-
// Protocol: Include the data of the donor species in the `ability` data slot.
|
|
1259
|
-
// Afterwards, we are going to reset the name to what the user intended.
|
|
1260
|
-
set.ability = `${set.ability}0${canonicalSource}`;
|
|
1261
|
-
return null;
|
|
1262
|
-
},
|
|
1263
|
-
onValidateTeam(team, f, teamHas) {
|
|
1264
|
-
if (this.ruleTable.has('2abilityclause')) {
|
|
1265
|
-
const abilityTable = new Map();
|
|
1266
|
-
const base = {
|
|
1267
|
-
airlock: 'cloudnine',
|
|
1268
|
-
battlearmor: 'shellarmor',
|
|
1269
|
-
clearbody: 'whitesmoke',
|
|
1270
|
-
dazzling: 'queenlymajesty',
|
|
1271
|
-
emergencyexit: 'wimpout',
|
|
1272
|
-
filter: 'solidrock',
|
|
1273
|
-
gooey: 'tanglinghair',
|
|
1274
|
-
insomnia: 'vitalspirit',
|
|
1275
|
-
ironbarbs: 'roughskin',
|
|
1276
|
-
libero: 'protean',
|
|
1277
|
-
minus: 'plus',
|
|
1278
|
-
moxie: 'chillingneigh',
|
|
1279
|
-
powerofalchemy: 'receiver',
|
|
1280
|
-
propellertail: 'stalwart',
|
|
1281
|
-
teravolt: 'moldbreaker',
|
|
1282
|
-
turboblaze: 'moldbreaker',
|
|
1283
|
-
};
|
|
1284
|
-
for (const set of team) {
|
|
1285
|
-
let ability = this.toID(set.ability.split('0')[0]);
|
|
1286
|
-
if (!ability)
|
|
1287
|
-
continue;
|
|
1288
|
-
if (ability in base)
|
|
1289
|
-
ability = base[ability];
|
|
1290
|
-
if ((abilityTable.get(ability) || 0) >= 2) {
|
|
1291
|
-
return [
|
|
1292
|
-
`You are limited to two of each ability by 2 Ability Clause.`,
|
|
1293
|
-
`(You have more than two ${this.dex.abilities.get(ability).name} variants)`,
|
|
1294
|
-
];
|
|
1295
|
-
}
|
|
1296
|
-
abilityTable.set(ability, (abilityTable.get(ability) || 0) + 1);
|
|
1297
|
-
}
|
|
1298
|
-
}
|
|
1299
|
-
// Donor Clause
|
|
1300
|
-
const evoFamilyLists = [];
|
|
1301
|
-
for (const set of team) {
|
|
1302
|
-
const abilitySources = teamHas.abilitySources?.[this.dex.toID(set.species)];
|
|
1303
|
-
if (!abilitySources)
|
|
1304
|
-
continue;
|
|
1305
|
-
let format = this.format;
|
|
1306
|
-
if (!format.getEvoFamily)
|
|
1307
|
-
format = this.dex.formats.get('gen8inheritance');
|
|
1308
|
-
evoFamilyLists.push(abilitySources.map(format.getEvoFamily));
|
|
1309
|
-
}
|
|
1310
|
-
// Checking actual full incompatibility would require expensive algebra.
|
|
1311
|
-
// Instead, we only check the trivial case of multiple Pokémon only legal for exactly one family. FIXME?
|
|
1312
|
-
const requiredFamilies = Object.create(null);
|
|
1313
|
-
for (const evoFamilies of evoFamilyLists) {
|
|
1314
|
-
if (evoFamilies.length !== 1)
|
|
1315
|
-
continue;
|
|
1316
|
-
const [familyId] = evoFamilies;
|
|
1317
|
-
if (!(familyId in requiredFamilies))
|
|
1318
|
-
requiredFamilies[familyId] = 1;
|
|
1319
|
-
requiredFamilies[familyId]++;
|
|
1320
|
-
if (requiredFamilies[familyId] > 2) {
|
|
1321
|
-
return [
|
|
1322
|
-
`You are limited to up to two inheritances from each evolution family by the Donor Clause.`,
|
|
1323
|
-
`(You inherit more than twice from ${this.dex.species.get(familyId).name}).`,
|
|
1324
|
-
];
|
|
1325
|
-
}
|
|
1326
|
-
}
|
|
1327
|
-
},
|
|
1328
|
-
onBegin() {
|
|
1329
|
-
for (const pokemon of this.getAllPokemon()) {
|
|
1330
|
-
if (pokemon.baseAbility.includes('0')) {
|
|
1331
|
-
const donor = pokemon.baseAbility.split('0')[1];
|
|
1332
|
-
pokemon.m.donor = this.toID(donor);
|
|
1333
|
-
pokemon.baseAbility = this.toID(pokemon.baseAbility.split('0')[0]);
|
|
1334
|
-
pokemon.ability = pokemon.baseAbility;
|
|
1335
|
-
}
|
|
1336
|
-
}
|
|
1337
|
-
},
|
|
1338
|
-
onSwitchIn(pokemon) {
|
|
1339
|
-
if (!pokemon.m.donor)
|
|
1340
|
-
return;
|
|
1341
|
-
const donorTemplate = this.dex.species.get(pokemon.m.donor);
|
|
1342
|
-
if (!donorTemplate.exists)
|
|
1343
|
-
return;
|
|
1344
|
-
// Place volatiles on the Pokémon to show the donor details.
|
|
1345
|
-
this.add('-start', pokemon, donorTemplate.name, '[silent]');
|
|
1346
|
-
},
|
|
1347
|
-
},
|
|
1348
1395
|
{
|
|
1349
1396
|
name: "[Gen 8] Linked",
|
|
1350
1397
|
desc: `The first two moves in a Pokémon's moveset are used simultaneously.`,
|
|
@@ -2326,35 +2373,41 @@ exports.Formats = [
|
|
|
2326
2373
|
column: 3,
|
|
2327
2374
|
},
|
|
2328
2375
|
{
|
|
2329
|
-
name: "[Gen
|
|
2376
|
+
name: "[Gen 2] Ubers",
|
|
2330
2377
|
threads: [
|
|
2331
|
-
`• <a href="https://www.smogon.com/forums/
|
|
2332
|
-
`• <a href="https://www.smogon.com/forums/threads/3641346/">USM UU Viability Rankings</a>`,
|
|
2378
|
+
`• <a href="https://www.smogon.com/forums/posts/8286282/">GSC Ubers</a>`,
|
|
2333
2379
|
],
|
|
2334
|
-
mod: '
|
|
2380
|
+
mod: 'gen2',
|
|
2335
2381
|
// searchShow: false,
|
|
2336
|
-
ruleset: ['
|
|
2337
|
-
banlist: ['OU', 'UUBL', 'Drizzle', 'Drought', 'Kommonium Z', 'Mewnium Z'],
|
|
2382
|
+
ruleset: ['Standard'],
|
|
2338
2383
|
},
|
|
2339
2384
|
{
|
|
2340
|
-
name: "[Gen
|
|
2385
|
+
name: "[Gen 3] 1v1",
|
|
2386
|
+
desc: `Bring three Pokémon to Team Preview and choose one to battle.`,
|
|
2341
2387
|
threads: [
|
|
2342
|
-
`• <a href="https://www.smogon.com/
|
|
2343
|
-
`• <a href="https://www.smogon.com/forums/posts/8034679/">ORAS ZU Viability Rankings</a>`,
|
|
2388
|
+
`• <a href="https://www.smogon.com/forums/posts/8031456/">ADV 1v1</a>`,
|
|
2344
2389
|
],
|
|
2345
|
-
mod: '
|
|
2390
|
+
mod: 'gen3',
|
|
2346
2391
|
// searchShow: false,
|
|
2347
|
-
ruleset: [
|
|
2348
|
-
|
|
2392
|
+
ruleset: [
|
|
2393
|
+
'Picked Team Size = 1', 'Max Team Size = 3',
|
|
2394
|
+
'[Gen 3] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview', '!Freeze Clause Mod',
|
|
2395
|
+
],
|
|
2396
|
+
banlist: ['Clefable', 'Slaking', 'Snorlax', 'Suicune', 'Destiny Bond', 'Explosion', 'Ingrain', 'Perish Song', 'Self-Destruct', 'Bright Powder', 'Focus Band', 'King\'s Rock', 'Lax Incense', 'Quick Claw'],
|
|
2397
|
+
unbanlist: ['Mr. Mime', 'Wobbuffet', 'Wynaut', 'Sand Veil'],
|
|
2349
2398
|
},
|
|
2350
2399
|
{
|
|
2351
|
-
name: "[Gen 1]
|
|
2400
|
+
name: "[Gen 1] Stadium OU",
|
|
2352
2401
|
threads: [
|
|
2353
|
-
`• <a href="https://www.smogon.com/forums/
|
|
2402
|
+
`• <a href="https://www.smogon.com/forums/threads/3685877/">Stadium OU Viability Rankings</a>`,
|
|
2354
2403
|
],
|
|
2355
|
-
mod: '
|
|
2404
|
+
mod: 'gen1stadium',
|
|
2356
2405
|
// searchShow: false,
|
|
2357
|
-
ruleset: ['Standard'],
|
|
2406
|
+
ruleset: ['Standard', 'Team Preview'],
|
|
2407
|
+
banlist: ['Uber',
|
|
2408
|
+
'Nidoking + Fury Attack + Thrash', 'Exeggutor + Poison Powder + Stomp', 'Exeggutor + Sleep Powder + Stomp',
|
|
2409
|
+
'Exeggutor + Stun Spore + Stomp', 'Jolteon + Focus Energy + Thunder Shock', 'Flareon + Focus Energy + Ember',
|
|
2410
|
+
],
|
|
2358
2411
|
},
|
|
2359
2412
|
// Past Gens OU
|
|
2360
2413
|
///////////////////////////////////////////////////////////////////
|
|
@@ -2402,7 +2455,7 @@ exports.Formats = [
|
|
|
2402
2455
|
`• <a href="https://www.smogon.com/forums/threads/3683332/">DPP OU Viability Rankings</a>`,
|
|
2403
2456
|
],
|
|
2404
2457
|
mod: 'gen4',
|
|
2405
|
-
ruleset: ['Standard'],
|
|
2458
|
+
ruleset: ['Standard', 'Freeze Clause Mod'],
|
|
2406
2459
|
banlist: ['AG', 'Uber', 'Arena Trap', 'Sand Veil', 'Swinub + Snow Cloak', 'Piloswine + Snow Cloak', 'Mamoswine + Snow Cloak', 'Soul Dew', 'Baton Pass', 'Swagger'],
|
|
2407
2460
|
},
|
|
2408
2461
|
{
|
|
@@ -2412,7 +2465,7 @@ exports.Formats = [
|
|
|
2412
2465
|
`• <a href="https://www.smogon.com/forums/threads/3503019/">ADV OU Viability Rankings</a>`,
|
|
2413
2466
|
],
|
|
2414
2467
|
mod: 'gen3',
|
|
2415
|
-
ruleset: ['Standard', 'One Boost Passer Clause'],
|
|
2468
|
+
ruleset: ['Standard', 'One Boost Passer Clause', 'Freeze Clause Mod'],
|
|
2416
2469
|
banlist: ['Uber', 'Sand Veil', 'Soundproof', 'Assist', 'Baton Pass + Block', 'Baton Pass + Mean Look', 'Baton Pass + Spider Web', 'Smeargle + Ingrain'],
|
|
2417
2470
|
},
|
|
2418
2471
|
{
|
|
@@ -2573,6 +2626,17 @@ exports.Formats = [
|
|
|
2573
2626
|
ruleset: ['Standard', 'Mega Rayquaza Clause'],
|
|
2574
2627
|
banlist: ['Baton Pass'],
|
|
2575
2628
|
},
|
|
2629
|
+
{
|
|
2630
|
+
name: "[Gen 7] UU",
|
|
2631
|
+
threads: [
|
|
2632
|
+
`• <a href="https://www.smogon.com/forums/threads/3621217/">USM UU Sample Teams</a>`,
|
|
2633
|
+
`• <a href="https://www.smogon.com/forums/threads/3641346/">USM UU Viability Rankings</a>`,
|
|
2634
|
+
],
|
|
2635
|
+
mod: 'gen7',
|
|
2636
|
+
searchShow: false,
|
|
2637
|
+
ruleset: ['[Gen 7] OU'],
|
|
2638
|
+
banlist: ['OU', 'UUBL', 'Drizzle', 'Drought', 'Kommonium Z', 'Mewnium Z'],
|
|
2639
|
+
},
|
|
2576
2640
|
{
|
|
2577
2641
|
name: "[Gen 7] RU",
|
|
2578
2642
|
threads: [
|
|
@@ -2960,6 +3024,17 @@ exports.Formats = [
|
|
|
2960
3024
|
searchShow: false,
|
|
2961
3025
|
ruleset: ['Obtainable', 'Team Preview', 'Endless Battle Clause', 'HP Percentage Mod', 'Cancel Mod'],
|
|
2962
3026
|
},
|
|
3027
|
+
{
|
|
3028
|
+
name: "[Gen 6] ZU",
|
|
3029
|
+
threads: [
|
|
3030
|
+
`• <a href="https://www.smogon.com/dex/xy/formats/zu/">ORAS ZU Banlist</a>`,
|
|
3031
|
+
`• <a href="https://www.smogon.com/forums/posts/8034679/">ORAS ZU Viability Rankings</a>`,
|
|
3032
|
+
],
|
|
3033
|
+
mod: 'gen6',
|
|
3034
|
+
searchShow: false,
|
|
3035
|
+
ruleset: ['[Gen 6] PU'],
|
|
3036
|
+
banlist: ['PU', 'Fraxure', 'Regigigas', 'Simisear'],
|
|
3037
|
+
},
|
|
2963
3038
|
{
|
|
2964
3039
|
name: "[Gen 6] CAP",
|
|
2965
3040
|
threads: [
|
|
@@ -2970,7 +3045,7 @@ exports.Formats = [
|
|
|
2970
3045
|
mod: 'gen6',
|
|
2971
3046
|
searchShow: false,
|
|
2972
3047
|
ruleset: ['[Gen 6] OU', '+CAP'],
|
|
2973
|
-
banlist: ['Aurumoth', 'Cawmodore'
|
|
3048
|
+
banlist: ['Aurumoth', 'Cawmodore'],
|
|
2974
3049
|
},
|
|
2975
3050
|
{
|
|
2976
3051
|
name: "[Gen 6] Battle Spot Singles",
|
|
@@ -3148,7 +3223,7 @@ exports.Formats = [
|
|
|
3148
3223
|
mod: 'gen5',
|
|
3149
3224
|
searchShow: false,
|
|
3150
3225
|
ruleset: ['[Gen 5] NU', 'Sleep Moves Clause'],
|
|
3151
|
-
banlist: ['NU', 'PUBL'],
|
|
3226
|
+
banlist: ['NU', 'PUBL', 'Damp Rock'],
|
|
3152
3227
|
},
|
|
3153
3228
|
{
|
|
3154
3229
|
name: "[Gen 5] LC",
|
|
@@ -3302,7 +3377,7 @@ exports.Formats = [
|
|
|
3302
3377
|
],
|
|
3303
3378
|
mod: 'gen4',
|
|
3304
3379
|
searchShow: false,
|
|
3305
|
-
ruleset: ['[Gen 4] OU'],
|
|
3380
|
+
ruleset: ['[Gen 4] OU', '!Freeze Clause Mod'],
|
|
3306
3381
|
banlist: ['OU', 'UUBL'],
|
|
3307
3382
|
unbanlist: ['Arena Trap', 'Swagger'],
|
|
3308
3383
|
},
|
|
@@ -3364,7 +3439,7 @@ exports.Formats = [
|
|
|
3364
3439
|
searchShow: false,
|
|
3365
3440
|
ruleset: [
|
|
3366
3441
|
'Picked Team Size = 1', 'Max Team Size = 3',
|
|
3367
|
-
'[Gen 4] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview',
|
|
3442
|
+
'[Gen 4] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview', '!Freeze Clause Mod',
|
|
3368
3443
|
],
|
|
3369
3444
|
banlist: ['Latias', 'Machamp', 'Porygon-Z', 'Shaymin', 'Snorlax', 'Togekiss', 'Focus Sash', 'Destiny Bond', 'Explosion', 'Perish Song', 'Self-Destruct'],
|
|
3370
3445
|
unbanlist: ['Wobbuffet', 'Wynaut', 'Sand Veil', 'Swagger'],
|
|
@@ -3406,7 +3481,7 @@ exports.Formats = [
|
|
|
3406
3481
|
mod: 'gen4',
|
|
3407
3482
|
gameType: 'doubles',
|
|
3408
3483
|
searchShow: false,
|
|
3409
|
-
ruleset: ['[Gen 4] OU'],
|
|
3484
|
+
ruleset: ['[Gen 4] OU', '!Freeze Clause Mod'],
|
|
3410
3485
|
banlist: ['Explosion'],
|
|
3411
3486
|
unbanlist: ['Garchomp', 'Latias', 'Latios', 'Manaphy', 'Mew', 'Salamence', 'Wobbuffet', 'Wynaut', 'Swagger'],
|
|
3412
3487
|
},
|
|
@@ -3461,9 +3536,8 @@ exports.Formats = [
|
|
|
3461
3536
|
],
|
|
3462
3537
|
mod: 'gen3',
|
|
3463
3538
|
searchShow: false,
|
|
3464
|
-
ruleset: ['Standard'
|
|
3465
|
-
banlist: ['Uber', 'OU', 'UUBL', 'Smeargle + Ingrain', 'Baton Pass'],
|
|
3466
|
-
unbanlist: ['Scyther'],
|
|
3539
|
+
ruleset: ['Standard'],
|
|
3540
|
+
banlist: ['Uber', 'OU', 'UUBL', 'Smeargle + Ingrain', 'Arena Trap', 'Bright Powder', 'Lax Incense', 'Baton Pass', 'Swagger'],
|
|
3467
3541
|
},
|
|
3468
3542
|
{
|
|
3469
3543
|
name: "[Gen 3] NU",
|
|
@@ -3472,9 +3546,8 @@ exports.Formats = [
|
|
|
3472
3546
|
],
|
|
3473
3547
|
mod: 'gen3',
|
|
3474
3548
|
searchShow: false,
|
|
3475
|
-
ruleset: ['
|
|
3476
|
-
banlist: ['UU'],
|
|
3477
|
-
unbanlist: ['Baton Pass'],
|
|
3549
|
+
ruleset: ['Standard'],
|
|
3550
|
+
banlist: ['Uber', 'OU', 'UUBL', 'UU', 'Smeargle + Ingrain'],
|
|
3478
3551
|
},
|
|
3479
3552
|
{
|
|
3480
3553
|
name: "[Gen 3] Doubles OU",
|
|
@@ -3488,21 +3561,6 @@ exports.Formats = [
|
|
|
3488
3561
|
banlist: ['Uber'],
|
|
3489
3562
|
unbanlist: ['Deoxys-Speed', 'Wobbuffet', 'Wynaut'],
|
|
3490
3563
|
},
|
|
3491
|
-
{
|
|
3492
|
-
name: "[Gen 3] 1v1",
|
|
3493
|
-
desc: `Bring three Pokémon to Team Preview and choose one to battle.`,
|
|
3494
|
-
threads: [
|
|
3495
|
-
`• <a href="https://www.smogon.com/forums/posts/8031456/">ADV 1v1</a>`,
|
|
3496
|
-
],
|
|
3497
|
-
mod: 'gen3',
|
|
3498
|
-
searchShow: false,
|
|
3499
|
-
ruleset: [
|
|
3500
|
-
'Picked Team Size = 1', 'Max Team Size = 3',
|
|
3501
|
-
'[Gen 3] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview',
|
|
3502
|
-
],
|
|
3503
|
-
banlist: ['Clefable', 'Slaking', 'Snorlax', 'Suicune', 'Destiny Bond', 'Explosion', 'Ingrain', 'Perish Song', 'Self-Destruct', 'Bright Powder', 'Focus Band', 'King\'s Rock', 'Lax Incense', 'Quick Claw'],
|
|
3504
|
-
unbanlist: ['Mr. Mime', 'Wobbuffet', 'Wynaut', 'Sand Veil'],
|
|
3505
|
-
},
|
|
3506
3564
|
{
|
|
3507
3565
|
name: "[Gen 3] Custom Game",
|
|
3508
3566
|
mod: 'gen3',
|
|
@@ -3519,15 +3577,6 @@ exports.Formats = [
|
|
|
3519
3577
|
debug: true,
|
|
3520
3578
|
ruleset: ['HP Percentage Mod', 'Cancel Mod', 'Max Team Size = 24', 'Max Move Count = 24', 'Max Level = 9999', 'Default Level = 100'],
|
|
3521
3579
|
},
|
|
3522
|
-
{
|
|
3523
|
-
name: "[Gen 2] Ubers",
|
|
3524
|
-
threads: [
|
|
3525
|
-
`• <a href="https://www.smogon.com/forums/posts/8286282/">GSC Ubers</a>`,
|
|
3526
|
-
],
|
|
3527
|
-
mod: 'gen2',
|
|
3528
|
-
searchShow: false,
|
|
3529
|
-
ruleset: ['Standard'],
|
|
3530
|
-
},
|
|
3531
3580
|
{
|
|
3532
3581
|
name: "[Gen 2] UU",
|
|
3533
3582
|
threads: [`• <a href="https://www.smogon.com/forums/threads/3576710/">GSC UU</a>`],
|
|
@@ -3590,6 +3639,15 @@ exports.Formats = [
|
|
|
3590
3639
|
battle: { trunc: Math.trunc },
|
|
3591
3640
|
ruleset: ['HP Percentage Mod', 'Cancel Mod', 'Max Team Size = 24', 'Max Move Count = 24', 'Max Level = 9999', 'Default Level = 100'],
|
|
3592
3641
|
},
|
|
3642
|
+
{
|
|
3643
|
+
name: "[Gen 1] Ubers",
|
|
3644
|
+
threads: [
|
|
3645
|
+
`• <a href="https://www.smogon.com/forums/posts/8286283/">RBY Ubers</a>`,
|
|
3646
|
+
],
|
|
3647
|
+
mod: 'gen1',
|
|
3648
|
+
searchShow: false,
|
|
3649
|
+
ruleset: ['Standard'],
|
|
3650
|
+
},
|
|
3593
3651
|
{
|
|
3594
3652
|
name: "[Gen 1] UU",
|
|
3595
3653
|
threads: [
|
|
@@ -3598,7 +3656,7 @@ exports.Formats = [
|
|
|
3598
3656
|
],
|
|
3599
3657
|
mod: 'gen1',
|
|
3600
3658
|
searchShow: false,
|
|
3601
|
-
ruleset: ['[Gen 1] OU'],
|
|
3659
|
+
ruleset: ['[Gen 1] OU', 'APT Clause'],
|
|
3602
3660
|
banlist: ['OU', 'UUBL'],
|
|
3603
3661
|
},
|
|
3604
3662
|
{
|
|
@@ -3632,19 +3690,6 @@ exports.Formats = [
|
|
|
3632
3690
|
],
|
|
3633
3691
|
banlist: ['Uber'],
|
|
3634
3692
|
},
|
|
3635
|
-
{
|
|
3636
|
-
name: "[Gen 1] Stadium OU",
|
|
3637
|
-
threads: [
|
|
3638
|
-
`• <a href="https://www.smogon.com/forums/threads/3685877/">Stadium OU Viability Rankings</a>`,
|
|
3639
|
-
],
|
|
3640
|
-
mod: 'gen1stadium',
|
|
3641
|
-
searchShow: false,
|
|
3642
|
-
ruleset: ['Standard', 'Team Preview'],
|
|
3643
|
-
banlist: ['Uber',
|
|
3644
|
-
'Nidoking + Fury Attack + Thrash', 'Exeggutor + Poison Powder + Stomp', 'Exeggutor + Sleep Powder + Stomp',
|
|
3645
|
-
'Exeggutor + Stun Spore + Stomp', 'Jolteon + Focus Energy + Thunder Shock', 'Flareon + Focus Energy + Ember',
|
|
3646
|
-
],
|
|
3647
|
-
},
|
|
3648
3693
|
{
|
|
3649
3694
|
name: "[Gen 1] Tradebacks OU",
|
|
3650
3695
|
desc: `RBY OU with movepool additions from the Time Capsule.`,
|