@pkmn/sim 0.5.5 → 0.5.8

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 (71) hide show
  1. package/build/config/formats.js +325 -254
  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 +130 -17
  6. package/build/data/formats-data.js.map +1 -1
  7. package/build/data/items.js +2 -2
  8. package/build/data/items.js.map +1 -1
  9. package/build/data/learnsets.js +6 -5
  10. package/build/data/learnsets.js.map +1 -1
  11. package/build/data/mods/gen2/moves.js +13 -1
  12. package/build/data/mods/gen2/moves.js.map +1 -1
  13. package/build/data/mods/gen3/formats-data.js +3 -3
  14. package/build/data/mods/gen3/formats-data.js.map +1 -1
  15. package/build/data/mods/gen4/formats-data.js +4 -4
  16. package/build/data/mods/gen4/formats-data.js.map +1 -1
  17. package/build/data/mods/gen4/moves.js +7 -5
  18. package/build/data/mods/gen4/moves.js.map +1 -1
  19. package/build/data/mods/gen5/formats-data.js +1 -1
  20. package/build/data/mods/gen5/formats-data.js.map +1 -1
  21. package/build/data/mods/gen5/moves.js +6 -4
  22. package/build/data/mods/gen5/moves.js.map +1 -1
  23. package/build/data/mods/gen6/formats-data.js +3 -2
  24. package/build/data/mods/gen6/formats-data.js.map +1 -1
  25. package/build/data/mods/gen6/items.js +2 -2
  26. package/build/data/mods/gen6/items.js.map +1 -1
  27. package/build/data/mods/gen7/formats-data.js +2 -1
  28. package/build/data/mods/gen7/formats-data.js.map +1 -1
  29. package/build/data/mods/gen7/moves.js +3 -3
  30. package/build/data/mods/gen7/moves.js.map +1 -1
  31. package/build/data/mods/gen7/pokedex.js +4 -0
  32. package/build/data/mods/gen7/pokedex.js.map +1 -1
  33. package/build/data/moves.js +6 -5
  34. package/build/data/moves.js.map +1 -1
  35. package/build/data/pokedex.js +480 -11
  36. package/build/data/pokedex.js.map +1 -1
  37. package/build/data/rulesets.js +26 -1
  38. package/build/data/rulesets.js.map +1 -1
  39. package/build/sim/battle.js +23 -22
  40. package/build/sim/battle.js.map +1 -1
  41. package/build/sim/dex-species.js +5 -2
  42. package/build/sim/dex-species.js.map +1 -1
  43. package/build/sim/exported-global-types.d.ts +1 -0
  44. package/build/sim/global-types.d.ts +1 -0
  45. package/build/sim/team-validator.js +11 -0
  46. package/build/sim/team-validator.js.map +1 -1
  47. package/config/formats.ts +327 -257
  48. package/data/aliases.ts +4 -4
  49. package/data/formats-data.ts +130 -17
  50. package/data/items.ts +2 -2
  51. package/data/learnsets.ts +6 -5
  52. package/data/mods/gen2/moves.ts +13 -1
  53. package/data/mods/gen3/formats-data.ts +3 -3
  54. package/data/mods/gen4/formats-data.ts +4 -4
  55. package/data/mods/gen4/moves.ts +6 -4
  56. package/data/mods/gen5/formats-data.ts +1 -1
  57. package/data/mods/gen5/moves.ts +6 -4
  58. package/data/mods/gen6/formats-data.ts +3 -2
  59. package/data/mods/gen6/items.ts +2 -2
  60. package/data/mods/gen7/formats-data.ts +2 -1
  61. package/data/mods/gen7/moves.ts +3 -3
  62. package/data/mods/gen7/pokedex.ts +4 -0
  63. package/data/moves.ts +6 -5
  64. package/data/pokedex.ts +480 -11
  65. package/data/rulesets.ts +23 -1
  66. package/package.json +2 -2
  67. package/sim/battle.ts +24 -23
  68. package/sim/dex-species.ts +5 -2
  69. package/sim/exported-global-types.ts +1 -0
  70. package/sim/global-types.ts +1 -0
  71. package/sim/team-validator.ts +13 -0
package/config/formats.ts CHANGED
@@ -285,14 +285,6 @@ 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'],
289
- restricted: ['Restricted Legendary'],
290
- },
291
- {
292
- name: "[Gen 8] Battle Stadium Singles Series 12",
293
-
294
- mod: 'gen8',
295
- searchShow: false,
296
288
  ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 8', 'Limit Two Restricted'],
297
289
  restricted: ['Restricted Legendary'],
298
290
  },
@@ -370,27 +362,19 @@ export const Formats: FormatList = [
370
362
  },
371
363
  {
372
364
  name: "[Gen 8] VGC 2022",
373
-
374
- mod: 'gen8',
375
- gameType: 'doubles',
376
- ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 8', 'VGC Timer', 'Limit Two Restricted'],
377
- restricted: ['Restricted Legendary'],
378
- },
379
- {
380
- name: "[Gen 8] VGC 2021 Series 11",
381
365
  threads: [
382
- `&bullet; <a href="https://www.smogon.com/forums/threads/3677186/">VGC 2021 Series 11 Metagame Discussion</a>`,
383
- `&bullet; <a href="https://www.smogon.com/forums/threads/3693427/">VGC 2021 Series 11 Sample Teams</a>`,
384
- `&bullet; <a href="https://www.smogon.com/forums/threads/3693284/">VGC 2021 Series 11 Viability Rankings</a>`,
366
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3677186/">VGC 2022 Metagame Discussion</a>`,
367
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3695848/">VGC 2022 Sample Teams</a>`,
368
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3696395/">VGC 2022 Viability Rankings</a>`,
385
369
  ],
386
370
 
387
371
  mod: 'gen8',
388
372
  gameType: 'doubles',
389
- ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 8', 'VGC Timer', 'Limit One Restricted'],
373
+ ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 8', 'VGC Timer', 'Limit Two Restricted'],
390
374
  restricted: ['Restricted Legendary'],
391
375
  },
392
376
  {
393
- name: "[Gen 8] VGC 2021 Series 9",
377
+ name: "[Gen 8] VGC 2021",
394
378
 
395
379
  mod: 'gen8',
396
380
  gameType: 'doubles',
@@ -438,7 +422,7 @@ export const Formats: FormatList = [
438
422
  'HP Percentage Mod', 'Cancel Mod',
439
423
  ],
440
424
  banlist: [
441
- 'Pokestar Spirit', 'Shedinja + Sturdy', 'Battle Bond', 'Cheek Pouch', 'Cursed Body', 'Dry Skin', 'Fluffy', 'Fur Coat', 'Gorilla Tactics',
425
+ 'Pokestar Spirit', 'Shedinja + Sturdy', 'Battle Bond', 'Cheek Pouch', 'Cursed Body', 'Dry Skin', 'Fur Coat', 'Gorilla Tactics',
442
426
  'Grassy Surge', 'Huge Power', 'Ice Body', 'Iron Barbs', 'Libero', 'Moody', 'Neutralizing Gas', 'Parental Bond', 'Perish Body', 'Poison Heal',
443
427
  'Power Construct', 'Pressure', 'Protean', 'Pure Power', 'Rain Dish', 'Rough Skin', 'Sand Spit', 'Sand Stream', 'Snow Warning', 'Stamina',
444
428
  'Volt Absorb', 'Water Absorb', 'Wonder Guard', 'Abomasite', 'Aguav Berry', 'Assault Vest', 'Berry', 'Berry Juice', 'Berserk Gene',
@@ -497,7 +481,7 @@ export const Formats: FormatList = [
497
481
  ruleset: ['Standard NatDex', 'OHKO Clause', 'Evasion Moves Clause', 'Species Clause', 'Dynamax Clause', 'Sleep Clause Mod'],
498
482
  banlist: [
499
483
  'Alakazam-Mega', 'Arceus', 'Blastoise-Mega', 'Blaziken-Mega', 'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Darkrai',
500
- 'Darmanitan-Galar', 'Deoxys-Attack', 'Deoxys-Base', 'Deoxys-Speed', 'Dialga', 'Dracovish', 'Dragapult', 'Eternatus',
484
+ 'Darmanitan-Galar', 'Deoxys-Attack', 'Deoxys-Base', 'Deoxys-Speed', 'Dialga', 'Dracovish', 'Eternatus',
501
485
  'Genesect', 'Gengar-Mega', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kangaskhan-Mega', 'Kyogre', 'Kyurem-Black',
502
486
  'Kyurem-White', 'Landorus-Base', 'Lucario-Mega', 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Metagross-Mega', 'Mewtwo',
503
487
  'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Necrozma-Ultra', 'Palkia', 'Pheromosa', 'Rayquaza', 'Reshiram',
@@ -527,15 +511,16 @@ export const Formats: FormatList = [
527
511
  'Drizzle', 'Drought',
528
512
  // Slowbronite is banned so it doesn't validate on Galarian Slowbro
529
513
  'Slowbronite',
514
+ // NDOU suspect
515
+ 'Dragapult',
530
516
  ],
531
517
  // Used to distinguish UU from below UU in the client
532
518
  restricted: [
533
- 'Aegislash', 'Alakazam-Base', 'Altaria-Mega', 'Amoonguss', 'Beedrill-Mega', 'Blaziken-Base', 'Breloom', 'Celesteela',
534
- 'Chandelure', 'Donphan', 'Dracozolt', 'Dragonite', 'Feraligatr', 'Gastrodon', 'Hatterene', 'Hippowdon', 'Infernape',
535
- 'Keldeo', 'Krookodile', 'Mamoswine', 'Mandibuzz', 'Manectric-Mega', 'Melmetal', 'Mienshao', 'Moltres-Base',
536
- 'Nidoking', 'Nidoqueen', 'Nihilego', 'Quagsire', 'Regieleki', 'Ribombee', 'Rotom-Heat', 'Rotom-Wash', 'Salamence',
537
- 'Scizor', 'Skarmory', 'Slowking-Base', 'Swampert-Base', 'Talonflame', 'Tangrowth', 'Tornadus-Base', 'Umbreon',
538
- 'Urshifu-Rapid-Strike',
519
+ 'Aegislash', 'Alakazam-Base', 'Altaria-Mega', 'Amoonguss', 'Azumarill', 'Beedrill-Mega', 'Blaziken-Base', 'Breloom', 'Celesteela',
520
+ 'Chandelure', 'Donphan', 'Dracozolt', 'Dragonite', 'Feraligatr', 'Gastrodon', 'Hatterene', 'Hippowdon', 'Infernape', 'Keldeo',
521
+ 'Krookodile', 'Mamoswine', 'Mandibuzz', 'Manectric-Mega', 'Melmetal', 'Mienshao', 'Moltres-Base', 'Nidoking', 'Nidoqueen', 'Nihilego',
522
+ 'Quagsire', 'Regieleki', 'Ribombee', 'Rotom-Heat', 'Rotom-Wash', 'Salamence', 'Scizor', 'Skarmory', 'Slowking-Base', 'Swampert-Base',
523
+ 'Talonflame', 'Tangrowth', 'Tornadus-Base', 'Umbreon', 'Urshifu-Rapid-Strike',
539
524
  ],
540
525
  },
541
526
  {
@@ -654,80 +639,142 @@ export const Formats: FormatList = [
654
639
  column: 2,
655
640
  },
656
641
  {
657
- name: "[Gen 8] Pokebilities",
658
- desc: `Pok&eacute;mon have all of their released abilities simultaneously.`,
642
+ name: "[Gen 8] Trademarked",
643
+ desc: `Sacrifice your Pok&eacute;mon's ability for a status move that activates on switch-in.`,
659
644
  threads: [
660
- `&bullet; <a href="https://www.smogon.com/forums/threads/3679692/">Pok&eacute;bilities</a>`,
645
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3656980/">Trademarked</a>`,
661
646
  ],
662
- mod: 'pokebilities',
647
+
648
+ mod: 'gen8',
649
+ // searchShow: false,
663
650
  ruleset: ['Standard', 'Dynamax Clause'],
664
651
  banlist: [
665
- 'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Conkeldurr', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Dracozolt',
666
- 'Eternatus', 'Excadrill', 'Genesect', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kyogre', 'Kyurem-Black',
667
- 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings',
668
- 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Porygon-Z', 'Rayquaza', 'Reshiram', 'Solgaleo', 'Spectrier', 'Urshifu-Base',
669
- 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Base', 'Zekrom', 'Zygarde-Base', 'Power Construct',
670
- 'Baton Pass', 'King\'s Rock',
671
- // Moody users
672
- 'Glalie', 'Octillery', 'Remoraid', 'Snorunt',
673
- // Shadow Tag/Arena Trap
674
- 'Diglett-Base', 'Dugtrio-Base', 'Gothita', 'Gothitelle', 'Gothorita', 'Trapinch', 'Wobbuffet', 'Wynaut',
652
+ 'Calyrex-Ice', 'Calyrex-Shadow', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Dragapult', 'Eternatus', 'Kyurem-Black', 'Kyurem-White', 'Giratina',
653
+ 'Giratina-Origin', 'Genesect', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Lugia', 'Lunala', 'Magearna', 'Marowak-Alola', 'Marshadow', 'Melmetal',
654
+ 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Reshiram', 'Solgaleo', 'Spectrier',
655
+ 'Urshifu-Base', 'Victini', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Zygarde-Base',
656
+ 'Arena Trap', 'Moody', 'Neutralizing Gas', 'Power Construct', 'Shadow Tag', 'Baton Pass',
675
657
  ],
676
- onBegin() {
677
- for (const pokemon of this.getAllPokemon()) {
678
- if (pokemon.ability === this.toID(pokemon.species.abilities['S'])) {
679
- continue;
658
+ restricted: [
659
+ 'Baneful Bunker', 'Block', 'Copycat', 'Corrosive Gas', 'Detect', 'Destiny Bond', 'Disable', 'Encore', 'Fairy Lock', 'Hypnosis', 'Ingrain',
660
+ 'Instruct', 'Lovely Kiss', 'King\'s Shield', 'Mat Block', 'Mean Look', 'Memento', 'move:Metronome', 'Obstruct', 'Octolock', 'Nature Power',
661
+ 'Parting Shot', 'Psycho Shift', 'Protect', 'Roar', 'Sing', 'Skill Swap', 'Sleep Powder', 'Sleep Talk', 'Spiky Shield', 'Spore', 'Substitute',
662
+ 'Switcheroo', 'Teleport', 'Trick', 'Whirlwind', 'Wish', 'Yawn',
663
+ ],
664
+ onValidateTeam(team, format, teamHas) {
665
+ const problems = [];
666
+ for (const trademark in teamHas.trademarks) {
667
+ if (teamHas.trademarks[trademark] > 1) {
668
+ problems.push(`You are limited to 1 of each Trademark.`, `(You have ${teamHas.trademarks[trademark]} Pok\u00e9mon with ${trademark} as a Trademark.)`);
680
669
  }
681
- pokemon.m.innates = Object.keys(pokemon.species.abilities)
682
- .filter(key => key !== 'S' && (key !== 'H' || !pokemon.species.unreleasedHidden))
683
- .map(key => this.toID(pokemon.species.abilities[key as "0" | "1" | "H" | "S"]))
684
- .filter(ability => ability !== pokemon.ability);
685
670
  }
671
+ return problems;
686
672
  },
687
- onSwitchInPriority: 2,
688
- onSwitchIn(pokemon) {
689
- if (pokemon.m.innates) {
690
- for (const innate of pokemon.m.innates) {
691
- pokemon.addVolatile("ability:" + innate, pokemon);
673
+ validateSet(set, teamHas) {
674
+ const dex = this.dex;
675
+ const ability = dex.moves.get(set.ability);
676
+ if (!ability.exists) { // Not even a real move
677
+ return this.validateSet(set, teamHas);
678
+ }
679
+ // Absolute trademark bans
680
+ if (ability.category !== 'Status') {
681
+ return [`${ability.name} is not a status move, and cannot be used as a trademark.`];
682
+ }
683
+ if (ability.forceSwitch || ability.selfSwitch) {
684
+ return [
685
+ `Force-switching and self-switching moves are banned from being used as trademarks.`,
686
+ `(${ability.name} is a ${ability.forceSwitch ? 'force' : 'self'}-switching move.)`,
687
+ ];
688
+ }
689
+ const irrevokablyRestricted = [
690
+ 'Assist', 'Copycat', 'Metronome', 'Mirror Move', 'Sleep Talk', // Could call another unsafe trademark
691
+ 'Recycle', 'Trace', // Causes endless turns
692
+ 'Skill Swap', // Self-propagates indefinitely
693
+ ];
694
+ for (const m of set.moves) {
695
+ const move = dex.moves.get(m);
696
+ if (irrevokablyRestricted.includes(move.name)) {
697
+ return [`${move.name} is banned from Trademark, irrespective of custom rules, because it can cause endless turns.`];
692
698
  }
693
699
  }
694
- },
695
- onAfterMega(pokemon) {
696
- for (const innate of Object.keys(pokemon.volatiles).filter(i => i.startsWith('ability:'))) {
697
- pokemon.removeVolatile(innate);
700
+ if (irrevokablyRestricted.includes(ability.name)) {
701
+ return [`${ability.name} cannot safely function as a trademark.`];
698
702
  }
699
- pokemon.m.innates = undefined;
703
+ // Contingent trademark bans
704
+ if (this.ruleTable.isRestricted(`move:${ability.id}`)) {
705
+ return [`${ability.name} is restricted from being used as a trademark.`];
706
+ }
707
+ if (set.moves.map(this.toID).includes(ability.id)) {
708
+ return [`${set.name} may not use ${ability.name} as both a trademark and one of its moves simultaneously.`];
709
+ }
710
+ const customRules = this.format.customRules || [];
711
+ if (!customRules.includes('!obtainableabilities')) customRules.push('!obtainableabilities');
712
+
713
+ const TeamValidator: typeof import('../sim/team-validator').TeamValidator =
714
+ require('../sim/team-validator').TeamValidator;
715
+
716
+ const validator = new TeamValidator(dex.formats.get(`${this.format.id}@@@${customRules.join(',')}`));
717
+ const moves = set.moves;
718
+ set.moves = [ability.id];
719
+ set.ability = dex.species.get(set.species).abilities['0'];
720
+ let problems = validator.validateSet(set, {}) || [];
721
+ if (problems.length) return problems;
722
+ set.moves = moves;
723
+ set.ability = dex.species.get(set.species).abilities['0'];
724
+ problems = problems.concat(validator.validateSet(set, teamHas) || []);
725
+ set.ability = ability.id;
726
+ if (!teamHas.trademarks) teamHas.trademarks = {};
727
+ teamHas.trademarks[ability.name] = (teamHas.trademarks[ability.name] || 0) + 1;
728
+ return problems.length ? problems : null;
729
+ },
730
+ pokemon: {
731
+ getAbility() {
732
+ const move = this.battle.dex.moves.get(this.battle.toID(this.ability));
733
+ if (!move.exists) return Object.getPrototypeOf(this).getAbility.call(this);
734
+ return {
735
+ id: move.id,
736
+ name: move.name,
737
+ onStart(this: Battle, pokemon: Pokemon) {
738
+ this.add('-activate', pokemon, 'ability: ' + move.name);
739
+ this.actions.useMove(move, pokemon);
740
+ },
741
+ toString() {
742
+ return "";
743
+ },
744
+ };
745
+ },
700
746
  },
701
747
  },
702
748
  {
703
- name: "[Gen 8] Camomons",
704
- desc: `Pok&eacute;mon change type to match their first two moves.`,
749
+ name: "[Gen 8] Linked",
750
+ desc: `The first two moves in a Pok&eacute;mon's moveset are used simultaneously.`,
705
751
  threads: [
706
- `&bullet; <a href="https://www.smogon.com/forums/threads/3656413/">Camomons</a>`,
752
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3660421/">Linked</a>`,
707
753
  ],
708
754
 
709
- mod: 'gen8',
710
- // searchShow: false,
711
- 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'],
755
+ mod: 'linked',
756
+ ruleset: ['Standard', 'Dynamax Clause'],
712
757
  banlist: [
713
- 'Calyrex-Ice', 'Calyrex-Shadow', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Dragonite', 'Eternatus', 'Genesect', 'Giratina', 'Giratina-Origin',
714
- 'Groudon', 'Ho-Oh', 'Hydreigon', 'Kartana', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Latias', 'Latios', 'Lugia',
715
- 'Lunala', 'Marshadow', 'Mew', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Reshiram',
716
- 'Reuniclus', 'Shedinja', 'Slowking-Galar', 'Solgaleo', 'Spectrier', 'Tornadus-Therian', 'Volcarona', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned',
717
- 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Zeraora', 'Zygarde-Base', 'Arena Trap', 'Moody', 'Power Construct', 'Shadow Tag', 'Baton Pass',
758
+ 'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Cloyster', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Eternatus', 'Genesect', 'Giratina',
759
+ 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala', 'Magearna',
760
+ 'Marshadow', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Reshiram', 'Solgaleo',
761
+ 'Spectrier', 'Urshifu-Base', 'Volcarona', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom',
762
+ 'Zygarde-Base', 'Zygarde-Complete', 'Arena Trap', 'Chlorophyll', 'Moody', 'Power Construct', 'Sand Rush', 'Sand Veil', 'Shadow Tag', 'Slush Rush',
763
+ 'Snow Cloak', 'Speed Boost', 'Surge Surfer', 'Swift Swim', 'Unburden', 'Bright Powder', 'King\'s Rock', 'Lax Incense', 'Baton Pass',
718
764
  ],
719
- onModifySpeciesPriority: 2,
720
- onModifySpecies(species, target, source, effect) {
721
- if (!target) return; // Chat command
722
- if (effect && ['imposter', 'transform'].includes(effect.id)) return;
723
- const types = [...new Set(target.baseMoveSlots.slice(0, 2).map(move => this.dex.moves.get(move.id).type))];
724
- return {...species, types: types};
725
- },
726
- onSwitchIn(pokemon) {
727
- this.add('-start', pokemon, 'typechange', (pokemon.illusion || pokemon).getTypes(true).join('/'), '[silent]');
728
- },
729
- onAfterMega(pokemon) {
730
- this.add('-start', pokemon, 'typechange', (pokemon.illusion || pokemon).getTypes(true).join('/'), '[silent]');
765
+ restricted: [
766
+ 'Baneful Bunker', 'Bounce', 'Protect', 'Detect', 'Dig', 'Dive', 'Fly', 'King\'s Shield', 'Nature\'s Madness', 'Night Shade',
767
+ 'Obstruct', 'Phantom Force', 'Seismic Toss', 'Shadow Force', 'Sky Drop', 'Spiky Shield', 'Super Fang', 'Trick Room',
768
+ ],
769
+ onValidateSet(set) {
770
+ const problems = [];
771
+ for (const [i, moveid] of set.moves.entries()) {
772
+ const move = this.dex.moves.get(moveid);
773
+ if ([0, 1].includes(i) && this.ruleTable.isRestricted(`move:${move.id}`)) {
774
+ problems.push(`${set.name || set.species}'s move ${move.name} cannot be linked.`);
775
+ }
776
+ }
777
+ return problems;
731
778
  },
732
779
  },
733
780
 
@@ -791,8 +838,8 @@ export const Formats: FormatList = [
791
838
  'Melmetal', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Noivern', 'Palkia', 'Pheromosa', 'Rayquaza', 'Regigigas', 'Reshiram', 'Shedinja',
792
839
  'Solgaleo', 'Spectrier', 'Urshifu-Base', 'Urshifu-Rapid-Strike', 'Victini', 'Weavile', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Base', 'Zekrom',
793
840
  'Zeraora', 'Zygarde-Base', 'Arena Trap', 'Comatose', 'Contrary', 'Fluffy', 'Fur Coat', 'Gorilla Tactics', 'Huge Power', 'Ice Scales', 'Illusion', 'Imposter',
794
- 'Innards Out', 'Intrepid Sword', 'Libero', 'Magnet Pull', 'Moody', 'Neutralizing Gas', 'Parental Bond', 'Poison Heal', 'Power Construct', 'Protean', 'Pure Power',
795
- 'Shadow Tag', 'Simple', 'Stakeout', 'Speed Boost', 'Water Bubble', 'Wonder Guard', 'King\'s Rock', 'Baton Pass',
841
+ 'Innards Out', 'Intrepid Sword', 'Libero', 'Magnet Pull', 'Moody', 'Neutralizing Gas', 'Parental Bond', 'Poison Heal', 'Protean', 'Pure Power', 'Shadow Tag',
842
+ 'Simple', 'Stakeout', 'Speed Boost', 'Water Bubble', 'Wonder Guard', 'King\'s Rock', 'Baton Pass',
796
843
  ],
797
844
  onValidateSet(set) {
798
845
  // Temporary fix until battle-only is implemented properly
@@ -877,17 +924,17 @@ export const Formats: FormatList = [
877
924
  mod: 'gen8',
878
925
  ruleset: ['Standard', 'STABmons Move Legality', 'Dynamax Clause', 'Sleep Moves Clause', '!Sleep Clause Mod'],
879
926
  banlist: [
880
- 'Aegislash', 'Blacephalon', 'Calyrex-Ice', 'Calyrex-Shadow', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Dragapult', 'Dragonite',
881
- 'Eternatus', 'Genesect', 'Garchomp', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem-Black',
882
- 'Kyurem-White', 'Landorus', 'Landorus-Therian', 'Lugia', 'Lunala', 'Marshadow', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings',
883
- 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Porygon-Z', 'Rayquaza', 'Reshiram', 'Silvally', 'Solgaleo', 'Spectrier', 'Tapu Bulu',
884
- 'Tapu Koko', 'Thundurus-Base', 'Urshifu-Base', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned',
885
- 'Zapdos-Galar', 'Zekrom', 'Zygarde-Base', 'Arena Trap', 'Magnet Pull', 'Moody', 'Power Construct', 'Shadow Tag', 'King\'s Rock',
886
- 'Baton Pass',
927
+ 'Aegislash', 'Blacephalon', 'Calyrex-Ice', 'Calyrex-Shadow', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Dragapult', 'Dragonite', 'Eternatus',
928
+ 'Genesect', 'Garchomp', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus',
929
+ 'Landorus-Therian', 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia',
930
+ 'Pheromosa', 'Porygon-Z', 'Rayquaza', 'Reshiram', 'Silvally', 'Solgaleo', 'Spectrier', 'Tapu Bulu', 'Tapu Koko', 'Tapu Lele', 'Thundurus-Base',
931
+ 'Urshifu-Base', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zapdos-Galar', 'Zekrom', 'Zygarde-Base',
932
+ 'Arena Trap', 'Magnet Pull', 'Moody', 'Power Construct', 'Shadow Tag', 'King\'s Rock', 'Baton Pass',
887
933
  ],
888
934
  restricted: [
889
935
  'Acupressure', 'Astral Barrage', 'Belly Drum', 'Bolt Beak', 'Clangorous Soul', 'Double Iron Bash', 'Electrify', 'Extreme Speed', 'Fishious Rend',
890
- 'Geomancy', 'Glacial Lance', 'Oblivion Wing', 'Precipice Blades', 'Shell Smash', 'Shift Gear', 'Thousand Arrows', 'V-create', 'Wicked Blow',
936
+ 'Geomancy', 'Glacial Lance', 'Oblivion Wing', 'Precipice Blades', 'Shell Smash', 'Shift Gear', 'Thousand Arrows', 'Thunderous Kick', 'V-create',
937
+ 'Wicked Blow',
891
938
  ],
892
939
  },
893
940
  {
@@ -917,7 +964,7 @@ export const Formats: FormatList = [
917
964
  banlist: [
918
965
  'Blissey', 'Calyrex-Shadow', 'Chansey', 'Dragapult', 'Hawlucha', 'Marowak-Alola', 'Melmetal', 'Pikachu', 'Toxapex',
919
966
  'Xerneas', 'Zacian', 'Zacian-Crowned', 'Uber > 1', 'AG ++ Uber > 1', 'Arena Trap', 'Huge Power', 'Moody', 'Pure Power',
920
- 'Shadow Tag', 'Baton Pass',
967
+ 'Shadow Tag', 'Swift Swim', 'Bright Powder', 'Focus Band', 'King\'s Rock', 'Lax Incense', 'Quick Claw', 'Baton Pass',
921
968
  ],
922
969
  onValidateTeam(team) {
923
970
  const gods = new Set<string>();
@@ -1037,7 +1084,18 @@ export const Formats: FormatList = [
1037
1084
 
1038
1085
  mod: 'gen8bdsp',
1039
1086
  ruleset: ['[Gen 8 BDSP] UU'],
1040
- banlist: ['UU', 'RUBL'],
1087
+ banlist: ['UU', 'RUBL', 'Drought'],
1088
+ },
1089
+ {
1090
+ name: "[Gen 8 BDSP] NU",
1091
+ threads: [
1092
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3697080/">BDSP NU</a>`,
1093
+ ],
1094
+
1095
+ mod: 'gen8bdsp',
1096
+ searchShow: false,
1097
+ ruleset: ['[Gen 8 BDSP] RU'],
1098
+ banlist: ['RU', 'NUBL'],
1041
1099
  },
1042
1100
  {
1043
1101
  name: "[Gen 8 BDSP] LC",
@@ -1047,7 +1105,7 @@ export const Formats: FormatList = [
1047
1105
 
1048
1106
  mod: 'gen8bdsp',
1049
1107
  ruleset: ['Little Cup', 'Standard'],
1050
- banlist: ['Gligar', 'Meditite', 'Misdreavus', 'Murkrow', 'Scyther', 'Sneasel', 'Tangela', 'Vulpix', 'Yanma', 'Baton Pass'],
1108
+ banlist: ['Gligar', 'Meditite', 'Misdreavus', 'Murkrow', 'Scyther', 'Sneasel', 'Tangela', 'Vulpix', 'Yanma', 'Moody', 'Baton Pass'],
1051
1109
  },
1052
1110
  {
1053
1111
  name: "[Gen 8 BDSP] Monotype",
@@ -1117,6 +1175,24 @@ export const Formats: FormatList = [
1117
1175
  section: "Challengeable OMs",
1118
1176
  column: 2,
1119
1177
  },
1178
+ {
1179
+ name: "[Gen 8] Camomons",
1180
+ desc: `Pok&eacute;mon change type to match their first two moves.`,
1181
+ threads: [
1182
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3656413/">Camomons</a>`,
1183
+ ],
1184
+
1185
+ mod: 'gen8',
1186
+ searchShow: false,
1187
+ ruleset: ['Standard', 'Dynamax Clause', 'Camomons Mod'],
1188
+ banlist: [
1189
+ 'Calyrex-Ice', 'Calyrex-Shadow', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Dragonite', 'Eternatus', 'Genesect', 'Giratina', 'Giratina-Origin',
1190
+ 'Groudon', 'Ho-Oh', 'Hydreigon', 'Kartana', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Latias', 'Latios', 'Lugia',
1191
+ 'Lunala', 'Marshadow', 'Mew', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Reshiram',
1192
+ 'Reuniclus', 'Shedinja', 'Slowking-Galar', 'Solgaleo', 'Spectrier', 'Tornadus-Therian', 'Volcarona', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned',
1193
+ 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Zeraora', 'Zygarde-Base', 'Arena Trap', 'Moody', 'Power Construct', 'Shadow Tag', 'Baton Pass',
1194
+ ],
1195
+ },
1120
1196
  {
1121
1197
  name: "[Gen 8] Inheritance",
1122
1198
  desc: `Pok&eacute;mon may use the ability and moves of another, as long as they forfeit their own learnset.`,
@@ -1544,6 +1620,68 @@ export const Formats: FormatList = [
1544
1620
  },
1545
1621
  },
1546
1622
  },
1623
+ {
1624
+ name: "[Gen 8] Pokebilities",
1625
+ desc: `Pok&eacute;mon have all of their released abilities simultaneously.`,
1626
+ threads: [
1627
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3679692/">Pok&eacute;bilities</a>`,
1628
+ ],
1629
+ mod: 'pokebilities',
1630
+ searchShow: false,
1631
+ ruleset: ['Standard', 'Dynamax Clause'],
1632
+ banlist: [
1633
+ 'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Conkeldurr', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Dracozolt',
1634
+ 'Eternatus', 'Excadrill', 'Genesect', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kyogre', 'Kyurem-Black',
1635
+ 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings',
1636
+ 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Porygon-Z', 'Rayquaza', 'Reshiram', 'Solgaleo', 'Spectrier', 'Urshifu-Base',
1637
+ 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Base', 'Zekrom', 'Zygarde-Base', 'Power Construct',
1638
+ 'Baton Pass', 'King\'s Rock',
1639
+ // Moody users
1640
+ 'Glalie', 'Octillery', 'Remoraid', 'Snorunt',
1641
+ // Shadow Tag/Arena Trap
1642
+ 'Diglett-Base', 'Dugtrio-Base', 'Gothita', 'Gothitelle', 'Gothorita', 'Trapinch', 'Wobbuffet', 'Wynaut',
1643
+ ],
1644
+ onValidateSet(set) {
1645
+ const species = this.dex.species.get(set.species);
1646
+ const unSeenAbilities = Object.keys(species.abilities)
1647
+ .filter(key => key !== 'S' && (key !== 'H' || !species.unreleasedHidden))
1648
+ .map(key => species.abilities[key as "0" | "1" | "H" | "S"])
1649
+ .filter(ability => ability !== set.ability);
1650
+ if (unSeenAbilities.length && this.toID(set.ability) !== this.toID(species.abilities['S'])) {
1651
+ for (const abilityName of unSeenAbilities) {
1652
+ const banReason = this.ruleTable.check('ability:' + this.toID(abilityName));
1653
+ if (banReason) {
1654
+ return [`${set.name}'s ability ${abilityName} is ${banReason}.`];
1655
+ }
1656
+ }
1657
+ }
1658
+ },
1659
+ onBegin() {
1660
+ for (const pokemon of this.getAllPokemon()) {
1661
+ if (pokemon.ability === this.toID(pokemon.species.abilities['S'])) {
1662
+ continue;
1663
+ }
1664
+ pokemon.m.innates = Object.keys(pokemon.species.abilities)
1665
+ .filter(key => key !== 'S' && (key !== 'H' || !pokemon.species.unreleasedHidden))
1666
+ .map(key => this.toID(pokemon.species.abilities[key as "0" | "1" | "H" | "S"]))
1667
+ .filter(ability => ability !== pokemon.ability);
1668
+ }
1669
+ },
1670
+ onSwitchInPriority: 2,
1671
+ onSwitchIn(pokemon) {
1672
+ if (pokemon.m.innates) {
1673
+ for (const innate of pokemon.m.innates) {
1674
+ pokemon.addVolatile("ability:" + innate, pokemon);
1675
+ }
1676
+ }
1677
+ },
1678
+ onAfterMega(pokemon) {
1679
+ for (const innate of Object.keys(pokemon.volatiles).filter(i => i.startsWith('ability:'))) {
1680
+ pokemon.removeVolatile(innate);
1681
+ }
1682
+ pokemon.m.innates = undefined;
1683
+ },
1684
+ },
1547
1685
  {
1548
1686
  name: "[Gen 8] Shared Power",
1549
1687
  desc: `Once a Pok&eacute;mon switches in, its ability is shared with the rest of the team.`,
@@ -1740,106 +1878,6 @@ export const Formats: FormatList = [
1740
1878
  },
1741
1879
  },
1742
1880
  },
1743
- {
1744
- name: "[Gen 8] Trademarked",
1745
- desc: `Sacrifice your Pok&eacute;mon's ability for a status move that activates on switch-in.`,
1746
- threads: [
1747
- `&bullet; <a href="https://www.smogon.com/forums/threads/3656980/">Trademarked</a>`,
1748
- ],
1749
-
1750
- mod: 'gen8',
1751
- searchShow: false,
1752
- ruleset: ['Standard', 'Dynamax Clause'],
1753
- banlist: [
1754
- 'Calyrex-Ice', 'Calyrex-Shadow', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Dragapult', 'Eternatus', 'Kyurem-Black', 'Kyurem-White',
1755
- 'Giratina', 'Giratina-Origin', 'Genesect', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Lugia', 'Lunala', 'Magearna', 'Marshadow',
1756
- 'Melmetal', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Reshiram',
1757
- 'Solgaleo', 'Urshifu-Base', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Zygarde-Base',
1758
- 'Arena Trap', 'Moody', 'Power Construct', 'Shadow Tag', 'Baton Pass',
1759
- ],
1760
- restricted: [
1761
- 'Baneful Bunker', 'Block', 'Copycat', 'Corrosive Gas', 'Detect', 'Destiny Bond', 'Disable', 'Encore', 'Fairy Lock', 'Hypnosis', 'Ingrain',
1762
- 'Instruct', 'Lovely Kiss', 'King\'s Shield', 'Mat Block', 'Mean Look', 'move:Metronome', 'Obstruct', 'Octolock', 'Nature Power', 'Parting Shot',
1763
- 'Psycho Shift', 'Protect', 'Roar', 'Sing', 'Skill Swap', 'Sleep Powder', 'Sleep Talk', 'Spiky Shield', 'Spore', 'Substitute', 'Teleport',
1764
- 'Whirlwind', 'Wish', 'Yawn',
1765
- ],
1766
- onValidateTeam(team, format, teamHas) {
1767
- const problems = [];
1768
- for (const trademark in teamHas.trademarks) {
1769
- if (teamHas.trademarks[trademark] > 1) {
1770
- problems.push(`You are limited to 1 of each Trademark.`, `(You have ${teamHas.trademarks[trademark]} Pok\u00e9mon with ${trademark} as a Trademark.)`);
1771
- }
1772
- }
1773
- return problems;
1774
- },
1775
- validateSet(set, teamHas) {
1776
- const dex = this.dex;
1777
- const ability = dex.moves.get(set.ability);
1778
- if (!ability.exists) { // Not even a real move
1779
- return this.validateSet(set, teamHas);
1780
- }
1781
- // Absolute trademark bans
1782
- if (ability.category !== 'Status') {
1783
- return [`${ability.name} is not a status move, and cannot be used as a trademark.`];
1784
- }
1785
- if (ability.forceSwitch || ability.selfSwitch) {
1786
- return [
1787
- `Force-switching and self-switching moves are banned from being used as trademarks.`,
1788
- `(${ability.name} is a ${ability.forceSwitch ? 'force' : 'self'}-switching move.)`,
1789
- ];
1790
- }
1791
- const irrevokablyRestricted = [
1792
- 'Assist', 'Copycat', 'Metronome', 'Mirror Move', 'Sleep Talk', // Could call another unsafe trademark
1793
- 'Skill Swap', // Self-propagates indefinitely
1794
- ];
1795
- if (irrevokablyRestricted.includes(ability.name)) {
1796
- return [`${ability.name} cannot safely function as a trademark.`];
1797
- }
1798
- // Contingent trademark bans
1799
- if (this.ruleTable.isRestricted(`move:${ability.id}`)) {
1800
- return [`${ability.name} is restricted from being used as a trademark.`];
1801
- }
1802
- if (set.moves.map(this.toID).includes(ability.id)) {
1803
- return [`${set.name} may not use ${ability.name} as both a trademark and one of its moves simultaneously.`];
1804
- }
1805
- const customRules = this.format.customRules || [];
1806
- if (!customRules.includes('!obtainableabilities')) customRules.push('!obtainableabilities');
1807
-
1808
- const TeamValidator: typeof import('../sim/team-validator').TeamValidator =
1809
- require('../sim/team-validator').TeamValidator;
1810
-
1811
- const validator = new TeamValidator(dex.formats.get(`${this.format.id}@@@${customRules.join(',')}`));
1812
- const moves = set.moves;
1813
- set.moves = [ability.id];
1814
- set.ability = dex.species.get(set.species).abilities['0'];
1815
- let problems = validator.validateSet(set, {}) || [];
1816
- if (problems.length) return problems;
1817
- set.moves = moves;
1818
- set.ability = dex.species.get(set.species).abilities['0'];
1819
- problems = problems.concat(validator.validateSet(set, teamHas) || []);
1820
- set.ability = ability.id;
1821
- if (!teamHas.trademarks) teamHas.trademarks = {};
1822
- teamHas.trademarks[ability.name] = (teamHas.trademarks[ability.name] || 0) + 1;
1823
- return problems.length ? problems : null;
1824
- },
1825
- pokemon: {
1826
- getAbility() {
1827
- const move = this.battle.dex.moves.get(this.battle.toID(this.ability));
1828
- if (!move.exists) return Object.getPrototypeOf(this).getAbility.call(this);
1829
- return {
1830
- id: move.id,
1831
- name: move.name,
1832
- onStart(this: Battle, pokemon: Pokemon) {
1833
- this.add('-activate', pokemon, 'ability: ' + move.name);
1834
- this.actions.useMove(move, pokemon);
1835
- },
1836
- toString() {
1837
- return "";
1838
- },
1839
- };
1840
- },
1841
- },
1842
- },
1843
1881
 
1844
1882
  // Randomized Metas
1845
1883
  ///////////////////////////////////////////////////////////////////
@@ -1863,6 +1901,38 @@ export const Formats: FormatList = [
1863
1901
  searchShow: false,
1864
1902
  ruleset: ['[Gen 8] Random Battle', 'Dynamax Clause'],
1865
1903
  },
1904
+ {
1905
+ name: "[Gen 8] Random Battle Mayhem",
1906
+ desc: `[Gen 8] Random Battle (No Dmax) with Team Preview and elements of Camomons, Inverse, Scalemons, and Shared Power.`,
1907
+
1908
+ mod: 'sharedpower',
1909
+ team: 'random',
1910
+ searchShow: false,
1911
+ ruleset: ['[Gen 8] Random Battle', 'Team Preview', 'Dynamax Clause', 'Camomons Mod', 'Inverse Mod', 'Scalemons Mod'],
1912
+ onBeforeSwitchIn(pokemon) {
1913
+ let format = this.format;
1914
+ if (!format.getSharedPower) format = this.dex.formats.get('gen8sharedpower');
1915
+ for (const ability of format.getSharedPower!(pokemon)) {
1916
+ const effect = 'ability:' + ability;
1917
+ pokemon.volatiles[effect] = {id: this.toID(effect), target: pokemon};
1918
+ if (!pokemon.m.abils) pokemon.m.abils = [];
1919
+ if (!pokemon.m.abils.includes(effect)) pokemon.m.abils.push(effect);
1920
+ }
1921
+ },
1922
+ onSwitchInPriority: 2,
1923
+ onSwitchIn(pokemon) {
1924
+ let format = this.format;
1925
+ if (!format.getSharedPower) format = this.dex.formats.get('gen8sharedpower');
1926
+ for (const ability of format.getSharedPower!(pokemon)) {
1927
+ if (ability === 'noability') {
1928
+ this.hint(`Mirror Armor and Trace break in Shared Power formats that don't use Shared Power as a base, so they get removed from non-base users.`);
1929
+ }
1930
+ const effect = 'ability:' + ability;
1931
+ delete pokemon.volatiles[effect];
1932
+ pokemon.addVolatile(effect);
1933
+ }
1934
+ },
1935
+ },
1866
1936
  {
1867
1937
  name: "[Gen 8] BSS Factory",
1868
1938
  desc: `Randomized 3v3 Singles featuring Pok&eacute;mon and movesets popular in Battle Stadium Singles.`,
@@ -2140,40 +2210,39 @@ export const Formats: FormatList = [
2140
2210
  column: 3,
2141
2211
  },
2142
2212
  {
2143
- name: "[Gen 2] UU",
2144
- threads: [`&bullet; <a href="https://www.smogon.com/forums/threads/3576710/">GSC UU</a>`],
2213
+ name: "[Gen 3] UU",
2214
+ threads: [
2215
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3585923/">ADV UU Metagame Discussion</a>`,
2216
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3548578/">ADV UU Viability Rankings</a>`,
2217
+ ],
2145
2218
 
2146
- mod: 'gen2',
2219
+ mod: 'gen3',
2147
2220
  // searchShow: false,
2148
- ruleset: ['[Gen 2] OU'],
2149
- banlist: ['OU', 'UUBL'],
2221
+ ruleset: ['Standard', 'NFE Clause'],
2222
+ banlist: ['Uber', 'OU', 'UUBL', 'Smeargle + Ingrain', 'Baton Pass'],
2223
+ unbanlist: ['Scyther', 'Sand Veil'],
2150
2224
  },
2151
2225
  {
2152
- name: "[Gen 5] NU",
2226
+ name: "[Gen 1] NU",
2153
2227
  threads: [
2154
- `&bullet; <a href="https://www.smogon.com/forums/posts/6431094/">BW2 Sample Teams</a>`,
2155
- `&bullet; <a href="https://www.smogon.com/forums/threads/3484121/">BW2 NU Viability Rankings</a>`,
2228
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3668913/">RBY NU Viability Rankings</a>`,
2156
2229
  ],
2157
2230
 
2158
- mod: 'gen5',
2231
+ mod: 'gen1',
2159
2232
  // searchShow: false,
2160
- ruleset: ['[Gen 5] RU', '!Sleep Moves Clause', 'Sleep Clause Mod'],
2161
- banlist: ['RU', 'NUBL', 'Assist', 'Copycat'],
2233
+ ruleset: ['[Gen 1] UU'],
2234
+ banlist: ['UU', 'NUBL'],
2162
2235
  },
2163
2236
  {
2164
- name: "[Gen 5] LC",
2237
+ name: "[Gen 4] Ubers",
2165
2238
  threads: [
2166
- `&bullet; <a href="https://www.smogon.com/forums/posts/6431094/">BW2 Sample Teams</a>`,
2167
- `&bullet; <a href="https://www.smogon.com/forums/threads/3485860/">BW2 LC Viability Rankings</a>`,
2239
+ `&bullet; <a href="https://www.smogon.com/forums/posts/8286279/">DPP Ubers</a>`,
2168
2240
  ],
2169
2241
 
2170
- mod: 'gen5',
2242
+ mod: 'gen4',
2171
2243
  // searchShow: false,
2172
- ruleset: ['Standard', 'Little Cup', 'Sleep Moves Clause'],
2173
- banlist: [
2174
- 'Gligar', 'Meditite', 'Misdreavus', 'Murkrow', 'Scraggy', 'Scyther', 'Sneasel', 'Tangela', 'Vulpix', 'Yanma',
2175
- 'Sand Rush', 'Sand Veil', 'Berry Juice', 'Soul Dew', 'Baton Pass', 'Dragon Rage', 'Sonic Boom', 'Swagger',
2176
- ],
2244
+ ruleset: ['Standard'],
2245
+ banlist: ['AG'],
2177
2246
  },
2178
2247
 
2179
2248
  // Past Gens OU
@@ -2228,7 +2297,7 @@ export const Formats: FormatList = [
2228
2297
 
2229
2298
  mod: 'gen4',
2230
2299
  ruleset: ['Standard'],
2231
- banlist: ['AG', 'Uber', 'Arena Trap', 'Sand Veil', 'Swinub + Snow Cloak', 'Piloswine + Snow Cloak', 'Mamoswine + Snow Cloak', 'Soul Dew', 'Baton Pass'],
2300
+ banlist: ['AG', 'Uber', 'Arena Trap', 'Sand Veil', 'Swinub + Snow Cloak', 'Piloswine + Snow Cloak', 'Mamoswine + Snow Cloak', 'Soul Dew', 'Baton Pass', 'Swagger'],
2232
2301
  },
2233
2302
  {
2234
2303
  name: "[Gen 3] OU",
@@ -3034,6 +3103,18 @@ export const Formats: FormatList = [
3034
3103
  banlist: ['UU', 'RUBL', 'Shadow Tag', 'Shell Smash + Baton Pass'],
3035
3104
  unbanlist: ['Prankster + Assist', 'Prankster + Copycat', 'Baton Pass'],
3036
3105
  },
3106
+ {
3107
+ name: "[Gen 5] NU",
3108
+ threads: [
3109
+ `&bullet; <a href="https://www.smogon.com/forums/posts/6431094/">BW2 Sample Teams</a>`,
3110
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3484121/">BW2 NU Viability Rankings</a>`,
3111
+ ],
3112
+
3113
+ mod: 'gen5',
3114
+ searchShow: false,
3115
+ ruleset: ['[Gen 5] RU', '!Sleep Moves Clause', 'Sleep Clause Mod'],
3116
+ banlist: ['RU', 'NUBL', 'Assist', 'Copycat'],
3117
+ },
3037
3118
  {
3038
3119
  name: "[Gen 5] PU",
3039
3120
  threads: [
@@ -3045,6 +3126,21 @@ export const Formats: FormatList = [
3045
3126
  ruleset: ['[Gen 5] NU', 'Sleep Moves Clause'],
3046
3127
  banlist: ['NU', 'PUBL'],
3047
3128
  },
3129
+ {
3130
+ name: "[Gen 5] LC",
3131
+ threads: [
3132
+ `&bullet; <a href="https://www.smogon.com/forums/posts/6431094/">BW2 Sample Teams</a>`,
3133
+ `&bullet; <a href="https://www.smogon.com/forums/threads/3485860/">BW2 LC Viability Rankings</a>`,
3134
+ ],
3135
+
3136
+ mod: 'gen5',
3137
+ searchShow: false,
3138
+ ruleset: ['Standard', 'Little Cup', 'Sleep Moves Clause'],
3139
+ banlist: [
3140
+ 'Gligar', 'Meditite', 'Misdreavus', 'Murkrow', 'Scraggy', 'Scyther', 'Sneasel', 'Tangela', 'Vulpix', 'Yanma',
3141
+ 'Sand Rush', 'Sand Veil', 'Berry Juice', 'Soul Dew', 'Baton Pass', 'Dragon Rage', 'Sonic Boom', 'Swagger',
3142
+ ],
3143
+ },
3048
3144
  {
3049
3145
  name: "[Gen 5] Monotype",
3050
3146
  desc: `All the Pok&eacute;mon on a team must share a type.`,
@@ -3169,17 +3265,6 @@ export const Formats: FormatList = [
3169
3265
  section: "DPP Singles",
3170
3266
  column: 5,
3171
3267
  },
3172
- {
3173
- name: "[Gen 4] Ubers",
3174
- threads: [
3175
- `&bullet; <a href="https://www.smogon.com/forums/posts/8286279/">DPP Ubers</a>`,
3176
- ],
3177
-
3178
- mod: 'gen4',
3179
- searchShow: false,
3180
- ruleset: ['Standard'],
3181
- banlist: ['AG'],
3182
- },
3183
3268
  {
3184
3269
  name: "[Gen 4] UU",
3185
3270
  threads: [
@@ -3191,7 +3276,7 @@ export const Formats: FormatList = [
3191
3276
  searchShow: false,
3192
3277
  ruleset: ['[Gen 4] OU'],
3193
3278
  banlist: ['OU', 'UUBL'],
3194
- unbanlist: ['Arena Trap'],
3279
+ unbanlist: ['Arena Trap', 'Swagger'],
3195
3280
  },
3196
3281
  {
3197
3282
  name: "[Gen 4] NU",
@@ -3252,7 +3337,7 @@ export const Formats: FormatList = [
3252
3337
  '[Gen 4] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview',
3253
3338
  ],
3254
3339
  banlist: ['Latias', 'Machamp', 'Porygon-Z', 'Shaymin', 'Snorlax', 'Togekiss', 'Focus Sash', 'Destiny Bond', 'Explosion', 'Perish Song', 'Self-Destruct'],
3255
- unbanlist: ['Wobbuffet', 'Wynaut', 'Sand Veil'],
3340
+ unbanlist: ['Wobbuffet', 'Wynaut', 'Sand Veil', 'Swagger'],
3256
3341
  },
3257
3342
  {
3258
3343
  name: "[Gen 4] Anything Goes",
@@ -3288,7 +3373,7 @@ export const Formats: FormatList = [
3288
3373
  searchShow: false,
3289
3374
  ruleset: ['[Gen 4] OU'],
3290
3375
  banlist: ['Explosion'],
3291
- unbanlist: ['Garchomp', 'Latias', 'Latios', 'Manaphy', 'Mew', 'Salamence', 'Wobbuffet', 'Wynaut'],
3376
+ unbanlist: ['Garchomp', 'Latias', 'Latios', 'Manaphy', 'Mew', 'Salamence', 'Wobbuffet', 'Wynaut', 'Swagger'],
3292
3377
  },
3293
3378
  {
3294
3379
  name: "[Gen 4] VGC 2010",
@@ -3339,19 +3424,6 @@ export const Formats: FormatList = [
3339
3424
  ruleset: ['Standard', 'Deoxys Camouflage Clause', 'One Baton Pass Clause'],
3340
3425
  banlist: ['Wobbuffet + Leftovers'],
3341
3426
  },
3342
- {
3343
- name: "[Gen 3] UU",
3344
- threads: [
3345
- `&bullet; <a href="https://www.smogon.com/forums/threads/3585923/">ADV UU Metagame Discussion</a>`,
3346
- `&bullet; <a href="https://www.smogon.com/forums/threads/3548578/">ADV UU Viability Rankings</a>`,
3347
- ],
3348
-
3349
- mod: 'gen3',
3350
- searchShow: false,
3351
- ruleset: ['Standard', 'NFE Clause'],
3352
- banlist: ['Uber', 'OU', 'UUBL', 'Smeargle + Ingrain', 'Baton Pass'],
3353
- unbanlist: ['Scyther', 'Sand Veil'],
3354
- },
3355
3427
  {
3356
3428
  name: "[Gen 3] NU",
3357
3429
  threads: [
@@ -3421,6 +3493,15 @@ export const Formats: FormatList = [
3421
3493
  searchShow: false,
3422
3494
  ruleset: ['Standard'],
3423
3495
  },
3496
+ {
3497
+ name: "[Gen 2] UU",
3498
+ threads: [`&bullet; <a href="https://www.smogon.com/forums/threads/3576710/">GSC UU</a>`],
3499
+
3500
+ mod: 'gen2',
3501
+ searchShow: false,
3502
+ ruleset: ['[Gen 2] OU'],
3503
+ banlist: ['OU', 'UUBL'],
3504
+ },
3424
3505
  {
3425
3506
  name: "[Gen 2] NU",
3426
3507
  threads: [`&bullet; <a href="https://www.smogon.com/forums/threads/3642565/">GSC NU</a>`],
@@ -3441,7 +3522,7 @@ export const Formats: FormatList = [
3441
3522
  '[Gen 2] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview',
3442
3523
  ],
3443
3524
  banlist: [
3444
- 'Clefable', 'Snorlax', 'Zapdos', 'Berserk Gene', 'Bright Powder', 'Focus Band', 'King\'s Rock', 'Quick Claw',
3525
+ 'Alakazam', 'Clefable', 'Snorlax', 'Zapdos', 'Berserk Gene', 'Bright Powder', 'Focus Band', 'King\'s Rock', 'Quick Claw',
3445
3526
  'Attract', 'Destiny Bond', 'Explosion', 'Perish Song', 'Present', 'Self-Destruct', 'Swagger',
3446
3527
  ],
3447
3528
  },
@@ -3502,17 +3583,6 @@ export const Formats: FormatList = [
3502
3583
  ruleset: ['[Gen 1] OU'],
3503
3584
  banlist: ['OU', 'UUBL'],
3504
3585
  },
3505
- {
3506
- name: "[Gen 1] NU",
3507
- threads: [
3508
- `&bullet; <a href="https://www.smogon.com/forums/threads/3668913/">RBY NU Viability Rankings</a>`,
3509
- ],
3510
-
3511
- mod: 'gen1',
3512
- searchShow: false,
3513
- ruleset: ['[Gen 1] UU'],
3514
- banlist: ['UU', 'NUBL'],
3515
- },
3516
3586
  {
3517
3587
  name: "[Gen 1] Japanese OU",
3518
3588
  desc: `Generation 1 with Japanese battle mechanics.`,