@pkmn/sim 0.5.18 → 0.5.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/build/config/formats.js +487 -432
  2. package/build/config/formats.js.map +1 -1
  3. package/build/data/aliases.js +2 -2
  4. package/build/data/aliases.js.map +1 -1
  5. package/build/data/formats-data.js +17 -13
  6. package/build/data/formats-data.js.map +1 -1
  7. package/build/data/learnsets.js +77 -9
  8. package/build/data/learnsets.js.map +1 -1
  9. package/build/data/mods/gen1/conditions.js +4 -0
  10. package/build/data/mods/gen1/conditions.js.map +1 -1
  11. package/build/data/mods/gen1/formats-data.js +3 -3
  12. package/build/data/mods/gen1/formats-data.js.map +1 -1
  13. package/build/data/mods/gen1/moves.js +2 -10
  14. package/build/data/mods/gen1/moves.js.map +1 -1
  15. package/build/data/mods/gen2/learnsets.js +2 -2
  16. package/build/data/mods/gen2/learnsets.js.map +1 -1
  17. package/build/data/mods/gen2/scripts.js +16 -0
  18. package/build/data/mods/gen2/scripts.js.map +1 -1
  19. package/build/data/mods/gen4/formats-data.js +1 -1
  20. package/build/data/mods/gen4/formats-data.js.map +1 -1
  21. package/build/data/mods/gen6/formats-data.js +1 -1
  22. package/build/data/mods/gen6/formats-data.js.map +1 -1
  23. package/build/data/mods/gen6/learnsets.js +0 -75
  24. package/build/data/mods/gen6/learnsets.js.map +1 -1
  25. package/build/data/mods/gen7/formats-data.js +1 -1
  26. package/build/data/mods/gen7/formats-data.js.map +1 -1
  27. package/build/data/moves.js +2 -4
  28. package/build/data/moves.js.map +1 -1
  29. package/build/data/pokedex.js +20 -1
  30. package/build/data/pokedex.js.map +1 -1
  31. package/build/data/rulesets.js +29 -0
  32. package/build/data/rulesets.js.map +1 -1
  33. package/build/data/tags.js +2 -2
  34. package/build/data/tags.js.map +1 -1
  35. package/build/sim/battle.js +1 -7
  36. package/build/sim/battle.js.map +1 -1
  37. package/build/sim/state.d.ts +1 -1
  38. package/build/sim/state.js +6 -6
  39. package/build/sim/state.js.map +1 -1
  40. package/build/sim/teams.d.ts +2 -2
  41. package/config/formats.ts +352 -302
  42. package/data/aliases.ts +2 -2
  43. package/data/formats-data.ts +17 -13
  44. package/data/learnsets.ts +77 -9
  45. package/data/mods/gen1/conditions.ts +4 -0
  46. package/data/mods/gen1/formats-data.ts +3 -3
  47. package/data/mods/gen1/moves.ts +2 -9
  48. package/data/mods/gen2/learnsets.ts +2 -2
  49. package/data/mods/gen2/scripts.ts +16 -0
  50. package/data/mods/gen4/formats-data.ts +1 -1
  51. package/data/mods/gen6/formats-data.ts +1 -1
  52. package/data/mods/gen6/learnsets.ts +0 -75
  53. package/data/mods/gen7/formats-data.ts +1 -1
  54. package/data/moves.ts +2 -4
  55. package/data/pokedex.ts +20 -1
  56. package/data/rulesets.ts +28 -0
  57. package/data/tags.ts +2 -2
  58. package/package.json +1 -1
  59. package/sim/battle.ts +1 -7
package/config/formats.ts CHANGED
@@ -167,7 +167,7 @@ export const Formats: FormatList = [
167
167
  mod: 'gen8',
168
168
  ruleset: ['Little Cup', 'Standard', 'Dynamax Clause'],
169
169
  banlist: [
170
- 'Corsola-Galar', 'Cutiefly', 'Drifloon', 'Gastly', 'Gothita', 'Rufflet', 'Scraggy', 'Scyther', 'Sneasel', 'Swirlix', 'Tangela', 'Vullaby', 'Vulpix-Alola', 'Woobat', 'Zigzagoon-Base',
170
+ 'Corsola-Galar', 'Cutiefly', 'Drifloon', 'Gastly', 'Gothita', 'Rufflet', 'Scraggy', 'Scyther', 'Sneasel', 'Swirlix', 'Tangela', 'Vulpix-Alola', 'Woobat', 'Zigzagoon-Base',
171
171
  'Chlorophyll', 'Moody', 'Baton Pass', 'Sticky Web',
172
172
  ],
173
173
  },
@@ -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', 'Vullaby',
256
256
  // LC UUBL
257
257
  'Archen', 'Farfetch\u2019d-Galar', 'Scorbunny', 'Shellder', 'Wingull',
258
258
  ],
@@ -289,6 +289,15 @@ export const Formats: FormatList = [
289
289
  ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 8', 'Limit Two Restricted'],
290
290
  restricted: ['Restricted Legendary'],
291
291
  },
292
+ {
293
+ name: "[Gen 8] Single Battle Cup",
294
+ threads: [
295
+ `&bullet; <a href="https://www.pokemon.com/us/pokemon-news/register-now-for-the-single-battle-cup-competition/">Single Battle Cup</a>`,
296
+ ],
297
+
298
+ mod: 'gen8',
299
+ ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 8'],
300
+ },
292
301
  {
293
302
  name: "[Gen 8] Custom Game",
294
303
 
@@ -404,10 +413,10 @@ export const Formats: FormatList = [
404
413
  'Standard Doubles', 'Accuracy Moves Clause', 'Dynamax Clause', 'Sleep Clause Mod',
405
414
  ],
406
415
  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',
416
+ 'Calyrex-Ice', 'Calyrex-Shadow', 'Cottonee', 'Dialga', 'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Jirachi', 'Kyogre',
417
+ 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Rayquaza',
418
+ 'Reshiram', 'Solgaleo', 'Tornadus-Base', 'Urshifu-Base', 'Urshifu-Rapid-Strike', 'Whimsicott', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned',
419
+ 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Moody', 'Power Construct', 'Focus Sash', 'Ally Switch', 'Final Gambit', 'Perish Song', 'Swagger',
411
420
  ],
412
421
  },
413
422
  {
@@ -616,47 +625,261 @@ export const Formats: FormatList = [
616
625
  column: 2,
617
626
  },
618
627
  {
619
- name: "[Gen 8] Crazyhouse",
620
- desc: `Pok&eacute;mon you KO are added to your team and removed from the opponent's, and vice versa.`,
628
+ name: "[Gen 8] Broken Record",
629
+ desc: `Pok&eacute;mon can hold a TR to use that move in battle.`,
621
630
  threads: [
622
- `&bullet; <a href="https://www.smogon.com/forums/threads/3699268/">Crazyhouse</a>`,
631
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3701270/">Broken Record</a>`,
623
632
  ],
624
633
 
625
634
  mod: 'gen8',
626
- ruleset: ['Standard', 'Crazyhouse Rule', 'Dynamax Clause', 'Sleep Moves Clause', 'Evasion Abilities Clause', '!Sleep Clause Mod'],
635
+ ruleset: ['Standard', '!Sleep Clause Mod', 'Sleep Moves Clause', 'Dynamax Clause'],
627
636
  banlist: [
628
- 'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Eternatus', 'Genesect', 'Giratina',
629
- 'Giratina-Origin', 'Groudon', 'Hawlucha', 'Ho-Oh', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia',
630
- 'Lunala', 'Magearna', 'Marshadow', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa',
631
- 'Rayquaza', 'Reshiram', 'Solgaleo', 'Spectrier', 'Urshifu-Base', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta',
632
- 'Zamazenta-Crowned', 'Zekrom', 'Zygarde-Base', 'Arena Trap', 'Moody', 'Power Construct', 'Shadow Tag', 'Bright Powder',
633
- 'King\'s Rock', 'Lax Incense', 'Baton Pass', 'Explosion', 'Final Gambit', 'Healing Wish', 'Lunar Dance', 'Memento',
634
- 'Misty Explosion', 'Self-Destruct',
637
+ 'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Eternatus', 'Genesect', 'Giratina', 'Giratina-Origin',
638
+ 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala', 'Magearna', 'Marshadow',
639
+ 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Regieleki', 'Reshiram', 'Solgaleo',
640
+ 'Spectrier', 'Urshifu-Base', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Zygarde-Base',
641
+ 'Arena Trap', 'Magnet Pull', 'Moody', 'Power Construct', 'Shadow Tag', 'TR29 (Baton Pass)', 'TR82 (Stored Power)', 'Baton Pass',
635
642
  ],
643
+ onValidateSet(set) {
644
+ if (!set.item) return;
645
+ const item = this.dex.items.get(set.item);
646
+ if (!/^tr\d\d/i.test(item.name)) return;
647
+ const moveName = item.desc.split('move ')[1].split('.')[0];
648
+ if (set.moves.map(this.toID).includes(this.toID(moveName))) {
649
+ return [
650
+ `${set.species} can't run ${item.name} (${moveName}) as its item because it already has that move in its moveset.`,
651
+ ];
652
+ }
653
+ },
654
+ onValidateTeam(team) {
655
+ const trs = new Set<string>();
656
+ for (const set of team) {
657
+ if (!set.item) continue;
658
+ const item = this.dex.items.get(set.item).name;
659
+ if (!/^tr\d\d/i.test(item)) continue;
660
+ if (trs.has(item)) {
661
+ return [`Your team already has a Pok\u00e9mon with ${item}.`];
662
+ }
663
+ trs.add(item);
664
+ }
665
+ },
666
+ onTakeItem(item) {
667
+ return !/^tr\d\d/i.test(item.name);
668
+ },
669
+ onModifyMove(move) {
670
+ if (move.id === 'knockoff') {
671
+ move.onBasePower = function (basePower, source, target, m) {
672
+ const item = target.getItem();
673
+ if (!this.singleEvent('TakeItem', item, target.itemState, target, target, m, item)) return;
674
+ // Very hardcode but I'd prefer to not make a mod for one damage calculation change
675
+ if (item.id && !/^tr\d\d/i.test(item.id)) {
676
+ return this.chainModify(1.5);
677
+ }
678
+ };
679
+ }
680
+ },
681
+ onBegin() {
682
+ for (const pokemon of this.getAllPokemon()) {
683
+ const item = pokemon.getItem();
684
+ if (/^tr\d\d/i.test(item.name)) {
685
+ const move = this.dex.moves.get(item.desc.split('move ')[1].split('.')[0]);
686
+ pokemon.moveSlots = (pokemon as any).baseMoveSlots = [
687
+ ...pokemon.baseMoveSlots, {
688
+ id: move.id,
689
+ move: move.name,
690
+ pp: move.pp * 8 / 5,
691
+ maxpp: move.pp * 8 / 5,
692
+ target: move.target,
693
+ disabled: false,
694
+ disabledSource: '',
695
+ used: false,
696
+ },
697
+ ];
698
+ }
699
+ }
700
+ },
636
701
  },
637
702
  {
638
- name: "[Gen 8] Pokebilities AAA",
639
- desc: `Pok&eacute;mon have all of their released abilities simultaneously alongside any additional ability.`,
703
+ name: "[Gen 8] Inheritance",
704
+ desc: `Pok&eacute;mon may use the ability and moves of another, as long as they forfeit their own learnset.`,
640
705
  threads: [
641
- `&bullet; <a href="https://www.smogon.com/forums/posts/8821047">Pok&eacute;bilities AAA</a>`,
706
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3656811/">Inheritance</a>`,
642
707
  ],
643
708
 
644
- mod: 'pokebilities',
645
- ruleset: ['[Gen 8] Pokebilities', '!Obtainable Abilities', 'AAA Restricted Abilities', '2 Ability Clause', 'Sleep Moves Clause', '!Sleep Clause Mod'],
709
+ mod: 'gen8',
710
+ // searchShow: false,
711
+ ruleset: ['Standard', '!Sleep Clause Mod', 'Sleep Moves Clause', '2 Ability Clause', 'Dynamax Clause'],
646
712
  banlist: [
647
- 'Alakazam', 'Blacephalon', 'Buzzwole', 'Clefable', 'Dragapult', 'Dragonite', 'Gengar', 'Kartana', 'Keldeo', 'Kyurem', 'Melmetal', 'Mienshao',
648
- 'Noivern', 'Obstagoon', 'Perrserker', 'Rillaboom', 'Tapu Lele', 'Urshifu', 'Urshifu-Rapid-Strike', 'Victini', 'Weavile', 'Zamazenta-Crowned',
649
- 'Zapdos-Galar', 'Arena Trap', 'Moody', 'Shadow Tag', 'Wonder Guard', 'Chlorophyll + Desolate Land', 'Chlorophyll + Drought', 'Electric Surge + Surge Surfer',
650
- 'Regenerator + Emergency Exit', 'Regenerator + Multiscale', 'Regenerator + Shadow Shield', 'Regenerator + Wimp Out', 'Sand Rush + Sand Stream',
651
- 'Slush Rush + Snow Warning', 'Swift Swim + Drizzle', 'Swift Swim + Primordial Sea', 'Snow Cloak + Snow Warning', 'Sand Veil + Sand Stream',
652
- 'Regenerator > 2', 'Bright Powder', 'Lax Incense', 'Quick Claw',
653
- ],
654
- restricted: [
655
- 'Comatose', 'Contrary', 'Fluffy', 'Fur Coat', 'Gorilla Tactics', 'Huge Power', 'Ice Scales', 'Illusion', 'Imposter', 'Innards Out',
656
- 'Intrepid Sword', 'Libero', 'Magnet Pull', 'Neutralizing Gas', 'Parental Bond', 'Poison Heal', 'Prankster', 'Protean', 'Pure Power',
657
- 'Quick Draw', 'Sand Veil', 'Serene Grace', 'Simple', 'Snow Cloak', 'Speed Boost', 'Stakeout', 'Stench', 'Tinted Lens', 'Triage',
658
- 'Unburden', 'Water Bubble',
713
+ 'Blacephalon', 'Blaziken', 'Butterfree', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chansey', 'Combusken', 'Cresselia', 'Darmanitan-Galar', 'Dialga', 'Dracovish',
714
+ 'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala',
715
+ 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Natu', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Regieleki',
716
+ 'Regigigas', 'Reshiram', 'Sableye', 'Shedinja', 'Solgaleo', 'Spectrier', 'Tapu Koko', 'Toxtricity', 'Torkoal', 'Urshifu-Base', 'Xatu', 'Xerneas', 'Yveltal',
717
+ 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zeraora', 'Zekrom', 'Arena Trap', 'Contrary', 'Drizzle', 'Huge Power', 'Imposter', 'Innards Out',
718
+ 'Libero', 'Moody', 'Power Construct', 'Pure Power', 'Quick Draw', 'Shadow Tag', 'Sheer Force', 'Simple', 'Unaware', 'Unburden', 'Water Bubble', 'King\'s Rock',
719
+ 'Quick Claw', 'Baton Pass', 'Bolt Beak', 'Fishious Rend', 'Shell Smash', 'Thousand Arrows',
659
720
  ],
721
+ getEvoFamily(speciesid) {
722
+ let species = Dex.species.get(speciesid);
723
+ while (species.prevo) {
724
+ species = Dex.species.get(species.prevo);
725
+ }
726
+ return species.id;
727
+ },
728
+ validateSet(set, teamHas) {
729
+ const unreleased = (pokemon: Species) => pokemon.tier === "Unreleased" && pokemon.isNonstandard === "Unobtainable";
730
+ if (!teamHas.abilityMap) {
731
+ teamHas.abilityMap = Object.create(null);
732
+ for (const pokemon of Dex.species.all()) {
733
+ if (pokemon.isNonstandard || unreleased(pokemon)) continue;
734
+ if (pokemon.requiredAbility || pokemon.requiredItem || pokemon.requiredMove) continue;
735
+ if (this.ruleTable.isBannedSpecies(pokemon)) continue;
736
+
737
+ for (const key of Object.values(pokemon.abilities)) {
738
+ const abilityId = this.dex.toID(key);
739
+ if (abilityId in teamHas.abilityMap) {
740
+ teamHas.abilityMap[abilityId][pokemon.evos ? 'push' : 'unshift'](pokemon.id);
741
+ } else {
742
+ teamHas.abilityMap[abilityId] = [pokemon.id];
743
+ }
744
+ }
745
+ }
746
+ }
747
+
748
+ const problem = this.validateForme(set);
749
+ if (problem.length) return problem;
750
+
751
+ const species = this.dex.species.get(set.species);
752
+ if (!species.exists || species.num < 1) return [`The Pok\u00e9mon "${set.species}" does not exist.`];
753
+ if (species.isNonstandard || unreleased(species)) {
754
+ return [`${species.name} is not obtainable in Generation ${this.dex.gen}.`];
755
+ }
756
+
757
+ const name = set.name;
758
+ if (this.ruleTable.isBannedSpecies(species)) {
759
+ return this.validateSet(set, teamHas);
760
+ }
761
+
762
+ const ability = this.dex.abilities.get(set.ability);
763
+ if (!ability.exists || ability.isNonstandard) return [`${name} needs to have a valid ability.`];
764
+ const pokemonWithAbility = teamHas.abilityMap[ability.id];
765
+ if (!pokemonWithAbility) return [`${ability.name} is not available on a legal Pok\u00e9mon.`];
766
+
767
+ (this.format as any).debug = true;
768
+
769
+ if (!teamHas.abilitySources) teamHas.abilitySources = Object.create(null);
770
+ const validSources: string[] = teamHas.abilitySources[this.dex.toID(set.species)] = []; // Evolution families
771
+
772
+ let canonicalSource = ''; // Specific for the basic implementation of Donor Clause (see onValidateTeam).
773
+
774
+ for (const donor of pokemonWithAbility) {
775
+ const donorSpecies = this.dex.species.get(donor);
776
+ let format = this.format;
777
+ if (!format.getEvoFamily) format = this.dex.formats.get('gen8inheritance');
778
+ const evoFamily = format.getEvoFamily!(donorSpecies.id);
779
+ if (validSources.includes(evoFamily)) continue;
780
+
781
+ set.species = donorSpecies.name;
782
+ set.name = donorSpecies.baseSpecies;
783
+ const problems = this.validateSet(set, teamHas) || [];
784
+ if (!problems.length) {
785
+ validSources.push(evoFamily);
786
+ canonicalSource = donorSpecies.name;
787
+ }
788
+ // Specific for the basic implementation of Donor Clause (see onValidateTeam).
789
+ if (validSources.length > 1) break;
790
+ }
791
+ (this.format as any).debug = false;
792
+
793
+ set.name = name;
794
+ set.species = species.name;
795
+ if (!validSources.length) {
796
+ if (pokemonWithAbility.length > 1) return [`${name}'s set is illegal.`];
797
+ return [`${name} has an illegal set with an ability from ${this.dex.species.get(pokemonWithAbility[0]).name}.`];
798
+ }
799
+
800
+ // Protocol: Include the data of the donor species in the `ability` data slot.
801
+ // Afterwards, we are going to reset the name to what the user intended.
802
+ set.ability = `${set.ability}0${canonicalSource}`;
803
+ return null;
804
+ },
805
+ onValidateTeam(team, f, teamHas) {
806
+ if (this.ruleTable.has('2abilityclause')) {
807
+ const abilityTable = new Map<string, number>();
808
+ const base: {[k: string]: string} = {
809
+ airlock: 'cloudnine',
810
+ battlearmor: 'shellarmor',
811
+ clearbody: 'whitesmoke',
812
+ dazzling: 'queenlymajesty',
813
+ emergencyexit: 'wimpout',
814
+ filter: 'solidrock',
815
+ gooey: 'tanglinghair',
816
+ insomnia: 'vitalspirit',
817
+ ironbarbs: 'roughskin',
818
+ libero: 'protean',
819
+ minus: 'plus',
820
+ moxie: 'chillingneigh',
821
+ powerofalchemy: 'receiver',
822
+ propellertail: 'stalwart',
823
+ teravolt: 'moldbreaker',
824
+ turboblaze: 'moldbreaker',
825
+ };
826
+ for (const set of team) {
827
+ let ability = this.toID(set.ability.split('0')[0]);
828
+ if (!ability) continue;
829
+ if (ability in base) ability = base[ability] as ID;
830
+ if ((abilityTable.get(ability) || 0) >= 2) {
831
+ return [
832
+ `You are limited to two of each ability by 2 Ability Clause.`,
833
+ `(You have more than two ${this.dex.abilities.get(ability).name} variants)`,
834
+ ];
835
+ }
836
+ abilityTable.set(ability, (abilityTable.get(ability) || 0) + 1);
837
+ }
838
+ }
839
+
840
+ // Donor Clause
841
+ const evoFamilyLists = [];
842
+ for (const set of team) {
843
+ const abilitySources = teamHas.abilitySources?.[this.dex.toID(set.species)];
844
+ if (!abilitySources) continue;
845
+ let format = this.format;
846
+ if (!format.getEvoFamily) format = this.dex.formats.get('gen8inheritance');
847
+ evoFamilyLists.push(abilitySources.map(format.getEvoFamily!));
848
+ }
849
+
850
+ // Checking actual full incompatibility would require expensive algebra.
851
+ // Instead, we only check the trivial case of multiple Pokémon only legal for exactly one family. FIXME?
852
+ const requiredFamilies = Object.create(null);
853
+ for (const evoFamilies of evoFamilyLists) {
854
+ if (evoFamilies.length !== 1) continue;
855
+ const [familyId] = evoFamilies;
856
+ if (!(familyId in requiredFamilies)) requiredFamilies[familyId] = 1;
857
+ requiredFamilies[familyId]++;
858
+ if (requiredFamilies[familyId] > 2) {
859
+ return [
860
+ `You are limited to up to two inheritances from each evolution family by the Donor Clause.`,
861
+ `(You inherit more than twice from ${this.dex.species.get(familyId).name}).`,
862
+ ];
863
+ }
864
+ }
865
+ },
866
+ onBegin() {
867
+ for (const pokemon of this.getAllPokemon()) {
868
+ if (pokemon.baseAbility.includes('0')) {
869
+ const donor = pokemon.baseAbility.split('0')[1];
870
+ pokemon.m.donor = this.toID(donor);
871
+ pokemon.baseAbility = this.toID(pokemon.baseAbility.split('0')[0]);
872
+ pokemon.ability = pokemon.baseAbility;
873
+ }
874
+ }
875
+ },
876
+ onSwitchIn(pokemon) {
877
+ if (!pokemon.m.donor) return;
878
+ const donorTemplate = this.dex.species.get(pokemon.m.donor);
879
+ if (!donorTemplate.exists) return;
880
+ // Place volatiles on the Pokémon to show the donor details.
881
+ this.add('-start', pokemon, donorTemplate.name, '[silent]');
882
+ },
660
883
  },
661
884
 
662
885
  // Other Metagames
@@ -680,8 +903,8 @@ export const Formats: FormatList = [
680
903
  'Calyrex-Shadow', 'Cramorant-Gorging', 'Darmanitan-Galar-Zen', 'Eternatus-Eternamax', 'Shedinja', 'Zacian-Crowned',
681
904
  'Arena Trap', 'Contrary', 'Gorilla Tactics', 'Huge Power', 'Illusion', 'Innards Out', 'Intrepid Sword', 'Libero',
682
905
  'Magnet Pull', 'Moody', 'Neutralizing Gas', 'Parental Bond', 'Protean', 'Pure Power', 'Shadow Tag', 'Stakeout',
683
- 'Water Bubble', 'Wonder Guard', 'Comatose + Sleep Talk', 'Rusted Sword', 'Court Change', 'Bolt Beak', 'Double Iron Bash',
684
- 'Octolock', 'Shell Smash',
906
+ 'Water Bubble', 'Wonder Guard', 'Comatose + Sleep Talk', 'Rusted Sword', 'Belly Drum', 'Bolt Beak', 'Court Change',
907
+ 'Double Iron Bash', 'Octolock', 'Shell Smash',
685
908
  ],
686
909
  },
687
910
  {
@@ -695,8 +918,8 @@ export const Formats: FormatList = [
695
918
  mod: 'gen8',
696
919
  ruleset: ['Standard', '!Obtainable Abilities', '2 Ability Clause', 'Dynamax Clause', 'Sleep Moves Clause', '!Sleep Clause Mod'],
697
920
  banlist: [
698
- 'Archeops', 'Blacephalon', 'Buzzwole', 'Calyrex-Ice', 'Calyrex-Shadow', 'Dialga', 'Dracovish', 'Dragapult', 'Dragonite', 'Eternatus',
699
- 'Gengar', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Keldeo', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White',
921
+ 'Archeops', 'Blacephalon', 'Buzzwole', 'Calyrex-Ice', 'Calyrex-Shadow', 'Dialga', 'Dracovish', 'Dragapult', 'Dragonite', 'Eternatus', 'Gengar',
922
+ 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Keldeo', 'Kommo-o', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White',
700
923
  'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Noivern',
701
924
  'Palkia', 'Pheromosa', 'Rayquaza', 'Regigigas', 'Reshiram', 'Shedinja', 'Solgaleo', 'Spectrier', 'Urshifu', 'Urshifu-Rapid-Strike',
702
925
  'Victini', 'Weavile', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Base', 'Zekrom', 'Zeraora', 'Zygarde-Base',
@@ -793,9 +1016,9 @@ export const Formats: FormatList = [
793
1016
  'Arena Trap', 'Magnet Pull', 'Moody', 'Power Construct', 'Shadow Tag', 'King\'s Rock', 'Baton Pass',
794
1017
  ],
795
1018
  restricted: [
796
- 'Acupressure', 'Astral Barrage', 'Belly Drum', 'Bolt Beak', 'Clangorous Soul', 'Double Iron Bash', 'Electrify', 'Extreme Speed', 'Fishious Rend',
797
- 'Geomancy', 'Glacial Lance', 'Oblivion Wing', 'Precipice Blades', 'Shell Smash', 'Shift Gear', 'Thousand Arrows', 'Thunderous Kick', 'V-create',
798
- 'Wicked Blow',
1019
+ 'Acupressure', 'Astral Barrage', 'Belly Drum', 'Bolt Beak', 'Clangorous Soul', 'Double Iron Bash', 'Electrify', 'Extreme Speed', 'Final Gambit',
1020
+ 'Fishious Rend', 'Geomancy', 'Glacial Lance', 'Oblivion Wing', 'Precipice Blades', 'Shell Smash', 'Shift Gear', 'Thousand Arrows', 'Thunderous Kick',
1021
+ 'V-create', 'Wicked Blow',
799
1022
  ],
800
1023
  },
801
1024
  {
@@ -990,7 +1213,7 @@ export const Formats: FormatList = [
990
1213
 
991
1214
  mod: 'gen8bdsp',
992
1215
  ruleset: ['Little Cup', 'Standard'],
993
- banlist: ['Gligar', 'Meditite', 'Misdreavus', 'Murkrow', 'Scyther', 'Sneasel', 'Tangela', 'Vulpix', 'Yanma', 'Moody', 'Baton Pass', 'Sticky Web'],
1216
+ banlist: ['Gligar', 'Meditite', 'Misdreavus', 'Munchlax', 'Murkrow', 'Scyther', 'Sneasel', 'Tangela', 'Vulpix', 'Yanma', 'Moody', 'Baton Pass', 'Sticky Web'],
994
1217
  },
995
1218
  {
996
1219
  name: "[Gen 8 BDSP] Monotype",
@@ -1212,188 +1435,6 @@ export const Formats: FormatList = [
1212
1435
  }
1213
1436
  },
1214
1437
  },
1215
- {
1216
- name: "[Gen 8] Inheritance",
1217
- desc: `Pok&eacute;mon may use the ability and moves of another, as long as they forfeit their own learnset.`,
1218
- threads: [
1219
- `&bullet; <a href="https://www.smogon.com/forums/threads/3656811/">Inheritance</a>`,
1220
- ],
1221
-
1222
- mod: 'gen8',
1223
- searchShow: false,
1224
- ruleset: ['Standard', '2 Ability Clause', 'Dynamax Clause'],
1225
- banlist: [
1226
- 'Blacephalon', 'Blaziken', 'Butterfree', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chansey', 'Combusken', 'Cresselia', 'Darmanitan-Galar', 'Dialga', 'Dracovish',
1227
- 'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala',
1228
- 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Natu', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Regieleki',
1229
- 'Regigigas', 'Reshiram', 'Sableye', 'Shedinja', 'Solgaleo', 'Spectrier', 'Tapu Koko', 'Toxtricity', 'Torkoal', 'Urshifu-Base', 'Xatu', 'Xerneas', 'Yveltal',
1230
- 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zeraora', 'Zekrom', 'Arena Trap', 'Contrary', 'Drizzle', 'Huge Power', 'Imposter', 'Innards Out',
1231
- 'Libero', 'Moody', 'Power Construct', 'Pure Power', 'Quick Draw', 'Shadow Tag', 'Sheer Force', 'Simple', 'Unaware', 'Unburden', 'Water Bubble', 'King\'s Rock',
1232
- 'Quick Claw', 'Baton Pass', 'Bolt Beak', 'Fishious Rend', 'Shell Smash', 'Thousand Arrows',
1233
- ],
1234
- getEvoFamily(speciesid) {
1235
- let species = Dex.species.get(speciesid);
1236
- while (species.prevo) {
1237
- species = Dex.species.get(species.prevo);
1238
- }
1239
- return species.id;
1240
- },
1241
- validateSet(set, teamHas) {
1242
- const unreleased = (pokemon: Species) => pokemon.tier === "Unreleased" && pokemon.isNonstandard === "Unobtainable";
1243
- if (!teamHas.abilityMap) {
1244
- teamHas.abilityMap = Object.create(null);
1245
- for (const pokemon of Dex.species.all()) {
1246
- if (pokemon.isNonstandard || unreleased(pokemon)) continue;
1247
- if (pokemon.requiredAbility || pokemon.requiredItem || pokemon.requiredMove) continue;
1248
- if (this.ruleTable.isBannedSpecies(pokemon)) continue;
1249
-
1250
- for (const key of Object.values(pokemon.abilities)) {
1251
- const abilityId = this.dex.toID(key);
1252
- if (abilityId in teamHas.abilityMap) {
1253
- teamHas.abilityMap[abilityId][pokemon.evos ? 'push' : 'unshift'](pokemon.id);
1254
- } else {
1255
- teamHas.abilityMap[abilityId] = [pokemon.id];
1256
- }
1257
- }
1258
- }
1259
- }
1260
-
1261
- const problem = this.validateForme(set);
1262
- if (problem.length) return problem;
1263
-
1264
- const species = this.dex.species.get(set.species);
1265
- if (!species.exists || species.num < 1) return [`The Pok\u00e9mon "${set.species}" does not exist.`];
1266
- if (species.isNonstandard || unreleased(species)) {
1267
- return [`${species.name} is not obtainable in Generation ${this.dex.gen}.`];
1268
- }
1269
-
1270
- const name = set.name;
1271
- if (this.ruleTable.isBannedSpecies(species)) {
1272
- return this.validateSet(set, teamHas);
1273
- }
1274
-
1275
- const ability = this.dex.abilities.get(set.ability);
1276
- if (!ability.exists || ability.isNonstandard) return [`${name} needs to have a valid ability.`];
1277
- const pokemonWithAbility = teamHas.abilityMap[ability.id];
1278
- if (!pokemonWithAbility) return [`${ability.name} is not available on a legal Pok\u00e9mon.`];
1279
-
1280
- (this.format as any).debug = true;
1281
-
1282
- if (!teamHas.abilitySources) teamHas.abilitySources = Object.create(null);
1283
- const validSources: string[] = teamHas.abilitySources[this.dex.toID(set.species)] = []; // Evolution families
1284
-
1285
- let canonicalSource = ''; // Specific for the basic implementation of Donor Clause (see onValidateTeam).
1286
-
1287
- for (const donor of pokemonWithAbility) {
1288
- const donorSpecies = this.dex.species.get(donor);
1289
- let format = this.format;
1290
- if (!format.getEvoFamily) format = this.dex.formats.get('gen8inheritance');
1291
- const evoFamily = format.getEvoFamily!(donorSpecies.id);
1292
- if (validSources.includes(evoFamily)) continue;
1293
-
1294
- set.species = donorSpecies.name;
1295
- set.name = donorSpecies.baseSpecies;
1296
- const problems = this.validateSet(set, teamHas) || [];
1297
- if (!problems.length) {
1298
- validSources.push(evoFamily);
1299
- canonicalSource = donorSpecies.name;
1300
- }
1301
- // Specific for the basic implementation of Donor Clause (see onValidateTeam).
1302
- if (validSources.length > 1) break;
1303
- }
1304
- (this.format as any).debug = false;
1305
-
1306
- set.name = name;
1307
- set.species = species.name;
1308
- if (!validSources.length) {
1309
- if (pokemonWithAbility.length > 1) return [`${name}'s set is illegal.`];
1310
- return [`${name} has an illegal set with an ability from ${this.dex.species.get(pokemonWithAbility[0]).name}.`];
1311
- }
1312
-
1313
- // Protocol: Include the data of the donor species in the `ability` data slot.
1314
- // Afterwards, we are going to reset the name to what the user intended.
1315
- set.ability = `${set.ability}0${canonicalSource}`;
1316
- return null;
1317
- },
1318
- onValidateTeam(team, f, teamHas) {
1319
- if (this.ruleTable.has('2abilityclause')) {
1320
- const abilityTable = new Map<string, number>();
1321
- const base: {[k: string]: string} = {
1322
- airlock: 'cloudnine',
1323
- battlearmor: 'shellarmor',
1324
- clearbody: 'whitesmoke',
1325
- dazzling: 'queenlymajesty',
1326
- emergencyexit: 'wimpout',
1327
- filter: 'solidrock',
1328
- gooey: 'tanglinghair',
1329
- insomnia: 'vitalspirit',
1330
- ironbarbs: 'roughskin',
1331
- libero: 'protean',
1332
- minus: 'plus',
1333
- moxie: 'chillingneigh',
1334
- powerofalchemy: 'receiver',
1335
- propellertail: 'stalwart',
1336
- teravolt: 'moldbreaker',
1337
- turboblaze: 'moldbreaker',
1338
- };
1339
- for (const set of team) {
1340
- let ability = this.toID(set.ability.split('0')[0]);
1341
- if (!ability) continue;
1342
- if (ability in base) ability = base[ability] as ID;
1343
- if ((abilityTable.get(ability) || 0) >= 2) {
1344
- return [
1345
- `You are limited to two of each ability by 2 Ability Clause.`,
1346
- `(You have more than two ${this.dex.abilities.get(ability).name} variants)`,
1347
- ];
1348
- }
1349
- abilityTable.set(ability, (abilityTable.get(ability) || 0) + 1);
1350
- }
1351
- }
1352
-
1353
- // Donor Clause
1354
- const evoFamilyLists = [];
1355
- for (const set of team) {
1356
- const abilitySources = teamHas.abilitySources?.[this.dex.toID(set.species)];
1357
- if (!abilitySources) continue;
1358
- let format = this.format;
1359
- if (!format.getEvoFamily) format = this.dex.formats.get('gen8inheritance');
1360
- evoFamilyLists.push(abilitySources.map(format.getEvoFamily!));
1361
- }
1362
-
1363
- // Checking actual full incompatibility would require expensive algebra.
1364
- // Instead, we only check the trivial case of multiple Pokémon only legal for exactly one family. FIXME?
1365
- const requiredFamilies = Object.create(null);
1366
- for (const evoFamilies of evoFamilyLists) {
1367
- if (evoFamilies.length !== 1) continue;
1368
- const [familyId] = evoFamilies;
1369
- if (!(familyId in requiredFamilies)) requiredFamilies[familyId] = 1;
1370
- requiredFamilies[familyId]++;
1371
- if (requiredFamilies[familyId] > 2) {
1372
- return [
1373
- `You are limited to up to two inheritances from each evolution family by the Donor Clause.`,
1374
- `(You inherit more than twice from ${this.dex.species.get(familyId).name}).`,
1375
- ];
1376
- }
1377
- }
1378
- },
1379
- onBegin() {
1380
- for (const pokemon of this.getAllPokemon()) {
1381
- if (pokemon.baseAbility.includes('0')) {
1382
- const donor = pokemon.baseAbility.split('0')[1];
1383
- pokemon.m.donor = this.toID(donor);
1384
- pokemon.baseAbility = this.toID(pokemon.baseAbility.split('0')[0]);
1385
- pokemon.ability = pokemon.baseAbility;
1386
- }
1387
- }
1388
- },
1389
- onSwitchIn(pokemon) {
1390
- if (!pokemon.m.donor) return;
1391
- const donorTemplate = this.dex.species.get(pokemon.m.donor);
1392
- if (!donorTemplate.exists) return;
1393
- // Place volatiles on the Pokémon to show the donor details.
1394
- this.add('-start', pokemon, donorTemplate.name, '[silent]');
1395
- },
1396
- },
1397
1438
  {
1398
1439
  name: "[Gen 8] Linked",
1399
1440
  desc: `The first two moves in a Pok&eacute;mon's moveset are used simultaneously.`,
@@ -2126,7 +2167,18 @@ export const Formats: FormatList = [
2126
2167
  mod: 'ssb',
2127
2168
  team: 'randomStaffBros',
2128
2169
  ruleset: ['Dynamax Clause', 'HP Percentage Mod', 'Cancel Mod', 'Sleep Clause Mod'],
2129
- onBegin() { // TODO look into making an event to put this right after turn|1
2170
+ onBegin() {
2171
+ if (!this.ruleTable.has('dynamaxclause')) {
2172
+ // Old joke format we're bringing back
2173
+ for (const side of this.sides) {
2174
+ side.dynamaxUsed = true;
2175
+ }
2176
+ this.add('message', 'Delphox only');
2177
+ this.add('message', 'No items');
2178
+ this.add('message', 'Final Destination');
2179
+ return;
2180
+ }
2181
+ // TODO look into making an event to put this right after turn|1
2130
2182
  // https://discordapp.com/channels/630837856075513856/630845310033330206/716126469528485909
2131
2183
  // Requires client change
2132
2184
  this.add(`raw|<div class='broadcast-green'><b>Wondering what all these custom moves, abilities, and items do?<br />Check out the <a href="https://www.smogon.com/articles/super-staff-bros-4" target="_blank">Super Staff Bros 4 Guide</a> or use /ssb to find out!</b></div>`);
@@ -2235,7 +2287,7 @@ export const Formats: FormatList = [
2235
2287
 
2236
2288
  mod: 'gen7',
2237
2289
  team: 'random',
2238
- ruleset: ['Obtainable', 'Sleep Clause Mod', 'HP Percentage Mod', 'Cancel Mod'],
2290
+ ruleset: ['Obtainable', 'Sleep Clause Mod', 'HP Percentage Mod', 'Cancel Mod', 'Mega Rayquaza Clause'],
2239
2291
  },
2240
2292
  {
2241
2293
  name: "[Gen 7] Random Doubles Battle",
@@ -2298,7 +2350,7 @@ export const Formats: FormatList = [
2298
2350
 
2299
2351
  mod: 'gen6',
2300
2352
  team: 'random',
2301
- ruleset: ['Obtainable', 'Sleep Clause Mod', 'HP Percentage Mod', 'Cancel Mod'],
2353
+ ruleset: ['Obtainable', 'Sleep Clause Mod', 'HP Percentage Mod', 'Cancel Mod', 'Mega Rayquaza Clause'],
2302
2354
  },
2303
2355
  {
2304
2356
  name: "[Gen 6] Battle Factory",
@@ -2382,36 +2434,44 @@ export const Formats: FormatList = [
2382
2434
  column: 3,
2383
2435
  },
2384
2436
  {
2385
- name: "[Gen 6] UU",
2437
+ name: "[Gen 2] Ubers",
2386
2438
  threads: [
2387
- `&bullet; <a href="https://www.smogon.com/dex/xy/formats/uu/">ORAS UU Banlist</a>`,
2388
- `&bullet; <a href="https://www.smogon.com/forums/threads/3598164/">ORAS UU Viability Rankings</a>`,
2439
+ `&bullet; <a href="https://www.smogon.com/forums/posts/8286282/">GSC Ubers</a>`,
2389
2440
  ],
2390
2441
 
2391
- mod: 'gen6',
2442
+ mod: 'gen2',
2392
2443
  // searchShow: false,
2393
- ruleset: ['[Gen 6] OU'],
2394
- banlist: ['OU', 'UUBL', 'Drizzle', 'Drought'],
2444
+ ruleset: ['Standard'],
2395
2445
  },
2396
2446
  {
2397
- name: "[Gen 4] Anything Goes",
2447
+ name: "[Gen 3] 1v1",
2448
+ desc: `Bring three Pok&eacute;mon to Team Preview and choose one to battle.`,
2449
+ threads: [
2450
+ `&bullet; <a href="https://www.smogon.com/forums/posts/8031456/">ADV 1v1</a>`,
2451
+ ],
2398
2452
 
2399
- mod: 'gen4',
2453
+ mod: 'gen3',
2400
2454
  // searchShow: false,
2401
- ruleset: ['Obtainable', 'Arceus EV Limit', 'Endless Battle Clause', 'HP Percentage Mod', 'Cancel Mod'],
2455
+ ruleset: [
2456
+ 'Picked Team Size = 1', 'Max Team Size = 3',
2457
+ '[Gen 3] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview', '!Freeze Clause Mod',
2458
+ ],
2459
+ banlist: ['Clefable', 'Slaking', 'Snorlax', 'Suicune', 'Destiny Bond', 'Explosion', 'Ingrain', 'Perish Song', 'Self-Destruct', 'Bright Powder', 'Focus Band', 'King\'s Rock', 'Lax Incense', 'Quick Claw'],
2460
+ unbanlist: ['Mr. Mime', 'Wobbuffet', 'Wynaut', 'Sand Veil'],
2402
2461
  },
2403
2462
  {
2404
- name: "[Gen 7] RU",
2463
+ name: "[Gen 1] Stadium OU",
2405
2464
  threads: [
2406
- `&bullet; <a href="https://www.smogon.com/forums/threads/3645338/">USM RU Sample Teams</a>`,
2407
- `&bullet; <a href="https://www.smogon.com/forums/threads/3645873/">USM RU Viability Rankings</a>`,
2465
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3685877/">Stadium OU Viability Rankings</a>`,
2408
2466
  ],
2409
2467
 
2410
- mod: 'gen7',
2468
+ mod: 'gen1stadium',
2411
2469
  // searchShow: false,
2412
- ruleset: ['[Gen 7] UU'],
2413
- banlist: ['UU', 'RUBL', 'Mimikyu', 'Aurora Veil'],
2414
- unbanlist: ['Drought'],
2470
+ ruleset: ['Standard', 'Team Preview'],
2471
+ banlist: ['Uber',
2472
+ 'Nidoking + Fury Attack + Thrash', 'Exeggutor + Poison Powder + Stomp', 'Exeggutor + Sleep Powder + Stomp',
2473
+ 'Exeggutor + Stun Spore + Stomp', 'Jolteon + Focus Energy + Thunder Shock', 'Flareon + Focus Energy + Ember',
2474
+ ],
2415
2475
  },
2416
2476
 
2417
2477
  // Past Gens OU
@@ -2465,7 +2525,7 @@ export const Formats: FormatList = [
2465
2525
  ],
2466
2526
 
2467
2527
  mod: 'gen4',
2468
- ruleset: ['Standard'],
2528
+ ruleset: ['Standard', 'Freeze Clause Mod'],
2469
2529
  banlist: ['AG', 'Uber', 'Arena Trap', 'Sand Veil', 'Swinub + Snow Cloak', 'Piloswine + Snow Cloak', 'Mamoswine + Snow Cloak', 'Soul Dew', 'Baton Pass', 'Swagger'],
2470
2530
  },
2471
2531
  {
@@ -2476,7 +2536,7 @@ export const Formats: FormatList = [
2476
2536
  ],
2477
2537
 
2478
2538
  mod: 'gen3',
2479
- ruleset: ['Standard', 'One Boost Passer Clause'],
2539
+ ruleset: ['Standard', 'One Boost Passer Clause', 'Freeze Clause Mod'],
2480
2540
  banlist: ['Uber', 'Sand Veil', 'Soundproof', 'Assist', 'Baton Pass + Block', 'Baton Pass + Mean Look', 'Baton Pass + Spider Web', 'Smeargle + Ingrain'],
2481
2541
  },
2482
2542
  {
@@ -2657,6 +2717,19 @@ export const Formats: FormatList = [
2657
2717
  ruleset: ['[Gen 7] OU'],
2658
2718
  banlist: ['OU', 'UUBL', 'Drizzle', 'Drought', 'Kommonium Z', 'Mewnium Z'],
2659
2719
  },
2720
+ {
2721
+ name: "[Gen 7] RU",
2722
+ threads: [
2723
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3645338/">USM RU Sample Teams</a>`,
2724
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3645873/">USM RU Viability Rankings</a>`,
2725
+ ],
2726
+
2727
+ mod: 'gen7',
2728
+ searchShow: false,
2729
+ ruleset: ['[Gen 7] UU'],
2730
+ banlist: ['UU', 'RUBL', 'Mimikyu', 'Aurora Veil'],
2731
+ unbanlist: ['Drought'],
2732
+ },
2660
2733
  {
2661
2734
  name: "[Gen 7] NU",
2662
2735
  threads: [
@@ -2949,6 +3022,18 @@ export const Formats: FormatList = [
2949
3022
  searchShow: false,
2950
3023
  ruleset: ['Standard', 'Swagger Clause', 'Mega Rayquaza Clause'],
2951
3024
  },
3025
+ {
3026
+ name: "[Gen 6] UU",
3027
+ threads: [
3028
+ `&bullet; <a href="https://www.smogon.com/dex/xy/formats/uu/">ORAS UU Banlist</a>`,
3029
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3598164/">ORAS UU Viability Rankings</a>`,
3030
+ ],
3031
+
3032
+ mod: 'gen6',
3033
+ searchShow: false,
3034
+ ruleset: ['[Gen 6] OU'],
3035
+ banlist: ['OU', 'UUBL', 'Drizzle', 'Drought'],
3036
+ },
2952
3037
  {
2953
3038
  name: "[Gen 6] RU",
2954
3039
  threads: [
@@ -3074,7 +3159,7 @@ export const Formats: FormatList = [
3074
3159
  mod: 'gen6',
3075
3160
  searchShow: false,
3076
3161
  ruleset: ['[Gen 6] OU', '+CAP'],
3077
- banlist: ['Aurumoth', 'Cawmodore', 'Crucibelle-Mega'],
3162
+ banlist: ['Aurumoth', 'Cawmodore'],
3078
3163
  },
3079
3164
  {
3080
3165
  name: "[Gen 6] Battle Spot Singles",
@@ -3271,7 +3356,7 @@ export const Formats: FormatList = [
3271
3356
  mod: 'gen5',
3272
3357
  searchShow: false,
3273
3358
  ruleset: ['[Gen 5] NU', 'Sleep Moves Clause'],
3274
- banlist: ['NU', 'PUBL'],
3359
+ banlist: ['NU', 'PUBL', 'Damp Rock'],
3275
3360
  },
3276
3361
  {
3277
3362
  name: "[Gen 5] LC",
@@ -3310,7 +3395,7 @@ export const Formats: FormatList = [
3310
3395
  searchShow: false,
3311
3396
  ruleset: [
3312
3397
  'Picked Team Size = 1', 'Max Team Size = 3',
3313
- 'Standard', 'Baton Pass Clause', 'Swagger Clause', 'Accuracy Moves Clause',
3398
+ 'Standard', 'Baton Pass Clause', 'Swagger Clause', 'Accuracy Moves Clause', 'Sleep Moves Clause',
3314
3399
  ],
3315
3400
  banlist: ['Uber', 'Cottonee', 'Dragonite', 'Jirachi', 'Kyurem-Black', 'Mew', 'Togekiss', 'Whimsicott', 'Victini', 'Bright Powder', 'Focus Band', 'Focus Sash', 'Lax Incense', 'Quick Claw', 'Soul Dew', 'Perish Song'],
3316
3401
  unbanlist: ['Genesect', 'Landorus', 'Manaphy', 'Thundurus', 'Tornadus-Therian'],
@@ -3443,7 +3528,7 @@ export const Formats: FormatList = [
3443
3528
 
3444
3529
  mod: 'gen4',
3445
3530
  searchShow: false,
3446
- ruleset: ['[Gen 4] OU'],
3531
+ ruleset: ['[Gen 4] OU', '!Freeze Clause Mod'],
3447
3532
  banlist: ['OU', 'UUBL'],
3448
3533
  unbanlist: ['Arena Trap', 'Swagger'],
3449
3534
  },
@@ -3492,6 +3577,13 @@ export const Formats: FormatList = [
3492
3577
  'Berry Juice', 'Deep Sea Tooth', 'Dragon Rage', 'Sonic Boom', 'Swagger',
3493
3578
  ],
3494
3579
  },
3580
+ {
3581
+ name: "[Gen 4] Anything Goes",
3582
+
3583
+ mod: 'gen4',
3584
+ searchShow: false,
3585
+ ruleset: ['Obtainable', 'Arceus EV Limit', 'Endless Battle Clause', 'HP Percentage Mod', 'Cancel Mod'],
3586
+ },
3495
3587
  {
3496
3588
  name: "[Gen 4] 1v1",
3497
3589
  desc: `Bring three Pok&eacute;mon to Team Preview and choose one to battle.`,
@@ -3503,7 +3595,7 @@ export const Formats: FormatList = [
3503
3595
  searchShow: false,
3504
3596
  ruleset: [
3505
3597
  'Picked Team Size = 1', 'Max Team Size = 3',
3506
- '[Gen 4] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview',
3598
+ '[Gen 4] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview', '!Freeze Clause Mod',
3507
3599
  ],
3508
3600
  banlist: ['Latias', 'Machamp', 'Porygon-Z', 'Shaymin', 'Snorlax', 'Togekiss', 'Focus Sash', 'Destiny Bond', 'Explosion', 'Perish Song', 'Self-Destruct'],
3509
3601
  unbanlist: ['Wobbuffet', 'Wynaut', 'Sand Veil', 'Swagger'],
@@ -3550,7 +3642,7 @@ export const Formats: FormatList = [
3550
3642
  mod: 'gen4',
3551
3643
  gameType: 'doubles',
3552
3644
  searchShow: false,
3553
- ruleset: ['[Gen 4] OU'],
3645
+ ruleset: ['[Gen 4] OU', '!Freeze Clause Mod'],
3554
3646
  banlist: ['Explosion'],
3555
3647
  unbanlist: ['Garchomp', 'Latias', 'Latios', 'Manaphy', 'Mew', 'Salamence', 'Wobbuffet', 'Wynaut', 'Swagger'],
3556
3648
  },
@@ -3612,9 +3704,8 @@ export const Formats: FormatList = [
3612
3704
 
3613
3705
  mod: 'gen3',
3614
3706
  searchShow: false,
3615
- ruleset: ['Standard', 'NFE Clause'],
3616
- banlist: ['Uber', 'OU', 'UUBL', 'Smeargle + Ingrain', 'Baton Pass'],
3617
- unbanlist: ['Scyther'],
3707
+ ruleset: ['Standard'],
3708
+ banlist: ['Uber', 'OU', 'UUBL', 'Smeargle + Ingrain', 'Arena Trap', 'Bright Powder', 'Lax Incense', 'Baton Pass', 'Swagger'],
3618
3709
  },
3619
3710
  {
3620
3711
  name: "[Gen 3] NU",
@@ -3624,9 +3715,8 @@ export const Formats: FormatList = [
3624
3715
 
3625
3716
  mod: 'gen3',
3626
3717
  searchShow: false,
3627
- ruleset: ['[Gen 3] UU', '!NFE Clause'],
3628
- banlist: ['UU'],
3629
- unbanlist: ['Baton Pass'],
3718
+ ruleset: ['Standard'],
3719
+ banlist: ['Uber', 'OU', 'UUBL', 'UU', 'Smeargle + Ingrain'],
3630
3720
  },
3631
3721
  {
3632
3722
  name: "[Gen 3] Doubles OU",
@@ -3641,22 +3731,6 @@ export const Formats: FormatList = [
3641
3731
  banlist: ['Uber'],
3642
3732
  unbanlist: ['Deoxys-Speed', 'Wobbuffet', 'Wynaut'],
3643
3733
  },
3644
- {
3645
- name: "[Gen 3] 1v1",
3646
- desc: `Bring three Pok&eacute;mon to Team Preview and choose one to battle.`,
3647
- threads: [
3648
- `&bullet; <a href="https://www.smogon.com/forums/posts/8031456/">ADV 1v1</a>`,
3649
- ],
3650
-
3651
- mod: 'gen3',
3652
- searchShow: false,
3653
- ruleset: [
3654
- 'Picked Team Size = 1', 'Max Team Size = 3',
3655
- '[Gen 3] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview',
3656
- ],
3657
- banlist: ['Clefable', 'Slaking', 'Snorlax', 'Suicune', 'Destiny Bond', 'Explosion', 'Ingrain', 'Perish Song', 'Self-Destruct', 'Bright Powder', 'Focus Band', 'King\'s Rock', 'Lax Incense', 'Quick Claw'],
3658
- unbanlist: ['Mr. Mime', 'Wobbuffet', 'Wynaut', 'Sand Veil'],
3659
- },
3660
3734
  {
3661
3735
  name: "[Gen 3] Custom Game",
3662
3736
 
@@ -3675,16 +3749,6 @@ export const Formats: FormatList = [
3675
3749
  debug: true,
3676
3750
  ruleset: ['HP Percentage Mod', 'Cancel Mod', 'Max Team Size = 24', 'Max Move Count = 24', 'Max Level = 9999', 'Default Level = 100'],
3677
3751
  },
3678
- {
3679
- name: "[Gen 2] Ubers",
3680
- threads: [
3681
- `&bullet; <a href="https://www.smogon.com/forums/posts/8286282/">GSC Ubers</a>`,
3682
- ],
3683
-
3684
- mod: 'gen2',
3685
- searchShow: false,
3686
- ruleset: ['Standard'],
3687
- },
3688
3752
  {
3689
3753
  name: "[Gen 2] UU",
3690
3754
  threads: [`&bullet; <a href="https://www.smogon.com/forums/threads/3576710/">GSC UU</a>`],
@@ -3772,7 +3836,7 @@ export const Formats: FormatList = [
3772
3836
 
3773
3837
  mod: 'gen1',
3774
3838
  searchShow: false,
3775
- ruleset: ['[Gen 1] OU'],
3839
+ ruleset: ['[Gen 1] OU', 'APT Clause'],
3776
3840
  banlist: ['OU', 'UUBL'],
3777
3841
  },
3778
3842
  {
@@ -3809,20 +3873,6 @@ export const Formats: FormatList = [
3809
3873
  ],
3810
3874
  banlist: ['Uber'],
3811
3875
  },
3812
- {
3813
- name: "[Gen 1] Stadium OU",
3814
- threads: [
3815
- `&bullet; <a href="https://www.smogon.com/forums/threads/3685877/">Stadium OU Viability Rankings</a>`,
3816
- ],
3817
-
3818
- mod: 'gen1stadium',
3819
- searchShow: false,
3820
- ruleset: ['Standard', 'Team Preview'],
3821
- banlist: ['Uber',
3822
- 'Nidoking + Fury Attack + Thrash', 'Exeggutor + Poison Powder + Stomp', 'Exeggutor + Sleep Powder + Stomp',
3823
- 'Exeggutor + Stun Spore + Stomp', 'Jolteon + Focus Energy + Thunder Shock', 'Flareon + Focus Energy + Ember',
3824
- ],
3825
- },
3826
3876
  {
3827
3877
  name: "[Gen 1] Tradebacks OU",
3828
3878
  desc: `RBY OU with movepool additions from the Time Capsule.`,