@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
package/config/formats.ts CHANGED
@@ -86,10 +86,7 @@ export const Formats: FormatList = [
86
86
 
87
87
  mod: 'gen8',
88
88
  ruleset: ['Standard', 'Dynamax Clause'],
89
- banlist: [
90
- 'Uber', 'AG', 'Arena Trap', 'Moody', 'Power Construct', 'Sand Veil', 'Shadow Tag', 'Snow Cloak',
91
- 'Bright Powder', 'King\'s Rock', 'Lax Incense', 'Baton Pass',
92
- ],
89
+ banlist: ['Uber', 'AG', 'Arena Trap', 'Moody', 'Power Construct', 'Sand Veil', 'Shadow Tag', 'Snow Cloak', 'King\'s Rock', 'Baton Pass'],
93
90
  },
94
91
  {
95
92
  name: "[Gen 8] OU (Blitz)",
@@ -167,8 +164,8 @@ export const Formats: FormatList = [
167
164
  mod: 'gen8',
168
165
  ruleset: ['Little Cup', 'Standard', 'Dynamax Clause'],
169
166
  banlist: [
170
- 'Corsola-Galar', 'Cutiefly', 'Drifloon', 'Gastly', 'Gothita', 'Rufflet', 'Scraggy', 'Scyther', 'Sneasel', 'Swirlix', 'Tangela', 'Vullaby', 'Vulpix-Alola', 'Woobat', 'Zigzagoon-Base',
171
- 'Chlorophyll', 'Moody', 'Baton Pass', 'Sticky Web',
167
+ 'Corsola-Galar', 'Cutiefly', 'Drifloon', 'Gastly', 'Gothita', 'Rufflet', 'Scraggy', 'Scyther', 'Sneasel', 'Swirlix',
168
+ 'Tangela', 'Vullaby', 'Vulpix-Alola', 'Woobat', 'Zigzagoon-Base', 'Chlorophyll', 'Moody', 'Baton Pass', 'Sticky Web',
172
169
  ],
173
170
  },
174
171
  {
@@ -186,8 +183,8 @@ export const Formats: FormatList = [
186
183
  'Blaziken', 'Calyrex-Ice', 'Calyrex-Shadow', 'Dialga', 'Dracovish', 'Eternatus', 'Genesect', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh',
187
184
  'Kartana', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Mewtwo', 'Naganadel',
188
185
  'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Reshiram', 'Solgaleo', 'Urshifu-Base', 'Xerneas', 'Yveltal',
189
- 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Zygarde-Base', 'Moody', 'Power Construct', 'Shadow Tag', 'Bright Powder',
190
- 'Damp Rock', 'Focus Band', 'King\'s Rock', 'Lax Incense', 'Quick Claw', 'Smooth Rock', 'Terrain Extender', 'Acupressure', 'Baton Pass',
186
+ 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Zygarde-Base', 'Moody', 'Power Construct', 'Shadow Tag', 'Damp Rock',
187
+ 'Focus Band', 'King\'s Rock', 'Quick Claw', 'Smooth Rock', 'Terrain Extender', 'Acupressure', 'Baton Pass',
191
188
  ],
192
189
  },
193
190
  {
@@ -235,8 +232,9 @@ export const Formats: FormatList = [
235
232
  mod: 'gen8',
236
233
  ruleset: ['[Gen 8] PU'],
237
234
  banlist: [
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',
235
+ 'PU', 'Arctovish', 'Aurorus', 'Basculin', 'Centiskorch', 'Drampa', 'Exeggutor-Alola', 'Gallade', 'Haunter', 'Magmortar', 'Magneton',
236
+ 'Malamar', 'Ninjask', 'Omastar', 'Rotom-Frost', 'Turtonator', 'Vanilluxe', 'Vikavolt', 'Silvally-Dragon', 'Silvally-Ground', 'Sneasel',
237
+ 'Damp Rock', 'Grassy Seed',
240
238
  ],
241
239
  },
242
240
  {
@@ -286,8 +284,20 @@ export const Formats: FormatList = [
286
284
  name: "[Gen 8] Battle Stadium Singles",
287
285
 
288
286
  mod: 'gen8',
289
- ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 8', 'Limit Two Restricted'],
290
- restricted: ['Restricted Legendary'],
287
+ ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 8'],
288
+ banlist: ['Eternatus-Eternamax'],
289
+ unbanlist: ['Mythical', 'Restricted Legendary'],
290
+ },
291
+ {
292
+ name: "[Gen 8] I Choose 'Chu!",
293
+ threads: [
294
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3705481/">I Choose 'Chu! Discussion</a>`,
295
+ ],
296
+
297
+ mod: 'gen8',
298
+ ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 8'],
299
+ banlist: ['All Pokemon', 'Raichu-Alola + Sing'],
300
+ unbanlist: ['Pichu', 'Pikachu', 'Raichu'],
291
301
  },
292
302
  {
293
303
  name: "[Gen 8] Custom Game",
@@ -374,6 +384,22 @@ export const Formats: FormatList = [
374
384
  ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 8', 'VGC Timer', 'Limit Two Restricted'],
375
385
  restricted: ['Restricted Legendary'],
376
386
  },
387
+ {
388
+ name: "[Gen 8] Battle Stadium Doubles Series 13",
389
+
390
+ mod: 'gen8',
391
+ gameType: 'doubles',
392
+ ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 8', 'VGC Timer'],
393
+ banlist: ['Eternatus-Eternamax'],
394
+ unbanlist: ['Mythical', 'Restricted Legendary'],
395
+ },
396
+ {
397
+ name: "[Gen 8] Spikemuth Cup",
398
+
399
+ mod: 'gen8',
400
+ gameType: 'doubles',
401
+ ruleset: ['Flat Rules', 'Dynamax Clause', '!! Adjust Level = 50', 'Min Source Gen = 8', 'VGC Timer'],
402
+ },
377
403
  {
378
404
  name: "[Gen 8] VGC 2021",
379
405
 
@@ -452,18 +478,6 @@ export const Formats: FormatList = [
452
478
  }
453
479
  },
454
480
  },
455
- {
456
- name: "[Gen 8] Jump! Magikarp!",
457
- desc: `Every team must contain Magikarp and bring it to the game.`,
458
- threads: [
459
- `&bullet; <a href="https://www.smogon.com/forums/threads/3704588/">Jump! Magikarp!</a>`,
460
- ],
461
-
462
- mod: 'gen8',
463
- gameType: 'doubles',
464
- ruleset: ['Flat Rules', '!! Picked Team Size = 2', '!! Adjust Level = 50', 'Min Source Gen = 8', 'Force Select = Magikarp'],
465
- banlist: ['Sub-Legendary'],
466
- },
467
481
  {
468
482
  name: "[Gen 8] Doubles Custom Game",
469
483
 
@@ -492,17 +506,7 @@ export const Formats: FormatList = [
492
506
 
493
507
  mod: 'gen8',
494
508
  ruleset: ['Standard NatDex', 'OHKO Clause', 'Evasion Moves Clause', 'Species Clause', 'Dynamax Clause', 'Sleep Clause Mod'],
495
- banlist: [
496
- 'Alakazam-Mega', 'Arceus', 'Blastoise-Mega', 'Blaziken-Mega', 'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Darkrai',
497
- 'Darmanitan-Galar', 'Deoxys-Attack', 'Deoxys-Base', 'Deoxys-Speed', 'Dialga', 'Dracovish', 'Dragapult', 'Eternatus',
498
- 'Genesect', 'Gengar-Mega', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kangaskhan-Mega', 'Kyogre', 'Kyurem-Black',
499
- 'Kyurem-White', 'Landorus-Base', 'Lucario-Mega', 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Metagross-Mega', 'Mewtwo',
500
- 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Necrozma-Ultra', 'Palkia', 'Pheromosa', 'Rayquaza', 'Reshiram',
501
- 'Salamence-Mega', 'Shaymin-Sky', 'Solgaleo', 'Spectrier', 'Tornadus-Therian', 'Urshifu-Base', 'Xerneas', 'Yveltal', 'Zacian',
502
- 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Zygarde-Base', 'Zygarde-Complete', 'Arena Trap', 'Moody',
503
- 'Power Construct', 'Sand Veil', 'Shadow Tag', 'Snow Cloak', 'Bright Powder', 'King\'s Rock', 'Lax Incense', 'Razor Fang',
504
- 'Quick Claw', 'Baton Pass',
505
- ],
509
+ 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'],
506
510
  },
507
511
  {
508
512
  name: "[Gen 8] National Dex UU",
@@ -514,25 +518,18 @@ export const Formats: FormatList = [
514
518
 
515
519
  mod: 'gen8',
516
520
  ruleset: ['[Gen 8] National Dex'],
517
- banlist: [
518
- // National Dex OU
519
- 'Blissey', 'Chansey', 'Charizard-Mega-X', 'Charizard-Mega-Y', 'Clefable', 'Corviknight', 'Diancie-Mega', 'Excadrill',
520
- 'Ferrothorn', 'Garchomp', 'Gliscor', 'Greninja', 'Heatran', 'Kartana', 'Kommo-o', 'Kyurem', 'Landorus-Therian', 'Lopunny-Mega',
521
- 'Magnezone', 'Mawile-Mega', 'Pelipper', 'Rillaboom', 'Scizor-Mega', 'Serperior', 'Slowbro-Base', 'Swampert-Mega', 'Tapu Fini',
522
- 'Tapu Koko', 'Tapu Lele', 'Toxapex', 'Tyranitar', 'Victini', 'Volcarona', 'Weavile', 'Zapdos-Base',
523
- 'ND UUBL', // National Dex UUBL
524
- 'Drizzle', 'Drought', 'Light Clay',
525
- // Slowbronite is banned so it doesn't validate on Galarian Slowbro
526
- 'Slowbronite',
527
- ],
528
- // Used to distinguish UU from below UU in the client
529
- restricted: [
530
- 'Aegislash', 'Altaria-Mega', 'Amoonguss', 'Azumarill', 'Beedrill-Mega', 'Breloom', 'Celesteela', 'Chandelure', 'Donphan', 'Dracozolt',
531
- 'Dragonite', 'Feraligatr', 'Gastrodon', 'Hatterene', 'Hippowdon', 'Infernape', 'Keldeo', 'Krookodile', 'Mamoswine', 'Mandibuzz',
532
- 'Manectric-Mega', 'Melmetal', 'Mienshao', 'Moltres-Base', 'Nidoking', 'Nidoqueen', 'Nihilego', 'Quagsire', 'Regieleki', 'Ribombee',
533
- 'Rotom-Heat', 'Rotom-Wash', 'Salamence', 'Scizor', 'Skarmory', 'Slowking-Base', 'Swampert-Base', 'Talonflame', 'Tangrowth', 'Tornadus-Base',
534
- 'Umbreon', 'Urshifu-Rapid-Strike',
521
+ banlist: ['ND OU', 'ND UUBL', 'Drizzle', 'Drought', 'Light Clay', 'Slowbronite'],
522
+ },
523
+ {
524
+ name: "[Gen 8] National Dex RU",
525
+ threads: [
526
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3691290/">National Dex RU</a>`,
535
527
  ],
528
+
529
+ mod: 'gen8',
530
+ searchShow: false,
531
+ ruleset: ['[Gen 8] National Dex UU'],
532
+ banlist: ['ND UU', 'ND RUBL'],
536
533
  },
537
534
  {
538
535
  name: "[Gen 8] National Dex Monotype",
@@ -571,41 +568,56 @@ export const Formats: FormatList = [
571
568
  section: "Pet Mods",
572
569
  },
573
570
  {
574
- name: "[Gen 8] Restrictions",
575
- desc: `A metagame made up of brand new Pok&eacute;mon that are made according to various random and non-random restrictions.`,
571
+ name: "[Gen 8] National Dex BH",
572
+ desc: `Balanced Hackmons with National Dex elements mixed in.`,
576
573
  threads: [
577
- `&bullet; <a href="https://www.smogon.com/forums/threads/3673824/">Restrictions</a>`,
578
- `&bullet; <a href="https://docs.google.com/spreadsheets/d/1XsplBqN8njHZJT9cTP_3i3YSFITB9WaVfNOYAbNY75M/edit?usp=sharing">Spreadsheet</a>`,
574
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3658587/">National Dex Balanced Hackmons</a>`,
579
575
  ],
580
- mod: 'restrictions',
581
- ruleset: ['Standard', 'Dynamax Clause'],
582
- banlist: ['All Pokemon', 'Past'],
583
- unbanlist: [
584
- 'Vulcaraptor', 'Parakinesis', 'Serpaint', 'Torgeist', 'Regolite', 'Polbearab', 'Centhorn', 'Donzyxote', 'Scimicobra', 'Folliclawe', 'Afloof', 'Nimbusteed',
585
- 'Aerock', 'Borassa', 'Sharm', 'Nunopod', 'Crypterid', 'Abysseil', 'Faerenheit', 'Spiriteal', 'Zoltanka', 'Flydra', 'Coracrab', 'Quadringo', 'Teslaple',
586
- 'Kapagon', 'Cyknight', 'Dirtoad', 'Crystelf', 'Rancourgar', 'Scalaron', 'Dragraceful', 'Tantrary', 'Modolith', 'Snailord', 'Arbrella', 'Draugelid',
587
- 'Cinnastar', 'Refluse', 'Kelven', 'Kodokai', 'Cindarner', 'Thucotuco', 'Sorree', 'Gembezzle', 'Winterloper', 'Agapest', 'Volvolpa', 'Punduluum', 'Wraithful',
588
- 'Panzarma', 'Krachiten', 'Cellsius', 'Borelem', 'Electangle', 'Orchile', 'Shinodori', 'Fluidrake', 'Potossum', 'Twygdrasill',
576
+ mod: 'gen8',
577
+ ruleset: ['-Nonexistent', 'Standard NatDex', 'Forme Clause', 'Sleep Moves Clause', '2 Ability Clause', 'OHKO Clause', 'Evasion Moves Clause', 'Dynamax Clause', 'CFZ Clause', '!Obtainable'],
578
+ banlist: [
579
+ // Pokemon
580
+ 'Eternatus-Eternamax', 'Groudon-Primal', 'Rayquaza-Mega', 'Shedinja', 'Cramorant-Gorging', 'Calyrex-Shadow',
581
+ // Abilities
582
+ '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',
583
+ // Items
584
+ 'Gengarite',
585
+ // Moves
586
+ 'Chatter', 'Double Iron Bash', 'Octolock', 'Shell Smash', 'Bolt Beak', 'Belly Drum', 'Electrify', 'Court Change',
587
+ // Other
588
+ 'Comatose + Sleep Talk', 'Imprison + Transform',
589
589
  ],
590
+ onValidateSet(set) {
591
+ if (this.toID(set.ability) === 'intrepidsword' &&
592
+ !this.toID(set.species).startsWith('zacian') && this.toID(set.item) !== 'rustedsword') {
593
+ return [`${set.ability} is banned.`];
594
+ }
595
+ if (set.species === 'Zacian-Crowned' &&
596
+ (this.toID(set.item) !== 'rustedsword' || this.toID(set.ability) !== 'intrepidsword')) {
597
+ return [`${set.species} is banned.`];
598
+ }
599
+ },
600
+ onValidateTeam(team) {
601
+ let arceus = 0;
602
+ for (const set of team) {
603
+ const species = this.dex.species.get(set.species);
604
+ if (species.baseSpecies === "Arceus") arceus++;
605
+ }
606
+ if (arceus > 1) {
607
+ return [`You are limited to one Arceus forme.`, `(You have ${arceus} Arceus formes.)`];
608
+ }
609
+ },
590
610
  },
591
611
  {
592
- name: "[Gen 8] Roulettemons Random Battle",
612
+ name: "[Gen 8] JolteMons Random Battle",
613
+ 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.`,
593
614
  threads: [
594
- `&bullet; <a href="https://www.smogon.com/forums/threads/3649106/">Roulettemons</a>`,
595
- `&bullet; <a href="https://docs.google.com/spreadsheets/d/1EOA1m7JXTq7Zz0ViVI4n6lBppFjVBa4S1GqhAwkPTZQ/edit?usp=sharing">Spreadsheet</a>`,
615
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3694234/">JolteMons</a>`,
616
+ `&bullet; <a href="https://docs.google.com/spreadsheets/d/149ZlQY0bJIAqfWB_233Dvbpqs3pVSHYpIoAQQkwquls/edit?usp=sharing">Spreadsheet</a>`,
596
617
  ],
618
+ mod: 'joltemons',
597
619
  team: 'random',
598
- mod: 'roulettemons',
599
- ruleset: ['Standard NatDex'],
600
- onSwitchIn(pokemon) {
601
- this.add('-start', pokemon, 'typechange', pokemon.species.types.join('/'), '[silent]');
602
- },
603
- onChangeSet(set) {
604
- if (set.species === 'Chillyte-Mega') {
605
- set.species = 'Chillyte';
606
- set.ability = 'Grassy Surge';
607
- }
608
- },
620
+ ruleset: ['Dynamax Clause', 'Obtainable', 'Species Clause', 'HP Percentage Mod', 'Cancel Mod', 'Sleep Clause Mod', 'Mega Data Mod', 'Z-Move Clause'],
609
621
  },
610
622
  {
611
623
  name: "[Gen 6] NEXT OU",
@@ -628,262 +640,116 @@ export const Formats: FormatList = [
628
640
  column: 2,
629
641
  },
630
642
  {
631
- name: "[Gen 8] Broken Record",
632
- desc: `Pok&eacute;mon can hold a TR to use that move in battle.`,
643
+ name: "[Gen 8] Partners in Crime",
644
+ desc: `Doubles-based metagame where both active ally Pok&eacute;mon share abilities and moves.`,
633
645
  threads: [
634
- `&bullet; <a href="https://www.smogon.com/forums/threads/3701270/">Broken Record</a>`,
646
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3706080/">Partners in Crime</a>`,
635
647
  ],
636
648
 
637
- mod: 'gen8',
638
- ruleset: ['Standard', '!Sleep Clause Mod', 'Sleep Moves Clause', 'Dynamax Clause'],
649
+ mod: 'partnersincrime',
650
+ gameType: 'doubles',
651
+ // searchShow: false,
652
+ ruleset: ['Standard Doubles', 'Dynamax Clause'],
639
653
  banlist: [
640
- 'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Dragapult', 'Eternatus', 'Genesect', 'Giratina',
641
- 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala',
642
- 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza',
643
- 'Regieleki', 'Reshiram', 'Rillaboom', 'Solgaleo', 'Spectrier', 'Urshifu-Base', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta',
644
- 'Zamazenta-Crowned', 'Zekrom', 'Zygarde-Base', 'Arena Trap', 'Magnet Pull', 'Moody', 'Power Construct', 'Shadow Tag', 'TR29 (Baton Pass)',
645
- 'TR82 (Stored Power)', 'Baton Pass',
654
+ 'Calyrex-Ice', 'Calyrex-Shadow', 'Dialga', 'Eternatus', 'Giratina', 'Giratina-Origin',
655
+ 'Groudon', 'Ho-Oh', 'Jirachi', 'Kyogre', 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna',
656
+ 'Marshadow', 'Melmetal', 'Mewtwo', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia',
657
+ 'Rayquaza', 'Reshiram', 'Solgaleo', 'Urshifu-Base', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned',
658
+ 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Bolt Beak', 'Fishious Rend', 'Shell Smash',
659
+ 'Emergency Exit', 'Huge Power', 'Moody', 'Power Construct', 'Shadow Tag', 'Wimp Out', 'Wonder Guard',
646
660
  ],
647
- onValidateSet(set) {
648
- if (!set.item) return;
649
- const item = this.dex.items.get(set.item);
650
- if (!/^tr\d\d/i.test(item.name)) return;
651
- const moveName = item.desc.split('move ')[1].split('.')[0];
652
- if (set.moves.map(this.toID).includes(this.toID(moveName))) {
653
- return [
654
- `${set.species} can't run ${item.name} (${moveName}) as its item because it already has that move in its moveset.`,
655
- ];
661
+ onBeforeSwitchIn(pokemon) {
662
+ pokemon.m.curMoves = this.dex.deepClone(pokemon.moves);
663
+ let ngas = false;
664
+ for (const poke of this.getAllActive()) {
665
+ if (this.toID(poke.ability) === ('neutralizinggas' as ID)) {
666
+ ngas = true;
667
+ break;
668
+ }
656
669
  }
657
- },
658
- onValidateTeam(team) {
659
- const trs = new Set<string>();
660
- for (const set of team) {
661
- if (!set.item) continue;
662
- const item = this.dex.items.get(set.item).name;
663
- if (!/^tr\d\d/i.test(item)) continue;
664
- if (trs.has(item)) {
665
- return [`Your team already has a Pok\u00e9mon with ${item}.`];
670
+ const BAD_ABILITIES = ['trace', 'imposter', 'neutralizinggas'];
671
+ // Abilities that must be applied before both sides trigger onSwitchIn to correctly
672
+ // handle switch-in ability-to-ability interactions, e.g. Intimidate counters
673
+ const NEEDED_BEFORE_SWITCH_IN_ABILITIES = [
674
+ 'clearbody', 'competitive', 'contrary', 'defiant', 'fullmetalbody', 'hypercutter', 'innerfocus',
675
+ 'mirrorarmor', 'oblivious', 'owntempo', 'rattled', 'scrappy', 'simple', 'whitesmoke',
676
+ ];
677
+ const ally = pokemon.side.active.find(mon => mon && mon !== pokemon && !mon.fainted);
678
+ if (ally && ally.ability !== pokemon.ability) {
679
+ if (!pokemon.m.innate && !BAD_ABILITIES.includes(this.toID(ally.ability)) &&
680
+ NEEDED_BEFORE_SWITCH_IN_ABILITIES.includes(this.toID(ally.ability))) {
681
+ pokemon.m.innate = 'ability:' + ally.ability;
682
+ delete pokemon.volatiles[pokemon.m.innate];
683
+ if (!ngas || ally.getAbility().isPermanent) pokemon.addVolatile(pokemon.m.innate);
684
+ }
685
+ if (!ally.m.innate && !BAD_ABILITIES.includes(this.toID(pokemon.ability)) &&
686
+ NEEDED_BEFORE_SWITCH_IN_ABILITIES.includes(this.toID(pokemon.ability))) {
687
+ ally.m.innate = 'ability:' + pokemon.ability;
688
+ delete ally.volatiles[ally.m.innate];
689
+ if (!ngas || pokemon.getAbility().isPermanent) ally.addVolatile(ally.m.innate);
666
690
  }
667
- trs.add(item);
668
691
  }
669
692
  },
670
- onTakeItem(item) {
671
- return !/^tr\d\d/i.test(item.name);
693
+ onSwitchInPriority: 2,
694
+ onSwitchIn(pokemon) {
695
+ let ngas = false;
696
+ for (const poke of this.getAllActive()) {
697
+ if (this.toID(poke.ability) === ('neutralizinggas' as ID)) {
698
+ ngas = true;
699
+ break;
700
+ }
701
+ }
702
+ const BAD_ABILITIES = ['trace', 'imposter', 'neutralizinggas'];
703
+ const ally = pokemon.side.active.find(mon => mon && mon !== pokemon && !mon.fainted);
704
+ if (ally && ally.ability !== pokemon.ability) {
705
+ if (!pokemon.m.innate && !BAD_ABILITIES.includes(this.toID(ally.ability))) {
706
+ pokemon.m.innate = 'ability:' + ally.ability;
707
+ delete pokemon.volatiles[pokemon.m.innate];
708
+ if (!ngas || ally.getAbility().isPermanent) pokemon.addVolatile(pokemon.m.innate);
709
+ }
710
+ if (!ally.m.innate && !BAD_ABILITIES.includes(this.toID(pokemon.ability))) {
711
+ ally.m.innate = 'ability:' + pokemon.ability;
712
+ delete ally.volatiles[ally.m.innate];
713
+ if (!ngas || pokemon.getAbility().isPermanent) ally.addVolatile(ally.m.innate);
714
+ }
715
+ }
672
716
  },
673
- onModifyMove(move) {
674
- if (move.id === 'knockoff') {
675
- move.onBasePower = function (basePower, source, target, m) {
676
- const item = target.getItem();
677
- if (!this.singleEvent('TakeItem', item, target.itemState, target, target, m, item)) return;
678
- // Very hardcode but I'd prefer to not make a mod for one damage calculation change
679
- if (item.id && !/^tr\d\d/i.test(item.id)) {
680
- return this.chainModify(1.5);
681
- }
682
- };
717
+ onSwitchOut(pokemon) {
718
+ if (pokemon.m.innate) {
719
+ pokemon.removeVolatile(pokemon.m.innate);
720
+ delete pokemon.m.innate;
721
+ }
722
+ const ally = pokemon.side.active.find(mon => mon && mon !== pokemon && !mon.fainted);
723
+ if (ally && ally.m.innate) {
724
+ ally.removeVolatile(ally.m.innate);
725
+ delete ally.m.innate;
683
726
  }
684
727
  },
685
- onBegin() {
686
- for (const pokemon of this.getAllPokemon()) {
687
- const item = pokemon.getItem();
688
- if (/^tr\d\d/i.test(item.name)) {
689
- const move = this.dex.moves.get(item.desc.split('move ')[1].split('.')[0]);
690
- pokemon.moveSlots = (pokemon as any).baseMoveSlots = [
691
- ...pokemon.baseMoveSlots, {
692
- id: move.id,
693
- move: move.name,
694
- pp: move.pp * 8 / 5,
695
- maxpp: move.pp * 8 / 5,
696
- target: move.target,
697
- disabled: false,
698
- disabledSource: '',
699
- used: false,
700
- },
701
- ];
702
- }
728
+ onFaint(pokemon) {
729
+ if (pokemon.m.innate) {
730
+ pokemon.removeVolatile(pokemon.m.innate);
731
+ delete pokemon.m.innate;
732
+ }
733
+ const ally = pokemon.side.active.find(mon => mon && mon !== pokemon && !mon.fainted);
734
+ if (ally && ally.m.innate) {
735
+ ally.removeVolatile(ally.m.innate);
736
+ delete ally.m.innate;
703
737
  }
704
738
  },
705
739
  },
706
740
  {
707
- name: "[Gen 8] Inheritance",
708
- desc: `Pok&eacute;mon may use the ability and moves of another, as long as they forfeit their own learnset.`,
741
+ name: "[Gen 8] Chimera 1v1",
742
+ desc: `One Pok&eacute;mon inherits specific traits from your entire 6-mon team, based on their order.`,
709
743
  threads: [
710
- `&bullet; <a href="https://www.smogon.com/forums/threads/3656811/">Inheritance</a>`,
744
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3661215/">Chimera 1v1</a>`,
711
745
  ],
712
746
 
713
747
  mod: 'gen8',
714
- // searchShow: false,
715
- ruleset: ['Standard', '!Sleep Clause Mod', 'Sleep Moves Clause', '2 Ability Clause', 'Dynamax Clause'],
748
+ ruleset: ['Chimera 1v1 Rule', 'Standard', 'Dynamax Clause', 'Sleep Moves Clause'],
716
749
  banlist: [
717
- 'Blacephalon', 'Blaziken', 'Butterfree', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chansey', 'Combusken', 'Cresselia', 'Darmanitan-Galar', 'Dialga', 'Dracovish',
718
- 'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala',
719
- 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Natu', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Regieleki',
720
- 'Regigigas', 'Reshiram', 'Sableye', 'Shedinja', 'Solgaleo', 'Spectrier', 'Tapu Koko', 'Toxtricity', 'Torkoal', 'Urshifu-Base', 'Xatu', 'Xerneas', 'Yveltal',
721
- 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zeraora', 'Zekrom', 'Arena Trap', 'Contrary', 'Drizzle', 'Huge Power', 'Imposter', 'Innards Out',
722
- 'Libero', 'Moody', 'Power Construct', 'Pure Power', 'Quick Draw', 'Shadow Tag', 'Sheer Force', 'Simple', 'Unaware', 'Unburden', 'Water Bubble', 'King\'s Rock',
723
- 'Quick Claw', 'Baton Pass', 'Bolt Beak', 'Fishious Rend', 'Shell Smash', 'Thousand Arrows',
750
+ 'Shedinja', 'Huge Power', 'Moody', 'Neutralizing Gas', 'Truant', 'Perish Body', 'Eviolite', 'Focus Sash', 'Leek', 'Light Ball',
751
+ 'Bolt Beak', 'Disable', 'Double Iron Bash', 'Fishious Rend', 'Perish Song', 'Switcheroo', 'Transform', 'Trick',
724
752
  ],
725
- getEvoFamily(speciesid) {
726
- let species = Dex.species.get(speciesid);
727
- while (species.prevo) {
728
- species = Dex.species.get(species.prevo);
729
- }
730
- return species.id;
731
- },
732
- validateSet(set, teamHas) {
733
- const unreleased = (pokemon: Species) => pokemon.tier === "Unreleased" && pokemon.isNonstandard === "Unobtainable";
734
- if (!teamHas.abilityMap) {
735
- teamHas.abilityMap = Object.create(null);
736
- for (const pokemon of Dex.species.all()) {
737
- if (pokemon.isNonstandard || unreleased(pokemon)) continue;
738
- if (pokemon.requiredAbility || pokemon.requiredItem || pokemon.requiredMove) continue;
739
- if (this.ruleTable.isBannedSpecies(pokemon)) continue;
740
-
741
- for (const key of Object.values(pokemon.abilities)) {
742
- const abilityId = this.dex.toID(key);
743
- if (abilityId in teamHas.abilityMap) {
744
- teamHas.abilityMap[abilityId][pokemon.evos ? 'push' : 'unshift'](pokemon.id);
745
- } else {
746
- teamHas.abilityMap[abilityId] = [pokemon.id];
747
- }
748
- }
749
- }
750
- }
751
-
752
- const problem = this.validateForme(set);
753
- if (problem.length) return problem;
754
-
755
- const species = this.dex.species.get(set.species);
756
- if (!species.exists || species.num < 1) return [`The Pok\u00e9mon "${set.species}" does not exist.`];
757
- if (species.isNonstandard || unreleased(species)) {
758
- return [`${species.name} is not obtainable in Generation ${this.dex.gen}.`];
759
- }
760
-
761
- const name = set.name;
762
- if (this.ruleTable.isBannedSpecies(species)) {
763
- return this.validateSet(set, teamHas);
764
- }
765
-
766
- const ability = this.dex.abilities.get(set.ability);
767
- if (!ability.exists || ability.isNonstandard) return [`${name} needs to have a valid ability.`];
768
- const pokemonWithAbility = teamHas.abilityMap[ability.id];
769
- if (!pokemonWithAbility) return [`${ability.name} is not available on a legal Pok\u00e9mon.`];
770
-
771
- (this.format as any).debug = true;
772
-
773
- if (!teamHas.abilitySources) teamHas.abilitySources = Object.create(null);
774
- const validSources: string[] = teamHas.abilitySources[this.dex.toID(set.species)] = []; // Evolution families
775
-
776
- let canonicalSource = ''; // Specific for the basic implementation of Donor Clause (see onValidateTeam).
777
-
778
- for (const donor of pokemonWithAbility) {
779
- const donorSpecies = this.dex.species.get(donor);
780
- let format = this.format;
781
- if (!format.getEvoFamily) format = this.dex.formats.get('gen8inheritance');
782
- const evoFamily = format.getEvoFamily!(donorSpecies.id);
783
- if (validSources.includes(evoFamily)) continue;
784
-
785
- set.species = donorSpecies.name;
786
- set.name = donorSpecies.baseSpecies;
787
- const problems = this.validateSet(set, teamHas) || [];
788
- if (!problems.length) {
789
- validSources.push(evoFamily);
790
- canonicalSource = donorSpecies.name;
791
- }
792
- // Specific for the basic implementation of Donor Clause (see onValidateTeam).
793
- if (validSources.length > 1) break;
794
- }
795
- (this.format as any).debug = false;
796
-
797
- set.name = name;
798
- set.species = species.name;
799
- if (!validSources.length) {
800
- if (pokemonWithAbility.length > 1) return [`${name}'s set is illegal.`];
801
- return [`${name} has an illegal set with an ability from ${this.dex.species.get(pokemonWithAbility[0]).name}.`];
802
- }
803
-
804
- // Protocol: Include the data of the donor species in the `ability` data slot.
805
- // Afterwards, we are going to reset the name to what the user intended.
806
- set.ability = `${set.ability}0${canonicalSource}`;
807
- return null;
808
- },
809
- onValidateTeam(team, f, teamHas) {
810
- if (this.ruleTable.has('2abilityclause')) {
811
- const abilityTable = new Map<string, number>();
812
- const base: {[k: string]: string} = {
813
- airlock: 'cloudnine',
814
- battlearmor: 'shellarmor',
815
- clearbody: 'whitesmoke',
816
- dazzling: 'queenlymajesty',
817
- emergencyexit: 'wimpout',
818
- filter: 'solidrock',
819
- gooey: 'tanglinghair',
820
- insomnia: 'vitalspirit',
821
- ironbarbs: 'roughskin',
822
- libero: 'protean',
823
- minus: 'plus',
824
- moxie: 'chillingneigh',
825
- powerofalchemy: 'receiver',
826
- propellertail: 'stalwart',
827
- teravolt: 'moldbreaker',
828
- turboblaze: 'moldbreaker',
829
- };
830
- for (const set of team) {
831
- let ability = this.toID(set.ability.split('0')[0]);
832
- if (!ability) continue;
833
- if (ability in base) ability = base[ability] as ID;
834
- if ((abilityTable.get(ability) || 0) >= 2) {
835
- return [
836
- `You are limited to two of each ability by 2 Ability Clause.`,
837
- `(You have more than two ${this.dex.abilities.get(ability).name} variants)`,
838
- ];
839
- }
840
- abilityTable.set(ability, (abilityTable.get(ability) || 0) + 1);
841
- }
842
- }
843
-
844
- // Donor Clause
845
- const evoFamilyLists = [];
846
- for (const set of team) {
847
- const abilitySources = teamHas.abilitySources?.[this.dex.toID(set.species)];
848
- if (!abilitySources) continue;
849
- let format = this.format;
850
- if (!format.getEvoFamily) format = this.dex.formats.get('gen8inheritance');
851
- evoFamilyLists.push(abilitySources.map(format.getEvoFamily!));
852
- }
853
-
854
- // Checking actual full incompatibility would require expensive algebra.
855
- // Instead, we only check the trivial case of multiple Pokémon only legal for exactly one family. FIXME?
856
- const requiredFamilies = Object.create(null);
857
- for (const evoFamilies of evoFamilyLists) {
858
- if (evoFamilies.length !== 1) continue;
859
- const [familyId] = evoFamilies;
860
- if (!(familyId in requiredFamilies)) requiredFamilies[familyId] = 1;
861
- requiredFamilies[familyId]++;
862
- if (requiredFamilies[familyId] > 2) {
863
- return [
864
- `You are limited to up to two inheritances from each evolution family by the Donor Clause.`,
865
- `(You inherit more than twice from ${this.dex.species.get(familyId).name}).`,
866
- ];
867
- }
868
- }
869
- },
870
- onBegin() {
871
- for (const pokemon of this.getAllPokemon()) {
872
- if (pokemon.baseAbility.includes('0')) {
873
- const donor = pokemon.baseAbility.split('0')[1];
874
- pokemon.m.donor = this.toID(donor);
875
- pokemon.baseAbility = this.toID(pokemon.baseAbility.split('0')[0]);
876
- pokemon.ability = pokemon.baseAbility;
877
- }
878
- }
879
- },
880
- onSwitchIn(pokemon) {
881
- if (!pokemon.m.donor) return;
882
- const donorTemplate = this.dex.species.get(pokemon.m.donor);
883
- if (!donorTemplate.exists) return;
884
- // Place volatiles on the Pokémon to show the donor details.
885
- this.add('-start', pokemon, donorTemplate.name, '[silent]');
886
- },
887
753
  },
888
754
 
889
755
  // Other Metagames
@@ -920,16 +786,16 @@ export const Formats: FormatList = [
920
786
  ],
921
787
 
922
788
  mod: 'gen8',
923
- ruleset: ['Standard', '!Obtainable Abilities', '2 Ability Clause', 'Dynamax Clause', 'Sleep Moves Clause', '!Sleep Clause Mod'],
789
+ ruleset: ['Standard OMs', '!Obtainable Abilities', '2 Ability Clause', 'Sleep Moves Clause'],
924
790
  banlist: [
925
- 'Archeops', 'Blacephalon', 'Buzzwole', 'Calyrex-Ice', 'Calyrex-Shadow', 'Dialga', 'Dracovish', 'Dragapult', 'Dragonite', 'Eternatus', 'Gengar',
926
- 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Keldeo', 'Kommo-o', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White',
791
+ 'Archeops', 'Blacephalon', 'Buzzwole', 'Calyrex-Ice', 'Calyrex-Shadow', 'Dialga', 'Dracovish', 'Dragapult', 'Dragonite', 'Eternatus',
792
+ 'Gengar', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Keldeo', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White',
927
793
  'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Noivern',
928
794
  'Palkia', 'Pheromosa', 'Rayquaza', 'Regigigas', 'Reshiram', 'Shedinja', 'Solgaleo', 'Spectrier', 'Urshifu', 'Urshifu-Rapid-Strike',
929
- 'Victini', 'Weavile', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Base', 'Zekrom', 'Zeraora', 'Zygarde-Base',
930
- 'Arena Trap', 'Comatose', 'Contrary', 'Fluffy', 'Fur Coat', 'Gorilla Tactics', 'Huge Power', 'Ice Scales', 'Illusion', 'Imposter',
931
- 'Innards Out', 'Intrepid Sword', 'Libero', 'Magnet Pull', 'Moody', 'Neutralizing Gas', 'Parental Bond', 'Poison Heal', 'Protean',
932
- 'Pure Power', 'Shadow Tag', 'Simple', 'Stakeout', 'Speed Boost', 'Water Bubble', 'Wonder Guard', 'King\'s Rock', 'Baton Pass',
795
+ 'Victini', 'Weavile', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Base', 'Zekrom', 'Zeraora', 'Zygarde-Base', 'Arena Trap',
796
+ 'Comatose', 'Contrary', 'Fluffy', 'Fur Coat', 'Gorilla Tactics', 'Huge Power', 'Ice Scales', 'Illusion', 'Imposter', 'Innards Out',
797
+ 'Intrepid Sword', 'Libero', 'Magic Bounce', 'Magnet Pull', 'Moody', 'Neutralizing Gas', 'Parental Bond', 'Poison Heal', 'Protean',
798
+ 'Pure Power', 'Shadow Tag', 'Simple', 'Stakeout', 'Speed Boost', 'Unburden', 'Water Bubble', 'Wonder Guard', 'King\'s Rock', 'Baton Pass',
933
799
  ],
934
800
  },
935
801
  {
@@ -941,7 +807,7 @@ export const Formats: FormatList = [
941
807
  ],
942
808
 
943
809
  mod: 'mixandmega',
944
- ruleset: ['Standard', 'Overflow Stat Mod', 'Dynamax Clause'],
810
+ ruleset: ['Standard OMs', 'Sleep Clause Mod'],
945
811
  banlist: [
946
812
  'Calyrex-Shadow', 'Eternatus', 'Kyogre', 'Zacian',
947
813
  'Beedrillite', 'Blazikenite', 'Gengarite', 'Kangaskhanite', 'Mawilite', 'Medichamite', 'Pidgeotite',
@@ -1010,7 +876,7 @@ export const Formats: FormatList = [
1010
876
  ],
1011
877
 
1012
878
  mod: 'gen8',
1013
- ruleset: ['Standard', 'STABmons Move Legality', 'Dynamax Clause', 'Sleep Moves Clause', '!Sleep Clause Mod'],
879
+ ruleset: ['Standard OMs', 'STABmons Move Legality', 'Sleep Moves Clause'],
1014
880
  banlist: [
1015
881
  'Aegislash', 'Blacephalon', 'Calyrex-Ice', 'Calyrex-Shadow', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Dragapult', 'Dragonite', 'Eternatus',
1016
882
  'Genesect', 'Garchomp', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus',
@@ -1034,7 +900,7 @@ export const Formats: FormatList = [
1034
900
  ],
1035
901
 
1036
902
  mod: 'gen8',
1037
- ruleset: ['Not Fully Evolved', 'Standard', 'Dynamax Clause'],
903
+ ruleset: ['Standard OMs', 'Not Fully Evolved', 'Sleep Clause Mod'],
1038
904
  banlist: [
1039
905
  'Chansey', 'Doublade', 'Golbat', 'Haunter', 'Kadabra', 'Magmar', 'Magneton', 'Mr. Mime-Galar', 'Pawniard', 'Pikachu',
1040
906
  'Porygon2', 'Rhydon', 'Scyther', 'Sneasel', 'Type: Null', 'Vulpix-Base', 'Arena Trap', 'Shadow Tag', 'Baton Pass',
@@ -1048,10 +914,10 @@ export const Formats: FormatList = [
1048
914
  ],
1049
915
 
1050
916
  mod: 'gen8',
1051
- ruleset: ['Standard', 'Dynamax Clause', 'Sleep Moves Clause'],
917
+ ruleset: ['Standard OMs', 'Sleep Moves Clause'],
1052
918
  banlist: [
1053
- 'Blissey', 'Calyrex-Shadow', 'Chansey', 'Crawdaunt', 'Dragapult', 'Eternatus', 'Hawlucha', 'Marowak-Alola', 'Melmetal',
1054
- 'Pikachu', 'Toxapex', 'Xerneas', 'Zacian', 'Zacian-Crowned', 'Uber > 1', 'AG ++ Uber > 1', 'Arena Trap', 'Huge Power',
919
+ 'Blissey', 'Calyrex-Shadow', 'Chansey', 'Crawdaunt', 'Dragapult', 'Eternatus', 'Hawlucha', 'Marowak-Alola', 'Melmetal', 'Nidoking',
920
+ 'Nidoqueen', 'Pikachu', 'Toxapex', 'Xerneas', 'Zacian', 'Zacian-Crowned', 'Uber > 1', 'AG ++ Uber > 1', 'Arena Trap', 'Huge Power',
1055
921
  'Moody', 'Pure Power', 'Shadow Tag', 'Swift Swim', 'Bright Powder', 'Focus Band', 'King\'s Rock', 'Lax Incense', 'Quick Claw',
1056
922
  'Baton Pass',
1057
923
  ],
@@ -1129,6 +995,10 @@ export const Formats: FormatList = [
1129
995
  'Decorate', 'Final Gambit', 'Flatter', 'Floral Healing', 'Flower Shield', 'Follow Me', 'Heal Pulse', 'Rage Powder', 'Swagger',
1130
996
  ],
1131
997
  },
998
+
999
+ // Brilliant Diamond/Shining Pearl
1000
+ ///////////////////////////////////////////////////////////////////
1001
+
1132
1002
  {
1133
1003
  section: "BD/SP",
1134
1004
  column: 2,
@@ -1154,10 +1024,7 @@ export const Formats: FormatList = [
1154
1024
 
1155
1025
  mod: 'gen8bdsp',
1156
1026
  ruleset: ['Standard'],
1157
- banlist: [
1158
- 'Uber', 'Arena Trap', 'Drizzle', 'Moody', 'Sand Veil', 'Shadow Tag', 'Snow Cloak',
1159
- 'Bright Powder', 'King\'s Rock', 'Lax Incense', 'Razor Fang', 'Baton Pass',
1160
- ],
1027
+ banlist: ['Uber', 'Arena Trap', 'Drizzle', 'Moody', 'Sand Veil', 'Shadow Tag', 'Snow Cloak', 'King\'s Rock', 'Razor Fang', 'Baton Pass'],
1161
1028
  },
1162
1029
  {
1163
1030
  name: "[Gen 8 BDSP] Ubers",
@@ -1166,6 +1033,7 @@ export const Formats: FormatList = [
1166
1033
  ],
1167
1034
 
1168
1035
  mod: 'gen8bdsp',
1036
+ searchShow: false,
1169
1037
  ruleset: ['Standard'],
1170
1038
  banlist: ['AG', 'Baton Pass'],
1171
1039
  },
@@ -1176,6 +1044,7 @@ export const Formats: FormatList = [
1176
1044
  ],
1177
1045
 
1178
1046
  mod: 'gen8bdsp',
1047
+ searchShow: false,
1179
1048
  ruleset: ['[Gen 8 BDSP] OU'],
1180
1049
  banlist: ['OU', 'UUBL'],
1181
1050
  },
@@ -1186,6 +1055,7 @@ export const Formats: FormatList = [
1186
1055
  ],
1187
1056
 
1188
1057
  mod: 'gen8bdsp',
1058
+ searchShow: false,
1189
1059
  ruleset: ['[Gen 8 BDSP] UU'],
1190
1060
  banlist: ['UU', 'RUBL', 'Drought'],
1191
1061
  },
@@ -1196,6 +1066,7 @@ export const Formats: FormatList = [
1196
1066
  ],
1197
1067
 
1198
1068
  mod: 'gen8bdsp',
1069
+ searchShow: false,
1199
1070
  ruleset: ['[Gen 8 BDSP] RU'],
1200
1071
  banlist: ['RU', 'NUBL', 'Damp Rock', 'Heat Rock'],
1201
1072
  },
@@ -1206,6 +1077,7 @@ export const Formats: FormatList = [
1206
1077
  ],
1207
1078
 
1208
1079
  mod: 'gen8bdsp',
1080
+ searchShow: false,
1209
1081
  ruleset: ['[Gen 8 BDSP] NU'],
1210
1082
  banlist: ['NU', 'PUBL'],
1211
1083
  },
@@ -1216,6 +1088,7 @@ export const Formats: FormatList = [
1216
1088
  ],
1217
1089
 
1218
1090
  mod: 'gen8bdsp',
1091
+ searchShow: false,
1219
1092
  ruleset: ['Little Cup', 'Standard'],
1220
1093
  banlist: ['Gligar', 'Meditite', 'Misdreavus', 'Munchlax', 'Murkrow', 'Scyther', 'Sneasel', 'Tangela', 'Vulpix', 'Yanma', 'Moody', 'Baton Pass', 'Sticky Web'],
1221
1094
  },
@@ -1226,6 +1099,7 @@ export const Formats: FormatList = [
1226
1099
  ],
1227
1100
 
1228
1101
  mod: 'gen8bdsp',
1102
+ searchShow: false,
1229
1103
  ruleset: ['[Gen 8 BDSP] OU', 'Same Type Clause'],
1230
1104
  },
1231
1105
  {
@@ -1238,16 +1112,6 @@ export const Formats: FormatList = [
1238
1112
  searchShow: false,
1239
1113
  ruleset: ['[Gen 8 BDSP] OU', '+CAP'],
1240
1114
  },
1241
- {
1242
- name: "[Gen 8 BDSP] 3v3 Singles",
1243
- threads: [
1244
- `&bullet; <a href="https://www.smogon.com/forums/threads/3695092/">BDSP 3v3 Singles</a>`,
1245
- ],
1246
-
1247
- mod: 'gen8bdsp',
1248
- searchShow: false,
1249
- ruleset: ['Flat Rules', 'Min Source Gen = 8'],
1250
- },
1251
1115
  {
1252
1116
  name: "[Gen 8 BDSP] Doubles OU",
1253
1117
  threads: [
@@ -1267,19 +1131,13 @@ export const Formats: FormatList = [
1267
1131
 
1268
1132
  mod: 'gen8bdsp',
1269
1133
  gameType: 'doubles',
1134
+ searchShow: false,
1270
1135
  ruleset: ['Flat Rules', 'Min Source Gen = 8'],
1271
1136
  },
1272
- {
1273
- name: "[Gen 8 BDSP] Pure Hackmons",
1274
- desc: `Anything that can be hacked in-game and is usable in local battles is allowed.`,
1275
- threads: [
1276
- `&bullet; <a href="https://www.smogon.com/forums/threads/3693868/">Pure Hackmons</a>`,
1277
- ],
1278
1137
 
1279
- mod: 'gen8bdsp',
1280
- searchShow: false,
1281
- ruleset: ['-Nonexistent', 'Team Preview', 'HP Percentage Mod', 'Cancel Mod', 'Endless Battle Clause'],
1282
- },
1138
+ // Challengeable OMs
1139
+ ///////////////////////////////////////////////////////////////////
1140
+
1283
1141
  {
1284
1142
  section: "Challengeable OMs",
1285
1143
  column: 2,
@@ -1293,7 +1151,7 @@ export const Formats: FormatList = [
1293
1151
 
1294
1152
  mod: 'gen8',
1295
1153
  searchShow: false,
1296
- ruleset: ['Standard', 'Dynamax Clause', 'Camomons Mod'],
1154
+ ruleset: ['Standard OMs', 'Camomons Mod', 'Sleep Clause Mod'],
1297
1155
  banlist: [
1298
1156
  'Calyrex-Ice', 'Calyrex-Shadow', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Dragonite', 'Eternatus', 'Genesect', 'Giratina', 'Giratina-Origin',
1299
1157
  'Groudon', 'Ho-Oh', 'Hydreigon', 'Kartana', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala', 'Marshadow',
@@ -1311,7 +1169,7 @@ export const Formats: FormatList = [
1311
1169
 
1312
1170
  mod: 'gen8',
1313
1171
  searchShow: false,
1314
- ruleset: ['Standard', 'Overflow Stat Mod', 'Dynamax Clause', '2 Ability Clause'],
1172
+ ruleset: ['Standard OMs', '2 Ability Clause', 'Sleep Clause Mod'],
1315
1173
  banlist: ['Corsola-Galar', 'Sneasel', 'Type: Null', 'Arena Trap', 'Ice Scales', 'Moody', 'King\'s Rock', 'Baton Pass'],
1316
1174
  restricted: ['Chansey', 'Lunala', 'Shedinja', 'Solgaleo', 'Gorilla Tactics', 'Huge Power', 'Pure Power', 'Shadow Tag'],
1317
1175
  onValidateTeam(team) {
@@ -1383,61 +1241,244 @@ export const Formats: FormatList = [
1383
1241
  return [`${species.name} cannot use ${item.name} because it is cross evolved into ${crossSpecies.name}.`];
1384
1242
  }
1385
1243
  }
1386
- const ability = this.dex.abilities.get(set.ability);
1387
- if (!this.ruleTable.isRestricted(`ability:${ability.id}`) || Object.values(species.abilities).includes(ability.name)) {
1388
- set.species = crossSpecies.name;
1389
- }
1390
-
1391
- // @ts-ignore
1392
- set.sp = species;
1393
- // @ts-ignore
1394
- set.crossSpecies = crossSpecies;
1395
- // @ts-ignore
1396
- set.crossMovesLeft = 2;
1397
- problems = this.validateSet(set, teamHas);
1398
- set.name = crossSpecies.name;
1399
- set.species = species.name;
1400
- return problems;
1401
- },
1402
- onModifySpecies(species, target, source, effect) {
1403
- if (!target) return; // chat
1404
- if (effect && ['imposter', 'transform'].includes(effect.id)) return;
1405
- if (target.set.name === target.set.species) return;
1406
- const crossSpecies = this.dex.species.get(target.set.name);
1407
- if (!crossSpecies.exists) return;
1408
- if (species.battleOnly || !species.nfe) return;
1409
- const crossIsUnreleased = (crossSpecies.tier === "Unreleased" && crossSpecies.isNonstandard === "Unobtainable");
1410
- if (crossSpecies.battleOnly || crossIsUnreleased || !crossSpecies.prevo) return;
1411
- const crossPrevoSpecies = this.dex.species.get(crossSpecies.prevo);
1412
- if (!crossPrevoSpecies.prevo !== !species.prevo) return;
1244
+ const ability = this.dex.abilities.get(set.ability);
1245
+ if (!this.ruleTable.isRestricted(`ability:${ability.id}`) || Object.values(species.abilities).includes(ability.name)) {
1246
+ set.species = crossSpecies.name;
1247
+ }
1248
+
1249
+ // @ts-ignore
1250
+ set.sp = species;
1251
+ // @ts-ignore
1252
+ set.crossSpecies = crossSpecies;
1253
+ // @ts-ignore
1254
+ set.crossMovesLeft = 2;
1255
+ problems = this.validateSet(set, teamHas);
1256
+ set.name = crossSpecies.name;
1257
+ set.species = species.name;
1258
+ return problems;
1259
+ },
1260
+ onModifySpecies(species, target, source, effect) {
1261
+ if (!target) return; // chat
1262
+ if (effect && ['imposter', 'transform'].includes(effect.id)) return;
1263
+ if (target.set.name === target.set.species) return;
1264
+ const crossSpecies = this.dex.species.get(target.set.name);
1265
+ if (!crossSpecies.exists) return;
1266
+ if (species.battleOnly || !species.nfe) return;
1267
+ const crossIsUnreleased = (crossSpecies.tier === "Unreleased" && crossSpecies.isNonstandard === "Unobtainable");
1268
+ if (crossSpecies.battleOnly || crossIsUnreleased || !crossSpecies.prevo) return;
1269
+ const crossPrevoSpecies = this.dex.species.get(crossSpecies.prevo);
1270
+ if (!crossPrevoSpecies.prevo !== !species.prevo) return;
1271
+
1272
+ const mixedSpecies = this.dex.deepClone(species);
1273
+ mixedSpecies.weightkg =
1274
+ Math.max(0.1, +(species.weightkg + crossSpecies.weightkg - crossPrevoSpecies.weightkg)).toFixed(1);
1275
+ mixedSpecies.nfe = false;
1276
+ mixedSpecies.evos = [];
1277
+ mixedSpecies.eggGroups = crossSpecies.eggGroups;
1278
+ mixedSpecies.abilities = crossSpecies.abilities;
1279
+ mixedSpecies.bst = 0;
1280
+ let i: StatID;
1281
+ for (i in species.baseStats) {
1282
+ const statChange = crossSpecies.baseStats[i] - crossPrevoSpecies.baseStats[i];
1283
+ mixedSpecies.baseStats[i] = this.clampIntRange(species.baseStats[i] + statChange, 1, 255);
1284
+ mixedSpecies.bst += mixedSpecies.baseStats[i];
1285
+ }
1286
+ if (crossSpecies.types[0] !== crossPrevoSpecies.types[0]) mixedSpecies.types[0] = crossSpecies.types[0];
1287
+ if (crossSpecies.types[1] !== crossPrevoSpecies.types[1]) {
1288
+ mixedSpecies.types[1] = crossSpecies.types[1] || crossSpecies.types[0];
1289
+ }
1290
+ if (mixedSpecies.types[0] === mixedSpecies.types[1]) mixedSpecies.types = [mixedSpecies.types[0]];
1291
+
1292
+ return mixedSpecies;
1293
+ },
1294
+ onBegin() {
1295
+ for (const pokemon of this.getAllPokemon()) {
1296
+ pokemon.baseSpecies = pokemon.species;
1297
+ }
1298
+ },
1299
+ },
1300
+ {
1301
+ name: "[Gen 8] Inheritance",
1302
+ desc: `Pok&eacute;mon may use the ability and moves of another, as long as they forfeit their own learnset.`,
1303
+ threads: [
1304
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3656811/">Inheritance</a>`,
1305
+ ],
1306
+
1307
+ mod: 'gen8',
1308
+ searchShow: false,
1309
+ ruleset: ['Standard OMs', '2 Ability Clause', 'Sleep Moves Clause'],
1310
+ banlist: [
1311
+ 'Blacephalon', 'Blaziken', 'Butterfree', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chansey', 'Combusken', 'Cresselia', 'Darmanitan-Galar', 'Dialga',
1312
+ 'Dracovish', 'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Lugia',
1313
+ 'Lunala', 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Natu', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza',
1314
+ 'Regieleki', 'Regigigas', 'Reshiram', 'Sableye', 'Shedinja', 'Solgaleo', 'Spectrier', 'Tapu Koko', 'Toxtricity', 'Torkoal', 'Urshifu-Base',
1315
+ 'Xatu', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zeraora', 'Zekrom', 'Arena Trap', 'Contrary',
1316
+ 'Drizzle', 'Huge Power', 'Imposter', 'Innards Out', 'Libero', 'Moody', 'Power Construct', 'Pure Power', 'Quick Draw', 'Shadow Tag', 'Sheer Force',
1317
+ 'Simple', 'Unaware', 'Unburden', 'Water Bubble', 'King\'s Rock', 'Quick Claw', 'Baton Pass', 'Bolt Beak', 'Fishious Rend', 'Shell Smash',
1318
+ 'Thousand Arrows',
1319
+ ],
1320
+ getEvoFamily(speciesid) {
1321
+ let species = Dex.species.get(speciesid);
1322
+ while (species.prevo) {
1323
+ species = Dex.species.get(species.prevo);
1324
+ }
1325
+ return species.id;
1326
+ },
1327
+ validateSet(set, teamHas) {
1328
+ const unreleased = (pokemon: Species) => pokemon.tier === "Unreleased" && pokemon.isNonstandard === "Unobtainable";
1329
+ if (!teamHas.abilityMap) {
1330
+ teamHas.abilityMap = Object.create(null);
1331
+ for (const pokemon of Dex.species.all()) {
1332
+ if (pokemon.isNonstandard || unreleased(pokemon)) continue;
1333
+ if (pokemon.requiredAbility || pokemon.requiredItem || pokemon.requiredMove) continue;
1334
+ if (this.ruleTable.isBannedSpecies(pokemon)) continue;
1335
+
1336
+ for (const key of Object.values(pokemon.abilities)) {
1337
+ const abilityId = this.dex.toID(key);
1338
+ if (abilityId in teamHas.abilityMap) {
1339
+ teamHas.abilityMap[abilityId][pokemon.evos ? 'push' : 'unshift'](pokemon.id);
1340
+ } else {
1341
+ teamHas.abilityMap[abilityId] = [pokemon.id];
1342
+ }
1343
+ }
1344
+ }
1345
+ }
1346
+
1347
+ const problem = this.validateForme(set);
1348
+ if (problem.length) return problem;
1349
+
1350
+ const species = this.dex.species.get(set.species);
1351
+ if (!species.exists || species.num < 1) return [`The Pok\u00e9mon "${set.species}" does not exist.`];
1352
+ if (species.isNonstandard || unreleased(species)) {
1353
+ return [`${species.name} is not obtainable in Generation ${this.dex.gen}.`];
1354
+ }
1355
+
1356
+ const name = set.name;
1357
+ if (this.ruleTable.isBannedSpecies(species)) {
1358
+ return this.validateSet(set, teamHas);
1359
+ }
1360
+
1361
+ const ability = this.dex.abilities.get(set.ability);
1362
+ if (!ability.exists || ability.isNonstandard) return [`${name} needs to have a valid ability.`];
1363
+ const pokemonWithAbility = teamHas.abilityMap[ability.id];
1364
+ if (!pokemonWithAbility) return [`${ability.name} is not available on a legal Pok\u00e9mon.`];
1365
+
1366
+ (this.format as any).debug = true;
1367
+
1368
+ if (!teamHas.abilitySources) teamHas.abilitySources = Object.create(null);
1369
+ const validSources: string[] = teamHas.abilitySources[this.dex.toID(set.species)] = []; // Evolution families
1370
+
1371
+ let canonicalSource = ''; // Specific for the basic implementation of Donor Clause (see onValidateTeam).
1372
+
1373
+ for (const donor of pokemonWithAbility) {
1374
+ const donorSpecies = this.dex.species.get(donor);
1375
+ let format = this.format;
1376
+ if (!format.getEvoFamily) format = this.dex.formats.get('gen8inheritance');
1377
+ const evoFamily = format.getEvoFamily!(donorSpecies.id);
1378
+ if (validSources.includes(evoFamily)) continue;
1379
+
1380
+ set.species = donorSpecies.name;
1381
+ set.name = donorSpecies.baseSpecies;
1382
+ const problems = this.validateSet(set, teamHas) || [];
1383
+ if (!problems.length) {
1384
+ validSources.push(evoFamily);
1385
+ canonicalSource = donorSpecies.name;
1386
+ }
1387
+ // Specific for the basic implementation of Donor Clause (see onValidateTeam).
1388
+ if (validSources.length > 1) break;
1389
+ }
1390
+ (this.format as any).debug = false;
1391
+
1392
+ set.name = name;
1393
+ set.species = species.name;
1394
+ if (!validSources.length) {
1395
+ if (pokemonWithAbility.length > 1) return [`${name}'s set is illegal.`];
1396
+ return [`${name} has an illegal set with an ability from ${this.dex.species.get(pokemonWithAbility[0]).name}.`];
1397
+ }
1398
+
1399
+ // Protocol: Include the data of the donor species in the `ability` data slot.
1400
+ // Afterwards, we are going to reset the name to what the user intended.
1401
+ set.ability = `${set.ability}0${canonicalSource}`;
1402
+ return null;
1403
+ },
1404
+ onValidateTeam(team, f, teamHas) {
1405
+ if (this.ruleTable.has('2abilityclause')) {
1406
+ const abilityTable = new Map<string, number>();
1407
+ const base: {[k: string]: string} = {
1408
+ airlock: 'cloudnine',
1409
+ battlearmor: 'shellarmor',
1410
+ clearbody: 'whitesmoke',
1411
+ dazzling: 'queenlymajesty',
1412
+ emergencyexit: 'wimpout',
1413
+ filter: 'solidrock',
1414
+ gooey: 'tanglinghair',
1415
+ insomnia: 'vitalspirit',
1416
+ ironbarbs: 'roughskin',
1417
+ libero: 'protean',
1418
+ minus: 'plus',
1419
+ moxie: 'chillingneigh',
1420
+ powerofalchemy: 'receiver',
1421
+ propellertail: 'stalwart',
1422
+ teravolt: 'moldbreaker',
1423
+ turboblaze: 'moldbreaker',
1424
+ };
1425
+ for (const set of team) {
1426
+ let ability = this.toID(set.ability.split('0')[0]);
1427
+ if (!ability) continue;
1428
+ if (ability in base) ability = base[ability] as ID;
1429
+ if ((abilityTable.get(ability) || 0) >= 2) {
1430
+ return [
1431
+ `You are limited to two of each ability by 2 Ability Clause.`,
1432
+ `(You have more than two ${this.dex.abilities.get(ability).name} variants)`,
1433
+ ];
1434
+ }
1435
+ abilityTable.set(ability, (abilityTable.get(ability) || 0) + 1);
1436
+ }
1437
+ }
1413
1438
 
1414
- const mixedSpecies = this.dex.deepClone(species);
1415
- mixedSpecies.weightkg =
1416
- Math.max(0.1, +(species.weightkg + crossSpecies.weightkg - crossPrevoSpecies.weightkg)).toFixed(1);
1417
- mixedSpecies.nfe = false;
1418
- mixedSpecies.evos = [];
1419
- mixedSpecies.eggGroups = crossSpecies.eggGroups;
1420
- mixedSpecies.abilities = crossSpecies.abilities;
1421
- mixedSpecies.bst = 0;
1422
- let i: StatID;
1423
- for (i in species.baseStats) {
1424
- const statChange = crossSpecies.baseStats[i] - crossPrevoSpecies.baseStats[i];
1425
- mixedSpecies.baseStats[i] = this.clampIntRange(species.baseStats[i] + statChange, 1, 255);
1426
- mixedSpecies.bst += mixedSpecies.baseStats[i];
1427
- }
1428
- if (crossSpecies.types[0] !== crossPrevoSpecies.types[0]) mixedSpecies.types[0] = crossSpecies.types[0];
1429
- if (crossSpecies.types[1] !== crossPrevoSpecies.types[1]) {
1430
- mixedSpecies.types[1] = crossSpecies.types[1] || crossSpecies.types[0];
1439
+ // Donor Clause
1440
+ const evoFamilyLists = [];
1441
+ for (const set of team) {
1442
+ const abilitySources = teamHas.abilitySources?.[this.dex.toID(set.species)];
1443
+ if (!abilitySources) continue;
1444
+ let format = this.format;
1445
+ if (!format.getEvoFamily) format = this.dex.formats.get('gen8inheritance');
1446
+ evoFamilyLists.push(abilitySources.map(format.getEvoFamily!));
1431
1447
  }
1432
- if (mixedSpecies.types[0] === mixedSpecies.types[1]) mixedSpecies.types = [mixedSpecies.types[0]];
1433
1448
 
1434
- return mixedSpecies;
1449
+ // Checking actual full incompatibility would require expensive algebra.
1450
+ // Instead, we only check the trivial case of multiple Pokémon only legal for exactly one family. FIXME?
1451
+ const requiredFamilies = Object.create(null);
1452
+ for (const evoFamilies of evoFamilyLists) {
1453
+ if (evoFamilies.length !== 1) continue;
1454
+ const [familyId] = evoFamilies;
1455
+ if (!(familyId in requiredFamilies)) requiredFamilies[familyId] = 1;
1456
+ requiredFamilies[familyId]++;
1457
+ if (requiredFamilies[familyId] > 2) {
1458
+ return [
1459
+ `You are limited to up to two inheritances from each evolution family by the Donor Clause.`,
1460
+ `(You inherit more than twice from ${this.dex.species.get(familyId).name}).`,
1461
+ ];
1462
+ }
1463
+ }
1435
1464
  },
1436
1465
  onBegin() {
1437
1466
  for (const pokemon of this.getAllPokemon()) {
1438
- pokemon.baseSpecies = pokemon.species;
1467
+ if (pokemon.baseAbility.includes('0')) {
1468
+ const donor = pokemon.baseAbility.split('0')[1];
1469
+ pokemon.m.donor = this.toID(donor);
1470
+ pokemon.baseAbility = this.toID(pokemon.baseAbility.split('0')[0]);
1471
+ pokemon.ability = pokemon.baseAbility;
1472
+ }
1439
1473
  }
1440
1474
  },
1475
+ onSwitchIn(pokemon) {
1476
+ if (!pokemon.m.donor) return;
1477
+ const donorTemplate = this.dex.species.get(pokemon.m.donor);
1478
+ if (!donorTemplate.exists) return;
1479
+ // Place volatiles on the Pokémon to show the donor details.
1480
+ this.add('-start', pokemon, donorTemplate.name, '[silent]');
1481
+ },
1441
1482
  },
1442
1483
  {
1443
1484
  name: "[Gen 8] Linked",
@@ -1448,7 +1489,7 @@ export const Formats: FormatList = [
1448
1489
 
1449
1490
  mod: 'linked',
1450
1491
  searchShow: false,
1451
- ruleset: ['Standard', 'Dynamax Clause'],
1492
+ ruleset: ['Standard OMs', 'Sleep Clause Mod'],
1452
1493
  banlist: [
1453
1494
  'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Cloyster', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Eternatus', 'Genesect', 'Giratina',
1454
1495
  'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala',
@@ -1481,7 +1522,7 @@ export const Formats: FormatList = [
1481
1522
 
1482
1523
  mod: 'gen8',
1483
1524
  searchShow: false,
1484
- ruleset: ['Standard', 'Dynamax Clause', '2 Ability Clause', 'Sleep Moves Clause', '!Sleep Clause Mod'],
1525
+ ruleset: ['Standard OMs', '2 Ability Clause', 'Sleep Moves Clause'],
1485
1526
  banlist: [
1486
1527
  'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Dragonite', 'Eternatus',
1487
1528
  'Genesect', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem-Black', 'Kyurem-White',
@@ -1671,7 +1712,7 @@ export const Formats: FormatList = [
1671
1712
 
1672
1713
  mod: 'gen8',
1673
1714
  searchShow: false,
1674
- ruleset: ['Standard', 'Dynamax Clause'],
1715
+ ruleset: ['Standard OMs', 'Sleep Clause Mod'],
1675
1716
  banlist: [
1676
1717
  'Blissey', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chansey', 'Cloyster', 'Dialga', 'Eternatus', 'Genesect', 'Giratina',
1677
1718
  'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala',
@@ -1725,7 +1766,7 @@ export const Formats: FormatList = [
1725
1766
  ],
1726
1767
  mod: 'pokebilities',
1727
1768
  searchShow: false,
1728
- ruleset: ['Standard', 'Dynamax Clause'],
1769
+ ruleset: ['Standard OMs', 'Sleep Clause Mod'],
1729
1770
  banlist: [
1730
1771
  'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Conkeldurr', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Dracozolt',
1731
1772
  'Eternatus', 'Excadrill', 'Genesect', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kyogre', 'Kyurem-Black',
@@ -1764,10 +1805,26 @@ export const Formats: FormatList = [
1764
1805
  .filter(ability => ability !== pokemon.ability);
1765
1806
  }
1766
1807
  },
1808
+ onBeforeSwitchIn(pokemon) {
1809
+ // Abilities that must be applied before both sides trigger onSwitchIn to correctly
1810
+ // handle switch-in ability-to-ability interactions, e.g. Intimidate counters
1811
+ const neededBeforeSwitchInIDs = [
1812
+ 'clearbody', 'competitive', 'contrary', 'defiant', 'fullmetalbody', 'hypercutter', 'innerfocus',
1813
+ 'mirrorarmor', 'oblivious', 'owntempo', 'rattled', 'scrappy', 'simple', 'whitesmoke',
1814
+ ];
1815
+ if (pokemon.m.innates) {
1816
+ for (const innate of pokemon.m.innates) {
1817
+ if (!neededBeforeSwitchInIDs.includes(innate)) continue;
1818
+ if (pokemon.hasAbility(innate)) continue;
1819
+ pokemon.addVolatile("ability:" + innate, pokemon);
1820
+ }
1821
+ }
1822
+ },
1767
1823
  onSwitchInPriority: 2,
1768
1824
  onSwitchIn(pokemon) {
1769
1825
  if (pokemon.m.innates) {
1770
1826
  for (const innate of pokemon.m.innates) {
1827
+ if (pokemon.hasAbility(innate)) continue;
1771
1828
  pokemon.addVolatile("ability:" + innate, pokemon);
1772
1829
  }
1773
1830
  }
@@ -1790,6 +1847,17 @@ export const Formats: FormatList = [
1790
1847
  pokemon.m.innates = undefined;
1791
1848
  },
1792
1849
  },
1850
+ {
1851
+ name: "[Gen 8] Pure Hackmons",
1852
+ desc: `Anything that can be hacked in-game and is usable in local battles is allowed.`,
1853
+ threads: [
1854
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3656851/">Pure Hackmons</a>`,
1855
+ ],
1856
+
1857
+ mod: 'gen8',
1858
+ searchShow: false,
1859
+ ruleset: ['-Nonexistent', 'Team Preview', 'HP Percentage Mod', 'Cancel Mod', 'Endless Battle Clause'],
1860
+ },
1793
1861
  {
1794
1862
  name: "[Gen 8] Shared Power",
1795
1863
  desc: `Once a Pok&eacute;mon switches in, its ability is shared with the rest of the team.`,
@@ -1799,7 +1867,7 @@ export const Formats: FormatList = [
1799
1867
 
1800
1868
  mod: 'sharedpower',
1801
1869
  searchShow: false,
1802
- ruleset: ['Standard', 'Dynamax Clause'],
1870
+ ruleset: ['Standard OMs', 'Sleep Clause Mod'],
1803
1871
  banlist: [
1804
1872
  'Calyrex-Ice', 'Calyrex-Shadow', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Eternatus', 'Genesect', 'Giratina',
1805
1873
  'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna',
@@ -1863,7 +1931,7 @@ export const Formats: FormatList = [
1863
1931
  searchShow: false,
1864
1932
  challengeShow: false,
1865
1933
  tournamentShow: false,
1866
- ruleset: ['Standard', 'Dynamax Clause'],
1934
+ ruleset: ['Standard OMs', 'Sleep Clause Mod'],
1867
1935
  banlist: [
1868
1936
  'Calyrex-Ice', 'Calyrex-Shadow', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Dragapult', 'Eternatus', 'Kyurem-Black', 'Kyurem-White', 'Giratina',
1869
1937
  'Giratina-Origin', 'Genesect', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Lugia', 'Lunala', 'Magearna', 'Marowak-Alola', 'Marshadow', 'Melmetal',
@@ -1970,7 +2038,7 @@ export const Formats: FormatList = [
1970
2038
 
1971
2039
  mod: 'gen8',
1972
2040
  searchShow: false,
1973
- ruleset: ['Standard', '!OHKO Clause', 'Picked Team Size = 6', 'Adjust Level = 100'],
2041
+ ruleset: ['Standard OMs', 'Sleep Clause Mod', '!OHKO Clause', 'Picked Team Size = 6', 'Adjust Level = 100'],
1974
2042
  banlist: [
1975
2043
  'Sandshrew-Alola', 'Shedinja', 'Infiltrator', 'Magic Guard', 'Choice Scarf',
1976
2044
  'Explosion', 'Final Gambit', 'Healing Wish', 'Lunar Dance', 'Magic Room', 'Memento', 'Misty Explosion', 'Self-Destruct',
@@ -2097,6 +2165,21 @@ export const Formats: FormatList = [
2097
2165
  },
2098
2166
  },
2099
2167
 
2168
+ // Randomized Format Spotlight
2169
+ ///////////////////////////////////////////////////////////////////
2170
+
2171
+ {
2172
+ section: "Randomized Format Spotlight",
2173
+ column: 2,
2174
+ },
2175
+ {
2176
+ name: "[Gen 3] Challenge Cup",
2177
+
2178
+ mod: 'gen3',
2179
+ team: 'randomCC',
2180
+ ruleset: ['Obtainable', 'HP Percentage Mod', 'Cancel Mod'],
2181
+ },
2182
+
2100
2183
  // Randomized Metas
2101
2184
  ///////////////////////////////////////////////////////////////////
2102
2185
 
@@ -2438,47 +2521,39 @@ export const Formats: FormatList = [
2438
2521
  column: 3,
2439
2522
  },
2440
2523
  {
2441
- name: "[Gen 2] Ubers",
2524
+ name: "[Gen 3] Ubers",
2442
2525
  threads: [
2443
- `&bullet; <a href="https://www.smogon.com/forums/posts/8286282/">GSC Ubers</a>`,
2526
+ `&bullet; <a href="https://www.smogon.com/forums/posts/8286280/">ADV Ubers</a>`,
2444
2527
  ],
2445
2528
 
2446
- mod: 'gen2',
2529
+ mod: 'gen3',
2447
2530
  // searchShow: false,
2448
- ruleset: ['Standard'],
2531
+ ruleset: ['Standard', 'Deoxys Camouflage Clause', 'One Baton Pass Clause'],
2532
+ banlist: ['Wobbuffet + Leftovers'],
2449
2533
  },
2450
2534
  {
2451
- name: "[Gen 3] 1v1",
2452
- desc: `Bring three Pok&eacute;mon to Team Preview and choose one to battle.`,
2535
+ name: "[Gen 5] RU",
2453
2536
  threads: [
2454
- `&bullet; <a href="https://www.smogon.com/forums/posts/8031456/">ADV 1v1</a>`,
2537
+ `&bullet; <a href="https://www.smogon.com/forums/posts/6431094/">BW2 Sample Teams</a>`,
2538
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3473124/">BW2 RU Viability Rankings</a>`,
2455
2539
  ],
2456
2540
 
2457
- mod: 'gen3',
2541
+ mod: 'gen5',
2458
2542
  // searchShow: false,
2459
- ruleset: [
2460
- 'Picked Team Size = 1', 'Max Team Size = 3',
2461
- '[Gen 3] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview', '!Freeze Clause Mod',
2462
- ],
2463
- banlist: [
2464
- 'Clefable', 'Slaking', 'Snorlax', 'Suicune', 'Zapdos', 'Destiny Bond', 'Explosion', 'Ingrain', 'Perish Song',
2465
- 'Self-Destruct', 'Bright Powder', 'Focus Band', 'King\'s Rock', 'Lax Incense', 'Quick Claw',
2466
- ],
2467
- unbanlist: ['Mr. Mime', 'Wobbuffet', 'Wynaut', 'Sand Veil'],
2543
+ ruleset: ['[Gen 5] UU', 'Baton Pass Clause', '!Sleep Clause Mod', 'Sleep Moves Clause'],
2544
+ banlist: ['UU', 'RUBL', 'Shadow Tag', 'Shell Smash + Baton Pass'],
2545
+ unbanlist: ['Prankster + Assist', 'Prankster + Copycat', 'Baton Pass'],
2468
2546
  },
2469
2547
  {
2470
- name: "[Gen 1] Stadium OU",
2548
+ name: "[Gen 7 Let's Go] UU",
2471
2549
  threads: [
2472
- `&bullet; <a href="https://www.smogon.com/forums/threads/3685877/">Stadium OU Viability Rankings</a>`,
2550
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3659882/">LGPE UU Metagame Discussion &amp; Resources</a>`,
2473
2551
  ],
2474
2552
 
2475
- mod: 'gen1stadium',
2553
+ mod: 'gen7letsgo',
2476
2554
  // searchShow: false,
2477
- ruleset: ['Standard', 'Team Preview'],
2478
- banlist: ['Uber',
2479
- 'Nidoking + Fury Attack + Thrash', 'Exeggutor + Poison Powder + Stomp', 'Exeggutor + Sleep Powder + Stomp',
2480
- 'Exeggutor + Stun Spore + Stomp', 'Jolteon + Focus Energy + Thunder Shock', 'Flareon + Focus Energy + Ember',
2481
- ],
2555
+ ruleset: ['[Gen 7 Let\'s Go] OU'],
2556
+ banlist: ['OU', 'UUBL'],
2482
2557
  },
2483
2558
 
2484
2559
  // Past Gens OU
@@ -2597,7 +2672,7 @@ export const Formats: FormatList = [
2597
2672
  ],
2598
2673
 
2599
2674
  mod: 'gen7mixandmega',
2600
- ruleset: ['Standard', 'Mega Rayquaza Clause', 'Overflow Stat Mod'],
2675
+ ruleset: ['Standard OMs', 'Mega Rayquaza Clause', 'Sleep Clause Mod'],
2601
2676
  banlist: ['Shadow Tag', 'Gengarite', 'Baton Pass', 'Electrify'],
2602
2677
  restricted: [
2603
2678
  'Arceus', 'Deoxys', 'Dialga', 'Dragonite', 'Giratina', 'Groudon', 'Ho-Oh', 'Kyogre', 'Kyurem', 'Landorus-Therian', 'Lugia',
@@ -2793,8 +2868,7 @@ export const Formats: FormatList = [
2793
2868
  'Groudon', 'Ho-Oh', 'Hoopa-Unbound', 'Kangaskhan-Mega', 'Kartana', 'Kyogre', 'Kyurem-White', 'Lucario-Mega', 'Lugia', 'Lunala', 'Magearna',
2794
2869
  'Marshadow', 'Mawile-Mega', 'Medicham-Mega', 'Metagross-Mega', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia',
2795
2870
  'Pheromosa', 'Rayquaza', 'Reshiram', 'Salamence-Mega', 'Shaymin-Sky', 'Solgaleo', 'Tapu Lele', 'Xerneas', 'Yveltal', 'Zekrom', 'Zygarde',
2796
- 'Battle Bond', 'Shadow Tag', 'Bright Powder', 'Damp Rock', 'Focus Band', 'King\'s Rock', 'Lax Incense', 'Quick Claw', 'Razor Fang',
2797
- 'Smooth Rock', 'Terrain Extender', 'Baton Pass',
2871
+ 'Battle Bond', 'Shadow Tag', 'Damp Rock', 'Focus Band', 'King\'s Rock', 'Quick Claw', 'Razor Fang', 'Smooth Rock', 'Terrain Extender', 'Baton Pass',
2798
2872
  ],
2799
2873
  },
2800
2874
  {
@@ -3107,8 +3181,7 @@ export const Formats: FormatList = [
3107
3181
  'Gengar-Mega', 'Giratina', 'Giratina-Origin', 'Greninja', 'Groudon', 'Ho-Oh', 'Hoopa-Unbound', 'Kangaskhan-Mega', 'Kyogre', 'Kyurem-White',
3108
3182
  'Lucario-Mega', 'Lugia', 'Mawile-Mega', 'Medicham-Mega', 'Metagross-Mega', 'Mewtwo', 'Palkia', 'Rayquaza', 'Reshiram', 'Sableye-Mega',
3109
3183
  'Salamence-Mega', 'Shaymin-Sky', 'Slowbro-Mega', 'Talonflame', 'Xerneas', 'Yveltal', 'Zekrom',
3110
- 'Shadow Tag', 'Bright Powder', 'Damp Rock', 'Focus Band', 'King\'s Rock', 'Lax Incense', 'Quick Claw', 'Razor Fang', 'Smooth Rock',
3111
- 'Soul Dew', 'Baton Pass',
3184
+ 'Shadow Tag', 'Damp Rock', 'Focus Band', 'King\'s Rock', 'Quick Claw', 'Razor Fang', 'Smooth Rock', 'Soul Dew', 'Baton Pass',
3112
3185
  ],
3113
3186
  },
3114
3187
  {
@@ -3329,19 +3402,6 @@ export const Formats: FormatList = [
3329
3402
  ruleset: ['Standard', 'Evasion Abilities Clause', 'Swagger Clause', 'Sleep Clause Mod'],
3330
3403
  banlist: ['Uber', 'OU', 'UUBL', 'Arena Trap', 'Drought', 'Sand Stream', 'Snow Warning', 'Prankster + Assist', 'Prankster + Copycat', 'Baton Pass'],
3331
3404
  },
3332
- {
3333
- name: "[Gen 5] RU",
3334
- threads: [
3335
- `&bullet; <a href="https://www.smogon.com/forums/posts/6431094/">BW2 Sample Teams</a>`,
3336
- `&bullet; <a href="https://www.smogon.com/forums/threads/3473124/">BW2 RU Viability Rankings</a>`,
3337
- ],
3338
-
3339
- mod: 'gen5',
3340
- searchShow: false,
3341
- ruleset: ['[Gen 5] UU', 'Baton Pass Clause', '!Sleep Clause Mod', 'Sleep Moves Clause'],
3342
- banlist: ['UU', 'RUBL', 'Shadow Tag', 'Shell Smash + Baton Pass'],
3343
- unbanlist: ['Prankster + Assist', 'Prankster + Copycat', 'Baton Pass'],
3344
- },
3345
3405
  {
3346
3406
  name: "[Gen 5] NU",
3347
3407
  threads: [
@@ -3390,6 +3450,7 @@ export const Formats: FormatList = [
3390
3450
  mod: 'gen5',
3391
3451
  searchShow: false,
3392
3452
  ruleset: ['[Gen 5] OU', 'Same Type Clause', '!Gems Clause'],
3453
+ banlist: ['Latios'],
3393
3454
  },
3394
3455
  {
3395
3456
  name: "[Gen 5] 1v1",
@@ -3404,7 +3465,7 @@ export const Formats: FormatList = [
3404
3465
  'Picked Team Size = 1', 'Max Team Size = 3',
3405
3466
  'Standard', 'Baton Pass Clause', 'Swagger Clause', 'Accuracy Moves Clause', 'Sleep Moves Clause',
3406
3467
  ],
3407
- 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'],
3468
+ banlist: ['Uber', 'Cottonee', 'Dragonite', 'Jirachi', 'Kyurem-Black', 'Mew', 'Togekiss', 'Whimsicott', 'Victini', 'Focus Band', 'Focus Sash', 'Quick Claw', 'Soul Dew', 'Perish Song'],
3408
3469
  unbanlist: ['Genesect', 'Landorus', 'Manaphy', 'Thundurus', 'Tornadus-Therian'],
3409
3470
  },
3410
3471
  {
@@ -3417,6 +3478,7 @@ export const Formats: FormatList = [
3417
3478
  searchShow: false,
3418
3479
  ruleset: ['[Gen 5] PU'],
3419
3480
  banlist: ['PU', 'Articuno', 'Dragonair', 'Glalie', 'Machoke', 'Marowak', 'Omanyte', 'Regigigas', 'Trubbish', 'Whirlipede', 'Baton Pass'],
3481
+ unbanlist: ['Damp Rock'],
3420
3482
  },
3421
3483
  {
3422
3484
  name: "[Gen 5] GBU Singles",
@@ -3618,7 +3680,7 @@ export const Formats: FormatList = [
3618
3680
  ruleset: ['[Gen 4] PU'],
3619
3681
  banlist: [
3620
3682
  'Ampharos', 'Armaldo', 'Bellossom', 'Dragonair', 'Electabuzz', 'Gabite', 'Gastrodon', 'Glaceon', 'Glalie',
3621
- 'Golduck', 'Gorebyss', 'Hippopotas', 'Kadabra', 'Machoke', 'Magmar', 'Mantine', 'Marowak', 'Metang',
3683
+ 'Golduck', 'Gorebyss', 'Hippopotas', 'Kadabra', 'Lapras', 'Machoke', 'Magmar', 'Mantine', 'Marowak', 'Metang',
3622
3684
  'Misdreavus', 'Monferno', 'Mr. Mime', 'Muk', 'Murkrow', 'Pinsir', 'Politoed', 'Purugly', 'Quagsire',
3623
3685
  'Raichu', 'Rampardos', 'Rapidash', 'Regigigas', 'Relicanth', 'Rhydon', 'Scyther', 'Sneasel', 'Snover',
3624
3686
  'Solrock', 'Tangela', 'Torkoal', 'Victreebel', 'Xatu', 'Zangoose', 'Damp Rock',
@@ -3691,17 +3753,6 @@ export const Formats: FormatList = [
3691
3753
  section: "Past Generations",
3692
3754
  column: 5,
3693
3755
  },
3694
- {
3695
- name: "[Gen 3] Ubers",
3696
- threads: [
3697
- `&bullet; <a href="https://www.smogon.com/forums/posts/8286280/">ADV Ubers</a>`,
3698
- ],
3699
-
3700
- mod: 'gen3',
3701
- searchShow: false,
3702
- ruleset: ['Standard', 'Deoxys Camouflage Clause', 'One Baton Pass Clause'],
3703
- banlist: ['Wobbuffet + Leftovers'],
3704
- },
3705
3756
  {
3706
3757
  name: "[Gen 3] UU",
3707
3758
  threads: [
@@ -3712,7 +3763,7 @@ export const Formats: FormatList = [
3712
3763
  mod: 'gen3',
3713
3764
  searchShow: false,
3714
3765
  ruleset: ['Standard'],
3715
- banlist: ['Uber', 'OU', 'UUBL', 'Smeargle + Ingrain', 'Arena Trap', 'Bright Powder', 'Lax Incense', 'Baton Pass', 'Swagger'],
3766
+ banlist: ['Uber', 'OU', 'UUBL', 'Smeargle + Ingrain', 'Arena Trap', 'Baton Pass', 'Swagger'],
3716
3767
  },
3717
3768
  {
3718
3769
  name: "[Gen 3] NU",
@@ -3725,6 +3776,25 @@ export const Formats: FormatList = [
3725
3776
  ruleset: ['Standard'],
3726
3777
  banlist: ['Uber', 'OU', 'UUBL', 'UU', 'Smeargle + Ingrain'],
3727
3778
  },
3779
+ {
3780
+ name: "[Gen 3] 1v1",
3781
+ desc: `Bring three Pok&eacute;mon to Team Preview and choose one to battle.`,
3782
+ threads: [
3783
+ `&bullet; <a href="https://www.smogon.com/forums/posts/8031456/">ADV 1v1</a>`,
3784
+ ],
3785
+
3786
+ mod: 'gen3',
3787
+ searchShow: false,
3788
+ ruleset: [
3789
+ 'Picked Team Size = 1', 'Max Team Size = 3',
3790
+ '[Gen 3] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview', '!Freeze Clause Mod',
3791
+ ],
3792
+ banlist: [
3793
+ 'Clefable', 'Slaking', 'Snorlax', 'Suicune', 'Zapdos', 'Destiny Bond', 'Explosion', 'Ingrain', 'Perish Song',
3794
+ 'Self-Destruct', 'Focus Band', 'King\'s Rock', 'Quick Claw',
3795
+ ],
3796
+ unbanlist: ['Mr. Mime', 'Wobbuffet', 'Wynaut', 'Sand Veil'],
3797
+ },
3728
3798
  {
3729
3799
  name: "[Gen 3] Doubles OU",
3730
3800
  threads: [
@@ -3756,6 +3826,16 @@ export const Formats: FormatList = [
3756
3826
  debug: true,
3757
3827
  ruleset: ['HP Percentage Mod', 'Cancel Mod', 'Max Team Size = 24', 'Max Move Count = 24', 'Max Level = 9999', 'Default Level = 100'],
3758
3828
  },
3829
+ {
3830
+ name: "[Gen 2] Ubers",
3831
+ threads: [
3832
+ `&bullet; <a href="https://www.smogon.com/forums/posts/8286282/">GSC Ubers</a>`,
3833
+ ],
3834
+
3835
+ mod: 'gen2',
3836
+ searchShow: false,
3837
+ ruleset: ['Standard'],
3838
+ },
3759
3839
  {
3760
3840
  name: "[Gen 2] UU",
3761
3841
  threads: [`&bullet; <a href="https://www.smogon.com/forums/threads/3576710/">GSC UU</a>`],
@@ -3764,6 +3844,7 @@ export const Formats: FormatList = [
3764
3844
  searchShow: false,
3765
3845
  ruleset: ['[Gen 2] OU'],
3766
3846
  banlist: ['OU', 'UUBL'],
3847
+ unbanlist: ['Mean Look + Baton Pass', 'Spider Web + Baton Pass'],
3767
3848
  },
3768
3849
  {
3769
3850
  name: "[Gen 2] NU",
@@ -3785,7 +3866,7 @@ export const Formats: FormatList = [
3785
3866
  '[Gen 2] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview',
3786
3867
  ],
3787
3868
  banlist: [
3788
- 'Alakazam', 'Clefable', 'Snorlax', 'Zapdos', 'Berserk Gene', 'Bright Powder', 'Focus Band', 'King\'s Rock', 'Quick Claw',
3869
+ 'Alakazam', 'Clefable', 'Snorlax', 'Zapdos', 'Berserk Gene', 'Focus Band', 'King\'s Rock', 'Quick Claw',
3789
3870
  'Attract', 'Destiny Bond', 'Explosion', 'Perish Song', 'Present', 'Self-Destruct', 'Swagger',
3790
3871
  ],
3791
3872
  },
@@ -3854,9 +3935,23 @@ export const Formats: FormatList = [
3854
3935
 
3855
3936
  mod: 'gen1',
3856
3937
  searchShow: false,
3857
- ruleset: ['[Gen 1] UU'],
3938
+ ruleset: ['[Gen 1] UU', '!APT Clause'],
3858
3939
  banlist: ['UU', 'NUBL'],
3859
3940
  },
3941
+ {
3942
+ name: "[Gen 1] 1v1",
3943
+ threads: [
3944
+ `&bullet; <a href="https://www.smogon.com/forums/posts/8031462">RBY 1v1</a>`,
3945
+ ],
3946
+
3947
+ mod: 'gen1',
3948
+ searchShow: false,
3949
+ ruleset: [
3950
+ 'Picked Team Size = 1', 'Max Team Size = 3',
3951
+ '[Gen 1] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview',
3952
+ ],
3953
+ banlist: ['Bind', 'Clamp', 'Explosion', 'Fire Spin', 'Self-Destruct', 'Wrap'],
3954
+ },
3860
3955
  {
3861
3956
  name: "[Gen 1] Japanese OU",
3862
3957
  desc: `Generation 1 with Japanese battle mechanics.`,
@@ -3880,6 +3975,20 @@ export const Formats: FormatList = [
3880
3975
  ],
3881
3976
  banlist: ['Uber'],
3882
3977
  },
3978
+ {
3979
+ name: "[Gen 1] Stadium OU",
3980
+ threads: [
3981
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3685877/">Stadium OU Viability Rankings</a>`,
3982
+ ],
3983
+
3984
+ mod: 'gen1stadium',
3985
+ searchShow: false,
3986
+ ruleset: ['Standard', 'Team Preview'],
3987
+ banlist: ['Uber',
3988
+ 'Nidoking + Fury Attack + Thrash', 'Exeggutor + Poison Powder + Stomp', 'Exeggutor + Sleep Powder + Stomp',
3989
+ 'Exeggutor + Stun Spore + Stomp', 'Jolteon + Focus Energy + Thunder Shock', 'Flareon + Focus Energy + Ember',
3990
+ ],
3991
+ },
3883
3992
  {
3884
3993
  name: "[Gen 1] Tradebacks OU",
3885
3994
  desc: `RBY OU with movepool additions from the Time Capsule.`,