@pkmn/sim 0.5.6 → 0.5.9
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/build/config/formats.js +482 -283
- package/build/config/formats.js.map +1 -1
- package/build/data/aliases.js +0 -2
- package/build/data/aliases.js.map +1 -1
- package/build/data/formats-data.js +12 -12
- package/build/data/formats-data.js.map +1 -1
- package/build/data/items.js +2 -2
- package/build/data/items.js.map +1 -1
- package/build/data/learnsets.js +5 -6
- package/build/data/learnsets.js.map +1 -1
- package/build/data/mods/gen2/moves.js +13 -1
- package/build/data/mods/gen2/moves.js.map +1 -1
- package/build/data/mods/gen3/formats-data.js +2 -2
- package/build/data/mods/gen3/formats-data.js.map +1 -1
- package/build/data/mods/gen4/formats-data.js +4 -4
- package/build/data/mods/gen4/formats-data.js.map +1 -1
- package/build/data/mods/gen4/moves.js +7 -5
- package/build/data/mods/gen4/moves.js.map +1 -1
- package/build/data/mods/gen5/moves.js +6 -4
- package/build/data/mods/gen5/moves.js.map +1 -1
- package/build/data/mods/gen6/items.js +2 -2
- package/build/data/mods/gen6/items.js.map +1 -1
- package/build/data/mods/gen7/moves.js +3 -3
- package/build/data/mods/gen7/moves.js.map +1 -1
- package/build/data/mods/gen7/pokedex.js +5 -0
- package/build/data/mods/gen7/pokedex.js.map +1 -1
- package/build/data/moves.js +6 -5
- package/build/data/moves.js.map +1 -1
- package/build/data/pokedex.js +3 -3
- package/build/data/pokedex.js.map +1 -1
- package/build/data/rulesets.js +23 -139
- package/build/data/rulesets.js.map +1 -1
- package/build/sim/team-validator.js +11 -0
- package/build/sim/team-validator.js.map +1 -1
- package/config/formats.ts +464 -279
- package/data/aliases.ts +0 -2
- package/data/formats-data.ts +12 -12
- package/data/items.ts +2 -2
- package/data/learnsets.ts +5 -6
- package/data/mods/gen2/moves.ts +13 -1
- package/data/mods/gen3/formats-data.ts +2 -2
- package/data/mods/gen4/formats-data.ts +4 -4
- package/data/mods/gen4/moves.ts +6 -4
- package/data/mods/gen5/moves.ts +6 -4
- package/data/mods/gen6/items.ts +2 -2
- package/data/mods/gen7/moves.ts +3 -3
- package/data/mods/gen7/pokedex.ts +5 -0
- package/data/moves.ts +6 -5
- package/data/pokedex.ts +3 -3
- package/data/rulesets.ts +21 -125
- package/package.json +2 -2
- package/sim/team-validator.ts +13 -0
package/config/formats.ts
CHANGED
|
@@ -234,8 +234,8 @@ export const Formats: FormatList = [
|
|
|
234
234
|
mod: 'gen8',
|
|
235
235
|
ruleset: ['[Gen 8] PU'],
|
|
236
236
|
banlist: [
|
|
237
|
-
'PU', 'Aurorus', 'Centiskorch', 'Drampa', 'Exeggutor-Alola', 'Gallade', 'Haunter', 'Magmortar', 'Magneton', 'Omastar',
|
|
238
|
-
'Turtonator', 'Vanilluxe', 'Vikavolt', 'Silvally-Dragon', 'Silvally-Ground', 'Sneasel', 'Damp Rock', 'Grassy Seed',
|
|
237
|
+
'PU', 'Arctovish', 'Aurorus', 'Centiskorch', 'Drampa', 'Exeggutor-Alola', 'Gallade', 'Haunter', 'Magmortar', 'Magneton', 'Omastar',
|
|
238
|
+
'Rotom-Frost', 'Turtonator', 'Vanilluxe', 'Vikavolt', 'Silvally-Dragon', 'Silvally-Ground', 'Sneasel', 'Damp Rock', 'Grassy Seed',
|
|
239
239
|
],
|
|
240
240
|
},
|
|
241
241
|
{
|
|
@@ -362,6 +362,11 @@ export const Formats: FormatList = [
|
|
|
362
362
|
},
|
|
363
363
|
{
|
|
364
364
|
name: "[Gen 8] VGC 2022",
|
|
365
|
+
threads: [
|
|
366
|
+
`• <a href="https://www.smogon.com/forums/threads/3677186/">VGC 2022 Metagame Discussion</a>`,
|
|
367
|
+
`• <a href="https://www.smogon.com/forums/threads/3695848/">VGC 2022 Sample Teams</a>`,
|
|
368
|
+
`• <a href="https://www.smogon.com/forums/threads/3696395/">VGC 2022 Viability Rankings</a>`,
|
|
369
|
+
],
|
|
365
370
|
|
|
366
371
|
mod: 'gen8',
|
|
367
372
|
gameType: 'doubles',
|
|
@@ -417,7 +422,7 @@ export const Formats: FormatList = [
|
|
|
417
422
|
'HP Percentage Mod', 'Cancel Mod',
|
|
418
423
|
],
|
|
419
424
|
banlist: [
|
|
420
|
-
'Pokestar Spirit', 'Shedinja + Sturdy', 'Battle Bond', 'Cheek Pouch', 'Cursed Body', 'Dry Skin', '
|
|
425
|
+
'Pokestar Spirit', 'Shedinja + Sturdy', 'Battle Bond', 'Cheek Pouch', 'Cursed Body', 'Dry Skin', 'Fur Coat', 'Gorilla Tactics',
|
|
421
426
|
'Grassy Surge', 'Huge Power', 'Ice Body', 'Iron Barbs', 'Libero', 'Moody', 'Neutralizing Gas', 'Parental Bond', 'Perish Body', 'Poison Heal',
|
|
422
427
|
'Power Construct', 'Pressure', 'Protean', 'Pure Power', 'Rain Dish', 'Rough Skin', 'Sand Spit', 'Sand Stream', 'Snow Warning', 'Stamina',
|
|
423
428
|
'Volt Absorb', 'Water Absorb', 'Wonder Guard', 'Abomasite', 'Aguav Berry', 'Assault Vest', 'Berry', 'Berry Juice', 'Berserk Gene',
|
|
@@ -476,11 +481,11 @@ export const Formats: FormatList = [
|
|
|
476
481
|
ruleset: ['Standard NatDex', 'OHKO Clause', 'Evasion Moves Clause', 'Species Clause', 'Dynamax Clause', 'Sleep Clause Mod'],
|
|
477
482
|
banlist: [
|
|
478
483
|
'Alakazam-Mega', 'Arceus', 'Blastoise-Mega', 'Blaziken-Mega', 'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Darkrai',
|
|
479
|
-
'Darmanitan-Galar', 'Deoxys-Attack', 'Deoxys-Base', 'Deoxys-Speed', 'Dialga', 'Dracovish', '
|
|
484
|
+
'Darmanitan-Galar', 'Deoxys-Attack', 'Deoxys-Base', 'Deoxys-Speed', 'Dialga', 'Dracovish', 'Eternatus',
|
|
480
485
|
'Genesect', 'Gengar-Mega', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kangaskhan-Mega', 'Kyogre', 'Kyurem-Black',
|
|
481
486
|
'Kyurem-White', 'Landorus-Base', 'Lucario-Mega', 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Metagross-Mega', 'Mewtwo',
|
|
482
487
|
'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Necrozma-Ultra', 'Palkia', 'Pheromosa', 'Rayquaza', 'Reshiram',
|
|
483
|
-
'Salamence-Mega', 'Shaymin-Sky', 'Solgaleo', 'Spectrier', 'Urshifu-Base', 'Xerneas', 'Yveltal', 'Zacian',
|
|
488
|
+
'Salamence-Mega', 'Shaymin-Sky', 'Solgaleo', 'Spectrier', 'Tornadus-Therian', 'Urshifu-Base', 'Xerneas', 'Yveltal', 'Zacian',
|
|
484
489
|
'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Zygarde-Base', 'Zygarde-Complete', 'Arena Trap', 'Moody',
|
|
485
490
|
'Power Construct', 'Sand Veil', 'Shadow Tag', 'Snow Cloak', 'Bright Powder', 'King\'s Rock', 'Lax Incense', 'Razor Fang',
|
|
486
491
|
'Quick Claw', 'Baton Pass',
|
|
@@ -506,17 +511,16 @@ export const Formats: FormatList = [
|
|
|
506
511
|
'Drizzle', 'Drought',
|
|
507
512
|
// Slowbronite is banned so it doesn't validate on Galarian Slowbro
|
|
508
513
|
'Slowbronite',
|
|
509
|
-
//
|
|
510
|
-
'
|
|
514
|
+
// NDOU suspect
|
|
515
|
+
'Dragapult',
|
|
511
516
|
],
|
|
512
517
|
// Used to distinguish UU from below UU in the client
|
|
513
518
|
restricted: [
|
|
514
|
-
'Aegislash', 'Alakazam-Base', 'Altaria-Mega', 'Amoonguss', 'Beedrill-Mega', 'Blaziken-Base', 'Breloom', 'Celesteela',
|
|
515
|
-
'Chandelure', 'Donphan', 'Dracozolt', 'Dragonite', 'Feraligatr', 'Gastrodon', 'Hatterene', 'Hippowdon', 'Infernape',
|
|
516
|
-
'
|
|
517
|
-
'
|
|
518
|
-
'
|
|
519
|
-
'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',
|
|
520
524
|
],
|
|
521
525
|
},
|
|
522
526
|
{
|
|
@@ -635,134 +639,196 @@ export const Formats: FormatList = [
|
|
|
635
639
|
column: 2,
|
|
636
640
|
},
|
|
637
641
|
{
|
|
638
|
-
name: "[Gen 8]
|
|
639
|
-
desc: `
|
|
642
|
+
name: "[Gen 8] Shared Power",
|
|
643
|
+
desc: `Once a Pokémon switches in, its ability is shared with the rest of the team.`,
|
|
640
644
|
threads: [
|
|
641
|
-
`• <a href="https://www.smogon.com/forums/threads/
|
|
645
|
+
`• <a href="https://www.smogon.com/forums/threads/3660877/">Shared Power</a>`,
|
|
642
646
|
],
|
|
643
647
|
|
|
644
|
-
mod: '
|
|
648
|
+
mod: 'sharedpower',
|
|
645
649
|
// searchShow: false,
|
|
646
650
|
ruleset: ['Standard', 'Dynamax Clause'],
|
|
647
651
|
banlist: [
|
|
648
|
-
'Calyrex-Ice', 'Calyrex-Shadow', 'Darmanitan-Galar', 'Dialga', 'Dracovish', '
|
|
649
|
-
'Giratina
|
|
650
|
-
'Marshadow', 'Melmetal', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia',
|
|
651
|
-
'
|
|
652
|
-
'
|
|
652
|
+
'Calyrex-Ice', 'Calyrex-Shadow', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Eternatus', 'Genesect', 'Giratina',
|
|
653
|
+
'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna',
|
|
654
|
+
'Marshadow', 'Melmetal', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia',
|
|
655
|
+
'Pheromosa', 'Rayquaza', 'Reshiram', 'Shedinja', 'Solgaleo', 'Urshifu-Base', 'Urshifu-Rapid-Strike',
|
|
656
|
+
'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom',
|
|
657
|
+
'Arena Trap', 'Contrary', 'Drizzle ++ Swift Swim', 'Drought ++ Chlorophyll', 'Electric Surge ++ Surge Surfer',
|
|
658
|
+
'Fur Coat', 'Guts', 'Harvest', 'Huge Power', 'Imposter', 'Innards Out', 'Libero', 'Magic Bounce', 'Magic Guard',
|
|
659
|
+
'Magnet Pull', 'Mold Breaker', 'Moody', 'Neutralizing Gas', 'Power Construct', 'Queenly Majesty', 'Quick Draw',
|
|
660
|
+
'Regenerator', 'Sand Rush', 'Sand Veil', 'Shadow Tag', 'Simple', 'Snow Cloak', 'Snow Warning ++ Slush Rush', 'Speed Boost',
|
|
661
|
+
'Stakeout', 'Steelworker ++ Steely Spirit', 'Tinted Lens', 'Triage', 'Unaware', 'Unburden', 'Water Bubble',
|
|
662
|
+
'Baton Pass',
|
|
653
663
|
],
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
664
|
+
getSharedPower(pokemon) {
|
|
665
|
+
const sharedPower = new Set<string>();
|
|
666
|
+
for (const ally of pokemon.side.pokemon) {
|
|
667
|
+
if (ally.previouslySwitchedIn > 0) {
|
|
668
|
+
if (pokemon.battle.dex.currentMod !== 'sharedpower' && ['trace', 'mirrorarmor'].includes(ally.baseAbility)) {
|
|
669
|
+
sharedPower.add('noability');
|
|
670
|
+
continue;
|
|
671
|
+
}
|
|
672
|
+
sharedPower.add(ally.baseAbility);
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
sharedPower.delete(pokemon.baseAbility);
|
|
676
|
+
return sharedPower;
|
|
677
|
+
},
|
|
678
|
+
onBeforeSwitchIn(pokemon) {
|
|
679
|
+
let format = this.format;
|
|
680
|
+
if (!format.getSharedPower) format = this.dex.formats.get('gen8sharedpower');
|
|
681
|
+
for (const ability of format.getSharedPower!(pokemon)) {
|
|
682
|
+
const effect = 'ability:' + ability;
|
|
683
|
+
pokemon.volatiles[effect] = {id: this.toID(effect), target: pokemon};
|
|
684
|
+
if (!pokemon.m.abils) pokemon.m.abils = [];
|
|
685
|
+
if (!pokemon.m.abils.includes(effect)) pokemon.m.abils.push(effect);
|
|
686
|
+
}
|
|
687
|
+
},
|
|
688
|
+
onSwitchInPriority: 2,
|
|
689
|
+
onSwitchIn(pokemon) {
|
|
690
|
+
let format = this.format;
|
|
691
|
+
if (!format.getSharedPower) format = this.dex.formats.get('gen8sharedpower');
|
|
692
|
+
for (const ability of format.getSharedPower!(pokemon)) {
|
|
693
|
+
if (ability === 'noability') {
|
|
694
|
+
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.`);
|
|
695
|
+
}
|
|
696
|
+
const effect = 'ability:' + ability;
|
|
697
|
+
delete pokemon.volatiles[effect];
|
|
698
|
+
pokemon.addVolatile(effect);
|
|
699
|
+
}
|
|
700
|
+
},
|
|
701
|
+
},
|
|
702
|
+
{
|
|
703
|
+
name: "[Gen 8] Cross Evolution",
|
|
704
|
+
desc: `Give a Pokémon a Pokémon name of the next evolution stage as a nickname to inherit stat changes, typing, abilities, and up to 2 moves from the next stage Pokémon.`,
|
|
705
|
+
threads: [
|
|
706
|
+
`• <a href="https://www.smogon.com/forums/threads/3657562/">Cross Evolution</a>`,
|
|
659
707
|
],
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
708
|
+
|
|
709
|
+
mod: 'gen8',
|
|
710
|
+
// searchShow: false,
|
|
711
|
+
ruleset: ['Standard', 'Overflow Stat Mod', 'Dynamax Clause'],
|
|
712
|
+
banlist: ['Corsola-Galar', 'Sneasel', 'Type: Null', 'Arena Trap', 'Ice Scales', 'Moody', 'King\'s Rock', 'Baton Pass'],
|
|
713
|
+
restricted: ['Chansey', 'Lunala', 'Shedinja', 'Solgaleo', 'Gorilla Tactics', 'Huge Power', 'Pure Power', 'Shadow Tag'],
|
|
714
|
+
onValidateTeam(team) {
|
|
715
|
+
const names = new Set<ID>();
|
|
716
|
+
for (const set of team) {
|
|
717
|
+
const name = set.name;
|
|
718
|
+
if (names.has(this.dex.toID(name))) {
|
|
719
|
+
return [
|
|
720
|
+
`Your Pok\u00e9mon must have different nicknames.`,
|
|
721
|
+
`(You have more than one Pok\u00e9mon named '${name}')`,
|
|
722
|
+
];
|
|
665
723
|
}
|
|
724
|
+
names.add(this.dex.toID(name));
|
|
725
|
+
}
|
|
726
|
+
if (!names.size) {
|
|
727
|
+
return [
|
|
728
|
+
`${this.format.name} works using nicknames; your team has 0 nicknamed Pok\u00e9mon.`,
|
|
729
|
+
`(If this was intentional, add a nickname to one Pok\u00e9mon that isn't the name of a Pok\u00e9mon species.)`,
|
|
730
|
+
];
|
|
666
731
|
}
|
|
667
|
-
|
|
732
|
+
},
|
|
733
|
+
checkCanLearn(move, species, lsetData, set) {
|
|
734
|
+
// @ts-ignore
|
|
735
|
+
if (!set.sp?.exists || !set.crossSpecies?.exists) {
|
|
736
|
+
return this.checkCanLearn(move, species, lsetData, set);
|
|
737
|
+
}
|
|
738
|
+
// @ts-ignore
|
|
739
|
+
const problem = this.checkCanLearn(move, set.sp);
|
|
740
|
+
if (!problem) return null;
|
|
741
|
+
// @ts-ignore
|
|
742
|
+
if (!set.crossMovesLeft) return problem;
|
|
743
|
+
// @ts-ignore
|
|
744
|
+
if (this.checkCanLearn(move, set.crossSpecies)) return problem;
|
|
745
|
+
// @ts-ignore
|
|
746
|
+
set.crossMovesLeft--;
|
|
747
|
+
return null;
|
|
668
748
|
},
|
|
669
749
|
validateSet(set, teamHas) {
|
|
670
|
-
const
|
|
671
|
-
|
|
672
|
-
if (
|
|
673
|
-
|
|
750
|
+
const crossSpecies = this.dex.species.get(set.name);
|
|
751
|
+
let problems = this.dex.formats.get('Pokemon').onChangeSet?.call(this, set, this.format) || null;
|
|
752
|
+
if (Array.isArray(problems) && problems.length) return problems;
|
|
753
|
+
const crossNonstandard = (!this.ruleTable.has('standardnatdex') && crossSpecies.isNonstandard === 'Past') ||
|
|
754
|
+
crossSpecies.isNonstandard === 'Future';
|
|
755
|
+
const crossIsCap = !this.ruleTable.has('+pokemontag:cap') && crossSpecies.isNonstandard === 'CAP';
|
|
756
|
+
if (!crossSpecies.exists || crossNonstandard || crossIsCap) return this.validateSet(set, teamHas);
|
|
757
|
+
const species = this.dex.species.get(set.species);
|
|
758
|
+
const check = this.checkSpecies(set, species, species, {});
|
|
759
|
+
if (check) return [check];
|
|
760
|
+
const nonstandard = !this.ruleTable.has('standardnatdex') && species.isNonstandard === 'Past';
|
|
761
|
+
const isCap = !this.ruleTable.has('+pokemontag:cap') && species.isNonstandard === 'CAP';
|
|
762
|
+
if (!species.exists || nonstandard || isCap || species === crossSpecies) return this.validateSet(set, teamHas);
|
|
763
|
+
if (!species.nfe) return [`${species.name} cannot cross evolve because it doesn't evolve.`];
|
|
764
|
+
const crossIsUnreleased = (crossSpecies.tier === "Unreleased" && crossSpecies.isNonstandard === "Unobtainable");
|
|
765
|
+
if (crossSpecies.battleOnly || crossIsUnreleased || !crossSpecies.prevo) {
|
|
766
|
+
return [`${species.name} cannot cross evolve into ${crossSpecies.name} because it isn't an evolution.`];
|
|
674
767
|
}
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
return [`${ability.name} is not a status move, and cannot be used as a trademark.`];
|
|
768
|
+
if (this.ruleTable.isRestrictedSpecies(crossSpecies)) {
|
|
769
|
+
return [`${species.name} cannot cross evolve into ${crossSpecies.name} because it is banned.`];
|
|
678
770
|
}
|
|
679
|
-
|
|
771
|
+
const crossPrevoSpecies = this.dex.species.get(crossSpecies.prevo);
|
|
772
|
+
if (!crossPrevoSpecies.prevo !== !species.prevo) {
|
|
680
773
|
return [
|
|
681
|
-
|
|
682
|
-
`(${ability.name} is a ${ability.forceSwitch ? 'force' : 'self'}-switching move.)`,
|
|
774
|
+
`${species.name} cannot cross evolve into ${crossSpecies.name} because they are not consecutive evolution stages.`,
|
|
683
775
|
];
|
|
684
776
|
}
|
|
685
|
-
const
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
];
|
|
689
|
-
if (irrevokablyRestricted.includes(ability.name)) {
|
|
690
|
-
return [`${ability.name} cannot safely function as a trademark.`];
|
|
777
|
+
const ability = this.dex.abilities.get(set.ability);
|
|
778
|
+
if (!this.ruleTable.isRestricted(`ability:${ability.id}`) || Object.values(species.abilities).includes(ability.name)) {
|
|
779
|
+
set.species = crossSpecies.name;
|
|
691
780
|
}
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
781
|
+
|
|
782
|
+
// @ts-ignore
|
|
783
|
+
set.sp = species;
|
|
784
|
+
// @ts-ignore
|
|
785
|
+
set.crossSpecies = crossSpecies;
|
|
786
|
+
// @ts-ignore
|
|
787
|
+
set.crossMovesLeft = 2;
|
|
788
|
+
problems = this.validateSet(set, teamHas);
|
|
789
|
+
set.name = crossSpecies.name;
|
|
790
|
+
set.species = species.name;
|
|
791
|
+
return problems;
|
|
792
|
+
},
|
|
793
|
+
onModifySpecies(species, target, source, effect) {
|
|
794
|
+
if (!target) return; // chat
|
|
795
|
+
if (effect && ['imposter', 'transform'].includes(effect.id)) return;
|
|
796
|
+
if (target.set.name === target.set.species) return;
|
|
797
|
+
const crossSpecies = this.dex.species.get(target.set.name);
|
|
798
|
+
if (!crossSpecies.exists) return;
|
|
799
|
+
if (species.battleOnly || !species.nfe) return;
|
|
800
|
+
const crossIsUnreleased = (crossSpecies.tier === "Unreleased" && crossSpecies.isNonstandard === "Unobtainable");
|
|
801
|
+
if (crossSpecies.battleOnly || crossIsUnreleased || !crossSpecies.prevo) return;
|
|
802
|
+
const crossPrevoSpecies = this.dex.species.get(crossSpecies.prevo);
|
|
803
|
+
if (!crossPrevoSpecies.prevo !== !species.prevo) return;
|
|
804
|
+
|
|
805
|
+
const mixedSpecies = this.dex.deepClone(species);
|
|
806
|
+
mixedSpecies.baseSpecies = mixedSpecies.name = `${species.name}-${crossSpecies.name}`;
|
|
807
|
+
mixedSpecies.weightkg =
|
|
808
|
+
Math.max(0.1, +(species.weightkg + crossSpecies.weightkg - crossPrevoSpecies.weightkg)).toFixed(1);
|
|
809
|
+
mixedSpecies.nfe = false;
|
|
810
|
+
mixedSpecies.evos = [];
|
|
811
|
+
mixedSpecies.eggGroups = crossSpecies.eggGroups;
|
|
812
|
+
mixedSpecies.abilities = crossSpecies.abilities;
|
|
813
|
+
mixedSpecies.bst = 0;
|
|
814
|
+
let i: StatID;
|
|
815
|
+
for (i in species.baseStats) {
|
|
816
|
+
const statChange = crossSpecies.baseStats[i] - crossPrevoSpecies.baseStats[i];
|
|
817
|
+
mixedSpecies.baseStats[i] = this.clampIntRange(species.baseStats[i] + statChange, 1, 255);
|
|
818
|
+
mixedSpecies.bst += mixedSpecies.baseStats[i];
|
|
695
819
|
}
|
|
696
|
-
if (
|
|
697
|
-
|
|
820
|
+
if (crossSpecies.types[0] !== crossPrevoSpecies.types[0]) mixedSpecies.types[0] = crossSpecies.types[0];
|
|
821
|
+
if (crossSpecies.types[1] !== crossPrevoSpecies.types[1]) {
|
|
822
|
+
mixedSpecies.types[1] = crossSpecies.types[1] || crossSpecies.types[0];
|
|
698
823
|
}
|
|
699
|
-
|
|
700
|
-
if (!customRules.includes('!obtainableabilities')) customRules.push('!obtainableabilities');
|
|
824
|
+
if (mixedSpecies.types[0] === mixedSpecies.types[1]) mixedSpecies.types = [mixedSpecies.types[0]];
|
|
701
825
|
|
|
702
|
-
|
|
703
|
-
require('../sim/team-validator').TeamValidator;
|
|
704
|
-
|
|
705
|
-
const validator = new TeamValidator(dex.formats.get(`${this.format.id}@@@${customRules.join(',')}`));
|
|
706
|
-
const moves = set.moves;
|
|
707
|
-
set.moves = [ability.id];
|
|
708
|
-
set.ability = dex.species.get(set.species).abilities['0'];
|
|
709
|
-
let problems = validator.validateSet(set, {}) || [];
|
|
710
|
-
if (problems.length) return problems;
|
|
711
|
-
set.moves = moves;
|
|
712
|
-
set.ability = dex.species.get(set.species).abilities['0'];
|
|
713
|
-
problems = problems.concat(validator.validateSet(set, teamHas) || []);
|
|
714
|
-
set.ability = ability.id;
|
|
715
|
-
if (!teamHas.trademarks) teamHas.trademarks = {};
|
|
716
|
-
teamHas.trademarks[ability.name] = (teamHas.trademarks[ability.name] || 0) + 1;
|
|
717
|
-
return problems.length ? problems : null;
|
|
718
|
-
},
|
|
719
|
-
pokemon: {
|
|
720
|
-
getAbility() {
|
|
721
|
-
const move = this.battle.dex.moves.get(this.battle.toID(this.ability));
|
|
722
|
-
if (!move.exists) return Object.getPrototypeOf(this).getAbility.call(this);
|
|
723
|
-
return {
|
|
724
|
-
id: move.id,
|
|
725
|
-
name: move.name,
|
|
726
|
-
onStart(this: Battle, pokemon: Pokemon) {
|
|
727
|
-
this.add('-activate', pokemon, 'ability: ' + move.name);
|
|
728
|
-
this.actions.useMove(move, pokemon);
|
|
729
|
-
},
|
|
730
|
-
toString() {
|
|
731
|
-
return "";
|
|
732
|
-
},
|
|
733
|
-
};
|
|
734
|
-
},
|
|
826
|
+
return mixedSpecies;
|
|
735
827
|
},
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
desc: `The first two moves in a Pokémon's moveset are used simultaneously.`,
|
|
740
|
-
threads: [
|
|
741
|
-
`• <a href="https://www.smogon.com/forums/threads/3660421/">Linked</a>`,
|
|
742
|
-
],
|
|
743
|
-
|
|
744
|
-
mod: 'linked',
|
|
745
|
-
ruleset: ['Standard', 'Dynamax Clause'],
|
|
746
|
-
banlist: [
|
|
747
|
-
'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Eternatus', 'Genesect', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh',
|
|
748
|
-
'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings',
|
|
749
|
-
'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Reshiram', 'Solgaleo', 'Spectrier', 'Urshifu-Base', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned',
|
|
750
|
-
'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Zygarde-Base', 'Zygarde-Complete', 'Arena Trap', 'Moody', 'Power Construct', 'Sand Veil', 'Shadow Tag', 'Snow Cloak',
|
|
751
|
-
'Bright Powder', 'King\'s Rock', 'Lax Incense', 'Baton Pass',
|
|
752
|
-
],
|
|
753
|
-
restricted: [
|
|
754
|
-
'Baneful Bunker', 'Bounce', 'Protect', 'Detect', 'Dig', 'Dive', 'Fly', 'King\'s Shield', 'Nature\'s Madness', 'Night Shade',
|
|
755
|
-
'Obstruct', 'Phantom Force', 'Seismic Toss', 'Shadow Force', 'Sky Drop', 'Spiky Shield', 'Super Fang',
|
|
756
|
-
],
|
|
757
|
-
onValidateSet(set) {
|
|
758
|
-
const problems = [];
|
|
759
|
-
for (const [i, moveid] of set.moves.entries()) {
|
|
760
|
-
const move = this.dex.moves.get(moveid);
|
|
761
|
-
if ([0, 1].includes(i) && this.ruleTable.isRestricted(`move:${move.id}`)) {
|
|
762
|
-
problems.push(`${set.name || set.species}'s move ${move.name} cannot be linked.`);
|
|
763
|
-
}
|
|
828
|
+
onBegin() {
|
|
829
|
+
for (const pokemon of this.getAllPokemon()) {
|
|
830
|
+
pokemon.baseSpecies = pokemon.species;
|
|
764
831
|
}
|
|
765
|
-
return problems;
|
|
766
832
|
},
|
|
767
833
|
},
|
|
768
834
|
|
|
@@ -826,8 +892,8 @@ export const Formats: FormatList = [
|
|
|
826
892
|
'Melmetal', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Noivern', 'Palkia', 'Pheromosa', 'Rayquaza', 'Regigigas', 'Reshiram', 'Shedinja',
|
|
827
893
|
'Solgaleo', 'Spectrier', 'Urshifu-Base', 'Urshifu-Rapid-Strike', 'Victini', 'Weavile', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Base', 'Zekrom',
|
|
828
894
|
'Zeraora', 'Zygarde-Base', 'Arena Trap', 'Comatose', 'Contrary', 'Fluffy', 'Fur Coat', 'Gorilla Tactics', 'Huge Power', 'Ice Scales', 'Illusion', 'Imposter',
|
|
829
|
-
'Innards Out', 'Intrepid Sword', 'Libero', 'Magnet Pull', 'Moody', 'Neutralizing Gas', 'Parental Bond', 'Poison Heal', '
|
|
830
|
-
'
|
|
895
|
+
'Innards Out', 'Intrepid Sword', 'Libero', 'Magnet Pull', 'Moody', 'Neutralizing Gas', 'Parental Bond', 'Poison Heal', 'Protean', 'Pure Power', 'Shadow Tag',
|
|
896
|
+
'Simple', 'Stakeout', 'Speed Boost', 'Water Bubble', 'Wonder Guard', 'King\'s Rock', 'Baton Pass',
|
|
831
897
|
],
|
|
832
898
|
onValidateSet(set) {
|
|
833
899
|
// Temporary fix until battle-only is implemented properly
|
|
@@ -912,17 +978,17 @@ export const Formats: FormatList = [
|
|
|
912
978
|
mod: 'gen8',
|
|
913
979
|
ruleset: ['Standard', 'STABmons Move Legality', 'Dynamax Clause', 'Sleep Moves Clause', '!Sleep Clause Mod'],
|
|
914
980
|
banlist: [
|
|
915
|
-
'Aegislash', 'Blacephalon', 'Calyrex-Ice', 'Calyrex-Shadow', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Dragapult', 'Dragonite',
|
|
916
|
-
'
|
|
917
|
-
'
|
|
918
|
-
'
|
|
919
|
-
'
|
|
920
|
-
'
|
|
921
|
-
'Baton Pass',
|
|
981
|
+
'Aegislash', 'Blacephalon', 'Calyrex-Ice', 'Calyrex-Shadow', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Dragapult', 'Dragonite', 'Eternatus',
|
|
982
|
+
'Genesect', 'Garchomp', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus',
|
|
983
|
+
'Landorus-Therian', 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia',
|
|
984
|
+
'Pheromosa', 'Porygon-Z', 'Rayquaza', 'Reshiram', 'Silvally', 'Solgaleo', 'Spectrier', 'Tapu Bulu', 'Tapu Koko', 'Tapu Lele', 'Thundurus-Base',
|
|
985
|
+
'Urshifu-Base', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zapdos-Galar', 'Zekrom', 'Zygarde-Base',
|
|
986
|
+
'Arena Trap', 'Magnet Pull', 'Moody', 'Power Construct', 'Shadow Tag', 'King\'s Rock', 'Baton Pass',
|
|
922
987
|
],
|
|
923
988
|
restricted: [
|
|
924
989
|
'Acupressure', 'Astral Barrage', 'Belly Drum', 'Bolt Beak', 'Clangorous Soul', 'Double Iron Bash', 'Electrify', 'Extreme Speed', 'Fishious Rend',
|
|
925
|
-
'Geomancy', 'Glacial Lance', 'Oblivion Wing', 'Precipice Blades', 'Shell Smash', 'Shift Gear', 'Thousand Arrows', '
|
|
990
|
+
'Geomancy', 'Glacial Lance', 'Oblivion Wing', 'Precipice Blades', 'Shell Smash', 'Shift Gear', 'Thousand Arrows', 'Thunderous Kick', 'V-create',
|
|
991
|
+
'Wicked Blow',
|
|
926
992
|
],
|
|
927
993
|
},
|
|
928
994
|
{
|
|
@@ -950,9 +1016,9 @@ export const Formats: FormatList = [
|
|
|
950
1016
|
mod: 'gen8',
|
|
951
1017
|
ruleset: ['Standard', 'Dynamax Clause', 'Sleep Moves Clause'],
|
|
952
1018
|
banlist: [
|
|
953
|
-
'Blissey', 'Calyrex-Shadow', 'Chansey', 'Dragapult', 'Hawlucha', '
|
|
1019
|
+
'Blissey', 'Calyrex-Shadow', 'Chansey', 'Dragapult', 'Hawlucha', 'Marowak-Alola', 'Melmetal', 'Pikachu', 'Toxapex',
|
|
954
1020
|
'Xerneas', 'Zacian', 'Zacian-Crowned', 'Uber > 1', 'AG ++ Uber > 1', 'Arena Trap', 'Huge Power', 'Moody', 'Pure Power',
|
|
955
|
-
'Shadow Tag', 'Bright Powder', 'Focus Band', 'King\'s Rock', 'Lax Incense', 'Quick Claw', 'Baton Pass',
|
|
1021
|
+
'Shadow Tag', 'Swift Swim', 'Bright Powder', 'Focus Band', 'King\'s Rock', 'Lax Incense', 'Quick Claw', 'Baton Pass',
|
|
956
1022
|
],
|
|
957
1023
|
onValidateTeam(team) {
|
|
958
1024
|
const gods = new Set<string>();
|
|
@@ -1076,9 +1142,11 @@ export const Formats: FormatList = [
|
|
|
1076
1142
|
},
|
|
1077
1143
|
{
|
|
1078
1144
|
name: "[Gen 8 BDSP] NU",
|
|
1145
|
+
threads: [
|
|
1146
|
+
`• <a href="https://www.smogon.com/forums/threads/3697080/">BDSP NU</a>`,
|
|
1147
|
+
],
|
|
1079
1148
|
|
|
1080
1149
|
mod: 'gen8bdsp',
|
|
1081
|
-
searchShow: false,
|
|
1082
1150
|
ruleset: ['[Gen 8 BDSP] RU'],
|
|
1083
1151
|
banlist: ['RU', 'NUBL'],
|
|
1084
1152
|
},
|
|
@@ -1169,7 +1237,7 @@ export const Formats: FormatList = [
|
|
|
1169
1237
|
|
|
1170
1238
|
mod: 'gen8',
|
|
1171
1239
|
searchShow: false,
|
|
1172
|
-
ruleset: ['
|
|
1240
|
+
ruleset: ['Standard', 'Dynamax Clause', 'Camomons Mod'],
|
|
1173
1241
|
banlist: [
|
|
1174
1242
|
'Calyrex-Ice', 'Calyrex-Shadow', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Dragonite', 'Eternatus', 'Genesect', 'Giratina', 'Giratina-Origin',
|
|
1175
1243
|
'Groudon', 'Ho-Oh', 'Hydreigon', 'Kartana', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Latias', 'Latios', 'Lugia',
|
|
@@ -1177,19 +1245,6 @@ export const Formats: FormatList = [
|
|
|
1177
1245
|
'Reuniclus', 'Shedinja', 'Slowking-Galar', 'Solgaleo', 'Spectrier', 'Tornadus-Therian', 'Volcarona', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned',
|
|
1178
1246
|
'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Zeraora', 'Zygarde-Base', 'Arena Trap', 'Moody', 'Power Construct', 'Shadow Tag', 'Baton Pass',
|
|
1179
1247
|
],
|
|
1180
|
-
onModifySpeciesPriority: 2,
|
|
1181
|
-
onModifySpecies(species, target, source, effect) {
|
|
1182
|
-
if (!target) return; // Chat command
|
|
1183
|
-
if (effect && ['imposter', 'transform'].includes(effect.id)) return;
|
|
1184
|
-
const types = [...new Set(target.baseMoveSlots.slice(0, 2).map(move => this.dex.moves.get(move.id).type))];
|
|
1185
|
-
return {...species, types: types};
|
|
1186
|
-
},
|
|
1187
|
-
onSwitchIn(pokemon) {
|
|
1188
|
-
this.add('-start', pokemon, 'typechange', (pokemon.illusion || pokemon).getTypes(true).join('/'), '[silent]');
|
|
1189
|
-
},
|
|
1190
|
-
onAfterMega(pokemon) {
|
|
1191
|
-
this.add('-start', pokemon, 'typechange', (pokemon.illusion || pokemon).getTypes(true).join('/'), '[silent]');
|
|
1192
|
-
},
|
|
1193
1248
|
},
|
|
1194
1249
|
{
|
|
1195
1250
|
name: "[Gen 8] Inheritance",
|
|
@@ -1373,6 +1428,39 @@ export const Formats: FormatList = [
|
|
|
1373
1428
|
this.add('-start', pokemon, donorTemplate.name, '[silent]');
|
|
1374
1429
|
},
|
|
1375
1430
|
},
|
|
1431
|
+
{
|
|
1432
|
+
name: "[Gen 8] Linked",
|
|
1433
|
+
desc: `The first two moves in a Pokémon's moveset are used simultaneously.`,
|
|
1434
|
+
threads: [
|
|
1435
|
+
`• <a href="https://www.smogon.com/forums/threads/3660421/">Linked</a>`,
|
|
1436
|
+
],
|
|
1437
|
+
|
|
1438
|
+
mod: 'linked',
|
|
1439
|
+
searchShow: false,
|
|
1440
|
+
ruleset: ['Standard', 'Dynamax Clause'],
|
|
1441
|
+
banlist: [
|
|
1442
|
+
'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Cloyster', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Eternatus', 'Genesect', 'Giratina',
|
|
1443
|
+
'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala',
|
|
1444
|
+
'Magearna', 'Marshadow', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Reshiram',
|
|
1445
|
+
'Solgaleo', 'Spectrier', 'Urshifu-Base', 'Volcarona', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned',
|
|
1446
|
+
'Zekrom', 'Zygarde-Base', 'Zygarde-Complete', 'Arena Trap', 'Chlorophyll', 'Moody', 'Power Construct', 'Sand Rush', 'Sand Veil', 'Shadow Tag',
|
|
1447
|
+
'Slush Rush', 'Snow Cloak', 'Speed Boost', 'Surge Surfer', 'Swift Swim', 'Unburden', 'Bright Powder', 'King\'s Rock', 'Lax Incense', 'Baton Pass',
|
|
1448
|
+
],
|
|
1449
|
+
restricted: [
|
|
1450
|
+
'Baneful Bunker', 'Bounce', 'Protect', 'Detect', 'Dig', 'Dive', 'Fly', 'King\'s Shield', 'Nature\'s Madness', 'Night Shade',
|
|
1451
|
+
'Obstruct', 'Phantom Force', 'Seismic Toss', 'Shadow Force', 'Sky Drop', 'Spiky Shield', 'Super Fang', 'Trick Room',
|
|
1452
|
+
],
|
|
1453
|
+
onValidateSet(set) {
|
|
1454
|
+
const problems = [];
|
|
1455
|
+
for (const [i, moveid] of set.moves.entries()) {
|
|
1456
|
+
const move = this.dex.moves.get(moveid);
|
|
1457
|
+
if ([0, 1].includes(i) && this.ruleTable.isRestricted(`move:${move.id}`)) {
|
|
1458
|
+
problems.push(`${set.name || set.species}'s move ${move.name} cannot be linked.`);
|
|
1459
|
+
}
|
|
1460
|
+
}
|
|
1461
|
+
return problems;
|
|
1462
|
+
},
|
|
1463
|
+
},
|
|
1376
1464
|
{
|
|
1377
1465
|
name: "[Gen 8] Multibility",
|
|
1378
1466
|
desc: `Run a second ability at the cost of giving up a Pokémon's item slot.`,
|
|
@@ -1598,85 +1686,24 @@ export const Formats: FormatList = [
|
|
|
1598
1686
|
}
|
|
1599
1687
|
modStats[statName] = tr(tr(2 * stat + set.ivs[usedStat] + tr(set.evs[usedStat] / 4)) * set.level / 100 + 5);
|
|
1600
1688
|
}
|
|
1601
|
-
if ('hp' in baseStats) {
|
|
1602
|
-
const stat = baseStats['hp'];
|
|
1603
|
-
modStats['hp'] = tr(tr(2 * stat + set.ivs['hp'] + tr(set.evs['hp'] / 4) + 100) * set.level / 100 + 10);
|
|
1604
|
-
}
|
|
1605
|
-
return this.natureModify(modStats as StatsTable, set);
|
|
1606
|
-
},
|
|
1607
|
-
natureModify(stats, set) {
|
|
1608
|
-
const tr = this.trunc;
|
|
1609
|
-
const nature = this.dex.natures.get(set.nature);
|
|
1610
|
-
let s: StatIDExceptHP;
|
|
1611
|
-
if (nature.plus) {
|
|
1612
|
-
s = nature.minus!;
|
|
1613
|
-
const stat = this.ruleTable.has('overflowstatmod') ? Math.min(stats[s], 595) : stats[s];
|
|
1614
|
-
stats[s] = this.ruleTable.has('overflowstatmod') ? Math.min(stats[nature.plus], 728) : stats[nature.plus];
|
|
1615
|
-
stats[nature.plus] = tr(tr(stat * 110, 16) / 100);
|
|
1616
|
-
}
|
|
1617
|
-
return stats;
|
|
1618
|
-
},
|
|
1619
|
-
},
|
|
1620
|
-
},
|
|
1621
|
-
{
|
|
1622
|
-
name: "[Gen 8] Shared Power",
|
|
1623
|
-
desc: `Once a Pokémon switches in, its ability is shared with the rest of the team.`,
|
|
1624
|
-
threads: [
|
|
1625
|
-
`• <a href="https://www.smogon.com/forums/threads/3660877/">Shared Power</a>`,
|
|
1626
|
-
],
|
|
1627
|
-
|
|
1628
|
-
mod: 'sharedpower',
|
|
1629
|
-
searchShow: false,
|
|
1630
|
-
ruleset: ['Standard', 'Dynamax Clause'],
|
|
1631
|
-
banlist: [
|
|
1632
|
-
'Calyrex-Ice', 'Calyrex-Shadow', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Eternatus', 'Genesect', 'Giratina',
|
|
1633
|
-
'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna',
|
|
1634
|
-
'Marshadow', 'Melmetal', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia',
|
|
1635
|
-
'Pheromosa', 'Rayquaza', 'Reshiram', 'Shedinja', 'Solgaleo', 'Urshifu-Base', 'Urshifu-Rapid-Strike',
|
|
1636
|
-
'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom',
|
|
1637
|
-
'Arena Trap', 'Contrary', 'Drizzle ++ Swift Swim', 'Drought ++ Chlorophyll', 'Electric Surge ++ Surge Surfer',
|
|
1638
|
-
'Fur Coat', 'Guts', 'Harvest', 'Huge Power', 'Imposter', 'Innards Out', 'Libero', 'Magic Bounce', 'Magic Guard',
|
|
1639
|
-
'Magnet Pull', 'Mold Breaker', 'Moody', 'Neutralizing Gas', 'Power Construct', 'Queenly Majesty', 'Quick Draw',
|
|
1640
|
-
'Regenerator', 'Sand Rush', 'Sand Veil', 'Shadow Tag', 'Simple', 'Snow Cloak', 'Snow Warning ++ Slush Rush', 'Speed Boost',
|
|
1641
|
-
'Stakeout', 'Steelworker ++ Steely Spirit', 'Tinted Lens', 'Triage', 'Unaware', 'Unburden', 'Water Bubble',
|
|
1642
|
-
'Baton Pass',
|
|
1643
|
-
],
|
|
1644
|
-
getSharedPower(pokemon) {
|
|
1645
|
-
const sharedPower = new Set<string>();
|
|
1646
|
-
for (const ally of pokemon.side.pokemon) {
|
|
1647
|
-
if (ally.previouslySwitchedIn > 0) {
|
|
1648
|
-
if (pokemon.battle.dex.currentMod !== 'sharedpower' && ['trace', 'mirrorarmor'].includes(ally.baseAbility)) {
|
|
1649
|
-
sharedPower.add('noability');
|
|
1650
|
-
continue;
|
|
1651
|
-
}
|
|
1652
|
-
sharedPower.add(ally.baseAbility);
|
|
1653
|
-
}
|
|
1654
|
-
}
|
|
1655
|
-
sharedPower.delete(pokemon.baseAbility);
|
|
1656
|
-
return sharedPower;
|
|
1657
|
-
},
|
|
1658
|
-
onBeforeSwitchIn(pokemon) {
|
|
1659
|
-
let format = this.format;
|
|
1660
|
-
if (!format.getSharedPower) format = this.dex.formats.get('gen8sharedpower');
|
|
1661
|
-
for (const ability of format.getSharedPower!(pokemon)) {
|
|
1662
|
-
const effect = 'ability:' + ability;
|
|
1663
|
-
pokemon.volatiles[effect] = {id: this.toID(effect), target: pokemon};
|
|
1664
|
-
if (!pokemon.m.abils) pokemon.m.abils = [];
|
|
1665
|
-
if (!pokemon.m.abils.includes(effect)) pokemon.m.abils.push(effect);
|
|
1666
|
-
}
|
|
1667
|
-
},
|
|
1668
|
-
onSwitchInPriority: 2,
|
|
1669
|
-
onSwitchIn(pokemon) {
|
|
1670
|
-
let format = this.format;
|
|
1671
|
-
if (!format.getSharedPower) format = this.dex.formats.get('gen8sharedpower');
|
|
1672
|
-
for (const ability of format.getSharedPower!(pokemon)) {
|
|
1673
|
-
if (ability === 'noability') {
|
|
1674
|
-
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.`);
|
|
1689
|
+
if ('hp' in baseStats) {
|
|
1690
|
+
const stat = baseStats['hp'];
|
|
1691
|
+
modStats['hp'] = tr(tr(2 * stat + set.ivs['hp'] + tr(set.evs['hp'] / 4) + 100) * set.level / 100 + 10);
|
|
1675
1692
|
}
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1693
|
+
return this.natureModify(modStats as StatsTable, set);
|
|
1694
|
+
},
|
|
1695
|
+
natureModify(stats, set) {
|
|
1696
|
+
const tr = this.trunc;
|
|
1697
|
+
const nature = this.dex.natures.get(set.nature);
|
|
1698
|
+
let s: StatIDExceptHP;
|
|
1699
|
+
if (nature.plus) {
|
|
1700
|
+
s = nature.minus!;
|
|
1701
|
+
const stat = this.ruleTable.has('overflowstatmod') ? Math.min(stats[s], 595) : stats[s];
|
|
1702
|
+
stats[s] = this.ruleTable.has('overflowstatmod') ? Math.min(stats[nature.plus], 728) : stats[nature.plus];
|
|
1703
|
+
stats[nature.plus] = tr(tr(stat * 110, 16) / 100);
|
|
1704
|
+
}
|
|
1705
|
+
return stats;
|
|
1706
|
+
},
|
|
1680
1707
|
},
|
|
1681
1708
|
},
|
|
1682
1709
|
{
|
|
@@ -1700,6 +1727,21 @@ export const Formats: FormatList = [
|
|
|
1700
1727
|
// Shadow Tag/Arena Trap
|
|
1701
1728
|
'Diglett-Base', 'Dugtrio-Base', 'Gothita', 'Gothitelle', 'Gothorita', 'Trapinch', 'Wobbuffet', 'Wynaut',
|
|
1702
1729
|
],
|
|
1730
|
+
onValidateSet(set) {
|
|
1731
|
+
const species = this.dex.species.get(set.species);
|
|
1732
|
+
const unSeenAbilities = Object.keys(species.abilities)
|
|
1733
|
+
.filter(key => key !== 'S' && (key !== 'H' || !species.unreleasedHidden))
|
|
1734
|
+
.map(key => species.abilities[key as "0" | "1" | "H" | "S"])
|
|
1735
|
+
.filter(ability => ability !== set.ability);
|
|
1736
|
+
if (unSeenAbilities.length && this.toID(set.ability) !== this.toID(species.abilities['S'])) {
|
|
1737
|
+
for (const abilityName of unSeenAbilities) {
|
|
1738
|
+
const banReason = this.ruleTable.check('ability:' + this.toID(abilityName));
|
|
1739
|
+
if (banReason) {
|
|
1740
|
+
return [`${set.name}'s ability ${abilityName} is ${banReason}.`];
|
|
1741
|
+
}
|
|
1742
|
+
}
|
|
1743
|
+
}
|
|
1744
|
+
},
|
|
1703
1745
|
onBegin() {
|
|
1704
1746
|
for (const pokemon of this.getAllPokemon()) {
|
|
1705
1747
|
if (pokemon.ability === this.toID(pokemon.species.abilities['S'])) {
|
|
@@ -1726,6 +1768,116 @@ export const Formats: FormatList = [
|
|
|
1726
1768
|
pokemon.m.innates = undefined;
|
|
1727
1769
|
},
|
|
1728
1770
|
},
|
|
1771
|
+
{
|
|
1772
|
+
name: "[Gen 8] Trademarked",
|
|
1773
|
+
desc: `Sacrifice your Pokémon's ability for a status move that activates on switch-in.`,
|
|
1774
|
+
threads: [
|
|
1775
|
+
`• <a href="https://www.smogon.com/forums/threads/3656980/">Trademarked</a>`,
|
|
1776
|
+
],
|
|
1777
|
+
|
|
1778
|
+
mod: 'gen8',
|
|
1779
|
+
// While bugs are being fixed
|
|
1780
|
+
searchShow: false,
|
|
1781
|
+
challengeShow: false,
|
|
1782
|
+
tournamentShow: false,
|
|
1783
|
+
ruleset: ['Standard', 'Dynamax Clause'],
|
|
1784
|
+
banlist: [
|
|
1785
|
+
'Calyrex-Ice', 'Calyrex-Shadow', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Dragapult', 'Eternatus', 'Kyurem-Black', 'Kyurem-White', 'Giratina',
|
|
1786
|
+
'Giratina-Origin', 'Genesect', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Lugia', 'Lunala', 'Magearna', 'Marowak-Alola', 'Marshadow', 'Melmetal',
|
|
1787
|
+
'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Reshiram', 'Solgaleo', 'Spectrier',
|
|
1788
|
+
'Urshifu-Base', 'Victini', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Zygarde-Base',
|
|
1789
|
+
'Arena Trap', 'Moody', 'Neutralizing Gas', 'Power Construct', 'Shadow Tag', 'Baton Pass',
|
|
1790
|
+
],
|
|
1791
|
+
restricted: [
|
|
1792
|
+
'Baneful Bunker', 'Block', 'Copycat', 'Corrosive Gas', 'Detect', 'Destiny Bond', 'Disable', 'Encore', 'Fairy Lock', 'Hypnosis', 'Ingrain',
|
|
1793
|
+
'Instruct', 'Lovely Kiss', 'King\'s Shield', 'Mat Block', 'Mean Look', 'Memento', 'move:Metronome', 'Obstruct', 'Octolock', 'Nature Power',
|
|
1794
|
+
'Parting Shot', 'Psycho Shift', 'Protect', 'Roar', 'Sing', 'Skill Swap', 'Sleep Powder', 'Sleep Talk', 'Spiky Shield', 'Spore', 'Substitute',
|
|
1795
|
+
'Switcheroo', 'Teleport', 'Trick', 'Whirlwind', 'Wish', 'Yawn',
|
|
1796
|
+
],
|
|
1797
|
+
onValidateTeam(team, format, teamHas) {
|
|
1798
|
+
const problems = [];
|
|
1799
|
+
for (const trademark in teamHas.trademarks) {
|
|
1800
|
+
if (teamHas.trademarks[trademark] > 1) {
|
|
1801
|
+
problems.push(`You are limited to 1 of each Trademark.`, `(You have ${teamHas.trademarks[trademark]} Pok\u00e9mon with ${trademark} as a Trademark.)`);
|
|
1802
|
+
}
|
|
1803
|
+
}
|
|
1804
|
+
return problems;
|
|
1805
|
+
},
|
|
1806
|
+
validateSet(set, teamHas) {
|
|
1807
|
+
const dex = this.dex;
|
|
1808
|
+
const ability = dex.moves.get(set.ability);
|
|
1809
|
+
if (!ability.exists) { // Not even a real move
|
|
1810
|
+
return this.validateSet(set, teamHas);
|
|
1811
|
+
}
|
|
1812
|
+
// Absolute trademark bans
|
|
1813
|
+
if (ability.category !== 'Status') {
|
|
1814
|
+
return [`${ability.name} is not a status move, and cannot be used as a trademark.`];
|
|
1815
|
+
}
|
|
1816
|
+
if (ability.forceSwitch || ability.selfSwitch) {
|
|
1817
|
+
return [
|
|
1818
|
+
`Force-switching and self-switching moves are banned from being used as trademarks.`,
|
|
1819
|
+
`(${ability.name} is a ${ability.forceSwitch ? 'force' : 'self'}-switching move.)`,
|
|
1820
|
+
];
|
|
1821
|
+
}
|
|
1822
|
+
const irrevokablyRestricted = [
|
|
1823
|
+
'Assist', 'Copycat', 'Metronome', 'Mirror Move', 'Sleep Talk', // Could call another unsafe trademark
|
|
1824
|
+
'Recycle', 'Trace', // Causes endless turns
|
|
1825
|
+
'Skill Swap', // Self-propagates indefinitely
|
|
1826
|
+
];
|
|
1827
|
+
for (const m of set.moves) {
|
|
1828
|
+
const move = dex.moves.get(m);
|
|
1829
|
+
if (irrevokablyRestricted.includes(move.name)) {
|
|
1830
|
+
return [`${move.name} is banned from Trademark, irrespective of custom rules, because it can cause endless turns.`];
|
|
1831
|
+
}
|
|
1832
|
+
}
|
|
1833
|
+
if (irrevokablyRestricted.includes(ability.name)) {
|
|
1834
|
+
return [`${ability.name} cannot safely function as a trademark.`];
|
|
1835
|
+
}
|
|
1836
|
+
// Contingent trademark bans
|
|
1837
|
+
if (this.ruleTable.isRestricted(`move:${ability.id}`)) {
|
|
1838
|
+
return [`${ability.name} is restricted from being used as a trademark.`];
|
|
1839
|
+
}
|
|
1840
|
+
if (set.moves.map(this.toID).includes(ability.id)) {
|
|
1841
|
+
return [`${set.name} may not use ${ability.name} as both a trademark and one of its moves simultaneously.`];
|
|
1842
|
+
}
|
|
1843
|
+
const customRules = this.format.customRules || [];
|
|
1844
|
+
if (!customRules.includes('!obtainableabilities')) customRules.push('!obtainableabilities');
|
|
1845
|
+
|
|
1846
|
+
const TeamValidator: typeof import('../sim/team-validator').TeamValidator =
|
|
1847
|
+
require('../sim/team-validator').TeamValidator;
|
|
1848
|
+
|
|
1849
|
+
const validator = new TeamValidator(dex.formats.get(`${this.format.id}@@@${customRules.join(',')}`));
|
|
1850
|
+
const moves = set.moves;
|
|
1851
|
+
set.moves = [ability.id];
|
|
1852
|
+
set.ability = dex.species.get(set.species).abilities['0'];
|
|
1853
|
+
let problems = validator.validateSet(set, {}) || [];
|
|
1854
|
+
if (problems.length) return problems;
|
|
1855
|
+
set.moves = moves;
|
|
1856
|
+
set.ability = dex.species.get(set.species).abilities['0'];
|
|
1857
|
+
problems = problems.concat(validator.validateSet(set, teamHas) || []);
|
|
1858
|
+
set.ability = ability.id;
|
|
1859
|
+
if (!teamHas.trademarks) teamHas.trademarks = {};
|
|
1860
|
+
teamHas.trademarks[ability.name] = (teamHas.trademarks[ability.name] || 0) + 1;
|
|
1861
|
+
return problems.length ? problems : null;
|
|
1862
|
+
},
|
|
1863
|
+
pokemon: {
|
|
1864
|
+
getAbility() {
|
|
1865
|
+
const move = this.battle.dex.moves.get(this.battle.toID(this.ability));
|
|
1866
|
+
if (!move.exists) return Object.getPrototypeOf(this).getAbility.call(this);
|
|
1867
|
+
return {
|
|
1868
|
+
id: move.id,
|
|
1869
|
+
name: move.name,
|
|
1870
|
+
onStart(this: Battle, pokemon: Pokemon) {
|
|
1871
|
+
this.add('-activate', pokemon, 'ability: ' + move.name);
|
|
1872
|
+
this.actions.useMove(move, pokemon);
|
|
1873
|
+
},
|
|
1874
|
+
toString() {
|
|
1875
|
+
return "";
|
|
1876
|
+
},
|
|
1877
|
+
};
|
|
1878
|
+
},
|
|
1879
|
+
},
|
|
1880
|
+
},
|
|
1729
1881
|
{
|
|
1730
1882
|
name: "[Gen 8] The Loser's Game",
|
|
1731
1883
|
desc: `The first player to lose all of their Pokémon wins.`,
|
|
@@ -1884,6 +2036,38 @@ export const Formats: FormatList = [
|
|
|
1884
2036
|
searchShow: false,
|
|
1885
2037
|
ruleset: ['[Gen 8] Random Battle', 'Dynamax Clause'],
|
|
1886
2038
|
},
|
|
2039
|
+
{
|
|
2040
|
+
name: "[Gen 8] Random Battle Mayhem",
|
|
2041
|
+
desc: `[Gen 8] Random Battle (No Dmax) with Team Preview and elements of Camomons, Inverse, Scalemons, and Shared Power.`,
|
|
2042
|
+
|
|
2043
|
+
mod: 'sharedpower',
|
|
2044
|
+
team: 'random',
|
|
2045
|
+
searchShow: false,
|
|
2046
|
+
ruleset: ['[Gen 8] Random Battle', 'Team Preview', 'Dynamax Clause', 'Camomons Mod', 'Inverse Mod', 'Scalemons Mod'],
|
|
2047
|
+
onBeforeSwitchIn(pokemon) {
|
|
2048
|
+
let format = this.format;
|
|
2049
|
+
if (!format.getSharedPower) format = this.dex.formats.get('gen8sharedpower');
|
|
2050
|
+
for (const ability of format.getSharedPower!(pokemon)) {
|
|
2051
|
+
const effect = 'ability:' + ability;
|
|
2052
|
+
pokemon.volatiles[effect] = {id: this.toID(effect), target: pokemon};
|
|
2053
|
+
if (!pokemon.m.abils) pokemon.m.abils = [];
|
|
2054
|
+
if (!pokemon.m.abils.includes(effect)) pokemon.m.abils.push(effect);
|
|
2055
|
+
}
|
|
2056
|
+
},
|
|
2057
|
+
onSwitchInPriority: 2,
|
|
2058
|
+
onSwitchIn(pokemon) {
|
|
2059
|
+
let format = this.format;
|
|
2060
|
+
if (!format.getSharedPower) format = this.dex.formats.get('gen8sharedpower');
|
|
2061
|
+
for (const ability of format.getSharedPower!(pokemon)) {
|
|
2062
|
+
if (ability === 'noability') {
|
|
2063
|
+
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.`);
|
|
2064
|
+
}
|
|
2065
|
+
const effect = 'ability:' + ability;
|
|
2066
|
+
delete pokemon.volatiles[effect];
|
|
2067
|
+
pokemon.addVolatile(effect);
|
|
2068
|
+
}
|
|
2069
|
+
},
|
|
2070
|
+
},
|
|
1887
2071
|
{
|
|
1888
2072
|
name: "[Gen 8] BSS Factory",
|
|
1889
2073
|
desc: `Randomized 3v3 Singles featuring Pokémon and movesets popular in Battle Stadium Singles.`,
|
|
@@ -2161,39 +2345,45 @@ export const Formats: FormatList = [
|
|
|
2161
2345
|
column: 3,
|
|
2162
2346
|
},
|
|
2163
2347
|
{
|
|
2164
|
-
name: "[Gen
|
|
2348
|
+
name: "[Gen 4] UU",
|
|
2165
2349
|
threads: [
|
|
2166
|
-
`• <a href="https://www.smogon.com/forums/threads/
|
|
2167
|
-
`• <a href="https://www.smogon.com/forums/threads/
|
|
2350
|
+
`• <a href="https://www.smogon.com/forums/threads/3532624/">DPP UU Metagame Discussion</a>`,
|
|
2351
|
+
`• <a href="https://www.smogon.com/forums/threads/3503638/">DPP UU Viability Rankings</a>`,
|
|
2168
2352
|
],
|
|
2169
2353
|
|
|
2170
|
-
mod: '
|
|
2354
|
+
mod: 'gen4',
|
|
2171
2355
|
// searchShow: false,
|
|
2172
|
-
ruleset: ['
|
|
2173
|
-
banlist: ['
|
|
2174
|
-
unbanlist: ['
|
|
2356
|
+
ruleset: ['[Gen 4] OU'],
|
|
2357
|
+
banlist: ['OU', 'UUBL'],
|
|
2358
|
+
unbanlist: ['Arena Trap', 'Swagger'],
|
|
2175
2359
|
},
|
|
2176
2360
|
{
|
|
2177
|
-
name: "[Gen
|
|
2361
|
+
name: "[Gen 7] LC",
|
|
2178
2362
|
threads: [
|
|
2179
|
-
`• <a href="https://www.smogon.com/
|
|
2363
|
+
`• <a href="https://www.smogon.com/dex/sm/formats/lc/">USM LC Banlist</a>`,
|
|
2364
|
+
`• <a href="https://www.smogon.com/forums/threads/3639319/">USM LC Sample Teams</a>`,
|
|
2365
|
+
`• <a href="https://www.smogon.com/forums/threads/3621440/">USM LC Viability Rankings</a>`,
|
|
2180
2366
|
],
|
|
2181
2367
|
|
|
2182
|
-
mod: '
|
|
2368
|
+
mod: 'gen7',
|
|
2183
2369
|
// searchShow: false,
|
|
2184
|
-
ruleset: ['
|
|
2185
|
-
banlist: [
|
|
2370
|
+
ruleset: ['Little Cup', 'Standard', 'Swagger Clause'],
|
|
2371
|
+
banlist: [
|
|
2372
|
+
'Aipom', 'Cutiefly', 'Drifloon', 'Gligar', 'Gothita', 'Meditite', 'Misdreavus', 'Murkrow', 'Porygon',
|
|
2373
|
+
'Scyther', 'Sneasel', 'Swirlix', 'Tangela', 'Trapinch', 'Vulpix-Base', 'Wingull', 'Yanma',
|
|
2374
|
+
'Eevium Z', 'Baton Pass', 'Dragon Rage', 'Sonic Boom', 'Sticky Web',
|
|
2375
|
+
],
|
|
2186
2376
|
},
|
|
2187
2377
|
{
|
|
2188
|
-
name: "[Gen
|
|
2378
|
+
name: "[Gen 5] PU",
|
|
2189
2379
|
threads: [
|
|
2190
|
-
`• <a href="https://www.smogon.com/forums/posts/
|
|
2380
|
+
`• <a href="https://www.smogon.com/forums/posts/7326932/">BW2 PU</a>`,
|
|
2191
2381
|
],
|
|
2192
2382
|
|
|
2193
|
-
mod: '
|
|
2383
|
+
mod: 'gen5',
|
|
2194
2384
|
// searchShow: false,
|
|
2195
|
-
ruleset: ['
|
|
2196
|
-
banlist: ['
|
|
2385
|
+
ruleset: ['[Gen 5] NU', 'Sleep Moves Clause'],
|
|
2386
|
+
banlist: ['NU', 'PUBL'],
|
|
2197
2387
|
},
|
|
2198
2388
|
|
|
2199
2389
|
// Past Gens OU
|
|
@@ -2486,23 +2676,6 @@ export const Formats: FormatList = [
|
|
|
2486
2676
|
ruleset: ['[Gen 7] NU'],
|
|
2487
2677
|
banlist: ['NU', 'PUBL'],
|
|
2488
2678
|
},
|
|
2489
|
-
{
|
|
2490
|
-
name: "[Gen 7] LC",
|
|
2491
|
-
threads: [
|
|
2492
|
-
`• <a href="https://www.smogon.com/dex/sm/formats/lc/">USM LC Banlist</a>`,
|
|
2493
|
-
`• <a href="https://www.smogon.com/forums/threads/3639319/">USM LC Sample Teams</a>`,
|
|
2494
|
-
`• <a href="https://www.smogon.com/forums/threads/3621440/">USM LC Viability Rankings</a>`,
|
|
2495
|
-
],
|
|
2496
|
-
|
|
2497
|
-
mod: 'gen7',
|
|
2498
|
-
searchShow: false,
|
|
2499
|
-
ruleset: ['Little Cup', 'Standard', 'Swagger Clause'],
|
|
2500
|
-
banlist: [
|
|
2501
|
-
'Aipom', 'Cutiefly', 'Drifloon', 'Gligar', 'Gothita', 'Meditite', 'Misdreavus', 'Murkrow', 'Porygon',
|
|
2502
|
-
'Scyther', 'Sneasel', 'Swirlix', 'Tangela', 'Trapinch', 'Vulpix-Base', 'Wingull', 'Yanma',
|
|
2503
|
-
'Eevium Z', 'Baton Pass', 'Dragon Rage', 'Sonic Boom', 'Sticky Web',
|
|
2504
|
-
],
|
|
2505
|
-
},
|
|
2506
2679
|
{
|
|
2507
2680
|
name: "[Gen 7] Monotype",
|
|
2508
2681
|
desc: `All the Pokémon on a team must share a type.`,
|
|
@@ -2846,14 +3019,15 @@ export const Formats: FormatList = [
|
|
|
2846
3019
|
mod: 'gen6',
|
|
2847
3020
|
searchShow: false,
|
|
2848
3021
|
ruleset: [
|
|
2849
|
-
'Max Team Size = 3', 'Picked Team Size = 1',
|
|
2850
|
-
'
|
|
3022
|
+
'Max Team Size = 3', 'Picked Team Size = 1', 'Obtainable', 'Nickname Clause', 'Moody Clause', 'OHKO Clause',
|
|
3023
|
+
'Evasion Moves Clause', 'Accuracy Moves Clause', 'Swagger Clause', 'Endless Battle Clause', 'HP Percentage Mod',
|
|
3024
|
+
'Cancel Mod', 'Team Preview',
|
|
2851
3025
|
],
|
|
2852
3026
|
banlist: [
|
|
2853
3027
|
'Arceus', 'Blaziken', 'Darkrai', 'Deoxys-Base', 'Deoxys-Attack', 'Deoxys-Defense', 'Dialga', 'Giratina',
|
|
2854
3028
|
'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kangaskhan-Mega', 'Kyogre', 'Kyurem-White', 'Lugia', 'Mewtwo',
|
|
2855
3029
|
'Palkia', 'Rayquaza', 'Reshiram', 'Salamence-Mega', 'Shaymin-Sky', 'Xerneas', 'Yveltal', 'Zekrom',
|
|
2856
|
-
'Focus Sash', 'Soul Dew', 'Perish Song',
|
|
3030
|
+
'Focus Sash', 'Soul Dew', 'Grass Whistle', 'Hypnosis', 'Perish Song', 'Sing', 'Yawn',
|
|
2857
3031
|
],
|
|
2858
3032
|
},
|
|
2859
3033
|
{
|
|
@@ -3066,17 +3240,6 @@ export const Formats: FormatList = [
|
|
|
3066
3240
|
ruleset: ['[Gen 5] RU', '!Sleep Moves Clause', 'Sleep Clause Mod'],
|
|
3067
3241
|
banlist: ['RU', 'NUBL', 'Assist', 'Copycat'],
|
|
3068
3242
|
},
|
|
3069
|
-
{
|
|
3070
|
-
name: "[Gen 5] PU",
|
|
3071
|
-
threads: [
|
|
3072
|
-
`• <a href="https://www.smogon.com/forums/posts/7326932/">BW2 PU</a>`,
|
|
3073
|
-
],
|
|
3074
|
-
|
|
3075
|
-
mod: 'gen5',
|
|
3076
|
-
searchShow: false,
|
|
3077
|
-
ruleset: ['[Gen 5] NU', 'Sleep Moves Clause'],
|
|
3078
|
-
banlist: ['NU', 'PUBL'],
|
|
3079
|
-
},
|
|
3080
3243
|
{
|
|
3081
3244
|
name: "[Gen 5] LC",
|
|
3082
3245
|
threads: [
|
|
@@ -3116,7 +3279,7 @@ export const Formats: FormatList = [
|
|
|
3116
3279
|
'Picked Team Size = 1', 'Max Team Size = 3',
|
|
3117
3280
|
'Standard', 'Baton Pass Clause', 'Swagger Clause', 'Accuracy Moves Clause',
|
|
3118
3281
|
],
|
|
3119
|
-
banlist: ['Uber', 'Cottonee', 'Dragonite', 'Kyurem-Black', 'Mew', 'Togekiss', 'Whimsicott', 'Victini', 'Bright Powder', 'Focus Band', 'Focus Sash', 'Lax Incense', 'Quick Claw', 'Soul Dew', 'Perish Song'],
|
|
3282
|
+
banlist: ['Uber', 'Cottonee', 'Dragonite', 'Jirachi', 'Kyurem-Black', 'Mew', 'Togekiss', 'Whimsicott', 'Victini', 'Bright Powder', 'Focus Band', 'Focus Sash', 'Lax Incense', 'Quick Claw', 'Soul Dew', 'Perish Song'],
|
|
3120
3283
|
unbanlist: ['Genesect', 'Landorus', 'Manaphy', 'Thundurus', 'Tornadus-Therian'],
|
|
3121
3284
|
},
|
|
3122
3285
|
{
|
|
@@ -3217,17 +3380,15 @@ export const Formats: FormatList = [
|
|
|
3217
3380
|
column: 5,
|
|
3218
3381
|
},
|
|
3219
3382
|
{
|
|
3220
|
-
name: "[Gen 4]
|
|
3383
|
+
name: "[Gen 4] Ubers",
|
|
3221
3384
|
threads: [
|
|
3222
|
-
`• <a href="https://www.smogon.com/forums/
|
|
3223
|
-
`• <a href="https://www.smogon.com/forums/threads/3503638/">DPP UU Viability Rankings</a>`,
|
|
3385
|
+
`• <a href="https://www.smogon.com/forums/posts/8286279/">DPP Ubers</a>`,
|
|
3224
3386
|
],
|
|
3225
3387
|
|
|
3226
3388
|
mod: 'gen4',
|
|
3227
3389
|
searchShow: false,
|
|
3228
|
-
ruleset: ['
|
|
3229
|
-
banlist: ['
|
|
3230
|
-
unbanlist: ['Arena Trap', 'Swagger'],
|
|
3390
|
+
ruleset: ['Standard'],
|
|
3391
|
+
banlist: ['AG'],
|
|
3231
3392
|
},
|
|
3232
3393
|
{
|
|
3233
3394
|
name: "[Gen 4] NU",
|
|
@@ -3375,6 +3536,19 @@ export const Formats: FormatList = [
|
|
|
3375
3536
|
ruleset: ['Standard', 'Deoxys Camouflage Clause', 'One Baton Pass Clause'],
|
|
3376
3537
|
banlist: ['Wobbuffet + Leftovers'],
|
|
3377
3538
|
},
|
|
3539
|
+
{
|
|
3540
|
+
name: "[Gen 3] UU",
|
|
3541
|
+
threads: [
|
|
3542
|
+
`• <a href="https://www.smogon.com/forums/threads/3585923/">ADV UU Metagame Discussion</a>`,
|
|
3543
|
+
`• <a href="https://www.smogon.com/forums/threads/3548578/">ADV UU Viability Rankings</a>`,
|
|
3544
|
+
],
|
|
3545
|
+
|
|
3546
|
+
mod: 'gen3',
|
|
3547
|
+
searchShow: false,
|
|
3548
|
+
ruleset: ['Standard', 'NFE Clause'],
|
|
3549
|
+
banlist: ['Uber', 'OU', 'UUBL', 'Smeargle + Ingrain', 'Baton Pass'],
|
|
3550
|
+
unbanlist: ['Scyther', 'Sand Veil'],
|
|
3551
|
+
},
|
|
3378
3552
|
{
|
|
3379
3553
|
name: "[Gen 3] NU",
|
|
3380
3554
|
threads: [
|
|
@@ -3473,7 +3647,7 @@ export const Formats: FormatList = [
|
|
|
3473
3647
|
'[Gen 2] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview',
|
|
3474
3648
|
],
|
|
3475
3649
|
banlist: [
|
|
3476
|
-
'Clefable', 'Snorlax', 'Zapdos', 'Berserk Gene', 'Bright Powder', 'Focus Band', 'King\'s Rock', 'Quick Claw',
|
|
3650
|
+
'Alakazam', 'Clefable', 'Snorlax', 'Zapdos', 'Berserk Gene', 'Bright Powder', 'Focus Band', 'King\'s Rock', 'Quick Claw',
|
|
3477
3651
|
'Attract', 'Destiny Bond', 'Explosion', 'Perish Song', 'Present', 'Self-Destruct', 'Swagger',
|
|
3478
3652
|
],
|
|
3479
3653
|
},
|
|
@@ -3534,6 +3708,17 @@ export const Formats: FormatList = [
|
|
|
3534
3708
|
ruleset: ['[Gen 1] OU'],
|
|
3535
3709
|
banlist: ['OU', 'UUBL'],
|
|
3536
3710
|
},
|
|
3711
|
+
{
|
|
3712
|
+
name: "[Gen 1] NU",
|
|
3713
|
+
threads: [
|
|
3714
|
+
`• <a href="https://www.smogon.com/forums/threads/3668913/">RBY NU Viability Rankings</a>`,
|
|
3715
|
+
],
|
|
3716
|
+
|
|
3717
|
+
mod: 'gen1',
|
|
3718
|
+
searchShow: false,
|
|
3719
|
+
ruleset: ['[Gen 1] UU'],
|
|
3720
|
+
banlist: ['UU', 'NUBL'],
|
|
3721
|
+
},
|
|
3537
3722
|
{
|
|
3538
3723
|
name: "[Gen 1] Japanese OU",
|
|
3539
3724
|
desc: `Generation 1 with Japanese battle mechanics.`,
|