@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
@@ -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', 'Vullaby', 'Vulpix-Alola', 'Woobat', 'Zigzagoon-Base',
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', 'Munchlax', 'Natu', 'Onix', 'Pawniard',
237
- 'Ponyta', 'Ponyta-Galar', 'Porygon', 'Slowpoke-Base', 'Staryu', 'Timburr', 'Trapinch', 'Tyrunt',
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', 'Kyurem-White',
383
- 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Rayquaza', 'Reshiram',
384
- 'Solgaleo', 'Tornadus-Base', 'Urshifu-Base', 'Urshifu-Rapid-Strike', 'Whimsicott', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta',
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] Tier Shift",
582
- desc: `Pokémon get a +10 boost to each stat, barring HP, per tier below OU they are in.`,
581
+ name: "[Gen 8] Broken Record",
582
+ desc: `Pokémon can hold a TR to use that move in battle.`,
583
583
  threads: [
584
- `&bullet; <a href="https://www.smogon.com/forums/threads/3662165/">Tier Shift</a>`,
584
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3701270/">Broken Record</a>`,
585
585
  ],
586
586
  mod: 'gen8',
587
- ruleset: ['Standard', 'Tier Shift Mod', 'Dynamax Clause'],
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', 'Mewtwo',
591
- 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Reshiram', 'Solgaleo', 'Spectrier', 'Urshifu-Base',
592
- 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Base', 'Zekrom', 'Zygarde-Base', 'Arena Trap', 'Moody', 'Power Construct', 'Sand Veil',
593
- 'Shadow Tag', 'Snow Cloak', 'Bright Powder', 'Damp Rock', 'Eviolite', 'Heat Rock', 'King\'s Rock', 'Lax Incense', 'Baton Pass',
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] Inverse",
598
- desc: `Weaknesses become resistances, while resistances and immunities become weaknesses.`,
660
+ name: "[Gen 8] Inheritance",
661
+ desc: `Pok&eacute;mon may use the ability and moves of another, as long as they forfeit their own learnset.`,
599
662
  threads: [
600
- `&bullet; <a href="https://www.smogon.com/forums/threads/3666858/">Inverse</a>`,
663
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3656811/">Inheritance</a>`,
601
664
  ],
602
665
  mod: 'gen8',
603
- ruleset: ['Standard', 'Inverse Mod', 'Dynamax Clause'],
666
+ // searchShow: false,
667
+ ruleset: ['Standard', '!Sleep Clause Mod', 'Sleep Moves Clause', '2 Ability Clause', 'Dynamax Clause'],
604
668
  banlist: [
605
- 'Cinderace', 'Calyrex-Ice', 'Calyrex-Shadow', 'Darmanitan-Galar', 'Dialga', 'Diggersby', 'Dracovish', 'Dracozolt', 'Eternatus', 'Genesect', 'Giratina',
606
- 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala', 'Marshadow',
607
- 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Porygon-Z', 'Rayquaza', 'Regidrago', 'Regieleki', 'Reshiram',
608
- 'Reuniclus', 'Rillaboom', 'Solgaleo', 'Spectrier', 'Urshifu-Base', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Base', 'Zekrom', 'Arena Trap',
609
- 'Moody', 'Power Construct', 'Shadow Tag', 'King\'s Rock', 'Baton Pass',
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', 'Court Change', 'Bolt Beak', 'Double Iron Bash',
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', 'Fishious Rend',
744
- 'Geomancy', 'Glacial Lance', 'Oblivion Wing', 'Precipice Blades', 'Shell Smash', 'Shift Gear', 'Thousand Arrows', 'Thunderous Kick', 'V-create',
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&eacute;mon may use the ability and moves of another, as long as they forfeit their own learnset.`,
1163
- threads: [
1164
- `&bullet; <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&eacute;mon's moveset are used simultaneously.`,
@@ -2326,35 +2373,41 @@ exports.Formats = [
2326
2373
  column: 3,
2327
2374
  },
2328
2375
  {
2329
- name: "[Gen 7] UU",
2376
+ name: "[Gen 2] Ubers",
2330
2377
  threads: [
2331
- `&bullet; <a href="https://www.smogon.com/forums/threads/3621217/">USM UU Sample Teams</a>`,
2332
- `&bullet; <a href="https://www.smogon.com/forums/threads/3641346/">USM UU Viability Rankings</a>`,
2378
+ `&bullet; <a href="https://www.smogon.com/forums/posts/8286282/">GSC Ubers</a>`,
2333
2379
  ],
2334
- mod: 'gen7',
2380
+ mod: 'gen2',
2335
2381
  // searchShow: false,
2336
- ruleset: ['[Gen 7] OU'],
2337
- banlist: ['OU', 'UUBL', 'Drizzle', 'Drought', 'Kommonium Z', 'Mewnium Z'],
2382
+ ruleset: ['Standard'],
2338
2383
  },
2339
2384
  {
2340
- name: "[Gen 6] ZU",
2385
+ name: "[Gen 3] 1v1",
2386
+ desc: `Bring three Pok&eacute;mon to Team Preview and choose one to battle.`,
2341
2387
  threads: [
2342
- `&bullet; <a href="https://www.smogon.com/dex/xy/formats/zu/">ORAS ZU Banlist</a>`,
2343
- `&bullet; <a href="https://www.smogon.com/forums/posts/8034679/">ORAS ZU Viability Rankings</a>`,
2388
+ `&bullet; <a href="https://www.smogon.com/forums/posts/8031456/">ADV 1v1</a>`,
2344
2389
  ],
2345
- mod: 'gen6',
2390
+ mod: 'gen3',
2346
2391
  // searchShow: false,
2347
- ruleset: ['[Gen 6] PU'],
2348
- banlist: ['PU', 'Fraxure', 'Regigigas', 'Simisear'],
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] Ubers",
2400
+ name: "[Gen 1] Stadium OU",
2352
2401
  threads: [
2353
- `&bullet; <a href="https://www.smogon.com/forums/posts/8286283/">RBY Ubers</a>`,
2402
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3685877/">Stadium OU Viability Rankings</a>`,
2354
2403
  ],
2355
- mod: 'gen1',
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
  `&bullet; <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
  `&bullet; <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
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3621217/">USM UU Sample Teams</a>`,
2633
+ `&bullet; <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
+ `&bullet; <a href="https://www.smogon.com/dex/xy/formats/zu/">ORAS ZU Banlist</a>`,
3031
+ `&bullet; <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', 'Crucibelle-Mega'],
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', 'NFE Clause'],
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: ['[Gen 3] UU', '!NFE Clause'],
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&eacute;mon to Team Preview and choose one to battle.`,
3494
- threads: [
3495
- `&bullet; <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
- `&bullet; <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: [`&bullet; <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
+ `&bullet; <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
- `&bullet; <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.`,