@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.
Files changed (46) hide show
  1. package/build/config/formats.js +330 -285
  2. package/build/config/formats.js.map +1 -1
  3. package/build/data/aliases.js +2 -2
  4. package/build/data/aliases.js.map +1 -1
  5. package/build/data/formats-data.js +16 -12
  6. package/build/data/formats-data.js.map +1 -1
  7. package/build/data/learnsets.js +29 -0
  8. package/build/data/learnsets.js.map +1 -1
  9. package/build/data/mods/gen1/conditions.js +4 -0
  10. package/build/data/mods/gen1/conditions.js.map +1 -1
  11. package/build/data/mods/gen1/formats-data.js +3 -3
  12. package/build/data/mods/gen1/formats-data.js.map +1 -1
  13. package/build/data/mods/gen1/moves.js +0 -4
  14. package/build/data/mods/gen1/moves.js.map +1 -1
  15. package/build/data/mods/gen2/learnsets.js +2 -2
  16. package/build/data/mods/gen2/learnsets.js.map +1 -1
  17. package/build/data/mods/gen2/scripts.js +16 -0
  18. package/build/data/mods/gen2/scripts.js.map +1 -1
  19. package/build/data/mods/gen4/formats-data.js +1 -1
  20. package/build/data/mods/gen4/formats-data.js.map +1 -1
  21. package/build/data/mods/gen6/formats-data.js +1 -1
  22. package/build/data/mods/gen6/formats-data.js.map +1 -1
  23. package/build/data/mods/gen6/learnsets.js +0 -75
  24. package/build/data/mods/gen6/learnsets.js.map +1 -1
  25. package/build/data/pokedex.js +12 -0
  26. package/build/data/pokedex.js.map +1 -1
  27. package/build/data/rulesets.js +29 -0
  28. package/build/data/rulesets.js.map +1 -1
  29. package/build/data/tags.js +2 -2
  30. package/build/data/tags.js.map +1 -1
  31. package/config/formats.ts +321 -282
  32. package/data/aliases.ts +2 -2
  33. package/data/formats-data.ts +16 -12
  34. package/data/learnsets.ts +29 -0
  35. package/data/mods/gen1/conditions.ts +4 -0
  36. package/data/mods/gen1/formats-data.ts +3 -3
  37. package/data/mods/gen1/moves.ts +0 -3
  38. package/data/mods/gen2/learnsets.ts +2 -2
  39. package/data/mods/gen2/scripts.ts +16 -0
  40. package/data/mods/gen4/formats-data.ts +1 -1
  41. package/data/mods/gen6/formats-data.ts +1 -1
  42. package/data/mods/gen6/learnsets.ts +0 -75
  43. package/data/pokedex.ts +12 -0
  44. package/data/rulesets.ts +28 -0
  45. package/data/tags.ts +2 -2
  46. 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', 'Vullaby', 'Vulpix-Alola', 'Woobat', 'Zigzagoon-Base',
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', 'Munchlax', 'Natu', 'Onix', 'Pawniard',
255
- 'Ponyta', 'Ponyta-Galar', 'Porygon', 'Slowpoke-Base', 'Staryu', 'Timburr', 'Trapinch', 'Tyrunt',
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', 'Kyurem-White',
417
- 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Rayquaza', 'Reshiram',
418
- 'Solgaleo', 'Tornadus-Base', 'Urshifu-Base', 'Urshifu-Rapid-Strike', 'Whimsicott', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta',
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] Tier Shift",
629
- desc: `Pokémon get a +10 boost to each stat, barring HP, per tier below OU they are in.`,
628
+ name: "[Gen 8] Broken Record",
629
+ desc: `Pokémon can hold a TR to use that move in battle.`,
630
630
  threads: [
631
- `&bullet; <a href="https://www.smogon.com/forums/threads/3662165/">Tier Shift</a>`,
631
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3701270/">Broken Record</a>`,
632
632
  ],
633
633
 
634
634
  mod: 'gen8',
635
- ruleset: ['Standard', 'Tier Shift Mod', 'Dynamax Clause'],
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', 'Mewtwo',
639
- 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Reshiram', 'Solgaleo', 'Spectrier', 'Urshifu-Base',
640
- 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Base', 'Zekrom', 'Zygarde-Base', 'Arena Trap', 'Moody', 'Power Construct', 'Sand Veil',
641
- 'Shadow Tag', 'Snow Cloak', 'Bright Powder', 'Damp Rock', 'Eviolite', 'Heat Rock', 'King\'s Rock', 'Lax Incense', 'Baton Pass',
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] Inverse",
646
- desc: `Weaknesses become resistances, while resistances and immunities become weaknesses.`,
703
+ name: "[Gen 8] Inheritance",
704
+ desc: `Pok&eacute;mon may use the ability and moves of another, as long as they forfeit their own learnset.`,
647
705
  threads: [
648
- `&bullet; <a href="https://www.smogon.com/forums/threads/3666858/">Inverse</a>`,
706
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3656811/">Inheritance</a>`,
649
707
  ],
650
708
 
651
709
  mod: 'gen8',
652
- ruleset: ['Standard', 'Inverse Mod', 'Dynamax Clause'],
710
+ // searchShow: false,
711
+ ruleset: ['Standard', '!Sleep Clause Mod', 'Sleep Moves Clause', '2 Ability Clause', 'Dynamax Clause'],
653
712
  banlist: [
654
- 'Cinderace', 'Calyrex-Ice', 'Calyrex-Shadow', 'Darmanitan-Galar', 'Dialga', 'Diggersby', 'Dracovish', 'Dracozolt', 'Eternatus', 'Genesect', 'Giratina',
655
- 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala', 'Marshadow',
656
- 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Porygon-Z', 'Rayquaza', 'Regidrago', 'Regieleki', 'Reshiram',
657
- 'Reuniclus', 'Rillaboom', 'Solgaleo', 'Spectrier', 'Urshifu-Base', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Base', 'Zekrom', 'Arena Trap',
658
- 'Moody', 'Power Construct', 'Shadow Tag', 'King\'s Rock', 'Baton Pass',
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', 'Court Change', 'Bolt Beak', 'Double Iron Bash',
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', 'Fishious Rend',
797
- 'Geomancy', 'Glacial Lance', 'Oblivion Wing', 'Precipice Blades', 'Shell Smash', 'Shift Gear', 'Thousand Arrows', 'Thunderous Kick', 'V-create',
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&eacute;mon may use the ability and moves of another, as long as they forfeit their own learnset.`,
1218
- threads: [
1219
- `&bullet; <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&eacute;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 7] UU",
2437
+ name: "[Gen 2] Ubers",
2397
2438
  threads: [
2398
- `&bullet; <a href="https://www.smogon.com/forums/threads/3621217/">USM UU Sample Teams</a>`,
2399
- `&bullet; <a href="https://www.smogon.com/forums/threads/3641346/">USM UU Viability Rankings</a>`,
2439
+ `&bullet; <a href="https://www.smogon.com/forums/posts/8286282/">GSC Ubers</a>`,
2400
2440
  ],
2401
2441
 
2402
- mod: 'gen7',
2442
+ mod: 'gen2',
2403
2443
  // searchShow: false,
2404
- ruleset: ['[Gen 7] OU'],
2405
- banlist: ['OU', 'UUBL', 'Drizzle', 'Drought', 'Kommonium Z', 'Mewnium Z'],
2444
+ ruleset: ['Standard'],
2406
2445
  },
2407
2446
  {
2408
- name: "[Gen 6] ZU",
2447
+ name: "[Gen 3] 1v1",
2448
+ desc: `Bring three Pok&eacute;mon to Team Preview and choose one to battle.`,
2409
2449
  threads: [
2410
- `&bullet; <a href="https://www.smogon.com/dex/xy/formats/zu/">ORAS ZU Banlist</a>`,
2411
- `&bullet; <a href="https://www.smogon.com/forums/posts/8034679/">ORAS ZU Viability Rankings</a>`,
2450
+ `&bullet; <a href="https://www.smogon.com/forums/posts/8031456/">ADV 1v1</a>`,
2412
2451
  ],
2413
2452
 
2414
- mod: 'gen6',
2453
+ mod: 'gen3',
2415
2454
  // searchShow: false,
2416
- ruleset: ['[Gen 6] PU'],
2417
- banlist: ['PU', 'Fraxure', 'Regigigas', 'Simisear'],
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] Ubers",
2463
+ name: "[Gen 1] Stadium OU",
2421
2464
  threads: [
2422
- `&bullet; <a href="https://www.smogon.com/forums/posts/8286283/">RBY Ubers</a>`,
2465
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3685877/">Stadium OU Viability Rankings</a>`,
2423
2466
  ],
2424
2467
 
2425
- mod: 'gen1',
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
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3621217/">USM UU Sample Teams</a>`,
2712
+ `&bullet; <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
+ `&bullet; <a href="https://www.smogon.com/dex/xy/formats/zu/">ORAS ZU Banlist</a>`,
3143
+ `&bullet; <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', 'Crucibelle-Mega'],
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', 'NFE Clause'],
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: ['[Gen 3] UU', '!NFE Clause'],
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&eacute;mon to Team Preview and choose one to battle.`,
3668
- threads: [
3669
- `&bullet; <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
- `&bullet; <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: [`&bullet; <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
+ `&bullet; <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
- `&bullet; <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.`,