@pkmn/sim 0.5.22 → 0.5.25

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 (86) hide show
  1. package/LICENSE +1 -1
  2. package/build/config/formats.js +581 -481
  3. package/build/config/formats.js.map +1 -1
  4. package/build/data/aliases.js +9 -5
  5. package/build/data/aliases.js.map +1 -1
  6. package/build/data/conditions.js +1 -1
  7. package/build/data/conditions.js.map +1 -1
  8. package/build/data/formats-data.js +830 -28
  9. package/build/data/formats-data.js.map +1 -1
  10. package/build/data/learnsets.js +64 -39
  11. package/build/data/learnsets.js.map +1 -1
  12. package/build/data/mods/gen1/formats-data.js +1 -1
  13. package/build/data/mods/gen1/formats-data.js.map +1 -1
  14. package/build/data/mods/gen1/moves.js +5 -0
  15. package/build/data/mods/gen1/moves.js.map +1 -1
  16. package/build/data/mods/gen1/scripts.js +4 -2
  17. package/build/data/mods/gen1/scripts.js.map +1 -1
  18. package/build/data/mods/gen2/moves.js +0 -5
  19. package/build/data/mods/gen2/moves.js.map +1 -1
  20. package/build/data/mods/gen2/rulesets.js +7 -1
  21. package/build/data/mods/gen2/rulesets.js.map +1 -1
  22. package/build/data/mods/gen3/formats-data.js +3 -3
  23. package/build/data/mods/gen3/formats-data.js.map +1 -1
  24. package/build/data/mods/gen3/rulesets.js +1 -1
  25. package/build/data/mods/gen3/rulesets.js.map +1 -1
  26. package/build/data/mods/gen4/rulesets.js +1 -1
  27. package/build/data/mods/gen4/rulesets.js.map +1 -1
  28. package/build/data/mods/gen5/rulesets.js +1 -1
  29. package/build/data/mods/gen5/rulesets.js.map +1 -1
  30. package/build/data/mods/gen6/formats-data.js +64 -64
  31. package/build/data/mods/gen6/formats-data.js.map +1 -1
  32. package/build/data/mods/gen7/rulesets.js +1 -1
  33. package/build/data/mods/gen7/rulesets.js.map +1 -1
  34. package/build/data/pokedex.js +1 -1
  35. package/build/data/rulesets.js +232 -3
  36. package/build/data/rulesets.js.map +1 -1
  37. package/build/data/tags.js +26 -9
  38. package/build/data/tags.js.map +1 -1
  39. package/build/lib/utils.d.ts +4 -0
  40. package/build/lib/utils.js +20 -1
  41. package/build/lib/utils.js.map +1 -1
  42. package/build/sim/battle-stream.js +3 -0
  43. package/build/sim/battle-stream.js.map +1 -1
  44. package/build/sim/battle.d.ts +1 -1
  45. package/build/sim/battle.js.map +1 -1
  46. package/build/sim/dex-conditions.d.ts +1 -0
  47. package/build/sim/dex-conditions.js.map +1 -1
  48. package/build/sim/dex-species.d.ts +5 -0
  49. package/build/sim/dex-species.js +11 -3
  50. package/build/sim/dex-species.js.map +1 -1
  51. package/build/sim/exported-global-types.d.ts +4 -0
  52. package/build/sim/global-types.d.ts +4 -0
  53. package/build/sim/pokemon.d.ts +1 -0
  54. package/build/sim/pokemon.js +1 -0
  55. package/build/sim/pokemon.js.map +1 -1
  56. package/build/sim/team-validator.js +5 -1
  57. package/build/sim/team-validator.js.map +1 -1
  58. package/config/formats.ts +575 -466
  59. package/data/aliases.ts +9 -5
  60. package/data/conditions.ts +1 -1
  61. package/data/formats-data.ts +830 -28
  62. package/data/learnsets.ts +64 -39
  63. package/data/mods/gen1/formats-data.ts +1 -1
  64. package/data/mods/gen1/moves.ts +5 -0
  65. package/data/mods/gen1/scripts.ts +3 -2
  66. package/data/mods/gen2/moves.ts +0 -5
  67. package/data/mods/gen2/rulesets.ts +8 -1
  68. package/data/mods/gen3/formats-data.ts +3 -3
  69. package/data/mods/gen3/rulesets.ts +1 -1
  70. package/data/mods/gen4/rulesets.ts +1 -1
  71. package/data/mods/gen5/rulesets.ts +1 -1
  72. package/data/mods/gen6/formats-data.ts +64 -64
  73. package/data/mods/gen7/rulesets.ts +1 -1
  74. package/data/pokedex.ts +1 -1
  75. package/data/rulesets.ts +212 -3
  76. package/data/tags.ts +27 -9
  77. package/lib/utils.ts +16 -0
  78. package/package.json +2 -2
  79. package/sim/battle-stream.ts +3 -0
  80. package/sim/battle.ts +1 -1
  81. package/sim/dex-conditions.ts +1 -0
  82. package/sim/dex-species.ts +15 -3
  83. package/sim/exported-global-types.ts +4 -0
  84. package/sim/global-types.ts +4 -0
  85. package/sim/pokemon.ts +2 -0
  86. package/sim/team-validator.ts +6 -1
@@ -80,10 +80,7 @@ exports.Formats = [
80
80
  ],
81
81
  mod: 'gen8',
82
82
  ruleset: ['Standard', 'Dynamax Clause'],
83
- banlist: [
84
- 'Uber', 'AG', 'Arena Trap', 'Moody', 'Power Construct', 'Sand Veil', 'Shadow Tag', 'Snow Cloak',
85
- 'Bright Powder', 'King\'s Rock', 'Lax Incense', 'Baton Pass',
86
- ],
83
+ banlist: ['Uber', 'AG', 'Arena Trap', 'Moody', 'Power Construct', 'Sand Veil', 'Shadow Tag', 'Snow Cloak', 'King\'s Rock', 'Baton Pass'],
87
84
  },
88
85
  {
89
86
  name: "[Gen 8] OU (Blitz)",
@@ -154,8 +151,8 @@ exports.Formats = [
154
151
  mod: 'gen8',
155
152
  ruleset: ['Little Cup', 'Standard', 'Dynamax Clause'],
156
153
  banlist: [
157
- 'Corsola-Galar', 'Cutiefly', 'Drifloon', 'Gastly', 'Gothita', 'Rufflet', 'Scraggy', 'Scyther', 'Sneasel', 'Swirlix', 'Tangela', 'Vullaby', 'Vulpix-Alola', 'Woobat', 'Zigzagoon-Base',
158
- 'Chlorophyll', 'Moody', 'Baton Pass', 'Sticky Web',
154
+ 'Corsola-Galar', 'Cutiefly', 'Drifloon', 'Gastly', 'Gothita', 'Rufflet', 'Scraggy', 'Scyther', 'Sneasel', 'Swirlix',
155
+ 'Tangela', 'Vullaby', 'Vulpix-Alola', 'Woobat', 'Zigzagoon-Base', 'Chlorophyll', 'Moody', 'Baton Pass', 'Sticky Web',
159
156
  ],
160
157
  },
161
158
  {
@@ -172,8 +169,8 @@ exports.Formats = [
172
169
  'Blaziken', 'Calyrex-Ice', 'Calyrex-Shadow', 'Dialga', 'Dracovish', 'Eternatus', 'Genesect', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh',
173
170
  'Kartana', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Mewtwo', 'Naganadel',
174
171
  'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Reshiram', 'Solgaleo', 'Urshifu-Base', 'Xerneas', 'Yveltal',
175
- 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Zygarde-Base', 'Moody', 'Power Construct', 'Shadow Tag', 'Bright Powder',
176
- 'Damp Rock', 'Focus Band', 'King\'s Rock', 'Lax Incense', 'Quick Claw', 'Smooth Rock', 'Terrain Extender', 'Acupressure', 'Baton Pass',
172
+ 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Zygarde-Base', 'Moody', 'Power Construct', 'Shadow Tag', 'Damp Rock',
173
+ 'Focus Band', 'King\'s Rock', 'Quick Claw', 'Smooth Rock', 'Terrain Extender', 'Acupressure', 'Baton Pass',
177
174
  ],
178
175
  },
179
176
  {
@@ -218,8 +215,9 @@ exports.Formats = [
218
215
  mod: 'gen8',
219
216
  ruleset: ['[Gen 8] PU'],
220
217
  banlist: [
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',
218
+ 'PU', 'Arctovish', 'Aurorus', 'Basculin', 'Centiskorch', 'Drampa', 'Exeggutor-Alola', 'Gallade', 'Haunter', 'Magmortar', 'Magneton',
219
+ 'Malamar', 'Ninjask', 'Omastar', 'Rotom-Frost', 'Turtonator', 'Vanilluxe', 'Vikavolt', 'Silvally-Dragon', 'Silvally-Ground', 'Sneasel',
220
+ 'Damp Rock', 'Grassy Seed',
223
221
  ],
224
222
  },
225
223
  {
@@ -265,8 +263,19 @@ exports.Formats = [
265
263
  {
266
264
  name: "[Gen 8] Battle Stadium Singles",
267
265
  mod: 'gen8',
268
- ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 8', 'Limit Two Restricted'],
269
- restricted: ['Restricted Legendary'],
266
+ ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 8'],
267
+ banlist: ['Eternatus-Eternamax'],
268
+ unbanlist: ['Mythical', 'Restricted Legendary'],
269
+ },
270
+ {
271
+ name: "[Gen 8] I Choose 'Chu!",
272
+ threads: [
273
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3705481/">I Choose 'Chu! Discussion</a>`,
274
+ ],
275
+ mod: 'gen8',
276
+ ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 8'],
277
+ banlist: ['All Pokemon', 'Raichu-Alola + Sing'],
278
+ unbanlist: ['Pichu', 'Pikachu', 'Raichu'],
270
279
  },
271
280
  {
272
281
  name: "[Gen 8] Custom Game",
@@ -344,6 +353,20 @@ exports.Formats = [
344
353
  ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 8', 'VGC Timer', 'Limit Two Restricted'],
345
354
  restricted: ['Restricted Legendary'],
346
355
  },
356
+ {
357
+ name: "[Gen 8] Battle Stadium Doubles Series 13",
358
+ mod: 'gen8',
359
+ gameType: 'doubles',
360
+ ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 8', 'VGC Timer'],
361
+ banlist: ['Eternatus-Eternamax'],
362
+ unbanlist: ['Mythical', 'Restricted Legendary'],
363
+ },
364
+ {
365
+ name: "[Gen 8] Spikemuth Cup",
366
+ mod: 'gen8',
367
+ gameType: 'doubles',
368
+ ruleset: ['Flat Rules', 'Dynamax Clause', '!! Adjust Level = 50', 'Min Source Gen = 8', 'VGC Timer'],
369
+ },
347
370
  {
348
371
  name: "[Gen 8] VGC 2021",
349
372
  mod: 'gen8',
@@ -418,17 +441,6 @@ exports.Formats = [
418
441
  }
419
442
  },
420
443
  },
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
- },
432
444
  {
433
445
  name: "[Gen 8] Doubles Custom Game",
434
446
  mod: 'gen8',
@@ -453,17 +465,7 @@ exports.Formats = [
453
465
  ],
454
466
  mod: 'gen8',
455
467
  ruleset: ['Standard NatDex', 'OHKO Clause', 'Evasion Moves Clause', 'Species Clause', 'Dynamax Clause', 'Sleep Clause Mod'],
456
- banlist: [
457
- 'Alakazam-Mega', 'Arceus', 'Blastoise-Mega', 'Blaziken-Mega', 'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Darkrai',
458
- 'Darmanitan-Galar', 'Deoxys-Attack', 'Deoxys-Base', 'Deoxys-Speed', 'Dialga', 'Dracovish', 'Dragapult', 'Eternatus',
459
- 'Genesect', 'Gengar-Mega', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kangaskhan-Mega', 'Kyogre', 'Kyurem-Black',
460
- 'Kyurem-White', 'Landorus-Base', 'Lucario-Mega', 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Metagross-Mega', 'Mewtwo',
461
- 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Necrozma-Ultra', 'Palkia', 'Pheromosa', 'Rayquaza', 'Reshiram',
462
- 'Salamence-Mega', 'Shaymin-Sky', 'Solgaleo', 'Spectrier', 'Tornadus-Therian', 'Urshifu-Base', 'Xerneas', 'Yveltal', 'Zacian',
463
- 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Zygarde-Base', 'Zygarde-Complete', 'Arena Trap', 'Moody',
464
- 'Power Construct', 'Sand Veil', 'Shadow Tag', 'Snow Cloak', 'Bright Powder', 'King\'s Rock', 'Lax Incense', 'Razor Fang',
465
- 'Quick Claw', 'Baton Pass',
466
- ],
468
+ banlist: ['ND Uber', 'Arena Trap', 'Moody', 'Power Construct', 'Sand Veil', 'Shadow Tag', 'Snow Cloak', 'Bright Powder', 'King\'s Rock', 'Lax Incense', 'Razor Fang', 'Quick Claw', 'Baton Pass'],
467
469
  },
468
470
  {
469
471
  name: "[Gen 8] National Dex UU",
@@ -474,25 +476,17 @@ exports.Formats = [
474
476
  ],
475
477
  mod: 'gen8',
476
478
  ruleset: ['[Gen 8] National Dex'],
477
- banlist: [
478
- // National Dex OU
479
- 'Blissey', 'Chansey', 'Charizard-Mega-X', 'Charizard-Mega-Y', 'Clefable', 'Corviknight', 'Diancie-Mega', 'Excadrill',
480
- 'Ferrothorn', 'Garchomp', 'Gliscor', 'Greninja', 'Heatran', 'Kartana', 'Kommo-o', 'Kyurem', 'Landorus-Therian', 'Lopunny-Mega',
481
- 'Magnezone', 'Mawile-Mega', 'Pelipper', 'Rillaboom', 'Scizor-Mega', 'Serperior', 'Slowbro-Base', 'Swampert-Mega', 'Tapu Fini',
482
- 'Tapu Koko', 'Tapu Lele', 'Toxapex', 'Tyranitar', 'Victini', 'Volcarona', 'Weavile', 'Zapdos-Base',
483
- 'ND UUBL',
484
- 'Drizzle', 'Drought', 'Light Clay',
485
- // Slowbronite is banned so it doesn't validate on Galarian Slowbro
486
- 'Slowbronite',
487
- ],
488
- // Used to distinguish UU from below UU in the client
489
- restricted: [
490
- 'Aegislash', 'Altaria-Mega', 'Amoonguss', 'Azumarill', 'Beedrill-Mega', 'Breloom', 'Celesteela', 'Chandelure', 'Donphan', 'Dracozolt',
491
- 'Dragonite', 'Feraligatr', 'Gastrodon', 'Hatterene', 'Hippowdon', 'Infernape', 'Keldeo', 'Krookodile', 'Mamoswine', 'Mandibuzz',
492
- 'Manectric-Mega', 'Melmetal', 'Mienshao', 'Moltres-Base', 'Nidoking', 'Nidoqueen', 'Nihilego', 'Quagsire', 'Regieleki', 'Ribombee',
493
- 'Rotom-Heat', 'Rotom-Wash', 'Salamence', 'Scizor', 'Skarmory', 'Slowking-Base', 'Swampert-Base', 'Talonflame', 'Tangrowth', 'Tornadus-Base',
494
- 'Umbreon', 'Urshifu-Rapid-Strike',
479
+ banlist: ['ND OU', 'ND UUBL', 'Drizzle', 'Drought', 'Light Clay', 'Slowbronite'],
480
+ },
481
+ {
482
+ name: "[Gen 8] National Dex RU",
483
+ threads: [
484
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3691290/">National Dex RU</a>`,
495
485
  ],
486
+ mod: 'gen8',
487
+ searchShow: false,
488
+ ruleset: ['[Gen 8] National Dex UU'],
489
+ banlist: ['ND UU', 'ND RUBL'],
496
490
  },
497
491
  {
498
492
  name: "[Gen 8] National Dex Monotype",
@@ -527,41 +521,57 @@ exports.Formats = [
527
521
  section: "Pet Mods",
528
522
  },
529
523
  {
530
- name: "[Gen 8] Restrictions",
531
- desc: `A metagame made up of brand new Pok&eacute;mon that are made according to various random and non-random restrictions.`,
524
+ name: "[Gen 8] National Dex BH",
525
+ desc: `Balanced Hackmons with National Dex elements mixed in.`,
532
526
  threads: [
533
- `&bullet; <a href="https://www.smogon.com/forums/threads/3673824/">Restrictions</a>`,
534
- `&bullet; <a href="https://docs.google.com/spreadsheets/d/1XsplBqN8njHZJT9cTP_3i3YSFITB9WaVfNOYAbNY75M/edit?usp=sharing">Spreadsheet</a>`,
527
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3658587/">National Dex Balanced Hackmons</a>`,
535
528
  ],
536
- mod: 'restrictions',
537
- ruleset: ['Standard', 'Dynamax Clause'],
538
- banlist: ['All Pokemon', 'Past'],
539
- unbanlist: [
540
- 'Vulcaraptor', 'Parakinesis', 'Serpaint', 'Torgeist', 'Regolite', 'Polbearab', 'Centhorn', 'Donzyxote', 'Scimicobra', 'Folliclawe', 'Afloof', 'Nimbusteed',
541
- 'Aerock', 'Borassa', 'Sharm', 'Nunopod', 'Crypterid', 'Abysseil', 'Faerenheit', 'Spiriteal', 'Zoltanka', 'Flydra', 'Coracrab', 'Quadringo', 'Teslaple',
542
- 'Kapagon', 'Cyknight', 'Dirtoad', 'Crystelf', 'Rancourgar', 'Scalaron', 'Dragraceful', 'Tantrary', 'Modolith', 'Snailord', 'Arbrella', 'Draugelid',
543
- 'Cinnastar', 'Refluse', 'Kelven', 'Kodokai', 'Cindarner', 'Thucotuco', 'Sorree', 'Gembezzle', 'Winterloper', 'Agapest', 'Volvolpa', 'Punduluum', 'Wraithful',
544
- 'Panzarma', 'Krachiten', 'Cellsius', 'Borelem', 'Electangle', 'Orchile', 'Shinodori', 'Fluidrake', 'Potossum', 'Twygdrasill',
529
+ mod: 'gen8',
530
+ ruleset: ['-Nonexistent', 'Standard NatDex', 'Forme Clause', 'Sleep Moves Clause', '2 Ability Clause', 'OHKO Clause', 'Evasion Moves Clause', 'Dynamax Clause', 'CFZ Clause', '!Obtainable'],
531
+ banlist: [
532
+ // Pokemon
533
+ 'Eternatus-Eternamax', 'Groudon-Primal', 'Rayquaza-Mega', 'Shedinja', 'Cramorant-Gorging', 'Calyrex-Shadow',
534
+ // Abilities
535
+ 'Arena Trap', 'Contrary', 'Gorilla Tactics', 'Huge Power', 'Illusion', 'Innards Out', 'Libero', 'Magnet Pull', 'Moody', 'Neutralizing Gas', 'Parental Bond', 'Protean', 'Pure Power', 'Shadow Tag', 'Stakeout', 'Water Bubble', 'Wonder Guard',
536
+ // Items
537
+ 'Gengarite',
538
+ // Moves
539
+ 'Chatter', 'Double Iron Bash', 'Octolock', 'Shell Smash', 'Bolt Beak', 'Belly Drum', 'Electrify', 'Court Change',
540
+ // Other
541
+ 'Comatose + Sleep Talk', 'Imprison + Transform',
545
542
  ],
543
+ onValidateSet(set) {
544
+ if (this.toID(set.ability) === 'intrepidsword' &&
545
+ !this.toID(set.species).startsWith('zacian') && this.toID(set.item) !== 'rustedsword') {
546
+ return [`${set.ability} is banned.`];
547
+ }
548
+ if (set.species === 'Zacian-Crowned' &&
549
+ (this.toID(set.item) !== 'rustedsword' || this.toID(set.ability) !== 'intrepidsword')) {
550
+ return [`${set.species} is banned.`];
551
+ }
552
+ },
553
+ onValidateTeam(team) {
554
+ let arceus = 0;
555
+ for (const set of team) {
556
+ const species = this.dex.species.get(set.species);
557
+ if (species.baseSpecies === "Arceus")
558
+ arceus++;
559
+ }
560
+ if (arceus > 1) {
561
+ return [`You are limited to one Arceus forme.`, `(You have ${arceus} Arceus formes.)`];
562
+ }
563
+ },
546
564
  },
547
565
  {
548
- name: "[Gen 8] Roulettemons Random Battle",
566
+ name: "[Gen 8] JolteMons Random Battle",
567
+ desc: `Pok&eacute;mon, items, abilities, and moves are redesigned for OU, and new items, abilities, and moves are added, all without changing base stats.`,
549
568
  threads: [
550
- `&bullet; <a href="https://www.smogon.com/forums/threads/3649106/">Roulettemons</a>`,
551
- `&bullet; <a href="https://docs.google.com/spreadsheets/d/1EOA1m7JXTq7Zz0ViVI4n6lBppFjVBa4S1GqhAwkPTZQ/edit?usp=sharing">Spreadsheet</a>`,
569
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3694234/">JolteMons</a>`,
570
+ `&bullet; <a href="https://docs.google.com/spreadsheets/d/149ZlQY0bJIAqfWB_233Dvbpqs3pVSHYpIoAQQkwquls/edit?usp=sharing">Spreadsheet</a>`,
552
571
  ],
572
+ mod: 'joltemons',
553
573
  team: 'random',
554
- mod: 'roulettemons',
555
- ruleset: ['Standard NatDex'],
556
- onSwitchIn(pokemon) {
557
- this.add('-start', pokemon, 'typechange', pokemon.species.types.join('/'), '[silent]');
558
- },
559
- onChangeSet(set) {
560
- if (set.species === 'Chillyte-Mega') {
561
- set.species = 'Chillyte';
562
- set.ability = 'Grassy Surge';
563
- }
564
- },
574
+ ruleset: ['Dynamax Clause', 'Obtainable', 'Species Clause', 'HP Percentage Mod', 'Cancel Mod', 'Sleep Clause Mod', 'Mega Data Mod', 'Z-Move Clause'],
565
575
  },
566
576
  {
567
577
  name: "[Gen 6] NEXT OU",
@@ -581,272 +591,118 @@ exports.Formats = [
581
591
  column: 2,
582
592
  },
583
593
  {
584
- name: "[Gen 8] Broken Record",
585
- desc: `Pok&eacute;mon can hold a TR to use that move in battle.`,
594
+ name: "[Gen 8] Partners in Crime",
595
+ desc: `Doubles-based metagame where both active ally Pok&eacute;mon share abilities and moves.`,
586
596
  threads: [
587
- `&bullet; <a href="https://www.smogon.com/forums/threads/3701270/">Broken Record</a>`,
597
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3706080/">Partners in Crime</a>`,
588
598
  ],
589
- mod: 'gen8',
590
- ruleset: ['Standard', '!Sleep Clause Mod', 'Sleep Moves Clause', 'Dynamax Clause'],
599
+ mod: 'partnersincrime',
600
+ gameType: 'doubles',
601
+ // searchShow: false,
602
+ ruleset: ['Standard Doubles', 'Dynamax Clause'],
591
603
  banlist: [
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',
604
+ 'Calyrex-Ice', 'Calyrex-Shadow', 'Dialga', 'Eternatus', 'Giratina', 'Giratina-Origin',
605
+ 'Groudon', 'Ho-Oh', 'Jirachi', 'Kyogre', 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna',
606
+ 'Marshadow', 'Melmetal', 'Mewtwo', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia',
607
+ 'Rayquaza', 'Reshiram', 'Solgaleo', 'Urshifu-Base', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned',
608
+ 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Bolt Beak', 'Fishious Rend', 'Shell Smash',
609
+ 'Emergency Exit', 'Huge Power', 'Moody', 'Power Construct', 'Shadow Tag', 'Wimp Out', 'Wonder Guard',
598
610
  ],
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
- ];
611
+ onBeforeSwitchIn(pokemon) {
612
+ pokemon.m.curMoves = this.dex.deepClone(pokemon.moves);
613
+ let ngas = false;
614
+ for (const poke of this.getAllActive()) {
615
+ if (this.toID(poke.ability) === 'neutralizinggas') {
616
+ ngas = true;
617
+ break;
618
+ }
610
619
  }
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}.`];
620
+ const BAD_ABILITIES = ['trace', 'imposter', 'neutralizinggas'];
621
+ // Abilities that must be applied before both sides trigger onSwitchIn to correctly
622
+ // handle switch-in ability-to-ability interactions, e.g. Intimidate counters
623
+ const NEEDED_BEFORE_SWITCH_IN_ABILITIES = [
624
+ 'clearbody', 'competitive', 'contrary', 'defiant', 'fullmetalbody', 'hypercutter', 'innerfocus',
625
+ 'mirrorarmor', 'oblivious', 'owntempo', 'rattled', 'scrappy', 'simple', 'whitesmoke',
626
+ ];
627
+ const ally = pokemon.side.active.find(mon => mon && mon !== pokemon && !mon.fainted);
628
+ if (ally && ally.ability !== pokemon.ability) {
629
+ if (!pokemon.m.innate && !BAD_ABILITIES.includes(this.toID(ally.ability)) &&
630
+ NEEDED_BEFORE_SWITCH_IN_ABILITIES.includes(this.toID(ally.ability))) {
631
+ pokemon.m.innate = 'ability:' + ally.ability;
632
+ delete pokemon.volatiles[pokemon.m.innate];
633
+ if (!ngas || ally.getAbility().isPermanent)
634
+ pokemon.addVolatile(pokemon.m.innate);
635
+ }
636
+ if (!ally.m.innate && !BAD_ABILITIES.includes(this.toID(pokemon.ability)) &&
637
+ NEEDED_BEFORE_SWITCH_IN_ABILITIES.includes(this.toID(pokemon.ability))) {
638
+ ally.m.innate = 'ability:' + pokemon.ability;
639
+ delete ally.volatiles[ally.m.innate];
640
+ if (!ngas || pokemon.getAbility().isPermanent)
641
+ ally.addVolatile(ally.m.innate);
622
642
  }
623
- trs.add(item);
624
643
  }
625
644
  },
626
- onTakeItem(item) {
627
- return !/^tr\d\d/i.test(item.name);
645
+ onSwitchInPriority: 2,
646
+ onSwitchIn(pokemon) {
647
+ let ngas = false;
648
+ for (const poke of this.getAllActive()) {
649
+ if (this.toID(poke.ability) === 'neutralizinggas') {
650
+ ngas = true;
651
+ break;
652
+ }
653
+ }
654
+ const BAD_ABILITIES = ['trace', 'imposter', 'neutralizinggas'];
655
+ const ally = pokemon.side.active.find(mon => mon && mon !== pokemon && !mon.fainted);
656
+ if (ally && ally.ability !== pokemon.ability) {
657
+ if (!pokemon.m.innate && !BAD_ABILITIES.includes(this.toID(ally.ability))) {
658
+ pokemon.m.innate = 'ability:' + ally.ability;
659
+ delete pokemon.volatiles[pokemon.m.innate];
660
+ if (!ngas || ally.getAbility().isPermanent)
661
+ pokemon.addVolatile(pokemon.m.innate);
662
+ }
663
+ if (!ally.m.innate && !BAD_ABILITIES.includes(this.toID(pokemon.ability))) {
664
+ ally.m.innate = 'ability:' + pokemon.ability;
665
+ delete ally.volatiles[ally.m.innate];
666
+ if (!ngas || pokemon.getAbility().isPermanent)
667
+ ally.addVolatile(ally.m.innate);
668
+ }
669
+ }
628
670
  },
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
- };
671
+ onSwitchOut(pokemon) {
672
+ if (pokemon.m.innate) {
673
+ pokemon.removeVolatile(pokemon.m.innate);
674
+ delete pokemon.m.innate;
675
+ }
676
+ const ally = pokemon.side.active.find(mon => mon && mon !== pokemon && !mon.fainted);
677
+ if (ally && ally.m.innate) {
678
+ ally.removeVolatile(ally.m.innate);
679
+ delete ally.m.innate;
640
680
  }
641
681
  },
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
- }
682
+ onFaint(pokemon) {
683
+ if (pokemon.m.innate) {
684
+ pokemon.removeVolatile(pokemon.m.innate);
685
+ delete pokemon.m.innate;
686
+ }
687
+ const ally = pokemon.side.active.find(mon => mon && mon !== pokemon && !mon.fainted);
688
+ if (ally && ally.m.innate) {
689
+ ally.removeVolatile(ally.m.innate);
690
+ delete ally.m.innate;
660
691
  }
661
692
  },
662
693
  },
663
694
  {
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.`,
695
+ name: "[Gen 8] Chimera 1v1",
696
+ desc: `One Pok&eacute;mon inherits specific traits from your entire 6-mon team, based on their order.`,
666
697
  threads: [
667
- `&bullet; <a href="https://www.smogon.com/forums/threads/3656811/">Inheritance</a>`,
698
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3661215/">Chimera 1v1</a>`,
668
699
  ],
669
700
  mod: 'gen8',
670
- // searchShow: false,
671
- ruleset: ['Standard', '!Sleep Clause Mod', 'Sleep Moves Clause', '2 Ability Clause', 'Dynamax Clause'],
701
+ ruleset: ['Chimera 1v1 Rule', 'Standard', 'Dynamax Clause', 'Sleep Moves Clause'],
672
702
  banlist: [
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',
703
+ 'Shedinja', 'Huge Power', 'Moody', 'Neutralizing Gas', 'Truant', 'Perish Body', 'Eviolite', 'Focus Sash', 'Leek', 'Light Ball',
704
+ 'Bolt Beak', 'Disable', 'Double Iron Bash', 'Fishious Rend', 'Perish Song', 'Switcheroo', 'Transform', 'Trick',
680
705
  ],
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
- },
850
706
  },
851
707
  // Other Metagames
852
708
  ///////////////////////////////////////////////////////////////////
@@ -879,16 +735,16 @@ exports.Formats = [
879
735
  `&bullet; <a href="https://www.smogon.com/forums/threads/3682690/">AAA Resources</a>`,
880
736
  ],
881
737
  mod: 'gen8',
882
- ruleset: ['Standard', '!Obtainable Abilities', '2 Ability Clause', 'Dynamax Clause', 'Sleep Moves Clause', '!Sleep Clause Mod'],
738
+ ruleset: ['Standard OMs', '!Obtainable Abilities', '2 Ability Clause', 'Sleep Moves Clause'],
883
739
  banlist: [
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',
740
+ 'Archeops', 'Blacephalon', 'Buzzwole', 'Calyrex-Ice', 'Calyrex-Shadow', 'Dialga', 'Dracovish', 'Dragapult', 'Dragonite', 'Eternatus',
741
+ 'Gengar', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Keldeo', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White',
886
742
  'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Noivern',
887
743
  'Palkia', 'Pheromosa', 'Rayquaza', 'Regigigas', 'Reshiram', 'Shedinja', 'Solgaleo', 'Spectrier', 'Urshifu', 'Urshifu-Rapid-Strike',
888
- 'Victini', 'Weavile', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Base', 'Zekrom', 'Zeraora', 'Zygarde-Base',
889
- 'Arena Trap', 'Comatose', 'Contrary', 'Fluffy', 'Fur Coat', 'Gorilla Tactics', 'Huge Power', 'Ice Scales', 'Illusion', 'Imposter',
890
- 'Innards Out', 'Intrepid Sword', 'Libero', 'Magnet Pull', 'Moody', 'Neutralizing Gas', 'Parental Bond', 'Poison Heal', 'Protean',
891
- 'Pure Power', 'Shadow Tag', 'Simple', 'Stakeout', 'Speed Boost', 'Water Bubble', 'Wonder Guard', 'King\'s Rock', 'Baton Pass',
744
+ 'Victini', 'Weavile', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Base', 'Zekrom', 'Zeraora', 'Zygarde-Base', 'Arena Trap',
745
+ 'Comatose', 'Contrary', 'Fluffy', 'Fur Coat', 'Gorilla Tactics', 'Huge Power', 'Ice Scales', 'Illusion', 'Imposter', 'Innards Out',
746
+ 'Intrepid Sword', 'Libero', 'Magic Bounce', 'Magnet Pull', 'Moody', 'Neutralizing Gas', 'Parental Bond', 'Poison Heal', 'Protean',
747
+ 'Pure Power', 'Shadow Tag', 'Simple', 'Stakeout', 'Speed Boost', 'Unburden', 'Water Bubble', 'Wonder Guard', 'King\'s Rock', 'Baton Pass',
892
748
  ],
893
749
  },
894
750
  {
@@ -899,7 +755,7 @@ exports.Formats = [
899
755
  `&bullet; <a href="https://www.smogon.com/forums/threads/3659028/">M&amp;M Resources</a>`,
900
756
  ],
901
757
  mod: 'mixandmega',
902
- ruleset: ['Standard', 'Overflow Stat Mod', 'Dynamax Clause'],
758
+ ruleset: ['Standard OMs', 'Sleep Clause Mod'],
903
759
  banlist: [
904
760
  'Calyrex-Shadow', 'Eternatus', 'Kyogre', 'Zacian',
905
761
  'Beedrillite', 'Blazikenite', 'Gengarite', 'Kangaskhanite', 'Mawilite', 'Medichamite', 'Pidgeotite',
@@ -969,7 +825,7 @@ exports.Formats = [
969
825
  `&bullet; <a href="https://www.smogon.com/forums/threads/3695169/">STABmons Resources</a>`,
970
826
  ],
971
827
  mod: 'gen8',
972
- ruleset: ['Standard', 'STABmons Move Legality', 'Dynamax Clause', 'Sleep Moves Clause', '!Sleep Clause Mod'],
828
+ ruleset: ['Standard OMs', 'STABmons Move Legality', 'Sleep Moves Clause'],
973
829
  banlist: [
974
830
  'Aegislash', 'Blacephalon', 'Calyrex-Ice', 'Calyrex-Shadow', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Dragapult', 'Dragonite', 'Eternatus',
975
831
  'Genesect', 'Garchomp', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus',
@@ -992,7 +848,7 @@ exports.Formats = [
992
848
  `&bullet; <a href="https://www.smogon.com/forums/threads/3672463/">NFE Resources</a>`,
993
849
  ],
994
850
  mod: 'gen8',
995
- ruleset: ['Not Fully Evolved', 'Standard', 'Dynamax Clause'],
851
+ ruleset: ['Standard OMs', 'Not Fully Evolved', 'Sleep Clause Mod'],
996
852
  banlist: [
997
853
  'Chansey', 'Doublade', 'Golbat', 'Haunter', 'Kadabra', 'Magmar', 'Magneton', 'Mr. Mime-Galar', 'Pawniard', 'Pikachu',
998
854
  'Porygon2', 'Rhydon', 'Scyther', 'Sneasel', 'Type: Null', 'Vulpix-Base', 'Arena Trap', 'Shadow Tag', 'Baton Pass',
@@ -1005,10 +861,10 @@ exports.Formats = [
1005
861
  `&bullet; <a href="https://www.smogon.com/forums/threads/3660461/">Godly Gift</a>`,
1006
862
  ],
1007
863
  mod: 'gen8',
1008
- ruleset: ['Standard', 'Dynamax Clause', 'Sleep Moves Clause'],
864
+ ruleset: ['Standard OMs', 'Sleep Moves Clause'],
1009
865
  banlist: [
1010
- 'Blissey', 'Calyrex-Shadow', 'Chansey', 'Crawdaunt', 'Dragapult', 'Eternatus', 'Hawlucha', 'Marowak-Alola', 'Melmetal',
1011
- 'Pikachu', 'Toxapex', 'Xerneas', 'Zacian', 'Zacian-Crowned', 'Uber > 1', 'AG ++ Uber > 1', 'Arena Trap', 'Huge Power',
866
+ 'Blissey', 'Calyrex-Shadow', 'Chansey', 'Crawdaunt', 'Dragapult', 'Eternatus', 'Hawlucha', 'Marowak-Alola', 'Melmetal', 'Nidoking',
867
+ 'Nidoqueen', 'Pikachu', 'Toxapex', 'Xerneas', 'Zacian', 'Zacian-Crowned', 'Uber > 1', 'AG ++ Uber > 1', 'Arena Trap', 'Huge Power',
1012
868
  'Moody', 'Pure Power', 'Shadow Tag', 'Swift Swim', 'Bright Powder', 'Focus Band', 'King\'s Rock', 'Lax Incense', 'Quick Claw',
1013
869
  'Baton Pass',
1014
870
  ],
@@ -1088,6 +944,8 @@ exports.Formats = [
1088
944
  'Decorate', 'Final Gambit', 'Flatter', 'Floral Healing', 'Flower Shield', 'Follow Me', 'Heal Pulse', 'Rage Powder', 'Swagger',
1089
945
  ],
1090
946
  },
947
+ // Brilliant Diamond/Shining Pearl
948
+ ///////////////////////////////////////////////////////////////////
1091
949
  {
1092
950
  section: "BD/SP",
1093
951
  column: 2,
@@ -1111,10 +969,7 @@ exports.Formats = [
1111
969
  ],
1112
970
  mod: 'gen8bdsp',
1113
971
  ruleset: ['Standard'],
1114
- banlist: [
1115
- 'Uber', 'Arena Trap', 'Drizzle', 'Moody', 'Sand Veil', 'Shadow Tag', 'Snow Cloak',
1116
- 'Bright Powder', 'King\'s Rock', 'Lax Incense', 'Razor Fang', 'Baton Pass',
1117
- ],
972
+ banlist: ['Uber', 'Arena Trap', 'Drizzle', 'Moody', 'Sand Veil', 'Shadow Tag', 'Snow Cloak', 'King\'s Rock', 'Razor Fang', 'Baton Pass'],
1118
973
  },
1119
974
  {
1120
975
  name: "[Gen 8 BDSP] Ubers",
@@ -1122,6 +977,7 @@ exports.Formats = [
1122
977
  `&bullet; <a href="https://www.smogon.com/forums/threads/3694036/">BDSP Ubers Discussion &amp; Resources</a>`,
1123
978
  ],
1124
979
  mod: 'gen8bdsp',
980
+ searchShow: false,
1125
981
  ruleset: ['Standard'],
1126
982
  banlist: ['AG', 'Baton Pass'],
1127
983
  },
@@ -1131,6 +987,7 @@ exports.Formats = [
1131
987
  `&bullet; <a href="https://www.smogon.com/forums/threads/3694307/">BDSP UU</a>`,
1132
988
  ],
1133
989
  mod: 'gen8bdsp',
990
+ searchShow: false,
1134
991
  ruleset: ['[Gen 8 BDSP] OU'],
1135
992
  banlist: ['OU', 'UUBL'],
1136
993
  },
@@ -1140,6 +997,7 @@ exports.Formats = [
1140
997
  `&bullet; <a href="https://www.smogon.com/forums/threads/3695563/">BDSP RU</a>`,
1141
998
  ],
1142
999
  mod: 'gen8bdsp',
1000
+ searchShow: false,
1143
1001
  ruleset: ['[Gen 8 BDSP] UU'],
1144
1002
  banlist: ['UU', 'RUBL', 'Drought'],
1145
1003
  },
@@ -1149,6 +1007,7 @@ exports.Formats = [
1149
1007
  `&bullet; <a href="https://www.smogon.com/forums/threads/3697080/">BDSP NU</a>`,
1150
1008
  ],
1151
1009
  mod: 'gen8bdsp',
1010
+ searchShow: false,
1152
1011
  ruleset: ['[Gen 8 BDSP] RU'],
1153
1012
  banlist: ['RU', 'NUBL', 'Damp Rock', 'Heat Rock'],
1154
1013
  },
@@ -1158,6 +1017,7 @@ exports.Formats = [
1158
1017
  `&bullet; <a href="https://www.smogon.com/forums/threads/3700009/">BDSP PU</a>`,
1159
1018
  ],
1160
1019
  mod: 'gen8bdsp',
1020
+ searchShow: false,
1161
1021
  ruleset: ['[Gen 8 BDSP] NU'],
1162
1022
  banlist: ['NU', 'PUBL'],
1163
1023
  },
@@ -1167,6 +1027,7 @@ exports.Formats = [
1167
1027
  `&bullet; <a href="https://www.smogon.com/forums/threads/3696004/">BDSP LC</a>`,
1168
1028
  ],
1169
1029
  mod: 'gen8bdsp',
1030
+ searchShow: false,
1170
1031
  ruleset: ['Little Cup', 'Standard'],
1171
1032
  banlist: ['Gligar', 'Meditite', 'Misdreavus', 'Munchlax', 'Murkrow', 'Scyther', 'Sneasel', 'Tangela', 'Vulpix', 'Yanma', 'Moody', 'Baton Pass', 'Sticky Web'],
1172
1033
  },
@@ -1176,6 +1037,7 @@ exports.Formats = [
1176
1037
  `&bullet; <a href="https://www.smogon.com/forums/threads/3694267/">BDSP Monotype</a>`,
1177
1038
  ],
1178
1039
  mod: 'gen8bdsp',
1040
+ searchShow: false,
1179
1041
  ruleset: ['[Gen 8 BDSP] OU', 'Same Type Clause'],
1180
1042
  },
1181
1043
  {
@@ -1187,15 +1049,6 @@ exports.Formats = [
1187
1049
  searchShow: false,
1188
1050
  ruleset: ['[Gen 8 BDSP] OU', '+CAP'],
1189
1051
  },
1190
- {
1191
- name: "[Gen 8 BDSP] 3v3 Singles",
1192
- threads: [
1193
- `&bullet; <a href="https://www.smogon.com/forums/threads/3695092/">BDSP 3v3 Singles</a>`,
1194
- ],
1195
- mod: 'gen8bdsp',
1196
- searchShow: false,
1197
- ruleset: ['Flat Rules', 'Min Source Gen = 8'],
1198
- },
1199
1052
  {
1200
1053
  name: "[Gen 8 BDSP] Doubles OU",
1201
1054
  threads: [
@@ -1213,18 +1066,11 @@ exports.Formats = [
1213
1066
  ],
1214
1067
  mod: 'gen8bdsp',
1215
1068
  gameType: 'doubles',
1216
- ruleset: ['Flat Rules', 'Min Source Gen = 8'],
1217
- },
1218
- {
1219
- name: "[Gen 8 BDSP] Pure Hackmons",
1220
- desc: `Anything that can be hacked in-game and is usable in local battles is allowed.`,
1221
- threads: [
1222
- `&bullet; <a href="https://www.smogon.com/forums/threads/3693868/">Pure Hackmons</a>`,
1223
- ],
1224
- mod: 'gen8bdsp',
1225
1069
  searchShow: false,
1226
- ruleset: ['-Nonexistent', 'Team Preview', 'HP Percentage Mod', 'Cancel Mod', 'Endless Battle Clause'],
1070
+ ruleset: ['Flat Rules', 'Min Source Gen = 8'],
1227
1071
  },
1072
+ // Challengeable OMs
1073
+ ///////////////////////////////////////////////////////////////////
1228
1074
  {
1229
1075
  section: "Challengeable OMs",
1230
1076
  column: 2,
@@ -1237,7 +1083,7 @@ exports.Formats = [
1237
1083
  ],
1238
1084
  mod: 'gen8',
1239
1085
  searchShow: false,
1240
- ruleset: ['Standard', 'Dynamax Clause', 'Camomons Mod'],
1086
+ ruleset: ['Standard OMs', 'Camomons Mod', 'Sleep Clause Mod'],
1241
1087
  banlist: [
1242
1088
  'Calyrex-Ice', 'Calyrex-Shadow', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Dragonite', 'Eternatus', 'Genesect', 'Giratina', 'Giratina-Origin',
1243
1089
  'Groudon', 'Ho-Oh', 'Hydreigon', 'Kartana', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala', 'Marshadow',
@@ -1254,7 +1100,7 @@ exports.Formats = [
1254
1100
  ],
1255
1101
  mod: 'gen8',
1256
1102
  searchShow: false,
1257
- ruleset: ['Standard', 'Overflow Stat Mod', 'Dynamax Clause', '2 Ability Clause'],
1103
+ ruleset: ['Standard OMs', '2 Ability Clause', 'Sleep Clause Mod'],
1258
1104
  banlist: ['Corsola-Galar', 'Sneasel', 'Type: Null', 'Arena Trap', 'Ice Scales', 'Moody', 'King\'s Rock', 'Baton Pass'],
1259
1105
  restricted: ['Chansey', 'Lunala', 'Shedinja', 'Solgaleo', 'Gorilla Tactics', 'Huge Power', 'Pure Power', 'Shadow Tag'],
1260
1106
  onValidateTeam(team) {
@@ -1334,67 +1180,256 @@ exports.Formats = [
1334
1180
  return [`${species.name} cannot use ${item.name} because it is cross evolved into ${crossSpecies.name}.`];
1335
1181
  }
1336
1182
  }
1337
- const ability = this.dex.abilities.get(set.ability);
1338
- if (!this.ruleTable.isRestricted(`ability:${ability.id}`) || Object.values(species.abilities).includes(ability.name)) {
1339
- set.species = crossSpecies.name;
1340
- }
1341
- // @ts-ignore
1342
- set.sp = species;
1343
- // @ts-ignore
1344
- set.crossSpecies = crossSpecies;
1345
- // @ts-ignore
1346
- set.crossMovesLeft = 2;
1347
- problems = this.validateSet(set, teamHas);
1348
- set.name = crossSpecies.name;
1349
- set.species = species.name;
1350
- return problems;
1351
- },
1352
- onModifySpecies(species, target, source, effect) {
1353
- if (!target)
1354
- return; // chat
1355
- if (effect && ['imposter', 'transform'].includes(effect.id))
1356
- return;
1357
- if (target.set.name === target.set.species)
1358
- return;
1359
- const crossSpecies = this.dex.species.get(target.set.name);
1360
- if (!crossSpecies.exists)
1361
- return;
1362
- if (species.battleOnly || !species.nfe)
1363
- return;
1364
- const crossIsUnreleased = (crossSpecies.tier === "Unreleased" && crossSpecies.isNonstandard === "Unobtainable");
1365
- if (crossSpecies.battleOnly || crossIsUnreleased || !crossSpecies.prevo)
1366
- return;
1367
- const crossPrevoSpecies = this.dex.species.get(crossSpecies.prevo);
1368
- if (!crossPrevoSpecies.prevo !== !species.prevo)
1369
- return;
1370
- const mixedSpecies = this.dex.deepClone(species);
1371
- mixedSpecies.weightkg =
1372
- Math.max(0.1, +(species.weightkg + crossSpecies.weightkg - crossPrevoSpecies.weightkg)).toFixed(1);
1373
- mixedSpecies.nfe = false;
1374
- mixedSpecies.evos = [];
1375
- mixedSpecies.eggGroups = crossSpecies.eggGroups;
1376
- mixedSpecies.abilities = crossSpecies.abilities;
1377
- mixedSpecies.bst = 0;
1378
- let i;
1379
- for (i in species.baseStats) {
1380
- const statChange = crossSpecies.baseStats[i] - crossPrevoSpecies.baseStats[i];
1381
- mixedSpecies.baseStats[i] = this.clampIntRange(species.baseStats[i] + statChange, 1, 255);
1382
- mixedSpecies.bst += mixedSpecies.baseStats[i];
1183
+ const ability = this.dex.abilities.get(set.ability);
1184
+ if (!this.ruleTable.isRestricted(`ability:${ability.id}`) || Object.values(species.abilities).includes(ability.name)) {
1185
+ set.species = crossSpecies.name;
1186
+ }
1187
+ // @ts-ignore
1188
+ set.sp = species;
1189
+ // @ts-ignore
1190
+ set.crossSpecies = crossSpecies;
1191
+ // @ts-ignore
1192
+ set.crossMovesLeft = 2;
1193
+ problems = this.validateSet(set, teamHas);
1194
+ set.name = crossSpecies.name;
1195
+ set.species = species.name;
1196
+ return problems;
1197
+ },
1198
+ onModifySpecies(species, target, source, effect) {
1199
+ if (!target)
1200
+ return; // chat
1201
+ if (effect && ['imposter', 'transform'].includes(effect.id))
1202
+ return;
1203
+ if (target.set.name === target.set.species)
1204
+ return;
1205
+ const crossSpecies = this.dex.species.get(target.set.name);
1206
+ if (!crossSpecies.exists)
1207
+ return;
1208
+ if (species.battleOnly || !species.nfe)
1209
+ return;
1210
+ const crossIsUnreleased = (crossSpecies.tier === "Unreleased" && crossSpecies.isNonstandard === "Unobtainable");
1211
+ if (crossSpecies.battleOnly || crossIsUnreleased || !crossSpecies.prevo)
1212
+ return;
1213
+ const crossPrevoSpecies = this.dex.species.get(crossSpecies.prevo);
1214
+ if (!crossPrevoSpecies.prevo !== !species.prevo)
1215
+ return;
1216
+ const mixedSpecies = this.dex.deepClone(species);
1217
+ mixedSpecies.weightkg =
1218
+ Math.max(0.1, +(species.weightkg + crossSpecies.weightkg - crossPrevoSpecies.weightkg)).toFixed(1);
1219
+ mixedSpecies.nfe = false;
1220
+ mixedSpecies.evos = [];
1221
+ mixedSpecies.eggGroups = crossSpecies.eggGroups;
1222
+ mixedSpecies.abilities = crossSpecies.abilities;
1223
+ mixedSpecies.bst = 0;
1224
+ let i;
1225
+ for (i in species.baseStats) {
1226
+ const statChange = crossSpecies.baseStats[i] - crossPrevoSpecies.baseStats[i];
1227
+ mixedSpecies.baseStats[i] = this.clampIntRange(species.baseStats[i] + statChange, 1, 255);
1228
+ mixedSpecies.bst += mixedSpecies.baseStats[i];
1229
+ }
1230
+ if (crossSpecies.types[0] !== crossPrevoSpecies.types[0])
1231
+ mixedSpecies.types[0] = crossSpecies.types[0];
1232
+ if (crossSpecies.types[1] !== crossPrevoSpecies.types[1]) {
1233
+ mixedSpecies.types[1] = crossSpecies.types[1] || crossSpecies.types[0];
1234
+ }
1235
+ if (mixedSpecies.types[0] === mixedSpecies.types[1])
1236
+ mixedSpecies.types = [mixedSpecies.types[0]];
1237
+ return mixedSpecies;
1238
+ },
1239
+ onBegin() {
1240
+ for (const pokemon of this.getAllPokemon()) {
1241
+ pokemon.baseSpecies = pokemon.species;
1242
+ }
1243
+ },
1244
+ },
1245
+ {
1246
+ name: "[Gen 8] Inheritance",
1247
+ desc: `Pok&eacute;mon may use the ability and moves of another, as long as they forfeit their own learnset.`,
1248
+ threads: [
1249
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3656811/">Inheritance</a>`,
1250
+ ],
1251
+ mod: 'gen8',
1252
+ searchShow: false,
1253
+ ruleset: ['Standard OMs', '2 Ability Clause', 'Sleep Moves Clause'],
1254
+ banlist: [
1255
+ 'Blacephalon', 'Blaziken', 'Butterfree', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chansey', 'Combusken', 'Cresselia', 'Darmanitan-Galar', 'Dialga',
1256
+ 'Dracovish', 'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Lugia',
1257
+ 'Lunala', 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Natu', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza',
1258
+ 'Regieleki', 'Regigigas', 'Reshiram', 'Sableye', 'Shedinja', 'Solgaleo', 'Spectrier', 'Tapu Koko', 'Toxtricity', 'Torkoal', 'Urshifu-Base',
1259
+ 'Xatu', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zeraora', 'Zekrom', 'Arena Trap', 'Contrary',
1260
+ 'Drizzle', 'Huge Power', 'Imposter', 'Innards Out', 'Libero', 'Moody', 'Power Construct', 'Pure Power', 'Quick Draw', 'Shadow Tag', 'Sheer Force',
1261
+ 'Simple', 'Unaware', 'Unburden', 'Water Bubble', 'King\'s Rock', 'Quick Claw', 'Baton Pass', 'Bolt Beak', 'Fishious Rend', 'Shell Smash',
1262
+ 'Thousand Arrows',
1263
+ ],
1264
+ getEvoFamily(speciesid) {
1265
+ let species = Dex.species.get(speciesid);
1266
+ while (species.prevo) {
1267
+ species = Dex.species.get(species.prevo);
1268
+ }
1269
+ return species.id;
1270
+ },
1271
+ validateSet(set, teamHas) {
1272
+ const unreleased = (pokemon) => pokemon.tier === "Unreleased" && pokemon.isNonstandard === "Unobtainable";
1273
+ if (!teamHas.abilityMap) {
1274
+ teamHas.abilityMap = Object.create(null);
1275
+ for (const pokemon of Dex.species.all()) {
1276
+ if (pokemon.isNonstandard || unreleased(pokemon))
1277
+ continue;
1278
+ if (pokemon.requiredAbility || pokemon.requiredItem || pokemon.requiredMove)
1279
+ continue;
1280
+ if (this.ruleTable.isBannedSpecies(pokemon))
1281
+ continue;
1282
+ for (const key of Object.values(pokemon.abilities)) {
1283
+ const abilityId = this.dex.toID(key);
1284
+ if (abilityId in teamHas.abilityMap) {
1285
+ teamHas.abilityMap[abilityId][pokemon.evos ? 'push' : 'unshift'](pokemon.id);
1286
+ }
1287
+ else {
1288
+ teamHas.abilityMap[abilityId] = [pokemon.id];
1289
+ }
1290
+ }
1291
+ }
1292
+ }
1293
+ const problem = this.validateForme(set);
1294
+ if (problem.length)
1295
+ return problem;
1296
+ const species = this.dex.species.get(set.species);
1297
+ if (!species.exists || species.num < 1)
1298
+ return [`The Pok\u00e9mon "${set.species}" does not exist.`];
1299
+ if (species.isNonstandard || unreleased(species)) {
1300
+ return [`${species.name} is not obtainable in Generation ${this.dex.gen}.`];
1301
+ }
1302
+ const name = set.name;
1303
+ if (this.ruleTable.isBannedSpecies(species)) {
1304
+ return this.validateSet(set, teamHas);
1305
+ }
1306
+ const ability = this.dex.abilities.get(set.ability);
1307
+ if (!ability.exists || ability.isNonstandard)
1308
+ return [`${name} needs to have a valid ability.`];
1309
+ const pokemonWithAbility = teamHas.abilityMap[ability.id];
1310
+ if (!pokemonWithAbility)
1311
+ return [`${ability.name} is not available on a legal Pok\u00e9mon.`];
1312
+ this.format.debug = true;
1313
+ if (!teamHas.abilitySources)
1314
+ teamHas.abilitySources = Object.create(null);
1315
+ const validSources = teamHas.abilitySources[this.dex.toID(set.species)] = []; // Evolution families
1316
+ let canonicalSource = ''; // Specific for the basic implementation of Donor Clause (see onValidateTeam).
1317
+ for (const donor of pokemonWithAbility) {
1318
+ const donorSpecies = this.dex.species.get(donor);
1319
+ let format = this.format;
1320
+ if (!format.getEvoFamily)
1321
+ format = this.dex.formats.get('gen8inheritance');
1322
+ const evoFamily = format.getEvoFamily(donorSpecies.id);
1323
+ if (validSources.includes(evoFamily))
1324
+ continue;
1325
+ set.species = donorSpecies.name;
1326
+ set.name = donorSpecies.baseSpecies;
1327
+ const problems = this.validateSet(set, teamHas) || [];
1328
+ if (!problems.length) {
1329
+ validSources.push(evoFamily);
1330
+ canonicalSource = donorSpecies.name;
1331
+ }
1332
+ // Specific for the basic implementation of Donor Clause (see onValidateTeam).
1333
+ if (validSources.length > 1)
1334
+ break;
1335
+ }
1336
+ this.format.debug = false;
1337
+ set.name = name;
1338
+ set.species = species.name;
1339
+ if (!validSources.length) {
1340
+ if (pokemonWithAbility.length > 1)
1341
+ return [`${name}'s set is illegal.`];
1342
+ return [`${name} has an illegal set with an ability from ${this.dex.species.get(pokemonWithAbility[0]).name}.`];
1343
+ }
1344
+ // Protocol: Include the data of the donor species in the `ability` data slot.
1345
+ // Afterwards, we are going to reset the name to what the user intended.
1346
+ set.ability = `${set.ability}0${canonicalSource}`;
1347
+ return null;
1348
+ },
1349
+ onValidateTeam(team, f, teamHas) {
1350
+ if (this.ruleTable.has('2abilityclause')) {
1351
+ const abilityTable = new Map();
1352
+ const base = {
1353
+ airlock: 'cloudnine',
1354
+ battlearmor: 'shellarmor',
1355
+ clearbody: 'whitesmoke',
1356
+ dazzling: 'queenlymajesty',
1357
+ emergencyexit: 'wimpout',
1358
+ filter: 'solidrock',
1359
+ gooey: 'tanglinghair',
1360
+ insomnia: 'vitalspirit',
1361
+ ironbarbs: 'roughskin',
1362
+ libero: 'protean',
1363
+ minus: 'plus',
1364
+ moxie: 'chillingneigh',
1365
+ powerofalchemy: 'receiver',
1366
+ propellertail: 'stalwart',
1367
+ teravolt: 'moldbreaker',
1368
+ turboblaze: 'moldbreaker',
1369
+ };
1370
+ for (const set of team) {
1371
+ let ability = this.toID(set.ability.split('0')[0]);
1372
+ if (!ability)
1373
+ continue;
1374
+ if (ability in base)
1375
+ ability = base[ability];
1376
+ if ((abilityTable.get(ability) || 0) >= 2) {
1377
+ return [
1378
+ `You are limited to two of each ability by 2 Ability Clause.`,
1379
+ `(You have more than two ${this.dex.abilities.get(ability).name} variants)`,
1380
+ ];
1381
+ }
1382
+ abilityTable.set(ability, (abilityTable.get(ability) || 0) + 1);
1383
+ }
1384
+ }
1385
+ // Donor Clause
1386
+ const evoFamilyLists = [];
1387
+ for (const set of team) {
1388
+ const abilitySources = teamHas.abilitySources?.[this.dex.toID(set.species)];
1389
+ if (!abilitySources)
1390
+ continue;
1391
+ let format = this.format;
1392
+ if (!format.getEvoFamily)
1393
+ format = this.dex.formats.get('gen8inheritance');
1394
+ evoFamilyLists.push(abilitySources.map(format.getEvoFamily));
1383
1395
  }
1384
- if (crossSpecies.types[0] !== crossPrevoSpecies.types[0])
1385
- mixedSpecies.types[0] = crossSpecies.types[0];
1386
- if (crossSpecies.types[1] !== crossPrevoSpecies.types[1]) {
1387
- mixedSpecies.types[1] = crossSpecies.types[1] || crossSpecies.types[0];
1396
+ // Checking actual full incompatibility would require expensive algebra.
1397
+ // Instead, we only check the trivial case of multiple Pokémon only legal for exactly one family. FIXME?
1398
+ const requiredFamilies = Object.create(null);
1399
+ for (const evoFamilies of evoFamilyLists) {
1400
+ if (evoFamilies.length !== 1)
1401
+ continue;
1402
+ const [familyId] = evoFamilies;
1403
+ if (!(familyId in requiredFamilies))
1404
+ requiredFamilies[familyId] = 1;
1405
+ requiredFamilies[familyId]++;
1406
+ if (requiredFamilies[familyId] > 2) {
1407
+ return [
1408
+ `You are limited to up to two inheritances from each evolution family by the Donor Clause.`,
1409
+ `(You inherit more than twice from ${this.dex.species.get(familyId).name}).`,
1410
+ ];
1411
+ }
1388
1412
  }
1389
- if (mixedSpecies.types[0] === mixedSpecies.types[1])
1390
- mixedSpecies.types = [mixedSpecies.types[0]];
1391
- return mixedSpecies;
1392
1413
  },
1393
1414
  onBegin() {
1394
1415
  for (const pokemon of this.getAllPokemon()) {
1395
- pokemon.baseSpecies = pokemon.species;
1416
+ if (pokemon.baseAbility.includes('0')) {
1417
+ const donor = pokemon.baseAbility.split('0')[1];
1418
+ pokemon.m.donor = this.toID(donor);
1419
+ pokemon.baseAbility = this.toID(pokemon.baseAbility.split('0')[0]);
1420
+ pokemon.ability = pokemon.baseAbility;
1421
+ }
1396
1422
  }
1397
1423
  },
1424
+ onSwitchIn(pokemon) {
1425
+ if (!pokemon.m.donor)
1426
+ return;
1427
+ const donorTemplate = this.dex.species.get(pokemon.m.donor);
1428
+ if (!donorTemplate.exists)
1429
+ return;
1430
+ // Place volatiles on the Pokémon to show the donor details.
1431
+ this.add('-start', pokemon, donorTemplate.name, '[silent]');
1432
+ },
1398
1433
  },
1399
1434
  {
1400
1435
  name: "[Gen 8] Linked",
@@ -1404,7 +1439,7 @@ exports.Formats = [
1404
1439
  ],
1405
1440
  mod: 'linked',
1406
1441
  searchShow: false,
1407
- ruleset: ['Standard', 'Dynamax Clause'],
1442
+ ruleset: ['Standard OMs', 'Sleep Clause Mod'],
1408
1443
  banlist: [
1409
1444
  'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Cloyster', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Eternatus', 'Genesect', 'Giratina',
1410
1445
  'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala',
@@ -1436,7 +1471,7 @@ exports.Formats = [
1436
1471
  ],
1437
1472
  mod: 'gen8',
1438
1473
  searchShow: false,
1439
- ruleset: ['Standard', 'Dynamax Clause', '2 Ability Clause', 'Sleep Moves Clause', '!Sleep Clause Mod'],
1474
+ ruleset: ['Standard OMs', '2 Ability Clause', 'Sleep Moves Clause'],
1440
1475
  banlist: [
1441
1476
  'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Dragonite', 'Eternatus',
1442
1477
  'Genesect', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem-Black', 'Kyurem-White',
@@ -1641,7 +1676,7 @@ exports.Formats = [
1641
1676
  ],
1642
1677
  mod: 'gen8',
1643
1678
  searchShow: false,
1644
- ruleset: ['Standard', 'Dynamax Clause'],
1679
+ ruleset: ['Standard OMs', 'Sleep Clause Mod'],
1645
1680
  banlist: [
1646
1681
  'Blissey', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chansey', 'Cloyster', 'Dialga', 'Eternatus', 'Genesect', 'Giratina',
1647
1682
  'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala',
@@ -1696,7 +1731,7 @@ exports.Formats = [
1696
1731
  ],
1697
1732
  mod: 'pokebilities',
1698
1733
  searchShow: false,
1699
- ruleset: ['Standard', 'Dynamax Clause'],
1734
+ ruleset: ['Standard OMs', 'Sleep Clause Mod'],
1700
1735
  banlist: [
1701
1736
  'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Conkeldurr', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Dracozolt',
1702
1737
  'Eternatus', 'Excadrill', 'Genesect', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kyogre', 'Kyurem-Black',
@@ -1735,10 +1770,29 @@ exports.Formats = [
1735
1770
  .filter(ability => ability !== pokemon.ability);
1736
1771
  }
1737
1772
  },
1773
+ onBeforeSwitchIn(pokemon) {
1774
+ // Abilities that must be applied before both sides trigger onSwitchIn to correctly
1775
+ // handle switch-in ability-to-ability interactions, e.g. Intimidate counters
1776
+ const neededBeforeSwitchInIDs = [
1777
+ 'clearbody', 'competitive', 'contrary', 'defiant', 'fullmetalbody', 'hypercutter', 'innerfocus',
1778
+ 'mirrorarmor', 'oblivious', 'owntempo', 'rattled', 'scrappy', 'simple', 'whitesmoke',
1779
+ ];
1780
+ if (pokemon.m.innates) {
1781
+ for (const innate of pokemon.m.innates) {
1782
+ if (!neededBeforeSwitchInIDs.includes(innate))
1783
+ continue;
1784
+ if (pokemon.hasAbility(innate))
1785
+ continue;
1786
+ pokemon.addVolatile("ability:" + innate, pokemon);
1787
+ }
1788
+ }
1789
+ },
1738
1790
  onSwitchInPriority: 2,
1739
1791
  onSwitchIn(pokemon) {
1740
1792
  if (pokemon.m.innates) {
1741
1793
  for (const innate of pokemon.m.innates) {
1794
+ if (pokemon.hasAbility(innate))
1795
+ continue;
1742
1796
  pokemon.addVolatile("ability:" + innate, pokemon);
1743
1797
  }
1744
1798
  }
@@ -1761,6 +1815,16 @@ exports.Formats = [
1761
1815
  pokemon.m.innates = undefined;
1762
1816
  },
1763
1817
  },
1818
+ {
1819
+ name: "[Gen 8] Pure Hackmons",
1820
+ desc: `Anything that can be hacked in-game and is usable in local battles is allowed.`,
1821
+ threads: [
1822
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3656851/">Pure Hackmons</a>`,
1823
+ ],
1824
+ mod: 'gen8',
1825
+ searchShow: false,
1826
+ ruleset: ['-Nonexistent', 'Team Preview', 'HP Percentage Mod', 'Cancel Mod', 'Endless Battle Clause'],
1827
+ },
1764
1828
  {
1765
1829
  name: "[Gen 8] Shared Power",
1766
1830
  desc: `Once a Pok&eacute;mon switches in, its ability is shared with the rest of the team.`,
@@ -1769,7 +1833,7 @@ exports.Formats = [
1769
1833
  ],
1770
1834
  mod: 'sharedpower',
1771
1835
  searchShow: false,
1772
- ruleset: ['Standard', 'Dynamax Clause'],
1836
+ ruleset: ['Standard OMs', 'Sleep Clause Mod'],
1773
1837
  banlist: [
1774
1838
  'Calyrex-Ice', 'Calyrex-Shadow', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Eternatus', 'Genesect', 'Giratina',
1775
1839
  'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna',
@@ -1836,7 +1900,7 @@ exports.Formats = [
1836
1900
  searchShow: false,
1837
1901
  challengeShow: false,
1838
1902
  tournamentShow: false,
1839
- ruleset: ['Standard', 'Dynamax Clause'],
1903
+ ruleset: ['Standard OMs', 'Sleep Clause Mod'],
1840
1904
  banlist: [
1841
1905
  'Calyrex-Ice', 'Calyrex-Shadow', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Dragapult', 'Eternatus', 'Kyurem-Black', 'Kyurem-White', 'Giratina',
1842
1906
  'Giratina-Origin', 'Genesect', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Lugia', 'Lunala', 'Magearna', 'Marowak-Alola', 'Marshadow', 'Melmetal',
@@ -1943,7 +2007,7 @@ exports.Formats = [
1943
2007
  ],
1944
2008
  mod: 'gen8',
1945
2009
  searchShow: false,
1946
- ruleset: ['Standard', '!OHKO Clause', 'Picked Team Size = 6', 'Adjust Level = 100'],
2010
+ ruleset: ['Standard OMs', 'Sleep Clause Mod', '!OHKO Clause', 'Picked Team Size = 6', 'Adjust Level = 100'],
1947
2011
  banlist: [
1948
2012
  'Sandshrew-Alola', 'Shedinja', 'Infiltrator', 'Magic Guard', 'Choice Scarf',
1949
2013
  'Explosion', 'Final Gambit', 'Healing Wish', 'Lunar Dance', 'Magic Room', 'Memento', 'Misty Explosion', 'Self-Destruct',
@@ -2057,6 +2121,18 @@ exports.Formats = [
2057
2121
  },
2058
2122
  },
2059
2123
  },
2124
+ // Randomized Format Spotlight
2125
+ ///////////////////////////////////////////////////////////////////
2126
+ {
2127
+ section: "Randomized Format Spotlight",
2128
+ column: 2,
2129
+ },
2130
+ {
2131
+ name: "[Gen 3] Challenge Cup",
2132
+ mod: 'gen3',
2133
+ team: 'randomCC',
2134
+ ruleset: ['Obtainable', 'HP Percentage Mod', 'Cancel Mod'],
2135
+ },
2060
2136
  // Randomized Metas
2061
2137
  ///////////////////////////////////////////////////////////////////
2062
2138
  {
@@ -2377,44 +2453,36 @@ exports.Formats = [
2377
2453
  column: 3,
2378
2454
  },
2379
2455
  {
2380
- name: "[Gen 2] Ubers",
2456
+ name: "[Gen 3] Ubers",
2381
2457
  threads: [
2382
- `&bullet; <a href="https://www.smogon.com/forums/posts/8286282/">GSC Ubers</a>`,
2458
+ `&bullet; <a href="https://www.smogon.com/forums/posts/8286280/">ADV Ubers</a>`,
2383
2459
  ],
2384
- mod: 'gen2',
2460
+ mod: 'gen3',
2385
2461
  // searchShow: false,
2386
- ruleset: ['Standard'],
2462
+ ruleset: ['Standard', 'Deoxys Camouflage Clause', 'One Baton Pass Clause'],
2463
+ banlist: ['Wobbuffet + Leftovers'],
2387
2464
  },
2388
2465
  {
2389
- name: "[Gen 3] 1v1",
2390
- desc: `Bring three Pok&eacute;mon to Team Preview and choose one to battle.`,
2466
+ name: "[Gen 5] RU",
2391
2467
  threads: [
2392
- `&bullet; <a href="https://www.smogon.com/forums/posts/8031456/">ADV 1v1</a>`,
2468
+ `&bullet; <a href="https://www.smogon.com/forums/posts/6431094/">BW2 Sample Teams</a>`,
2469
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3473124/">BW2 RU Viability Rankings</a>`,
2393
2470
  ],
2394
- mod: 'gen3',
2471
+ mod: 'gen5',
2395
2472
  // searchShow: false,
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'],
2473
+ ruleset: ['[Gen 5] UU', 'Baton Pass Clause', '!Sleep Clause Mod', 'Sleep Moves Clause'],
2474
+ banlist: ['UU', 'RUBL', 'Shadow Tag', 'Shell Smash + Baton Pass'],
2475
+ unbanlist: ['Prankster + Assist', 'Prankster + Copycat', 'Baton Pass'],
2405
2476
  },
2406
2477
  {
2407
- name: "[Gen 1] Stadium OU",
2478
+ name: "[Gen 7 Let's Go] UU",
2408
2479
  threads: [
2409
- `&bullet; <a href="https://www.smogon.com/forums/threads/3685877/">Stadium OU Viability Rankings</a>`,
2480
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3659882/">LGPE UU Metagame Discussion &amp; Resources</a>`,
2410
2481
  ],
2411
- mod: 'gen1stadium',
2482
+ mod: 'gen7letsgo',
2412
2483
  // searchShow: false,
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
- ],
2484
+ ruleset: ['[Gen 7 Let\'s Go] OU'],
2485
+ banlist: ['OU', 'UUBL'],
2418
2486
  },
2419
2487
  // Past Gens OU
2420
2488
  ///////////////////////////////////////////////////////////////////
@@ -2521,7 +2589,7 @@ exports.Formats = [
2521
2589
  `&bullet; <a href="https://www.smogon.com/forums/posts/8778656/">USM Mix and Mega</a>`,
2522
2590
  ],
2523
2591
  mod: 'gen7mixandmega',
2524
- ruleset: ['Standard', 'Mega Rayquaza Clause', 'Overflow Stat Mod'],
2592
+ ruleset: ['Standard OMs', 'Mega Rayquaza Clause', 'Sleep Clause Mod'],
2525
2593
  banlist: ['Shadow Tag', 'Gengarite', 'Baton Pass', 'Electrify'],
2526
2594
  restricted: [
2527
2595
  'Arceus', 'Deoxys', 'Dialga', 'Dragonite', 'Giratina', 'Groudon', 'Ho-Oh', 'Kyogre', 'Kyurem', 'Landorus-Therian', 'Lugia',
@@ -2708,8 +2776,7 @@ exports.Formats = [
2708
2776
  'Groudon', 'Ho-Oh', 'Hoopa-Unbound', 'Kangaskhan-Mega', 'Kartana', 'Kyogre', 'Kyurem-White', 'Lucario-Mega', 'Lugia', 'Lunala', 'Magearna',
2709
2777
  'Marshadow', 'Mawile-Mega', 'Medicham-Mega', 'Metagross-Mega', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia',
2710
2778
  'Pheromosa', 'Rayquaza', 'Reshiram', 'Salamence-Mega', 'Shaymin-Sky', 'Solgaleo', 'Tapu Lele', 'Xerneas', 'Yveltal', 'Zekrom', 'Zygarde',
2711
- 'Battle Bond', 'Shadow Tag', 'Bright Powder', 'Damp Rock', 'Focus Band', 'King\'s Rock', 'Lax Incense', 'Quick Claw', 'Razor Fang',
2712
- 'Smooth Rock', 'Terrain Extender', 'Baton Pass',
2779
+ 'Battle Bond', 'Shadow Tag', 'Damp Rock', 'Focus Band', 'King\'s Rock', 'Quick Claw', 'Razor Fang', 'Smooth Rock', 'Terrain Extender', 'Baton Pass',
2713
2780
  ],
2714
2781
  },
2715
2782
  {
@@ -2997,8 +3064,7 @@ exports.Formats = [
2997
3064
  'Gengar-Mega', 'Giratina', 'Giratina-Origin', 'Greninja', 'Groudon', 'Ho-Oh', 'Hoopa-Unbound', 'Kangaskhan-Mega', 'Kyogre', 'Kyurem-White',
2998
3065
  'Lucario-Mega', 'Lugia', 'Mawile-Mega', 'Medicham-Mega', 'Metagross-Mega', 'Mewtwo', 'Palkia', 'Rayquaza', 'Reshiram', 'Sableye-Mega',
2999
3066
  'Salamence-Mega', 'Shaymin-Sky', 'Slowbro-Mega', 'Talonflame', 'Xerneas', 'Yveltal', 'Zekrom',
3000
- 'Shadow Tag', 'Bright Powder', 'Damp Rock', 'Focus Band', 'King\'s Rock', 'Lax Incense', 'Quick Claw', 'Razor Fang', 'Smooth Rock',
3001
- 'Soul Dew', 'Baton Pass',
3067
+ 'Shadow Tag', 'Damp Rock', 'Focus Band', 'King\'s Rock', 'Quick Claw', 'Razor Fang', 'Smooth Rock', 'Soul Dew', 'Baton Pass',
3002
3068
  ],
3003
3069
  },
3004
3070
  {
@@ -3199,18 +3265,6 @@ exports.Formats = [
3199
3265
  ruleset: ['Standard', 'Evasion Abilities Clause', 'Swagger Clause', 'Sleep Clause Mod'],
3200
3266
  banlist: ['Uber', 'OU', 'UUBL', 'Arena Trap', 'Drought', 'Sand Stream', 'Snow Warning', 'Prankster + Assist', 'Prankster + Copycat', 'Baton Pass'],
3201
3267
  },
3202
- {
3203
- name: "[Gen 5] RU",
3204
- threads: [
3205
- `&bullet; <a href="https://www.smogon.com/forums/posts/6431094/">BW2 Sample Teams</a>`,
3206
- `&bullet; <a href="https://www.smogon.com/forums/threads/3473124/">BW2 RU Viability Rankings</a>`,
3207
- ],
3208
- mod: 'gen5',
3209
- searchShow: false,
3210
- ruleset: ['[Gen 5] UU', 'Baton Pass Clause', '!Sleep Clause Mod', 'Sleep Moves Clause'],
3211
- banlist: ['UU', 'RUBL', 'Shadow Tag', 'Shell Smash + Baton Pass'],
3212
- unbanlist: ['Prankster + Assist', 'Prankster + Copycat', 'Baton Pass'],
3213
- },
3214
3268
  {
3215
3269
  name: "[Gen 5] NU",
3216
3270
  threads: [
@@ -3255,6 +3309,7 @@ exports.Formats = [
3255
3309
  mod: 'gen5',
3256
3310
  searchShow: false,
3257
3311
  ruleset: ['[Gen 5] OU', 'Same Type Clause', '!Gems Clause'],
3312
+ banlist: ['Latios'],
3258
3313
  },
3259
3314
  {
3260
3315
  name: "[Gen 5] 1v1",
@@ -3268,7 +3323,7 @@ exports.Formats = [
3268
3323
  'Picked Team Size = 1', 'Max Team Size = 3',
3269
3324
  'Standard', 'Baton Pass Clause', 'Swagger Clause', 'Accuracy Moves Clause', 'Sleep Moves Clause',
3270
3325
  ],
3271
- 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'],
3326
+ banlist: ['Uber', 'Cottonee', 'Dragonite', 'Jirachi', 'Kyurem-Black', 'Mew', 'Togekiss', 'Whimsicott', 'Victini', 'Focus Band', 'Focus Sash', 'Quick Claw', 'Soul Dew', 'Perish Song'],
3272
3327
  unbanlist: ['Genesect', 'Landorus', 'Manaphy', 'Thundurus', 'Tornadus-Therian'],
3273
3328
  },
3274
3329
  {
@@ -3280,6 +3335,7 @@ exports.Formats = [
3280
3335
  searchShow: false,
3281
3336
  ruleset: ['[Gen 5] PU'],
3282
3337
  banlist: ['PU', 'Articuno', 'Dragonair', 'Glalie', 'Machoke', 'Marowak', 'Omanyte', 'Regigigas', 'Trubbish', 'Whirlipede', 'Baton Pass'],
3338
+ unbanlist: ['Damp Rock'],
3283
3339
  },
3284
3340
  {
3285
3341
  name: "[Gen 5] GBU Singles",
@@ -3461,7 +3517,7 @@ exports.Formats = [
3461
3517
  ruleset: ['[Gen 4] PU'],
3462
3518
  banlist: [
3463
3519
  'Ampharos', 'Armaldo', 'Bellossom', 'Dragonair', 'Electabuzz', 'Gabite', 'Gastrodon', 'Glaceon', 'Glalie',
3464
- 'Golduck', 'Gorebyss', 'Hippopotas', 'Kadabra', 'Machoke', 'Magmar', 'Mantine', 'Marowak', 'Metang',
3520
+ 'Golduck', 'Gorebyss', 'Hippopotas', 'Kadabra', 'Lapras', 'Machoke', 'Magmar', 'Mantine', 'Marowak', 'Metang',
3465
3521
  'Misdreavus', 'Monferno', 'Mr. Mime', 'Muk', 'Murkrow', 'Pinsir', 'Politoed', 'Purugly', 'Quagsire',
3466
3522
  'Raichu', 'Rampardos', 'Rapidash', 'Regigigas', 'Relicanth', 'Rhydon', 'Scyther', 'Sneasel', 'Snover',
3467
3523
  'Solrock', 'Tangela', 'Torkoal', 'Victreebel', 'Xatu', 'Zangoose', 'Damp Rock',
@@ -3525,16 +3581,6 @@ exports.Formats = [
3525
3581
  section: "Past Generations",
3526
3582
  column: 5,
3527
3583
  },
3528
- {
3529
- name: "[Gen 3] Ubers",
3530
- threads: [
3531
- `&bullet; <a href="https://www.smogon.com/forums/posts/8286280/">ADV Ubers</a>`,
3532
- ],
3533
- mod: 'gen3',
3534
- searchShow: false,
3535
- ruleset: ['Standard', 'Deoxys Camouflage Clause', 'One Baton Pass Clause'],
3536
- banlist: ['Wobbuffet + Leftovers'],
3537
- },
3538
3584
  {
3539
3585
  name: "[Gen 3] UU",
3540
3586
  threads: [
@@ -3544,7 +3590,7 @@ exports.Formats = [
3544
3590
  mod: 'gen3',
3545
3591
  searchShow: false,
3546
3592
  ruleset: ['Standard'],
3547
- banlist: ['Uber', 'OU', 'UUBL', 'Smeargle + Ingrain', 'Arena Trap', 'Bright Powder', 'Lax Incense', 'Baton Pass', 'Swagger'],
3593
+ banlist: ['Uber', 'OU', 'UUBL', 'Smeargle + Ingrain', 'Arena Trap', 'Baton Pass', 'Swagger'],
3548
3594
  },
3549
3595
  {
3550
3596
  name: "[Gen 3] NU",
@@ -3556,6 +3602,24 @@ exports.Formats = [
3556
3602
  ruleset: ['Standard'],
3557
3603
  banlist: ['Uber', 'OU', 'UUBL', 'UU', 'Smeargle + Ingrain'],
3558
3604
  },
3605
+ {
3606
+ name: "[Gen 3] 1v1",
3607
+ desc: `Bring three Pok&eacute;mon to Team Preview and choose one to battle.`,
3608
+ threads: [
3609
+ `&bullet; <a href="https://www.smogon.com/forums/posts/8031456/">ADV 1v1</a>`,
3610
+ ],
3611
+ mod: 'gen3',
3612
+ searchShow: false,
3613
+ ruleset: [
3614
+ 'Picked Team Size = 1', 'Max Team Size = 3',
3615
+ '[Gen 3] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview', '!Freeze Clause Mod',
3616
+ ],
3617
+ banlist: [
3618
+ 'Clefable', 'Slaking', 'Snorlax', 'Suicune', 'Zapdos', 'Destiny Bond', 'Explosion', 'Ingrain', 'Perish Song',
3619
+ 'Self-Destruct', 'Focus Band', 'King\'s Rock', 'Quick Claw',
3620
+ ],
3621
+ unbanlist: ['Mr. Mime', 'Wobbuffet', 'Wynaut', 'Sand Veil'],
3622
+ },
3559
3623
  {
3560
3624
  name: "[Gen 3] Doubles OU",
3561
3625
  threads: [
@@ -3584,6 +3648,15 @@ exports.Formats = [
3584
3648
  debug: true,
3585
3649
  ruleset: ['HP Percentage Mod', 'Cancel Mod', 'Max Team Size = 24', 'Max Move Count = 24', 'Max Level = 9999', 'Default Level = 100'],
3586
3650
  },
3651
+ {
3652
+ name: "[Gen 2] Ubers",
3653
+ threads: [
3654
+ `&bullet; <a href="https://www.smogon.com/forums/posts/8286282/">GSC Ubers</a>`,
3655
+ ],
3656
+ mod: 'gen2',
3657
+ searchShow: false,
3658
+ ruleset: ['Standard'],
3659
+ },
3587
3660
  {
3588
3661
  name: "[Gen 2] UU",
3589
3662
  threads: [`&bullet; <a href="https://www.smogon.com/forums/threads/3576710/">GSC UU</a>`],
@@ -3591,6 +3664,7 @@ exports.Formats = [
3591
3664
  searchShow: false,
3592
3665
  ruleset: ['[Gen 2] OU'],
3593
3666
  banlist: ['OU', 'UUBL'],
3667
+ unbanlist: ['Mean Look + Baton Pass', 'Spider Web + Baton Pass'],
3594
3668
  },
3595
3669
  {
3596
3670
  name: "[Gen 2] NU",
@@ -3610,7 +3684,7 @@ exports.Formats = [
3610
3684
  '[Gen 2] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview',
3611
3685
  ],
3612
3686
  banlist: [
3613
- 'Alakazam', 'Clefable', 'Snorlax', 'Zapdos', 'Berserk Gene', 'Bright Powder', 'Focus Band', 'King\'s Rock', 'Quick Claw',
3687
+ 'Alakazam', 'Clefable', 'Snorlax', 'Zapdos', 'Berserk Gene', 'Focus Band', 'King\'s Rock', 'Quick Claw',
3614
3688
  'Attract', 'Destiny Bond', 'Explosion', 'Perish Song', 'Present', 'Self-Destruct', 'Swagger',
3615
3689
  ],
3616
3690
  },
@@ -3673,9 +3747,22 @@ exports.Formats = [
3673
3747
  ],
3674
3748
  mod: 'gen1',
3675
3749
  searchShow: false,
3676
- ruleset: ['[Gen 1] UU'],
3750
+ ruleset: ['[Gen 1] UU', '!APT Clause'],
3677
3751
  banlist: ['UU', 'NUBL'],
3678
3752
  },
3753
+ {
3754
+ name: "[Gen 1] 1v1",
3755
+ threads: [
3756
+ `&bullet; <a href="https://www.smogon.com/forums/posts/8031462">RBY 1v1</a>`,
3757
+ ],
3758
+ mod: 'gen1',
3759
+ searchShow: false,
3760
+ ruleset: [
3761
+ 'Picked Team Size = 1', 'Max Team Size = 3',
3762
+ '[Gen 1] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview',
3763
+ ],
3764
+ banlist: ['Bind', 'Clamp', 'Explosion', 'Fire Spin', 'Self-Destruct', 'Wrap'],
3765
+ },
3679
3766
  {
3680
3767
  name: "[Gen 1] Japanese OU",
3681
3768
  desc: `Generation 1 with Japanese battle mechanics.`,
@@ -3697,6 +3784,19 @@ exports.Formats = [
3697
3784
  ],
3698
3785
  banlist: ['Uber'],
3699
3786
  },
3787
+ {
3788
+ name: "[Gen 1] Stadium OU",
3789
+ threads: [
3790
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3685877/">Stadium OU Viability Rankings</a>`,
3791
+ ],
3792
+ mod: 'gen1stadium',
3793
+ searchShow: false,
3794
+ ruleset: ['Standard', 'Team Preview'],
3795
+ banlist: ['Uber',
3796
+ 'Nidoking + Fury Attack + Thrash', 'Exeggutor + Poison Powder + Stomp', 'Exeggutor + Sleep Powder + Stomp',
3797
+ 'Exeggutor + Stun Spore + Stomp', 'Jolteon + Focus Energy + Thunder Shock', 'Flareon + Focus Energy + Ember',
3798
+ ],
3799
+ },
3700
3800
  {
3701
3801
  name: "[Gen 1] Tradebacks OU",
3702
3802
  desc: `RBY OU with movepool additions from the Time Capsule.`,