@pkmn/sim 0.5.19 → 0.5.22

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 (91) hide show
  1. package/build/config/formats.js +354 -294
  2. package/build/config/formats.js.map +1 -1
  3. package/build/data/abilities.js +1 -3
  4. package/build/data/abilities.js.map +1 -1
  5. package/build/data/aliases.js +2 -2
  6. package/build/data/aliases.js.map +1 -1
  7. package/build/data/conditions.js +4 -1
  8. package/build/data/conditions.js.map +1 -1
  9. package/build/data/formats-data.js +16 -12
  10. package/build/data/formats-data.js.map +1 -1
  11. package/build/data/learnsets.js +29 -0
  12. package/build/data/learnsets.js.map +1 -1
  13. package/build/data/mods/gen1/conditions.js +7 -0
  14. package/build/data/mods/gen1/conditions.js.map +1 -1
  15. package/build/data/mods/gen1/formats-data.js +3 -3
  16. package/build/data/mods/gen1/formats-data.js.map +1 -1
  17. package/build/data/mods/gen1/moves.js +0 -6
  18. package/build/data/mods/gen1/moves.js.map +1 -1
  19. package/build/data/mods/gen2/conditions.js +3 -0
  20. package/build/data/mods/gen2/conditions.js.map +1 -1
  21. package/build/data/mods/gen2/learnsets.js +2 -2
  22. package/build/data/mods/gen2/learnsets.js.map +1 -1
  23. package/build/data/mods/gen2/scripts.js +16 -0
  24. package/build/data/mods/gen2/scripts.js.map +1 -1
  25. package/build/data/mods/gen3/conditions.js +3 -0
  26. package/build/data/mods/gen3/conditions.js.map +1 -1
  27. package/build/data/mods/gen4/abilities.js +1 -1
  28. package/build/data/mods/gen4/abilities.js.map +1 -1
  29. package/build/data/mods/gen4/conditions.js +3 -0
  30. package/build/data/mods/gen4/conditions.js.map +1 -1
  31. package/build/data/mods/gen4/formats-data.js +1 -1
  32. package/build/data/mods/gen4/formats-data.js.map +1 -1
  33. package/build/data/mods/gen4/moves.js +9 -2
  34. package/build/data/mods/gen4/moves.js.map +1 -1
  35. package/build/data/mods/gen5/moves.js +4 -7
  36. package/build/data/mods/gen5/moves.js.map +1 -1
  37. package/build/data/mods/gen5/pokedex.js +24 -0
  38. package/build/data/mods/gen5/pokedex.js.map +1 -1
  39. package/build/data/mods/gen6/formats-data.js +1 -1
  40. package/build/data/mods/gen6/formats-data.js.map +1 -1
  41. package/build/data/mods/gen6/learnsets.js +0 -75
  42. package/build/data/mods/gen6/learnsets.js.map +1 -1
  43. package/build/data/mods/gen7/abilities.js +8 -0
  44. package/build/data/mods/gen7/abilities.js.map +1 -1
  45. package/build/data/mods/gen7/moves.js +2 -2
  46. package/build/data/mods/gen7/moves.js.map +1 -1
  47. package/build/data/moves.js +8 -3
  48. package/build/data/moves.js.map +1 -1
  49. package/build/data/pokedex.js +12 -0
  50. package/build/data/pokedex.js.map +1 -1
  51. package/build/data/rulesets.js +68 -0
  52. package/build/data/rulesets.js.map +1 -1
  53. package/build/data/tags.js +2 -2
  54. package/build/data/tags.js.map +1 -1
  55. package/build/sim/battle.js +1 -7
  56. package/build/sim/battle.js.map +1 -1
  57. package/build/sim/pokemon.js +8 -2
  58. package/build/sim/pokemon.js.map +1 -1
  59. package/build/sim/side.js +21 -0
  60. package/build/sim/side.js.map +1 -1
  61. package/config/formats.ts +346 -291
  62. package/data/abilities.ts +1 -3
  63. package/data/aliases.ts +2 -2
  64. package/data/conditions.ts +5 -1
  65. package/data/formats-data.ts +16 -12
  66. package/data/learnsets.ts +29 -0
  67. package/data/mods/gen1/conditions.ts +8 -0
  68. package/data/mods/gen1/formats-data.ts +3 -3
  69. package/data/mods/gen1/moves.ts +0 -4
  70. package/data/mods/gen2/conditions.ts +4 -0
  71. package/data/mods/gen2/learnsets.ts +2 -2
  72. package/data/mods/gen2/scripts.ts +16 -0
  73. package/data/mods/gen3/conditions.ts +4 -0
  74. package/data/mods/gen4/abilities.ts +1 -1
  75. package/data/mods/gen4/conditions.ts +4 -0
  76. package/data/mods/gen4/formats-data.ts +1 -1
  77. package/data/mods/gen4/moves.ts +9 -2
  78. package/data/mods/gen5/moves.ts +4 -7
  79. package/data/mods/gen5/pokedex.ts +24 -0
  80. package/data/mods/gen6/formats-data.ts +1 -1
  81. package/data/mods/gen6/learnsets.ts +0 -75
  82. package/data/mods/gen7/abilities.ts +8 -0
  83. package/data/mods/gen7/moves.ts +2 -2
  84. package/data/moves.ts +8 -3
  85. package/data/pokedex.ts +12 -0
  86. package/data/rulesets.ts +64 -0
  87. package/data/tags.ts +2 -2
  88. package/package.json +1 -1
  89. package/sim/battle.ts +1 -7
  90. package/sim/pokemon.ts +7 -2
  91. package/sim/side.ts +20 -0
package/config/formats.ts CHANGED
@@ -176,7 +176,7 @@ export const Formats: FormatList = [
176
176
  desc: `All the Pokémon on a team must share a type.`,
177
177
  threads: [
178
178
  `&bullet; <a href="https://www.smogon.com/forums/threads/3672167/">Monotype Metagame Discussion</a>`,
179
- `&bullet; <a href="https://www.smogon.com/forums/threads/3673391/">Monotype Sample Teams</a>`,
179
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3702647/">Monotype Sample Teams</a>`,
180
180
  `&bullet; <a href="https://www.smogon.com/forums/threads/3673165">Monotype Viability Rankings</a>`,
181
181
  ],
182
182
 
@@ -235,8 +235,8 @@ export const Formats: FormatList = [
235
235
  mod: 'gen8',
236
236
  ruleset: ['[Gen 8] PU'],
237
237
  banlist: [
238
- 'PU', 'Arctovish', 'Aurorus', 'Basculin', 'Centiskorch', 'Drampa', 'Exeggutor-Alola', 'Gallade', 'Haunter', 'Magmortar', 'Magneton', 'Omastar',
239
- 'Rotom-Frost', 'Turtonator', 'Vanilluxe', 'Vikavolt', 'Silvally-Dragon', 'Silvally-Ground', 'Sneasel', 'Damp Rock', 'Grassy Seed',
238
+ 'PU', 'Arctovish', 'Aurorus', 'Basculin', 'Centiskorch', 'Drampa', 'Exeggutor-Alola', 'Gallade', 'Haunter', 'Magmortar', 'Magneton', 'Malamar',
239
+ 'Omastar', 'Rotom-Frost', 'Turtonator', 'Vanilluxe', 'Vikavolt', 'Silvally-Dragon', 'Silvally-Ground', 'Sneasel', 'Damp Rock', 'Grassy Seed',
240
240
  ],
241
241
  },
242
242
  {
@@ -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',
256
256
  // LC UUBL
257
257
  'Archen', 'Farfetch\u2019d-Galar', 'Scorbunny', 'Shellder', 'Wingull',
258
258
  ],
@@ -404,10 +404,10 @@ export const Formats: FormatList = [
404
404
  'Standard Doubles', 'Accuracy Moves Clause', 'Dynamax Clause', 'Sleep Clause Mod',
405
405
  ],
406
406
  banlist: [
407
- 'Calyrex-Ice', 'Calyrex-Shadow', 'Dialga', 'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Jirachi', 'Kyogre', 'Kyurem-White',
408
- 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Rayquaza', 'Reshiram',
409
- 'Solgaleo', 'Tornadus-Base', 'Urshifu-Base', 'Urshifu-Rapid-Strike', 'Whimsicott', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta',
410
- 'Zamazenta-Crowned', 'Zekrom', 'Moody', 'Power Construct', 'Focus Sash', 'Ally Switch', 'Final Gambit', 'Perish Song', 'Swagger',
407
+ 'Calyrex-Ice', 'Calyrex-Shadow', 'Cottonee', 'Dialga', 'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Jirachi', 'Kyogre',
408
+ 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Rayquaza',
409
+ 'Reshiram', 'Solgaleo', 'Tornadus-Base', 'Urshifu-Base', 'Urshifu-Rapid-Strike', 'Whimsicott', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned',
410
+ 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Moody', 'Power Construct', 'Focus Sash', 'Ally Switch', 'Final Gambit', 'Perish Song', 'Swagger',
411
411
  ],
412
412
  },
413
413
  {
@@ -452,6 +452,18 @@ export const Formats: FormatList = [
452
452
  }
453
453
  },
454
454
  },
455
+ {
456
+ name: "[Gen 8] Jump! Magikarp!",
457
+ desc: `Every team must contain Magikarp and bring it to the game.`,
458
+ threads: [
459
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3704588/">Jump! Magikarp!</a>`,
460
+ ],
461
+
462
+ mod: 'gen8',
463
+ gameType: 'doubles',
464
+ ruleset: ['Flat Rules', '!! Picked Team Size = 2', '!! Adjust Level = 50', 'Min Source Gen = 8', 'Force Select = Magikarp'],
465
+ banlist: ['Sub-Legendary'],
466
+ },
455
467
  {
456
468
  name: "[Gen 8] Doubles Custom Game",
457
469
 
@@ -616,38 +628,262 @@ export const Formats: FormatList = [
616
628
  column: 2,
617
629
  },
618
630
  {
619
- name: "[Gen 8] Tier Shift",
620
- desc: `Pok&eacute;mon get a +10 boost to each stat, barring HP, per tier below OU they are in.`,
631
+ name: "[Gen 8] Broken Record",
632
+ desc: `Pok&eacute;mon can hold a TR to use that move in battle.`,
621
633
  threads: [
622
- `&bullet; <a href="https://www.smogon.com/forums/threads/3662165/">Tier Shift</a>`,
634
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3701270/">Broken Record</a>`,
623
635
  ],
624
636
 
625
637
  mod: 'gen8',
626
- ruleset: ['Standard', 'Tier Shift Mod', 'Dynamax Clause'],
638
+ ruleset: ['Standard', '!Sleep Clause Mod', 'Sleep Moves Clause', 'Dynamax Clause'],
627
639
  banlist: [
628
- 'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Eternatus', 'Genesect', 'Giratina', 'Giratina-Origin',
629
- 'Groudon', 'Ho-Oh', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Mewtwo',
630
- 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Reshiram', 'Solgaleo', 'Spectrier', 'Urshifu-Base',
631
- 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Base', 'Zekrom', 'Zygarde-Base', 'Arena Trap', 'Moody', 'Power Construct', 'Sand Veil',
632
- 'Shadow Tag', 'Snow Cloak', 'Bright Powder', 'Damp Rock', 'Eviolite', 'Heat Rock', 'King\'s Rock', 'Lax Incense', 'Baton Pass',
640
+ 'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Dragapult', 'Eternatus', 'Genesect', 'Giratina',
641
+ 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala',
642
+ 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza',
643
+ 'Regieleki', 'Reshiram', 'Rillaboom', 'Solgaleo', 'Spectrier', 'Urshifu-Base', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta',
644
+ 'Zamazenta-Crowned', 'Zekrom', 'Zygarde-Base', 'Arena Trap', 'Magnet Pull', 'Moody', 'Power Construct', 'Shadow Tag', 'TR29 (Baton Pass)',
645
+ 'TR82 (Stored Power)', 'Baton Pass',
633
646
  ],
647
+ onValidateSet(set) {
648
+ if (!set.item) return;
649
+ const item = this.dex.items.get(set.item);
650
+ if (!/^tr\d\d/i.test(item.name)) return;
651
+ const moveName = item.desc.split('move ')[1].split('.')[0];
652
+ if (set.moves.map(this.toID).includes(this.toID(moveName))) {
653
+ return [
654
+ `${set.species} can't run ${item.name} (${moveName}) as its item because it already has that move in its moveset.`,
655
+ ];
656
+ }
657
+ },
658
+ onValidateTeam(team) {
659
+ const trs = new Set<string>();
660
+ for (const set of team) {
661
+ if (!set.item) continue;
662
+ const item = this.dex.items.get(set.item).name;
663
+ if (!/^tr\d\d/i.test(item)) continue;
664
+ if (trs.has(item)) {
665
+ return [`Your team already has a Pok\u00e9mon with ${item}.`];
666
+ }
667
+ trs.add(item);
668
+ }
669
+ },
670
+ onTakeItem(item) {
671
+ return !/^tr\d\d/i.test(item.name);
672
+ },
673
+ onModifyMove(move) {
674
+ if (move.id === 'knockoff') {
675
+ move.onBasePower = function (basePower, source, target, m) {
676
+ const item = target.getItem();
677
+ if (!this.singleEvent('TakeItem', item, target.itemState, target, target, m, item)) return;
678
+ // Very hardcode but I'd prefer to not make a mod for one damage calculation change
679
+ if (item.id && !/^tr\d\d/i.test(item.id)) {
680
+ return this.chainModify(1.5);
681
+ }
682
+ };
683
+ }
684
+ },
685
+ onBegin() {
686
+ for (const pokemon of this.getAllPokemon()) {
687
+ const item = pokemon.getItem();
688
+ if (/^tr\d\d/i.test(item.name)) {
689
+ const move = this.dex.moves.get(item.desc.split('move ')[1].split('.')[0]);
690
+ pokemon.moveSlots = (pokemon as any).baseMoveSlots = [
691
+ ...pokemon.baseMoveSlots, {
692
+ id: move.id,
693
+ move: move.name,
694
+ pp: move.pp * 8 / 5,
695
+ maxpp: move.pp * 8 / 5,
696
+ target: move.target,
697
+ disabled: false,
698
+ disabledSource: '',
699
+ used: false,
700
+ },
701
+ ];
702
+ }
703
+ }
704
+ },
634
705
  },
635
706
  {
636
- name: "[Gen 8] Inverse",
637
- desc: `Weaknesses become resistances, while resistances and immunities become weaknesses.`,
707
+ name: "[Gen 8] Inheritance",
708
+ desc: `Pok&eacute;mon may use the ability and moves of another, as long as they forfeit their own learnset.`,
638
709
  threads: [
639
- `&bullet; <a href="https://www.smogon.com/forums/threads/3666858/">Inverse</a>`,
710
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3656811/">Inheritance</a>`,
640
711
  ],
641
712
 
642
713
  mod: 'gen8',
643
- ruleset: ['Standard', 'Inverse Mod', 'Dynamax Clause'],
714
+ // searchShow: false,
715
+ ruleset: ['Standard', '!Sleep Clause Mod', 'Sleep Moves Clause', '2 Ability Clause', 'Dynamax Clause'],
644
716
  banlist: [
645
- 'Cinderace', 'Calyrex-Ice', 'Calyrex-Shadow', 'Darmanitan-Galar', 'Dialga', 'Diggersby', 'Dracovish', 'Dracozolt', 'Eternatus', 'Genesect', 'Giratina',
646
- 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala', 'Marshadow',
647
- 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Porygon-Z', 'Rayquaza', 'Regidrago', 'Regieleki', 'Reshiram',
648
- 'Reuniclus', 'Rillaboom', 'Solgaleo', 'Spectrier', 'Urshifu-Base', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Base', 'Zekrom', 'Arena Trap',
649
- 'Moody', 'Power Construct', 'Shadow Tag', 'King\'s Rock', 'Baton Pass',
717
+ 'Blacephalon', 'Blaziken', 'Butterfree', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chansey', 'Combusken', 'Cresselia', 'Darmanitan-Galar', 'Dialga', 'Dracovish',
718
+ 'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala',
719
+ 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Natu', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Regieleki',
720
+ 'Regigigas', 'Reshiram', 'Sableye', 'Shedinja', 'Solgaleo', 'Spectrier', 'Tapu Koko', 'Toxtricity', 'Torkoal', 'Urshifu-Base', 'Xatu', 'Xerneas', 'Yveltal',
721
+ 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zeraora', 'Zekrom', 'Arena Trap', 'Contrary', 'Drizzle', 'Huge Power', 'Imposter', 'Innards Out',
722
+ 'Libero', 'Moody', 'Power Construct', 'Pure Power', 'Quick Draw', 'Shadow Tag', 'Sheer Force', 'Simple', 'Unaware', 'Unburden', 'Water Bubble', 'King\'s Rock',
723
+ 'Quick Claw', 'Baton Pass', 'Bolt Beak', 'Fishious Rend', 'Shell Smash', 'Thousand Arrows',
650
724
  ],
725
+ getEvoFamily(speciesid) {
726
+ let species = Dex.species.get(speciesid);
727
+ while (species.prevo) {
728
+ species = Dex.species.get(species.prevo);
729
+ }
730
+ return species.id;
731
+ },
732
+ validateSet(set, teamHas) {
733
+ const unreleased = (pokemon: Species) => pokemon.tier === "Unreleased" && pokemon.isNonstandard === "Unobtainable";
734
+ if (!teamHas.abilityMap) {
735
+ teamHas.abilityMap = Object.create(null);
736
+ for (const pokemon of Dex.species.all()) {
737
+ if (pokemon.isNonstandard || unreleased(pokemon)) continue;
738
+ if (pokemon.requiredAbility || pokemon.requiredItem || pokemon.requiredMove) continue;
739
+ if (this.ruleTable.isBannedSpecies(pokemon)) continue;
740
+
741
+ for (const key of Object.values(pokemon.abilities)) {
742
+ const abilityId = this.dex.toID(key);
743
+ if (abilityId in teamHas.abilityMap) {
744
+ teamHas.abilityMap[abilityId][pokemon.evos ? 'push' : 'unshift'](pokemon.id);
745
+ } else {
746
+ teamHas.abilityMap[abilityId] = [pokemon.id];
747
+ }
748
+ }
749
+ }
750
+ }
751
+
752
+ const problem = this.validateForme(set);
753
+ if (problem.length) return problem;
754
+
755
+ const species = this.dex.species.get(set.species);
756
+ if (!species.exists || species.num < 1) return [`The Pok\u00e9mon "${set.species}" does not exist.`];
757
+ if (species.isNonstandard || unreleased(species)) {
758
+ return [`${species.name} is not obtainable in Generation ${this.dex.gen}.`];
759
+ }
760
+
761
+ const name = set.name;
762
+ if (this.ruleTable.isBannedSpecies(species)) {
763
+ return this.validateSet(set, teamHas);
764
+ }
765
+
766
+ const ability = this.dex.abilities.get(set.ability);
767
+ if (!ability.exists || ability.isNonstandard) return [`${name} needs to have a valid ability.`];
768
+ const pokemonWithAbility = teamHas.abilityMap[ability.id];
769
+ if (!pokemonWithAbility) return [`${ability.name} is not available on a legal Pok\u00e9mon.`];
770
+
771
+ (this.format as any).debug = true;
772
+
773
+ if (!teamHas.abilitySources) teamHas.abilitySources = Object.create(null);
774
+ const validSources: string[] = teamHas.abilitySources[this.dex.toID(set.species)] = []; // Evolution families
775
+
776
+ let canonicalSource = ''; // Specific for the basic implementation of Donor Clause (see onValidateTeam).
777
+
778
+ for (const donor of pokemonWithAbility) {
779
+ const donorSpecies = this.dex.species.get(donor);
780
+ let format = this.format;
781
+ if (!format.getEvoFamily) format = this.dex.formats.get('gen8inheritance');
782
+ const evoFamily = format.getEvoFamily!(donorSpecies.id);
783
+ if (validSources.includes(evoFamily)) continue;
784
+
785
+ set.species = donorSpecies.name;
786
+ set.name = donorSpecies.baseSpecies;
787
+ const problems = this.validateSet(set, teamHas) || [];
788
+ if (!problems.length) {
789
+ validSources.push(evoFamily);
790
+ canonicalSource = donorSpecies.name;
791
+ }
792
+ // Specific for the basic implementation of Donor Clause (see onValidateTeam).
793
+ if (validSources.length > 1) break;
794
+ }
795
+ (this.format as any).debug = false;
796
+
797
+ set.name = name;
798
+ set.species = species.name;
799
+ if (!validSources.length) {
800
+ if (pokemonWithAbility.length > 1) return [`${name}'s set is illegal.`];
801
+ return [`${name} has an illegal set with an ability from ${this.dex.species.get(pokemonWithAbility[0]).name}.`];
802
+ }
803
+
804
+ // Protocol: Include the data of the donor species in the `ability` data slot.
805
+ // Afterwards, we are going to reset the name to what the user intended.
806
+ set.ability = `${set.ability}0${canonicalSource}`;
807
+ return null;
808
+ },
809
+ onValidateTeam(team, f, teamHas) {
810
+ if (this.ruleTable.has('2abilityclause')) {
811
+ const abilityTable = new Map<string, number>();
812
+ const base: {[k: string]: string} = {
813
+ airlock: 'cloudnine',
814
+ battlearmor: 'shellarmor',
815
+ clearbody: 'whitesmoke',
816
+ dazzling: 'queenlymajesty',
817
+ emergencyexit: 'wimpout',
818
+ filter: 'solidrock',
819
+ gooey: 'tanglinghair',
820
+ insomnia: 'vitalspirit',
821
+ ironbarbs: 'roughskin',
822
+ libero: 'protean',
823
+ minus: 'plus',
824
+ moxie: 'chillingneigh',
825
+ powerofalchemy: 'receiver',
826
+ propellertail: 'stalwart',
827
+ teravolt: 'moldbreaker',
828
+ turboblaze: 'moldbreaker',
829
+ };
830
+ for (const set of team) {
831
+ let ability = this.toID(set.ability.split('0')[0]);
832
+ if (!ability) continue;
833
+ if (ability in base) ability = base[ability] as ID;
834
+ if ((abilityTable.get(ability) || 0) >= 2) {
835
+ return [
836
+ `You are limited to two of each ability by 2 Ability Clause.`,
837
+ `(You have more than two ${this.dex.abilities.get(ability).name} variants)`,
838
+ ];
839
+ }
840
+ abilityTable.set(ability, (abilityTable.get(ability) || 0) + 1);
841
+ }
842
+ }
843
+
844
+ // Donor Clause
845
+ const evoFamilyLists = [];
846
+ for (const set of team) {
847
+ const abilitySources = teamHas.abilitySources?.[this.dex.toID(set.species)];
848
+ if (!abilitySources) continue;
849
+ let format = this.format;
850
+ if (!format.getEvoFamily) format = this.dex.formats.get('gen8inheritance');
851
+ evoFamilyLists.push(abilitySources.map(format.getEvoFamily!));
852
+ }
853
+
854
+ // Checking actual full incompatibility would require expensive algebra.
855
+ // Instead, we only check the trivial case of multiple Pokémon only legal for exactly one family. FIXME?
856
+ const requiredFamilies = Object.create(null);
857
+ for (const evoFamilies of evoFamilyLists) {
858
+ if (evoFamilies.length !== 1) continue;
859
+ const [familyId] = evoFamilies;
860
+ if (!(familyId in requiredFamilies)) requiredFamilies[familyId] = 1;
861
+ requiredFamilies[familyId]++;
862
+ if (requiredFamilies[familyId] > 2) {
863
+ return [
864
+ `You are limited to up to two inheritances from each evolution family by the Donor Clause.`,
865
+ `(You inherit more than twice from ${this.dex.species.get(familyId).name}).`,
866
+ ];
867
+ }
868
+ }
869
+ },
870
+ onBegin() {
871
+ for (const pokemon of this.getAllPokemon()) {
872
+ if (pokemon.baseAbility.includes('0')) {
873
+ const donor = pokemon.baseAbility.split('0')[1];
874
+ pokemon.m.donor = this.toID(donor);
875
+ pokemon.baseAbility = this.toID(pokemon.baseAbility.split('0')[0]);
876
+ pokemon.ability = pokemon.baseAbility;
877
+ }
878
+ }
879
+ },
880
+ onSwitchIn(pokemon) {
881
+ if (!pokemon.m.donor) return;
882
+ const donorTemplate = this.dex.species.get(pokemon.m.donor);
883
+ if (!donorTemplate.exists) return;
884
+ // Place volatiles on the Pokémon to show the donor details.
885
+ this.add('-start', pokemon, donorTemplate.name, '[silent]');
886
+ },
651
887
  },
652
888
 
653
889
  // Other Metagames
@@ -671,8 +907,8 @@ export const Formats: FormatList = [
671
907
  'Calyrex-Shadow', 'Cramorant-Gorging', 'Darmanitan-Galar-Zen', 'Eternatus-Eternamax', 'Shedinja', 'Zacian-Crowned',
672
908
  'Arena Trap', 'Contrary', 'Gorilla Tactics', 'Huge Power', 'Illusion', 'Innards Out', 'Intrepid Sword', 'Libero',
673
909
  'Magnet Pull', 'Moody', 'Neutralizing Gas', 'Parental Bond', 'Protean', 'Pure Power', 'Shadow Tag', 'Stakeout',
674
- 'Water Bubble', 'Wonder Guard', 'Comatose + Sleep Talk', 'Rusted Sword', 'Court Change', 'Bolt Beak', 'Double Iron Bash',
675
- 'Octolock', 'Shell Smash',
910
+ 'Water Bubble', 'Wonder Guard', 'Comatose + Sleep Talk', 'Rusted Sword', 'Belly Drum', 'Bolt Beak', 'Court Change',
911
+ 'Double Iron Bash', 'Octolock', 'Shell Smash',
676
912
  ],
677
913
  },
678
914
  {
@@ -686,8 +922,8 @@ export const Formats: FormatList = [
686
922
  mod: 'gen8',
687
923
  ruleset: ['Standard', '!Obtainable Abilities', '2 Ability Clause', 'Dynamax Clause', 'Sleep Moves Clause', '!Sleep Clause Mod'],
688
924
  banlist: [
689
- 'Archeops', 'Blacephalon', 'Buzzwole', 'Calyrex-Ice', 'Calyrex-Shadow', 'Dialga', 'Dracovish', 'Dragapult', 'Dragonite', 'Eternatus',
690
- 'Gengar', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Keldeo', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White',
925
+ 'Archeops', 'Blacephalon', 'Buzzwole', 'Calyrex-Ice', 'Calyrex-Shadow', 'Dialga', 'Dracovish', 'Dragapult', 'Dragonite', 'Eternatus', 'Gengar',
926
+ 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Keldeo', 'Kommo-o', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White',
691
927
  'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Noivern',
692
928
  'Palkia', 'Pheromosa', 'Rayquaza', 'Regigigas', 'Reshiram', 'Shedinja', 'Solgaleo', 'Spectrier', 'Urshifu', 'Urshifu-Rapid-Strike',
693
929
  'Victini', 'Weavile', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Base', 'Zekrom', 'Zeraora', 'Zygarde-Base',
@@ -784,9 +1020,9 @@ export const Formats: FormatList = [
784
1020
  'Arena Trap', 'Magnet Pull', 'Moody', 'Power Construct', 'Shadow Tag', 'King\'s Rock', 'Baton Pass',
785
1021
  ],
786
1022
  restricted: [
787
- 'Acupressure', 'Astral Barrage', 'Belly Drum', 'Bolt Beak', 'Clangorous Soul', 'Double Iron Bash', 'Electrify', 'Extreme Speed', 'Fishious Rend',
788
- 'Geomancy', 'Glacial Lance', 'Oblivion Wing', 'Precipice Blades', 'Shell Smash', 'Shift Gear', 'Thousand Arrows', 'Thunderous Kick', 'V-create',
789
- 'Wicked Blow',
1023
+ 'Acupressure', 'Astral Barrage', 'Belly Drum', 'Bolt Beak', 'Clangorous Soul', 'Double Iron Bash', 'Electrify', 'Extreme Speed', 'Final Gambit',
1024
+ 'Fishious Rend', 'Geomancy', 'Glacial Lance', 'Oblivion Wing', 'Precipice Blades', 'Shell Smash', 'Shift Gear', 'Thousand Arrows', 'Thunderous Kick',
1025
+ 'V-create', 'Wicked Blow',
790
1026
  ],
791
1027
  },
792
1028
  {
@@ -981,7 +1217,7 @@ export const Formats: FormatList = [
981
1217
 
982
1218
  mod: 'gen8bdsp',
983
1219
  ruleset: ['Little Cup', 'Standard'],
984
- banlist: ['Gligar', 'Meditite', 'Misdreavus', 'Murkrow', 'Scyther', 'Sneasel', 'Tangela', 'Vulpix', 'Yanma', 'Moody', 'Baton Pass', 'Sticky Web'],
1220
+ banlist: ['Gligar', 'Meditite', 'Misdreavus', 'Munchlax', 'Murkrow', 'Scyther', 'Sneasel', 'Tangela', 'Vulpix', 'Yanma', 'Moody', 'Baton Pass', 'Sticky Web'],
985
1221
  },
986
1222
  {
987
1223
  name: "[Gen 8 BDSP] Monotype",
@@ -1203,188 +1439,6 @@ export const Formats: FormatList = [
1203
1439
  }
1204
1440
  },
1205
1441
  },
1206
- {
1207
- name: "[Gen 8] Inheritance",
1208
- desc: `Pok&eacute;mon may use the ability and moves of another, as long as they forfeit their own learnset.`,
1209
- threads: [
1210
- `&bullet; <a href="https://www.smogon.com/forums/threads/3656811/">Inheritance</a>`,
1211
- ],
1212
-
1213
- mod: 'gen8',
1214
- searchShow: false,
1215
- ruleset: ['Standard', '2 Ability Clause', 'Dynamax Clause'],
1216
- banlist: [
1217
- 'Blacephalon', 'Blaziken', 'Butterfree', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chansey', 'Combusken', 'Cresselia', 'Darmanitan-Galar', 'Dialga', 'Dracovish',
1218
- 'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala',
1219
- 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Natu', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Regieleki',
1220
- 'Regigigas', 'Reshiram', 'Sableye', 'Shedinja', 'Solgaleo', 'Spectrier', 'Tapu Koko', 'Toxtricity', 'Torkoal', 'Urshifu-Base', 'Xatu', 'Xerneas', 'Yveltal',
1221
- 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zeraora', 'Zekrom', 'Arena Trap', 'Contrary', 'Drizzle', 'Huge Power', 'Imposter', 'Innards Out',
1222
- 'Libero', 'Moody', 'Power Construct', 'Pure Power', 'Quick Draw', 'Shadow Tag', 'Sheer Force', 'Simple', 'Unaware', 'Unburden', 'Water Bubble', 'King\'s Rock',
1223
- 'Quick Claw', 'Baton Pass', 'Bolt Beak', 'Fishious Rend', 'Shell Smash', 'Thousand Arrows',
1224
- ],
1225
- getEvoFamily(speciesid) {
1226
- let species = Dex.species.get(speciesid);
1227
- while (species.prevo) {
1228
- species = Dex.species.get(species.prevo);
1229
- }
1230
- return species.id;
1231
- },
1232
- validateSet(set, teamHas) {
1233
- const unreleased = (pokemon: Species) => pokemon.tier === "Unreleased" && pokemon.isNonstandard === "Unobtainable";
1234
- if (!teamHas.abilityMap) {
1235
- teamHas.abilityMap = Object.create(null);
1236
- for (const pokemon of Dex.species.all()) {
1237
- if (pokemon.isNonstandard || unreleased(pokemon)) continue;
1238
- if (pokemon.requiredAbility || pokemon.requiredItem || pokemon.requiredMove) continue;
1239
- if (this.ruleTable.isBannedSpecies(pokemon)) continue;
1240
-
1241
- for (const key of Object.values(pokemon.abilities)) {
1242
- const abilityId = this.dex.toID(key);
1243
- if (abilityId in teamHas.abilityMap) {
1244
- teamHas.abilityMap[abilityId][pokemon.evos ? 'push' : 'unshift'](pokemon.id);
1245
- } else {
1246
- teamHas.abilityMap[abilityId] = [pokemon.id];
1247
- }
1248
- }
1249
- }
1250
- }
1251
-
1252
- const problem = this.validateForme(set);
1253
- if (problem.length) return problem;
1254
-
1255
- const species = this.dex.species.get(set.species);
1256
- if (!species.exists || species.num < 1) return [`The Pok\u00e9mon "${set.species}" does not exist.`];
1257
- if (species.isNonstandard || unreleased(species)) {
1258
- return [`${species.name} is not obtainable in Generation ${this.dex.gen}.`];
1259
- }
1260
-
1261
- const name = set.name;
1262
- if (this.ruleTable.isBannedSpecies(species)) {
1263
- return this.validateSet(set, teamHas);
1264
- }
1265
-
1266
- const ability = this.dex.abilities.get(set.ability);
1267
- if (!ability.exists || ability.isNonstandard) return [`${name} needs to have a valid ability.`];
1268
- const pokemonWithAbility = teamHas.abilityMap[ability.id];
1269
- if (!pokemonWithAbility) return [`${ability.name} is not available on a legal Pok\u00e9mon.`];
1270
-
1271
- (this.format as any).debug = true;
1272
-
1273
- if (!teamHas.abilitySources) teamHas.abilitySources = Object.create(null);
1274
- const validSources: string[] = teamHas.abilitySources[this.dex.toID(set.species)] = []; // Evolution families
1275
-
1276
- let canonicalSource = ''; // Specific for the basic implementation of Donor Clause (see onValidateTeam).
1277
-
1278
- for (const donor of pokemonWithAbility) {
1279
- const donorSpecies = this.dex.species.get(donor);
1280
- let format = this.format;
1281
- if (!format.getEvoFamily) format = this.dex.formats.get('gen8inheritance');
1282
- const evoFamily = format.getEvoFamily!(donorSpecies.id);
1283
- if (validSources.includes(evoFamily)) continue;
1284
-
1285
- set.species = donorSpecies.name;
1286
- set.name = donorSpecies.baseSpecies;
1287
- const problems = this.validateSet(set, teamHas) || [];
1288
- if (!problems.length) {
1289
- validSources.push(evoFamily);
1290
- canonicalSource = donorSpecies.name;
1291
- }
1292
- // Specific for the basic implementation of Donor Clause (see onValidateTeam).
1293
- if (validSources.length > 1) break;
1294
- }
1295
- (this.format as any).debug = false;
1296
-
1297
- set.name = name;
1298
- set.species = species.name;
1299
- if (!validSources.length) {
1300
- if (pokemonWithAbility.length > 1) return [`${name}'s set is illegal.`];
1301
- return [`${name} has an illegal set with an ability from ${this.dex.species.get(pokemonWithAbility[0]).name}.`];
1302
- }
1303
-
1304
- // Protocol: Include the data of the donor species in the `ability` data slot.
1305
- // Afterwards, we are going to reset the name to what the user intended.
1306
- set.ability = `${set.ability}0${canonicalSource}`;
1307
- return null;
1308
- },
1309
- onValidateTeam(team, f, teamHas) {
1310
- if (this.ruleTable.has('2abilityclause')) {
1311
- const abilityTable = new Map<string, number>();
1312
- const base: {[k: string]: string} = {
1313
- airlock: 'cloudnine',
1314
- battlearmor: 'shellarmor',
1315
- clearbody: 'whitesmoke',
1316
- dazzling: 'queenlymajesty',
1317
- emergencyexit: 'wimpout',
1318
- filter: 'solidrock',
1319
- gooey: 'tanglinghair',
1320
- insomnia: 'vitalspirit',
1321
- ironbarbs: 'roughskin',
1322
- libero: 'protean',
1323
- minus: 'plus',
1324
- moxie: 'chillingneigh',
1325
- powerofalchemy: 'receiver',
1326
- propellertail: 'stalwart',
1327
- teravolt: 'moldbreaker',
1328
- turboblaze: 'moldbreaker',
1329
- };
1330
- for (const set of team) {
1331
- let ability = this.toID(set.ability.split('0')[0]);
1332
- if (!ability) continue;
1333
- if (ability in base) ability = base[ability] as ID;
1334
- if ((abilityTable.get(ability) || 0) >= 2) {
1335
- return [
1336
- `You are limited to two of each ability by 2 Ability Clause.`,
1337
- `(You have more than two ${this.dex.abilities.get(ability).name} variants)`,
1338
- ];
1339
- }
1340
- abilityTable.set(ability, (abilityTable.get(ability) || 0) + 1);
1341
- }
1342
- }
1343
-
1344
- // Donor Clause
1345
- const evoFamilyLists = [];
1346
- for (const set of team) {
1347
- const abilitySources = teamHas.abilitySources?.[this.dex.toID(set.species)];
1348
- if (!abilitySources) continue;
1349
- let format = this.format;
1350
- if (!format.getEvoFamily) format = this.dex.formats.get('gen8inheritance');
1351
- evoFamilyLists.push(abilitySources.map(format.getEvoFamily!));
1352
- }
1353
-
1354
- // Checking actual full incompatibility would require expensive algebra.
1355
- // Instead, we only check the trivial case of multiple Pokémon only legal for exactly one family. FIXME?
1356
- const requiredFamilies = Object.create(null);
1357
- for (const evoFamilies of evoFamilyLists) {
1358
- if (evoFamilies.length !== 1) continue;
1359
- const [familyId] = evoFamilies;
1360
- if (!(familyId in requiredFamilies)) requiredFamilies[familyId] = 1;
1361
- requiredFamilies[familyId]++;
1362
- if (requiredFamilies[familyId] > 2) {
1363
- return [
1364
- `You are limited to up to two inheritances from each evolution family by the Donor Clause.`,
1365
- `(You inherit more than twice from ${this.dex.species.get(familyId).name}).`,
1366
- ];
1367
- }
1368
- }
1369
- },
1370
- onBegin() {
1371
- for (const pokemon of this.getAllPokemon()) {
1372
- if (pokemon.baseAbility.includes('0')) {
1373
- const donor = pokemon.baseAbility.split('0')[1];
1374
- pokemon.m.donor = this.toID(donor);
1375
- pokemon.baseAbility = this.toID(pokemon.baseAbility.split('0')[0]);
1376
- pokemon.ability = pokemon.baseAbility;
1377
- }
1378
- }
1379
- },
1380
- onSwitchIn(pokemon) {
1381
- if (!pokemon.m.donor) return;
1382
- const donorTemplate = this.dex.species.get(pokemon.m.donor);
1383
- if (!donorTemplate.exists) return;
1384
- // Place volatiles on the Pokémon to show the donor details.
1385
- this.add('-start', pokemon, donorTemplate.name, '[silent]');
1386
- },
1387
- },
1388
1442
  {
1389
1443
  name: "[Gen 8] Linked",
1390
1444
  desc: `The first two moves in a Pok&eacute;mon's moveset are used simultaneously.`,
@@ -2384,38 +2438,47 @@ export const Formats: FormatList = [
2384
2438
  column: 3,
2385
2439
  },
2386
2440
  {
2387
- name: "[Gen 7] UU",
2441
+ name: "[Gen 2] Ubers",
2388
2442
  threads: [
2389
- `&bullet; <a href="https://www.smogon.com/forums/threads/3621217/">USM UU Sample Teams</a>`,
2390
- `&bullet; <a href="https://www.smogon.com/forums/threads/3641346/">USM UU Viability Rankings</a>`,
2443
+ `&bullet; <a href="https://www.smogon.com/forums/posts/8286282/">GSC Ubers</a>`,
2391
2444
  ],
2392
2445
 
2393
- mod: 'gen7',
2446
+ mod: 'gen2',
2394
2447
  // searchShow: false,
2395
- ruleset: ['[Gen 7] OU'],
2396
- banlist: ['OU', 'UUBL', 'Drizzle', 'Drought', 'Kommonium Z', 'Mewnium Z'],
2448
+ ruleset: ['Standard'],
2397
2449
  },
2398
2450
  {
2399
- name: "[Gen 6] ZU",
2451
+ name: "[Gen 3] 1v1",
2452
+ desc: `Bring three Pok&eacute;mon to Team Preview and choose one to battle.`,
2400
2453
  threads: [
2401
- `&bullet; <a href="https://www.smogon.com/dex/xy/formats/zu/">ORAS ZU Banlist</a>`,
2402
- `&bullet; <a href="https://www.smogon.com/forums/posts/8034679/">ORAS ZU Viability Rankings</a>`,
2454
+ `&bullet; <a href="https://www.smogon.com/forums/posts/8031456/">ADV 1v1</a>`,
2403
2455
  ],
2404
2456
 
2405
- mod: 'gen6',
2457
+ mod: 'gen3',
2406
2458
  // searchShow: false,
2407
- ruleset: ['[Gen 6] PU'],
2408
- banlist: ['PU', 'Fraxure', 'Regigigas', 'Simisear'],
2459
+ ruleset: [
2460
+ 'Picked Team Size = 1', 'Max Team Size = 3',
2461
+ '[Gen 3] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview', '!Freeze Clause Mod',
2462
+ ],
2463
+ banlist: [
2464
+ 'Clefable', 'Slaking', 'Snorlax', 'Suicune', 'Zapdos', 'Destiny Bond', 'Explosion', 'Ingrain', 'Perish Song',
2465
+ 'Self-Destruct', 'Bright Powder', 'Focus Band', 'King\'s Rock', 'Lax Incense', 'Quick Claw',
2466
+ ],
2467
+ unbanlist: ['Mr. Mime', 'Wobbuffet', 'Wynaut', 'Sand Veil'],
2409
2468
  },
2410
2469
  {
2411
- name: "[Gen 1] Ubers",
2470
+ name: "[Gen 1] Stadium OU",
2412
2471
  threads: [
2413
- `&bullet; <a href="https://www.smogon.com/forums/posts/8286283/">RBY Ubers</a>`,
2472
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3685877/">Stadium OU Viability Rankings</a>`,
2414
2473
  ],
2415
2474
 
2416
- mod: 'gen1',
2475
+ mod: 'gen1stadium',
2417
2476
  // searchShow: false,
2418
- ruleset: ['Standard'],
2477
+ ruleset: ['Standard', 'Team Preview'],
2478
+ banlist: ['Uber',
2479
+ 'Nidoking + Fury Attack + Thrash', 'Exeggutor + Poison Powder + Stomp', 'Exeggutor + Sleep Powder + Stomp',
2480
+ 'Exeggutor + Stun Spore + Stomp', 'Jolteon + Focus Energy + Thunder Shock', 'Flareon + Focus Energy + Ember',
2481
+ ],
2419
2482
  },
2420
2483
 
2421
2484
  // Past Gens OU
@@ -2457,7 +2520,7 @@ export const Formats: FormatList = [
2457
2520
  ],
2458
2521
 
2459
2522
  mod: 'gen5',
2460
- ruleset: ['Standard', 'Evasion Abilities Clause', 'Sleep Moves Clause', 'Swagger Clause'],
2523
+ ruleset: ['Standard', 'Evasion Abilities Clause', 'Sleep Moves Clause', 'Swagger Clause', 'Gems Clause'],
2461
2524
  banlist: ['Uber', 'Arena Trap', 'Drizzle ++ Swift Swim', 'Drought ++ Chlorophyll', 'Sand Rush', 'Shadow Tag', 'King\'s Rock', 'Razor Fang', 'Soul Dew', 'Assist', 'Baton Pass'],
2462
2525
  },
2463
2526
  {
@@ -2469,7 +2532,7 @@ export const Formats: FormatList = [
2469
2532
  ],
2470
2533
 
2471
2534
  mod: 'gen4',
2472
- ruleset: ['Standard'],
2535
+ ruleset: ['Standard', 'Freeze Clause Mod'],
2473
2536
  banlist: ['AG', 'Uber', 'Arena Trap', 'Sand Veil', 'Swinub + Snow Cloak', 'Piloswine + Snow Cloak', 'Mamoswine + Snow Cloak', 'Soul Dew', 'Baton Pass', 'Swagger'],
2474
2537
  },
2475
2538
  {
@@ -2480,7 +2543,7 @@ export const Formats: FormatList = [
2480
2543
  ],
2481
2544
 
2482
2545
  mod: 'gen3',
2483
- ruleset: ['Standard', 'One Boost Passer Clause'],
2546
+ ruleset: ['Standard', 'One Boost Passer Clause', 'Freeze Clause Mod'],
2484
2547
  banlist: ['Uber', 'Sand Veil', 'Soundproof', 'Assist', 'Baton Pass + Block', 'Baton Pass + Mean Look', 'Baton Pass + Spider Web', 'Smeargle + Ingrain'],
2485
2548
  },
2486
2549
  {
@@ -2492,7 +2555,7 @@ export const Formats: FormatList = [
2492
2555
 
2493
2556
  mod: 'gen2',
2494
2557
  ruleset: ['Standard'],
2495
- banlist: ['Uber'],
2558
+ banlist: ['Uber', 'Mean Look + Baton Pass', 'Spider Web + Baton Pass'],
2496
2559
  },
2497
2560
  {
2498
2561
  name: "[Gen 1] OU",
@@ -2649,6 +2712,18 @@ export const Formats: FormatList = [
2649
2712
  ruleset: ['Standard', 'Mega Rayquaza Clause'],
2650
2713
  banlist: ['Baton Pass'],
2651
2714
  },
2715
+ {
2716
+ name: "[Gen 7] UU",
2717
+ threads: [
2718
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3621217/">USM UU Sample Teams</a>`,
2719
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3641346/">USM UU Viability Rankings</a>`,
2720
+ ],
2721
+
2722
+ mod: 'gen7',
2723
+ searchShow: false,
2724
+ ruleset: ['[Gen 7] OU'],
2725
+ banlist: ['OU', 'UUBL', 'Drizzle', 'Drought', 'Kommonium Z', 'Mewnium Z'],
2726
+ },
2652
2727
  {
2653
2728
  name: "[Gen 7] RU",
2654
2729
  threads: [
@@ -2739,7 +2814,7 @@ export const Formats: FormatList = [
2739
2814
  'Arceus', 'Darkrai', 'Deoxys-Base', 'Deoxys-Attack', 'Deoxys-Defense', 'Dialga', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kangaskhan-Mega',
2740
2815
  'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Marshadow', 'Mewtwo', 'Mimikyu', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane',
2741
2816
  'Palkia', 'Rayquaza', 'Reshiram', 'Salamence-Mega', 'Shaymin-Sky', 'Snorlax', 'Solgaleo', 'Tapu Koko', 'Xerneas', 'Yveltal', 'Zekrom',
2742
- 'Moody', 'Focus Sash', 'Perish Song', 'Detect + Fightinium Z',
2817
+ 'Moody', 'Focus Sash', 'Grass Whistle', 'Hypnosis', 'Perish Song', 'Sing', 'Detect + Fightinium Z',
2743
2818
  ],
2744
2819
  },
2745
2820
  {
@@ -3068,6 +3143,18 @@ export const Formats: FormatList = [
3068
3143
  searchShow: false,
3069
3144
  ruleset: ['Obtainable', 'Team Preview', 'Endless Battle Clause', 'HP Percentage Mod', 'Cancel Mod'],
3070
3145
  },
3146
+ {
3147
+ name: "[Gen 6] ZU",
3148
+ threads: [
3149
+ `&bullet; <a href="https://www.smogon.com/dex/xy/formats/zu/">ORAS ZU Banlist</a>`,
3150
+ `&bullet; <a href="https://www.smogon.com/forums/posts/8034679/">ORAS ZU Viability Rankings</a>`,
3151
+ ],
3152
+
3153
+ mod: 'gen6',
3154
+ searchShow: false,
3155
+ ruleset: ['[Gen 6] PU'],
3156
+ banlist: ['PU', 'Fraxure', 'Regigigas', 'Simisear'],
3157
+ },
3071
3158
  {
3072
3159
  name: "[Gen 6] CAP",
3073
3160
  threads: [
@@ -3079,7 +3166,7 @@ export const Formats: FormatList = [
3079
3166
  mod: 'gen6',
3080
3167
  searchShow: false,
3081
3168
  ruleset: ['[Gen 6] OU', '+CAP'],
3082
- banlist: ['Aurumoth', 'Cawmodore', 'Crucibelle-Mega'],
3169
+ banlist: ['Aurumoth', 'Cawmodore'],
3083
3170
  },
3084
3171
  {
3085
3172
  name: "[Gen 6] Battle Spot Singles",
@@ -3276,7 +3363,7 @@ export const Formats: FormatList = [
3276
3363
  mod: 'gen5',
3277
3364
  searchShow: false,
3278
3365
  ruleset: ['[Gen 5] NU', 'Sleep Moves Clause'],
3279
- banlist: ['NU', 'PUBL'],
3366
+ banlist: ['NU', 'PUBL', 'Damp Rock'],
3280
3367
  },
3281
3368
  {
3282
3369
  name: "[Gen 5] LC",
@@ -3302,7 +3389,7 @@ export const Formats: FormatList = [
3302
3389
 
3303
3390
  mod: 'gen5',
3304
3391
  searchShow: false,
3305
- ruleset: ['[Gen 5] OU', 'Same Type Clause'],
3392
+ ruleset: ['[Gen 5] OU', 'Same Type Clause', '!Gems Clause'],
3306
3393
  },
3307
3394
  {
3308
3395
  name: "[Gen 5] 1v1",
@@ -3448,7 +3535,7 @@ export const Formats: FormatList = [
3448
3535
 
3449
3536
  mod: 'gen4',
3450
3537
  searchShow: false,
3451
- ruleset: ['[Gen 4] OU'],
3538
+ ruleset: ['[Gen 4] OU', '!Freeze Clause Mod'],
3452
3539
  banlist: ['OU', 'UUBL'],
3453
3540
  unbanlist: ['Arena Trap', 'Swagger'],
3454
3541
  },
@@ -3515,7 +3602,7 @@ export const Formats: FormatList = [
3515
3602
  searchShow: false,
3516
3603
  ruleset: [
3517
3604
  'Picked Team Size = 1', 'Max Team Size = 3',
3518
- '[Gen 4] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview',
3605
+ '[Gen 4] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview', '!Freeze Clause Mod',
3519
3606
  ],
3520
3607
  banlist: ['Latias', 'Machamp', 'Porygon-Z', 'Shaymin', 'Snorlax', 'Togekiss', 'Focus Sash', 'Destiny Bond', 'Explosion', 'Perish Song', 'Self-Destruct'],
3521
3608
  unbanlist: ['Wobbuffet', 'Wynaut', 'Sand Veil', 'Swagger'],
@@ -3562,7 +3649,7 @@ export const Formats: FormatList = [
3562
3649
  mod: 'gen4',
3563
3650
  gameType: 'doubles',
3564
3651
  searchShow: false,
3565
- ruleset: ['[Gen 4] OU'],
3652
+ ruleset: ['[Gen 4] OU', '!Freeze Clause Mod'],
3566
3653
  banlist: ['Explosion'],
3567
3654
  unbanlist: ['Garchomp', 'Latias', 'Latios', 'Manaphy', 'Mew', 'Salamence', 'Wobbuffet', 'Wynaut', 'Swagger'],
3568
3655
  },
@@ -3624,9 +3711,8 @@ export const Formats: FormatList = [
3624
3711
 
3625
3712
  mod: 'gen3',
3626
3713
  searchShow: false,
3627
- ruleset: ['Standard', 'NFE Clause'],
3628
- banlist: ['Uber', 'OU', 'UUBL', 'Smeargle + Ingrain', 'Baton Pass'],
3629
- unbanlist: ['Scyther'],
3714
+ ruleset: ['Standard'],
3715
+ banlist: ['Uber', 'OU', 'UUBL', 'Smeargle + Ingrain', 'Arena Trap', 'Bright Powder', 'Lax Incense', 'Baton Pass', 'Swagger'],
3630
3716
  },
3631
3717
  {
3632
3718
  name: "[Gen 3] NU",
@@ -3636,9 +3722,8 @@ export const Formats: FormatList = [
3636
3722
 
3637
3723
  mod: 'gen3',
3638
3724
  searchShow: false,
3639
- ruleset: ['[Gen 3] UU', '!NFE Clause'],
3640
- banlist: ['UU'],
3641
- unbanlist: ['Baton Pass'],
3725
+ ruleset: ['Standard'],
3726
+ banlist: ['Uber', 'OU', 'UUBL', 'UU', 'Smeargle + Ingrain'],
3642
3727
  },
3643
3728
  {
3644
3729
  name: "[Gen 3] Doubles OU",
@@ -3653,22 +3738,6 @@ export const Formats: FormatList = [
3653
3738
  banlist: ['Uber'],
3654
3739
  unbanlist: ['Deoxys-Speed', 'Wobbuffet', 'Wynaut'],
3655
3740
  },
3656
- {
3657
- name: "[Gen 3] 1v1",
3658
- desc: `Bring three Pok&eacute;mon to Team Preview and choose one to battle.`,
3659
- threads: [
3660
- `&bullet; <a href="https://www.smogon.com/forums/posts/8031456/">ADV 1v1</a>`,
3661
- ],
3662
-
3663
- mod: 'gen3',
3664
- searchShow: false,
3665
- ruleset: [
3666
- 'Picked Team Size = 1', 'Max Team Size = 3',
3667
- '[Gen 3] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview',
3668
- ],
3669
- banlist: ['Clefable', 'Slaking', 'Snorlax', 'Suicune', 'Destiny Bond', 'Explosion', 'Ingrain', 'Perish Song', 'Self-Destruct', 'Bright Powder', 'Focus Band', 'King\'s Rock', 'Lax Incense', 'Quick Claw'],
3670
- unbanlist: ['Mr. Mime', 'Wobbuffet', 'Wynaut', 'Sand Veil'],
3671
- },
3672
3741
  {
3673
3742
  name: "[Gen 3] Custom Game",
3674
3743
 
@@ -3687,16 +3756,6 @@ export const Formats: FormatList = [
3687
3756
  debug: true,
3688
3757
  ruleset: ['HP Percentage Mod', 'Cancel Mod', 'Max Team Size = 24', 'Max Move Count = 24', 'Max Level = 9999', 'Default Level = 100'],
3689
3758
  },
3690
- {
3691
- name: "[Gen 2] Ubers",
3692
- threads: [
3693
- `&bullet; <a href="https://www.smogon.com/forums/posts/8286282/">GSC Ubers</a>`,
3694
- ],
3695
-
3696
- mod: 'gen2',
3697
- searchShow: false,
3698
- ruleset: ['Standard'],
3699
- },
3700
3759
  {
3701
3760
  name: "[Gen 2] UU",
3702
3761
  threads: [`&bullet; <a href="https://www.smogon.com/forums/threads/3576710/">GSC UU</a>`],
@@ -3765,6 +3824,16 @@ export const Formats: FormatList = [
3765
3824
  battle: {trunc: Math.trunc},
3766
3825
  ruleset: ['HP Percentage Mod', 'Cancel Mod', 'Max Team Size = 24', 'Max Move Count = 24', 'Max Level = 9999', 'Default Level = 100'],
3767
3826
  },
3827
+ {
3828
+ name: "[Gen 1] Ubers",
3829
+ threads: [
3830
+ `&bullet; <a href="https://www.smogon.com/forums/posts/8286283/">RBY Ubers</a>`,
3831
+ ],
3832
+
3833
+ mod: 'gen1',
3834
+ searchShow: false,
3835
+ ruleset: ['Standard'],
3836
+ },
3768
3837
  {
3769
3838
  name: "[Gen 1] UU",
3770
3839
  threads: [
@@ -3774,7 +3843,7 @@ export const Formats: FormatList = [
3774
3843
 
3775
3844
  mod: 'gen1',
3776
3845
  searchShow: false,
3777
- ruleset: ['[Gen 1] OU'],
3846
+ ruleset: ['[Gen 1] OU', 'APT Clause'],
3778
3847
  banlist: ['OU', 'UUBL'],
3779
3848
  },
3780
3849
  {
@@ -3811,20 +3880,6 @@ export const Formats: FormatList = [
3811
3880
  ],
3812
3881
  banlist: ['Uber'],
3813
3882
  },
3814
- {
3815
- name: "[Gen 1] Stadium OU",
3816
- threads: [
3817
- `&bullet; <a href="https://www.smogon.com/forums/threads/3685877/">Stadium OU Viability Rankings</a>`,
3818
- ],
3819
-
3820
- mod: 'gen1stadium',
3821
- searchShow: false,
3822
- ruleset: ['Standard', 'Team Preview'],
3823
- banlist: ['Uber',
3824
- 'Nidoking + Fury Attack + Thrash', 'Exeggutor + Poison Powder + Stomp', 'Exeggutor + Sleep Powder + Stomp',
3825
- 'Exeggutor + Stun Spore + Stomp', 'Jolteon + Focus Energy + Thunder Shock', 'Flareon + Focus Energy + Ember',
3826
- ],
3827
- },
3828
3883
  {
3829
3884
  name: "[Gen 1] Tradebacks OU",
3830
3885
  desc: `RBY OU with movepool additions from the Time Capsule.`,