@pkmn/sim 0.5.19 → 0.5.22
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 +354 -294
- package/build/config/formats.js.map +1 -1
- package/build/data/abilities.js +1 -3
- package/build/data/abilities.js.map +1 -1
- package/build/data/aliases.js +2 -2
- package/build/data/aliases.js.map +1 -1
- package/build/data/conditions.js +4 -1
- package/build/data/conditions.js.map +1 -1
- package/build/data/formats-data.js +16 -12
- package/build/data/formats-data.js.map +1 -1
- package/build/data/learnsets.js +29 -0
- package/build/data/learnsets.js.map +1 -1
- package/build/data/mods/gen1/conditions.js +7 -0
- package/build/data/mods/gen1/conditions.js.map +1 -1
- package/build/data/mods/gen1/formats-data.js +3 -3
- package/build/data/mods/gen1/formats-data.js.map +1 -1
- package/build/data/mods/gen1/moves.js +0 -6
- package/build/data/mods/gen1/moves.js.map +1 -1
- package/build/data/mods/gen2/conditions.js +3 -0
- package/build/data/mods/gen2/conditions.js.map +1 -1
- package/build/data/mods/gen2/learnsets.js +2 -2
- package/build/data/mods/gen2/learnsets.js.map +1 -1
- package/build/data/mods/gen2/scripts.js +16 -0
- package/build/data/mods/gen2/scripts.js.map +1 -1
- package/build/data/mods/gen3/conditions.js +3 -0
- package/build/data/mods/gen3/conditions.js.map +1 -1
- package/build/data/mods/gen4/abilities.js +1 -1
- package/build/data/mods/gen4/abilities.js.map +1 -1
- package/build/data/mods/gen4/conditions.js +3 -0
- package/build/data/mods/gen4/conditions.js.map +1 -1
- package/build/data/mods/gen4/formats-data.js +1 -1
- package/build/data/mods/gen4/formats-data.js.map +1 -1
- package/build/data/mods/gen4/moves.js +9 -2
- package/build/data/mods/gen4/moves.js.map +1 -1
- package/build/data/mods/gen5/moves.js +4 -7
- package/build/data/mods/gen5/moves.js.map +1 -1
- package/build/data/mods/gen5/pokedex.js +24 -0
- package/build/data/mods/gen5/pokedex.js.map +1 -1
- package/build/data/mods/gen6/formats-data.js +1 -1
- package/build/data/mods/gen6/formats-data.js.map +1 -1
- package/build/data/mods/gen6/learnsets.js +0 -75
- package/build/data/mods/gen6/learnsets.js.map +1 -1
- package/build/data/mods/gen7/abilities.js +8 -0
- package/build/data/mods/gen7/abilities.js.map +1 -1
- package/build/data/mods/gen7/moves.js +2 -2
- package/build/data/mods/gen7/moves.js.map +1 -1
- package/build/data/moves.js +8 -3
- package/build/data/moves.js.map +1 -1
- package/build/data/pokedex.js +12 -0
- package/build/data/pokedex.js.map +1 -1
- package/build/data/rulesets.js +68 -0
- package/build/data/rulesets.js.map +1 -1
- package/build/data/tags.js +2 -2
- package/build/data/tags.js.map +1 -1
- package/build/sim/battle.js +1 -7
- package/build/sim/battle.js.map +1 -1
- package/build/sim/pokemon.js +8 -2
- package/build/sim/pokemon.js.map +1 -1
- package/build/sim/side.js +21 -0
- package/build/sim/side.js.map +1 -1
- package/config/formats.ts +346 -291
- package/data/abilities.ts +1 -3
- package/data/aliases.ts +2 -2
- package/data/conditions.ts +5 -1
- package/data/formats-data.ts +16 -12
- package/data/learnsets.ts +29 -0
- package/data/mods/gen1/conditions.ts +8 -0
- package/data/mods/gen1/formats-data.ts +3 -3
- package/data/mods/gen1/moves.ts +0 -4
- package/data/mods/gen2/conditions.ts +4 -0
- package/data/mods/gen2/learnsets.ts +2 -2
- package/data/mods/gen2/scripts.ts +16 -0
- package/data/mods/gen3/conditions.ts +4 -0
- package/data/mods/gen4/abilities.ts +1 -1
- package/data/mods/gen4/conditions.ts +4 -0
- package/data/mods/gen4/formats-data.ts +1 -1
- package/data/mods/gen4/moves.ts +9 -2
- package/data/mods/gen5/moves.ts +4 -7
- package/data/mods/gen5/pokedex.ts +24 -0
- package/data/mods/gen6/formats-data.ts +1 -1
- package/data/mods/gen6/learnsets.ts +0 -75
- package/data/mods/gen7/abilities.ts +8 -0
- package/data/mods/gen7/moves.ts +2 -2
- package/data/moves.ts +8 -3
- package/data/pokedex.ts +12 -0
- package/data/rulesets.ts +64 -0
- package/data/tags.ts +2 -2
- package/package.json +1 -1
- package/sim/battle.ts +1 -7
- package/sim/pokemon.ts +7 -2
- package/sim/side.ts +20 -0
package/config/formats.ts
CHANGED
|
@@ -176,7 +176,7 @@ export const Formats: FormatList = [
|
|
|
176
176
|
desc: `All the Pokémon on a team must share a type.`,
|
|
177
177
|
threads: [
|
|
178
178
|
`• <a href="https://www.smogon.com/forums/threads/3672167/">Monotype Metagame Discussion</a>`,
|
|
179
|
-
`• <a href="https://www.smogon.com/forums/threads/
|
|
179
|
+
`• <a href="https://www.smogon.com/forums/threads/3702647/">Monotype Sample Teams</a>`,
|
|
180
180
|
`• <a href="https://www.smogon.com/forums/threads/3673165">Monotype Viability Rankings</a>`,
|
|
181
181
|
],
|
|
182
182
|
|
|
@@ -235,8 +235,8 @@ export const Formats: FormatList = [
|
|
|
235
235
|
mod: 'gen8',
|
|
236
236
|
ruleset: ['[Gen 8] PU'],
|
|
237
237
|
banlist: [
|
|
238
|
-
'PU', 'Arctovish', 'Aurorus', 'Basculin', 'Centiskorch', 'Drampa', 'Exeggutor-Alola', 'Gallade', 'Haunter', 'Magmortar', 'Magneton', '
|
|
239
|
-
'Rotom-Frost', 'Turtonator', 'Vanilluxe', 'Vikavolt', 'Silvally-Dragon', 'Silvally-Ground', 'Sneasel', 'Damp Rock', 'Grassy Seed',
|
|
238
|
+
'PU', 'Arctovish', 'Aurorus', 'Basculin', 'Centiskorch', 'Drampa', 'Exeggutor-Alola', 'Gallade', 'Haunter', 'Magmortar', 'Magneton', 'Malamar',
|
|
239
|
+
'Omastar', 'Rotom-Frost', 'Turtonator', 'Vanilluxe', 'Vikavolt', 'Silvally-Dragon', 'Silvally-Ground', 'Sneasel', 'Damp Rock', 'Grassy Seed',
|
|
240
240
|
],
|
|
241
241
|
},
|
|
242
242
|
{
|
|
@@ -251,8 +251,8 @@ export const Formats: FormatList = [
|
|
|
251
251
|
banlist: [
|
|
252
252
|
// LC OU
|
|
253
253
|
'Abra', 'Carvanha', 'Diglett-Base', 'Dwebble', 'Ferroseed', 'Foongus', 'Frillish', 'Grookey', 'Koffing',
|
|
254
|
-
'Larvesta', 'Magby', 'Magnemite', 'Mareanie', 'Mienfoo', 'Mudbray', '
|
|
255
|
-
'Ponyta
|
|
254
|
+
'Larvesta', 'Magby', 'Magnemite', 'Mareanie', 'Mienfoo', 'Mudbray', 'Natu', 'Onix', 'Pawniard',
|
|
255
|
+
'Ponyta-Base', 'Porygon', 'Slowpoke-Base', 'Staryu', 'Timburr', 'Trapinch', 'Tyrunt',
|
|
256
256
|
// LC UUBL
|
|
257
257
|
'Archen', 'Farfetch\u2019d-Galar', 'Scorbunny', 'Shellder', 'Wingull',
|
|
258
258
|
],
|
|
@@ -404,10 +404,10 @@ export const Formats: FormatList = [
|
|
|
404
404
|
'Standard Doubles', 'Accuracy Moves Clause', 'Dynamax Clause', 'Sleep Clause Mod',
|
|
405
405
|
],
|
|
406
406
|
banlist: [
|
|
407
|
-
'Calyrex-Ice', 'Calyrex-Shadow', 'Dialga', 'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Jirachi', 'Kyogre',
|
|
408
|
-
'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Rayquaza',
|
|
409
|
-
'Solgaleo', 'Tornadus-Base', 'Urshifu-Base', 'Urshifu-Rapid-Strike', 'Whimsicott', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned',
|
|
410
|
-
'Zamazenta-Crowned', 'Zekrom', 'Moody', 'Power Construct', 'Focus Sash', 'Ally Switch', 'Final Gambit', 'Perish Song', 'Swagger',
|
|
407
|
+
'Calyrex-Ice', 'Calyrex-Shadow', 'Cottonee', 'Dialga', 'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Jirachi', 'Kyogre',
|
|
408
|
+
'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Rayquaza',
|
|
409
|
+
'Reshiram', 'Solgaleo', 'Tornadus-Base', 'Urshifu-Base', 'Urshifu-Rapid-Strike', 'Whimsicott', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned',
|
|
410
|
+
'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Moody', 'Power Construct', 'Focus Sash', 'Ally Switch', 'Final Gambit', 'Perish Song', 'Swagger',
|
|
411
411
|
],
|
|
412
412
|
},
|
|
413
413
|
{
|
|
@@ -452,6 +452,18 @@ export const Formats: FormatList = [
|
|
|
452
452
|
}
|
|
453
453
|
},
|
|
454
454
|
},
|
|
455
|
+
{
|
|
456
|
+
name: "[Gen 8] Jump! Magikarp!",
|
|
457
|
+
desc: `Every team must contain Magikarp and bring it to the game.`,
|
|
458
|
+
threads: [
|
|
459
|
+
`• <a href="https://www.smogon.com/forums/threads/3704588/">Jump! Magikarp!</a>`,
|
|
460
|
+
],
|
|
461
|
+
|
|
462
|
+
mod: 'gen8',
|
|
463
|
+
gameType: 'doubles',
|
|
464
|
+
ruleset: ['Flat Rules', '!! Picked Team Size = 2', '!! Adjust Level = 50', 'Min Source Gen = 8', 'Force Select = Magikarp'],
|
|
465
|
+
banlist: ['Sub-Legendary'],
|
|
466
|
+
},
|
|
455
467
|
{
|
|
456
468
|
name: "[Gen 8] Doubles Custom Game",
|
|
457
469
|
|
|
@@ -616,38 +628,262 @@ export const Formats: FormatList = [
|
|
|
616
628
|
column: 2,
|
|
617
629
|
},
|
|
618
630
|
{
|
|
619
|
-
name: "[Gen 8]
|
|
620
|
-
desc: `Pokémon
|
|
631
|
+
name: "[Gen 8] Broken Record",
|
|
632
|
+
desc: `Pokémon can hold a TR to use that move in battle.`,
|
|
621
633
|
threads: [
|
|
622
|
-
`• <a href="https://www.smogon.com/forums/threads/
|
|
634
|
+
`• <a href="https://www.smogon.com/forums/threads/3701270/">Broken Record</a>`,
|
|
623
635
|
],
|
|
624
636
|
|
|
625
637
|
mod: 'gen8',
|
|
626
|
-
ruleset: ['Standard', '
|
|
638
|
+
ruleset: ['Standard', '!Sleep Clause Mod', 'Sleep Moves Clause', 'Dynamax Clause'],
|
|
627
639
|
banlist: [
|
|
628
|
-
'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Darmanitan-Galar', 'Dialga', 'Dracovish', '
|
|
629
|
-
'Groudon', 'Ho-Oh', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala',
|
|
630
|
-
'
|
|
631
|
-
'
|
|
632
|
-
'
|
|
640
|
+
'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Dragapult', 'Eternatus', 'Genesect', 'Giratina',
|
|
641
|
+
'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala',
|
|
642
|
+
'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza',
|
|
643
|
+
'Regieleki', 'Reshiram', 'Rillaboom', 'Solgaleo', 'Spectrier', 'Urshifu-Base', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta',
|
|
644
|
+
'Zamazenta-Crowned', 'Zekrom', 'Zygarde-Base', 'Arena Trap', 'Magnet Pull', 'Moody', 'Power Construct', 'Shadow Tag', 'TR29 (Baton Pass)',
|
|
645
|
+
'TR82 (Stored Power)', 'Baton Pass',
|
|
633
646
|
],
|
|
647
|
+
onValidateSet(set) {
|
|
648
|
+
if (!set.item) return;
|
|
649
|
+
const item = this.dex.items.get(set.item);
|
|
650
|
+
if (!/^tr\d\d/i.test(item.name)) return;
|
|
651
|
+
const moveName = item.desc.split('move ')[1].split('.')[0];
|
|
652
|
+
if (set.moves.map(this.toID).includes(this.toID(moveName))) {
|
|
653
|
+
return [
|
|
654
|
+
`${set.species} can't run ${item.name} (${moveName}) as its item because it already has that move in its moveset.`,
|
|
655
|
+
];
|
|
656
|
+
}
|
|
657
|
+
},
|
|
658
|
+
onValidateTeam(team) {
|
|
659
|
+
const trs = new Set<string>();
|
|
660
|
+
for (const set of team) {
|
|
661
|
+
if (!set.item) continue;
|
|
662
|
+
const item = this.dex.items.get(set.item).name;
|
|
663
|
+
if (!/^tr\d\d/i.test(item)) continue;
|
|
664
|
+
if (trs.has(item)) {
|
|
665
|
+
return [`Your team already has a Pok\u00e9mon with ${item}.`];
|
|
666
|
+
}
|
|
667
|
+
trs.add(item);
|
|
668
|
+
}
|
|
669
|
+
},
|
|
670
|
+
onTakeItem(item) {
|
|
671
|
+
return !/^tr\d\d/i.test(item.name);
|
|
672
|
+
},
|
|
673
|
+
onModifyMove(move) {
|
|
674
|
+
if (move.id === 'knockoff') {
|
|
675
|
+
move.onBasePower = function (basePower, source, target, m) {
|
|
676
|
+
const item = target.getItem();
|
|
677
|
+
if (!this.singleEvent('TakeItem', item, target.itemState, target, target, m, item)) return;
|
|
678
|
+
// Very hardcode but I'd prefer to not make a mod for one damage calculation change
|
|
679
|
+
if (item.id && !/^tr\d\d/i.test(item.id)) {
|
|
680
|
+
return this.chainModify(1.5);
|
|
681
|
+
}
|
|
682
|
+
};
|
|
683
|
+
}
|
|
684
|
+
},
|
|
685
|
+
onBegin() {
|
|
686
|
+
for (const pokemon of this.getAllPokemon()) {
|
|
687
|
+
const item = pokemon.getItem();
|
|
688
|
+
if (/^tr\d\d/i.test(item.name)) {
|
|
689
|
+
const move = this.dex.moves.get(item.desc.split('move ')[1].split('.')[0]);
|
|
690
|
+
pokemon.moveSlots = (pokemon as any).baseMoveSlots = [
|
|
691
|
+
...pokemon.baseMoveSlots, {
|
|
692
|
+
id: move.id,
|
|
693
|
+
move: move.name,
|
|
694
|
+
pp: move.pp * 8 / 5,
|
|
695
|
+
maxpp: move.pp * 8 / 5,
|
|
696
|
+
target: move.target,
|
|
697
|
+
disabled: false,
|
|
698
|
+
disabledSource: '',
|
|
699
|
+
used: false,
|
|
700
|
+
},
|
|
701
|
+
];
|
|
702
|
+
}
|
|
703
|
+
}
|
|
704
|
+
},
|
|
634
705
|
},
|
|
635
706
|
{
|
|
636
|
-
name: "[Gen 8]
|
|
637
|
-
desc: `
|
|
707
|
+
name: "[Gen 8] Inheritance",
|
|
708
|
+
desc: `Pokémon may use the ability and moves of another, as long as they forfeit their own learnset.`,
|
|
638
709
|
threads: [
|
|
639
|
-
`• <a href="https://www.smogon.com/forums/threads/
|
|
710
|
+
`• <a href="https://www.smogon.com/forums/threads/3656811/">Inheritance</a>`,
|
|
640
711
|
],
|
|
641
712
|
|
|
642
713
|
mod: 'gen8',
|
|
643
|
-
|
|
714
|
+
// searchShow: false,
|
|
715
|
+
ruleset: ['Standard', '!Sleep Clause Mod', 'Sleep Moves Clause', '2 Ability Clause', 'Dynamax Clause'],
|
|
644
716
|
banlist: [
|
|
645
|
-
'
|
|
646
|
-
'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem
|
|
647
|
-
'Mewtwo', '
|
|
648
|
-
'
|
|
649
|
-
'
|
|
717
|
+
'Blacephalon', 'Blaziken', 'Butterfree', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chansey', 'Combusken', 'Cresselia', 'Darmanitan-Galar', 'Dialga', 'Dracovish',
|
|
718
|
+
'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala',
|
|
719
|
+
'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Natu', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Regieleki',
|
|
720
|
+
'Regigigas', 'Reshiram', 'Sableye', 'Shedinja', 'Solgaleo', 'Spectrier', 'Tapu Koko', 'Toxtricity', 'Torkoal', 'Urshifu-Base', 'Xatu', 'Xerneas', 'Yveltal',
|
|
721
|
+
'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zeraora', 'Zekrom', 'Arena Trap', 'Contrary', 'Drizzle', 'Huge Power', 'Imposter', 'Innards Out',
|
|
722
|
+
'Libero', 'Moody', 'Power Construct', 'Pure Power', 'Quick Draw', 'Shadow Tag', 'Sheer Force', 'Simple', 'Unaware', 'Unburden', 'Water Bubble', 'King\'s Rock',
|
|
723
|
+
'Quick Claw', 'Baton Pass', 'Bolt Beak', 'Fishious Rend', 'Shell Smash', 'Thousand Arrows',
|
|
650
724
|
],
|
|
725
|
+
getEvoFamily(speciesid) {
|
|
726
|
+
let species = Dex.species.get(speciesid);
|
|
727
|
+
while (species.prevo) {
|
|
728
|
+
species = Dex.species.get(species.prevo);
|
|
729
|
+
}
|
|
730
|
+
return species.id;
|
|
731
|
+
},
|
|
732
|
+
validateSet(set, teamHas) {
|
|
733
|
+
const unreleased = (pokemon: Species) => pokemon.tier === "Unreleased" && pokemon.isNonstandard === "Unobtainable";
|
|
734
|
+
if (!teamHas.abilityMap) {
|
|
735
|
+
teamHas.abilityMap = Object.create(null);
|
|
736
|
+
for (const pokemon of Dex.species.all()) {
|
|
737
|
+
if (pokemon.isNonstandard || unreleased(pokemon)) continue;
|
|
738
|
+
if (pokemon.requiredAbility || pokemon.requiredItem || pokemon.requiredMove) continue;
|
|
739
|
+
if (this.ruleTable.isBannedSpecies(pokemon)) continue;
|
|
740
|
+
|
|
741
|
+
for (const key of Object.values(pokemon.abilities)) {
|
|
742
|
+
const abilityId = this.dex.toID(key);
|
|
743
|
+
if (abilityId in teamHas.abilityMap) {
|
|
744
|
+
teamHas.abilityMap[abilityId][pokemon.evos ? 'push' : 'unshift'](pokemon.id);
|
|
745
|
+
} else {
|
|
746
|
+
teamHas.abilityMap[abilityId] = [pokemon.id];
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
const problem = this.validateForme(set);
|
|
753
|
+
if (problem.length) return problem;
|
|
754
|
+
|
|
755
|
+
const species = this.dex.species.get(set.species);
|
|
756
|
+
if (!species.exists || species.num < 1) return [`The Pok\u00e9mon "${set.species}" does not exist.`];
|
|
757
|
+
if (species.isNonstandard || unreleased(species)) {
|
|
758
|
+
return [`${species.name} is not obtainable in Generation ${this.dex.gen}.`];
|
|
759
|
+
}
|
|
760
|
+
|
|
761
|
+
const name = set.name;
|
|
762
|
+
if (this.ruleTable.isBannedSpecies(species)) {
|
|
763
|
+
return this.validateSet(set, teamHas);
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
const ability = this.dex.abilities.get(set.ability);
|
|
767
|
+
if (!ability.exists || ability.isNonstandard) return [`${name} needs to have a valid ability.`];
|
|
768
|
+
const pokemonWithAbility = teamHas.abilityMap[ability.id];
|
|
769
|
+
if (!pokemonWithAbility) return [`${ability.name} is not available on a legal Pok\u00e9mon.`];
|
|
770
|
+
|
|
771
|
+
(this.format as any).debug = true;
|
|
772
|
+
|
|
773
|
+
if (!teamHas.abilitySources) teamHas.abilitySources = Object.create(null);
|
|
774
|
+
const validSources: string[] = teamHas.abilitySources[this.dex.toID(set.species)] = []; // Evolution families
|
|
775
|
+
|
|
776
|
+
let canonicalSource = ''; // Specific for the basic implementation of Donor Clause (see onValidateTeam).
|
|
777
|
+
|
|
778
|
+
for (const donor of pokemonWithAbility) {
|
|
779
|
+
const donorSpecies = this.dex.species.get(donor);
|
|
780
|
+
let format = this.format;
|
|
781
|
+
if (!format.getEvoFamily) format = this.dex.formats.get('gen8inheritance');
|
|
782
|
+
const evoFamily = format.getEvoFamily!(donorSpecies.id);
|
|
783
|
+
if (validSources.includes(evoFamily)) continue;
|
|
784
|
+
|
|
785
|
+
set.species = donorSpecies.name;
|
|
786
|
+
set.name = donorSpecies.baseSpecies;
|
|
787
|
+
const problems = this.validateSet(set, teamHas) || [];
|
|
788
|
+
if (!problems.length) {
|
|
789
|
+
validSources.push(evoFamily);
|
|
790
|
+
canonicalSource = donorSpecies.name;
|
|
791
|
+
}
|
|
792
|
+
// Specific for the basic implementation of Donor Clause (see onValidateTeam).
|
|
793
|
+
if (validSources.length > 1) break;
|
|
794
|
+
}
|
|
795
|
+
(this.format as any).debug = false;
|
|
796
|
+
|
|
797
|
+
set.name = name;
|
|
798
|
+
set.species = species.name;
|
|
799
|
+
if (!validSources.length) {
|
|
800
|
+
if (pokemonWithAbility.length > 1) return [`${name}'s set is illegal.`];
|
|
801
|
+
return [`${name} has an illegal set with an ability from ${this.dex.species.get(pokemonWithAbility[0]).name}.`];
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
// Protocol: Include the data of the donor species in the `ability` data slot.
|
|
805
|
+
// Afterwards, we are going to reset the name to what the user intended.
|
|
806
|
+
set.ability = `${set.ability}0${canonicalSource}`;
|
|
807
|
+
return null;
|
|
808
|
+
},
|
|
809
|
+
onValidateTeam(team, f, teamHas) {
|
|
810
|
+
if (this.ruleTable.has('2abilityclause')) {
|
|
811
|
+
const abilityTable = new Map<string, number>();
|
|
812
|
+
const base: {[k: string]: string} = {
|
|
813
|
+
airlock: 'cloudnine',
|
|
814
|
+
battlearmor: 'shellarmor',
|
|
815
|
+
clearbody: 'whitesmoke',
|
|
816
|
+
dazzling: 'queenlymajesty',
|
|
817
|
+
emergencyexit: 'wimpout',
|
|
818
|
+
filter: 'solidrock',
|
|
819
|
+
gooey: 'tanglinghair',
|
|
820
|
+
insomnia: 'vitalspirit',
|
|
821
|
+
ironbarbs: 'roughskin',
|
|
822
|
+
libero: 'protean',
|
|
823
|
+
minus: 'plus',
|
|
824
|
+
moxie: 'chillingneigh',
|
|
825
|
+
powerofalchemy: 'receiver',
|
|
826
|
+
propellertail: 'stalwart',
|
|
827
|
+
teravolt: 'moldbreaker',
|
|
828
|
+
turboblaze: 'moldbreaker',
|
|
829
|
+
};
|
|
830
|
+
for (const set of team) {
|
|
831
|
+
let ability = this.toID(set.ability.split('0')[0]);
|
|
832
|
+
if (!ability) continue;
|
|
833
|
+
if (ability in base) ability = base[ability] as ID;
|
|
834
|
+
if ((abilityTable.get(ability) || 0) >= 2) {
|
|
835
|
+
return [
|
|
836
|
+
`You are limited to two of each ability by 2 Ability Clause.`,
|
|
837
|
+
`(You have more than two ${this.dex.abilities.get(ability).name} variants)`,
|
|
838
|
+
];
|
|
839
|
+
}
|
|
840
|
+
abilityTable.set(ability, (abilityTable.get(ability) || 0) + 1);
|
|
841
|
+
}
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
// Donor Clause
|
|
845
|
+
const evoFamilyLists = [];
|
|
846
|
+
for (const set of team) {
|
|
847
|
+
const abilitySources = teamHas.abilitySources?.[this.dex.toID(set.species)];
|
|
848
|
+
if (!abilitySources) continue;
|
|
849
|
+
let format = this.format;
|
|
850
|
+
if (!format.getEvoFamily) format = this.dex.formats.get('gen8inheritance');
|
|
851
|
+
evoFamilyLists.push(abilitySources.map(format.getEvoFamily!));
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
// Checking actual full incompatibility would require expensive algebra.
|
|
855
|
+
// Instead, we only check the trivial case of multiple Pokémon only legal for exactly one family. FIXME?
|
|
856
|
+
const requiredFamilies = Object.create(null);
|
|
857
|
+
for (const evoFamilies of evoFamilyLists) {
|
|
858
|
+
if (evoFamilies.length !== 1) continue;
|
|
859
|
+
const [familyId] = evoFamilies;
|
|
860
|
+
if (!(familyId in requiredFamilies)) requiredFamilies[familyId] = 1;
|
|
861
|
+
requiredFamilies[familyId]++;
|
|
862
|
+
if (requiredFamilies[familyId] > 2) {
|
|
863
|
+
return [
|
|
864
|
+
`You are limited to up to two inheritances from each evolution family by the Donor Clause.`,
|
|
865
|
+
`(You inherit more than twice from ${this.dex.species.get(familyId).name}).`,
|
|
866
|
+
];
|
|
867
|
+
}
|
|
868
|
+
}
|
|
869
|
+
},
|
|
870
|
+
onBegin() {
|
|
871
|
+
for (const pokemon of this.getAllPokemon()) {
|
|
872
|
+
if (pokemon.baseAbility.includes('0')) {
|
|
873
|
+
const donor = pokemon.baseAbility.split('0')[1];
|
|
874
|
+
pokemon.m.donor = this.toID(donor);
|
|
875
|
+
pokemon.baseAbility = this.toID(pokemon.baseAbility.split('0')[0]);
|
|
876
|
+
pokemon.ability = pokemon.baseAbility;
|
|
877
|
+
}
|
|
878
|
+
}
|
|
879
|
+
},
|
|
880
|
+
onSwitchIn(pokemon) {
|
|
881
|
+
if (!pokemon.m.donor) return;
|
|
882
|
+
const donorTemplate = this.dex.species.get(pokemon.m.donor);
|
|
883
|
+
if (!donorTemplate.exists) return;
|
|
884
|
+
// Place volatiles on the Pokémon to show the donor details.
|
|
885
|
+
this.add('-start', pokemon, donorTemplate.name, '[silent]');
|
|
886
|
+
},
|
|
651
887
|
},
|
|
652
888
|
|
|
653
889
|
// Other Metagames
|
|
@@ -671,8 +907,8 @@ export const Formats: FormatList = [
|
|
|
671
907
|
'Calyrex-Shadow', 'Cramorant-Gorging', 'Darmanitan-Galar-Zen', 'Eternatus-Eternamax', 'Shedinja', 'Zacian-Crowned',
|
|
672
908
|
'Arena Trap', 'Contrary', 'Gorilla Tactics', 'Huge Power', 'Illusion', 'Innards Out', 'Intrepid Sword', 'Libero',
|
|
673
909
|
'Magnet Pull', 'Moody', 'Neutralizing Gas', 'Parental Bond', 'Protean', 'Pure Power', 'Shadow Tag', 'Stakeout',
|
|
674
|
-
'Water Bubble', 'Wonder Guard', 'Comatose + Sleep Talk', 'Rusted Sword', '
|
|
675
|
-
'Octolock', 'Shell Smash',
|
|
910
|
+
'Water Bubble', 'Wonder Guard', 'Comatose + Sleep Talk', 'Rusted Sword', 'Belly Drum', 'Bolt Beak', 'Court Change',
|
|
911
|
+
'Double Iron Bash', 'Octolock', 'Shell Smash',
|
|
676
912
|
],
|
|
677
913
|
},
|
|
678
914
|
{
|
|
@@ -686,8 +922,8 @@ export const Formats: FormatList = [
|
|
|
686
922
|
mod: 'gen8',
|
|
687
923
|
ruleset: ['Standard', '!Obtainable Abilities', '2 Ability Clause', 'Dynamax Clause', 'Sleep Moves Clause', '!Sleep Clause Mod'],
|
|
688
924
|
banlist: [
|
|
689
|
-
'Archeops', 'Blacephalon', 'Buzzwole', 'Calyrex-Ice', 'Calyrex-Shadow', 'Dialga', 'Dracovish', 'Dragapult', 'Dragonite', 'Eternatus',
|
|
690
|
-
'
|
|
925
|
+
'Archeops', 'Blacephalon', 'Buzzwole', 'Calyrex-Ice', 'Calyrex-Shadow', 'Dialga', 'Dracovish', 'Dragapult', 'Dragonite', 'Eternatus', 'Gengar',
|
|
926
|
+
'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Keldeo', 'Kommo-o', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White',
|
|
691
927
|
'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Noivern',
|
|
692
928
|
'Palkia', 'Pheromosa', 'Rayquaza', 'Regigigas', 'Reshiram', 'Shedinja', 'Solgaleo', 'Spectrier', 'Urshifu', 'Urshifu-Rapid-Strike',
|
|
693
929
|
'Victini', 'Weavile', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Base', 'Zekrom', 'Zeraora', 'Zygarde-Base',
|
|
@@ -784,9 +1020,9 @@ export const Formats: FormatList = [
|
|
|
784
1020
|
'Arena Trap', 'Magnet Pull', 'Moody', 'Power Construct', 'Shadow Tag', 'King\'s Rock', 'Baton Pass',
|
|
785
1021
|
],
|
|
786
1022
|
restricted: [
|
|
787
|
-
'Acupressure', 'Astral Barrage', 'Belly Drum', 'Bolt Beak', 'Clangorous Soul', 'Double Iron Bash', 'Electrify', 'Extreme Speed', '
|
|
788
|
-
'Geomancy', 'Glacial Lance', 'Oblivion Wing', 'Precipice Blades', 'Shell Smash', 'Shift Gear', 'Thousand Arrows', 'Thunderous Kick',
|
|
789
|
-
'Wicked Blow',
|
|
1023
|
+
'Acupressure', 'Astral Barrage', 'Belly Drum', 'Bolt Beak', 'Clangorous Soul', 'Double Iron Bash', 'Electrify', 'Extreme Speed', 'Final Gambit',
|
|
1024
|
+
'Fishious Rend', 'Geomancy', 'Glacial Lance', 'Oblivion Wing', 'Precipice Blades', 'Shell Smash', 'Shift Gear', 'Thousand Arrows', 'Thunderous Kick',
|
|
1025
|
+
'V-create', 'Wicked Blow',
|
|
790
1026
|
],
|
|
791
1027
|
},
|
|
792
1028
|
{
|
|
@@ -981,7 +1217,7 @@ export const Formats: FormatList = [
|
|
|
981
1217
|
|
|
982
1218
|
mod: 'gen8bdsp',
|
|
983
1219
|
ruleset: ['Little Cup', 'Standard'],
|
|
984
|
-
banlist: ['Gligar', 'Meditite', 'Misdreavus', 'Murkrow', 'Scyther', 'Sneasel', 'Tangela', 'Vulpix', 'Yanma', 'Moody', 'Baton Pass', 'Sticky Web'],
|
|
1220
|
+
banlist: ['Gligar', 'Meditite', 'Misdreavus', 'Munchlax', 'Murkrow', 'Scyther', 'Sneasel', 'Tangela', 'Vulpix', 'Yanma', 'Moody', 'Baton Pass', 'Sticky Web'],
|
|
985
1221
|
},
|
|
986
1222
|
{
|
|
987
1223
|
name: "[Gen 8 BDSP] Monotype",
|
|
@@ -1203,188 +1439,6 @@ export const Formats: FormatList = [
|
|
|
1203
1439
|
}
|
|
1204
1440
|
},
|
|
1205
1441
|
},
|
|
1206
|
-
{
|
|
1207
|
-
name: "[Gen 8] Inheritance",
|
|
1208
|
-
desc: `Pokémon may use the ability and moves of another, as long as they forfeit their own learnset.`,
|
|
1209
|
-
threads: [
|
|
1210
|
-
`• <a href="https://www.smogon.com/forums/threads/3656811/">Inheritance</a>`,
|
|
1211
|
-
],
|
|
1212
|
-
|
|
1213
|
-
mod: 'gen8',
|
|
1214
|
-
searchShow: false,
|
|
1215
|
-
ruleset: ['Standard', '2 Ability Clause', 'Dynamax Clause'],
|
|
1216
|
-
banlist: [
|
|
1217
|
-
'Blacephalon', 'Blaziken', 'Butterfree', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chansey', 'Combusken', 'Cresselia', 'Darmanitan-Galar', 'Dialga', 'Dracovish',
|
|
1218
|
-
'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala',
|
|
1219
|
-
'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Natu', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Regieleki',
|
|
1220
|
-
'Regigigas', 'Reshiram', 'Sableye', 'Shedinja', 'Solgaleo', 'Spectrier', 'Tapu Koko', 'Toxtricity', 'Torkoal', 'Urshifu-Base', 'Xatu', 'Xerneas', 'Yveltal',
|
|
1221
|
-
'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zeraora', 'Zekrom', 'Arena Trap', 'Contrary', 'Drizzle', 'Huge Power', 'Imposter', 'Innards Out',
|
|
1222
|
-
'Libero', 'Moody', 'Power Construct', 'Pure Power', 'Quick Draw', 'Shadow Tag', 'Sheer Force', 'Simple', 'Unaware', 'Unburden', 'Water Bubble', 'King\'s Rock',
|
|
1223
|
-
'Quick Claw', 'Baton Pass', 'Bolt Beak', 'Fishious Rend', 'Shell Smash', 'Thousand Arrows',
|
|
1224
|
-
],
|
|
1225
|
-
getEvoFamily(speciesid) {
|
|
1226
|
-
let species = Dex.species.get(speciesid);
|
|
1227
|
-
while (species.prevo) {
|
|
1228
|
-
species = Dex.species.get(species.prevo);
|
|
1229
|
-
}
|
|
1230
|
-
return species.id;
|
|
1231
|
-
},
|
|
1232
|
-
validateSet(set, teamHas) {
|
|
1233
|
-
const unreleased = (pokemon: Species) => pokemon.tier === "Unreleased" && pokemon.isNonstandard === "Unobtainable";
|
|
1234
|
-
if (!teamHas.abilityMap) {
|
|
1235
|
-
teamHas.abilityMap = Object.create(null);
|
|
1236
|
-
for (const pokemon of Dex.species.all()) {
|
|
1237
|
-
if (pokemon.isNonstandard || unreleased(pokemon)) continue;
|
|
1238
|
-
if (pokemon.requiredAbility || pokemon.requiredItem || pokemon.requiredMove) continue;
|
|
1239
|
-
if (this.ruleTable.isBannedSpecies(pokemon)) continue;
|
|
1240
|
-
|
|
1241
|
-
for (const key of Object.values(pokemon.abilities)) {
|
|
1242
|
-
const abilityId = this.dex.toID(key);
|
|
1243
|
-
if (abilityId in teamHas.abilityMap) {
|
|
1244
|
-
teamHas.abilityMap[abilityId][pokemon.evos ? 'push' : 'unshift'](pokemon.id);
|
|
1245
|
-
} else {
|
|
1246
|
-
teamHas.abilityMap[abilityId] = [pokemon.id];
|
|
1247
|
-
}
|
|
1248
|
-
}
|
|
1249
|
-
}
|
|
1250
|
-
}
|
|
1251
|
-
|
|
1252
|
-
const problem = this.validateForme(set);
|
|
1253
|
-
if (problem.length) return problem;
|
|
1254
|
-
|
|
1255
|
-
const species = this.dex.species.get(set.species);
|
|
1256
|
-
if (!species.exists || species.num < 1) return [`The Pok\u00e9mon "${set.species}" does not exist.`];
|
|
1257
|
-
if (species.isNonstandard || unreleased(species)) {
|
|
1258
|
-
return [`${species.name} is not obtainable in Generation ${this.dex.gen}.`];
|
|
1259
|
-
}
|
|
1260
|
-
|
|
1261
|
-
const name = set.name;
|
|
1262
|
-
if (this.ruleTable.isBannedSpecies(species)) {
|
|
1263
|
-
return this.validateSet(set, teamHas);
|
|
1264
|
-
}
|
|
1265
|
-
|
|
1266
|
-
const ability = this.dex.abilities.get(set.ability);
|
|
1267
|
-
if (!ability.exists || ability.isNonstandard) return [`${name} needs to have a valid ability.`];
|
|
1268
|
-
const pokemonWithAbility = teamHas.abilityMap[ability.id];
|
|
1269
|
-
if (!pokemonWithAbility) return [`${ability.name} is not available on a legal Pok\u00e9mon.`];
|
|
1270
|
-
|
|
1271
|
-
(this.format as any).debug = true;
|
|
1272
|
-
|
|
1273
|
-
if (!teamHas.abilitySources) teamHas.abilitySources = Object.create(null);
|
|
1274
|
-
const validSources: string[] = teamHas.abilitySources[this.dex.toID(set.species)] = []; // Evolution families
|
|
1275
|
-
|
|
1276
|
-
let canonicalSource = ''; // Specific for the basic implementation of Donor Clause (see onValidateTeam).
|
|
1277
|
-
|
|
1278
|
-
for (const donor of pokemonWithAbility) {
|
|
1279
|
-
const donorSpecies = this.dex.species.get(donor);
|
|
1280
|
-
let format = this.format;
|
|
1281
|
-
if (!format.getEvoFamily) format = this.dex.formats.get('gen8inheritance');
|
|
1282
|
-
const evoFamily = format.getEvoFamily!(donorSpecies.id);
|
|
1283
|
-
if (validSources.includes(evoFamily)) continue;
|
|
1284
|
-
|
|
1285
|
-
set.species = donorSpecies.name;
|
|
1286
|
-
set.name = donorSpecies.baseSpecies;
|
|
1287
|
-
const problems = this.validateSet(set, teamHas) || [];
|
|
1288
|
-
if (!problems.length) {
|
|
1289
|
-
validSources.push(evoFamily);
|
|
1290
|
-
canonicalSource = donorSpecies.name;
|
|
1291
|
-
}
|
|
1292
|
-
// Specific for the basic implementation of Donor Clause (see onValidateTeam).
|
|
1293
|
-
if (validSources.length > 1) break;
|
|
1294
|
-
}
|
|
1295
|
-
(this.format as any).debug = false;
|
|
1296
|
-
|
|
1297
|
-
set.name = name;
|
|
1298
|
-
set.species = species.name;
|
|
1299
|
-
if (!validSources.length) {
|
|
1300
|
-
if (pokemonWithAbility.length > 1) return [`${name}'s set is illegal.`];
|
|
1301
|
-
return [`${name} has an illegal set with an ability from ${this.dex.species.get(pokemonWithAbility[0]).name}.`];
|
|
1302
|
-
}
|
|
1303
|
-
|
|
1304
|
-
// Protocol: Include the data of the donor species in the `ability` data slot.
|
|
1305
|
-
// Afterwards, we are going to reset the name to what the user intended.
|
|
1306
|
-
set.ability = `${set.ability}0${canonicalSource}`;
|
|
1307
|
-
return null;
|
|
1308
|
-
},
|
|
1309
|
-
onValidateTeam(team, f, teamHas) {
|
|
1310
|
-
if (this.ruleTable.has('2abilityclause')) {
|
|
1311
|
-
const abilityTable = new Map<string, number>();
|
|
1312
|
-
const base: {[k: string]: string} = {
|
|
1313
|
-
airlock: 'cloudnine',
|
|
1314
|
-
battlearmor: 'shellarmor',
|
|
1315
|
-
clearbody: 'whitesmoke',
|
|
1316
|
-
dazzling: 'queenlymajesty',
|
|
1317
|
-
emergencyexit: 'wimpout',
|
|
1318
|
-
filter: 'solidrock',
|
|
1319
|
-
gooey: 'tanglinghair',
|
|
1320
|
-
insomnia: 'vitalspirit',
|
|
1321
|
-
ironbarbs: 'roughskin',
|
|
1322
|
-
libero: 'protean',
|
|
1323
|
-
minus: 'plus',
|
|
1324
|
-
moxie: 'chillingneigh',
|
|
1325
|
-
powerofalchemy: 'receiver',
|
|
1326
|
-
propellertail: 'stalwart',
|
|
1327
|
-
teravolt: 'moldbreaker',
|
|
1328
|
-
turboblaze: 'moldbreaker',
|
|
1329
|
-
};
|
|
1330
|
-
for (const set of team) {
|
|
1331
|
-
let ability = this.toID(set.ability.split('0')[0]);
|
|
1332
|
-
if (!ability) continue;
|
|
1333
|
-
if (ability in base) ability = base[ability] as ID;
|
|
1334
|
-
if ((abilityTable.get(ability) || 0) >= 2) {
|
|
1335
|
-
return [
|
|
1336
|
-
`You are limited to two of each ability by 2 Ability Clause.`,
|
|
1337
|
-
`(You have more than two ${this.dex.abilities.get(ability).name} variants)`,
|
|
1338
|
-
];
|
|
1339
|
-
}
|
|
1340
|
-
abilityTable.set(ability, (abilityTable.get(ability) || 0) + 1);
|
|
1341
|
-
}
|
|
1342
|
-
}
|
|
1343
|
-
|
|
1344
|
-
// Donor Clause
|
|
1345
|
-
const evoFamilyLists = [];
|
|
1346
|
-
for (const set of team) {
|
|
1347
|
-
const abilitySources = teamHas.abilitySources?.[this.dex.toID(set.species)];
|
|
1348
|
-
if (!abilitySources) continue;
|
|
1349
|
-
let format = this.format;
|
|
1350
|
-
if (!format.getEvoFamily) format = this.dex.formats.get('gen8inheritance');
|
|
1351
|
-
evoFamilyLists.push(abilitySources.map(format.getEvoFamily!));
|
|
1352
|
-
}
|
|
1353
|
-
|
|
1354
|
-
// Checking actual full incompatibility would require expensive algebra.
|
|
1355
|
-
// Instead, we only check the trivial case of multiple Pokémon only legal for exactly one family. FIXME?
|
|
1356
|
-
const requiredFamilies = Object.create(null);
|
|
1357
|
-
for (const evoFamilies of evoFamilyLists) {
|
|
1358
|
-
if (evoFamilies.length !== 1) continue;
|
|
1359
|
-
const [familyId] = evoFamilies;
|
|
1360
|
-
if (!(familyId in requiredFamilies)) requiredFamilies[familyId] = 1;
|
|
1361
|
-
requiredFamilies[familyId]++;
|
|
1362
|
-
if (requiredFamilies[familyId] > 2) {
|
|
1363
|
-
return [
|
|
1364
|
-
`You are limited to up to two inheritances from each evolution family by the Donor Clause.`,
|
|
1365
|
-
`(You inherit more than twice from ${this.dex.species.get(familyId).name}).`,
|
|
1366
|
-
];
|
|
1367
|
-
}
|
|
1368
|
-
}
|
|
1369
|
-
},
|
|
1370
|
-
onBegin() {
|
|
1371
|
-
for (const pokemon of this.getAllPokemon()) {
|
|
1372
|
-
if (pokemon.baseAbility.includes('0')) {
|
|
1373
|
-
const donor = pokemon.baseAbility.split('0')[1];
|
|
1374
|
-
pokemon.m.donor = this.toID(donor);
|
|
1375
|
-
pokemon.baseAbility = this.toID(pokemon.baseAbility.split('0')[0]);
|
|
1376
|
-
pokemon.ability = pokemon.baseAbility;
|
|
1377
|
-
}
|
|
1378
|
-
}
|
|
1379
|
-
},
|
|
1380
|
-
onSwitchIn(pokemon) {
|
|
1381
|
-
if (!pokemon.m.donor) return;
|
|
1382
|
-
const donorTemplate = this.dex.species.get(pokemon.m.donor);
|
|
1383
|
-
if (!donorTemplate.exists) return;
|
|
1384
|
-
// Place volatiles on the Pokémon to show the donor details.
|
|
1385
|
-
this.add('-start', pokemon, donorTemplate.name, '[silent]');
|
|
1386
|
-
},
|
|
1387
|
-
},
|
|
1388
1442
|
{
|
|
1389
1443
|
name: "[Gen 8] Linked",
|
|
1390
1444
|
desc: `The first two moves in a Pokémon's moveset are used simultaneously.`,
|
|
@@ -2384,38 +2438,47 @@ export const Formats: FormatList = [
|
|
|
2384
2438
|
column: 3,
|
|
2385
2439
|
},
|
|
2386
2440
|
{
|
|
2387
|
-
name: "[Gen
|
|
2441
|
+
name: "[Gen 2] Ubers",
|
|
2388
2442
|
threads: [
|
|
2389
|
-
`• <a href="https://www.smogon.com/forums/
|
|
2390
|
-
`• <a href="https://www.smogon.com/forums/threads/3641346/">USM UU Viability Rankings</a>`,
|
|
2443
|
+
`• <a href="https://www.smogon.com/forums/posts/8286282/">GSC Ubers</a>`,
|
|
2391
2444
|
],
|
|
2392
2445
|
|
|
2393
|
-
mod: '
|
|
2446
|
+
mod: 'gen2',
|
|
2394
2447
|
// searchShow: false,
|
|
2395
|
-
ruleset: ['
|
|
2396
|
-
banlist: ['OU', 'UUBL', 'Drizzle', 'Drought', 'Kommonium Z', 'Mewnium Z'],
|
|
2448
|
+
ruleset: ['Standard'],
|
|
2397
2449
|
},
|
|
2398
2450
|
{
|
|
2399
|
-
name: "[Gen
|
|
2451
|
+
name: "[Gen 3] 1v1",
|
|
2452
|
+
desc: `Bring three Pokémon to Team Preview and choose one to battle.`,
|
|
2400
2453
|
threads: [
|
|
2401
|
-
`• <a href="https://www.smogon.com/
|
|
2402
|
-
`• <a href="https://www.smogon.com/forums/posts/8034679/">ORAS ZU Viability Rankings</a>`,
|
|
2454
|
+
`• <a href="https://www.smogon.com/forums/posts/8031456/">ADV 1v1</a>`,
|
|
2403
2455
|
],
|
|
2404
2456
|
|
|
2405
|
-
mod: '
|
|
2457
|
+
mod: 'gen3',
|
|
2406
2458
|
// searchShow: false,
|
|
2407
|
-
ruleset: [
|
|
2408
|
-
|
|
2459
|
+
ruleset: [
|
|
2460
|
+
'Picked Team Size = 1', 'Max Team Size = 3',
|
|
2461
|
+
'[Gen 3] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview', '!Freeze Clause Mod',
|
|
2462
|
+
],
|
|
2463
|
+
banlist: [
|
|
2464
|
+
'Clefable', 'Slaking', 'Snorlax', 'Suicune', 'Zapdos', 'Destiny Bond', 'Explosion', 'Ingrain', 'Perish Song',
|
|
2465
|
+
'Self-Destruct', 'Bright Powder', 'Focus Band', 'King\'s Rock', 'Lax Incense', 'Quick Claw',
|
|
2466
|
+
],
|
|
2467
|
+
unbanlist: ['Mr. Mime', 'Wobbuffet', 'Wynaut', 'Sand Veil'],
|
|
2409
2468
|
},
|
|
2410
2469
|
{
|
|
2411
|
-
name: "[Gen 1]
|
|
2470
|
+
name: "[Gen 1] Stadium OU",
|
|
2412
2471
|
threads: [
|
|
2413
|
-
`• <a href="https://www.smogon.com/forums/
|
|
2472
|
+
`• <a href="https://www.smogon.com/forums/threads/3685877/">Stadium OU Viability Rankings</a>`,
|
|
2414
2473
|
],
|
|
2415
2474
|
|
|
2416
|
-
mod: '
|
|
2475
|
+
mod: 'gen1stadium',
|
|
2417
2476
|
// searchShow: false,
|
|
2418
|
-
ruleset: ['Standard'],
|
|
2477
|
+
ruleset: ['Standard', 'Team Preview'],
|
|
2478
|
+
banlist: ['Uber',
|
|
2479
|
+
'Nidoking + Fury Attack + Thrash', 'Exeggutor + Poison Powder + Stomp', 'Exeggutor + Sleep Powder + Stomp',
|
|
2480
|
+
'Exeggutor + Stun Spore + Stomp', 'Jolteon + Focus Energy + Thunder Shock', 'Flareon + Focus Energy + Ember',
|
|
2481
|
+
],
|
|
2419
2482
|
},
|
|
2420
2483
|
|
|
2421
2484
|
// Past Gens OU
|
|
@@ -2457,7 +2520,7 @@ export const Formats: FormatList = [
|
|
|
2457
2520
|
],
|
|
2458
2521
|
|
|
2459
2522
|
mod: 'gen5',
|
|
2460
|
-
ruleset: ['Standard', 'Evasion Abilities Clause', 'Sleep Moves Clause', 'Swagger Clause'],
|
|
2523
|
+
ruleset: ['Standard', 'Evasion Abilities Clause', 'Sleep Moves Clause', 'Swagger Clause', 'Gems Clause'],
|
|
2461
2524
|
banlist: ['Uber', 'Arena Trap', 'Drizzle ++ Swift Swim', 'Drought ++ Chlorophyll', 'Sand Rush', 'Shadow Tag', 'King\'s Rock', 'Razor Fang', 'Soul Dew', 'Assist', 'Baton Pass'],
|
|
2462
2525
|
},
|
|
2463
2526
|
{
|
|
@@ -2469,7 +2532,7 @@ export const Formats: FormatList = [
|
|
|
2469
2532
|
],
|
|
2470
2533
|
|
|
2471
2534
|
mod: 'gen4',
|
|
2472
|
-
ruleset: ['Standard'],
|
|
2535
|
+
ruleset: ['Standard', 'Freeze Clause Mod'],
|
|
2473
2536
|
banlist: ['AG', 'Uber', 'Arena Trap', 'Sand Veil', 'Swinub + Snow Cloak', 'Piloswine + Snow Cloak', 'Mamoswine + Snow Cloak', 'Soul Dew', 'Baton Pass', 'Swagger'],
|
|
2474
2537
|
},
|
|
2475
2538
|
{
|
|
@@ -2480,7 +2543,7 @@ export const Formats: FormatList = [
|
|
|
2480
2543
|
],
|
|
2481
2544
|
|
|
2482
2545
|
mod: 'gen3',
|
|
2483
|
-
ruleset: ['Standard', 'One Boost Passer Clause'],
|
|
2546
|
+
ruleset: ['Standard', 'One Boost Passer Clause', 'Freeze Clause Mod'],
|
|
2484
2547
|
banlist: ['Uber', 'Sand Veil', 'Soundproof', 'Assist', 'Baton Pass + Block', 'Baton Pass + Mean Look', 'Baton Pass + Spider Web', 'Smeargle + Ingrain'],
|
|
2485
2548
|
},
|
|
2486
2549
|
{
|
|
@@ -2492,7 +2555,7 @@ export const Formats: FormatList = [
|
|
|
2492
2555
|
|
|
2493
2556
|
mod: 'gen2',
|
|
2494
2557
|
ruleset: ['Standard'],
|
|
2495
|
-
banlist: ['Uber'],
|
|
2558
|
+
banlist: ['Uber', 'Mean Look + Baton Pass', 'Spider Web + Baton Pass'],
|
|
2496
2559
|
},
|
|
2497
2560
|
{
|
|
2498
2561
|
name: "[Gen 1] OU",
|
|
@@ -2649,6 +2712,18 @@ export const Formats: FormatList = [
|
|
|
2649
2712
|
ruleset: ['Standard', 'Mega Rayquaza Clause'],
|
|
2650
2713
|
banlist: ['Baton Pass'],
|
|
2651
2714
|
},
|
|
2715
|
+
{
|
|
2716
|
+
name: "[Gen 7] UU",
|
|
2717
|
+
threads: [
|
|
2718
|
+
`• <a href="https://www.smogon.com/forums/threads/3621217/">USM UU Sample Teams</a>`,
|
|
2719
|
+
`• <a href="https://www.smogon.com/forums/threads/3641346/">USM UU Viability Rankings</a>`,
|
|
2720
|
+
],
|
|
2721
|
+
|
|
2722
|
+
mod: 'gen7',
|
|
2723
|
+
searchShow: false,
|
|
2724
|
+
ruleset: ['[Gen 7] OU'],
|
|
2725
|
+
banlist: ['OU', 'UUBL', 'Drizzle', 'Drought', 'Kommonium Z', 'Mewnium Z'],
|
|
2726
|
+
},
|
|
2652
2727
|
{
|
|
2653
2728
|
name: "[Gen 7] RU",
|
|
2654
2729
|
threads: [
|
|
@@ -2739,7 +2814,7 @@ export const Formats: FormatList = [
|
|
|
2739
2814
|
'Arceus', 'Darkrai', 'Deoxys-Base', 'Deoxys-Attack', 'Deoxys-Defense', 'Dialga', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kangaskhan-Mega',
|
|
2740
2815
|
'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Marshadow', 'Mewtwo', 'Mimikyu', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane',
|
|
2741
2816
|
'Palkia', 'Rayquaza', 'Reshiram', 'Salamence-Mega', 'Shaymin-Sky', 'Snorlax', 'Solgaleo', 'Tapu Koko', 'Xerneas', 'Yveltal', 'Zekrom',
|
|
2742
|
-
'Moody', 'Focus Sash', 'Perish Song', 'Detect + Fightinium Z',
|
|
2817
|
+
'Moody', 'Focus Sash', 'Grass Whistle', 'Hypnosis', 'Perish Song', 'Sing', 'Detect + Fightinium Z',
|
|
2743
2818
|
],
|
|
2744
2819
|
},
|
|
2745
2820
|
{
|
|
@@ -3068,6 +3143,18 @@ export const Formats: FormatList = [
|
|
|
3068
3143
|
searchShow: false,
|
|
3069
3144
|
ruleset: ['Obtainable', 'Team Preview', 'Endless Battle Clause', 'HP Percentage Mod', 'Cancel Mod'],
|
|
3070
3145
|
},
|
|
3146
|
+
{
|
|
3147
|
+
name: "[Gen 6] ZU",
|
|
3148
|
+
threads: [
|
|
3149
|
+
`• <a href="https://www.smogon.com/dex/xy/formats/zu/">ORAS ZU Banlist</a>`,
|
|
3150
|
+
`• <a href="https://www.smogon.com/forums/posts/8034679/">ORAS ZU Viability Rankings</a>`,
|
|
3151
|
+
],
|
|
3152
|
+
|
|
3153
|
+
mod: 'gen6',
|
|
3154
|
+
searchShow: false,
|
|
3155
|
+
ruleset: ['[Gen 6] PU'],
|
|
3156
|
+
banlist: ['PU', 'Fraxure', 'Regigigas', 'Simisear'],
|
|
3157
|
+
},
|
|
3071
3158
|
{
|
|
3072
3159
|
name: "[Gen 6] CAP",
|
|
3073
3160
|
threads: [
|
|
@@ -3079,7 +3166,7 @@ export const Formats: FormatList = [
|
|
|
3079
3166
|
mod: 'gen6',
|
|
3080
3167
|
searchShow: false,
|
|
3081
3168
|
ruleset: ['[Gen 6] OU', '+CAP'],
|
|
3082
|
-
banlist: ['Aurumoth', 'Cawmodore'
|
|
3169
|
+
banlist: ['Aurumoth', 'Cawmodore'],
|
|
3083
3170
|
},
|
|
3084
3171
|
{
|
|
3085
3172
|
name: "[Gen 6] Battle Spot Singles",
|
|
@@ -3276,7 +3363,7 @@ export const Formats: FormatList = [
|
|
|
3276
3363
|
mod: 'gen5',
|
|
3277
3364
|
searchShow: false,
|
|
3278
3365
|
ruleset: ['[Gen 5] NU', 'Sleep Moves Clause'],
|
|
3279
|
-
banlist: ['NU', 'PUBL'],
|
|
3366
|
+
banlist: ['NU', 'PUBL', 'Damp Rock'],
|
|
3280
3367
|
},
|
|
3281
3368
|
{
|
|
3282
3369
|
name: "[Gen 5] LC",
|
|
@@ -3302,7 +3389,7 @@ export const Formats: FormatList = [
|
|
|
3302
3389
|
|
|
3303
3390
|
mod: 'gen5',
|
|
3304
3391
|
searchShow: false,
|
|
3305
|
-
ruleset: ['[Gen 5] OU', 'Same Type Clause'],
|
|
3392
|
+
ruleset: ['[Gen 5] OU', 'Same Type Clause', '!Gems Clause'],
|
|
3306
3393
|
},
|
|
3307
3394
|
{
|
|
3308
3395
|
name: "[Gen 5] 1v1",
|
|
@@ -3448,7 +3535,7 @@ export const Formats: FormatList = [
|
|
|
3448
3535
|
|
|
3449
3536
|
mod: 'gen4',
|
|
3450
3537
|
searchShow: false,
|
|
3451
|
-
ruleset: ['[Gen 4] OU'],
|
|
3538
|
+
ruleset: ['[Gen 4] OU', '!Freeze Clause Mod'],
|
|
3452
3539
|
banlist: ['OU', 'UUBL'],
|
|
3453
3540
|
unbanlist: ['Arena Trap', 'Swagger'],
|
|
3454
3541
|
},
|
|
@@ -3515,7 +3602,7 @@ export const Formats: FormatList = [
|
|
|
3515
3602
|
searchShow: false,
|
|
3516
3603
|
ruleset: [
|
|
3517
3604
|
'Picked Team Size = 1', 'Max Team Size = 3',
|
|
3518
|
-
'[Gen 4] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview',
|
|
3605
|
+
'[Gen 4] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview', '!Freeze Clause Mod',
|
|
3519
3606
|
],
|
|
3520
3607
|
banlist: ['Latias', 'Machamp', 'Porygon-Z', 'Shaymin', 'Snorlax', 'Togekiss', 'Focus Sash', 'Destiny Bond', 'Explosion', 'Perish Song', 'Self-Destruct'],
|
|
3521
3608
|
unbanlist: ['Wobbuffet', 'Wynaut', 'Sand Veil', 'Swagger'],
|
|
@@ -3562,7 +3649,7 @@ export const Formats: FormatList = [
|
|
|
3562
3649
|
mod: 'gen4',
|
|
3563
3650
|
gameType: 'doubles',
|
|
3564
3651
|
searchShow: false,
|
|
3565
|
-
ruleset: ['[Gen 4] OU'],
|
|
3652
|
+
ruleset: ['[Gen 4] OU', '!Freeze Clause Mod'],
|
|
3566
3653
|
banlist: ['Explosion'],
|
|
3567
3654
|
unbanlist: ['Garchomp', 'Latias', 'Latios', 'Manaphy', 'Mew', 'Salamence', 'Wobbuffet', 'Wynaut', 'Swagger'],
|
|
3568
3655
|
},
|
|
@@ -3624,9 +3711,8 @@ export const Formats: FormatList = [
|
|
|
3624
3711
|
|
|
3625
3712
|
mod: 'gen3',
|
|
3626
3713
|
searchShow: false,
|
|
3627
|
-
ruleset: ['Standard'
|
|
3628
|
-
banlist: ['Uber', 'OU', 'UUBL', 'Smeargle + Ingrain', 'Baton Pass'],
|
|
3629
|
-
unbanlist: ['Scyther'],
|
|
3714
|
+
ruleset: ['Standard'],
|
|
3715
|
+
banlist: ['Uber', 'OU', 'UUBL', 'Smeargle + Ingrain', 'Arena Trap', 'Bright Powder', 'Lax Incense', 'Baton Pass', 'Swagger'],
|
|
3630
3716
|
},
|
|
3631
3717
|
{
|
|
3632
3718
|
name: "[Gen 3] NU",
|
|
@@ -3636,9 +3722,8 @@ export const Formats: FormatList = [
|
|
|
3636
3722
|
|
|
3637
3723
|
mod: 'gen3',
|
|
3638
3724
|
searchShow: false,
|
|
3639
|
-
ruleset: ['
|
|
3640
|
-
banlist: ['UU'],
|
|
3641
|
-
unbanlist: ['Baton Pass'],
|
|
3725
|
+
ruleset: ['Standard'],
|
|
3726
|
+
banlist: ['Uber', 'OU', 'UUBL', 'UU', 'Smeargle + Ingrain'],
|
|
3642
3727
|
},
|
|
3643
3728
|
{
|
|
3644
3729
|
name: "[Gen 3] Doubles OU",
|
|
@@ -3653,22 +3738,6 @@ export const Formats: FormatList = [
|
|
|
3653
3738
|
banlist: ['Uber'],
|
|
3654
3739
|
unbanlist: ['Deoxys-Speed', 'Wobbuffet', 'Wynaut'],
|
|
3655
3740
|
},
|
|
3656
|
-
{
|
|
3657
|
-
name: "[Gen 3] 1v1",
|
|
3658
|
-
desc: `Bring three Pokémon to Team Preview and choose one to battle.`,
|
|
3659
|
-
threads: [
|
|
3660
|
-
`• <a href="https://www.smogon.com/forums/posts/8031456/">ADV 1v1</a>`,
|
|
3661
|
-
],
|
|
3662
|
-
|
|
3663
|
-
mod: 'gen3',
|
|
3664
|
-
searchShow: false,
|
|
3665
|
-
ruleset: [
|
|
3666
|
-
'Picked Team Size = 1', 'Max Team Size = 3',
|
|
3667
|
-
'[Gen 3] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview',
|
|
3668
|
-
],
|
|
3669
|
-
banlist: ['Clefable', 'Slaking', 'Snorlax', 'Suicune', 'Destiny Bond', 'Explosion', 'Ingrain', 'Perish Song', 'Self-Destruct', 'Bright Powder', 'Focus Band', 'King\'s Rock', 'Lax Incense', 'Quick Claw'],
|
|
3670
|
-
unbanlist: ['Mr. Mime', 'Wobbuffet', 'Wynaut', 'Sand Veil'],
|
|
3671
|
-
},
|
|
3672
3741
|
{
|
|
3673
3742
|
name: "[Gen 3] Custom Game",
|
|
3674
3743
|
|
|
@@ -3687,16 +3756,6 @@ export const Formats: FormatList = [
|
|
|
3687
3756
|
debug: true,
|
|
3688
3757
|
ruleset: ['HP Percentage Mod', 'Cancel Mod', 'Max Team Size = 24', 'Max Move Count = 24', 'Max Level = 9999', 'Default Level = 100'],
|
|
3689
3758
|
},
|
|
3690
|
-
{
|
|
3691
|
-
name: "[Gen 2] Ubers",
|
|
3692
|
-
threads: [
|
|
3693
|
-
`• <a href="https://www.smogon.com/forums/posts/8286282/">GSC Ubers</a>`,
|
|
3694
|
-
],
|
|
3695
|
-
|
|
3696
|
-
mod: 'gen2',
|
|
3697
|
-
searchShow: false,
|
|
3698
|
-
ruleset: ['Standard'],
|
|
3699
|
-
},
|
|
3700
3759
|
{
|
|
3701
3760
|
name: "[Gen 2] UU",
|
|
3702
3761
|
threads: [`• <a href="https://www.smogon.com/forums/threads/3576710/">GSC UU</a>`],
|
|
@@ -3765,6 +3824,16 @@ export const Formats: FormatList = [
|
|
|
3765
3824
|
battle: {trunc: Math.trunc},
|
|
3766
3825
|
ruleset: ['HP Percentage Mod', 'Cancel Mod', 'Max Team Size = 24', 'Max Move Count = 24', 'Max Level = 9999', 'Default Level = 100'],
|
|
3767
3826
|
},
|
|
3827
|
+
{
|
|
3828
|
+
name: "[Gen 1] Ubers",
|
|
3829
|
+
threads: [
|
|
3830
|
+
`• <a href="https://www.smogon.com/forums/posts/8286283/">RBY Ubers</a>`,
|
|
3831
|
+
],
|
|
3832
|
+
|
|
3833
|
+
mod: 'gen1',
|
|
3834
|
+
searchShow: false,
|
|
3835
|
+
ruleset: ['Standard'],
|
|
3836
|
+
},
|
|
3768
3837
|
{
|
|
3769
3838
|
name: "[Gen 1] UU",
|
|
3770
3839
|
threads: [
|
|
@@ -3774,7 +3843,7 @@ export const Formats: FormatList = [
|
|
|
3774
3843
|
|
|
3775
3844
|
mod: 'gen1',
|
|
3776
3845
|
searchShow: false,
|
|
3777
|
-
ruleset: ['[Gen 1] OU'],
|
|
3846
|
+
ruleset: ['[Gen 1] OU', 'APT Clause'],
|
|
3778
3847
|
banlist: ['OU', 'UUBL'],
|
|
3779
3848
|
},
|
|
3780
3849
|
{
|
|
@@ -3811,20 +3880,6 @@ export const Formats: FormatList = [
|
|
|
3811
3880
|
],
|
|
3812
3881
|
banlist: ['Uber'],
|
|
3813
3882
|
},
|
|
3814
|
-
{
|
|
3815
|
-
name: "[Gen 1] Stadium OU",
|
|
3816
|
-
threads: [
|
|
3817
|
-
`• <a href="https://www.smogon.com/forums/threads/3685877/">Stadium OU Viability Rankings</a>`,
|
|
3818
|
-
],
|
|
3819
|
-
|
|
3820
|
-
mod: 'gen1stadium',
|
|
3821
|
-
searchShow: false,
|
|
3822
|
-
ruleset: ['Standard', 'Team Preview'],
|
|
3823
|
-
banlist: ['Uber',
|
|
3824
|
-
'Nidoking + Fury Attack + Thrash', 'Exeggutor + Poison Powder + Stomp', 'Exeggutor + Sleep Powder + Stomp',
|
|
3825
|
-
'Exeggutor + Stun Spore + Stomp', 'Jolteon + Focus Energy + Thunder Shock', 'Flareon + Focus Energy + Ember',
|
|
3826
|
-
],
|
|
3827
|
-
},
|
|
3828
3883
|
{
|
|
3829
3884
|
name: "[Gen 1] Tradebacks OU",
|
|
3830
3885
|
desc: `RBY OU with movepool additions from the Time Capsule.`,
|