@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
@@ -163,7 +163,7 @@ exports.Formats = [
163
163
  desc: `All the Pokémon on a team must share a type.`,
164
164
  threads: [
165
165
  `&bullet; <a href="https://www.smogon.com/forums/threads/3672167/">Monotype Metagame Discussion</a>`,
166
- `&bullet; <a href="https://www.smogon.com/forums/threads/3673391/">Monotype Sample Teams</a>`,
166
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3702647/">Monotype Sample Teams</a>`,
167
167
  `&bullet; <a href="https://www.smogon.com/forums/threads/3673165">Monotype Viability Rankings</a>`,
168
168
  ],
169
169
  mod: 'gen8',
@@ -218,8 +218,8 @@ exports.Formats = [
218
218
  mod: 'gen8',
219
219
  ruleset: ['[Gen 8] PU'],
220
220
  banlist: [
221
- 'PU', 'Arctovish', 'Aurorus', 'Basculin', 'Centiskorch', 'Drampa', 'Exeggutor-Alola', 'Gallade', 'Haunter', 'Magmortar', 'Magneton', 'Omastar',
222
- 'Rotom-Frost', 'Turtonator', 'Vanilluxe', 'Vikavolt', 'Silvally-Dragon', 'Silvally-Ground', 'Sneasel', 'Damp Rock', 'Grassy Seed',
221
+ 'PU', 'Arctovish', 'Aurorus', 'Basculin', 'Centiskorch', 'Drampa', 'Exeggutor-Alola', 'Gallade', 'Haunter', 'Magmortar', 'Magneton', 'Malamar',
222
+ 'Omastar', 'Rotom-Frost', 'Turtonator', 'Vanilluxe', 'Vikavolt', 'Silvally-Dragon', 'Silvally-Ground', 'Sneasel', 'Damp Rock', 'Grassy Seed',
223
223
  ],
224
224
  },
225
225
  {
@@ -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',
238
238
  // LC UUBL
239
239
  'Archen', 'Farfetch\u2019d-Galar', 'Scorbunny', 'Shellder', 'Wingull',
240
240
  ],
@@ -371,10 +371,10 @@ exports.Formats = [
371
371
  'Standard Doubles', 'Accuracy Moves Clause', 'Dynamax Clause', 'Sleep Clause Mod',
372
372
  ],
373
373
  banlist: [
374
- 'Calyrex-Ice', 'Calyrex-Shadow', 'Dialga', 'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Jirachi', 'Kyogre', 'Kyurem-White',
375
- 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Rayquaza', 'Reshiram',
376
- 'Solgaleo', 'Tornadus-Base', 'Urshifu-Base', 'Urshifu-Rapid-Strike', 'Whimsicott', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta',
377
- 'Zamazenta-Crowned', 'Zekrom', 'Moody', 'Power Construct', 'Focus Sash', 'Ally Switch', 'Final Gambit', 'Perish Song', 'Swagger',
374
+ 'Calyrex-Ice', 'Calyrex-Shadow', 'Cottonee', 'Dialga', 'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Jirachi', 'Kyogre',
375
+ 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Rayquaza',
376
+ 'Reshiram', 'Solgaleo', 'Tornadus-Base', 'Urshifu-Base', 'Urshifu-Rapid-Strike', 'Whimsicott', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned',
377
+ 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Moody', 'Power Construct', 'Focus Sash', 'Ally Switch', 'Final Gambit', 'Perish Song', 'Swagger',
378
378
  ],
379
379
  },
380
380
  {
@@ -418,6 +418,17 @@ exports.Formats = [
418
418
  }
419
419
  },
420
420
  },
421
+ {
422
+ name: "[Gen 8] Jump! Magikarp!",
423
+ desc: `Every team must contain Magikarp and bring it to the game.`,
424
+ threads: [
425
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3704588/">Jump! Magikarp!</a>`,
426
+ ],
427
+ mod: 'gen8',
428
+ gameType: 'doubles',
429
+ ruleset: ['Flat Rules', '!! Picked Team Size = 2', '!! Adjust Level = 50', 'Min Source Gen = 8', 'Force Select = Magikarp'],
430
+ banlist: ['Sub-Legendary'],
431
+ },
421
432
  {
422
433
  name: "[Gen 8] Doubles Custom Game",
423
434
  mod: 'gen8',
@@ -570,36 +581,272 @@ exports.Formats = [
570
581
  column: 2,
571
582
  },
572
583
  {
573
- name: "[Gen 8] Tier Shift",
574
- desc: `Pok&eacute;mon get a +10 boost to each stat, barring HP, per tier below OU they are in.`,
584
+ name: "[Gen 8] Broken Record",
585
+ desc: `Pok&eacute;mon can hold a TR to use that move in battle.`,
575
586
  threads: [
576
- `&bullet; <a href="https://www.smogon.com/forums/threads/3662165/">Tier Shift</a>`,
587
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3701270/">Broken Record</a>`,
577
588
  ],
578
589
  mod: 'gen8',
579
- ruleset: ['Standard', 'Tier Shift Mod', 'Dynamax Clause'],
590
+ ruleset: ['Standard', '!Sleep Clause Mod', 'Sleep Moves Clause', 'Dynamax Clause'],
580
591
  banlist: [
581
- 'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Eternatus', 'Genesect', 'Giratina', 'Giratina-Origin',
582
- 'Groudon', 'Ho-Oh', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Mewtwo',
583
- 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Reshiram', 'Solgaleo', 'Spectrier', 'Urshifu-Base',
584
- 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Base', 'Zekrom', 'Zygarde-Base', 'Arena Trap', 'Moody', 'Power Construct', 'Sand Veil',
585
- 'Shadow Tag', 'Snow Cloak', 'Bright Powder', 'Damp Rock', 'Eviolite', 'Heat Rock', 'King\'s Rock', 'Lax Incense', 'Baton Pass',
592
+ 'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Dragapult', 'Eternatus', 'Genesect', 'Giratina',
593
+ 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala',
594
+ 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza',
595
+ 'Regieleki', 'Reshiram', 'Rillaboom', 'Solgaleo', 'Spectrier', 'Urshifu-Base', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta',
596
+ 'Zamazenta-Crowned', 'Zekrom', 'Zygarde-Base', 'Arena Trap', 'Magnet Pull', 'Moody', 'Power Construct', 'Shadow Tag', 'TR29 (Baton Pass)',
597
+ 'TR82 (Stored Power)', 'Baton Pass',
586
598
  ],
599
+ onValidateSet(set) {
600
+ if (!set.item)
601
+ return;
602
+ const item = this.dex.items.get(set.item);
603
+ if (!/^tr\d\d/i.test(item.name))
604
+ return;
605
+ const moveName = item.desc.split('move ')[1].split('.')[0];
606
+ if (set.moves.map(this.toID).includes(this.toID(moveName))) {
607
+ return [
608
+ `${set.species} can't run ${item.name} (${moveName}) as its item because it already has that move in its moveset.`,
609
+ ];
610
+ }
611
+ },
612
+ onValidateTeam(team) {
613
+ const trs = new Set();
614
+ for (const set of team) {
615
+ if (!set.item)
616
+ continue;
617
+ const item = this.dex.items.get(set.item).name;
618
+ if (!/^tr\d\d/i.test(item))
619
+ continue;
620
+ if (trs.has(item)) {
621
+ return [`Your team already has a Pok\u00e9mon with ${item}.`];
622
+ }
623
+ trs.add(item);
624
+ }
625
+ },
626
+ onTakeItem(item) {
627
+ return !/^tr\d\d/i.test(item.name);
628
+ },
629
+ onModifyMove(move) {
630
+ if (move.id === 'knockoff') {
631
+ move.onBasePower = function (basePower, source, target, m) {
632
+ const item = target.getItem();
633
+ if (!this.singleEvent('TakeItem', item, target.itemState, target, target, m, item))
634
+ return;
635
+ // Very hardcode but I'd prefer to not make a mod for one damage calculation change
636
+ if (item.id && !/^tr\d\d/i.test(item.id)) {
637
+ return this.chainModify(1.5);
638
+ }
639
+ };
640
+ }
641
+ },
642
+ onBegin() {
643
+ for (const pokemon of this.getAllPokemon()) {
644
+ const item = pokemon.getItem();
645
+ if (/^tr\d\d/i.test(item.name)) {
646
+ const move = this.dex.moves.get(item.desc.split('move ')[1].split('.')[0]);
647
+ pokemon.moveSlots = pokemon.baseMoveSlots = [
648
+ ...pokemon.baseMoveSlots, {
649
+ id: move.id,
650
+ move: move.name,
651
+ pp: move.pp * 8 / 5,
652
+ maxpp: move.pp * 8 / 5,
653
+ target: move.target,
654
+ disabled: false,
655
+ disabledSource: '',
656
+ used: false,
657
+ },
658
+ ];
659
+ }
660
+ }
661
+ },
587
662
  },
588
663
  {
589
- name: "[Gen 8] Inverse",
590
- desc: `Weaknesses become resistances, while resistances and immunities become weaknesses.`,
664
+ name: "[Gen 8] Inheritance",
665
+ desc: `Pok&eacute;mon may use the ability and moves of another, as long as they forfeit their own learnset.`,
591
666
  threads: [
592
- `&bullet; <a href="https://www.smogon.com/forums/threads/3666858/">Inverse</a>`,
667
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3656811/">Inheritance</a>`,
593
668
  ],
594
669
  mod: 'gen8',
595
- ruleset: ['Standard', 'Inverse Mod', 'Dynamax Clause'],
670
+ // searchShow: false,
671
+ ruleset: ['Standard', '!Sleep Clause Mod', 'Sleep Moves Clause', '2 Ability Clause', 'Dynamax Clause'],
596
672
  banlist: [
597
- 'Cinderace', 'Calyrex-Ice', 'Calyrex-Shadow', 'Darmanitan-Galar', 'Dialga', 'Diggersby', 'Dracovish', 'Dracozolt', 'Eternatus', 'Genesect', 'Giratina',
598
- 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala', 'Marshadow',
599
- 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Porygon-Z', 'Rayquaza', 'Regidrago', 'Regieleki', 'Reshiram',
600
- 'Reuniclus', 'Rillaboom', 'Solgaleo', 'Spectrier', 'Urshifu-Base', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Base', 'Zekrom', 'Arena Trap',
601
- 'Moody', 'Power Construct', 'Shadow Tag', 'King\'s Rock', 'Baton Pass',
673
+ 'Blacephalon', 'Blaziken', 'Butterfree', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chansey', 'Combusken', 'Cresselia', 'Darmanitan-Galar', 'Dialga', 'Dracovish',
674
+ 'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala',
675
+ 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Natu', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Regieleki',
676
+ 'Regigigas', 'Reshiram', 'Sableye', 'Shedinja', 'Solgaleo', 'Spectrier', 'Tapu Koko', 'Toxtricity', 'Torkoal', 'Urshifu-Base', 'Xatu', 'Xerneas', 'Yveltal',
677
+ 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zeraora', 'Zekrom', 'Arena Trap', 'Contrary', 'Drizzle', 'Huge Power', 'Imposter', 'Innards Out',
678
+ 'Libero', 'Moody', 'Power Construct', 'Pure Power', 'Quick Draw', 'Shadow Tag', 'Sheer Force', 'Simple', 'Unaware', 'Unburden', 'Water Bubble', 'King\'s Rock',
679
+ 'Quick Claw', 'Baton Pass', 'Bolt Beak', 'Fishious Rend', 'Shell Smash', 'Thousand Arrows',
602
680
  ],
681
+ getEvoFamily(speciesid) {
682
+ let species = Dex.species.get(speciesid);
683
+ while (species.prevo) {
684
+ species = Dex.species.get(species.prevo);
685
+ }
686
+ return species.id;
687
+ },
688
+ validateSet(set, teamHas) {
689
+ const unreleased = (pokemon) => pokemon.tier === "Unreleased" && pokemon.isNonstandard === "Unobtainable";
690
+ if (!teamHas.abilityMap) {
691
+ teamHas.abilityMap = Object.create(null);
692
+ for (const pokemon of Dex.species.all()) {
693
+ if (pokemon.isNonstandard || unreleased(pokemon))
694
+ continue;
695
+ if (pokemon.requiredAbility || pokemon.requiredItem || pokemon.requiredMove)
696
+ continue;
697
+ if (this.ruleTable.isBannedSpecies(pokemon))
698
+ continue;
699
+ for (const key of Object.values(pokemon.abilities)) {
700
+ const abilityId = this.dex.toID(key);
701
+ if (abilityId in teamHas.abilityMap) {
702
+ teamHas.abilityMap[abilityId][pokemon.evos ? 'push' : 'unshift'](pokemon.id);
703
+ }
704
+ else {
705
+ teamHas.abilityMap[abilityId] = [pokemon.id];
706
+ }
707
+ }
708
+ }
709
+ }
710
+ const problem = this.validateForme(set);
711
+ if (problem.length)
712
+ return problem;
713
+ const species = this.dex.species.get(set.species);
714
+ if (!species.exists || species.num < 1)
715
+ return [`The Pok\u00e9mon "${set.species}" does not exist.`];
716
+ if (species.isNonstandard || unreleased(species)) {
717
+ return [`${species.name} is not obtainable in Generation ${this.dex.gen}.`];
718
+ }
719
+ const name = set.name;
720
+ if (this.ruleTable.isBannedSpecies(species)) {
721
+ return this.validateSet(set, teamHas);
722
+ }
723
+ const ability = this.dex.abilities.get(set.ability);
724
+ if (!ability.exists || ability.isNonstandard)
725
+ return [`${name} needs to have a valid ability.`];
726
+ const pokemonWithAbility = teamHas.abilityMap[ability.id];
727
+ if (!pokemonWithAbility)
728
+ return [`${ability.name} is not available on a legal Pok\u00e9mon.`];
729
+ this.format.debug = true;
730
+ if (!teamHas.abilitySources)
731
+ teamHas.abilitySources = Object.create(null);
732
+ const validSources = teamHas.abilitySources[this.dex.toID(set.species)] = []; // Evolution families
733
+ let canonicalSource = ''; // Specific for the basic implementation of Donor Clause (see onValidateTeam).
734
+ for (const donor of pokemonWithAbility) {
735
+ const donorSpecies = this.dex.species.get(donor);
736
+ let format = this.format;
737
+ if (!format.getEvoFamily)
738
+ format = this.dex.formats.get('gen8inheritance');
739
+ const evoFamily = format.getEvoFamily(donorSpecies.id);
740
+ if (validSources.includes(evoFamily))
741
+ continue;
742
+ set.species = donorSpecies.name;
743
+ set.name = donorSpecies.baseSpecies;
744
+ const problems = this.validateSet(set, teamHas) || [];
745
+ if (!problems.length) {
746
+ validSources.push(evoFamily);
747
+ canonicalSource = donorSpecies.name;
748
+ }
749
+ // Specific for the basic implementation of Donor Clause (see onValidateTeam).
750
+ if (validSources.length > 1)
751
+ break;
752
+ }
753
+ this.format.debug = false;
754
+ set.name = name;
755
+ set.species = species.name;
756
+ if (!validSources.length) {
757
+ if (pokemonWithAbility.length > 1)
758
+ return [`${name}'s set is illegal.`];
759
+ return [`${name} has an illegal set with an ability from ${this.dex.species.get(pokemonWithAbility[0]).name}.`];
760
+ }
761
+ // Protocol: Include the data of the donor species in the `ability` data slot.
762
+ // Afterwards, we are going to reset the name to what the user intended.
763
+ set.ability = `${set.ability}0${canonicalSource}`;
764
+ return null;
765
+ },
766
+ onValidateTeam(team, f, teamHas) {
767
+ if (this.ruleTable.has('2abilityclause')) {
768
+ const abilityTable = new Map();
769
+ const base = {
770
+ airlock: 'cloudnine',
771
+ battlearmor: 'shellarmor',
772
+ clearbody: 'whitesmoke',
773
+ dazzling: 'queenlymajesty',
774
+ emergencyexit: 'wimpout',
775
+ filter: 'solidrock',
776
+ gooey: 'tanglinghair',
777
+ insomnia: 'vitalspirit',
778
+ ironbarbs: 'roughskin',
779
+ libero: 'protean',
780
+ minus: 'plus',
781
+ moxie: 'chillingneigh',
782
+ powerofalchemy: 'receiver',
783
+ propellertail: 'stalwart',
784
+ teravolt: 'moldbreaker',
785
+ turboblaze: 'moldbreaker',
786
+ };
787
+ for (const set of team) {
788
+ let ability = this.toID(set.ability.split('0')[0]);
789
+ if (!ability)
790
+ continue;
791
+ if (ability in base)
792
+ ability = base[ability];
793
+ if ((abilityTable.get(ability) || 0) >= 2) {
794
+ return [
795
+ `You are limited to two of each ability by 2 Ability Clause.`,
796
+ `(You have more than two ${this.dex.abilities.get(ability).name} variants)`,
797
+ ];
798
+ }
799
+ abilityTable.set(ability, (abilityTable.get(ability) || 0) + 1);
800
+ }
801
+ }
802
+ // Donor Clause
803
+ const evoFamilyLists = [];
804
+ for (const set of team) {
805
+ const abilitySources = teamHas.abilitySources?.[this.dex.toID(set.species)];
806
+ if (!abilitySources)
807
+ continue;
808
+ let format = this.format;
809
+ if (!format.getEvoFamily)
810
+ format = this.dex.formats.get('gen8inheritance');
811
+ evoFamilyLists.push(abilitySources.map(format.getEvoFamily));
812
+ }
813
+ // Checking actual full incompatibility would require expensive algebra.
814
+ // Instead, we only check the trivial case of multiple Pokémon only legal for exactly one family. FIXME?
815
+ const requiredFamilies = Object.create(null);
816
+ for (const evoFamilies of evoFamilyLists) {
817
+ if (evoFamilies.length !== 1)
818
+ continue;
819
+ const [familyId] = evoFamilies;
820
+ if (!(familyId in requiredFamilies))
821
+ requiredFamilies[familyId] = 1;
822
+ requiredFamilies[familyId]++;
823
+ if (requiredFamilies[familyId] > 2) {
824
+ return [
825
+ `You are limited to up to two inheritances from each evolution family by the Donor Clause.`,
826
+ `(You inherit more than twice from ${this.dex.species.get(familyId).name}).`,
827
+ ];
828
+ }
829
+ }
830
+ },
831
+ onBegin() {
832
+ for (const pokemon of this.getAllPokemon()) {
833
+ if (pokemon.baseAbility.includes('0')) {
834
+ const donor = pokemon.baseAbility.split('0')[1];
835
+ pokemon.m.donor = this.toID(donor);
836
+ pokemon.baseAbility = this.toID(pokemon.baseAbility.split('0')[0]);
837
+ pokemon.ability = pokemon.baseAbility;
838
+ }
839
+ }
840
+ },
841
+ onSwitchIn(pokemon) {
842
+ if (!pokemon.m.donor)
843
+ return;
844
+ const donorTemplate = this.dex.species.get(pokemon.m.donor);
845
+ if (!donorTemplate.exists)
846
+ return;
847
+ // Place volatiles on the Pokémon to show the donor details.
848
+ this.add('-start', pokemon, donorTemplate.name, '[silent]');
849
+ },
603
850
  },
604
851
  // Other Metagames
605
852
  ///////////////////////////////////////////////////////////////////
@@ -620,8 +867,8 @@ exports.Formats = [
620
867
  'Calyrex-Shadow', 'Cramorant-Gorging', 'Darmanitan-Galar-Zen', 'Eternatus-Eternamax', 'Shedinja', 'Zacian-Crowned',
621
868
  'Arena Trap', 'Contrary', 'Gorilla Tactics', 'Huge Power', 'Illusion', 'Innards Out', 'Intrepid Sword', 'Libero',
622
869
  'Magnet Pull', 'Moody', 'Neutralizing Gas', 'Parental Bond', 'Protean', 'Pure Power', 'Shadow Tag', 'Stakeout',
623
- 'Water Bubble', 'Wonder Guard', 'Comatose + Sleep Talk', 'Rusted Sword', 'Court Change', 'Bolt Beak', 'Double Iron Bash',
624
- 'Octolock', 'Shell Smash',
870
+ 'Water Bubble', 'Wonder Guard', 'Comatose + Sleep Talk', 'Rusted Sword', 'Belly Drum', 'Bolt Beak', 'Court Change',
871
+ 'Double Iron Bash', 'Octolock', 'Shell Smash',
625
872
  ],
626
873
  },
627
874
  {
@@ -634,8 +881,8 @@ exports.Formats = [
634
881
  mod: 'gen8',
635
882
  ruleset: ['Standard', '!Obtainable Abilities', '2 Ability Clause', 'Dynamax Clause', 'Sleep Moves Clause', '!Sleep Clause Mod'],
636
883
  banlist: [
637
- 'Archeops', 'Blacephalon', 'Buzzwole', 'Calyrex-Ice', 'Calyrex-Shadow', 'Dialga', 'Dracovish', 'Dragapult', 'Dragonite', 'Eternatus',
638
- 'Gengar', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Keldeo', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White',
884
+ 'Archeops', 'Blacephalon', 'Buzzwole', 'Calyrex-Ice', 'Calyrex-Shadow', 'Dialga', 'Dracovish', 'Dragapult', 'Dragonite', 'Eternatus', 'Gengar',
885
+ 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Keldeo', 'Kommo-o', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White',
639
886
  'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Noivern',
640
887
  'Palkia', 'Pheromosa', 'Rayquaza', 'Regigigas', 'Reshiram', 'Shedinja', 'Solgaleo', 'Spectrier', 'Urshifu', 'Urshifu-Rapid-Strike',
641
888
  'Victini', 'Weavile', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Base', 'Zekrom', 'Zeraora', 'Zygarde-Base',
@@ -732,9 +979,9 @@ exports.Formats = [
732
979
  'Arena Trap', 'Magnet Pull', 'Moody', 'Power Construct', 'Shadow Tag', 'King\'s Rock', 'Baton Pass',
733
980
  ],
734
981
  restricted: [
735
- 'Acupressure', 'Astral Barrage', 'Belly Drum', 'Bolt Beak', 'Clangorous Soul', 'Double Iron Bash', 'Electrify', 'Extreme Speed', 'Fishious Rend',
736
- 'Geomancy', 'Glacial Lance', 'Oblivion Wing', 'Precipice Blades', 'Shell Smash', 'Shift Gear', 'Thousand Arrows', 'Thunderous Kick', 'V-create',
737
- 'Wicked Blow',
982
+ 'Acupressure', 'Astral Barrage', 'Belly Drum', 'Bolt Beak', 'Clangorous Soul', 'Double Iron Bash', 'Electrify', 'Extreme Speed', 'Final Gambit',
983
+ 'Fishious Rend', 'Geomancy', 'Glacial Lance', 'Oblivion Wing', 'Precipice Blades', 'Shell Smash', 'Shift Gear', 'Thousand Arrows', 'Thunderous Kick',
984
+ 'V-create', 'Wicked Blow',
738
985
  ],
739
986
  },
740
987
  {
@@ -921,7 +1168,7 @@ exports.Formats = [
921
1168
  ],
922
1169
  mod: 'gen8bdsp',
923
1170
  ruleset: ['Little Cup', 'Standard'],
924
- banlist: ['Gligar', 'Meditite', 'Misdreavus', 'Murkrow', 'Scyther', 'Sneasel', 'Tangela', 'Vulpix', 'Yanma', 'Moody', 'Baton Pass', 'Sticky Web'],
1171
+ banlist: ['Gligar', 'Meditite', 'Misdreavus', 'Munchlax', 'Murkrow', 'Scyther', 'Sneasel', 'Tangela', 'Vulpix', 'Yanma', 'Moody', 'Baton Pass', 'Sticky Web'],
925
1172
  },
926
1173
  {
927
1174
  name: "[Gen 8 BDSP] Monotype",
@@ -1149,194 +1396,6 @@ exports.Formats = [
1149
1396
  }
1150
1397
  },
1151
1398
  },
1152
- {
1153
- name: "[Gen 8] Inheritance",
1154
- desc: `Pok&eacute;mon may use the ability and moves of another, as long as they forfeit their own learnset.`,
1155
- threads: [
1156
- `&bullet; <a href="https://www.smogon.com/forums/threads/3656811/">Inheritance</a>`,
1157
- ],
1158
- mod: 'gen8',
1159
- searchShow: false,
1160
- ruleset: ['Standard', '2 Ability Clause', 'Dynamax Clause'],
1161
- banlist: [
1162
- 'Blacephalon', 'Blaziken', 'Butterfree', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chansey', 'Combusken', 'Cresselia', 'Darmanitan-Galar', 'Dialga', 'Dracovish',
1163
- 'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala',
1164
- 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Natu', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Regieleki',
1165
- 'Regigigas', 'Reshiram', 'Sableye', 'Shedinja', 'Solgaleo', 'Spectrier', 'Tapu Koko', 'Toxtricity', 'Torkoal', 'Urshifu-Base', 'Xatu', 'Xerneas', 'Yveltal',
1166
- 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zeraora', 'Zekrom', 'Arena Trap', 'Contrary', 'Drizzle', 'Huge Power', 'Imposter', 'Innards Out',
1167
- 'Libero', 'Moody', 'Power Construct', 'Pure Power', 'Quick Draw', 'Shadow Tag', 'Sheer Force', 'Simple', 'Unaware', 'Unburden', 'Water Bubble', 'King\'s Rock',
1168
- 'Quick Claw', 'Baton Pass', 'Bolt Beak', 'Fishious Rend', 'Shell Smash', 'Thousand Arrows',
1169
- ],
1170
- getEvoFamily(speciesid) {
1171
- let species = Dex.species.get(speciesid);
1172
- while (species.prevo) {
1173
- species = Dex.species.get(species.prevo);
1174
- }
1175
- return species.id;
1176
- },
1177
- validateSet(set, teamHas) {
1178
- const unreleased = (pokemon) => pokemon.tier === "Unreleased" && pokemon.isNonstandard === "Unobtainable";
1179
- if (!teamHas.abilityMap) {
1180
- teamHas.abilityMap = Object.create(null);
1181
- for (const pokemon of Dex.species.all()) {
1182
- if (pokemon.isNonstandard || unreleased(pokemon))
1183
- continue;
1184
- if (pokemon.requiredAbility || pokemon.requiredItem || pokemon.requiredMove)
1185
- continue;
1186
- if (this.ruleTable.isBannedSpecies(pokemon))
1187
- continue;
1188
- for (const key of Object.values(pokemon.abilities)) {
1189
- const abilityId = this.dex.toID(key);
1190
- if (abilityId in teamHas.abilityMap) {
1191
- teamHas.abilityMap[abilityId][pokemon.evos ? 'push' : 'unshift'](pokemon.id);
1192
- }
1193
- else {
1194
- teamHas.abilityMap[abilityId] = [pokemon.id];
1195
- }
1196
- }
1197
- }
1198
- }
1199
- const problem = this.validateForme(set);
1200
- if (problem.length)
1201
- return problem;
1202
- const species = this.dex.species.get(set.species);
1203
- if (!species.exists || species.num < 1)
1204
- return [`The Pok\u00e9mon "${set.species}" does not exist.`];
1205
- if (species.isNonstandard || unreleased(species)) {
1206
- return [`${species.name} is not obtainable in Generation ${this.dex.gen}.`];
1207
- }
1208
- const name = set.name;
1209
- if (this.ruleTable.isBannedSpecies(species)) {
1210
- return this.validateSet(set, teamHas);
1211
- }
1212
- const ability = this.dex.abilities.get(set.ability);
1213
- if (!ability.exists || ability.isNonstandard)
1214
- return [`${name} needs to have a valid ability.`];
1215
- const pokemonWithAbility = teamHas.abilityMap[ability.id];
1216
- if (!pokemonWithAbility)
1217
- return [`${ability.name} is not available on a legal Pok\u00e9mon.`];
1218
- this.format.debug = true;
1219
- if (!teamHas.abilitySources)
1220
- teamHas.abilitySources = Object.create(null);
1221
- const validSources = teamHas.abilitySources[this.dex.toID(set.species)] = []; // Evolution families
1222
- let canonicalSource = ''; // Specific for the basic implementation of Donor Clause (see onValidateTeam).
1223
- for (const donor of pokemonWithAbility) {
1224
- const donorSpecies = this.dex.species.get(donor);
1225
- let format = this.format;
1226
- if (!format.getEvoFamily)
1227
- format = this.dex.formats.get('gen8inheritance');
1228
- const evoFamily = format.getEvoFamily(donorSpecies.id);
1229
- if (validSources.includes(evoFamily))
1230
- continue;
1231
- set.species = donorSpecies.name;
1232
- set.name = donorSpecies.baseSpecies;
1233
- const problems = this.validateSet(set, teamHas) || [];
1234
- if (!problems.length) {
1235
- validSources.push(evoFamily);
1236
- canonicalSource = donorSpecies.name;
1237
- }
1238
- // Specific for the basic implementation of Donor Clause (see onValidateTeam).
1239
- if (validSources.length > 1)
1240
- break;
1241
- }
1242
- this.format.debug = false;
1243
- set.name = name;
1244
- set.species = species.name;
1245
- if (!validSources.length) {
1246
- if (pokemonWithAbility.length > 1)
1247
- return [`${name}'s set is illegal.`];
1248
- return [`${name} has an illegal set with an ability from ${this.dex.species.get(pokemonWithAbility[0]).name}.`];
1249
- }
1250
- // Protocol: Include the data of the donor species in the `ability` data slot.
1251
- // Afterwards, we are going to reset the name to what the user intended.
1252
- set.ability = `${set.ability}0${canonicalSource}`;
1253
- return null;
1254
- },
1255
- onValidateTeam(team, f, teamHas) {
1256
- if (this.ruleTable.has('2abilityclause')) {
1257
- const abilityTable = new Map();
1258
- const base = {
1259
- airlock: 'cloudnine',
1260
- battlearmor: 'shellarmor',
1261
- clearbody: 'whitesmoke',
1262
- dazzling: 'queenlymajesty',
1263
- emergencyexit: 'wimpout',
1264
- filter: 'solidrock',
1265
- gooey: 'tanglinghair',
1266
- insomnia: 'vitalspirit',
1267
- ironbarbs: 'roughskin',
1268
- libero: 'protean',
1269
- minus: 'plus',
1270
- moxie: 'chillingneigh',
1271
- powerofalchemy: 'receiver',
1272
- propellertail: 'stalwart',
1273
- teravolt: 'moldbreaker',
1274
- turboblaze: 'moldbreaker',
1275
- };
1276
- for (const set of team) {
1277
- let ability = this.toID(set.ability.split('0')[0]);
1278
- if (!ability)
1279
- continue;
1280
- if (ability in base)
1281
- ability = base[ability];
1282
- if ((abilityTable.get(ability) || 0) >= 2) {
1283
- return [
1284
- `You are limited to two of each ability by 2 Ability Clause.`,
1285
- `(You have more than two ${this.dex.abilities.get(ability).name} variants)`,
1286
- ];
1287
- }
1288
- abilityTable.set(ability, (abilityTable.get(ability) || 0) + 1);
1289
- }
1290
- }
1291
- // Donor Clause
1292
- const evoFamilyLists = [];
1293
- for (const set of team) {
1294
- const abilitySources = teamHas.abilitySources?.[this.dex.toID(set.species)];
1295
- if (!abilitySources)
1296
- continue;
1297
- let format = this.format;
1298
- if (!format.getEvoFamily)
1299
- format = this.dex.formats.get('gen8inheritance');
1300
- evoFamilyLists.push(abilitySources.map(format.getEvoFamily));
1301
- }
1302
- // Checking actual full incompatibility would require expensive algebra.
1303
- // Instead, we only check the trivial case of multiple Pokémon only legal for exactly one family. FIXME?
1304
- const requiredFamilies = Object.create(null);
1305
- for (const evoFamilies of evoFamilyLists) {
1306
- if (evoFamilies.length !== 1)
1307
- continue;
1308
- const [familyId] = evoFamilies;
1309
- if (!(familyId in requiredFamilies))
1310
- requiredFamilies[familyId] = 1;
1311
- requiredFamilies[familyId]++;
1312
- if (requiredFamilies[familyId] > 2) {
1313
- return [
1314
- `You are limited to up to two inheritances from each evolution family by the Donor Clause.`,
1315
- `(You inherit more than twice from ${this.dex.species.get(familyId).name}).`,
1316
- ];
1317
- }
1318
- }
1319
- },
1320
- onBegin() {
1321
- for (const pokemon of this.getAllPokemon()) {
1322
- if (pokemon.baseAbility.includes('0')) {
1323
- const donor = pokemon.baseAbility.split('0')[1];
1324
- pokemon.m.donor = this.toID(donor);
1325
- pokemon.baseAbility = this.toID(pokemon.baseAbility.split('0')[0]);
1326
- pokemon.ability = pokemon.baseAbility;
1327
- }
1328
- }
1329
- },
1330
- onSwitchIn(pokemon) {
1331
- if (!pokemon.m.donor)
1332
- return;
1333
- const donorTemplate = this.dex.species.get(pokemon.m.donor);
1334
- if (!donorTemplate.exists)
1335
- return;
1336
- // Place volatiles on the Pokémon to show the donor details.
1337
- this.add('-start', pokemon, donorTemplate.name, '[silent]');
1338
- },
1339
- },
1340
1399
  {
1341
1400
  name: "[Gen 8] Linked",
1342
1401
  desc: `The first two moves in a Pok&eacute;mon's moveset are used simultaneously.`,
@@ -2318,35 +2377,44 @@ exports.Formats = [
2318
2377
  column: 3,
2319
2378
  },
2320
2379
  {
2321
- name: "[Gen 7] UU",
2380
+ name: "[Gen 2] Ubers",
2322
2381
  threads: [
2323
- `&bullet; <a href="https://www.smogon.com/forums/threads/3621217/">USM UU Sample Teams</a>`,
2324
- `&bullet; <a href="https://www.smogon.com/forums/threads/3641346/">USM UU Viability Rankings</a>`,
2382
+ `&bullet; <a href="https://www.smogon.com/forums/posts/8286282/">GSC Ubers</a>`,
2325
2383
  ],
2326
- mod: 'gen7',
2384
+ mod: 'gen2',
2327
2385
  // searchShow: false,
2328
- ruleset: ['[Gen 7] OU'],
2329
- banlist: ['OU', 'UUBL', 'Drizzle', 'Drought', 'Kommonium Z', 'Mewnium Z'],
2386
+ ruleset: ['Standard'],
2330
2387
  },
2331
2388
  {
2332
- name: "[Gen 6] ZU",
2389
+ name: "[Gen 3] 1v1",
2390
+ desc: `Bring three Pok&eacute;mon to Team Preview and choose one to battle.`,
2333
2391
  threads: [
2334
- `&bullet; <a href="https://www.smogon.com/dex/xy/formats/zu/">ORAS ZU Banlist</a>`,
2335
- `&bullet; <a href="https://www.smogon.com/forums/posts/8034679/">ORAS ZU Viability Rankings</a>`,
2392
+ `&bullet; <a href="https://www.smogon.com/forums/posts/8031456/">ADV 1v1</a>`,
2336
2393
  ],
2337
- mod: 'gen6',
2394
+ mod: 'gen3',
2338
2395
  // searchShow: false,
2339
- ruleset: ['[Gen 6] PU'],
2340
- banlist: ['PU', 'Fraxure', 'Regigigas', 'Simisear'],
2396
+ ruleset: [
2397
+ 'Picked Team Size = 1', 'Max Team Size = 3',
2398
+ '[Gen 3] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview', '!Freeze Clause Mod',
2399
+ ],
2400
+ banlist: [
2401
+ 'Clefable', 'Slaking', 'Snorlax', 'Suicune', 'Zapdos', 'Destiny Bond', 'Explosion', 'Ingrain', 'Perish Song',
2402
+ 'Self-Destruct', 'Bright Powder', 'Focus Band', 'King\'s Rock', 'Lax Incense', 'Quick Claw',
2403
+ ],
2404
+ unbanlist: ['Mr. Mime', 'Wobbuffet', 'Wynaut', 'Sand Veil'],
2341
2405
  },
2342
2406
  {
2343
- name: "[Gen 1] Ubers",
2407
+ name: "[Gen 1] Stadium OU",
2344
2408
  threads: [
2345
- `&bullet; <a href="https://www.smogon.com/forums/posts/8286283/">RBY Ubers</a>`,
2409
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3685877/">Stadium OU Viability Rankings</a>`,
2346
2410
  ],
2347
- mod: 'gen1',
2411
+ mod: 'gen1stadium',
2348
2412
  // searchShow: false,
2349
- ruleset: ['Standard'],
2413
+ ruleset: ['Standard', 'Team Preview'],
2414
+ banlist: ['Uber',
2415
+ 'Nidoking + Fury Attack + Thrash', 'Exeggutor + Poison Powder + Stomp', 'Exeggutor + Sleep Powder + Stomp',
2416
+ 'Exeggutor + Stun Spore + Stomp', 'Jolteon + Focus Energy + Thunder Shock', 'Flareon + Focus Energy + Ember',
2417
+ ],
2350
2418
  },
2351
2419
  // Past Gens OU
2352
2420
  ///////////////////////////////////////////////////////////////////
@@ -2383,7 +2451,7 @@ exports.Formats = [
2383
2451
  `&bullet; <a href="https://www.smogon.com/forums/threads/3668699/">BW2 OU Viability Rankings</a>`,
2384
2452
  ],
2385
2453
  mod: 'gen5',
2386
- ruleset: ['Standard', 'Evasion Abilities Clause', 'Sleep Moves Clause', 'Swagger Clause'],
2454
+ ruleset: ['Standard', 'Evasion Abilities Clause', 'Sleep Moves Clause', 'Swagger Clause', 'Gems Clause'],
2387
2455
  banlist: ['Uber', 'Arena Trap', 'Drizzle ++ Swift Swim', 'Drought ++ Chlorophyll', 'Sand Rush', 'Shadow Tag', 'King\'s Rock', 'Razor Fang', 'Soul Dew', 'Assist', 'Baton Pass'],
2388
2456
  },
2389
2457
  {
@@ -2394,7 +2462,7 @@ exports.Formats = [
2394
2462
  `&bullet; <a href="https://www.smogon.com/forums/threads/3683332/">DPP OU Viability Rankings</a>`,
2395
2463
  ],
2396
2464
  mod: 'gen4',
2397
- ruleset: ['Standard'],
2465
+ ruleset: ['Standard', 'Freeze Clause Mod'],
2398
2466
  banlist: ['AG', 'Uber', 'Arena Trap', 'Sand Veil', 'Swinub + Snow Cloak', 'Piloswine + Snow Cloak', 'Mamoswine + Snow Cloak', 'Soul Dew', 'Baton Pass', 'Swagger'],
2399
2467
  },
2400
2468
  {
@@ -2404,7 +2472,7 @@ exports.Formats = [
2404
2472
  `&bullet; <a href="https://www.smogon.com/forums/threads/3503019/">ADV OU Viability Rankings</a>`,
2405
2473
  ],
2406
2474
  mod: 'gen3',
2407
- ruleset: ['Standard', 'One Boost Passer Clause'],
2475
+ ruleset: ['Standard', 'One Boost Passer Clause', 'Freeze Clause Mod'],
2408
2476
  banlist: ['Uber', 'Sand Veil', 'Soundproof', 'Assist', 'Baton Pass + Block', 'Baton Pass + Mean Look', 'Baton Pass + Spider Web', 'Smeargle + Ingrain'],
2409
2477
  },
2410
2478
  {
@@ -2415,7 +2483,7 @@ exports.Formats = [
2415
2483
  ],
2416
2484
  mod: 'gen2',
2417
2485
  ruleset: ['Standard'],
2418
- banlist: ['Uber'],
2486
+ banlist: ['Uber', 'Mean Look + Baton Pass', 'Spider Web + Baton Pass'],
2419
2487
  },
2420
2488
  {
2421
2489
  name: "[Gen 1] OU",
@@ -2565,6 +2633,17 @@ exports.Formats = [
2565
2633
  ruleset: ['Standard', 'Mega Rayquaza Clause'],
2566
2634
  banlist: ['Baton Pass'],
2567
2635
  },
2636
+ {
2637
+ name: "[Gen 7] UU",
2638
+ threads: [
2639
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3621217/">USM UU Sample Teams</a>`,
2640
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3641346/">USM UU Viability Rankings</a>`,
2641
+ ],
2642
+ mod: 'gen7',
2643
+ searchShow: false,
2644
+ ruleset: ['[Gen 7] OU'],
2645
+ banlist: ['OU', 'UUBL', 'Drizzle', 'Drought', 'Kommonium Z', 'Mewnium Z'],
2646
+ },
2568
2647
  {
2569
2648
  name: "[Gen 7] RU",
2570
2649
  threads: [
@@ -2649,7 +2728,7 @@ exports.Formats = [
2649
2728
  'Arceus', 'Darkrai', 'Deoxys-Base', 'Deoxys-Attack', 'Deoxys-Defense', 'Dialga', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kangaskhan-Mega',
2650
2729
  'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Marshadow', 'Mewtwo', 'Mimikyu', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane',
2651
2730
  'Palkia', 'Rayquaza', 'Reshiram', 'Salamence-Mega', 'Shaymin-Sky', 'Snorlax', 'Solgaleo', 'Tapu Koko', 'Xerneas', 'Yveltal', 'Zekrom',
2652
- 'Moody', 'Focus Sash', 'Perish Song', 'Detect + Fightinium Z',
2731
+ 'Moody', 'Focus Sash', 'Grass Whistle', 'Hypnosis', 'Perish Song', 'Sing', 'Detect + Fightinium Z',
2653
2732
  ],
2654
2733
  },
2655
2734
  {
@@ -2952,6 +3031,17 @@ exports.Formats = [
2952
3031
  searchShow: false,
2953
3032
  ruleset: ['Obtainable', 'Team Preview', 'Endless Battle Clause', 'HP Percentage Mod', 'Cancel Mod'],
2954
3033
  },
3034
+ {
3035
+ name: "[Gen 6] ZU",
3036
+ threads: [
3037
+ `&bullet; <a href="https://www.smogon.com/dex/xy/formats/zu/">ORAS ZU Banlist</a>`,
3038
+ `&bullet; <a href="https://www.smogon.com/forums/posts/8034679/">ORAS ZU Viability Rankings</a>`,
3039
+ ],
3040
+ mod: 'gen6',
3041
+ searchShow: false,
3042
+ ruleset: ['[Gen 6] PU'],
3043
+ banlist: ['PU', 'Fraxure', 'Regigigas', 'Simisear'],
3044
+ },
2955
3045
  {
2956
3046
  name: "[Gen 6] CAP",
2957
3047
  threads: [
@@ -2962,7 +3052,7 @@ exports.Formats = [
2962
3052
  mod: 'gen6',
2963
3053
  searchShow: false,
2964
3054
  ruleset: ['[Gen 6] OU', '+CAP'],
2965
- banlist: ['Aurumoth', 'Cawmodore', 'Crucibelle-Mega'],
3055
+ banlist: ['Aurumoth', 'Cawmodore'],
2966
3056
  },
2967
3057
  {
2968
3058
  name: "[Gen 6] Battle Spot Singles",
@@ -3140,7 +3230,7 @@ exports.Formats = [
3140
3230
  mod: 'gen5',
3141
3231
  searchShow: false,
3142
3232
  ruleset: ['[Gen 5] NU', 'Sleep Moves Clause'],
3143
- banlist: ['NU', 'PUBL'],
3233
+ banlist: ['NU', 'PUBL', 'Damp Rock'],
3144
3234
  },
3145
3235
  {
3146
3236
  name: "[Gen 5] LC",
@@ -3164,7 +3254,7 @@ exports.Formats = [
3164
3254
  ],
3165
3255
  mod: 'gen5',
3166
3256
  searchShow: false,
3167
- ruleset: ['[Gen 5] OU', 'Same Type Clause'],
3257
+ ruleset: ['[Gen 5] OU', 'Same Type Clause', '!Gems Clause'],
3168
3258
  },
3169
3259
  {
3170
3260
  name: "[Gen 5] 1v1",
@@ -3294,7 +3384,7 @@ exports.Formats = [
3294
3384
  ],
3295
3385
  mod: 'gen4',
3296
3386
  searchShow: false,
3297
- ruleset: ['[Gen 4] OU'],
3387
+ ruleset: ['[Gen 4] OU', '!Freeze Clause Mod'],
3298
3388
  banlist: ['OU', 'UUBL'],
3299
3389
  unbanlist: ['Arena Trap', 'Swagger'],
3300
3390
  },
@@ -3356,7 +3446,7 @@ exports.Formats = [
3356
3446
  searchShow: false,
3357
3447
  ruleset: [
3358
3448
  'Picked Team Size = 1', 'Max Team Size = 3',
3359
- '[Gen 4] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview',
3449
+ '[Gen 4] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview', '!Freeze Clause Mod',
3360
3450
  ],
3361
3451
  banlist: ['Latias', 'Machamp', 'Porygon-Z', 'Shaymin', 'Snorlax', 'Togekiss', 'Focus Sash', 'Destiny Bond', 'Explosion', 'Perish Song', 'Self-Destruct'],
3362
3452
  unbanlist: ['Wobbuffet', 'Wynaut', 'Sand Veil', 'Swagger'],
@@ -3398,7 +3488,7 @@ exports.Formats = [
3398
3488
  mod: 'gen4',
3399
3489
  gameType: 'doubles',
3400
3490
  searchShow: false,
3401
- ruleset: ['[Gen 4] OU'],
3491
+ ruleset: ['[Gen 4] OU', '!Freeze Clause Mod'],
3402
3492
  banlist: ['Explosion'],
3403
3493
  unbanlist: ['Garchomp', 'Latias', 'Latios', 'Manaphy', 'Mew', 'Salamence', 'Wobbuffet', 'Wynaut', 'Swagger'],
3404
3494
  },
@@ -3453,9 +3543,8 @@ exports.Formats = [
3453
3543
  ],
3454
3544
  mod: 'gen3',
3455
3545
  searchShow: false,
3456
- ruleset: ['Standard', 'NFE Clause'],
3457
- banlist: ['Uber', 'OU', 'UUBL', 'Smeargle + Ingrain', 'Baton Pass'],
3458
- unbanlist: ['Scyther'],
3546
+ ruleset: ['Standard'],
3547
+ banlist: ['Uber', 'OU', 'UUBL', 'Smeargle + Ingrain', 'Arena Trap', 'Bright Powder', 'Lax Incense', 'Baton Pass', 'Swagger'],
3459
3548
  },
3460
3549
  {
3461
3550
  name: "[Gen 3] NU",
@@ -3464,9 +3553,8 @@ exports.Formats = [
3464
3553
  ],
3465
3554
  mod: 'gen3',
3466
3555
  searchShow: false,
3467
- ruleset: ['[Gen 3] UU', '!NFE Clause'],
3468
- banlist: ['UU'],
3469
- unbanlist: ['Baton Pass'],
3556
+ ruleset: ['Standard'],
3557
+ banlist: ['Uber', 'OU', 'UUBL', 'UU', 'Smeargle + Ingrain'],
3470
3558
  },
3471
3559
  {
3472
3560
  name: "[Gen 3] Doubles OU",
@@ -3480,21 +3568,6 @@ exports.Formats = [
3480
3568
  banlist: ['Uber'],
3481
3569
  unbanlist: ['Deoxys-Speed', 'Wobbuffet', 'Wynaut'],
3482
3570
  },
3483
- {
3484
- name: "[Gen 3] 1v1",
3485
- desc: `Bring three Pok&eacute;mon to Team Preview and choose one to battle.`,
3486
- threads: [
3487
- `&bullet; <a href="https://www.smogon.com/forums/posts/8031456/">ADV 1v1</a>`,
3488
- ],
3489
- mod: 'gen3',
3490
- searchShow: false,
3491
- ruleset: [
3492
- 'Picked Team Size = 1', 'Max Team Size = 3',
3493
- '[Gen 3] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview',
3494
- ],
3495
- banlist: ['Clefable', 'Slaking', 'Snorlax', 'Suicune', 'Destiny Bond', 'Explosion', 'Ingrain', 'Perish Song', 'Self-Destruct', 'Bright Powder', 'Focus Band', 'King\'s Rock', 'Lax Incense', 'Quick Claw'],
3496
- unbanlist: ['Mr. Mime', 'Wobbuffet', 'Wynaut', 'Sand Veil'],
3497
- },
3498
3571
  {
3499
3572
  name: "[Gen 3] Custom Game",
3500
3573
  mod: 'gen3',
@@ -3511,15 +3584,6 @@ exports.Formats = [
3511
3584
  debug: true,
3512
3585
  ruleset: ['HP Percentage Mod', 'Cancel Mod', 'Max Team Size = 24', 'Max Move Count = 24', 'Max Level = 9999', 'Default Level = 100'],
3513
3586
  },
3514
- {
3515
- name: "[Gen 2] Ubers",
3516
- threads: [
3517
- `&bullet; <a href="https://www.smogon.com/forums/posts/8286282/">GSC Ubers</a>`,
3518
- ],
3519
- mod: 'gen2',
3520
- searchShow: false,
3521
- ruleset: ['Standard'],
3522
- },
3523
3587
  {
3524
3588
  name: "[Gen 2] UU",
3525
3589
  threads: [`&bullet; <a href="https://www.smogon.com/forums/threads/3576710/">GSC UU</a>`],
@@ -3582,6 +3646,15 @@ exports.Formats = [
3582
3646
  battle: { trunc: Math.trunc },
3583
3647
  ruleset: ['HP Percentage Mod', 'Cancel Mod', 'Max Team Size = 24', 'Max Move Count = 24', 'Max Level = 9999', 'Default Level = 100'],
3584
3648
  },
3649
+ {
3650
+ name: "[Gen 1] Ubers",
3651
+ threads: [
3652
+ `&bullet; <a href="https://www.smogon.com/forums/posts/8286283/">RBY Ubers</a>`,
3653
+ ],
3654
+ mod: 'gen1',
3655
+ searchShow: false,
3656
+ ruleset: ['Standard'],
3657
+ },
3585
3658
  {
3586
3659
  name: "[Gen 1] UU",
3587
3660
  threads: [
@@ -3590,7 +3663,7 @@ exports.Formats = [
3590
3663
  ],
3591
3664
  mod: 'gen1',
3592
3665
  searchShow: false,
3593
- ruleset: ['[Gen 1] OU'],
3666
+ ruleset: ['[Gen 1] OU', 'APT Clause'],
3594
3667
  banlist: ['OU', 'UUBL'],
3595
3668
  },
3596
3669
  {
@@ -3624,19 +3697,6 @@ exports.Formats = [
3624
3697
  ],
3625
3698
  banlist: ['Uber'],
3626
3699
  },
3627
- {
3628
- name: "[Gen 1] Stadium OU",
3629
- threads: [
3630
- `&bullet; <a href="https://www.smogon.com/forums/threads/3685877/">Stadium OU Viability Rankings</a>`,
3631
- ],
3632
- mod: 'gen1stadium',
3633
- searchShow: false,
3634
- ruleset: ['Standard', 'Team Preview'],
3635
- banlist: ['Uber',
3636
- 'Nidoking + Fury Attack + Thrash', 'Exeggutor + Poison Powder + Stomp', 'Exeggutor + Sleep Powder + Stomp',
3637
- 'Exeggutor + Stun Spore + Stomp', 'Jolteon + Focus Energy + Thunder Shock', 'Flareon + Focus Energy + Ember',
3638
- ],
3639
- },
3640
3700
  {
3641
3701
  name: "[Gen 1] Tradebacks OU",
3642
3702
  desc: `RBY OU with movepool additions from the Time Capsule.`,