@pkmn/sim 0.5.3 → 0.5.7

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 (80) hide show
  1. package/build/config/formats.js +402 -332
  2. package/build/config/formats.js.map +1 -1
  3. package/build/data/aliases.js +4 -4
  4. package/build/data/aliases.js.map +1 -1
  5. package/build/data/formats-data.js +183 -70
  6. package/build/data/formats-data.js.map +1 -1
  7. package/build/data/mods/gen1/formats-data.js +190 -190
  8. package/build/data/mods/gen1/formats-data.js.map +1 -1
  9. package/build/data/mods/gen1/moves.js +1 -2
  10. package/build/data/mods/gen1/moves.js.map +1 -1
  11. package/build/data/mods/gen2/formats-data.js +1 -1
  12. package/build/data/mods/gen2/formats-data.js.map +1 -1
  13. package/build/data/mods/gen3/formats-data.js +13 -13
  14. package/build/data/mods/gen3/formats-data.js.map +1 -1
  15. package/build/data/mods/gen4/moves.js +22 -0
  16. package/build/data/mods/gen4/moves.js.map +1 -1
  17. package/build/data/mods/gen5/formats-data.js +173 -156
  18. package/build/data/mods/gen5/formats-data.js.map +1 -1
  19. package/build/data/mods/gen6/formats-data.js +4 -3
  20. package/build/data/mods/gen6/formats-data.js.map +1 -1
  21. package/build/data/mods/gen7/formats-data.js +3 -2
  22. package/build/data/mods/gen7/formats-data.js.map +1 -1
  23. package/build/data/mods/gen7/moves.js +154 -0
  24. package/build/data/mods/gen7/moves.js.map +1 -1
  25. package/build/data/moves.js +38 -7
  26. package/build/data/moves.js.map +1 -1
  27. package/build/data/pokedex.js +480 -11
  28. package/build/data/pokedex.js.map +1 -1
  29. package/build/data/rulesets.js +12 -1
  30. package/build/data/rulesets.js.map +1 -1
  31. package/build/data/tags.d.ts +1 -0
  32. package/build/data/tags.js +4 -3
  33. package/build/data/tags.js.map +1 -1
  34. package/build/data/text/abilities.js +4 -4
  35. package/build/data/text/abilities.js.map +1 -1
  36. package/build/data/text/moves.js +18 -18
  37. package/build/data/text/moves.js.map +1 -1
  38. package/build/sim/battle-actions.js +4 -1
  39. package/build/sim/battle-actions.js.map +1 -1
  40. package/build/sim/battle.js +23 -22
  41. package/build/sim/battle.js.map +1 -1
  42. package/build/sim/dex-formats.d.ts +1 -0
  43. package/build/sim/dex-formats.js +3 -2
  44. package/build/sim/dex-formats.js.map +1 -1
  45. package/build/sim/dex-species.js +5 -2
  46. package/build/sim/dex-species.js.map +1 -1
  47. package/build/sim/exported-global-types.d.ts +1 -0
  48. package/build/sim/global-types.d.ts +1 -0
  49. package/build/sim/index.d.ts +1 -0
  50. package/build/sim/index.js +3 -1
  51. package/build/sim/index.js.map +1 -1
  52. package/build/sim/team-validator.js +13 -0
  53. package/build/sim/team-validator.js.map +1 -1
  54. package/config/formats.ts +422 -352
  55. package/data/aliases.ts +4 -4
  56. package/data/formats-data.ts +183 -70
  57. package/data/mods/gen1/formats-data.ts +190 -190
  58. package/data/mods/gen1/moves.ts +1 -2
  59. package/data/mods/gen2/formats-data.ts +1 -1
  60. package/data/mods/gen3/formats-data.ts +13 -13
  61. package/data/mods/gen4/moves.ts +21 -0
  62. package/data/mods/gen5/formats-data.ts +173 -156
  63. package/data/mods/gen6/formats-data.ts +4 -3
  64. package/data/mods/gen7/formats-data.ts +3 -2
  65. package/data/mods/gen7/moves.ts +150 -0
  66. package/data/moves.ts +37 -7
  67. package/data/pokedex.ts +480 -11
  68. package/data/rulesets.ts +11 -1
  69. package/data/tags.ts +6 -3
  70. package/data/text/abilities.ts +4 -4
  71. package/data/text/moves.ts +18 -18
  72. package/package.json +2 -2
  73. package/sim/battle-actions.ts +4 -1
  74. package/sim/battle.ts +24 -23
  75. package/sim/dex-formats.ts +4 -1
  76. package/sim/dex-species.ts +5 -2
  77. package/sim/exported-global-types.ts +1 -0
  78. package/sim/global-types.ts +1 -0
  79. package/sim/index.ts +1 -0
  80. package/sim/team-validator.ts +12 -0
package/config/formats.ts CHANGED
@@ -143,7 +143,7 @@ export const Formats: FormatList = [
143
143
 
144
144
  mod: 'gen8',
145
145
  ruleset: ['[Gen 8] RU'],
146
- banlist: ['RU', 'NUBL', 'Drizzle', 'Drought'],
146
+ banlist: ['RU', 'NUBL', 'Drizzle', 'Drought', 'Slush Rush'],
147
147
  },
148
148
  {
149
149
  name: "[Gen 8] PU",
@@ -208,7 +208,7 @@ export const Formats: FormatList = [
208
208
  'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Dialga', 'Dragonite', 'Eternatus', 'Genesect', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Jirachi',
209
209
  'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Melmetal', 'Mew', 'Mewtwo', 'Mimikyu', 'Necrozma-Dawn-Wings',
210
210
  'Necrozma-Dusk-Mane', 'Palkia', 'Rayquaza', 'Reshiram', 'Sableye', 'Snorlax', 'Solgaleo', 'Victini', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned',
211
- 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Moody', 'Bright Powder', 'Focus Band', 'Focus Sash', 'Lax Incense', 'Quick Claw', 'Perish Song',
211
+ 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Moody', 'Power Construct', 'Bright Powder', 'Focus Band', 'Focus Sash', 'Lax Incense', 'Quick Claw', 'Perish Song',
212
212
  ],
213
213
  },
214
214
  {
@@ -234,7 +234,7 @@ export const Formats: FormatList = [
234
234
  mod: 'gen8',
235
235
  ruleset: ['[Gen 8] PU'],
236
236
  banlist: [
237
- 'PU', 'Centiskorch', 'Drampa', 'Exeggutor-Alola', 'Gallade', 'Haunter', 'Magmortar', 'Magneton', 'Omastar', 'Rotom-Frost',
237
+ 'PU', 'Aurorus', 'Centiskorch', 'Drampa', 'Exeggutor-Alola', 'Gallade', 'Haunter', 'Magmortar', 'Magneton', 'Omastar', 'Rotom-Frost',
238
238
  'Turtonator', 'Vanilluxe', 'Vikavolt', 'Silvally-Dragon', 'Silvally-Ground', 'Sneasel', 'Damp Rock', 'Grassy Seed',
239
239
  ],
240
240
  },
@@ -285,35 +285,9 @@ export const Formats: FormatList = [
285
285
  name: "[Gen 8] Battle Stadium Singles",
286
286
 
287
287
  mod: 'gen8',
288
- ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 8', 'Limit One Restricted'],
288
+ ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 8', 'Limit Two Restricted'],
289
289
  restricted: ['Restricted Legendary'],
290
290
  },
291
- {
292
- name: "[Gen 8] Battle Stadium Singles Series 9",
293
- threads: [
294
- `&bullet; <a href="https://www.smogon.com/forums/threads/3679374/">BSS Discussion</a>`,
295
- `&bullet; <a href="https://www.smogon.com/forums/threads/3672698/">BSS Viability Rankings</a>`,
296
- ],
297
-
298
- mod: 'gen8',
299
- searchShow: false,
300
- ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 8'],
301
- },
302
- {
303
- name: "[Gen 8] Test Your Luck!",
304
- threads: [
305
- `&bullet; <a href="https://www.smogon.com/forums/threads/3695144/">Test Your Luck! Discussion</a>`,
306
- ],
307
-
308
- mod: 'gen8',
309
- ruleset: ['Flat Rules', '!! Adjust Level = 50', 'VGC Timer', 'Min Source Gen = 8'],
310
- banlist: ['Azelf', 'Mesprit', 'Uxie'],
311
- onValidateSet(set, format) {
312
- if (set.moves.length !== 1 || this.dex.moves.get(set.moves[0]).id !== 'metronome') {
313
- return [`${set.name || set.species} has illegal moves.`, `(${format.name} only allows the move Metronome)`];
314
- }
315
- },
316
- },
317
291
  {
318
292
  name: "[Gen 8] Custom Game",
319
293
 
@@ -395,20 +369,7 @@ export const Formats: FormatList = [
395
369
  restricted: ['Restricted Legendary'],
396
370
  },
397
371
  {
398
- name: "[Gen 8] VGC 2021 Series 11",
399
- threads: [
400
- `&bullet; <a href="https://www.smogon.com/forums/threads/3677186/">VGC 2021 Series 11 Metagame Discussion</a>`,
401
- `&bullet; <a href="https://www.smogon.com/forums/threads/3693427/">VGC 2021 Series 11 Sample Teams</a>`,
402
- `&bullet; <a href="https://www.smogon.com/forums/threads/3693284/">VGC 2021 Series 11 Viability Rankings</a>`,
403
- ],
404
-
405
- mod: 'gen8',
406
- gameType: 'doubles',
407
- ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 8', 'VGC Timer', 'Limit One Restricted'],
408
- restricted: ['Restricted Legendary'],
409
- },
410
- {
411
- name: "[Gen 8] VGC 2021 Series 9",
372
+ name: "[Gen 8] VGC 2021",
412
373
 
413
374
  mod: 'gen8',
414
375
  gameType: 'doubles',
@@ -514,13 +475,15 @@ export const Formats: FormatList = [
514
475
  mod: 'gen8',
515
476
  ruleset: ['Standard NatDex', 'OHKO Clause', 'Evasion Moves Clause', 'Species Clause', 'Dynamax Clause', 'Sleep Clause Mod'],
516
477
  banlist: [
517
- 'Alakazam-Mega', 'Arceus', 'Blastoise-Mega', 'Blaziken-Mega', 'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Darkrai', 'Darmanitan-Galar',
518
- 'Deoxys-Attack', 'Deoxys-Base', 'Deoxys-Speed', 'Dialga', 'Dracovish', 'Dragapult', 'Eternatus', 'Genesect', 'Gengar-Mega', 'Giratina',
519
- 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kangaskhan-Mega', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lucario-Mega',
520
- 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Metagross-Mega', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane',
521
- 'Necrozma-Ultra', 'Palkia', 'Pheromosa', 'Rayquaza', 'Reshiram', 'Salamence-Mega', 'Shaymin-Sky', 'Solgaleo', 'Spectrier', 'Tornadus-Therian',
522
- 'Urshifu-Base', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Zygarde-Base', 'Zygarde-Complete',
523
- 'Arena Trap', 'Moody', 'Power Construct', 'Shadow Tag', 'King\'s Rock', 'Razor Fang', 'Quick Claw', 'Baton Pass',
478
+ 'Alakazam-Mega', 'Arceus', 'Blastoise-Mega', 'Blaziken-Mega', 'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Darkrai',
479
+ 'Darmanitan-Galar', 'Deoxys-Attack', 'Deoxys-Base', 'Deoxys-Speed', 'Dialga', 'Dracovish', 'Dragapult', 'Eternatus',
480
+ 'Genesect', 'Gengar-Mega', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kangaskhan-Mega', 'Kyogre', 'Kyurem-Black',
481
+ 'Kyurem-White', 'Landorus-Base', 'Lucario-Mega', 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Metagross-Mega', 'Mewtwo',
482
+ 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Necrozma-Ultra', 'Palkia', 'Pheromosa', 'Rayquaza', 'Reshiram',
483
+ 'Salamence-Mega', 'Shaymin-Sky', 'Solgaleo', 'Spectrier', 'Urshifu-Base', 'Xerneas', 'Yveltal', 'Zacian',
484
+ 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Zygarde-Base', 'Zygarde-Complete', 'Arena Trap', 'Moody',
485
+ 'Power Construct', 'Sand Veil', 'Shadow Tag', 'Snow Cloak', 'Bright Powder', 'King\'s Rock', 'Lax Incense', 'Razor Fang',
486
+ 'Quick Claw', 'Baton Pass',
524
487
  ],
525
488
  },
526
489
  {
@@ -543,12 +506,14 @@ export const Formats: FormatList = [
543
506
  'Drizzle', 'Drought',
544
507
  // Slowbronite is banned so it doesn't validate on Galarian Slowbro
545
508
  'Slowbronite',
509
+ // NatDex suspect
510
+ 'Tornadus-Therian',
546
511
  ],
547
512
  // Used to distinguish UU from below UU in the client
548
513
  restricted: [
549
514
  'Aegislash', 'Alakazam-Base', 'Altaria-Mega', 'Amoonguss', 'Beedrill-Mega', 'Blaziken-Base', 'Breloom', 'Celesteela',
550
515
  'Chandelure', 'Donphan', 'Dracozolt', 'Dragonite', 'Feraligatr', 'Gastrodon', 'Hatterene', 'Hippowdon', 'Infernape',
551
- 'Keldeo', 'Krookodile', 'Mamoswine', 'Mandibuzz', 'Manectric-Mega', 'Medicham-Mega', 'Melmetal', 'Mienshao', 'Moltres-Base',
516
+ 'Keldeo', 'Krookodile', 'Mamoswine', 'Mandibuzz', 'Manectric-Mega', 'Melmetal', 'Mienshao', 'Moltres-Base',
552
517
  'Nidoking', 'Nidoqueen', 'Nihilego', 'Quagsire', 'Regieleki', 'Ribombee', 'Rotom-Heat', 'Rotom-Wash', 'Salamence',
553
518
  'Scizor', 'Skarmory', 'Slowking-Base', 'Swampert-Base', 'Talonflame', 'Tangrowth', 'Tornadus-Base', 'Umbreon',
554
519
  'Urshifu-Rapid-Strike',
@@ -591,36 +556,62 @@ export const Formats: FormatList = [
591
556
  section: "Pet Mods",
592
557
  },
593
558
  {
594
- name: "[Gen 8] Fusion Evolution UU",
559
+ name: "[Gen 8] Alternatium",
560
+ desc: `A metagame made up of only Pok&eacute;mon with alternate forms, with all of them being separate and unique.`,
595
561
  threads: [
596
- `&bullet; <a href="https://www.smogon.com/forums/threads/3674163/">Fusion Evolution UU</a>`,
562
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3683767/">Alternatium</a>`,
563
+ `&bullet; <a href="https://docs.google.com/spreadsheets/d/1bvvkPg1CrUBJFJJeuwkts8elfJcEcahGOoHm-vGBXOI/edit?usp=sharing">Spreadsheet</a>`,
597
564
  ],
598
565
 
599
- mod: "fusionevolutionuu",
600
- searchShow: false,
601
- ruleset: ['Standard NatDex', 'OHKO Clause', 'Evasion Moves Clause', 'Species Clause', 'Dynamax Clause', 'Sleep Clause Mod', 'Z-Move Clause', 'Data Mod', 'Mega Data Mod'],
602
- banlist: [
603
- 'All Pokemon', 'Lopunnite', 'Tapu Lop-Mega', 'Red Orb', 'Grousle-Primal',
604
- ],
566
+ mod: 'alternatium',
567
+ ruleset: ['Standard NatDex', 'Z-Move Clause', 'OHKO Clause', 'Evasion Moves Clause', 'Dynamax Clause', 'Sleep Clause Mod'],
568
+ banlist: ['All Pokemon', 'Past'],
605
569
  unbanlist: [
606
- 'Volquag', 'Toxalure', 'Kingtsar', 'Tanette', 'Slowton',
607
- 'Flaant', 'Umbat', 'Chomplim', 'Chomplim-Mega', 'Xotalion', 'Miemie', 'Dusking', 'Jelliswine',
608
- 'Pigapult', 'Lycanserker-Dusk', 'Tapu Lop', 'Dragontler', 'Eternabat',
609
- 'Grimmlurk', 'Manicuno-Galar', 'Yacian-Crowned', 'Cryogolem', 'Stoudrago',
610
- 'Grousle', 'Dongoro', 'Slurpum',
611
- 'Corveot', 'Corveot-Mega', 'Igglyzenta-Crowned', 'Arctres-Galar', 'Garborude', 'Noicity', 'Ferros',
612
- 'Landmaldo-Therian', 'Tentoxys-Defense', 'Strikados-Galar', 'Hooporant',
613
-
614
- 'Silvino-Bug', 'Silvino-Dark', 'Silvino-Dragon', 'Silvino-Electric', 'Silvino-Fairy', 'Silvino-Fighting',
615
- 'Silvino-Fire', 'Silvino-Flying', 'Silvino-Ghost', 'Silvino-Grass', 'Silvino-Ground', 'Silvino-Ice',
616
- 'Silvino-Poison', 'Silvino-Psychic', 'Silvino-Rock', 'Silvino-Steel', 'Silvino-Water', 'Silvino',
570
+ 'Silvally', 'Silvally-Bug', 'Silvally-Dark', 'Silvally-Dragon', 'Silvally-Electric', 'Silvally-Fairy', 'Silvally-Fighting', 'Silvally-Fire', 'Silvally-Flying', 'Silvally-Ghost',
571
+ 'Silvally-Grass', 'Silvally-Ground', 'Silvally-Ice', 'Silvally-Poison', 'Silvally-Psychic', 'Silvally-Rock', 'Silvally-Steel', 'Silvally-Water', 'Pikachu', 'Pikachu-Rock-Star',
572
+ 'Pikachu-Belle', 'Pikachu-Idol', 'Pikachu-PhD', 'Pikachu-Libre', 'Pikachu-Partner', 'Pikachu-Starter', 'Darmanitan', 'Darmanitan-Zen', 'Darmanitan-Galar', 'Darmanitan-Galar-Zen',
573
+ 'Aegishield', 'Aegislash', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Rotom', 'Rotom-Heat', 'Rotom-Wash', 'Rotom-Frost', 'Rotom-Fan', 'Rotom-Mow', 'Dugtrio',
574
+ 'Dugtrio-Alola', 'Muk', 'Muk-Oilslick', 'Slowbro', 'Slowbro-Galar', 'Slowking', 'Slowking-Galar', 'Tornadus', 'Cummulus', 'Thundurus', 'Thundurus-Therian', 'Landorus', 'Landorus-Bengal',
575
+ 'Vivillon-Fancy', 'Vivillon', 'Vivillon-Pokeball', 'Genesect', 'Genesect-Password', 'Genesect-Molten', 'Genesect-Freezer', 'Genesect-Type-Delta', 'Groudon', 'Groudon-Primal', 'Kyogre',
576
+ 'Kyogre-Primal', 'Deoxys-Wood', 'Deoxys-Gem', 'Deoxys-Tank', 'Deoxys-Speed', 'Sandslash-Lustrous', 'Sandslash-Alola', 'Ninetales-Steamwork', 'Ninetales-Alola', 'Giratina', 'Giratina-Shadow',
577
+ 'Eternatus', 'Manustorm', 'Exeggutor', 'Exeggutor-Lighthouse', 'Weezing', 'Weezing-King', 'Raticate', 'Raticate-Alola', 'Linoone', 'Linoone-Punk', 'Catastroform', 'Castform-Firestorm',
578
+ 'Castform-Thunderstorm', 'Castform-Snowy', 'Wormadam', 'Wormadam-Sandy', 'Fibormadam', 'Farfetch\u2019d', 'Farfetch\u2019d-Galar', 'Corsola', 'Corsoul', 'Shaymin', 'Shaymin-Sky', 'Keldeo',
579
+ 'Swordeo', 'Meloetta', 'Meloetta-Fighter', 'Lycanday', 'Lycanroc-Spectre', 'Lycanroc-Dusk', 'Gourgeist', 'Gourgeist-Fae', 'Gourgeist-Pulpy', 'Supergeist', 'Cramorant', 'Cramorant-Swimmer',
580
+ 'Cramorant-Gorging', 'Eiscue', 'Eiscue-Noice', 'Mimikyu', 'Mimikyu-Sparkstone', 'Morpeko-Marsh', 'Morvilant', 'Zygarde-Wyrm', 'Zygarde-Canid', 'Zygarde-Goliath',
581
+ ],
582
+ onValidateTeam(team, format) {
583
+ const speciesTable = new Set<string>();
584
+ for (const set of team) {
585
+ const species = this.dex.species.get(set.species);
586
+ if (speciesTable.has(species.id)) {
587
+ return [
588
+ `You are limited to one of each Pokémon by Species Clause (except for different formes).`,
589
+ `(You have more than one ${species.id}.)`,
590
+ ];
591
+ }
592
+ speciesTable.add(species.id);
593
+ }
594
+ },
595
+ },
596
+ {
597
+ name: "[Gen 8] Random Dex",
598
+ desc: `A micrometagame project consisting of 80 randomly selected fully-evolved Pok&eacute;mon.`,
599
+ threads: [
600
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3690182/">Random Dex</a>`,
601
+ ],
617
602
 
618
- 'Silvino-Bug-Mega', 'Silvino-Dark-Mega', 'Silvino-Dragon-Mega',
619
- 'Silvino-Electric-Mega', 'Silvino-Fairy-Mega', 'Silvino-Fighting-Mega',
620
- 'Silvino-Fire-Mega', 'Silvino-Flying-Mega', 'Silvino-Ghost-Mega',
621
- 'Silvino-Grass-Mega', 'Silvino-Ground-Mega', 'Silvino-Ice-Mega',
622
- 'Silvino-Poison-Mega', 'Silvino-Psychic-Mega', 'Silvino-Rock-Mega',
623
- 'Silvino-Steel-Mega', 'Silvino-Water-Mega', 'Silvino-Mega',
603
+ mod: 'randomdex',
604
+ ruleset: ['Standard NatDex', 'OHKO Clause', 'Evasion Moves Clause', 'Species Clause', 'Dynamax Clause', 'Sleep Clause Mod'],
605
+ banlist: ['All Pokemon', 'Past', 'Arena Trap', 'Moody', 'Shadow Tag', 'Baton Pass', 'Bright Powder', 'Lax Incense', 'King\'s Rock', 'Razor Fang', 'Kangaskhanite', 'Medichamite', 'Kommonium Z'],
606
+ unbanlist: [
607
+ 'Absol', 'Absol-Mega', 'Appletun', 'Articuno', 'Aurorus', 'Basculin', 'Beartic', 'Bisharp', 'Calyrex', 'Camerupt', 'Camerupt-Mega',
608
+ 'Celesteela', 'Cloyster', 'Crawdaunt', 'Cursola', 'Dedenne', 'Delibird', 'Eelektross', 'Espeon', 'Flapple', 'Flareon', 'Flygon',
609
+ 'Galvantula', 'Girafarig', 'Glaceon', 'Goodra', 'Gourgeist', 'Grimmsnarl', 'Guzzlord', 'Heliolisk', 'Hitmonchan', 'Hitmonlee',
610
+ 'Hitmontop', 'Incineroar', 'Indeedee', 'Jolteon', 'Kangaskhan', 'Kommo-o', 'Lanturn', 'Leafeon', 'Leavanny', 'Ludicolo', 'Lunatone',
611
+ 'Luvdisc', 'Machamp', 'Mandibuzz', 'Medicham', 'Nihilego', 'Palossand', 'Pidgeot', 'Pidgeot-Mega', 'Probopass', 'Pyroar', 'Sawk',
612
+ 'Sceptile', 'Sceptile-Mega', 'Scolipede', 'Shiftry', 'Simisage', 'Slowbro', 'Slowbro-Mega', 'Slowking', 'Swoobat', 'Sylveon',
613
+ 'Tapu Bulu', 'Tapu Fini', 'Tauros', 'Typhlosion', 'Umbreon', 'Ursaring', 'Vaporeon', 'Whiscash', 'Wishiwashi', 'Zebstrika', 'Absolite',
614
+ 'Pidgeotite', 'Sceptilite', 'Cameruptite', 'Slowbronite',
624
615
  ],
625
616
  },
626
617
  {
@@ -644,79 +635,135 @@ export const Formats: FormatList = [
644
635
  column: 2,
645
636
  },
646
637
  {
647
- name: "[Gen 8] Pokebilities",
648
- desc: `Pok&eacute;mon have all of their released abilities simultaneously.`,
638
+ name: "[Gen 8] Trademarked",
639
+ desc: `Sacrifice your Pok&eacute;mon's ability for a status move that activates on switch-in.`,
649
640
  threads: [
650
- `&bullet; <a href="https://www.smogon.com/forums/threads/3679692/">Pok&eacute;bilities</a>`,
641
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3656980/">Trademarked</a>`,
651
642
  ],
652
- mod: 'pokebilities',
643
+
644
+ mod: 'gen8',
645
+ // searchShow: false,
653
646
  ruleset: ['Standard', 'Dynamax Clause'],
654
647
  banlist: [
655
- 'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Eternatus', 'Excadrill',
656
- 'Genesect', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base',
657
- 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia',
658
- 'Pheromosa', 'Porygon-Z', 'Rayquaza', 'Reshiram', 'Solgaleo', 'Spectrier', 'Urshifu-Base', 'Xerneas', 'Yveltal', 'Zacian',
659
- 'Zacian-Crowned', 'Zamazenta-Base', 'Zekrom', 'Zygarde-Base', 'Power Construct', 'Baton Pass',
660
- // Moody users
661
- 'Glalie', 'Octillery', 'Remoraid', 'Snorunt',
662
- // Shadow Tag/Arena Trap
663
- 'Diglett-Base', 'Dugtrio-Base', 'Gothita', 'Gothitelle', 'Gothorita', 'Trapinch', 'Wobbuffet', 'Wynaut',
648
+ 'Calyrex-Ice', 'Calyrex-Shadow', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Dragapult', 'Eternatus', 'Kyurem-Black', 'Kyurem-White',
649
+ 'Giratina', 'Giratina-Origin', 'Genesect', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Lugia', 'Lunala', 'Magearna', 'Marowak-Alola',
650
+ 'Marshadow', 'Melmetal', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza',
651
+ 'Reshiram', 'Solgaleo', 'Spectrier', 'Urshifu-Base', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned',
652
+ 'Zekrom', 'Zygarde-Base', 'Arena Trap', 'Moody', 'Neutralizing Gas', 'Power Construct', 'Shadow Tag', 'Baton Pass',
664
653
  ],
665
- onBegin() {
666
- for (const pokemon of this.getAllPokemon()) {
667
- if (pokemon.ability === this.toID(pokemon.species.abilities['S'])) {
668
- continue;
654
+ restricted: [
655
+ 'Baneful Bunker', 'Block', 'Copycat', 'Corrosive Gas', 'Detect', 'Destiny Bond', 'Disable', 'Encore', 'Fairy Lock', 'Hypnosis', 'Ingrain',
656
+ 'Instruct', 'Lovely Kiss', 'King\'s Shield', 'Mat Block', 'Mean Look', 'Memento', 'move:Metronome', 'Obstruct', 'Octolock', 'Nature Power',
657
+ 'Parting Shot', 'Psycho Shift', 'Protect', 'Roar', 'Sing', 'Skill Swap', 'Sleep Powder', 'Sleep Talk', 'Spiky Shield', 'Spore', 'Substitute',
658
+ 'Teleport', 'Whirlwind', 'Wish', 'Yawn',
659
+ ],
660
+ onValidateTeam(team, format, teamHas) {
661
+ const problems = [];
662
+ for (const trademark in teamHas.trademarks) {
663
+ if (teamHas.trademarks[trademark] > 1) {
664
+ problems.push(`You are limited to 1 of each Trademark.`, `(You have ${teamHas.trademarks[trademark]} Pok\u00e9mon with ${trademark} as a Trademark.)`);
669
665
  }
670
- pokemon.m.innates = Object.keys(pokemon.species.abilities)
671
- .filter(key => key !== 'S' && (key !== 'H' || !pokemon.species.unreleasedHidden))
672
- .map(key => this.toID(pokemon.species.abilities[key as "0" | "1" | "H" | "S"]))
673
- .filter(ability => ability !== pokemon.ability);
674
666
  }
667
+ return problems;
675
668
  },
676
- onSwitchInPriority: 2,
677
- onSwitchIn(pokemon) {
678
- if (pokemon.m.innates) {
679
- for (const innate of pokemon.m.innates) {
680
- pokemon.addVolatile("ability:" + innate, pokemon);
681
- }
669
+ validateSet(set, teamHas) {
670
+ const dex = this.dex;
671
+ const ability = dex.moves.get(set.ability);
672
+ if (!ability.exists) { // Not even a real move
673
+ return this.validateSet(set, teamHas);
682
674
  }
683
- },
684
- onAfterMega(pokemon) {
685
- for (const innate of Object.keys(pokemon.volatiles).filter(i => i.startsWith('ability:'))) {
686
- pokemon.removeVolatile(innate);
675
+ // Absolute trademark bans
676
+ if (ability.category !== 'Status') {
677
+ return [`${ability.name} is not a status move, and cannot be used as a trademark.`];
687
678
  }
688
- pokemon.m.innates = undefined;
679
+ if (ability.forceSwitch || ability.selfSwitch) {
680
+ return [
681
+ `Force-switching and self-switching moves are banned from being used as trademarks.`,
682
+ `(${ability.name} is a ${ability.forceSwitch ? 'force' : 'self'}-switching move.)`,
683
+ ];
684
+ }
685
+ const irrevokablyRestricted = [
686
+ 'Assist', 'Copycat', 'Metronome', 'Mirror Move', 'Sleep Talk', // Could call another unsafe trademark
687
+ 'Skill Swap', // Self-propagates indefinitely
688
+ ];
689
+ if (irrevokablyRestricted.includes(ability.name)) {
690
+ return [`${ability.name} cannot safely function as a trademark.`];
691
+ }
692
+ // Contingent trademark bans
693
+ if (this.ruleTable.isRestricted(`move:${ability.id}`)) {
694
+ return [`${ability.name} is restricted from being used as a trademark.`];
695
+ }
696
+ if (set.moves.map(this.toID).includes(ability.id)) {
697
+ return [`${set.name} may not use ${ability.name} as both a trademark and one of its moves simultaneously.`];
698
+ }
699
+ const customRules = this.format.customRules || [];
700
+ if (!customRules.includes('!obtainableabilities')) customRules.push('!obtainableabilities');
701
+
702
+ const TeamValidator: typeof import('../sim/team-validator').TeamValidator =
703
+ require('../sim/team-validator').TeamValidator;
704
+
705
+ const validator = new TeamValidator(dex.formats.get(`${this.format.id}@@@${customRules.join(',')}`));
706
+ const moves = set.moves;
707
+ set.moves = [ability.id];
708
+ set.ability = dex.species.get(set.species).abilities['0'];
709
+ let problems = validator.validateSet(set, {}) || [];
710
+ if (problems.length) return problems;
711
+ set.moves = moves;
712
+ set.ability = dex.species.get(set.species).abilities['0'];
713
+ problems = problems.concat(validator.validateSet(set, teamHas) || []);
714
+ set.ability = ability.id;
715
+ if (!teamHas.trademarks) teamHas.trademarks = {};
716
+ teamHas.trademarks[ability.name] = (teamHas.trademarks[ability.name] || 0) + 1;
717
+ return problems.length ? problems : null;
718
+ },
719
+ pokemon: {
720
+ getAbility() {
721
+ const move = this.battle.dex.moves.get(this.battle.toID(this.ability));
722
+ if (!move.exists) return Object.getPrototypeOf(this).getAbility.call(this);
723
+ return {
724
+ id: move.id,
725
+ name: move.name,
726
+ onStart(this: Battle, pokemon: Pokemon) {
727
+ this.add('-activate', pokemon, 'ability: ' + move.name);
728
+ this.actions.useMove(move, pokemon);
729
+ },
730
+ toString() {
731
+ return "";
732
+ },
733
+ };
734
+ },
689
735
  },
690
736
  },
691
737
  {
692
- name: "[Gen 8] Camomons",
693
- desc: `Pok&eacute;mon change type to match their first two moves.`,
738
+ name: "[Gen 8] Linked",
739
+ desc: `The first two moves in a Pok&eacute;mon's moveset are used simultaneously.`,
694
740
  threads: [
695
- `&bullet; <a href="https://www.smogon.com/forums/threads/3656413/">Camomons</a>`,
741
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3660421/">Linked</a>`,
696
742
  ],
697
743
 
698
- mod: 'gen8',
699
- // searchShow: false,
700
- ruleset: ['Obtainable', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Moves Clause', 'Team Preview', 'HP Percentage Mod', 'Cancel Mod', 'Dynamax Clause', 'Sleep Clause Mod', 'Endless Battle Clause'],
744
+ mod: 'linked',
745
+ ruleset: ['Standard', 'Dynamax Clause'],
701
746
  banlist: [
702
- 'Calyrex-Ice', 'Calyrex-Shadow', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Dragonite', 'Eternatus', 'Genesect', 'Giratina', 'Giratina-Origin',
703
- 'Groudon', 'Ho-Oh', 'Hydreigon', 'Kartana', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Latias', 'Latios', 'Lugia',
704
- 'Lunala', 'Marshadow', 'Mew', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Reshiram',
705
- 'Reuniclus', 'Shedinja', 'Slowking-Galar', 'Solgaleo', 'Spectrier', 'Tornadus-Therian', 'Volcarona', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned',
706
- 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Zeraora', 'Zygarde-Base', 'Arena Trap', 'Moody', 'Power Construct', 'Shadow Tag', 'Baton Pass',
747
+ 'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Cloyster', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Eternatus', 'Genesect', 'Giratina',
748
+ 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala', 'Magearna',
749
+ 'Marshadow', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Reshiram', 'Solgaleo',
750
+ 'Spectrier', 'Urshifu-Base', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Zygarde-Base',
751
+ 'Zygarde-Complete', 'Arena Trap', 'Chlorophyll', 'Moody', 'Power Construct', 'Sand Rush', 'Sand Veil', 'Shadow Tag', 'Slush Rush', 'Snow Cloak',
752
+ 'Surge Surfer', 'Swift Swim', 'Unburden', 'Bright Powder', 'King\'s Rock', 'Lax Incense', 'Baton Pass',
707
753
  ],
708
- onModifySpeciesPriority: 2,
709
- onModifySpecies(species, target, source, effect) {
710
- if (!target) return; // Chat command
711
- if (effect && ['imposter', 'transform'].includes(effect.id)) return;
712
- const types = [...new Set(target.baseMoveSlots.slice(0, 2).map(move => this.dex.moves.get(move.id).type))];
713
- return {...species, types: types};
714
- },
715
- onSwitchIn(pokemon) {
716
- this.add('-start', pokemon, 'typechange', (pokemon.illusion || pokemon).getTypes(true).join('/'), '[silent]');
717
- },
718
- onAfterMega(pokemon) {
719
- this.add('-start', pokemon, 'typechange', (pokemon.illusion || pokemon).getTypes(true).join('/'), '[silent]');
754
+ restricted: [
755
+ 'Baneful Bunker', 'Bounce', 'Protect', 'Detect', 'Dig', 'Dive', 'Fly', 'King\'s Shield', 'Nature\'s Madness', 'Night Shade',
756
+ 'Obstruct', 'Phantom Force', 'Seismic Toss', 'Shadow Force', 'Sky Drop', 'Spiky Shield', 'Super Fang', 'Trick Room',
757
+ ],
758
+ onValidateSet(set) {
759
+ const problems = [];
760
+ for (const [i, moveid] of set.moves.entries()) {
761
+ const move = this.dex.moves.get(moveid);
762
+ if ([0, 1].includes(i) && this.ruleTable.isRestricted(`move:${move.id}`)) {
763
+ problems.push(`${set.name || set.species}'s move ${move.name} cannot be linked.`);
764
+ }
765
+ }
766
+ return problems;
720
767
  },
721
768
  },
722
769
 
@@ -764,6 +811,35 @@ export const Formats: FormatList = [
764
811
  }
765
812
  },
766
813
  },
814
+ {
815
+ name: "[Gen 8] Almost Any Ability",
816
+ desc: `Pok&eacute;mon have access to almost any ability.`,
817
+ threads: [
818
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3656414/">Almost Any Ability</a>`,
819
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3682690/">AAA Resources</a>`,
820
+ ],
821
+
822
+ mod: 'gen8',
823
+ ruleset: ['Obtainable', '!Obtainable Abilities', 'Species Clause', 'Nickname Clause', '2 Ability Clause', 'OHKO Clause', 'Evasion Moves Clause', 'Team Preview', 'HP Percentage Mod', 'Cancel Mod', 'Dynamax Clause', 'Sleep Moves Clause', 'Endless Battle Clause'],
824
+ banlist: [
825
+ 'Archeops', 'Blacephalon', 'Buzzwole', 'Calyrex-Ice', 'Calyrex-Shadow', 'Dialga', 'Dracovish', 'Dragapult', 'Dragonite', 'Eternatus', 'Gengar', 'Giratina',
826
+ 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Keldeo', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Marshadow',
827
+ 'Melmetal', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Noivern', 'Palkia', 'Pheromosa', 'Rayquaza', 'Regigigas', 'Reshiram', 'Shedinja',
828
+ 'Solgaleo', 'Spectrier', 'Urshifu-Base', 'Urshifu-Rapid-Strike', 'Victini', 'Weavile', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Base', 'Zekrom',
829
+ 'Zeraora', 'Zygarde-Base', 'Arena Trap', 'Comatose', 'Contrary', 'Fluffy', 'Fur Coat', 'Gorilla Tactics', 'Huge Power', 'Ice Scales', 'Illusion', 'Imposter',
830
+ 'Innards Out', 'Intrepid Sword', 'Libero', 'Magnet Pull', 'Moody', 'Neutralizing Gas', 'Parental Bond', 'Poison Heal', 'Protean', 'Pure Power', 'Shadow Tag',
831
+ 'Simple', 'Stakeout', 'Speed Boost', 'Water Bubble', 'Wonder Guard', 'King\'s Rock', 'Baton Pass',
832
+ ],
833
+ onValidateSet(set) {
834
+ // Temporary fix until battle-only is implemented properly
835
+ if (this.toID(set.species) === 'zamazentacrowned' && this.toID(set.ability) !== 'dauntlessshield') {
836
+ return [`Zamazenta-Crowned can only use Dauntless Shield because it is a battle-only forme.`];
837
+ }
838
+ if (this.toID(set.species) === 'zaciancrowned' && this.toID(set.ability) !== 'intrepidsword') {
839
+ return [`Zacian-Crowned can only use Intrepid Sword because it is a battle-only forme.`];
840
+ }
841
+ },
842
+ },
767
843
  {
768
844
  name: "[Gen 8] Mix and Mega",
769
845
  desc: `Mega evolve any Pok&eacute;mon with any mega stone and no limit. Boosts based on mega evolution from gen 7.`,
@@ -782,7 +858,8 @@ export const Formats: FormatList = [
782
858
  restricted: [
783
859
  'Calyrex-Ice', 'Dialga', 'Eternatus', 'Gengar', 'Giratina', 'Groudon', 'Ho-Oh', 'Kyurem-Black', 'Kyurem-White',
784
860
  'Lugia', 'Lunala', 'Marshadow', 'Melmetal', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane',
785
- 'Palkia', 'Rayquaza', 'Regigigas', 'Reshiram', 'Urshifu-Base', 'Xerneas', 'Yveltal', 'Zekrom', 'Zygarde-Complete',
861
+ 'Palkia', 'Pheromosa', 'Rayquaza', 'Regigigas', 'Reshiram', 'Urshifu', 'Urshifu-Rapid-Strike', 'Xerneas',
862
+ 'Yveltal', 'Zekrom', 'Zygarde-Complete',
786
863
  ],
787
864
  onValidateTeam(team) {
788
865
  const itemTable = new Set<ID>();
@@ -825,51 +902,24 @@ export const Formats: FormatList = [
825
902
  }
826
903
  },
827
904
  },
828
- {
829
- name: "[Gen 8] Almost Any Ability",
830
- desc: `Pok&eacute;mon have access to almost any ability.`,
831
- threads: [
832
- `&bullet; <a href="https://www.smogon.com/forums/threads/3656414/">Almost Any Ability</a>`,
833
- `&bullet; <a href="https://www.smogon.com/forums/threads/3682690/">AAA Resources</a>`,
834
- ],
835
-
836
- mod: 'gen8',
837
- ruleset: ['Obtainable', '!Obtainable Abilities', 'Species Clause', 'Nickname Clause', '2 Ability Clause', 'OHKO Clause', 'Evasion Moves Clause', 'Team Preview', 'HP Percentage Mod', 'Cancel Mod', 'Dynamax Clause', 'Sleep Moves Clause', 'Endless Battle Clause'],
838
- banlist: [
839
- 'Archeops', 'Blacephalon', 'Buzzwole', 'Calyrex-Ice', 'Calyrex-Shadow', 'Dialga', 'Dracovish', 'Dragapult', 'Dragonite', 'Eternatus', 'Gengar', 'Giratina',
840
- 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Keldeo', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Marshadow',
841
- 'Melmetal', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Noivern', 'Palkia', 'Pheromosa', 'Rayquaza', 'Regigigas', 'Reshiram', 'Shedinja',
842
- 'Solgaleo', 'Spectrier', 'Urshifu-Base', 'Urshifu-Rapid-Strike', 'Victini', 'Weavile', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Base', 'Zekrom',
843
- 'Zeraora', 'Zygarde-Base', 'Arena Trap', 'Comatose', 'Contrary', 'Fluffy', 'Fur Coat', 'Gorilla Tactics', 'Huge Power', 'Ice Scales', 'Illusion', 'Imposter',
844
- 'Innards Out', 'Intrepid Sword', 'Libero', 'Magnet Pull', 'Moody', 'Neutralizing Gas', 'Parental Bond', 'Poison Heal', 'Power Construct', 'Protean', 'Pure Power',
845
- 'Shadow Tag', 'Simple', 'Stakeout', 'Speed Boost', 'Water Bubble', 'Wonder Guard', 'King\'s Rock', 'Baton Pass',
846
- ],
847
- onValidateSet(set) {
848
- // Temporary fix until battle-only is implemented properly
849
- if (this.toID(set.species) === 'zamazentacrowned' && this.toID(set.ability) !== 'dauntlessshield') {
850
- return [`Zamazenta-Crowned can only use Dauntless Shield because it is a battle-only forme.`];
851
- }
852
- if (this.toID(set.species) === 'zaciancrowned' && this.toID(set.ability) !== 'intrepidsword') {
853
- return [`Zacian-Crowned can only use Intrepid Sword because it is a battle-only forme.`];
854
- }
855
- },
856
- },
857
905
  {
858
906
  name: "[Gen 8] STABmons",
859
907
  desc: `Pok&eacute;mon can use any move of their typing, in addition to the moves they can normally learn.`,
860
908
  threads: [
861
909
  `&bullet; <a href="https://www.smogon.com/forums/threads/3656429/">STABmons</a>`,
910
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3695169/">STABmons Resources</a>`,
862
911
  ],
863
912
 
864
913
  mod: 'gen8',
865
- ruleset: ['Standard', 'STABmons Move Legality', 'Dynamax Clause', 'Sleep Moves Clause'],
914
+ ruleset: ['Standard', 'STABmons Move Legality', 'Dynamax Clause', 'Sleep Moves Clause', '!Sleep Clause Mod'],
866
915
  banlist: [
867
- 'Aegislash', 'Calyrex-Ice', 'Calyrex-Shadow', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Dragapult', 'Dragonite', 'Eternatus', 'Genesect',
868
- 'Garchomp', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus', 'Landorus-Therian',
869
- 'Lugia', 'Lunala', 'Marshadow', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Porygon-Z',
870
- 'Rayquaza', 'Reshiram', 'Silvally', 'Solgaleo', 'Spectrier', 'Tapu Bulu', 'Tapu Koko', 'Thundurus-Base', 'Urshifu-Base', 'Xerneas', 'Yveltal',
871
- 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zapdos-Galar', 'Zekrom', 'Zygarde-Base', 'Arena Trap', 'Magnet Pull', 'Moody',
872
- 'Power Construct', 'Shadow Tag', 'King\'s Rock', 'Baton Pass',
916
+ 'Aegislash', 'Blacephalon', 'Calyrex-Ice', 'Calyrex-Shadow', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Dragapult', 'Dragonite',
917
+ 'Eternatus', 'Genesect', 'Garchomp', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem-Black',
918
+ 'Kyurem-White', 'Landorus', 'Landorus-Therian', 'Lugia', 'Lunala', 'Marshadow', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings',
919
+ 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Porygon-Z', 'Rayquaza', 'Reshiram', 'Silvally', 'Solgaleo', 'Spectrier', 'Tapu Bulu',
920
+ 'Tapu Koko', 'Thundurus-Base', 'Urshifu-Base', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned',
921
+ 'Zapdos-Galar', 'Zekrom', 'Zygarde-Base', 'Arena Trap', 'Magnet Pull', 'Moody', 'Power Construct', 'Shadow Tag', 'King\'s Rock',
922
+ 'Baton Pass',
873
923
  ],
874
924
  restricted: [
875
925
  'Acupressure', 'Astral Barrage', 'Belly Drum', 'Bolt Beak', 'Clangorous Soul', 'Double Iron Bash', 'Electrify', 'Extreme Speed', 'Fishious Rend',
@@ -903,7 +953,7 @@ export const Formats: FormatList = [
903
953
  banlist: [
904
954
  'Blissey', 'Calyrex-Shadow', 'Chansey', 'Dragapult', 'Hawlucha', 'Marowak-Alola', 'Melmetal', 'Pikachu', 'Toxapex',
905
955
  'Xerneas', 'Zacian', 'Zacian-Crowned', 'Uber > 1', 'AG ++ Uber > 1', 'Arena Trap', 'Huge Power', 'Moody', 'Pure Power',
906
- 'Shadow Tag', 'Baton Pass',
956
+ 'Shadow Tag', 'Swift Swim', 'Bright Powder', 'Focus Band', 'King\'s Rock', 'Lax Incense', 'Quick Claw', 'Baton Pass',
907
957
  ],
908
958
  onValidateTeam(team) {
909
959
  const gods = new Set<string>();
@@ -984,7 +1034,8 @@ export const Formats: FormatList = [
984
1034
  name: "[Gen 8 BDSP] OU",
985
1035
  threads: [
986
1036
  `&bullet; <a href="https://www.smogon.com/forums/threads/3693629/">BDSP OU Metagame Discussion</a>`,
987
- `&bullet; <a href="https://www.smogon.com/forums/threads/3693620/">BDSP OU Viability List</a>`,
1037
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3693721/">BDSP OU Sample Teams</a>`,
1038
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3696088/">BDSP OU Viability Rankings</a>`,
988
1039
  ],
989
1040
 
990
1041
  mod: 'gen8bdsp',
@@ -1016,10 +1067,34 @@ export const Formats: FormatList = [
1016
1067
  },
1017
1068
  {
1018
1069
  name: "[Gen 8 BDSP] RU",
1070
+ threads: [
1071
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3695563/">BDSP RU</a>`,
1072
+ ],
1019
1073
 
1020
1074
  mod: 'gen8bdsp',
1021
1075
  ruleset: ['[Gen 8 BDSP] UU'],
1022
- banlist: ['UU', 'RUBL'],
1076
+ banlist: ['UU', 'RUBL', 'Drought'],
1077
+ },
1078
+ {
1079
+ name: "[Gen 8 BDSP] NU",
1080
+ threads: [
1081
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3697080/">BDSP NU</a>`,
1082
+ ],
1083
+
1084
+ mod: 'gen8bdsp',
1085
+ searchShow: false,
1086
+ ruleset: ['[Gen 8 BDSP] RU'],
1087
+ banlist: ['RU', 'NUBL'],
1088
+ },
1089
+ {
1090
+ name: "[Gen 8 BDSP] LC",
1091
+ threads: [
1092
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3696004/">BDSP LC</a>`,
1093
+ ],
1094
+
1095
+ mod: 'gen8bdsp',
1096
+ ruleset: ['Little Cup', 'Standard'],
1097
+ banlist: ['Gligar', 'Meditite', 'Misdreavus', 'Murkrow', 'Scyther', 'Sneasel', 'Tangela', 'Vulpix', 'Yanma', 'Moody', 'Baton Pass'],
1023
1098
  },
1024
1099
  {
1025
1100
  name: "[Gen 8 BDSP] Monotype",
@@ -1089,6 +1164,37 @@ export const Formats: FormatList = [
1089
1164
  section: "Challengeable OMs",
1090
1165
  column: 2,
1091
1166
  },
1167
+ {
1168
+ name: "[Gen 8] Camomons",
1169
+ desc: `Pok&eacute;mon change type to match their first two moves.`,
1170
+ threads: [
1171
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3656413/">Camomons</a>`,
1172
+ ],
1173
+
1174
+ mod: 'gen8',
1175
+ searchShow: false,
1176
+ ruleset: ['Obtainable', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Moves Clause', 'Team Preview', 'HP Percentage Mod', 'Cancel Mod', 'Dynamax Clause', 'Sleep Clause Mod', 'Endless Battle Clause'],
1177
+ banlist: [
1178
+ 'Calyrex-Ice', 'Calyrex-Shadow', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Dragonite', 'Eternatus', 'Genesect', 'Giratina', 'Giratina-Origin',
1179
+ 'Groudon', 'Ho-Oh', 'Hydreigon', 'Kartana', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Latias', 'Latios', 'Lugia',
1180
+ 'Lunala', 'Marshadow', 'Mew', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Reshiram',
1181
+ 'Reuniclus', 'Shedinja', 'Slowking-Galar', 'Solgaleo', 'Spectrier', 'Tornadus-Therian', 'Volcarona', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned',
1182
+ 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Zeraora', 'Zygarde-Base', 'Arena Trap', 'Moody', 'Power Construct', 'Shadow Tag', 'Baton Pass',
1183
+ ],
1184
+ onModifySpeciesPriority: 2,
1185
+ onModifySpecies(species, target, source, effect) {
1186
+ if (!target) return; // Chat command
1187
+ if (effect && ['imposter', 'transform'].includes(effect.id)) return;
1188
+ const types = [...new Set(target.baseMoveSlots.slice(0, 2).map(move => this.dex.moves.get(move.id).type))];
1189
+ return {...species, types: types};
1190
+ },
1191
+ onSwitchIn(pokemon) {
1192
+ this.add('-start', pokemon, 'typechange', (pokemon.illusion || pokemon).getTypes(true).join('/'), '[silent]');
1193
+ },
1194
+ onAfterMega(pokemon) {
1195
+ this.add('-start', pokemon, 'typechange', (pokemon.illusion || pokemon).getTypes(true).join('/'), '[silent]');
1196
+ },
1197
+ },
1092
1198
  {
1093
1199
  name: "[Gen 8] Inheritance",
1094
1200
  desc: `Pok&eacute;mon may use the ability and moves of another, as long as they forfeit their own learnset.`,
@@ -1500,20 +1606,67 @@ export const Formats: FormatList = [
1500
1606
  const stat = baseStats['hp'];
1501
1607
  modStats['hp'] = tr(tr(2 * stat + set.ivs['hp'] + tr(set.evs['hp'] / 4) + 100) * set.level / 100 + 10);
1502
1608
  }
1503
- return this.natureModify(modStats as StatsTable, set);
1504
- },
1505
- natureModify(stats, set) {
1506
- const tr = this.trunc;
1507
- const nature = this.dex.natures.get(set.nature);
1508
- let s: StatIDExceptHP;
1509
- if (nature.plus) {
1510
- s = nature.minus!;
1511
- const stat = this.ruleTable.has('overflowstatmod') ? Math.min(stats[s], 595) : stats[s];
1512
- stats[s] = this.ruleTable.has('overflowstatmod') ? Math.min(stats[nature.plus], 728) : stats[nature.plus];
1513
- stats[nature.plus] = tr(tr(stat * 110, 16) / 100);
1609
+ return this.natureModify(modStats as StatsTable, set);
1610
+ },
1611
+ natureModify(stats, set) {
1612
+ const tr = this.trunc;
1613
+ const nature = this.dex.natures.get(set.nature);
1614
+ let s: StatIDExceptHP;
1615
+ if (nature.plus) {
1616
+ s = nature.minus!;
1617
+ const stat = this.ruleTable.has('overflowstatmod') ? Math.min(stats[s], 595) : stats[s];
1618
+ stats[s] = this.ruleTable.has('overflowstatmod') ? Math.min(stats[nature.plus], 728) : stats[nature.plus];
1619
+ stats[nature.plus] = tr(tr(stat * 110, 16) / 100);
1620
+ }
1621
+ return stats;
1622
+ },
1623
+ },
1624
+ },
1625
+ {
1626
+ name: "[Gen 8] Pokebilities",
1627
+ desc: `Pok&eacute;mon have all of their released abilities simultaneously.`,
1628
+ threads: [
1629
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3679692/">Pok&eacute;bilities</a>`,
1630
+ ],
1631
+ mod: 'pokebilities',
1632
+ searchShow: false,
1633
+ ruleset: ['Standard', 'Dynamax Clause'],
1634
+ banlist: [
1635
+ 'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Conkeldurr', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Dracozolt',
1636
+ 'Eternatus', 'Excadrill', 'Genesect', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kyogre', 'Kyurem-Black',
1637
+ 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings',
1638
+ 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Porygon-Z', 'Rayquaza', 'Reshiram', 'Solgaleo', 'Spectrier', 'Urshifu-Base',
1639
+ 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Base', 'Zekrom', 'Zygarde-Base', 'Power Construct',
1640
+ 'Baton Pass', 'King\'s Rock',
1641
+ // Moody users
1642
+ 'Glalie', 'Octillery', 'Remoraid', 'Snorunt',
1643
+ // Shadow Tag/Arena Trap
1644
+ 'Diglett-Base', 'Dugtrio-Base', 'Gothita', 'Gothitelle', 'Gothorita', 'Trapinch', 'Wobbuffet', 'Wynaut',
1645
+ ],
1646
+ onBegin() {
1647
+ for (const pokemon of this.getAllPokemon()) {
1648
+ if (pokemon.ability === this.toID(pokemon.species.abilities['S'])) {
1649
+ continue;
1650
+ }
1651
+ pokemon.m.innates = Object.keys(pokemon.species.abilities)
1652
+ .filter(key => key !== 'S' && (key !== 'H' || !pokemon.species.unreleasedHidden))
1653
+ .map(key => this.toID(pokemon.species.abilities[key as "0" | "1" | "H" | "S"]))
1654
+ .filter(ability => ability !== pokemon.ability);
1655
+ }
1656
+ },
1657
+ onSwitchInPriority: 2,
1658
+ onSwitchIn(pokemon) {
1659
+ if (pokemon.m.innates) {
1660
+ for (const innate of pokemon.m.innates) {
1661
+ pokemon.addVolatile("ability:" + innate, pokemon);
1514
1662
  }
1515
- return stats;
1516
- },
1663
+ }
1664
+ },
1665
+ onAfterMega(pokemon) {
1666
+ for (const innate of Object.keys(pokemon.volatiles).filter(i => i.startsWith('ability:'))) {
1667
+ pokemon.removeVolatile(innate);
1668
+ }
1669
+ pokemon.m.innates = undefined;
1517
1670
  },
1518
1671
  },
1519
1672
  {
@@ -1712,106 +1865,6 @@ export const Formats: FormatList = [
1712
1865
  },
1713
1866
  },
1714
1867
  },
1715
- {
1716
- name: "[Gen 8] Trademarked",
1717
- desc: `Sacrifice your Pok&eacute;mon's ability for a status move that activates on switch-in.`,
1718
- threads: [
1719
- `&bullet; <a href="https://www.smogon.com/forums/threads/3656980/">Trademarked</a>`,
1720
- ],
1721
-
1722
- mod: 'gen8',
1723
- searchShow: false,
1724
- ruleset: ['Standard', 'Dynamax Clause'],
1725
- banlist: [
1726
- 'Calyrex-Ice', 'Calyrex-Shadow', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Dragapult', 'Eternatus', 'Kyurem-Black', 'Kyurem-White',
1727
- 'Giratina', 'Giratina-Origin', 'Genesect', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Lugia', 'Lunala', 'Magearna', 'Marshadow',
1728
- 'Melmetal', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Reshiram',
1729
- 'Solgaleo', 'Urshifu-Base', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Zygarde-Base',
1730
- 'Arena Trap', 'Moody', 'Power Construct', 'Shadow Tag', 'Baton Pass',
1731
- ],
1732
- restricted: [
1733
- 'Baneful Bunker', 'Block', 'Copycat', 'Corrosive Gas', 'Detect', 'Destiny Bond', 'Disable', 'Encore', 'Fairy Lock', 'Hypnosis', 'Ingrain',
1734
- 'Instruct', 'Lovely Kiss', 'King\'s Shield', 'Mat Block', 'Mean Look', 'move:Metronome', 'Obstruct', 'Octolock', 'Nature Power', 'Parting Shot',
1735
- 'Psycho Shift', 'Protect', 'Roar', 'Sing', 'Skill Swap', 'Sleep Powder', 'Sleep Talk', 'Spiky Shield', 'Spore', 'Substitute', 'Teleport',
1736
- 'Whirlwind', 'Wish', 'Yawn',
1737
- ],
1738
- onValidateTeam(team, format, teamHas) {
1739
- const problems = [];
1740
- for (const trademark in teamHas.trademarks) {
1741
- if (teamHas.trademarks[trademark] > 1) {
1742
- problems.push(`You are limited to 1 of each Trademark.`, `(You have ${teamHas.trademarks[trademark]} Pok\u00e9mon with ${trademark} as a Trademark.)`);
1743
- }
1744
- }
1745
- return problems;
1746
- },
1747
- validateSet(set, teamHas) {
1748
- const dex = this.dex;
1749
- const ability = dex.moves.get(set.ability);
1750
- if (!ability.exists) { // Not even a real move
1751
- return this.validateSet(set, teamHas);
1752
- }
1753
- // Absolute trademark bans
1754
- if (ability.category !== 'Status') {
1755
- return [`${ability.name} is not a status move, and cannot be used as a trademark.`];
1756
- }
1757
- if (ability.forceSwitch || ability.selfSwitch) {
1758
- return [
1759
- `Force-switching and self-switching moves are banned from being used as trademarks.`,
1760
- `(${ability.name} is a ${ability.forceSwitch ? 'force' : 'self'}-switching move.)`,
1761
- ];
1762
- }
1763
- const irrevokablyRestricted = [
1764
- 'Assist', 'Copycat', 'Metronome', 'Mirror Move', 'Sleep Talk', // Could call another unsafe trademark
1765
- 'Skill Swap', // Self-propagates indefinitely
1766
- ];
1767
- if (irrevokablyRestricted.includes(ability.name)) {
1768
- return [`${ability.name} cannot safely function as a trademark.`];
1769
- }
1770
- // Contingent trademark bans
1771
- if (this.ruleTable.isRestricted(`move:${ability.id}`)) {
1772
- return [`${ability.name} is restricted from being used as a trademark.`];
1773
- }
1774
- if (set.moves.map(this.toID).includes(ability.id)) {
1775
- return [`${set.name} may not use ${ability.name} as both a trademark and one of its moves simultaneously.`];
1776
- }
1777
- const customRules = this.format.customRules || [];
1778
- if (!customRules.includes('!obtainableabilities')) customRules.push('!obtainableabilities');
1779
-
1780
- const TeamValidator: typeof import('../sim/team-validator').TeamValidator =
1781
- require('../sim/team-validator').TeamValidator;
1782
-
1783
- const validator = new TeamValidator(dex.formats.get(`${this.format.id}@@@${customRules.join(',')}`));
1784
- const moves = set.moves;
1785
- set.moves = [ability.id];
1786
- set.ability = dex.species.get(set.species).abilities['0'];
1787
- let problems = validator.validateSet(set, {}) || [];
1788
- if (problems.length) return problems;
1789
- set.moves = moves;
1790
- set.ability = dex.species.get(set.species).abilities['0'];
1791
- problems = problems.concat(validator.validateSet(set, teamHas) || []);
1792
- set.ability = ability.id;
1793
- if (!teamHas.trademarks) teamHas.trademarks = {};
1794
- teamHas.trademarks[ability.name] = (teamHas.trademarks[ability.name] || 0) + 1;
1795
- return problems.length ? problems : null;
1796
- },
1797
- pokemon: {
1798
- getAbility() {
1799
- const move = this.battle.dex.moves.get(this.battle.toID(this.ability));
1800
- if (!move.exists) return Object.getPrototypeOf(this).getAbility.call(this);
1801
- return {
1802
- id: move.id,
1803
- name: move.name,
1804
- onStart(this: Battle, pokemon: Pokemon) {
1805
- this.add('-activate', pokemon, 'ability: ' + move.name);
1806
- this.actions.useMove(move, pokemon);
1807
- },
1808
- toString() {
1809
- return "";
1810
- },
1811
- };
1812
- },
1813
- },
1814
- },
1815
1868
 
1816
1869
  // Randomized Metas
1817
1870
  ///////////////////////////////////////////////////////////////////
@@ -1926,7 +1979,8 @@ export const Formats: FormatList = [
1926
1979
 
1927
1980
  mod: 'gen8',
1928
1981
  team: 'randomHC',
1929
- ruleset: ['Obtainable Formes', 'HP Percentage Mod', 'Cancel Mod'],
1982
+ ruleset: ['HP Percentage Mod', 'Cancel Mod'],
1983
+ banlist: ['Nonexistent'],
1930
1984
  },
1931
1985
  {
1932
1986
  name: "[Gen 8] Doubles Hackmons Cup",
@@ -1935,7 +1989,8 @@ export const Formats: FormatList = [
1935
1989
  gameType: 'doubles',
1936
1990
  team: 'randomHC',
1937
1991
  searchShow: false,
1938
- ruleset: ['Obtainable', 'HP Percentage Mod', 'Cancel Mod'],
1992
+ ruleset: ['HP Percentage Mod', 'Cancel Mod'],
1993
+ banlist: ['Nonexistent'],
1939
1994
  },
1940
1995
  {
1941
1996
  name: "[Gen 8] CAP 1v1",
@@ -2011,6 +2066,7 @@ export const Formats: FormatList = [
2011
2066
  team: 'randomHC',
2012
2067
  searchShow: false,
2013
2068
  ruleset: ['HP Percentage Mod', 'Cancel Mod'],
2069
+ banlist: ['Nonexistent'],
2014
2070
  },
2015
2071
  {
2016
2072
  name: "[Gen 7 Let's Go] Random Battle",
@@ -2087,6 +2143,7 @@ export const Formats: FormatList = [
2087
2143
  team: 'randomHC',
2088
2144
  searchShow: false,
2089
2145
  ruleset: ['HP Percentage Mod', 'Cancel Mod', 'Desync Clause Mod', 'Sleep Clause Mod', 'Freeze Clause Mod', 'Team Type Preview'],
2146
+ banlist: ['Nonexistent'],
2090
2147
  onModifySpecies(species, target, source, effect) {
2091
2148
  if (!target) return;
2092
2149
  return {...species, ...(target.set as any).hc};
@@ -2108,40 +2165,39 @@ export const Formats: FormatList = [
2108
2165
  column: 3,
2109
2166
  },
2110
2167
  {
2111
- name: "[Gen 2] UU",
2112
- threads: [`&bullet; <a href="https://www.smogon.com/forums/threads/3576710/">GSC UU</a>`],
2168
+ name: "[Gen 3] UU",
2169
+ threads: [
2170
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3585923/">ADV UU Metagame Discussion</a>`,
2171
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3548578/">ADV UU Viability Rankings</a>`,
2172
+ ],
2113
2173
 
2114
- mod: 'gen2',
2174
+ mod: 'gen3',
2115
2175
  // searchShow: false,
2116
- ruleset: ['[Gen 2] OU'],
2117
- banlist: ['OU', 'UUBL'],
2176
+ ruleset: ['Standard', 'NFE Clause'],
2177
+ banlist: ['Uber', 'OU', 'UUBL', 'Smeargle + Ingrain', 'Baton Pass'],
2178
+ unbanlist: ['Scyther', 'Sand Veil'],
2118
2179
  },
2119
2180
  {
2120
- name: "[Gen 5] NU",
2181
+ name: "[Gen 1] NU",
2121
2182
  threads: [
2122
- `&bullet; <a href="https://www.smogon.com/forums/posts/6431094/">BW2 Sample Teams</a>`,
2123
- `&bullet; <a href="https://www.smogon.com/forums/threads/3484121/">BW2 NU Viability Rankings</a>`,
2183
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3668913/">RBY NU Viability Rankings</a>`,
2124
2184
  ],
2125
2185
 
2126
- mod: 'gen5',
2186
+ mod: 'gen1',
2127
2187
  // searchShow: false,
2128
- ruleset: ['[Gen 5] RU', '!Sleep Moves Clause', 'Sleep Clause Mod'],
2129
- banlist: ['RU', 'NUBL', 'Assist', 'Copycat'],
2188
+ ruleset: ['[Gen 1] UU'],
2189
+ banlist: ['UU', 'NUBL'],
2130
2190
  },
2131
2191
  {
2132
- name: "[Gen 5] LC",
2192
+ name: "[Gen 4] Ubers",
2133
2193
  threads: [
2134
- `&bullet; <a href="https://www.smogon.com/forums/posts/6431094/">BW2 Sample Teams</a>`,
2135
- `&bullet; <a href="https://www.smogon.com/forums/threads/3485860/">BW2 LC Viability Rankings</a>`,
2194
+ `&bullet; <a href="https://www.smogon.com/forums/posts/8286279/">DPP Ubers</a>`,
2136
2195
  ],
2137
2196
 
2138
- mod: 'gen5',
2197
+ mod: 'gen4',
2139
2198
  // searchShow: false,
2140
- ruleset: ['Standard', 'Little Cup', 'Sleep Moves Clause'],
2141
- banlist: [
2142
- 'Gligar', 'Meditite', 'Misdreavus', 'Murkrow', 'Scraggy', 'Scyther', 'Sneasel', 'Tangela', 'Vulpix', 'Yanma',
2143
- 'Sand Rush', 'Sand Veil', 'Berry Juice', 'Soul Dew', 'Baton Pass', 'Dragon Rage', 'Sonic Boom', 'Swagger',
2144
- ],
2199
+ ruleset: ['Standard'],
2200
+ banlist: ['AG'],
2145
2201
  },
2146
2202
 
2147
2203
  // Past Gens OU
@@ -2183,8 +2239,8 @@ export const Formats: FormatList = [
2183
2239
  ],
2184
2240
 
2185
2241
  mod: 'gen5',
2186
- ruleset: ['Standard', 'Evasion Abilities Clause', 'Baton Pass Clause', 'Sleep Moves Clause', 'Swagger Clause'],
2187
- banlist: ['Uber', 'Arena Trap', 'Drizzle ++ Swift Swim', 'Drought ++ Chlorophyll', 'Sand Rush', 'Shadow Tag', 'King\'s Rock', 'Razor Fang', 'Soul Dew', 'Assist'],
2242
+ ruleset: ['Standard', 'Evasion Abilities Clause', 'Sleep Moves Clause', 'Swagger Clause'],
2243
+ banlist: ['Uber', 'Arena Trap', 'Drizzle ++ Swift Swim', 'Drought ++ Chlorophyll', 'Sand Rush', 'Shadow Tag', 'King\'s Rock', 'Razor Fang', 'Soul Dew', 'Assist', 'Baton Pass'],
2188
2244
  },
2189
2245
  {
2190
2246
  name: "[Gen 4] OU",
@@ -2196,7 +2252,7 @@ export const Formats: FormatList = [
2196
2252
 
2197
2253
  mod: 'gen4',
2198
2254
  ruleset: ['Standard'],
2199
- banlist: ['AG', 'Uber', 'Arena Trap', 'Sand Veil', 'Swinub + Snow Cloak', 'Piloswine + Snow Cloak', 'Mamoswine + Snow Cloak', 'Soul Dew', 'Baton Pass'],
2255
+ banlist: ['AG', 'Uber', 'Arena Trap', 'Sand Veil', 'Swinub + Snow Cloak', 'Piloswine + Snow Cloak', 'Mamoswine + Snow Cloak', 'Soul Dew', 'Baton Pass', 'Swagger'],
2200
2256
  },
2201
2257
  {
2202
2258
  name: "[Gen 3] OU",
@@ -2207,7 +2263,7 @@ export const Formats: FormatList = [
2207
2263
 
2208
2264
  mod: 'gen3',
2209
2265
  ruleset: ['Standard', 'One Boost Passer Clause'],
2210
- banlist: ['Uber', 'Sand Veil', 'Assist', 'Smeargle + Ingrain'],
2266
+ banlist: ['Uber', 'Sand Veil', 'Assist', 'Baton Pass + Mean Look', 'Baton Pass + Spider Web', 'Smeargle + Ingrain'],
2211
2267
  },
2212
2268
  {
2213
2269
  name: "[Gen 2] OU",
@@ -2357,6 +2413,16 @@ export const Formats: FormatList = [
2357
2413
  mod: 'gen6',
2358
2414
  ruleset: ['-Nonexistent', 'Team Preview', 'HP Percentage Mod', 'Cancel Mod', 'Endless Battle Clause', 'EV limit = 510'],
2359
2415
  },
2416
+ {
2417
+ name: "[Gen 5] ZU",
2418
+ threads: [
2419
+ `&bullet; <a href="https://www.smogon.com/forums/posts/8034680/">BW2 ZU</a>`,
2420
+ ],
2421
+
2422
+ mod: 'gen5',
2423
+ ruleset: ['[Gen 5] PU'],
2424
+ banlist: ['PU', 'Dragonair', 'Glalie', 'Machoke', 'Marowak', 'Omanyte', 'Regigigas', 'Trubbish', 'Whirlipede', 'Baton Pass'],
2425
+ },
2360
2426
 
2361
2427
  // US/UM Singles
2362
2428
  ///////////////////////////////////////////////////////////////////
@@ -2992,6 +3058,18 @@ export const Formats: FormatList = [
2992
3058
  banlist: ['UU', 'RUBL', 'Shadow Tag', 'Shell Smash + Baton Pass'],
2993
3059
  unbanlist: ['Prankster + Assist', 'Prankster + Copycat', 'Baton Pass'],
2994
3060
  },
3061
+ {
3062
+ name: "[Gen 5] NU",
3063
+ threads: [
3064
+ `&bullet; <a href="https://www.smogon.com/forums/posts/6431094/">BW2 Sample Teams</a>`,
3065
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3484121/">BW2 NU Viability Rankings</a>`,
3066
+ ],
3067
+
3068
+ mod: 'gen5',
3069
+ searchShow: false,
3070
+ ruleset: ['[Gen 5] RU', '!Sleep Moves Clause', 'Sleep Clause Mod'],
3071
+ banlist: ['RU', 'NUBL', 'Assist', 'Copycat'],
3072
+ },
2995
3073
  {
2996
3074
  name: "[Gen 5] PU",
2997
3075
  threads: [
@@ -3001,7 +3079,22 @@ export const Formats: FormatList = [
3001
3079
  mod: 'gen5',
3002
3080
  searchShow: false,
3003
3081
  ruleset: ['[Gen 5] NU', 'Sleep Moves Clause'],
3004
- banlist: ['NU', 'Combusken', 'Gothorita', 'Linoone', 'Riolu', 'Rotom-Frost', 'Simipour', 'Throh', 'Vigoroth'],
3082
+ banlist: ['NU', 'PUBL'],
3083
+ },
3084
+ {
3085
+ name: "[Gen 5] LC",
3086
+ threads: [
3087
+ `&bullet; <a href="https://www.smogon.com/forums/posts/6431094/">BW2 Sample Teams</a>`,
3088
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3485860/">BW2 LC Viability Rankings</a>`,
3089
+ ],
3090
+
3091
+ mod: 'gen5',
3092
+ searchShow: false,
3093
+ ruleset: ['Standard', 'Little Cup', 'Sleep Moves Clause'],
3094
+ banlist: [
3095
+ 'Gligar', 'Meditite', 'Misdreavus', 'Murkrow', 'Scraggy', 'Scyther', 'Sneasel', 'Tangela', 'Vulpix', 'Yanma',
3096
+ 'Sand Rush', 'Sand Veil', 'Berry Juice', 'Soul Dew', 'Baton Pass', 'Dragon Rage', 'Sonic Boom', 'Swagger',
3097
+ ],
3005
3098
  },
3006
3099
  {
3007
3100
  name: "[Gen 5] Monotype",
@@ -3127,17 +3220,6 @@ export const Formats: FormatList = [
3127
3220
  section: "DPP Singles",
3128
3221
  column: 5,
3129
3222
  },
3130
- {
3131
- name: "[Gen 4] Ubers",
3132
- threads: [
3133
- `&bullet; <a href="https://www.smogon.com/forums/posts/8286279/">DPP Ubers</a>`,
3134
- ],
3135
-
3136
- mod: 'gen4',
3137
- searchShow: false,
3138
- ruleset: ['Standard'],
3139
- banlist: ['AG'],
3140
- },
3141
3223
  {
3142
3224
  name: "[Gen 4] UU",
3143
3225
  threads: [
@@ -3149,7 +3231,7 @@ export const Formats: FormatList = [
3149
3231
  searchShow: false,
3150
3232
  ruleset: ['[Gen 4] OU'],
3151
3233
  banlist: ['OU', 'UUBL'],
3152
- unbanlist: ['Arena Trap'],
3234
+ unbanlist: ['Arena Trap', 'Swagger'],
3153
3235
  },
3154
3236
  {
3155
3237
  name: "[Gen 4] NU",
@@ -3210,7 +3292,7 @@ export const Formats: FormatList = [
3210
3292
  '[Gen 4] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview',
3211
3293
  ],
3212
3294
  banlist: ['Latias', 'Machamp', 'Porygon-Z', 'Shaymin', 'Snorlax', 'Togekiss', 'Focus Sash', 'Destiny Bond', 'Explosion', 'Perish Song', 'Self-Destruct'],
3213
- unbanlist: ['Wobbuffet', 'Wynaut', 'Sand Veil'],
3295
+ unbanlist: ['Wobbuffet', 'Wynaut', 'Sand Veil', 'Swagger'],
3214
3296
  },
3215
3297
  {
3216
3298
  name: "[Gen 4] Anything Goes",
@@ -3246,7 +3328,7 @@ export const Formats: FormatList = [
3246
3328
  searchShow: false,
3247
3329
  ruleset: ['[Gen 4] OU'],
3248
3330
  banlist: ['Explosion'],
3249
- unbanlist: ['Garchomp', 'Latias', 'Latios', 'Manaphy', 'Mew', 'Salamence', 'Wobbuffet', 'Wynaut'],
3331
+ unbanlist: ['Garchomp', 'Latias', 'Latios', 'Manaphy', 'Mew', 'Salamence', 'Wobbuffet', 'Wynaut', 'Swagger'],
3250
3332
  },
3251
3333
  {
3252
3334
  name: "[Gen 4] VGC 2010",
@@ -3294,22 +3376,9 @@ export const Formats: FormatList = [
3294
3376
 
3295
3377
  mod: 'gen3',
3296
3378
  searchShow: false,
3297
- ruleset: ['Standard', 'Deoxys Camouflage Clause'],
3379
+ ruleset: ['Standard', 'Deoxys Camouflage Clause', 'One Baton Pass Clause'],
3298
3380
  banlist: ['Wobbuffet + Leftovers'],
3299
3381
  },
3300
- {
3301
- name: "[Gen 3] UU",
3302
- threads: [
3303
- `&bullet; <a href="https://www.smogon.com/forums/threads/3585923/">ADV UU Metagame Discussion</a>`,
3304
- `&bullet; <a href="https://www.smogon.com/forums/threads/3548578/">ADV UU Viability Rankings</a>`,
3305
- ],
3306
-
3307
- mod: 'gen3',
3308
- searchShow: false,
3309
- ruleset: ['Standard', 'NFE Clause'],
3310
- banlist: ['Uber', 'OU', 'UUBL', 'Smeargle + Ingrain', 'Baton Pass'],
3311
- unbanlist: ['Scyther', 'Sand Veil'],
3312
- },
3313
3382
  {
3314
3383
  name: "[Gen 3] NU",
3315
3384
  threads: [
@@ -3379,6 +3448,15 @@ export const Formats: FormatList = [
3379
3448
  searchShow: false,
3380
3449
  ruleset: ['Standard'],
3381
3450
  },
3451
+ {
3452
+ name: "[Gen 2] UU",
3453
+ threads: [`&bullet; <a href="https://www.smogon.com/forums/threads/3576710/">GSC UU</a>`],
3454
+
3455
+ mod: 'gen2',
3456
+ searchShow: false,
3457
+ ruleset: ['[Gen 2] OU'],
3458
+ banlist: ['OU', 'UUBL'],
3459
+ },
3382
3460
  {
3383
3461
  name: "[Gen 2] NU",
3384
3462
  threads: [`&bullet; <a href="https://www.smogon.com/forums/threads/3642565/">GSC NU</a>`],
@@ -3398,7 +3476,10 @@ export const Formats: FormatList = [
3398
3476
  'Picked Team Size = 1', 'Max Team Size = 3',
3399
3477
  '[Gen 2] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview',
3400
3478
  ],
3401
- banlist: ['Clefable', 'Snorlax', 'Zapdos', 'Berserk Gene', 'Bright Powder', 'Focus Band', 'King\'s Rock', 'Quick Claw', 'Destiny Bond', 'Explosion', 'Perish Song', 'Present', 'Self-Destruct'],
3479
+ banlist: [
3480
+ 'Clefable', 'Snorlax', 'Zapdos', 'Berserk Gene', 'Bright Powder', 'Focus Band', 'King\'s Rock', 'Quick Claw',
3481
+ 'Attract', 'Destiny Bond', 'Explosion', 'Perish Song', 'Present', 'Self-Destruct', 'Swagger',
3482
+ ],
3402
3483
  },
3403
3484
  {
3404
3485
  name: "[Gen 2] Nintendo Cup 2000",
@@ -3457,17 +3538,6 @@ export const Formats: FormatList = [
3457
3538
  ruleset: ['[Gen 1] OU'],
3458
3539
  banlist: ['OU', 'UUBL'],
3459
3540
  },
3460
- {
3461
- name: "[Gen 1] NU",
3462
- threads: [
3463
- `&bullet; <a href="https://www.smogon.com/forums/threads/3668913/">RBY NU Viability Rankings</a>`,
3464
- ],
3465
-
3466
- mod: 'gen1',
3467
- searchShow: false,
3468
- ruleset: ['[Gen 1] UU'],
3469
- banlist: ['UU', 'NUBL'],
3470
- },
3471
3541
  {
3472
3542
  name: "[Gen 1] Japanese OU",
3473
3543
  desc: `Generation 1 with Japanese battle mechanics.`,