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