@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/config/formats.ts
CHANGED
|
@@ -167,7 +167,7 @@ export const Formats: FormatList = [
|
|
|
167
167
|
mod: 'gen8',
|
|
168
168
|
ruleset: ['Little Cup', 'Standard', 'Dynamax Clause'],
|
|
169
169
|
banlist: [
|
|
170
|
-
'Corsola-Galar', 'Cutiefly', 'Drifloon', 'Gastly', 'Gothita', 'Rufflet', 'Scraggy', 'Scyther', 'Sneasel', 'Swirlix', 'Tangela', '
|
|
170
|
+
'Corsola-Galar', 'Cutiefly', 'Drifloon', 'Gastly', 'Gothita', 'Rufflet', 'Scraggy', 'Scyther', 'Sneasel', 'Swirlix', 'Tangela', 'Vulpix-Alola', 'Woobat', 'Zigzagoon-Base',
|
|
171
171
|
'Chlorophyll', 'Moody', 'Baton Pass', 'Sticky Web',
|
|
172
172
|
],
|
|
173
173
|
},
|
|
@@ -251,8 +251,8 @@ export const Formats: FormatList = [
|
|
|
251
251
|
banlist: [
|
|
252
252
|
// LC OU
|
|
253
253
|
'Abra', 'Carvanha', 'Diglett-Base', 'Dwebble', 'Ferroseed', 'Foongus', 'Frillish', 'Grookey', 'Koffing',
|
|
254
|
-
'Larvesta', 'Magby', 'Magnemite', 'Mareanie', 'Mienfoo', 'Mudbray', '
|
|
255
|
-
'Ponyta
|
|
254
|
+
'Larvesta', 'Magby', 'Magnemite', 'Mareanie', 'Mienfoo', 'Mudbray', 'Natu', 'Onix', 'Pawniard',
|
|
255
|
+
'Ponyta-Base', 'Porygon', 'Slowpoke-Base', 'Staryu', 'Timburr', 'Trapinch', 'Tyrunt', 'Vullaby',
|
|
256
256
|
// LC UUBL
|
|
257
257
|
'Archen', 'Farfetch\u2019d-Galar', 'Scorbunny', 'Shellder', 'Wingull',
|
|
258
258
|
],
|
|
@@ -413,10 +413,10 @@ export const Formats: FormatList = [
|
|
|
413
413
|
'Standard Doubles', 'Accuracy Moves Clause', 'Dynamax Clause', 'Sleep Clause Mod',
|
|
414
414
|
],
|
|
415
415
|
banlist: [
|
|
416
|
-
'Calyrex-Ice', 'Calyrex-Shadow', 'Dialga', 'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Jirachi', 'Kyogre',
|
|
417
|
-
'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Rayquaza',
|
|
418
|
-
'Solgaleo', 'Tornadus-Base', 'Urshifu-Base', 'Urshifu-Rapid-Strike', 'Whimsicott', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned',
|
|
419
|
-
'Zamazenta-Crowned', 'Zekrom', 'Moody', 'Power Construct', 'Focus Sash', 'Ally Switch', 'Final Gambit', 'Perish Song', 'Swagger',
|
|
416
|
+
'Calyrex-Ice', 'Calyrex-Shadow', 'Cottonee', 'Dialga', 'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Jirachi', 'Kyogre',
|
|
417
|
+
'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Rayquaza',
|
|
418
|
+
'Reshiram', 'Solgaleo', 'Tornadus-Base', 'Urshifu-Base', 'Urshifu-Rapid-Strike', 'Whimsicott', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned',
|
|
419
|
+
'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Moody', 'Power Construct', 'Focus Sash', 'Ally Switch', 'Final Gambit', 'Perish Song', 'Swagger',
|
|
420
420
|
],
|
|
421
421
|
},
|
|
422
422
|
{
|
|
@@ -625,38 +625,261 @@ export const Formats: FormatList = [
|
|
|
625
625
|
column: 2,
|
|
626
626
|
},
|
|
627
627
|
{
|
|
628
|
-
name: "[Gen 8]
|
|
629
|
-
desc: `Pokémon
|
|
628
|
+
name: "[Gen 8] Broken Record",
|
|
629
|
+
desc: `Pokémon can hold a TR to use that move in battle.`,
|
|
630
630
|
threads: [
|
|
631
|
-
`• <a href="https://www.smogon.com/forums/threads/
|
|
631
|
+
`• <a href="https://www.smogon.com/forums/threads/3701270/">Broken Record</a>`,
|
|
632
632
|
],
|
|
633
633
|
|
|
634
634
|
mod: 'gen8',
|
|
635
|
-
ruleset: ['Standard', '
|
|
635
|
+
ruleset: ['Standard', '!Sleep Clause Mod', 'Sleep Moves Clause', 'Dynamax Clause'],
|
|
636
636
|
banlist: [
|
|
637
637
|
'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Eternatus', 'Genesect', 'Giratina', 'Giratina-Origin',
|
|
638
|
-
'Groudon', 'Ho-Oh', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala', 'Magearna', 'Marshadow',
|
|
639
|
-
'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', '
|
|
640
|
-
'
|
|
641
|
-
'
|
|
638
|
+
'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala', 'Magearna', 'Marshadow',
|
|
639
|
+
'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Regieleki', 'Reshiram', 'Solgaleo',
|
|
640
|
+
'Spectrier', 'Urshifu-Base', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Zygarde-Base',
|
|
641
|
+
'Arena Trap', 'Magnet Pull', 'Moody', 'Power Construct', 'Shadow Tag', 'TR29 (Baton Pass)', 'TR82 (Stored Power)', 'Baton Pass',
|
|
642
642
|
],
|
|
643
|
+
onValidateSet(set) {
|
|
644
|
+
if (!set.item) return;
|
|
645
|
+
const item = this.dex.items.get(set.item);
|
|
646
|
+
if (!/^tr\d\d/i.test(item.name)) return;
|
|
647
|
+
const moveName = item.desc.split('move ')[1].split('.')[0];
|
|
648
|
+
if (set.moves.map(this.toID).includes(this.toID(moveName))) {
|
|
649
|
+
return [
|
|
650
|
+
`${set.species} can't run ${item.name} (${moveName}) as its item because it already has that move in its moveset.`,
|
|
651
|
+
];
|
|
652
|
+
}
|
|
653
|
+
},
|
|
654
|
+
onValidateTeam(team) {
|
|
655
|
+
const trs = new Set<string>();
|
|
656
|
+
for (const set of team) {
|
|
657
|
+
if (!set.item) continue;
|
|
658
|
+
const item = this.dex.items.get(set.item).name;
|
|
659
|
+
if (!/^tr\d\d/i.test(item)) continue;
|
|
660
|
+
if (trs.has(item)) {
|
|
661
|
+
return [`Your team already has a Pok\u00e9mon with ${item}.`];
|
|
662
|
+
}
|
|
663
|
+
trs.add(item);
|
|
664
|
+
}
|
|
665
|
+
},
|
|
666
|
+
onTakeItem(item) {
|
|
667
|
+
return !/^tr\d\d/i.test(item.name);
|
|
668
|
+
},
|
|
669
|
+
onModifyMove(move) {
|
|
670
|
+
if (move.id === 'knockoff') {
|
|
671
|
+
move.onBasePower = function (basePower, source, target, m) {
|
|
672
|
+
const item = target.getItem();
|
|
673
|
+
if (!this.singleEvent('TakeItem', item, target.itemState, target, target, m, item)) return;
|
|
674
|
+
// Very hardcode but I'd prefer to not make a mod for one damage calculation change
|
|
675
|
+
if (item.id && !/^tr\d\d/i.test(item.id)) {
|
|
676
|
+
return this.chainModify(1.5);
|
|
677
|
+
}
|
|
678
|
+
};
|
|
679
|
+
}
|
|
680
|
+
},
|
|
681
|
+
onBegin() {
|
|
682
|
+
for (const pokemon of this.getAllPokemon()) {
|
|
683
|
+
const item = pokemon.getItem();
|
|
684
|
+
if (/^tr\d\d/i.test(item.name)) {
|
|
685
|
+
const move = this.dex.moves.get(item.desc.split('move ')[1].split('.')[0]);
|
|
686
|
+
pokemon.moveSlots = (pokemon as any).baseMoveSlots = [
|
|
687
|
+
...pokemon.baseMoveSlots, {
|
|
688
|
+
id: move.id,
|
|
689
|
+
move: move.name,
|
|
690
|
+
pp: move.pp * 8 / 5,
|
|
691
|
+
maxpp: move.pp * 8 / 5,
|
|
692
|
+
target: move.target,
|
|
693
|
+
disabled: false,
|
|
694
|
+
disabledSource: '',
|
|
695
|
+
used: false,
|
|
696
|
+
},
|
|
697
|
+
];
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
},
|
|
643
701
|
},
|
|
644
702
|
{
|
|
645
|
-
name: "[Gen 8]
|
|
646
|
-
desc: `
|
|
703
|
+
name: "[Gen 8] Inheritance",
|
|
704
|
+
desc: `Pokémon may use the ability and moves of another, as long as they forfeit their own learnset.`,
|
|
647
705
|
threads: [
|
|
648
|
-
`• <a href="https://www.smogon.com/forums/threads/
|
|
706
|
+
`• <a href="https://www.smogon.com/forums/threads/3656811/">Inheritance</a>`,
|
|
649
707
|
],
|
|
650
708
|
|
|
651
709
|
mod: 'gen8',
|
|
652
|
-
|
|
710
|
+
// searchShow: false,
|
|
711
|
+
ruleset: ['Standard', '!Sleep Clause Mod', 'Sleep Moves Clause', '2 Ability Clause', 'Dynamax Clause'],
|
|
653
712
|
banlist: [
|
|
654
|
-
'
|
|
655
|
-
'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem
|
|
656
|
-
'Mewtwo', '
|
|
657
|
-
'
|
|
658
|
-
'
|
|
713
|
+
'Blacephalon', 'Blaziken', 'Butterfree', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chansey', 'Combusken', 'Cresselia', 'Darmanitan-Galar', 'Dialga', 'Dracovish',
|
|
714
|
+
'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala',
|
|
715
|
+
'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Natu', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Regieleki',
|
|
716
|
+
'Regigigas', 'Reshiram', 'Sableye', 'Shedinja', 'Solgaleo', 'Spectrier', 'Tapu Koko', 'Toxtricity', 'Torkoal', 'Urshifu-Base', 'Xatu', 'Xerneas', 'Yveltal',
|
|
717
|
+
'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zeraora', 'Zekrom', 'Arena Trap', 'Contrary', 'Drizzle', 'Huge Power', 'Imposter', 'Innards Out',
|
|
718
|
+
'Libero', 'Moody', 'Power Construct', 'Pure Power', 'Quick Draw', 'Shadow Tag', 'Sheer Force', 'Simple', 'Unaware', 'Unburden', 'Water Bubble', 'King\'s Rock',
|
|
719
|
+
'Quick Claw', 'Baton Pass', 'Bolt Beak', 'Fishious Rend', 'Shell Smash', 'Thousand Arrows',
|
|
659
720
|
],
|
|
721
|
+
getEvoFamily(speciesid) {
|
|
722
|
+
let species = Dex.species.get(speciesid);
|
|
723
|
+
while (species.prevo) {
|
|
724
|
+
species = Dex.species.get(species.prevo);
|
|
725
|
+
}
|
|
726
|
+
return species.id;
|
|
727
|
+
},
|
|
728
|
+
validateSet(set, teamHas) {
|
|
729
|
+
const unreleased = (pokemon: Species) => pokemon.tier === "Unreleased" && pokemon.isNonstandard === "Unobtainable";
|
|
730
|
+
if (!teamHas.abilityMap) {
|
|
731
|
+
teamHas.abilityMap = Object.create(null);
|
|
732
|
+
for (const pokemon of Dex.species.all()) {
|
|
733
|
+
if (pokemon.isNonstandard || unreleased(pokemon)) continue;
|
|
734
|
+
if (pokemon.requiredAbility || pokemon.requiredItem || pokemon.requiredMove) continue;
|
|
735
|
+
if (this.ruleTable.isBannedSpecies(pokemon)) continue;
|
|
736
|
+
|
|
737
|
+
for (const key of Object.values(pokemon.abilities)) {
|
|
738
|
+
const abilityId = this.dex.toID(key);
|
|
739
|
+
if (abilityId in teamHas.abilityMap) {
|
|
740
|
+
teamHas.abilityMap[abilityId][pokemon.evos ? 'push' : 'unshift'](pokemon.id);
|
|
741
|
+
} else {
|
|
742
|
+
teamHas.abilityMap[abilityId] = [pokemon.id];
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
const problem = this.validateForme(set);
|
|
749
|
+
if (problem.length) return problem;
|
|
750
|
+
|
|
751
|
+
const species = this.dex.species.get(set.species);
|
|
752
|
+
if (!species.exists || species.num < 1) return [`The Pok\u00e9mon "${set.species}" does not exist.`];
|
|
753
|
+
if (species.isNonstandard || unreleased(species)) {
|
|
754
|
+
return [`${species.name} is not obtainable in Generation ${this.dex.gen}.`];
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
const name = set.name;
|
|
758
|
+
if (this.ruleTable.isBannedSpecies(species)) {
|
|
759
|
+
return this.validateSet(set, teamHas);
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
const ability = this.dex.abilities.get(set.ability);
|
|
763
|
+
if (!ability.exists || ability.isNonstandard) return [`${name} needs to have a valid ability.`];
|
|
764
|
+
const pokemonWithAbility = teamHas.abilityMap[ability.id];
|
|
765
|
+
if (!pokemonWithAbility) return [`${ability.name} is not available on a legal Pok\u00e9mon.`];
|
|
766
|
+
|
|
767
|
+
(this.format as any).debug = true;
|
|
768
|
+
|
|
769
|
+
if (!teamHas.abilitySources) teamHas.abilitySources = Object.create(null);
|
|
770
|
+
const validSources: string[] = teamHas.abilitySources[this.dex.toID(set.species)] = []; // Evolution families
|
|
771
|
+
|
|
772
|
+
let canonicalSource = ''; // Specific for the basic implementation of Donor Clause (see onValidateTeam).
|
|
773
|
+
|
|
774
|
+
for (const donor of pokemonWithAbility) {
|
|
775
|
+
const donorSpecies = this.dex.species.get(donor);
|
|
776
|
+
let format = this.format;
|
|
777
|
+
if (!format.getEvoFamily) format = this.dex.formats.get('gen8inheritance');
|
|
778
|
+
const evoFamily = format.getEvoFamily!(donorSpecies.id);
|
|
779
|
+
if (validSources.includes(evoFamily)) continue;
|
|
780
|
+
|
|
781
|
+
set.species = donorSpecies.name;
|
|
782
|
+
set.name = donorSpecies.baseSpecies;
|
|
783
|
+
const problems = this.validateSet(set, teamHas) || [];
|
|
784
|
+
if (!problems.length) {
|
|
785
|
+
validSources.push(evoFamily);
|
|
786
|
+
canonicalSource = donorSpecies.name;
|
|
787
|
+
}
|
|
788
|
+
// Specific for the basic implementation of Donor Clause (see onValidateTeam).
|
|
789
|
+
if (validSources.length > 1) break;
|
|
790
|
+
}
|
|
791
|
+
(this.format as any).debug = false;
|
|
792
|
+
|
|
793
|
+
set.name = name;
|
|
794
|
+
set.species = species.name;
|
|
795
|
+
if (!validSources.length) {
|
|
796
|
+
if (pokemonWithAbility.length > 1) return [`${name}'s set is illegal.`];
|
|
797
|
+
return [`${name} has an illegal set with an ability from ${this.dex.species.get(pokemonWithAbility[0]).name}.`];
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
// Protocol: Include the data of the donor species in the `ability` data slot.
|
|
801
|
+
// Afterwards, we are going to reset the name to what the user intended.
|
|
802
|
+
set.ability = `${set.ability}0${canonicalSource}`;
|
|
803
|
+
return null;
|
|
804
|
+
},
|
|
805
|
+
onValidateTeam(team, f, teamHas) {
|
|
806
|
+
if (this.ruleTable.has('2abilityclause')) {
|
|
807
|
+
const abilityTable = new Map<string, number>();
|
|
808
|
+
const base: {[k: string]: string} = {
|
|
809
|
+
airlock: 'cloudnine',
|
|
810
|
+
battlearmor: 'shellarmor',
|
|
811
|
+
clearbody: 'whitesmoke',
|
|
812
|
+
dazzling: 'queenlymajesty',
|
|
813
|
+
emergencyexit: 'wimpout',
|
|
814
|
+
filter: 'solidrock',
|
|
815
|
+
gooey: 'tanglinghair',
|
|
816
|
+
insomnia: 'vitalspirit',
|
|
817
|
+
ironbarbs: 'roughskin',
|
|
818
|
+
libero: 'protean',
|
|
819
|
+
minus: 'plus',
|
|
820
|
+
moxie: 'chillingneigh',
|
|
821
|
+
powerofalchemy: 'receiver',
|
|
822
|
+
propellertail: 'stalwart',
|
|
823
|
+
teravolt: 'moldbreaker',
|
|
824
|
+
turboblaze: 'moldbreaker',
|
|
825
|
+
};
|
|
826
|
+
for (const set of team) {
|
|
827
|
+
let ability = this.toID(set.ability.split('0')[0]);
|
|
828
|
+
if (!ability) continue;
|
|
829
|
+
if (ability in base) ability = base[ability] as ID;
|
|
830
|
+
if ((abilityTable.get(ability) || 0) >= 2) {
|
|
831
|
+
return [
|
|
832
|
+
`You are limited to two of each ability by 2 Ability Clause.`,
|
|
833
|
+
`(You have more than two ${this.dex.abilities.get(ability).name} variants)`,
|
|
834
|
+
];
|
|
835
|
+
}
|
|
836
|
+
abilityTable.set(ability, (abilityTable.get(ability) || 0) + 1);
|
|
837
|
+
}
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
// Donor Clause
|
|
841
|
+
const evoFamilyLists = [];
|
|
842
|
+
for (const set of team) {
|
|
843
|
+
const abilitySources = teamHas.abilitySources?.[this.dex.toID(set.species)];
|
|
844
|
+
if (!abilitySources) continue;
|
|
845
|
+
let format = this.format;
|
|
846
|
+
if (!format.getEvoFamily) format = this.dex.formats.get('gen8inheritance');
|
|
847
|
+
evoFamilyLists.push(abilitySources.map(format.getEvoFamily!));
|
|
848
|
+
}
|
|
849
|
+
|
|
850
|
+
// Checking actual full incompatibility would require expensive algebra.
|
|
851
|
+
// Instead, we only check the trivial case of multiple Pokémon only legal for exactly one family. FIXME?
|
|
852
|
+
const requiredFamilies = Object.create(null);
|
|
853
|
+
for (const evoFamilies of evoFamilyLists) {
|
|
854
|
+
if (evoFamilies.length !== 1) continue;
|
|
855
|
+
const [familyId] = evoFamilies;
|
|
856
|
+
if (!(familyId in requiredFamilies)) requiredFamilies[familyId] = 1;
|
|
857
|
+
requiredFamilies[familyId]++;
|
|
858
|
+
if (requiredFamilies[familyId] > 2) {
|
|
859
|
+
return [
|
|
860
|
+
`You are limited to up to two inheritances from each evolution family by the Donor Clause.`,
|
|
861
|
+
`(You inherit more than twice from ${this.dex.species.get(familyId).name}).`,
|
|
862
|
+
];
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
},
|
|
866
|
+
onBegin() {
|
|
867
|
+
for (const pokemon of this.getAllPokemon()) {
|
|
868
|
+
if (pokemon.baseAbility.includes('0')) {
|
|
869
|
+
const donor = pokemon.baseAbility.split('0')[1];
|
|
870
|
+
pokemon.m.donor = this.toID(donor);
|
|
871
|
+
pokemon.baseAbility = this.toID(pokemon.baseAbility.split('0')[0]);
|
|
872
|
+
pokemon.ability = pokemon.baseAbility;
|
|
873
|
+
}
|
|
874
|
+
}
|
|
875
|
+
},
|
|
876
|
+
onSwitchIn(pokemon) {
|
|
877
|
+
if (!pokemon.m.donor) return;
|
|
878
|
+
const donorTemplate = this.dex.species.get(pokemon.m.donor);
|
|
879
|
+
if (!donorTemplate.exists) return;
|
|
880
|
+
// Place volatiles on the Pokémon to show the donor details.
|
|
881
|
+
this.add('-start', pokemon, donorTemplate.name, '[silent]');
|
|
882
|
+
},
|
|
660
883
|
},
|
|
661
884
|
|
|
662
885
|
// Other Metagames
|
|
@@ -680,8 +903,8 @@ export const Formats: FormatList = [
|
|
|
680
903
|
'Calyrex-Shadow', 'Cramorant-Gorging', 'Darmanitan-Galar-Zen', 'Eternatus-Eternamax', 'Shedinja', 'Zacian-Crowned',
|
|
681
904
|
'Arena Trap', 'Contrary', 'Gorilla Tactics', 'Huge Power', 'Illusion', 'Innards Out', 'Intrepid Sword', 'Libero',
|
|
682
905
|
'Magnet Pull', 'Moody', 'Neutralizing Gas', 'Parental Bond', 'Protean', 'Pure Power', 'Shadow Tag', 'Stakeout',
|
|
683
|
-
'Water Bubble', 'Wonder Guard', 'Comatose + Sleep Talk', 'Rusted Sword', '
|
|
684
|
-
'Octolock', 'Shell Smash',
|
|
906
|
+
'Water Bubble', 'Wonder Guard', 'Comatose + Sleep Talk', 'Rusted Sword', 'Belly Drum', 'Bolt Beak', 'Court Change',
|
|
907
|
+
'Double Iron Bash', 'Octolock', 'Shell Smash',
|
|
685
908
|
],
|
|
686
909
|
},
|
|
687
910
|
{
|
|
@@ -793,9 +1016,9 @@ export const Formats: FormatList = [
|
|
|
793
1016
|
'Arena Trap', 'Magnet Pull', 'Moody', 'Power Construct', 'Shadow Tag', 'King\'s Rock', 'Baton Pass',
|
|
794
1017
|
],
|
|
795
1018
|
restricted: [
|
|
796
|
-
'Acupressure', 'Astral Barrage', 'Belly Drum', 'Bolt Beak', 'Clangorous Soul', 'Double Iron Bash', 'Electrify', 'Extreme Speed', '
|
|
797
|
-
'Geomancy', 'Glacial Lance', 'Oblivion Wing', 'Precipice Blades', 'Shell Smash', 'Shift Gear', 'Thousand Arrows', 'Thunderous Kick',
|
|
798
|
-
'Wicked Blow',
|
|
1019
|
+
'Acupressure', 'Astral Barrage', 'Belly Drum', 'Bolt Beak', 'Clangorous Soul', 'Double Iron Bash', 'Electrify', 'Extreme Speed', 'Final Gambit',
|
|
1020
|
+
'Fishious Rend', 'Geomancy', 'Glacial Lance', 'Oblivion Wing', 'Precipice Blades', 'Shell Smash', 'Shift Gear', 'Thousand Arrows', 'Thunderous Kick',
|
|
1021
|
+
'V-create', 'Wicked Blow',
|
|
799
1022
|
],
|
|
800
1023
|
},
|
|
801
1024
|
{
|
|
@@ -990,7 +1213,7 @@ export const Formats: FormatList = [
|
|
|
990
1213
|
|
|
991
1214
|
mod: 'gen8bdsp',
|
|
992
1215
|
ruleset: ['Little Cup', 'Standard'],
|
|
993
|
-
banlist: ['Gligar', 'Meditite', 'Misdreavus', 'Murkrow', 'Scyther', 'Sneasel', 'Tangela', 'Vulpix', 'Yanma', 'Moody', 'Baton Pass', 'Sticky Web'],
|
|
1216
|
+
banlist: ['Gligar', 'Meditite', 'Misdreavus', 'Munchlax', 'Murkrow', 'Scyther', 'Sneasel', 'Tangela', 'Vulpix', 'Yanma', 'Moody', 'Baton Pass', 'Sticky Web'],
|
|
994
1217
|
},
|
|
995
1218
|
{
|
|
996
1219
|
name: "[Gen 8 BDSP] Monotype",
|
|
@@ -1212,188 +1435,6 @@ export const Formats: FormatList = [
|
|
|
1212
1435
|
}
|
|
1213
1436
|
},
|
|
1214
1437
|
},
|
|
1215
|
-
{
|
|
1216
|
-
name: "[Gen 8] Inheritance",
|
|
1217
|
-
desc: `Pokémon may use the ability and moves of another, as long as they forfeit their own learnset.`,
|
|
1218
|
-
threads: [
|
|
1219
|
-
`• <a href="https://www.smogon.com/forums/threads/3656811/">Inheritance</a>`,
|
|
1220
|
-
],
|
|
1221
|
-
|
|
1222
|
-
mod: 'gen8',
|
|
1223
|
-
searchShow: false,
|
|
1224
|
-
ruleset: ['Standard', '2 Ability Clause', 'Dynamax Clause'],
|
|
1225
|
-
banlist: [
|
|
1226
|
-
'Blacephalon', 'Blaziken', 'Butterfree', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chansey', 'Combusken', 'Cresselia', 'Darmanitan-Galar', 'Dialga', 'Dracovish',
|
|
1227
|
-
'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala',
|
|
1228
|
-
'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Natu', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Regieleki',
|
|
1229
|
-
'Regigigas', 'Reshiram', 'Sableye', 'Shedinja', 'Solgaleo', 'Spectrier', 'Tapu Koko', 'Toxtricity', 'Torkoal', 'Urshifu-Base', 'Xatu', 'Xerneas', 'Yveltal',
|
|
1230
|
-
'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zeraora', 'Zekrom', 'Arena Trap', 'Contrary', 'Drizzle', 'Huge Power', 'Imposter', 'Innards Out',
|
|
1231
|
-
'Libero', 'Moody', 'Power Construct', 'Pure Power', 'Quick Draw', 'Shadow Tag', 'Sheer Force', 'Simple', 'Unaware', 'Unburden', 'Water Bubble', 'King\'s Rock',
|
|
1232
|
-
'Quick Claw', 'Baton Pass', 'Bolt Beak', 'Fishious Rend', 'Shell Smash', 'Thousand Arrows',
|
|
1233
|
-
],
|
|
1234
|
-
getEvoFamily(speciesid) {
|
|
1235
|
-
let species = Dex.species.get(speciesid);
|
|
1236
|
-
while (species.prevo) {
|
|
1237
|
-
species = Dex.species.get(species.prevo);
|
|
1238
|
-
}
|
|
1239
|
-
return species.id;
|
|
1240
|
-
},
|
|
1241
|
-
validateSet(set, teamHas) {
|
|
1242
|
-
const unreleased = (pokemon: Species) => pokemon.tier === "Unreleased" && pokemon.isNonstandard === "Unobtainable";
|
|
1243
|
-
if (!teamHas.abilityMap) {
|
|
1244
|
-
teamHas.abilityMap = Object.create(null);
|
|
1245
|
-
for (const pokemon of Dex.species.all()) {
|
|
1246
|
-
if (pokemon.isNonstandard || unreleased(pokemon)) continue;
|
|
1247
|
-
if (pokemon.requiredAbility || pokemon.requiredItem || pokemon.requiredMove) continue;
|
|
1248
|
-
if (this.ruleTable.isBannedSpecies(pokemon)) continue;
|
|
1249
|
-
|
|
1250
|
-
for (const key of Object.values(pokemon.abilities)) {
|
|
1251
|
-
const abilityId = this.dex.toID(key);
|
|
1252
|
-
if (abilityId in teamHas.abilityMap) {
|
|
1253
|
-
teamHas.abilityMap[abilityId][pokemon.evos ? 'push' : 'unshift'](pokemon.id);
|
|
1254
|
-
} else {
|
|
1255
|
-
teamHas.abilityMap[abilityId] = [pokemon.id];
|
|
1256
|
-
}
|
|
1257
|
-
}
|
|
1258
|
-
}
|
|
1259
|
-
}
|
|
1260
|
-
|
|
1261
|
-
const problem = this.validateForme(set);
|
|
1262
|
-
if (problem.length) return problem;
|
|
1263
|
-
|
|
1264
|
-
const species = this.dex.species.get(set.species);
|
|
1265
|
-
if (!species.exists || species.num < 1) return [`The Pok\u00e9mon "${set.species}" does not exist.`];
|
|
1266
|
-
if (species.isNonstandard || unreleased(species)) {
|
|
1267
|
-
return [`${species.name} is not obtainable in Generation ${this.dex.gen}.`];
|
|
1268
|
-
}
|
|
1269
|
-
|
|
1270
|
-
const name = set.name;
|
|
1271
|
-
if (this.ruleTable.isBannedSpecies(species)) {
|
|
1272
|
-
return this.validateSet(set, teamHas);
|
|
1273
|
-
}
|
|
1274
|
-
|
|
1275
|
-
const ability = this.dex.abilities.get(set.ability);
|
|
1276
|
-
if (!ability.exists || ability.isNonstandard) return [`${name} needs to have a valid ability.`];
|
|
1277
|
-
const pokemonWithAbility = teamHas.abilityMap[ability.id];
|
|
1278
|
-
if (!pokemonWithAbility) return [`${ability.name} is not available on a legal Pok\u00e9mon.`];
|
|
1279
|
-
|
|
1280
|
-
(this.format as any).debug = true;
|
|
1281
|
-
|
|
1282
|
-
if (!teamHas.abilitySources) teamHas.abilitySources = Object.create(null);
|
|
1283
|
-
const validSources: string[] = teamHas.abilitySources[this.dex.toID(set.species)] = []; // Evolution families
|
|
1284
|
-
|
|
1285
|
-
let canonicalSource = ''; // Specific for the basic implementation of Donor Clause (see onValidateTeam).
|
|
1286
|
-
|
|
1287
|
-
for (const donor of pokemonWithAbility) {
|
|
1288
|
-
const donorSpecies = this.dex.species.get(donor);
|
|
1289
|
-
let format = this.format;
|
|
1290
|
-
if (!format.getEvoFamily) format = this.dex.formats.get('gen8inheritance');
|
|
1291
|
-
const evoFamily = format.getEvoFamily!(donorSpecies.id);
|
|
1292
|
-
if (validSources.includes(evoFamily)) continue;
|
|
1293
|
-
|
|
1294
|
-
set.species = donorSpecies.name;
|
|
1295
|
-
set.name = donorSpecies.baseSpecies;
|
|
1296
|
-
const problems = this.validateSet(set, teamHas) || [];
|
|
1297
|
-
if (!problems.length) {
|
|
1298
|
-
validSources.push(evoFamily);
|
|
1299
|
-
canonicalSource = donorSpecies.name;
|
|
1300
|
-
}
|
|
1301
|
-
// Specific for the basic implementation of Donor Clause (see onValidateTeam).
|
|
1302
|
-
if (validSources.length > 1) break;
|
|
1303
|
-
}
|
|
1304
|
-
(this.format as any).debug = false;
|
|
1305
|
-
|
|
1306
|
-
set.name = name;
|
|
1307
|
-
set.species = species.name;
|
|
1308
|
-
if (!validSources.length) {
|
|
1309
|
-
if (pokemonWithAbility.length > 1) return [`${name}'s set is illegal.`];
|
|
1310
|
-
return [`${name} has an illegal set with an ability from ${this.dex.species.get(pokemonWithAbility[0]).name}.`];
|
|
1311
|
-
}
|
|
1312
|
-
|
|
1313
|
-
// Protocol: Include the data of the donor species in the `ability` data slot.
|
|
1314
|
-
// Afterwards, we are going to reset the name to what the user intended.
|
|
1315
|
-
set.ability = `${set.ability}0${canonicalSource}`;
|
|
1316
|
-
return null;
|
|
1317
|
-
},
|
|
1318
|
-
onValidateTeam(team, f, teamHas) {
|
|
1319
|
-
if (this.ruleTable.has('2abilityclause')) {
|
|
1320
|
-
const abilityTable = new Map<string, number>();
|
|
1321
|
-
const base: {[k: string]: string} = {
|
|
1322
|
-
airlock: 'cloudnine',
|
|
1323
|
-
battlearmor: 'shellarmor',
|
|
1324
|
-
clearbody: 'whitesmoke',
|
|
1325
|
-
dazzling: 'queenlymajesty',
|
|
1326
|
-
emergencyexit: 'wimpout',
|
|
1327
|
-
filter: 'solidrock',
|
|
1328
|
-
gooey: 'tanglinghair',
|
|
1329
|
-
insomnia: 'vitalspirit',
|
|
1330
|
-
ironbarbs: 'roughskin',
|
|
1331
|
-
libero: 'protean',
|
|
1332
|
-
minus: 'plus',
|
|
1333
|
-
moxie: 'chillingneigh',
|
|
1334
|
-
powerofalchemy: 'receiver',
|
|
1335
|
-
propellertail: 'stalwart',
|
|
1336
|
-
teravolt: 'moldbreaker',
|
|
1337
|
-
turboblaze: 'moldbreaker',
|
|
1338
|
-
};
|
|
1339
|
-
for (const set of team) {
|
|
1340
|
-
let ability = this.toID(set.ability.split('0')[0]);
|
|
1341
|
-
if (!ability) continue;
|
|
1342
|
-
if (ability in base) ability = base[ability] as ID;
|
|
1343
|
-
if ((abilityTable.get(ability) || 0) >= 2) {
|
|
1344
|
-
return [
|
|
1345
|
-
`You are limited to two of each ability by 2 Ability Clause.`,
|
|
1346
|
-
`(You have more than two ${this.dex.abilities.get(ability).name} variants)`,
|
|
1347
|
-
];
|
|
1348
|
-
}
|
|
1349
|
-
abilityTable.set(ability, (abilityTable.get(ability) || 0) + 1);
|
|
1350
|
-
}
|
|
1351
|
-
}
|
|
1352
|
-
|
|
1353
|
-
// Donor Clause
|
|
1354
|
-
const evoFamilyLists = [];
|
|
1355
|
-
for (const set of team) {
|
|
1356
|
-
const abilitySources = teamHas.abilitySources?.[this.dex.toID(set.species)];
|
|
1357
|
-
if (!abilitySources) continue;
|
|
1358
|
-
let format = this.format;
|
|
1359
|
-
if (!format.getEvoFamily) format = this.dex.formats.get('gen8inheritance');
|
|
1360
|
-
evoFamilyLists.push(abilitySources.map(format.getEvoFamily!));
|
|
1361
|
-
}
|
|
1362
|
-
|
|
1363
|
-
// Checking actual full incompatibility would require expensive algebra.
|
|
1364
|
-
// Instead, we only check the trivial case of multiple Pokémon only legal for exactly one family. FIXME?
|
|
1365
|
-
const requiredFamilies = Object.create(null);
|
|
1366
|
-
for (const evoFamilies of evoFamilyLists) {
|
|
1367
|
-
if (evoFamilies.length !== 1) continue;
|
|
1368
|
-
const [familyId] = evoFamilies;
|
|
1369
|
-
if (!(familyId in requiredFamilies)) requiredFamilies[familyId] = 1;
|
|
1370
|
-
requiredFamilies[familyId]++;
|
|
1371
|
-
if (requiredFamilies[familyId] > 2) {
|
|
1372
|
-
return [
|
|
1373
|
-
`You are limited to up to two inheritances from each evolution family by the Donor Clause.`,
|
|
1374
|
-
`(You inherit more than twice from ${this.dex.species.get(familyId).name}).`,
|
|
1375
|
-
];
|
|
1376
|
-
}
|
|
1377
|
-
}
|
|
1378
|
-
},
|
|
1379
|
-
onBegin() {
|
|
1380
|
-
for (const pokemon of this.getAllPokemon()) {
|
|
1381
|
-
if (pokemon.baseAbility.includes('0')) {
|
|
1382
|
-
const donor = pokemon.baseAbility.split('0')[1];
|
|
1383
|
-
pokemon.m.donor = this.toID(donor);
|
|
1384
|
-
pokemon.baseAbility = this.toID(pokemon.baseAbility.split('0')[0]);
|
|
1385
|
-
pokemon.ability = pokemon.baseAbility;
|
|
1386
|
-
}
|
|
1387
|
-
}
|
|
1388
|
-
},
|
|
1389
|
-
onSwitchIn(pokemon) {
|
|
1390
|
-
if (!pokemon.m.donor) return;
|
|
1391
|
-
const donorTemplate = this.dex.species.get(pokemon.m.donor);
|
|
1392
|
-
if (!donorTemplate.exists) return;
|
|
1393
|
-
// Place volatiles on the Pokémon to show the donor details.
|
|
1394
|
-
this.add('-start', pokemon, donorTemplate.name, '[silent]');
|
|
1395
|
-
},
|
|
1396
|
-
},
|
|
1397
1438
|
{
|
|
1398
1439
|
name: "[Gen 8] Linked",
|
|
1399
1440
|
desc: `The first two moves in a Pokémon's moveset are used simultaneously.`,
|
|
@@ -2393,38 +2434,44 @@ export const Formats: FormatList = [
|
|
|
2393
2434
|
column: 3,
|
|
2394
2435
|
},
|
|
2395
2436
|
{
|
|
2396
|
-
name: "[Gen
|
|
2437
|
+
name: "[Gen 2] Ubers",
|
|
2397
2438
|
threads: [
|
|
2398
|
-
`• <a href="https://www.smogon.com/forums/
|
|
2399
|
-
`• <a href="https://www.smogon.com/forums/threads/3641346/">USM UU Viability Rankings</a>`,
|
|
2439
|
+
`• <a href="https://www.smogon.com/forums/posts/8286282/">GSC Ubers</a>`,
|
|
2400
2440
|
],
|
|
2401
2441
|
|
|
2402
|
-
mod: '
|
|
2442
|
+
mod: 'gen2',
|
|
2403
2443
|
// searchShow: false,
|
|
2404
|
-
ruleset: ['
|
|
2405
|
-
banlist: ['OU', 'UUBL', 'Drizzle', 'Drought', 'Kommonium Z', 'Mewnium Z'],
|
|
2444
|
+
ruleset: ['Standard'],
|
|
2406
2445
|
},
|
|
2407
2446
|
{
|
|
2408
|
-
name: "[Gen
|
|
2447
|
+
name: "[Gen 3] 1v1",
|
|
2448
|
+
desc: `Bring three Pokémon to Team Preview and choose one to battle.`,
|
|
2409
2449
|
threads: [
|
|
2410
|
-
`• <a href="https://www.smogon.com/
|
|
2411
|
-
`• <a href="https://www.smogon.com/forums/posts/8034679/">ORAS ZU Viability Rankings</a>`,
|
|
2450
|
+
`• <a href="https://www.smogon.com/forums/posts/8031456/">ADV 1v1</a>`,
|
|
2412
2451
|
],
|
|
2413
2452
|
|
|
2414
|
-
mod: '
|
|
2453
|
+
mod: 'gen3',
|
|
2415
2454
|
// searchShow: false,
|
|
2416
|
-
ruleset: [
|
|
2417
|
-
|
|
2455
|
+
ruleset: [
|
|
2456
|
+
'Picked Team Size = 1', 'Max Team Size = 3',
|
|
2457
|
+
'[Gen 3] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview', '!Freeze Clause Mod',
|
|
2458
|
+
],
|
|
2459
|
+
banlist: ['Clefable', 'Slaking', 'Snorlax', 'Suicune', 'Destiny Bond', 'Explosion', 'Ingrain', 'Perish Song', 'Self-Destruct', 'Bright Powder', 'Focus Band', 'King\'s Rock', 'Lax Incense', 'Quick Claw'],
|
|
2460
|
+
unbanlist: ['Mr. Mime', 'Wobbuffet', 'Wynaut', 'Sand Veil'],
|
|
2418
2461
|
},
|
|
2419
2462
|
{
|
|
2420
|
-
name: "[Gen 1]
|
|
2463
|
+
name: "[Gen 1] Stadium OU",
|
|
2421
2464
|
threads: [
|
|
2422
|
-
`• <a href="https://www.smogon.com/forums/
|
|
2465
|
+
`• <a href="https://www.smogon.com/forums/threads/3685877/">Stadium OU Viability Rankings</a>`,
|
|
2423
2466
|
],
|
|
2424
2467
|
|
|
2425
|
-
mod: '
|
|
2468
|
+
mod: 'gen1stadium',
|
|
2426
2469
|
// searchShow: false,
|
|
2427
|
-
ruleset: ['Standard'],
|
|
2470
|
+
ruleset: ['Standard', 'Team Preview'],
|
|
2471
|
+
banlist: ['Uber',
|
|
2472
|
+
'Nidoking + Fury Attack + Thrash', 'Exeggutor + Poison Powder + Stomp', 'Exeggutor + Sleep Powder + Stomp',
|
|
2473
|
+
'Exeggutor + Stun Spore + Stomp', 'Jolteon + Focus Energy + Thunder Shock', 'Flareon + Focus Energy + Ember',
|
|
2474
|
+
],
|
|
2428
2475
|
},
|
|
2429
2476
|
|
|
2430
2477
|
// Past Gens OU
|
|
@@ -2478,7 +2525,7 @@ export const Formats: FormatList = [
|
|
|
2478
2525
|
],
|
|
2479
2526
|
|
|
2480
2527
|
mod: 'gen4',
|
|
2481
|
-
ruleset: ['Standard'],
|
|
2528
|
+
ruleset: ['Standard', 'Freeze Clause Mod'],
|
|
2482
2529
|
banlist: ['AG', 'Uber', 'Arena Trap', 'Sand Veil', 'Swinub + Snow Cloak', 'Piloswine + Snow Cloak', 'Mamoswine + Snow Cloak', 'Soul Dew', 'Baton Pass', 'Swagger'],
|
|
2483
2530
|
},
|
|
2484
2531
|
{
|
|
@@ -2489,7 +2536,7 @@ export const Formats: FormatList = [
|
|
|
2489
2536
|
],
|
|
2490
2537
|
|
|
2491
2538
|
mod: 'gen3',
|
|
2492
|
-
ruleset: ['Standard', 'One Boost Passer Clause'],
|
|
2539
|
+
ruleset: ['Standard', 'One Boost Passer Clause', 'Freeze Clause Mod'],
|
|
2493
2540
|
banlist: ['Uber', 'Sand Veil', 'Soundproof', 'Assist', 'Baton Pass + Block', 'Baton Pass + Mean Look', 'Baton Pass + Spider Web', 'Smeargle + Ingrain'],
|
|
2494
2541
|
},
|
|
2495
2542
|
{
|
|
@@ -2658,6 +2705,18 @@ export const Formats: FormatList = [
|
|
|
2658
2705
|
ruleset: ['Standard', 'Mega Rayquaza Clause'],
|
|
2659
2706
|
banlist: ['Baton Pass'],
|
|
2660
2707
|
},
|
|
2708
|
+
{
|
|
2709
|
+
name: "[Gen 7] UU",
|
|
2710
|
+
threads: [
|
|
2711
|
+
`• <a href="https://www.smogon.com/forums/threads/3621217/">USM UU Sample Teams</a>`,
|
|
2712
|
+
`• <a href="https://www.smogon.com/forums/threads/3641346/">USM UU Viability Rankings</a>`,
|
|
2713
|
+
],
|
|
2714
|
+
|
|
2715
|
+
mod: 'gen7',
|
|
2716
|
+
searchShow: false,
|
|
2717
|
+
ruleset: ['[Gen 7] OU'],
|
|
2718
|
+
banlist: ['OU', 'UUBL', 'Drizzle', 'Drought', 'Kommonium Z', 'Mewnium Z'],
|
|
2719
|
+
},
|
|
2661
2720
|
{
|
|
2662
2721
|
name: "[Gen 7] RU",
|
|
2663
2722
|
threads: [
|
|
@@ -3077,6 +3136,18 @@ export const Formats: FormatList = [
|
|
|
3077
3136
|
searchShow: false,
|
|
3078
3137
|
ruleset: ['Obtainable', 'Team Preview', 'Endless Battle Clause', 'HP Percentage Mod', 'Cancel Mod'],
|
|
3079
3138
|
},
|
|
3139
|
+
{
|
|
3140
|
+
name: "[Gen 6] ZU",
|
|
3141
|
+
threads: [
|
|
3142
|
+
`• <a href="https://www.smogon.com/dex/xy/formats/zu/">ORAS ZU Banlist</a>`,
|
|
3143
|
+
`• <a href="https://www.smogon.com/forums/posts/8034679/">ORAS ZU Viability Rankings</a>`,
|
|
3144
|
+
],
|
|
3145
|
+
|
|
3146
|
+
mod: 'gen6',
|
|
3147
|
+
searchShow: false,
|
|
3148
|
+
ruleset: ['[Gen 6] PU'],
|
|
3149
|
+
banlist: ['PU', 'Fraxure', 'Regigigas', 'Simisear'],
|
|
3150
|
+
},
|
|
3080
3151
|
{
|
|
3081
3152
|
name: "[Gen 6] CAP",
|
|
3082
3153
|
threads: [
|
|
@@ -3088,7 +3159,7 @@ export const Formats: FormatList = [
|
|
|
3088
3159
|
mod: 'gen6',
|
|
3089
3160
|
searchShow: false,
|
|
3090
3161
|
ruleset: ['[Gen 6] OU', '+CAP'],
|
|
3091
|
-
banlist: ['Aurumoth', 'Cawmodore'
|
|
3162
|
+
banlist: ['Aurumoth', 'Cawmodore'],
|
|
3092
3163
|
},
|
|
3093
3164
|
{
|
|
3094
3165
|
name: "[Gen 6] Battle Spot Singles",
|
|
@@ -3285,7 +3356,7 @@ export const Formats: FormatList = [
|
|
|
3285
3356
|
mod: 'gen5',
|
|
3286
3357
|
searchShow: false,
|
|
3287
3358
|
ruleset: ['[Gen 5] NU', 'Sleep Moves Clause'],
|
|
3288
|
-
banlist: ['NU', 'PUBL'],
|
|
3359
|
+
banlist: ['NU', 'PUBL', 'Damp Rock'],
|
|
3289
3360
|
},
|
|
3290
3361
|
{
|
|
3291
3362
|
name: "[Gen 5] LC",
|
|
@@ -3457,7 +3528,7 @@ export const Formats: FormatList = [
|
|
|
3457
3528
|
|
|
3458
3529
|
mod: 'gen4',
|
|
3459
3530
|
searchShow: false,
|
|
3460
|
-
ruleset: ['[Gen 4] OU'],
|
|
3531
|
+
ruleset: ['[Gen 4] OU', '!Freeze Clause Mod'],
|
|
3461
3532
|
banlist: ['OU', 'UUBL'],
|
|
3462
3533
|
unbanlist: ['Arena Trap', 'Swagger'],
|
|
3463
3534
|
},
|
|
@@ -3524,7 +3595,7 @@ export const Formats: FormatList = [
|
|
|
3524
3595
|
searchShow: false,
|
|
3525
3596
|
ruleset: [
|
|
3526
3597
|
'Picked Team Size = 1', 'Max Team Size = 3',
|
|
3527
|
-
'[Gen 4] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview',
|
|
3598
|
+
'[Gen 4] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview', '!Freeze Clause Mod',
|
|
3528
3599
|
],
|
|
3529
3600
|
banlist: ['Latias', 'Machamp', 'Porygon-Z', 'Shaymin', 'Snorlax', 'Togekiss', 'Focus Sash', 'Destiny Bond', 'Explosion', 'Perish Song', 'Self-Destruct'],
|
|
3530
3601
|
unbanlist: ['Wobbuffet', 'Wynaut', 'Sand Veil', 'Swagger'],
|
|
@@ -3571,7 +3642,7 @@ export const Formats: FormatList = [
|
|
|
3571
3642
|
mod: 'gen4',
|
|
3572
3643
|
gameType: 'doubles',
|
|
3573
3644
|
searchShow: false,
|
|
3574
|
-
ruleset: ['[Gen 4] OU'],
|
|
3645
|
+
ruleset: ['[Gen 4] OU', '!Freeze Clause Mod'],
|
|
3575
3646
|
banlist: ['Explosion'],
|
|
3576
3647
|
unbanlist: ['Garchomp', 'Latias', 'Latios', 'Manaphy', 'Mew', 'Salamence', 'Wobbuffet', 'Wynaut', 'Swagger'],
|
|
3577
3648
|
},
|
|
@@ -3633,9 +3704,8 @@ export const Formats: FormatList = [
|
|
|
3633
3704
|
|
|
3634
3705
|
mod: 'gen3',
|
|
3635
3706
|
searchShow: false,
|
|
3636
|
-
ruleset: ['Standard'
|
|
3637
|
-
banlist: ['Uber', 'OU', 'UUBL', 'Smeargle + Ingrain', 'Baton Pass'],
|
|
3638
|
-
unbanlist: ['Scyther'],
|
|
3707
|
+
ruleset: ['Standard'],
|
|
3708
|
+
banlist: ['Uber', 'OU', 'UUBL', 'Smeargle + Ingrain', 'Arena Trap', 'Bright Powder', 'Lax Incense', 'Baton Pass', 'Swagger'],
|
|
3639
3709
|
},
|
|
3640
3710
|
{
|
|
3641
3711
|
name: "[Gen 3] NU",
|
|
@@ -3645,9 +3715,8 @@ export const Formats: FormatList = [
|
|
|
3645
3715
|
|
|
3646
3716
|
mod: 'gen3',
|
|
3647
3717
|
searchShow: false,
|
|
3648
|
-
ruleset: ['
|
|
3649
|
-
banlist: ['UU'],
|
|
3650
|
-
unbanlist: ['Baton Pass'],
|
|
3718
|
+
ruleset: ['Standard'],
|
|
3719
|
+
banlist: ['Uber', 'OU', 'UUBL', 'UU', 'Smeargle + Ingrain'],
|
|
3651
3720
|
},
|
|
3652
3721
|
{
|
|
3653
3722
|
name: "[Gen 3] Doubles OU",
|
|
@@ -3662,22 +3731,6 @@ export const Formats: FormatList = [
|
|
|
3662
3731
|
banlist: ['Uber'],
|
|
3663
3732
|
unbanlist: ['Deoxys-Speed', 'Wobbuffet', 'Wynaut'],
|
|
3664
3733
|
},
|
|
3665
|
-
{
|
|
3666
|
-
name: "[Gen 3] 1v1",
|
|
3667
|
-
desc: `Bring three Pokémon to Team Preview and choose one to battle.`,
|
|
3668
|
-
threads: [
|
|
3669
|
-
`• <a href="https://www.smogon.com/forums/posts/8031456/">ADV 1v1</a>`,
|
|
3670
|
-
],
|
|
3671
|
-
|
|
3672
|
-
mod: 'gen3',
|
|
3673
|
-
searchShow: false,
|
|
3674
|
-
ruleset: [
|
|
3675
|
-
'Picked Team Size = 1', 'Max Team Size = 3',
|
|
3676
|
-
'[Gen 3] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview',
|
|
3677
|
-
],
|
|
3678
|
-
banlist: ['Clefable', 'Slaking', 'Snorlax', 'Suicune', 'Destiny Bond', 'Explosion', 'Ingrain', 'Perish Song', 'Self-Destruct', 'Bright Powder', 'Focus Band', 'King\'s Rock', 'Lax Incense', 'Quick Claw'],
|
|
3679
|
-
unbanlist: ['Mr. Mime', 'Wobbuffet', 'Wynaut', 'Sand Veil'],
|
|
3680
|
-
},
|
|
3681
3734
|
{
|
|
3682
3735
|
name: "[Gen 3] Custom Game",
|
|
3683
3736
|
|
|
@@ -3696,16 +3749,6 @@ export const Formats: FormatList = [
|
|
|
3696
3749
|
debug: true,
|
|
3697
3750
|
ruleset: ['HP Percentage Mod', 'Cancel Mod', 'Max Team Size = 24', 'Max Move Count = 24', 'Max Level = 9999', 'Default Level = 100'],
|
|
3698
3751
|
},
|
|
3699
|
-
{
|
|
3700
|
-
name: "[Gen 2] Ubers",
|
|
3701
|
-
threads: [
|
|
3702
|
-
`• <a href="https://www.smogon.com/forums/posts/8286282/">GSC Ubers</a>`,
|
|
3703
|
-
],
|
|
3704
|
-
|
|
3705
|
-
mod: 'gen2',
|
|
3706
|
-
searchShow: false,
|
|
3707
|
-
ruleset: ['Standard'],
|
|
3708
|
-
},
|
|
3709
3752
|
{
|
|
3710
3753
|
name: "[Gen 2] UU",
|
|
3711
3754
|
threads: [`• <a href="https://www.smogon.com/forums/threads/3576710/">GSC UU</a>`],
|
|
@@ -3774,6 +3817,16 @@ export const Formats: FormatList = [
|
|
|
3774
3817
|
battle: {trunc: Math.trunc},
|
|
3775
3818
|
ruleset: ['HP Percentage Mod', 'Cancel Mod', 'Max Team Size = 24', 'Max Move Count = 24', 'Max Level = 9999', 'Default Level = 100'],
|
|
3776
3819
|
},
|
|
3820
|
+
{
|
|
3821
|
+
name: "[Gen 1] Ubers",
|
|
3822
|
+
threads: [
|
|
3823
|
+
`• <a href="https://www.smogon.com/forums/posts/8286283/">RBY Ubers</a>`,
|
|
3824
|
+
],
|
|
3825
|
+
|
|
3826
|
+
mod: 'gen1',
|
|
3827
|
+
searchShow: false,
|
|
3828
|
+
ruleset: ['Standard'],
|
|
3829
|
+
},
|
|
3777
3830
|
{
|
|
3778
3831
|
name: "[Gen 1] UU",
|
|
3779
3832
|
threads: [
|
|
@@ -3783,7 +3836,7 @@ export const Formats: FormatList = [
|
|
|
3783
3836
|
|
|
3784
3837
|
mod: 'gen1',
|
|
3785
3838
|
searchShow: false,
|
|
3786
|
-
ruleset: ['[Gen 1] OU'],
|
|
3839
|
+
ruleset: ['[Gen 1] OU', 'APT Clause'],
|
|
3787
3840
|
banlist: ['OU', 'UUBL'],
|
|
3788
3841
|
},
|
|
3789
3842
|
{
|
|
@@ -3820,20 +3873,6 @@ export const Formats: FormatList = [
|
|
|
3820
3873
|
],
|
|
3821
3874
|
banlist: ['Uber'],
|
|
3822
3875
|
},
|
|
3823
|
-
{
|
|
3824
|
-
name: "[Gen 1] Stadium OU",
|
|
3825
|
-
threads: [
|
|
3826
|
-
`• <a href="https://www.smogon.com/forums/threads/3685877/">Stadium OU Viability Rankings</a>`,
|
|
3827
|
-
],
|
|
3828
|
-
|
|
3829
|
-
mod: 'gen1stadium',
|
|
3830
|
-
searchShow: false,
|
|
3831
|
-
ruleset: ['Standard', 'Team Preview'],
|
|
3832
|
-
banlist: ['Uber',
|
|
3833
|
-
'Nidoking + Fury Attack + Thrash', 'Exeggutor + Poison Powder + Stomp', 'Exeggutor + Sleep Powder + Stomp',
|
|
3834
|
-
'Exeggutor + Stun Spore + Stomp', 'Jolteon + Focus Energy + Thunder Shock', 'Flareon + Focus Energy + Ember',
|
|
3835
|
-
],
|
|
3836
|
-
},
|
|
3837
3876
|
{
|
|
3838
3877
|
name: "[Gen 1] Tradebacks OU",
|
|
3839
3878
|
desc: `RBY OU with movepool additions from the Time Capsule.`,
|