@pkmn/sim 0.5.11 → 0.5.12
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/README.md +5 -0
- package/build/config/formats.js +346 -281
- package/build/config/formats.js.map +1 -1
- package/build/data/abilities.js +7 -7
- package/build/data/abilities.js.map +1 -1
- package/build/data/aliases.js +2 -0
- package/build/data/aliases.js.map +1 -1
- package/build/data/conditions.js +8 -12
- package/build/data/conditions.js.map +1 -1
- package/build/data/formats-data.js +33 -32
- package/build/data/formats-data.js.map +1 -1
- package/build/data/items.js +1 -1
- package/build/data/items.js.map +1 -1
- package/build/data/mods/gen1/moves.js +2 -4
- package/build/data/mods/gen1/moves.js.map +1 -1
- package/build/data/mods/gen3/formats-data.js +1 -1
- package/build/data/mods/gen3/formats-data.js.map +1 -1
- package/build/data/moves.js +14 -12
- package/build/data/moves.js.map +1 -1
- package/build/data/pokedex.js +2 -2
- package/build/data/pokedex.js.map +1 -1
- package/build/data/text/moves.js +1 -0
- package/build/data/text/moves.js.map +1 -1
- package/build/sim/battle.js +13 -11
- package/build/sim/battle.js.map +1 -1
- package/build/sim/dex-conditions.js +10 -3
- package/build/sim/dex-conditions.js.map +1 -1
- package/build/sim/team-validator.js +1 -1
- package/build/sim/team-validator.js.map +1 -1
- package/config/formats.ts +332 -265
- package/data/abilities.ts +7 -7
- package/data/aliases.ts +2 -0
- package/data/conditions.ts +8 -10
- package/data/formats-data.ts +33 -32
- package/data/items.ts +1 -1
- package/data/mods/gen1/moves.ts +2 -4
- package/data/mods/gen3/formats-data.ts +1 -1
- package/data/moves.ts +13 -12
- package/data/pokedex.ts +2 -2
- package/data/text/moves.ts +2 -0
- package/package.json +1 -1
- package/sim/battle.ts +4 -1
- package/sim/dex-conditions.ts +9 -3
- package/sim/team-validator.ts +1 -1
package/config/formats.ts
CHANGED
|
@@ -167,7 +167,7 @@ export const Formats: FormatList = [
|
|
|
167
167
|
mod: 'gen8',
|
|
168
168
|
ruleset: ['Little Cup', 'Standard', 'Dynamax Clause'],
|
|
169
169
|
banlist: [
|
|
170
|
-
'Corsola-Galar', '
|
|
170
|
+
'Corsola-Galar', 'Drifloon', 'Rufflet', 'Scraggy', 'Scyther', 'Sneasel', 'Swirlix', 'Tangela', 'Vulpix-Alola', 'Woobat', 'Zigzagoon-Base',
|
|
171
171
|
'Chlorophyll', 'Moody', 'Baton Pass', 'Sticky Web',
|
|
172
172
|
],
|
|
173
173
|
},
|
|
@@ -187,7 +187,7 @@ export const Formats: FormatList = [
|
|
|
187
187
|
'Kartana', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Mewtwo', 'Naganadel',
|
|
188
188
|
'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Reshiram', 'Solgaleo', 'Urshifu-Base', 'Xerneas', 'Yveltal',
|
|
189
189
|
'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Zygarde-Base', 'Moody', 'Power Construct', 'Shadow Tag', 'Bright Powder',
|
|
190
|
-
'Damp Rock', 'Focus Band', 'King\'s Rock', 'Lax Incense', 'Quick Claw', 'Smooth Rock', 'Terrain Extender', 'Baton Pass',
|
|
190
|
+
'Damp Rock', 'Focus Band', 'King\'s Rock', 'Lax Incense', 'Quick Claw', 'Smooth Rock', 'Terrain Extender', 'Acupressure', 'Baton Pass',
|
|
191
191
|
],
|
|
192
192
|
},
|
|
193
193
|
{
|
|
@@ -249,9 +249,9 @@ export const Formats: FormatList = [
|
|
|
249
249
|
ruleset: ['[Gen 8] LC'],
|
|
250
250
|
banlist: [
|
|
251
251
|
// LC OU
|
|
252
|
-
'Abra', 'Carvanha', '
|
|
253
|
-
'
|
|
254
|
-
'Ponyta', 'Ponyta-Galar', 'Porygon', 'Slowpoke-Base', 'Staryu', 'Timburr', 'Trapinch', 'Tyrunt',
|
|
252
|
+
'Abra', 'Carvanha', 'Diglett-Base', 'Dwebble', 'Ferroseed', 'Foongus', 'Frillish', 'Grookey', 'Koffing',
|
|
253
|
+
'Larvesta', 'Magby', 'Magnemite', 'Mareanie', 'Mienfoo', 'Mudbray', 'Munchlax', 'Natu', 'Onix', 'Pawniard',
|
|
254
|
+
'Ponyta', 'Ponyta-Galar', 'Porygon', 'Slowpoke-Base', 'Staryu', 'Timburr', 'Trapinch', 'Tyrunt',
|
|
255
255
|
// LC UUBL
|
|
256
256
|
'Farfetch\u2019d-Galar', 'Scorbunny', 'Shellder', 'Wingull',
|
|
257
257
|
],
|
|
@@ -405,8 +405,8 @@ export const Formats: FormatList = [
|
|
|
405
405
|
banlist: [
|
|
406
406
|
'Calyrex-Ice', 'Calyrex-Shadow', 'Dialga', 'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Jirachi', 'Kyogre',
|
|
407
407
|
'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia',
|
|
408
|
-
'Rayquaza', 'Reshiram', 'Solgaleo', '
|
|
409
|
-
'Zekrom', 'Power Construct', 'Focus Sash', 'Ally Switch', 'Final Gambit', 'Perish Song', 'Swagger',
|
|
408
|
+
'Rayquaza', 'Reshiram', 'Solgaleo', 'Tornadus-Base', 'Urshifu-Base', 'Urshifu-Rapid-Strike', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned',
|
|
409
|
+
'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Moody', 'Power Construct', 'Focus Sash', 'Ally Switch', 'Final Gambit', 'Perish Song', 'Swagger',
|
|
410
410
|
],
|
|
411
411
|
},
|
|
412
412
|
{
|
|
@@ -480,7 +480,7 @@ export const Formats: FormatList = [
|
|
|
480
480
|
mod: 'gen8',
|
|
481
481
|
ruleset: ['Standard NatDex', 'OHKO Clause', 'Evasion Moves Clause', 'Species Clause', 'Dynamax Clause', 'Sleep Clause Mod'],
|
|
482
482
|
banlist: [
|
|
483
|
-
'Alakazam-Mega', 'Arceus', 'Blastoise-Mega', '
|
|
483
|
+
'Alakazam-Mega', 'Arceus', 'Blastoise-Mega', 'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Darkrai',
|
|
484
484
|
'Darmanitan-Galar', 'Deoxys-Attack', 'Deoxys-Base', 'Deoxys-Speed', 'Dialga', 'Dracovish', 'Dragapult', 'Eternatus',
|
|
485
485
|
'Genesect', 'Gengar-Mega', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kangaskhan-Mega', 'Kyogre', 'Kyurem-Black',
|
|
486
486
|
'Kyurem-White', 'Landorus-Base', 'Lucario-Mega', 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Metagross-Mega', 'Mewtwo',
|
|
@@ -511,6 +511,8 @@ export const Formats: FormatList = [
|
|
|
511
511
|
'Drizzle', 'Drought',
|
|
512
512
|
// Slowbronite is banned so it doesn't validate on Galarian Slowbro
|
|
513
513
|
'Slowbronite',
|
|
514
|
+
// Ban for ou suspect
|
|
515
|
+
'Blaziken-Mega',
|
|
514
516
|
],
|
|
515
517
|
// Used to distinguish UU from below UU in the client
|
|
516
518
|
restricted: [
|
|
@@ -637,202 +639,43 @@ export const Formats: FormatList = [
|
|
|
637
639
|
column: 2,
|
|
638
640
|
},
|
|
639
641
|
{
|
|
640
|
-
name: "[Gen 8]
|
|
641
|
-
desc: `
|
|
642
|
+
name: "[Gen 8] Sketchmons",
|
|
643
|
+
desc: `Every Pokémon gets a new move once.`,
|
|
642
644
|
threads: [
|
|
643
|
-
`• <a href="https://www.smogon.com/forums/threads/
|
|
645
|
+
`• <a href="https://www.smogon.com/forums/threads/3680298/">Sketchmons</a>`,
|
|
644
646
|
],
|
|
645
647
|
|
|
646
|
-
mod: '
|
|
647
|
-
|
|
648
|
-
ruleset: ['Standard', 'Dynamax Clause'],
|
|
648
|
+
mod: 'gen8',
|
|
649
|
+
ruleset: ['Standard', 'Sketchmons Move Legality', 'Dynamax Clause'],
|
|
649
650
|
banlist: [
|
|
650
|
-
'Calyrex-Ice', 'Calyrex-Shadow', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Eternatus', 'Genesect', 'Giratina',
|
|
651
|
-
'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', '
|
|
652
|
-
'Marshadow', '
|
|
653
|
-
'
|
|
654
|
-
'
|
|
655
|
-
'
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
'
|
|
659
|
-
'
|
|
660
|
-
'
|
|
651
|
+
'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Dragapult', 'Eternatus', 'Genesect', 'Giratina',
|
|
652
|
+
'Giratina-Origin', 'Groudon', 'Hawlucha', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala',
|
|
653
|
+
'Marshadow', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Porygon-Z', 'Pheromosa', 'Rayquaza', 'Regieleki',
|
|
654
|
+
'Reshiram', 'Rillaboom', 'Shedinja', 'Solgaleo', 'Spectrier', 'Swoobat', 'Urshifu-Base', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned',
|
|
655
|
+
'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Zeraora', 'Zygarde-Base', 'Arena Trap', 'Magnet Pull', 'Moody', 'Power Construct', 'Sand Rush',
|
|
656
|
+
'Shadow Tag', 'King\'s Rock', 'Baton Pass',
|
|
657
|
+
],
|
|
658
|
+
restricted: [
|
|
659
|
+
'Acupressure', 'Astral Barrage', 'Belly Drum', 'Bolt Beak', 'Clangorous Soul', 'Double Iron Bash', 'Electrify', 'Extreme Speed', 'Fishious Rend',
|
|
660
|
+
'Geomancy', 'Glacial Lance', 'Lovely Kiss', 'No Retreat', 'Oblivion Wing', 'Octolock', 'Quiver Dance', 'Secret Sword', 'Shell Smash', 'Shift Gear',
|
|
661
|
+
'Sleep Powder', 'Spore', 'Thousand Arrows', 'Transform', 'V-create', 'Wicked Blow',
|
|
661
662
|
],
|
|
662
|
-
getSharedPower(pokemon) {
|
|
663
|
-
const sharedPower = new Set<string>();
|
|
664
|
-
for (const ally of pokemon.side.pokemon) {
|
|
665
|
-
if (ally.previouslySwitchedIn > 0) {
|
|
666
|
-
if (pokemon.battle.dex.currentMod !== 'sharedpower' && ['trace', 'mirrorarmor'].includes(ally.baseAbility)) {
|
|
667
|
-
sharedPower.add('noability');
|
|
668
|
-
continue;
|
|
669
|
-
}
|
|
670
|
-
sharedPower.add(ally.baseAbility);
|
|
671
|
-
}
|
|
672
|
-
}
|
|
673
|
-
sharedPower.delete(pokemon.baseAbility);
|
|
674
|
-
return sharedPower;
|
|
675
|
-
},
|
|
676
|
-
onBeforeSwitchIn(pokemon) {
|
|
677
|
-
let format = this.format;
|
|
678
|
-
if (!format.getSharedPower) format = this.dex.formats.get('gen8sharedpower');
|
|
679
|
-
for (const ability of format.getSharedPower!(pokemon)) {
|
|
680
|
-
const effect = 'ability:' + ability;
|
|
681
|
-
pokemon.volatiles[effect] = {id: this.toID(effect), target: pokemon};
|
|
682
|
-
if (!pokemon.m.abils) pokemon.m.abils = [];
|
|
683
|
-
if (!pokemon.m.abils.includes(effect)) pokemon.m.abils.push(effect);
|
|
684
|
-
}
|
|
685
|
-
},
|
|
686
|
-
onSwitchInPriority: 2,
|
|
687
|
-
onSwitchIn(pokemon) {
|
|
688
|
-
let format = this.format;
|
|
689
|
-
if (!format.getSharedPower) format = this.dex.formats.get('gen8sharedpower');
|
|
690
|
-
for (const ability of format.getSharedPower!(pokemon)) {
|
|
691
|
-
if (ability === 'noability') {
|
|
692
|
-
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.`);
|
|
693
|
-
}
|
|
694
|
-
const effect = 'ability:' + ability;
|
|
695
|
-
delete pokemon.volatiles[effect];
|
|
696
|
-
pokemon.addVolatile(effect);
|
|
697
|
-
}
|
|
698
|
-
},
|
|
699
663
|
},
|
|
700
664
|
{
|
|
701
|
-
name: "[Gen 8]
|
|
702
|
-
desc: `
|
|
665
|
+
name: "[Gen 8] Flipped",
|
|
666
|
+
desc: `Pokémon have their base stats flipped.`,
|
|
703
667
|
threads: [
|
|
704
|
-
`• <a href="https://www.smogon.com/forums/threads/
|
|
668
|
+
`• <a href="https://www.smogon.com/forums/threads/3662020/">Flipped</a>`,
|
|
705
669
|
],
|
|
706
670
|
|
|
707
671
|
mod: 'gen8',
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
const name = set.name;
|
|
716
|
-
if (names.has(this.dex.toID(name))) {
|
|
717
|
-
return [
|
|
718
|
-
`Your Pok\u00e9mon must have different nicknames.`,
|
|
719
|
-
`(You have more than one Pok\u00e9mon named '${name}')`,
|
|
720
|
-
];
|
|
721
|
-
}
|
|
722
|
-
names.add(this.dex.toID(name));
|
|
723
|
-
}
|
|
724
|
-
if (!names.size) {
|
|
725
|
-
return [
|
|
726
|
-
`${this.format.name} works using nicknames; your team has 0 nicknamed Pok\u00e9mon.`,
|
|
727
|
-
`(If this was intentional, add a nickname to one Pok\u00e9mon that isn't the name of a Pok\u00e9mon species.)`,
|
|
728
|
-
];
|
|
729
|
-
}
|
|
730
|
-
},
|
|
731
|
-
checkCanLearn(move, species, lsetData, set) {
|
|
732
|
-
// @ts-ignore
|
|
733
|
-
if (!set.sp?.exists || !set.crossSpecies?.exists) {
|
|
734
|
-
return this.checkCanLearn(move, species, lsetData, set);
|
|
735
|
-
}
|
|
736
|
-
// @ts-ignore
|
|
737
|
-
const problem = this.checkCanLearn(move, set.sp);
|
|
738
|
-
if (!problem) return null;
|
|
739
|
-
// @ts-ignore
|
|
740
|
-
if (!set.crossMovesLeft) return problem;
|
|
741
|
-
// @ts-ignore
|
|
742
|
-
if (this.checkCanLearn(move, set.crossSpecies)) return problem;
|
|
743
|
-
// @ts-ignore
|
|
744
|
-
set.crossMovesLeft--;
|
|
745
|
-
return null;
|
|
746
|
-
},
|
|
747
|
-
validateSet(set, teamHas) {
|
|
748
|
-
const crossSpecies = this.dex.species.get(set.name);
|
|
749
|
-
let problems = this.dex.formats.get('Pokemon').onChangeSet?.call(this, set, this.format) || null;
|
|
750
|
-
if (Array.isArray(problems) && problems.length) return problems;
|
|
751
|
-
const crossNonstandard = (!this.ruleTable.has('standardnatdex') && crossSpecies.isNonstandard === 'Past') ||
|
|
752
|
-
crossSpecies.isNonstandard === 'Future';
|
|
753
|
-
const crossIsCap = !this.ruleTable.has('+pokemontag:cap') && crossSpecies.isNonstandard === 'CAP';
|
|
754
|
-
if (!crossSpecies.exists || crossNonstandard || crossIsCap) return this.validateSet(set, teamHas);
|
|
755
|
-
const species = this.dex.species.get(set.species);
|
|
756
|
-
const check = this.checkSpecies(set, species, species, {});
|
|
757
|
-
if (check) return [check];
|
|
758
|
-
const nonstandard = !this.ruleTable.has('standardnatdex') && species.isNonstandard === 'Past';
|
|
759
|
-
const isCap = !this.ruleTable.has('+pokemontag:cap') && species.isNonstandard === 'CAP';
|
|
760
|
-
if (!species.exists || nonstandard || isCap || species === crossSpecies) return this.validateSet(set, teamHas);
|
|
761
|
-
if (!species.nfe) return [`${species.name} cannot cross evolve because it doesn't evolve.`];
|
|
762
|
-
const crossIsUnreleased = (crossSpecies.tier === "Unreleased" && crossSpecies.isNonstandard === "Unobtainable");
|
|
763
|
-
if (crossSpecies.battleOnly || crossIsUnreleased || !crossSpecies.prevo) {
|
|
764
|
-
return [`${species.name} cannot cross evolve into ${crossSpecies.name} because it isn't an evolution.`];
|
|
765
|
-
}
|
|
766
|
-
if (this.ruleTable.isRestrictedSpecies(crossSpecies)) {
|
|
767
|
-
return [`${species.name} cannot cross evolve into ${crossSpecies.name} because it is banned.`];
|
|
768
|
-
}
|
|
769
|
-
const crossPrevoSpecies = this.dex.species.get(crossSpecies.prevo);
|
|
770
|
-
if (!crossPrevoSpecies.prevo !== !species.prevo) {
|
|
771
|
-
return [
|
|
772
|
-
`${species.name} cannot cross evolve into ${crossSpecies.name} because they are not consecutive evolution stages.`,
|
|
773
|
-
];
|
|
774
|
-
}
|
|
775
|
-
const item = this.dex.items.get(set.item);
|
|
776
|
-
if (item.itemUser?.length) {
|
|
777
|
-
if (!item.itemUser.includes(crossSpecies.name) || crossSpecies.name !== species.name) {
|
|
778
|
-
return [`${species.name} cannot use ${item.name} because it is cross evolved into ${crossSpecies.name}.`];
|
|
779
|
-
}
|
|
780
|
-
}
|
|
781
|
-
const ability = this.dex.abilities.get(set.ability);
|
|
782
|
-
if (!this.ruleTable.isRestricted(`ability:${ability.id}`) || Object.values(species.abilities).includes(ability.name)) {
|
|
783
|
-
set.species = crossSpecies.name;
|
|
784
|
-
}
|
|
785
|
-
|
|
786
|
-
// @ts-ignore
|
|
787
|
-
set.sp = species;
|
|
788
|
-
// @ts-ignore
|
|
789
|
-
set.crossSpecies = crossSpecies;
|
|
790
|
-
// @ts-ignore
|
|
791
|
-
set.crossMovesLeft = 2;
|
|
792
|
-
problems = this.validateSet(set, teamHas);
|
|
793
|
-
set.name = crossSpecies.name;
|
|
794
|
-
set.species = species.name;
|
|
795
|
-
return problems;
|
|
796
|
-
},
|
|
797
|
-
onModifySpecies(species, target, source, effect) {
|
|
798
|
-
if (!target) return; // chat
|
|
799
|
-
if (effect && ['imposter', 'transform'].includes(effect.id)) return;
|
|
800
|
-
if (target.set.name === target.set.species) return;
|
|
801
|
-
const crossSpecies = this.dex.species.get(target.set.name);
|
|
802
|
-
if (!crossSpecies.exists) return;
|
|
803
|
-
if (species.battleOnly || !species.nfe) return;
|
|
804
|
-
const crossIsUnreleased = (crossSpecies.tier === "Unreleased" && crossSpecies.isNonstandard === "Unobtainable");
|
|
805
|
-
if (crossSpecies.battleOnly || crossIsUnreleased || !crossSpecies.prevo) return;
|
|
806
|
-
const crossPrevoSpecies = this.dex.species.get(crossSpecies.prevo);
|
|
807
|
-
if (!crossPrevoSpecies.prevo !== !species.prevo) return;
|
|
808
|
-
|
|
809
|
-
const mixedSpecies = this.dex.deepClone(species);
|
|
810
|
-
mixedSpecies.weightkg =
|
|
811
|
-
Math.max(0.1, +(species.weightkg + crossSpecies.weightkg - crossPrevoSpecies.weightkg)).toFixed(1);
|
|
812
|
-
mixedSpecies.nfe = false;
|
|
813
|
-
mixedSpecies.evos = [];
|
|
814
|
-
mixedSpecies.eggGroups = crossSpecies.eggGroups;
|
|
815
|
-
mixedSpecies.abilities = crossSpecies.abilities;
|
|
816
|
-
mixedSpecies.bst = 0;
|
|
817
|
-
let i: StatID;
|
|
818
|
-
for (i in species.baseStats) {
|
|
819
|
-
const statChange = crossSpecies.baseStats[i] - crossPrevoSpecies.baseStats[i];
|
|
820
|
-
mixedSpecies.baseStats[i] = this.clampIntRange(species.baseStats[i] + statChange, 1, 255);
|
|
821
|
-
mixedSpecies.bst += mixedSpecies.baseStats[i];
|
|
822
|
-
}
|
|
823
|
-
if (crossSpecies.types[0] !== crossPrevoSpecies.types[0]) mixedSpecies.types[0] = crossSpecies.types[0];
|
|
824
|
-
if (crossSpecies.types[1] !== crossPrevoSpecies.types[1]) {
|
|
825
|
-
mixedSpecies.types[1] = crossSpecies.types[1] || crossSpecies.types[0];
|
|
826
|
-
}
|
|
827
|
-
if (mixedSpecies.types[0] === mixedSpecies.types[1]) mixedSpecies.types = [mixedSpecies.types[0]];
|
|
828
|
-
|
|
829
|
-
return mixedSpecies;
|
|
830
|
-
},
|
|
831
|
-
onBegin() {
|
|
832
|
-
for (const pokemon of this.getAllPokemon()) {
|
|
833
|
-
pokemon.baseSpecies = pokemon.species;
|
|
834
|
-
}
|
|
835
|
-
},
|
|
672
|
+
ruleset: ['Standard', 'Flipped Mod', 'Dynamax Clause'],
|
|
673
|
+
banlist: [
|
|
674
|
+
'Azumarill', 'Blissey', 'Calyrex-Ice', 'Calyrex-Shadow', 'Dialga', 'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kyogre',
|
|
675
|
+
'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Marshadow', 'Mewtwo', 'Necrozma-Dawn Wings', 'Necrozma-Dusk Mane', 'Palkia', 'Rayquaza',
|
|
676
|
+
'Reshiram', 'Solgaleo', 'Steelix', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Zygarde-Base',
|
|
677
|
+
'Psychic Surge', 'Psychic Terrain', 'Shell Smash',
|
|
678
|
+
],
|
|
836
679
|
},
|
|
837
680
|
|
|
838
681
|
// Other Metagames
|
|
@@ -888,15 +731,16 @@ export const Formats: FormatList = [
|
|
|
888
731
|
],
|
|
889
732
|
|
|
890
733
|
mod: 'gen8',
|
|
891
|
-
ruleset: ['
|
|
734
|
+
ruleset: ['Standard', '!Obtainable Abilities', '2 Ability Clause', 'Dynamax Clause', 'Sleep Moves Clause', '!Sleep Clause Mod'],
|
|
892
735
|
banlist: [
|
|
893
|
-
'Archeops', 'Blacephalon', 'Buzzwole', 'Calyrex-Ice', 'Calyrex-Shadow', 'Dialga', 'Dracovish', 'Dragapult', 'Dragonite', 'Eternatus',
|
|
894
|
-
'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Keldeo', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White',
|
|
895
|
-
'
|
|
896
|
-
'
|
|
897
|
-
'
|
|
898
|
-
'
|
|
899
|
-
'
|
|
736
|
+
'Archeops', 'Blacephalon', 'Buzzwole', 'Calyrex-Ice', 'Calyrex-Shadow', 'Dialga', 'Dracovish', 'Dragapult', 'Dragonite', 'Eternatus',
|
|
737
|
+
'Gengar', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Keldeo', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White',
|
|
738
|
+
'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Noivern',
|
|
739
|
+
'Palkia', 'Pheromosa', 'Rayquaza', 'Regigigas', 'Reshiram', 'Shedinja', 'Solgaleo', 'Spectrier', 'Urshifu', 'Urshifu-Rapid-Strike',
|
|
740
|
+
'Victini', 'Weavile', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Base', 'Zekrom', 'Zeraora', 'Zygarde-Base',
|
|
741
|
+
'Arena Trap', 'Comatose', 'Contrary', 'Fluffy', 'Fur Coat', 'Gorilla Tactics', 'Huge Power', 'Ice Scales', 'Illusion', 'Imposter',
|
|
742
|
+
'Innards Out', 'Intrepid Sword', 'Libero', 'Magnet Pull', 'Moody', 'Neutralizing Gas', 'Parental Bond', 'Poison Heal', 'Protean',
|
|
743
|
+
'Pure Power', 'Shadow Tag', 'Simple', 'Stakeout', 'Speed Boost', 'Water Bubble', 'Wonder Guard', 'King\'s Rock', 'Baton Pass',
|
|
900
744
|
],
|
|
901
745
|
onValidateSet(set) {
|
|
902
746
|
// Temporary fix until battle-only is implemented properly
|
|
@@ -917,15 +761,15 @@ export const Formats: FormatList = [
|
|
|
917
761
|
],
|
|
918
762
|
|
|
919
763
|
mod: 'mixandmega',
|
|
920
|
-
ruleset: ['
|
|
764
|
+
ruleset: ['Standard', 'Overflow Stat Mod', 'Dynamax Clause'],
|
|
921
765
|
banlist: [
|
|
922
766
|
'Calyrex-Shadow', 'Eternatus', 'Kyogre', 'Zacian',
|
|
923
767
|
'Beedrillite', 'Blazikenite', 'Gengarite', 'Kangaskhanite', 'Mawilite', 'Medichamite', 'Pidgeotite',
|
|
924
768
|
'Moody', 'Shadow Tag', 'Baton Pass', 'Electrify',
|
|
925
769
|
],
|
|
926
770
|
restricted: [
|
|
927
|
-
'Calyrex-Ice', 'Dialga', 'Gengar', 'Giratina', 'Groudon', 'Ho-Oh', 'Kyurem-Black', 'Kyurem-White',
|
|
928
|
-
'
|
|
771
|
+
'Calyrex-Ice', 'Dialga', 'Gengar', 'Giratina', 'Groudon', 'Ho-Oh', 'Kyurem-Black', 'Kyurem-White', 'Lugia',
|
|
772
|
+
'Lunala', 'Marshadow', 'Melmetal', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane',
|
|
929
773
|
'Palkia', 'Pheromosa', 'Rayquaza', 'Regigigas', 'Reshiram', 'Urshifu', 'Urshifu-Rapid-Strike', 'Xerneas',
|
|
930
774
|
'Yveltal', 'Zekrom', 'Zygarde-Complete',
|
|
931
775
|
],
|
|
@@ -934,8 +778,15 @@ export const Formats: FormatList = [
|
|
|
934
778
|
for (const set of team) {
|
|
935
779
|
const item = this.dex.items.get(set.item);
|
|
936
780
|
if (!item.megaStone) continue;
|
|
781
|
+
const natdex = this.ruleTable.has('standardnatdex');
|
|
782
|
+
if (natdex && item.id !== 'ultranecroziumz') continue;
|
|
937
783
|
const species = this.dex.species.get(set.species);
|
|
938
|
-
if (species.isNonstandard
|
|
784
|
+
if (species.isNonstandard && !this.ruleTable.has(`+${this.toID(species.isNonstandard)}`)) {
|
|
785
|
+
return [`${species.baseSpecies} does not exist in gen 8.`];
|
|
786
|
+
}
|
|
787
|
+
if (natdex && species.name.startsWith('Necrozma-') && item.id === 'ultranecroziumz') {
|
|
788
|
+
continue;
|
|
789
|
+
}
|
|
939
790
|
if (this.ruleTable.isRestrictedSpecies(species) || this.toID(set.ability) === 'powerconstruct') {
|
|
940
791
|
return [`${species.name} is not allowed to hold ${item.name}.`];
|
|
941
792
|
}
|
|
@@ -1005,8 +856,8 @@ export const Formats: FormatList = [
|
|
|
1005
856
|
mod: 'gen8',
|
|
1006
857
|
ruleset: ['Not Fully Evolved', 'Standard', 'Dynamax Clause'],
|
|
1007
858
|
banlist: [
|
|
1008
|
-
'Chansey', 'Doublade', 'Haunter', 'Kadabra', 'Magneton', 'Mr. Mime-Galar', 'Pawniard', 'Pikachu',
|
|
1009
|
-
'Rhydon', 'Scyther', 'Sneasel', 'Type: Null', 'Vulpix-Base', 'Arena Trap', 'Shadow Tag', 'Baton Pass',
|
|
859
|
+
'Chansey', 'Doublade', 'Golbat', 'Haunter', 'Kadabra', 'Magmar', 'Magneton', 'Mr. Mime-Galar', 'Pawniard', 'Pikachu',
|
|
860
|
+
'Porygon2', 'Rhydon', 'Scyther', 'Sneasel', 'Type: Null', 'Vulpix-Base', 'Arena Trap', 'Shadow Tag', 'Baton Pass',
|
|
1010
861
|
],
|
|
1011
862
|
},
|
|
1012
863
|
{
|
|
@@ -1029,8 +880,19 @@ export const Formats: FormatList = [
|
|
|
1029
880
|
for (const set of team) {
|
|
1030
881
|
let species = this.dex.species.get(set.species);
|
|
1031
882
|
if (typeof species.battleOnly === 'string') species = this.dex.species.get(species.battleOnly);
|
|
1032
|
-
if (
|
|
1033
|
-
|
|
883
|
+
if (set.item && this.dex.items.get(set.item).megaStone) {
|
|
884
|
+
const item = this.dex.items.get(set.item);
|
|
885
|
+
if (item.megaEvolves === species.baseSpecies) {
|
|
886
|
+
species = this.dex.species.get(item.megaStone);
|
|
887
|
+
}
|
|
888
|
+
}
|
|
889
|
+
if (this.ruleTable.has('standardnatdex')) {
|
|
890
|
+
const format = this.dex.formats.getRuleTable(this.dex.formats.get('gen8nationaldex'));
|
|
891
|
+
if (format.isBannedSpecies(species)) gods.add(species.name);
|
|
892
|
+
} else {
|
|
893
|
+
if (['ag', 'uber'].includes(this.toID(species.tier)) || this.toID(set.ability) === 'powerconstruct') {
|
|
894
|
+
gods.add(species.name);
|
|
895
|
+
}
|
|
1034
896
|
}
|
|
1035
897
|
}
|
|
1036
898
|
if (gods.size > 1) {
|
|
@@ -1042,7 +904,10 @@ export const Formats: FormatList = [
|
|
|
1042
904
|
if (source || !target?.side) return;
|
|
1043
905
|
const god = target.side.team.find(set => {
|
|
1044
906
|
let godSpecies = this.dex.species.get(set.species);
|
|
1045
|
-
const
|
|
907
|
+
const isNatDex = this.format.ruleTable?.has('standardnatdex');
|
|
908
|
+
const validator = this.dex.formats.getRuleTable(
|
|
909
|
+
this.dex.formats.get(`gen${isNatDex && this.gen < 8 ? 8 : this.gen}${isNatDex ? 'nationaldex' : 'ou'}`)
|
|
910
|
+
);
|
|
1046
911
|
if (this.toID(set.ability) === 'powerconstruct') {
|
|
1047
912
|
return true;
|
|
1048
913
|
}
|
|
@@ -1059,6 +924,9 @@ export const Formats: FormatList = [
|
|
|
1059
924
|
if (godSpecies.forme === 'Crowned') {
|
|
1060
925
|
godSpecies = this.dex.species.get(godSpecies.changesFrom || godSpecies.baseSpecies);
|
|
1061
926
|
}
|
|
927
|
+
if (typeof godSpecies.battleOnly === 'string') {
|
|
928
|
+
godSpecies = this.dex.species.get(godSpecies.battleOnly);
|
|
929
|
+
}
|
|
1062
930
|
newSpecies.bst -= newSpecies.baseStats[stat];
|
|
1063
931
|
newSpecies.baseStats[stat] = godSpecies.baseStats[stat];
|
|
1064
932
|
newSpecies.bst += newSpecies.baseStats[stat];
|
|
@@ -1173,7 +1041,7 @@ export const Formats: FormatList = [
|
|
|
1173
1041
|
mod: 'gen8bdsp',
|
|
1174
1042
|
ruleset: ['Standard', 'Same Type Clause'],
|
|
1175
1043
|
banlist: [
|
|
1176
|
-
'Dialga', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kyogre', 'Lugia', 'Mewtwo', 'Palkia', 'Rayquaza',
|
|
1044
|
+
'Arceus', 'Darkrai', 'Dialga', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kyogre', 'Lugia', 'Mewtwo', 'Palkia', 'Rayquaza', 'Shaymin-Sky',
|
|
1177
1045
|
'Arena Trap', 'Moody', 'Shadow Tag', 'Damp Rock', 'King\'s Rock', 'Razor Fang', 'Baton Pass',
|
|
1178
1046
|
],
|
|
1179
1047
|
},
|
|
@@ -1194,6 +1062,7 @@ export const Formats: FormatList = [
|
|
|
1194
1062
|
],
|
|
1195
1063
|
|
|
1196
1064
|
mod: 'gen8bdsp',
|
|
1065
|
+
searchShow: false,
|
|
1197
1066
|
ruleset: ['Flat Rules', 'Min Source Gen = 8'],
|
|
1198
1067
|
},
|
|
1199
1068
|
{
|
|
@@ -1250,6 +1119,143 @@ export const Formats: FormatList = [
|
|
|
1250
1119
|
'Zygarde-Base', 'Arena Trap', 'Moody', 'Power Construct', 'Shadow Tag', 'Baton Pass', 'Calm Mind',
|
|
1251
1120
|
],
|
|
1252
1121
|
},
|
|
1122
|
+
{
|
|
1123
|
+
name: "[Gen 8] Cross Evolution",
|
|
1124
|
+
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.`,
|
|
1125
|
+
threads: [
|
|
1126
|
+
`• <a href="https://www.smogon.com/forums/threads/3657562/">Cross Evolution</a>`,
|
|
1127
|
+
],
|
|
1128
|
+
|
|
1129
|
+
mod: 'gen8',
|
|
1130
|
+
searchShow: false,
|
|
1131
|
+
ruleset: ['Standard', 'Overflow Stat Mod', 'Dynamax Clause', '2 Ability Clause'],
|
|
1132
|
+
banlist: ['Corsola-Galar', 'Sneasel', 'Type: Null', 'Arena Trap', 'Ice Scales', 'Moody', 'King\'s Rock', 'Baton Pass'],
|
|
1133
|
+
restricted: ['Chansey', 'Lunala', 'Shedinja', 'Solgaleo', 'Gorilla Tactics', 'Huge Power', 'Pure Power', 'Shadow Tag'],
|
|
1134
|
+
onValidateTeam(team) {
|
|
1135
|
+
const names = new Set<ID>();
|
|
1136
|
+
for (const set of team) {
|
|
1137
|
+
const name = set.name;
|
|
1138
|
+
if (names.has(this.dex.toID(name))) {
|
|
1139
|
+
return [
|
|
1140
|
+
`Your Pok\u00e9mon must have different nicknames.`,
|
|
1141
|
+
`(You have more than one Pok\u00e9mon named '${name}')`,
|
|
1142
|
+
];
|
|
1143
|
+
}
|
|
1144
|
+
names.add(this.dex.toID(name));
|
|
1145
|
+
}
|
|
1146
|
+
if (!names.size) {
|
|
1147
|
+
return [
|
|
1148
|
+
`${this.format.name} works using nicknames; your team has 0 nicknamed Pok\u00e9mon.`,
|
|
1149
|
+
`(If this was intentional, add a nickname to one Pok\u00e9mon that isn't the name of a Pok\u00e9mon species.)`,
|
|
1150
|
+
];
|
|
1151
|
+
}
|
|
1152
|
+
},
|
|
1153
|
+
checkCanLearn(move, species, lsetData, set) {
|
|
1154
|
+
// @ts-ignore
|
|
1155
|
+
if (!set.sp?.exists || !set.crossSpecies?.exists) {
|
|
1156
|
+
return this.checkCanLearn(move, species, lsetData, set);
|
|
1157
|
+
}
|
|
1158
|
+
// @ts-ignore
|
|
1159
|
+
const problem = this.checkCanLearn(move, set.sp);
|
|
1160
|
+
if (!problem) return null;
|
|
1161
|
+
// @ts-ignore
|
|
1162
|
+
if (!set.crossMovesLeft) return problem;
|
|
1163
|
+
// @ts-ignore
|
|
1164
|
+
if (this.checkCanLearn(move, set.crossSpecies)) return problem;
|
|
1165
|
+
// @ts-ignore
|
|
1166
|
+
set.crossMovesLeft--;
|
|
1167
|
+
return null;
|
|
1168
|
+
},
|
|
1169
|
+
validateSet(set, teamHas) {
|
|
1170
|
+
const crossSpecies = this.dex.species.get(set.name);
|
|
1171
|
+
let problems = this.dex.formats.get('Pokemon').onChangeSet?.call(this, set, this.format) || null;
|
|
1172
|
+
if (Array.isArray(problems) && problems.length) return problems;
|
|
1173
|
+
const crossNonstandard = (!this.ruleTable.has('standardnatdex') && crossSpecies.isNonstandard === 'Past') ||
|
|
1174
|
+
crossSpecies.isNonstandard === 'Future';
|
|
1175
|
+
const crossIsCap = !this.ruleTable.has('+pokemontag:cap') && crossSpecies.isNonstandard === 'CAP';
|
|
1176
|
+
if (!crossSpecies.exists || crossNonstandard || crossIsCap) return this.validateSet(set, teamHas);
|
|
1177
|
+
const species = this.dex.species.get(set.species);
|
|
1178
|
+
const check = this.checkSpecies(set, species, species, {});
|
|
1179
|
+
if (check) return [check];
|
|
1180
|
+
const nonstandard = !this.ruleTable.has('standardnatdex') && species.isNonstandard === 'Past';
|
|
1181
|
+
const isCap = !this.ruleTable.has('+pokemontag:cap') && species.isNonstandard === 'CAP';
|
|
1182
|
+
if (!species.exists || nonstandard || isCap || species === crossSpecies) return this.validateSet(set, teamHas);
|
|
1183
|
+
if (!species.nfe) return [`${species.name} cannot cross evolve because it doesn't evolve.`];
|
|
1184
|
+
const crossIsUnreleased = (crossSpecies.tier === "Unreleased" && crossSpecies.isNonstandard === "Unobtainable");
|
|
1185
|
+
if (crossSpecies.battleOnly || crossIsUnreleased || !crossSpecies.prevo) {
|
|
1186
|
+
return [`${species.name} cannot cross evolve into ${crossSpecies.name} because it isn't an evolution.`];
|
|
1187
|
+
}
|
|
1188
|
+
if (this.ruleTable.isRestrictedSpecies(crossSpecies)) {
|
|
1189
|
+
return [`${species.name} cannot cross evolve into ${crossSpecies.name} because it is banned.`];
|
|
1190
|
+
}
|
|
1191
|
+
const crossPrevoSpecies = this.dex.species.get(crossSpecies.prevo);
|
|
1192
|
+
if (!crossPrevoSpecies.prevo !== !species.prevo) {
|
|
1193
|
+
return [
|
|
1194
|
+
`${species.name} cannot cross evolve into ${crossSpecies.name} because they are not consecutive evolution stages.`,
|
|
1195
|
+
];
|
|
1196
|
+
}
|
|
1197
|
+
const item = this.dex.items.get(set.item);
|
|
1198
|
+
if (item.itemUser?.length) {
|
|
1199
|
+
if (!item.itemUser.includes(crossSpecies.name) || crossSpecies.name !== species.name) {
|
|
1200
|
+
return [`${species.name} cannot use ${item.name} because it is cross evolved into ${crossSpecies.name}.`];
|
|
1201
|
+
}
|
|
1202
|
+
}
|
|
1203
|
+
const ability = this.dex.abilities.get(set.ability);
|
|
1204
|
+
if (!this.ruleTable.isRestricted(`ability:${ability.id}`) || Object.values(species.abilities).includes(ability.name)) {
|
|
1205
|
+
set.species = crossSpecies.name;
|
|
1206
|
+
}
|
|
1207
|
+
|
|
1208
|
+
// @ts-ignore
|
|
1209
|
+
set.sp = species;
|
|
1210
|
+
// @ts-ignore
|
|
1211
|
+
set.crossSpecies = crossSpecies;
|
|
1212
|
+
// @ts-ignore
|
|
1213
|
+
set.crossMovesLeft = 2;
|
|
1214
|
+
problems = this.validateSet(set, teamHas);
|
|
1215
|
+
set.name = crossSpecies.name;
|
|
1216
|
+
set.species = species.name;
|
|
1217
|
+
return problems;
|
|
1218
|
+
},
|
|
1219
|
+
onModifySpecies(species, target, source, effect) {
|
|
1220
|
+
if (!target) return; // chat
|
|
1221
|
+
if (effect && ['imposter', 'transform'].includes(effect.id)) return;
|
|
1222
|
+
if (target.set.name === target.set.species) return;
|
|
1223
|
+
const crossSpecies = this.dex.species.get(target.set.name);
|
|
1224
|
+
if (!crossSpecies.exists) return;
|
|
1225
|
+
if (species.battleOnly || !species.nfe) return;
|
|
1226
|
+
const crossIsUnreleased = (crossSpecies.tier === "Unreleased" && crossSpecies.isNonstandard === "Unobtainable");
|
|
1227
|
+
if (crossSpecies.battleOnly || crossIsUnreleased || !crossSpecies.prevo) return;
|
|
1228
|
+
const crossPrevoSpecies = this.dex.species.get(crossSpecies.prevo);
|
|
1229
|
+
if (!crossPrevoSpecies.prevo !== !species.prevo) return;
|
|
1230
|
+
|
|
1231
|
+
const mixedSpecies = this.dex.deepClone(species);
|
|
1232
|
+
mixedSpecies.weightkg =
|
|
1233
|
+
Math.max(0.1, +(species.weightkg + crossSpecies.weightkg - crossPrevoSpecies.weightkg)).toFixed(1);
|
|
1234
|
+
mixedSpecies.nfe = false;
|
|
1235
|
+
mixedSpecies.evos = [];
|
|
1236
|
+
mixedSpecies.eggGroups = crossSpecies.eggGroups;
|
|
1237
|
+
mixedSpecies.abilities = crossSpecies.abilities;
|
|
1238
|
+
mixedSpecies.bst = 0;
|
|
1239
|
+
let i: StatID;
|
|
1240
|
+
for (i in species.baseStats) {
|
|
1241
|
+
const statChange = crossSpecies.baseStats[i] - crossPrevoSpecies.baseStats[i];
|
|
1242
|
+
mixedSpecies.baseStats[i] = this.clampIntRange(species.baseStats[i] + statChange, 1, 255);
|
|
1243
|
+
mixedSpecies.bst += mixedSpecies.baseStats[i];
|
|
1244
|
+
}
|
|
1245
|
+
if (crossSpecies.types[0] !== crossPrevoSpecies.types[0]) mixedSpecies.types[0] = crossSpecies.types[0];
|
|
1246
|
+
if (crossSpecies.types[1] !== crossPrevoSpecies.types[1]) {
|
|
1247
|
+
mixedSpecies.types[1] = crossSpecies.types[1] || crossSpecies.types[0];
|
|
1248
|
+
}
|
|
1249
|
+
if (mixedSpecies.types[0] === mixedSpecies.types[1]) mixedSpecies.types = [mixedSpecies.types[0]];
|
|
1250
|
+
|
|
1251
|
+
return mixedSpecies;
|
|
1252
|
+
},
|
|
1253
|
+
onBegin() {
|
|
1254
|
+
for (const pokemon of this.getAllPokemon()) {
|
|
1255
|
+
pokemon.baseSpecies = pokemon.species;
|
|
1256
|
+
}
|
|
1257
|
+
},
|
|
1258
|
+
},
|
|
1253
1259
|
{
|
|
1254
1260
|
name: "[Gen 8] Inheritance",
|
|
1255
1261
|
desc: `Pokémon may use the ability and moves of another, as long as they forfeit their own learnset.`,
|
|
@@ -1772,6 +1778,67 @@ export const Formats: FormatList = [
|
|
|
1772
1778
|
pokemon.m.innates = undefined;
|
|
1773
1779
|
},
|
|
1774
1780
|
},
|
|
1781
|
+
{
|
|
1782
|
+
name: "[Gen 8] Shared Power",
|
|
1783
|
+
desc: `Once a Pokémon switches in, its ability is shared with the rest of the team.`,
|
|
1784
|
+
threads: [
|
|
1785
|
+
`• <a href="https://www.smogon.com/forums/threads/3660877/">Shared Power</a>`,
|
|
1786
|
+
],
|
|
1787
|
+
|
|
1788
|
+
mod: 'sharedpower',
|
|
1789
|
+
searchShow: false,
|
|
1790
|
+
ruleset: ['Standard', 'Dynamax Clause'],
|
|
1791
|
+
banlist: [
|
|
1792
|
+
'Calyrex-Ice', 'Calyrex-Shadow', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Eternatus', 'Genesect', 'Giratina',
|
|
1793
|
+
'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna',
|
|
1794
|
+
'Marshadow', 'Melmetal', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia',
|
|
1795
|
+
'Pheromosa', 'Rayquaza', 'Reshiram', 'Shedinja', 'Solgaleo', 'Urshifu-Base', 'Urshifu-Rapid-Strike',
|
|
1796
|
+
'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom',
|
|
1797
|
+
'Arena Trap', 'Contrary', 'Drizzle ++ Swift Swim', 'Drought ++ Chlorophyll', 'Electric Surge ++ Surge Surfer',
|
|
1798
|
+
'Fur Coat', 'Guts', 'Harvest', 'Huge Power', 'Imposter', 'Innards Out', 'Libero', 'Magic Bounce', 'Magic Guard',
|
|
1799
|
+
'Magnet Pull', 'Mold Breaker', 'Moody', 'Neutralizing Gas', 'Power Construct', 'Queenly Majesty', 'Quick Draw',
|
|
1800
|
+
'Regenerator', 'Sand Rush', 'Sand Veil', 'Shadow Tag', 'Simple', 'Snow Cloak', 'Snow Warning ++ Slush Rush',
|
|
1801
|
+
'Speed Boost', 'Stakeout', 'Steelworker ++ Steely Spirit', 'Stench', 'Tinted Lens', 'Triage', 'Unaware',
|
|
1802
|
+
'Unburden', 'Water Bubble', 'King\'s Rock', 'Baton Pass',
|
|
1803
|
+
],
|
|
1804
|
+
getSharedPower(pokemon) {
|
|
1805
|
+
const sharedPower = new Set<string>();
|
|
1806
|
+
for (const ally of pokemon.side.pokemon) {
|
|
1807
|
+
if (ally.previouslySwitchedIn > 0) {
|
|
1808
|
+
if (pokemon.battle.dex.currentMod !== 'sharedpower' && ['trace', 'mirrorarmor'].includes(ally.baseAbility)) {
|
|
1809
|
+
sharedPower.add('noability');
|
|
1810
|
+
continue;
|
|
1811
|
+
}
|
|
1812
|
+
sharedPower.add(ally.baseAbility);
|
|
1813
|
+
}
|
|
1814
|
+
}
|
|
1815
|
+
sharedPower.delete(pokemon.baseAbility);
|
|
1816
|
+
return sharedPower;
|
|
1817
|
+
},
|
|
1818
|
+
onBeforeSwitchIn(pokemon) {
|
|
1819
|
+
let format = this.format;
|
|
1820
|
+
if (!format.getSharedPower) format = this.dex.formats.get('gen8sharedpower');
|
|
1821
|
+
for (const ability of format.getSharedPower!(pokemon)) {
|
|
1822
|
+
const effect = 'ability:' + ability;
|
|
1823
|
+
pokemon.volatiles[effect] = {id: this.toID(effect), target: pokemon};
|
|
1824
|
+
if (!pokemon.m.abils) pokemon.m.abils = [];
|
|
1825
|
+
if (!pokemon.m.abils.includes(effect)) pokemon.m.abils.push(effect);
|
|
1826
|
+
}
|
|
1827
|
+
},
|
|
1828
|
+
onSwitchInPriority: 2,
|
|
1829
|
+
onSwitchIn(pokemon) {
|
|
1830
|
+
let format = this.format;
|
|
1831
|
+
if (!format.getSharedPower) format = this.dex.formats.get('gen8sharedpower');
|
|
1832
|
+
for (const ability of format.getSharedPower!(pokemon)) {
|
|
1833
|
+
if (ability === 'noability') {
|
|
1834
|
+
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.`);
|
|
1835
|
+
}
|
|
1836
|
+
const effect = 'ability:' + ability;
|
|
1837
|
+
delete pokemon.volatiles[effect];
|
|
1838
|
+
pokemon.addVolatile(effect);
|
|
1839
|
+
}
|
|
1840
|
+
},
|
|
1841
|
+
},
|
|
1775
1842
|
{
|
|
1776
1843
|
name: "[Gen 8] Trademarked",
|
|
1777
1844
|
desc: `Sacrifice your Pokémon's ability for a status move that activates on switch-in.`,
|
|
@@ -2348,45 +2415,40 @@ export const Formats: FormatList = [
|
|
|
2348
2415
|
column: 3,
|
|
2349
2416
|
},
|
|
2350
2417
|
{
|
|
2351
|
-
name: "[Gen
|
|
2418
|
+
name: "[Gen 5] UU",
|
|
2352
2419
|
threads: [
|
|
2353
|
-
`• <a href="https://www.smogon.com/forums/threads/
|
|
2354
|
-
`• <a href="https://www.smogon.com/forums/
|
|
2420
|
+
`• <a href="https://www.smogon.com/forums/threads/3474024/">BW2 UU Viability Rankings</a>`,
|
|
2421
|
+
`• <a href="https://www.smogon.com/forums/posts/6431094/">BW2 Sample Teams</a>`,
|
|
2355
2422
|
],
|
|
2356
2423
|
|
|
2357
|
-
mod: '
|
|
2424
|
+
mod: 'gen5',
|
|
2358
2425
|
// searchShow: false,
|
|
2359
|
-
ruleset: ['
|
|
2360
|
-
banlist: ['OU', 'UUBL'],
|
|
2361
|
-
unbanlist: ['Arena Trap', 'Swagger'],
|
|
2426
|
+
ruleset: ['Standard', 'Evasion Abilities Clause', 'Swagger Clause', 'Sleep Clause Mod'],
|
|
2427
|
+
banlist: ['Uber', 'OU', 'UUBL', 'Arena Trap', 'Drought', 'Sand Stream', 'Snow Warning', 'Prankster + Assist', 'Prankster + Copycat', 'Baton Pass'],
|
|
2362
2428
|
},
|
|
2363
2429
|
{
|
|
2364
|
-
name: "[Gen
|
|
2430
|
+
name: "[Gen 5] NU",
|
|
2365
2431
|
threads: [
|
|
2366
|
-
`• <a href="https://www.smogon.com/
|
|
2367
|
-
`• <a href="https://www.smogon.com/forums/threads/
|
|
2368
|
-
`• <a href="https://www.smogon.com/forums/threads/3621440/">USM LC Viability Rankings</a>`,
|
|
2432
|
+
`• <a href="https://www.smogon.com/forums/posts/6431094/">BW2 Sample Teams</a>`,
|
|
2433
|
+
`• <a href="https://www.smogon.com/forums/threads/3484121/">BW2 NU Viability Rankings</a>`,
|
|
2369
2434
|
],
|
|
2370
2435
|
|
|
2371
|
-
mod: '
|
|
2436
|
+
mod: 'gen5',
|
|
2372
2437
|
// searchShow: false,
|
|
2373
|
-
ruleset: ['
|
|
2374
|
-
banlist: [
|
|
2375
|
-
'Aipom', 'Cutiefly', 'Drifloon', 'Gligar', 'Gothita', 'Meditite', 'Misdreavus', 'Murkrow', 'Porygon',
|
|
2376
|
-
'Scyther', 'Sneasel', 'Swirlix', 'Tangela', 'Trapinch', 'Vulpix-Base', 'Wingull', 'Yanma',
|
|
2377
|
-
'Eevium Z', 'Baton Pass', 'Dragon Rage', 'Sonic Boom', 'Sticky Web',
|
|
2378
|
-
],
|
|
2438
|
+
ruleset: ['[Gen 5] RU', '!Sleep Moves Clause', 'Sleep Clause Mod'],
|
|
2439
|
+
banlist: ['RU', 'NUBL', 'Assist', 'Copycat'],
|
|
2379
2440
|
},
|
|
2380
2441
|
{
|
|
2381
|
-
name: "[Gen
|
|
2442
|
+
name: "[Gen 6] PU",
|
|
2382
2443
|
threads: [
|
|
2383
|
-
`• <a href="https://www.smogon.com/
|
|
2444
|
+
`• <a href="https://www.smogon.com/dex/xy/tags/pu/">ORAS PU Banlist</a>`,
|
|
2445
|
+
`• <a href="https://www.smogon.com/forums/threads/3528743/">ORAS PU Viability Rankings</a>`,
|
|
2384
2446
|
],
|
|
2385
2447
|
|
|
2386
|
-
mod: '
|
|
2448
|
+
mod: 'gen6',
|
|
2387
2449
|
// searchShow: false,
|
|
2388
|
-
ruleset: ['[Gen
|
|
2389
|
-
banlist: ['NU', 'PUBL'],
|
|
2450
|
+
ruleset: ['[Gen 6] NU'],
|
|
2451
|
+
banlist: ['NU', 'PUBL', 'Chatter'],
|
|
2390
2452
|
},
|
|
2391
2453
|
|
|
2392
2454
|
// Past Gens OU
|
|
@@ -2679,6 +2741,23 @@ export const Formats: FormatList = [
|
|
|
2679
2741
|
ruleset: ['[Gen 7] NU'],
|
|
2680
2742
|
banlist: ['NU', 'PUBL'],
|
|
2681
2743
|
},
|
|
2744
|
+
{
|
|
2745
|
+
name: "[Gen 7] LC",
|
|
2746
|
+
threads: [
|
|
2747
|
+
`• <a href="https://www.smogon.com/dex/sm/formats/lc/">USM LC Banlist</a>`,
|
|
2748
|
+
`• <a href="https://www.smogon.com/forums/threads/3639319/">USM LC Sample Teams</a>`,
|
|
2749
|
+
`• <a href="https://www.smogon.com/forums/threads/3621440/">USM LC Viability Rankings</a>`,
|
|
2750
|
+
],
|
|
2751
|
+
|
|
2752
|
+
mod: 'gen7',
|
|
2753
|
+
searchShow: false,
|
|
2754
|
+
ruleset: ['Little Cup', 'Standard', 'Swagger Clause'],
|
|
2755
|
+
banlist: [
|
|
2756
|
+
'Aipom', 'Cutiefly', 'Drifloon', 'Gligar', 'Gothita', 'Meditite', 'Misdreavus', 'Murkrow', 'Porygon',
|
|
2757
|
+
'Scyther', 'Sneasel', 'Swirlix', 'Tangela', 'Trapinch', 'Vulpix-Base', 'Wingull', 'Yanma',
|
|
2758
|
+
'Eevium Z', 'Baton Pass', 'Dragon Rage', 'Sonic Boom', 'Sticky Web',
|
|
2759
|
+
],
|
|
2760
|
+
},
|
|
2682
2761
|
{
|
|
2683
2762
|
name: "[Gen 7] Monotype",
|
|
2684
2763
|
desc: `All the Pokémon on a team must share a type.`,
|
|
@@ -2966,18 +3045,6 @@ export const Formats: FormatList = [
|
|
|
2966
3045
|
ruleset: ['[Gen 6] RU'],
|
|
2967
3046
|
banlist: ['RU', 'NUBL'],
|
|
2968
3047
|
},
|
|
2969
|
-
{
|
|
2970
|
-
name: "[Gen 6] PU",
|
|
2971
|
-
threads: [
|
|
2972
|
-
`• <a href="https://www.smogon.com/dex/xy/tags/pu/">ORAS PU Banlist</a>`,
|
|
2973
|
-
`• <a href="https://www.smogon.com/forums/threads/3528743/">ORAS PU Viability Rankings</a>`,
|
|
2974
|
-
],
|
|
2975
|
-
|
|
2976
|
-
mod: 'gen6',
|
|
2977
|
-
searchShow: false,
|
|
2978
|
-
ruleset: ['[Gen 6] NU'],
|
|
2979
|
-
banlist: ['NU', 'PUBL', 'Chatter'],
|
|
2980
|
-
},
|
|
2981
3048
|
{
|
|
2982
3049
|
name: "[Gen 6] LC",
|
|
2983
3050
|
threads: [
|
|
@@ -3206,18 +3273,6 @@ export const Formats: FormatList = [
|
|
|
3206
3273
|
searchShow: false,
|
|
3207
3274
|
ruleset: ['Standard', 'Sleep Clause Mod'],
|
|
3208
3275
|
},
|
|
3209
|
-
{
|
|
3210
|
-
name: "[Gen 5] UU",
|
|
3211
|
-
threads: [
|
|
3212
|
-
`• <a href="https://www.smogon.com/forums/threads/3474024/">BW2 UU Viability Rankings</a>`,
|
|
3213
|
-
`• <a href="https://www.smogon.com/forums/posts/6431094/">BW2 Sample Teams</a>`,
|
|
3214
|
-
],
|
|
3215
|
-
|
|
3216
|
-
mod: 'gen5',
|
|
3217
|
-
searchShow: false,
|
|
3218
|
-
ruleset: ['Standard', 'Evasion Abilities Clause', 'Swagger Clause', 'Sleep Clause Mod'],
|
|
3219
|
-
banlist: ['Uber', 'OU', 'UUBL', 'Arena Trap', 'Drought', 'Sand Stream', 'Snow Warning', 'Prankster + Assist', 'Prankster + Copycat', 'Baton Pass'],
|
|
3220
|
-
},
|
|
3221
3276
|
{
|
|
3222
3277
|
name: "[Gen 5] RU",
|
|
3223
3278
|
threads: [
|
|
@@ -3232,16 +3287,15 @@ export const Formats: FormatList = [
|
|
|
3232
3287
|
unbanlist: ['Prankster + Assist', 'Prankster + Copycat', 'Baton Pass'],
|
|
3233
3288
|
},
|
|
3234
3289
|
{
|
|
3235
|
-
name: "[Gen 5]
|
|
3290
|
+
name: "[Gen 5] PU",
|
|
3236
3291
|
threads: [
|
|
3237
|
-
`• <a href="https://www.smogon.com/forums/posts/
|
|
3238
|
-
`• <a href="https://www.smogon.com/forums/threads/3484121/">BW2 NU Viability Rankings</a>`,
|
|
3292
|
+
`• <a href="https://www.smogon.com/forums/posts/7326932/">BW2 PU</a>`,
|
|
3239
3293
|
],
|
|
3240
3294
|
|
|
3241
3295
|
mod: 'gen5',
|
|
3242
3296
|
searchShow: false,
|
|
3243
|
-
ruleset: ['[Gen 5]
|
|
3244
|
-
banlist: ['
|
|
3297
|
+
ruleset: ['[Gen 5] NU', 'Sleep Moves Clause'],
|
|
3298
|
+
banlist: ['NU', 'PUBL'],
|
|
3245
3299
|
},
|
|
3246
3300
|
{
|
|
3247
3301
|
name: "[Gen 5] LC",
|
|
@@ -3332,7 +3386,7 @@ export const Formats: FormatList = [
|
|
|
3332
3386
|
gameType: 'doubles',
|
|
3333
3387
|
searchShow: false,
|
|
3334
3388
|
ruleset: ['Flat Rules'],
|
|
3335
|
-
banlist: ['Dark Void', 'Sky Drop', 'Soul Dew'],
|
|
3389
|
+
banlist: ['Chatot', 'Dark Void', 'Sky Drop', 'Soul Dew'],
|
|
3336
3390
|
},
|
|
3337
3391
|
{
|
|
3338
3392
|
name: "[Gen 5] VGC 2012",
|
|
@@ -3393,6 +3447,19 @@ export const Formats: FormatList = [
|
|
|
3393
3447
|
ruleset: ['Standard'],
|
|
3394
3448
|
banlist: ['AG'],
|
|
3395
3449
|
},
|
|
3450
|
+
{
|
|
3451
|
+
name: "[Gen 4] UU",
|
|
3452
|
+
threads: [
|
|
3453
|
+
`• <a href="https://www.smogon.com/forums/threads/3532624/">DPP UU Metagame Discussion</a>`,
|
|
3454
|
+
`• <a href="https://www.smogon.com/forums/threads/3503638/">DPP UU Viability Rankings</a>`,
|
|
3455
|
+
],
|
|
3456
|
+
|
|
3457
|
+
mod: 'gen4',
|
|
3458
|
+
searchShow: false,
|
|
3459
|
+
ruleset: ['[Gen 4] OU'],
|
|
3460
|
+
banlist: ['OU', 'UUBL'],
|
|
3461
|
+
unbanlist: ['Arena Trap', 'Swagger'],
|
|
3462
|
+
},
|
|
3396
3463
|
{
|
|
3397
3464
|
name: "[Gen 4] NU",
|
|
3398
3465
|
threads: [
|
|
@@ -3507,7 +3574,7 @@ export const Formats: FormatList = [
|
|
|
3507
3574
|
gameType: 'doubles',
|
|
3508
3575
|
searchShow: false,
|
|
3509
3576
|
ruleset: ['Flat Rules', '! Adjust Level Down', 'Max Level = 50', 'Max Team Size = 4'],
|
|
3510
|
-
banlist: ['
|
|
3577
|
+
banlist: ['Tyranitar', 'Rotom', 'Judgment', 'Soul Dew'],
|
|
3511
3578
|
},
|
|
3512
3579
|
{
|
|
3513
3580
|
name: "[Gen 4] Doubles Custom Game",
|