@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/build/config/formats.js
CHANGED
|
@@ -163,7 +163,7 @@ exports.Formats = [
|
|
|
163
163
|
desc: `All the Pokémon on a team must share a type.`,
|
|
164
164
|
threads: [
|
|
165
165
|
`• <a href="https://www.smogon.com/forums/threads/3672167/">Monotype Metagame Discussion</a>`,
|
|
166
|
-
`• <a href="https://www.smogon.com/forums/threads/
|
|
166
|
+
`• <a href="https://www.smogon.com/forums/threads/3702647/">Monotype Sample Teams</a>`,
|
|
167
167
|
`• <a href="https://www.smogon.com/forums/threads/3673165">Monotype Viability Rankings</a>`,
|
|
168
168
|
],
|
|
169
169
|
mod: 'gen8',
|
|
@@ -218,8 +218,8 @@ exports.Formats = [
|
|
|
218
218
|
mod: 'gen8',
|
|
219
219
|
ruleset: ['[Gen 8] PU'],
|
|
220
220
|
banlist: [
|
|
221
|
-
'PU', 'Arctovish', 'Aurorus', 'Basculin', 'Centiskorch', 'Drampa', 'Exeggutor-Alola', 'Gallade', 'Haunter', 'Magmortar', 'Magneton', '
|
|
222
|
-
'Rotom-Frost', 'Turtonator', 'Vanilluxe', 'Vikavolt', 'Silvally-Dragon', 'Silvally-Ground', 'Sneasel', 'Damp Rock', 'Grassy Seed',
|
|
221
|
+
'PU', 'Arctovish', 'Aurorus', 'Basculin', 'Centiskorch', 'Drampa', 'Exeggutor-Alola', 'Gallade', 'Haunter', 'Magmortar', 'Magneton', 'Malamar',
|
|
222
|
+
'Omastar', 'Rotom-Frost', 'Turtonator', 'Vanilluxe', 'Vikavolt', 'Silvally-Dragon', 'Silvally-Ground', 'Sneasel', 'Damp Rock', 'Grassy Seed',
|
|
223
223
|
],
|
|
224
224
|
},
|
|
225
225
|
{
|
|
@@ -233,8 +233,8 @@ exports.Formats = [
|
|
|
233
233
|
banlist: [
|
|
234
234
|
// LC OU
|
|
235
235
|
'Abra', 'Carvanha', 'Diglett-Base', 'Dwebble', 'Ferroseed', 'Foongus', 'Frillish', 'Grookey', 'Koffing',
|
|
236
|
-
'Larvesta', 'Magby', 'Magnemite', 'Mareanie', 'Mienfoo', 'Mudbray', '
|
|
237
|
-
'Ponyta
|
|
236
|
+
'Larvesta', 'Magby', 'Magnemite', 'Mareanie', 'Mienfoo', 'Mudbray', 'Natu', 'Onix', 'Pawniard',
|
|
237
|
+
'Ponyta-Base', 'Porygon', 'Slowpoke-Base', 'Staryu', 'Timburr', 'Trapinch', 'Tyrunt',
|
|
238
238
|
// LC UUBL
|
|
239
239
|
'Archen', 'Farfetch\u2019d-Galar', 'Scorbunny', 'Shellder', 'Wingull',
|
|
240
240
|
],
|
|
@@ -371,10 +371,10 @@ exports.Formats = [
|
|
|
371
371
|
'Standard Doubles', 'Accuracy Moves Clause', 'Dynamax Clause', 'Sleep Clause Mod',
|
|
372
372
|
],
|
|
373
373
|
banlist: [
|
|
374
|
-
'Calyrex-Ice', 'Calyrex-Shadow', 'Dialga', 'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Jirachi', 'Kyogre',
|
|
375
|
-
'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Rayquaza',
|
|
376
|
-
'Solgaleo', 'Tornadus-Base', 'Urshifu-Base', 'Urshifu-Rapid-Strike', 'Whimsicott', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned',
|
|
377
|
-
'Zamazenta-Crowned', 'Zekrom', 'Moody', 'Power Construct', 'Focus Sash', 'Ally Switch', 'Final Gambit', 'Perish Song', 'Swagger',
|
|
374
|
+
'Calyrex-Ice', 'Calyrex-Shadow', 'Cottonee', 'Dialga', 'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Jirachi', 'Kyogre',
|
|
375
|
+
'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Rayquaza',
|
|
376
|
+
'Reshiram', 'Solgaleo', 'Tornadus-Base', 'Urshifu-Base', 'Urshifu-Rapid-Strike', 'Whimsicott', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned',
|
|
377
|
+
'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Moody', 'Power Construct', 'Focus Sash', 'Ally Switch', 'Final Gambit', 'Perish Song', 'Swagger',
|
|
378
378
|
],
|
|
379
379
|
},
|
|
380
380
|
{
|
|
@@ -418,6 +418,17 @@ exports.Formats = [
|
|
|
418
418
|
}
|
|
419
419
|
},
|
|
420
420
|
},
|
|
421
|
+
{
|
|
422
|
+
name: "[Gen 8] Jump! Magikarp!",
|
|
423
|
+
desc: `Every team must contain Magikarp and bring it to the game.`,
|
|
424
|
+
threads: [
|
|
425
|
+
`• <a href="https://www.smogon.com/forums/threads/3704588/">Jump! Magikarp!</a>`,
|
|
426
|
+
],
|
|
427
|
+
mod: 'gen8',
|
|
428
|
+
gameType: 'doubles',
|
|
429
|
+
ruleset: ['Flat Rules', '!! Picked Team Size = 2', '!! Adjust Level = 50', 'Min Source Gen = 8', 'Force Select = Magikarp'],
|
|
430
|
+
banlist: ['Sub-Legendary'],
|
|
431
|
+
},
|
|
421
432
|
{
|
|
422
433
|
name: "[Gen 8] Doubles Custom Game",
|
|
423
434
|
mod: 'gen8',
|
|
@@ -570,36 +581,272 @@ exports.Formats = [
|
|
|
570
581
|
column: 2,
|
|
571
582
|
},
|
|
572
583
|
{
|
|
573
|
-
name: "[Gen 8]
|
|
574
|
-
desc: `Pokémon
|
|
584
|
+
name: "[Gen 8] Broken Record",
|
|
585
|
+
desc: `Pokémon can hold a TR to use that move in battle.`,
|
|
575
586
|
threads: [
|
|
576
|
-
`• <a href="https://www.smogon.com/forums/threads/
|
|
587
|
+
`• <a href="https://www.smogon.com/forums/threads/3701270/">Broken Record</a>`,
|
|
577
588
|
],
|
|
578
589
|
mod: 'gen8',
|
|
579
|
-
ruleset: ['Standard', '
|
|
590
|
+
ruleset: ['Standard', '!Sleep Clause Mod', 'Sleep Moves Clause', 'Dynamax Clause'],
|
|
580
591
|
banlist: [
|
|
581
|
-
'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Darmanitan-Galar', 'Dialga', 'Dracovish', '
|
|
582
|
-
'Groudon', 'Ho-Oh', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala',
|
|
583
|
-
'
|
|
584
|
-
'
|
|
585
|
-
'
|
|
592
|
+
'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Dragapult', 'Eternatus', 'Genesect', 'Giratina',
|
|
593
|
+
'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala',
|
|
594
|
+
'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza',
|
|
595
|
+
'Regieleki', 'Reshiram', 'Rillaboom', 'Solgaleo', 'Spectrier', 'Urshifu-Base', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta',
|
|
596
|
+
'Zamazenta-Crowned', 'Zekrom', 'Zygarde-Base', 'Arena Trap', 'Magnet Pull', 'Moody', 'Power Construct', 'Shadow Tag', 'TR29 (Baton Pass)',
|
|
597
|
+
'TR82 (Stored Power)', 'Baton Pass',
|
|
586
598
|
],
|
|
599
|
+
onValidateSet(set) {
|
|
600
|
+
if (!set.item)
|
|
601
|
+
return;
|
|
602
|
+
const item = this.dex.items.get(set.item);
|
|
603
|
+
if (!/^tr\d\d/i.test(item.name))
|
|
604
|
+
return;
|
|
605
|
+
const moveName = item.desc.split('move ')[1].split('.')[0];
|
|
606
|
+
if (set.moves.map(this.toID).includes(this.toID(moveName))) {
|
|
607
|
+
return [
|
|
608
|
+
`${set.species} can't run ${item.name} (${moveName}) as its item because it already has that move in its moveset.`,
|
|
609
|
+
];
|
|
610
|
+
}
|
|
611
|
+
},
|
|
612
|
+
onValidateTeam(team) {
|
|
613
|
+
const trs = new Set();
|
|
614
|
+
for (const set of team) {
|
|
615
|
+
if (!set.item)
|
|
616
|
+
continue;
|
|
617
|
+
const item = this.dex.items.get(set.item).name;
|
|
618
|
+
if (!/^tr\d\d/i.test(item))
|
|
619
|
+
continue;
|
|
620
|
+
if (trs.has(item)) {
|
|
621
|
+
return [`Your team already has a Pok\u00e9mon with ${item}.`];
|
|
622
|
+
}
|
|
623
|
+
trs.add(item);
|
|
624
|
+
}
|
|
625
|
+
},
|
|
626
|
+
onTakeItem(item) {
|
|
627
|
+
return !/^tr\d\d/i.test(item.name);
|
|
628
|
+
},
|
|
629
|
+
onModifyMove(move) {
|
|
630
|
+
if (move.id === 'knockoff') {
|
|
631
|
+
move.onBasePower = function (basePower, source, target, m) {
|
|
632
|
+
const item = target.getItem();
|
|
633
|
+
if (!this.singleEvent('TakeItem', item, target.itemState, target, target, m, item))
|
|
634
|
+
return;
|
|
635
|
+
// Very hardcode but I'd prefer to not make a mod for one damage calculation change
|
|
636
|
+
if (item.id && !/^tr\d\d/i.test(item.id)) {
|
|
637
|
+
return this.chainModify(1.5);
|
|
638
|
+
}
|
|
639
|
+
};
|
|
640
|
+
}
|
|
641
|
+
},
|
|
642
|
+
onBegin() {
|
|
643
|
+
for (const pokemon of this.getAllPokemon()) {
|
|
644
|
+
const item = pokemon.getItem();
|
|
645
|
+
if (/^tr\d\d/i.test(item.name)) {
|
|
646
|
+
const move = this.dex.moves.get(item.desc.split('move ')[1].split('.')[0]);
|
|
647
|
+
pokemon.moveSlots = pokemon.baseMoveSlots = [
|
|
648
|
+
...pokemon.baseMoveSlots, {
|
|
649
|
+
id: move.id,
|
|
650
|
+
move: move.name,
|
|
651
|
+
pp: move.pp * 8 / 5,
|
|
652
|
+
maxpp: move.pp * 8 / 5,
|
|
653
|
+
target: move.target,
|
|
654
|
+
disabled: false,
|
|
655
|
+
disabledSource: '',
|
|
656
|
+
used: false,
|
|
657
|
+
},
|
|
658
|
+
];
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
},
|
|
587
662
|
},
|
|
588
663
|
{
|
|
589
|
-
name: "[Gen 8]
|
|
590
|
-
desc: `
|
|
664
|
+
name: "[Gen 8] Inheritance",
|
|
665
|
+
desc: `Pokémon may use the ability and moves of another, as long as they forfeit their own learnset.`,
|
|
591
666
|
threads: [
|
|
592
|
-
`• <a href="https://www.smogon.com/forums/threads/
|
|
667
|
+
`• <a href="https://www.smogon.com/forums/threads/3656811/">Inheritance</a>`,
|
|
593
668
|
],
|
|
594
669
|
mod: 'gen8',
|
|
595
|
-
|
|
670
|
+
// searchShow: false,
|
|
671
|
+
ruleset: ['Standard', '!Sleep Clause Mod', 'Sleep Moves Clause', '2 Ability Clause', 'Dynamax Clause'],
|
|
596
672
|
banlist: [
|
|
597
|
-
'
|
|
598
|
-
'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem
|
|
599
|
-
'Mewtwo', '
|
|
600
|
-
'
|
|
601
|
-
'
|
|
673
|
+
'Blacephalon', 'Blaziken', 'Butterfree', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chansey', 'Combusken', 'Cresselia', 'Darmanitan-Galar', 'Dialga', 'Dracovish',
|
|
674
|
+
'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala',
|
|
675
|
+
'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Natu', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Regieleki',
|
|
676
|
+
'Regigigas', 'Reshiram', 'Sableye', 'Shedinja', 'Solgaleo', 'Spectrier', 'Tapu Koko', 'Toxtricity', 'Torkoal', 'Urshifu-Base', 'Xatu', 'Xerneas', 'Yveltal',
|
|
677
|
+
'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zeraora', 'Zekrom', 'Arena Trap', 'Contrary', 'Drizzle', 'Huge Power', 'Imposter', 'Innards Out',
|
|
678
|
+
'Libero', 'Moody', 'Power Construct', 'Pure Power', 'Quick Draw', 'Shadow Tag', 'Sheer Force', 'Simple', 'Unaware', 'Unburden', 'Water Bubble', 'King\'s Rock',
|
|
679
|
+
'Quick Claw', 'Baton Pass', 'Bolt Beak', 'Fishious Rend', 'Shell Smash', 'Thousand Arrows',
|
|
602
680
|
],
|
|
681
|
+
getEvoFamily(speciesid) {
|
|
682
|
+
let species = Dex.species.get(speciesid);
|
|
683
|
+
while (species.prevo) {
|
|
684
|
+
species = Dex.species.get(species.prevo);
|
|
685
|
+
}
|
|
686
|
+
return species.id;
|
|
687
|
+
},
|
|
688
|
+
validateSet(set, teamHas) {
|
|
689
|
+
const unreleased = (pokemon) => pokemon.tier === "Unreleased" && pokemon.isNonstandard === "Unobtainable";
|
|
690
|
+
if (!teamHas.abilityMap) {
|
|
691
|
+
teamHas.abilityMap = Object.create(null);
|
|
692
|
+
for (const pokemon of Dex.species.all()) {
|
|
693
|
+
if (pokemon.isNonstandard || unreleased(pokemon))
|
|
694
|
+
continue;
|
|
695
|
+
if (pokemon.requiredAbility || pokemon.requiredItem || pokemon.requiredMove)
|
|
696
|
+
continue;
|
|
697
|
+
if (this.ruleTable.isBannedSpecies(pokemon))
|
|
698
|
+
continue;
|
|
699
|
+
for (const key of Object.values(pokemon.abilities)) {
|
|
700
|
+
const abilityId = this.dex.toID(key);
|
|
701
|
+
if (abilityId in teamHas.abilityMap) {
|
|
702
|
+
teamHas.abilityMap[abilityId][pokemon.evos ? 'push' : 'unshift'](pokemon.id);
|
|
703
|
+
}
|
|
704
|
+
else {
|
|
705
|
+
teamHas.abilityMap[abilityId] = [pokemon.id];
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
}
|
|
710
|
+
const problem = this.validateForme(set);
|
|
711
|
+
if (problem.length)
|
|
712
|
+
return problem;
|
|
713
|
+
const species = this.dex.species.get(set.species);
|
|
714
|
+
if (!species.exists || species.num < 1)
|
|
715
|
+
return [`The Pok\u00e9mon "${set.species}" does not exist.`];
|
|
716
|
+
if (species.isNonstandard || unreleased(species)) {
|
|
717
|
+
return [`${species.name} is not obtainable in Generation ${this.dex.gen}.`];
|
|
718
|
+
}
|
|
719
|
+
const name = set.name;
|
|
720
|
+
if (this.ruleTable.isBannedSpecies(species)) {
|
|
721
|
+
return this.validateSet(set, teamHas);
|
|
722
|
+
}
|
|
723
|
+
const ability = this.dex.abilities.get(set.ability);
|
|
724
|
+
if (!ability.exists || ability.isNonstandard)
|
|
725
|
+
return [`${name} needs to have a valid ability.`];
|
|
726
|
+
const pokemonWithAbility = teamHas.abilityMap[ability.id];
|
|
727
|
+
if (!pokemonWithAbility)
|
|
728
|
+
return [`${ability.name} is not available on a legal Pok\u00e9mon.`];
|
|
729
|
+
this.format.debug = true;
|
|
730
|
+
if (!teamHas.abilitySources)
|
|
731
|
+
teamHas.abilitySources = Object.create(null);
|
|
732
|
+
const validSources = teamHas.abilitySources[this.dex.toID(set.species)] = []; // Evolution families
|
|
733
|
+
let canonicalSource = ''; // Specific for the basic implementation of Donor Clause (see onValidateTeam).
|
|
734
|
+
for (const donor of pokemonWithAbility) {
|
|
735
|
+
const donorSpecies = this.dex.species.get(donor);
|
|
736
|
+
let format = this.format;
|
|
737
|
+
if (!format.getEvoFamily)
|
|
738
|
+
format = this.dex.formats.get('gen8inheritance');
|
|
739
|
+
const evoFamily = format.getEvoFamily(donorSpecies.id);
|
|
740
|
+
if (validSources.includes(evoFamily))
|
|
741
|
+
continue;
|
|
742
|
+
set.species = donorSpecies.name;
|
|
743
|
+
set.name = donorSpecies.baseSpecies;
|
|
744
|
+
const problems = this.validateSet(set, teamHas) || [];
|
|
745
|
+
if (!problems.length) {
|
|
746
|
+
validSources.push(evoFamily);
|
|
747
|
+
canonicalSource = donorSpecies.name;
|
|
748
|
+
}
|
|
749
|
+
// Specific for the basic implementation of Donor Clause (see onValidateTeam).
|
|
750
|
+
if (validSources.length > 1)
|
|
751
|
+
break;
|
|
752
|
+
}
|
|
753
|
+
this.format.debug = false;
|
|
754
|
+
set.name = name;
|
|
755
|
+
set.species = species.name;
|
|
756
|
+
if (!validSources.length) {
|
|
757
|
+
if (pokemonWithAbility.length > 1)
|
|
758
|
+
return [`${name}'s set is illegal.`];
|
|
759
|
+
return [`${name} has an illegal set with an ability from ${this.dex.species.get(pokemonWithAbility[0]).name}.`];
|
|
760
|
+
}
|
|
761
|
+
// Protocol: Include the data of the donor species in the `ability` data slot.
|
|
762
|
+
// Afterwards, we are going to reset the name to what the user intended.
|
|
763
|
+
set.ability = `${set.ability}0${canonicalSource}`;
|
|
764
|
+
return null;
|
|
765
|
+
},
|
|
766
|
+
onValidateTeam(team, f, teamHas) {
|
|
767
|
+
if (this.ruleTable.has('2abilityclause')) {
|
|
768
|
+
const abilityTable = new Map();
|
|
769
|
+
const base = {
|
|
770
|
+
airlock: 'cloudnine',
|
|
771
|
+
battlearmor: 'shellarmor',
|
|
772
|
+
clearbody: 'whitesmoke',
|
|
773
|
+
dazzling: 'queenlymajesty',
|
|
774
|
+
emergencyexit: 'wimpout',
|
|
775
|
+
filter: 'solidrock',
|
|
776
|
+
gooey: 'tanglinghair',
|
|
777
|
+
insomnia: 'vitalspirit',
|
|
778
|
+
ironbarbs: 'roughskin',
|
|
779
|
+
libero: 'protean',
|
|
780
|
+
minus: 'plus',
|
|
781
|
+
moxie: 'chillingneigh',
|
|
782
|
+
powerofalchemy: 'receiver',
|
|
783
|
+
propellertail: 'stalwart',
|
|
784
|
+
teravolt: 'moldbreaker',
|
|
785
|
+
turboblaze: 'moldbreaker',
|
|
786
|
+
};
|
|
787
|
+
for (const set of team) {
|
|
788
|
+
let ability = this.toID(set.ability.split('0')[0]);
|
|
789
|
+
if (!ability)
|
|
790
|
+
continue;
|
|
791
|
+
if (ability in base)
|
|
792
|
+
ability = base[ability];
|
|
793
|
+
if ((abilityTable.get(ability) || 0) >= 2) {
|
|
794
|
+
return [
|
|
795
|
+
`You are limited to two of each ability by 2 Ability Clause.`,
|
|
796
|
+
`(You have more than two ${this.dex.abilities.get(ability).name} variants)`,
|
|
797
|
+
];
|
|
798
|
+
}
|
|
799
|
+
abilityTable.set(ability, (abilityTable.get(ability) || 0) + 1);
|
|
800
|
+
}
|
|
801
|
+
}
|
|
802
|
+
// Donor Clause
|
|
803
|
+
const evoFamilyLists = [];
|
|
804
|
+
for (const set of team) {
|
|
805
|
+
const abilitySources = teamHas.abilitySources?.[this.dex.toID(set.species)];
|
|
806
|
+
if (!abilitySources)
|
|
807
|
+
continue;
|
|
808
|
+
let format = this.format;
|
|
809
|
+
if (!format.getEvoFamily)
|
|
810
|
+
format = this.dex.formats.get('gen8inheritance');
|
|
811
|
+
evoFamilyLists.push(abilitySources.map(format.getEvoFamily));
|
|
812
|
+
}
|
|
813
|
+
// Checking actual full incompatibility would require expensive algebra.
|
|
814
|
+
// Instead, we only check the trivial case of multiple Pokémon only legal for exactly one family. FIXME?
|
|
815
|
+
const requiredFamilies = Object.create(null);
|
|
816
|
+
for (const evoFamilies of evoFamilyLists) {
|
|
817
|
+
if (evoFamilies.length !== 1)
|
|
818
|
+
continue;
|
|
819
|
+
const [familyId] = evoFamilies;
|
|
820
|
+
if (!(familyId in requiredFamilies))
|
|
821
|
+
requiredFamilies[familyId] = 1;
|
|
822
|
+
requiredFamilies[familyId]++;
|
|
823
|
+
if (requiredFamilies[familyId] > 2) {
|
|
824
|
+
return [
|
|
825
|
+
`You are limited to up to two inheritances from each evolution family by the Donor Clause.`,
|
|
826
|
+
`(You inherit more than twice from ${this.dex.species.get(familyId).name}).`,
|
|
827
|
+
];
|
|
828
|
+
}
|
|
829
|
+
}
|
|
830
|
+
},
|
|
831
|
+
onBegin() {
|
|
832
|
+
for (const pokemon of this.getAllPokemon()) {
|
|
833
|
+
if (pokemon.baseAbility.includes('0')) {
|
|
834
|
+
const donor = pokemon.baseAbility.split('0')[1];
|
|
835
|
+
pokemon.m.donor = this.toID(donor);
|
|
836
|
+
pokemon.baseAbility = this.toID(pokemon.baseAbility.split('0')[0]);
|
|
837
|
+
pokemon.ability = pokemon.baseAbility;
|
|
838
|
+
}
|
|
839
|
+
}
|
|
840
|
+
},
|
|
841
|
+
onSwitchIn(pokemon) {
|
|
842
|
+
if (!pokemon.m.donor)
|
|
843
|
+
return;
|
|
844
|
+
const donorTemplate = this.dex.species.get(pokemon.m.donor);
|
|
845
|
+
if (!donorTemplate.exists)
|
|
846
|
+
return;
|
|
847
|
+
// Place volatiles on the Pokémon to show the donor details.
|
|
848
|
+
this.add('-start', pokemon, donorTemplate.name, '[silent]');
|
|
849
|
+
},
|
|
603
850
|
},
|
|
604
851
|
// Other Metagames
|
|
605
852
|
///////////////////////////////////////////////////////////////////
|
|
@@ -620,8 +867,8 @@ exports.Formats = [
|
|
|
620
867
|
'Calyrex-Shadow', 'Cramorant-Gorging', 'Darmanitan-Galar-Zen', 'Eternatus-Eternamax', 'Shedinja', 'Zacian-Crowned',
|
|
621
868
|
'Arena Trap', 'Contrary', 'Gorilla Tactics', 'Huge Power', 'Illusion', 'Innards Out', 'Intrepid Sword', 'Libero',
|
|
622
869
|
'Magnet Pull', 'Moody', 'Neutralizing Gas', 'Parental Bond', 'Protean', 'Pure Power', 'Shadow Tag', 'Stakeout',
|
|
623
|
-
'Water Bubble', 'Wonder Guard', 'Comatose + Sleep Talk', 'Rusted Sword', '
|
|
624
|
-
'Octolock', 'Shell Smash',
|
|
870
|
+
'Water Bubble', 'Wonder Guard', 'Comatose + Sleep Talk', 'Rusted Sword', 'Belly Drum', 'Bolt Beak', 'Court Change',
|
|
871
|
+
'Double Iron Bash', 'Octolock', 'Shell Smash',
|
|
625
872
|
],
|
|
626
873
|
},
|
|
627
874
|
{
|
|
@@ -634,8 +881,8 @@ exports.Formats = [
|
|
|
634
881
|
mod: 'gen8',
|
|
635
882
|
ruleset: ['Standard', '!Obtainable Abilities', '2 Ability Clause', 'Dynamax Clause', 'Sleep Moves Clause', '!Sleep Clause Mod'],
|
|
636
883
|
banlist: [
|
|
637
|
-
'Archeops', 'Blacephalon', 'Buzzwole', 'Calyrex-Ice', 'Calyrex-Shadow', 'Dialga', 'Dracovish', 'Dragapult', 'Dragonite', 'Eternatus',
|
|
638
|
-
'
|
|
884
|
+
'Archeops', 'Blacephalon', 'Buzzwole', 'Calyrex-Ice', 'Calyrex-Shadow', 'Dialga', 'Dracovish', 'Dragapult', 'Dragonite', 'Eternatus', 'Gengar',
|
|
885
|
+
'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Keldeo', 'Kommo-o', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White',
|
|
639
886
|
'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Noivern',
|
|
640
887
|
'Palkia', 'Pheromosa', 'Rayquaza', 'Regigigas', 'Reshiram', 'Shedinja', 'Solgaleo', 'Spectrier', 'Urshifu', 'Urshifu-Rapid-Strike',
|
|
641
888
|
'Victini', 'Weavile', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Base', 'Zekrom', 'Zeraora', 'Zygarde-Base',
|
|
@@ -732,9 +979,9 @@ exports.Formats = [
|
|
|
732
979
|
'Arena Trap', 'Magnet Pull', 'Moody', 'Power Construct', 'Shadow Tag', 'King\'s Rock', 'Baton Pass',
|
|
733
980
|
],
|
|
734
981
|
restricted: [
|
|
735
|
-
'Acupressure', 'Astral Barrage', 'Belly Drum', 'Bolt Beak', 'Clangorous Soul', 'Double Iron Bash', 'Electrify', 'Extreme Speed', '
|
|
736
|
-
'Geomancy', 'Glacial Lance', 'Oblivion Wing', 'Precipice Blades', 'Shell Smash', 'Shift Gear', 'Thousand Arrows', 'Thunderous Kick',
|
|
737
|
-
'Wicked Blow',
|
|
982
|
+
'Acupressure', 'Astral Barrage', 'Belly Drum', 'Bolt Beak', 'Clangorous Soul', 'Double Iron Bash', 'Electrify', 'Extreme Speed', 'Final Gambit',
|
|
983
|
+
'Fishious Rend', 'Geomancy', 'Glacial Lance', 'Oblivion Wing', 'Precipice Blades', 'Shell Smash', 'Shift Gear', 'Thousand Arrows', 'Thunderous Kick',
|
|
984
|
+
'V-create', 'Wicked Blow',
|
|
738
985
|
],
|
|
739
986
|
},
|
|
740
987
|
{
|
|
@@ -921,7 +1168,7 @@ exports.Formats = [
|
|
|
921
1168
|
],
|
|
922
1169
|
mod: 'gen8bdsp',
|
|
923
1170
|
ruleset: ['Little Cup', 'Standard'],
|
|
924
|
-
banlist: ['Gligar', 'Meditite', 'Misdreavus', 'Murkrow', 'Scyther', 'Sneasel', 'Tangela', 'Vulpix', 'Yanma', 'Moody', 'Baton Pass', 'Sticky Web'],
|
|
1171
|
+
banlist: ['Gligar', 'Meditite', 'Misdreavus', 'Munchlax', 'Murkrow', 'Scyther', 'Sneasel', 'Tangela', 'Vulpix', 'Yanma', 'Moody', 'Baton Pass', 'Sticky Web'],
|
|
925
1172
|
},
|
|
926
1173
|
{
|
|
927
1174
|
name: "[Gen 8 BDSP] Monotype",
|
|
@@ -1149,194 +1396,6 @@ exports.Formats = [
|
|
|
1149
1396
|
}
|
|
1150
1397
|
},
|
|
1151
1398
|
},
|
|
1152
|
-
{
|
|
1153
|
-
name: "[Gen 8] Inheritance",
|
|
1154
|
-
desc: `Pokémon may use the ability and moves of another, as long as they forfeit their own learnset.`,
|
|
1155
|
-
threads: [
|
|
1156
|
-
`• <a href="https://www.smogon.com/forums/threads/3656811/">Inheritance</a>`,
|
|
1157
|
-
],
|
|
1158
|
-
mod: 'gen8',
|
|
1159
|
-
searchShow: false,
|
|
1160
|
-
ruleset: ['Standard', '2 Ability Clause', 'Dynamax Clause'],
|
|
1161
|
-
banlist: [
|
|
1162
|
-
'Blacephalon', 'Blaziken', 'Butterfree', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chansey', 'Combusken', 'Cresselia', 'Darmanitan-Galar', 'Dialga', 'Dracovish',
|
|
1163
|
-
'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala',
|
|
1164
|
-
'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Natu', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Regieleki',
|
|
1165
|
-
'Regigigas', 'Reshiram', 'Sableye', 'Shedinja', 'Solgaleo', 'Spectrier', 'Tapu Koko', 'Toxtricity', 'Torkoal', 'Urshifu-Base', 'Xatu', 'Xerneas', 'Yveltal',
|
|
1166
|
-
'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zeraora', 'Zekrom', 'Arena Trap', 'Contrary', 'Drizzle', 'Huge Power', 'Imposter', 'Innards Out',
|
|
1167
|
-
'Libero', 'Moody', 'Power Construct', 'Pure Power', 'Quick Draw', 'Shadow Tag', 'Sheer Force', 'Simple', 'Unaware', 'Unburden', 'Water Bubble', 'King\'s Rock',
|
|
1168
|
-
'Quick Claw', 'Baton Pass', 'Bolt Beak', 'Fishious Rend', 'Shell Smash', 'Thousand Arrows',
|
|
1169
|
-
],
|
|
1170
|
-
getEvoFamily(speciesid) {
|
|
1171
|
-
let species = Dex.species.get(speciesid);
|
|
1172
|
-
while (species.prevo) {
|
|
1173
|
-
species = Dex.species.get(species.prevo);
|
|
1174
|
-
}
|
|
1175
|
-
return species.id;
|
|
1176
|
-
},
|
|
1177
|
-
validateSet(set, teamHas) {
|
|
1178
|
-
const unreleased = (pokemon) => pokemon.tier === "Unreleased" && pokemon.isNonstandard === "Unobtainable";
|
|
1179
|
-
if (!teamHas.abilityMap) {
|
|
1180
|
-
teamHas.abilityMap = Object.create(null);
|
|
1181
|
-
for (const pokemon of Dex.species.all()) {
|
|
1182
|
-
if (pokemon.isNonstandard || unreleased(pokemon))
|
|
1183
|
-
continue;
|
|
1184
|
-
if (pokemon.requiredAbility || pokemon.requiredItem || pokemon.requiredMove)
|
|
1185
|
-
continue;
|
|
1186
|
-
if (this.ruleTable.isBannedSpecies(pokemon))
|
|
1187
|
-
continue;
|
|
1188
|
-
for (const key of Object.values(pokemon.abilities)) {
|
|
1189
|
-
const abilityId = this.dex.toID(key);
|
|
1190
|
-
if (abilityId in teamHas.abilityMap) {
|
|
1191
|
-
teamHas.abilityMap[abilityId][pokemon.evos ? 'push' : 'unshift'](pokemon.id);
|
|
1192
|
-
}
|
|
1193
|
-
else {
|
|
1194
|
-
teamHas.abilityMap[abilityId] = [pokemon.id];
|
|
1195
|
-
}
|
|
1196
|
-
}
|
|
1197
|
-
}
|
|
1198
|
-
}
|
|
1199
|
-
const problem = this.validateForme(set);
|
|
1200
|
-
if (problem.length)
|
|
1201
|
-
return problem;
|
|
1202
|
-
const species = this.dex.species.get(set.species);
|
|
1203
|
-
if (!species.exists || species.num < 1)
|
|
1204
|
-
return [`The Pok\u00e9mon "${set.species}" does not exist.`];
|
|
1205
|
-
if (species.isNonstandard || unreleased(species)) {
|
|
1206
|
-
return [`${species.name} is not obtainable in Generation ${this.dex.gen}.`];
|
|
1207
|
-
}
|
|
1208
|
-
const name = set.name;
|
|
1209
|
-
if (this.ruleTable.isBannedSpecies(species)) {
|
|
1210
|
-
return this.validateSet(set, teamHas);
|
|
1211
|
-
}
|
|
1212
|
-
const ability = this.dex.abilities.get(set.ability);
|
|
1213
|
-
if (!ability.exists || ability.isNonstandard)
|
|
1214
|
-
return [`${name} needs to have a valid ability.`];
|
|
1215
|
-
const pokemonWithAbility = teamHas.abilityMap[ability.id];
|
|
1216
|
-
if (!pokemonWithAbility)
|
|
1217
|
-
return [`${ability.name} is not available on a legal Pok\u00e9mon.`];
|
|
1218
|
-
this.format.debug = true;
|
|
1219
|
-
if (!teamHas.abilitySources)
|
|
1220
|
-
teamHas.abilitySources = Object.create(null);
|
|
1221
|
-
const validSources = teamHas.abilitySources[this.dex.toID(set.species)] = []; // Evolution families
|
|
1222
|
-
let canonicalSource = ''; // Specific for the basic implementation of Donor Clause (see onValidateTeam).
|
|
1223
|
-
for (const donor of pokemonWithAbility) {
|
|
1224
|
-
const donorSpecies = this.dex.species.get(donor);
|
|
1225
|
-
let format = this.format;
|
|
1226
|
-
if (!format.getEvoFamily)
|
|
1227
|
-
format = this.dex.formats.get('gen8inheritance');
|
|
1228
|
-
const evoFamily = format.getEvoFamily(donorSpecies.id);
|
|
1229
|
-
if (validSources.includes(evoFamily))
|
|
1230
|
-
continue;
|
|
1231
|
-
set.species = donorSpecies.name;
|
|
1232
|
-
set.name = donorSpecies.baseSpecies;
|
|
1233
|
-
const problems = this.validateSet(set, teamHas) || [];
|
|
1234
|
-
if (!problems.length) {
|
|
1235
|
-
validSources.push(evoFamily);
|
|
1236
|
-
canonicalSource = donorSpecies.name;
|
|
1237
|
-
}
|
|
1238
|
-
// Specific for the basic implementation of Donor Clause (see onValidateTeam).
|
|
1239
|
-
if (validSources.length > 1)
|
|
1240
|
-
break;
|
|
1241
|
-
}
|
|
1242
|
-
this.format.debug = false;
|
|
1243
|
-
set.name = name;
|
|
1244
|
-
set.species = species.name;
|
|
1245
|
-
if (!validSources.length) {
|
|
1246
|
-
if (pokemonWithAbility.length > 1)
|
|
1247
|
-
return [`${name}'s set is illegal.`];
|
|
1248
|
-
return [`${name} has an illegal set with an ability from ${this.dex.species.get(pokemonWithAbility[0]).name}.`];
|
|
1249
|
-
}
|
|
1250
|
-
// Protocol: Include the data of the donor species in the `ability` data slot.
|
|
1251
|
-
// Afterwards, we are going to reset the name to what the user intended.
|
|
1252
|
-
set.ability = `${set.ability}0${canonicalSource}`;
|
|
1253
|
-
return null;
|
|
1254
|
-
},
|
|
1255
|
-
onValidateTeam(team, f, teamHas) {
|
|
1256
|
-
if (this.ruleTable.has('2abilityclause')) {
|
|
1257
|
-
const abilityTable = new Map();
|
|
1258
|
-
const base = {
|
|
1259
|
-
airlock: 'cloudnine',
|
|
1260
|
-
battlearmor: 'shellarmor',
|
|
1261
|
-
clearbody: 'whitesmoke',
|
|
1262
|
-
dazzling: 'queenlymajesty',
|
|
1263
|
-
emergencyexit: 'wimpout',
|
|
1264
|
-
filter: 'solidrock',
|
|
1265
|
-
gooey: 'tanglinghair',
|
|
1266
|
-
insomnia: 'vitalspirit',
|
|
1267
|
-
ironbarbs: 'roughskin',
|
|
1268
|
-
libero: 'protean',
|
|
1269
|
-
minus: 'plus',
|
|
1270
|
-
moxie: 'chillingneigh',
|
|
1271
|
-
powerofalchemy: 'receiver',
|
|
1272
|
-
propellertail: 'stalwart',
|
|
1273
|
-
teravolt: 'moldbreaker',
|
|
1274
|
-
turboblaze: 'moldbreaker',
|
|
1275
|
-
};
|
|
1276
|
-
for (const set of team) {
|
|
1277
|
-
let ability = this.toID(set.ability.split('0')[0]);
|
|
1278
|
-
if (!ability)
|
|
1279
|
-
continue;
|
|
1280
|
-
if (ability in base)
|
|
1281
|
-
ability = base[ability];
|
|
1282
|
-
if ((abilityTable.get(ability) || 0) >= 2) {
|
|
1283
|
-
return [
|
|
1284
|
-
`You are limited to two of each ability by 2 Ability Clause.`,
|
|
1285
|
-
`(You have more than two ${this.dex.abilities.get(ability).name} variants)`,
|
|
1286
|
-
];
|
|
1287
|
-
}
|
|
1288
|
-
abilityTable.set(ability, (abilityTable.get(ability) || 0) + 1);
|
|
1289
|
-
}
|
|
1290
|
-
}
|
|
1291
|
-
// Donor Clause
|
|
1292
|
-
const evoFamilyLists = [];
|
|
1293
|
-
for (const set of team) {
|
|
1294
|
-
const abilitySources = teamHas.abilitySources?.[this.dex.toID(set.species)];
|
|
1295
|
-
if (!abilitySources)
|
|
1296
|
-
continue;
|
|
1297
|
-
let format = this.format;
|
|
1298
|
-
if (!format.getEvoFamily)
|
|
1299
|
-
format = this.dex.formats.get('gen8inheritance');
|
|
1300
|
-
evoFamilyLists.push(abilitySources.map(format.getEvoFamily));
|
|
1301
|
-
}
|
|
1302
|
-
// Checking actual full incompatibility would require expensive algebra.
|
|
1303
|
-
// Instead, we only check the trivial case of multiple Pokémon only legal for exactly one family. FIXME?
|
|
1304
|
-
const requiredFamilies = Object.create(null);
|
|
1305
|
-
for (const evoFamilies of evoFamilyLists) {
|
|
1306
|
-
if (evoFamilies.length !== 1)
|
|
1307
|
-
continue;
|
|
1308
|
-
const [familyId] = evoFamilies;
|
|
1309
|
-
if (!(familyId in requiredFamilies))
|
|
1310
|
-
requiredFamilies[familyId] = 1;
|
|
1311
|
-
requiredFamilies[familyId]++;
|
|
1312
|
-
if (requiredFamilies[familyId] > 2) {
|
|
1313
|
-
return [
|
|
1314
|
-
`You are limited to up to two inheritances from each evolution family by the Donor Clause.`,
|
|
1315
|
-
`(You inherit more than twice from ${this.dex.species.get(familyId).name}).`,
|
|
1316
|
-
];
|
|
1317
|
-
}
|
|
1318
|
-
}
|
|
1319
|
-
},
|
|
1320
|
-
onBegin() {
|
|
1321
|
-
for (const pokemon of this.getAllPokemon()) {
|
|
1322
|
-
if (pokemon.baseAbility.includes('0')) {
|
|
1323
|
-
const donor = pokemon.baseAbility.split('0')[1];
|
|
1324
|
-
pokemon.m.donor = this.toID(donor);
|
|
1325
|
-
pokemon.baseAbility = this.toID(pokemon.baseAbility.split('0')[0]);
|
|
1326
|
-
pokemon.ability = pokemon.baseAbility;
|
|
1327
|
-
}
|
|
1328
|
-
}
|
|
1329
|
-
},
|
|
1330
|
-
onSwitchIn(pokemon) {
|
|
1331
|
-
if (!pokemon.m.donor)
|
|
1332
|
-
return;
|
|
1333
|
-
const donorTemplate = this.dex.species.get(pokemon.m.donor);
|
|
1334
|
-
if (!donorTemplate.exists)
|
|
1335
|
-
return;
|
|
1336
|
-
// Place volatiles on the Pokémon to show the donor details.
|
|
1337
|
-
this.add('-start', pokemon, donorTemplate.name, '[silent]');
|
|
1338
|
-
},
|
|
1339
|
-
},
|
|
1340
1399
|
{
|
|
1341
1400
|
name: "[Gen 8] Linked",
|
|
1342
1401
|
desc: `The first two moves in a Pokémon's moveset are used simultaneously.`,
|
|
@@ -2318,35 +2377,44 @@ exports.Formats = [
|
|
|
2318
2377
|
column: 3,
|
|
2319
2378
|
},
|
|
2320
2379
|
{
|
|
2321
|
-
name: "[Gen
|
|
2380
|
+
name: "[Gen 2] Ubers",
|
|
2322
2381
|
threads: [
|
|
2323
|
-
`• <a href="https://www.smogon.com/forums/
|
|
2324
|
-
`• <a href="https://www.smogon.com/forums/threads/3641346/">USM UU Viability Rankings</a>`,
|
|
2382
|
+
`• <a href="https://www.smogon.com/forums/posts/8286282/">GSC Ubers</a>`,
|
|
2325
2383
|
],
|
|
2326
|
-
mod: '
|
|
2384
|
+
mod: 'gen2',
|
|
2327
2385
|
// searchShow: false,
|
|
2328
|
-
ruleset: ['
|
|
2329
|
-
banlist: ['OU', 'UUBL', 'Drizzle', 'Drought', 'Kommonium Z', 'Mewnium Z'],
|
|
2386
|
+
ruleset: ['Standard'],
|
|
2330
2387
|
},
|
|
2331
2388
|
{
|
|
2332
|
-
name: "[Gen
|
|
2389
|
+
name: "[Gen 3] 1v1",
|
|
2390
|
+
desc: `Bring three Pokémon to Team Preview and choose one to battle.`,
|
|
2333
2391
|
threads: [
|
|
2334
|
-
`• <a href="https://www.smogon.com/
|
|
2335
|
-
`• <a href="https://www.smogon.com/forums/posts/8034679/">ORAS ZU Viability Rankings</a>`,
|
|
2392
|
+
`• <a href="https://www.smogon.com/forums/posts/8031456/">ADV 1v1</a>`,
|
|
2336
2393
|
],
|
|
2337
|
-
mod: '
|
|
2394
|
+
mod: 'gen3',
|
|
2338
2395
|
// searchShow: false,
|
|
2339
|
-
ruleset: [
|
|
2340
|
-
|
|
2396
|
+
ruleset: [
|
|
2397
|
+
'Picked Team Size = 1', 'Max Team Size = 3',
|
|
2398
|
+
'[Gen 3] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview', '!Freeze Clause Mod',
|
|
2399
|
+
],
|
|
2400
|
+
banlist: [
|
|
2401
|
+
'Clefable', 'Slaking', 'Snorlax', 'Suicune', 'Zapdos', 'Destiny Bond', 'Explosion', 'Ingrain', 'Perish Song',
|
|
2402
|
+
'Self-Destruct', 'Bright Powder', 'Focus Band', 'King\'s Rock', 'Lax Incense', 'Quick Claw',
|
|
2403
|
+
],
|
|
2404
|
+
unbanlist: ['Mr. Mime', 'Wobbuffet', 'Wynaut', 'Sand Veil'],
|
|
2341
2405
|
},
|
|
2342
2406
|
{
|
|
2343
|
-
name: "[Gen 1]
|
|
2407
|
+
name: "[Gen 1] Stadium OU",
|
|
2344
2408
|
threads: [
|
|
2345
|
-
`• <a href="https://www.smogon.com/forums/
|
|
2409
|
+
`• <a href="https://www.smogon.com/forums/threads/3685877/">Stadium OU Viability Rankings</a>`,
|
|
2346
2410
|
],
|
|
2347
|
-
mod: '
|
|
2411
|
+
mod: 'gen1stadium',
|
|
2348
2412
|
// searchShow: false,
|
|
2349
|
-
ruleset: ['Standard'],
|
|
2413
|
+
ruleset: ['Standard', 'Team Preview'],
|
|
2414
|
+
banlist: ['Uber',
|
|
2415
|
+
'Nidoking + Fury Attack + Thrash', 'Exeggutor + Poison Powder + Stomp', 'Exeggutor + Sleep Powder + Stomp',
|
|
2416
|
+
'Exeggutor + Stun Spore + Stomp', 'Jolteon + Focus Energy + Thunder Shock', 'Flareon + Focus Energy + Ember',
|
|
2417
|
+
],
|
|
2350
2418
|
},
|
|
2351
2419
|
// Past Gens OU
|
|
2352
2420
|
///////////////////////////////////////////////////////////////////
|
|
@@ -2383,7 +2451,7 @@ exports.Formats = [
|
|
|
2383
2451
|
`• <a href="https://www.smogon.com/forums/threads/3668699/">BW2 OU Viability Rankings</a>`,
|
|
2384
2452
|
],
|
|
2385
2453
|
mod: 'gen5',
|
|
2386
|
-
ruleset: ['Standard', 'Evasion Abilities Clause', 'Sleep Moves Clause', 'Swagger Clause'],
|
|
2454
|
+
ruleset: ['Standard', 'Evasion Abilities Clause', 'Sleep Moves Clause', 'Swagger Clause', 'Gems Clause'],
|
|
2387
2455
|
banlist: ['Uber', 'Arena Trap', 'Drizzle ++ Swift Swim', 'Drought ++ Chlorophyll', 'Sand Rush', 'Shadow Tag', 'King\'s Rock', 'Razor Fang', 'Soul Dew', 'Assist', 'Baton Pass'],
|
|
2388
2456
|
},
|
|
2389
2457
|
{
|
|
@@ -2394,7 +2462,7 @@ exports.Formats = [
|
|
|
2394
2462
|
`• <a href="https://www.smogon.com/forums/threads/3683332/">DPP OU Viability Rankings</a>`,
|
|
2395
2463
|
],
|
|
2396
2464
|
mod: 'gen4',
|
|
2397
|
-
ruleset: ['Standard'],
|
|
2465
|
+
ruleset: ['Standard', 'Freeze Clause Mod'],
|
|
2398
2466
|
banlist: ['AG', 'Uber', 'Arena Trap', 'Sand Veil', 'Swinub + Snow Cloak', 'Piloswine + Snow Cloak', 'Mamoswine + Snow Cloak', 'Soul Dew', 'Baton Pass', 'Swagger'],
|
|
2399
2467
|
},
|
|
2400
2468
|
{
|
|
@@ -2404,7 +2472,7 @@ exports.Formats = [
|
|
|
2404
2472
|
`• <a href="https://www.smogon.com/forums/threads/3503019/">ADV OU Viability Rankings</a>`,
|
|
2405
2473
|
],
|
|
2406
2474
|
mod: 'gen3',
|
|
2407
|
-
ruleset: ['Standard', 'One Boost Passer Clause'],
|
|
2475
|
+
ruleset: ['Standard', 'One Boost Passer Clause', 'Freeze Clause Mod'],
|
|
2408
2476
|
banlist: ['Uber', 'Sand Veil', 'Soundproof', 'Assist', 'Baton Pass + Block', 'Baton Pass + Mean Look', 'Baton Pass + Spider Web', 'Smeargle + Ingrain'],
|
|
2409
2477
|
},
|
|
2410
2478
|
{
|
|
@@ -2415,7 +2483,7 @@ exports.Formats = [
|
|
|
2415
2483
|
],
|
|
2416
2484
|
mod: 'gen2',
|
|
2417
2485
|
ruleset: ['Standard'],
|
|
2418
|
-
banlist: ['Uber'],
|
|
2486
|
+
banlist: ['Uber', 'Mean Look + Baton Pass', 'Spider Web + Baton Pass'],
|
|
2419
2487
|
},
|
|
2420
2488
|
{
|
|
2421
2489
|
name: "[Gen 1] OU",
|
|
@@ -2565,6 +2633,17 @@ exports.Formats = [
|
|
|
2565
2633
|
ruleset: ['Standard', 'Mega Rayquaza Clause'],
|
|
2566
2634
|
banlist: ['Baton Pass'],
|
|
2567
2635
|
},
|
|
2636
|
+
{
|
|
2637
|
+
name: "[Gen 7] UU",
|
|
2638
|
+
threads: [
|
|
2639
|
+
`• <a href="https://www.smogon.com/forums/threads/3621217/">USM UU Sample Teams</a>`,
|
|
2640
|
+
`• <a href="https://www.smogon.com/forums/threads/3641346/">USM UU Viability Rankings</a>`,
|
|
2641
|
+
],
|
|
2642
|
+
mod: 'gen7',
|
|
2643
|
+
searchShow: false,
|
|
2644
|
+
ruleset: ['[Gen 7] OU'],
|
|
2645
|
+
banlist: ['OU', 'UUBL', 'Drizzle', 'Drought', 'Kommonium Z', 'Mewnium Z'],
|
|
2646
|
+
},
|
|
2568
2647
|
{
|
|
2569
2648
|
name: "[Gen 7] RU",
|
|
2570
2649
|
threads: [
|
|
@@ -2649,7 +2728,7 @@ exports.Formats = [
|
|
|
2649
2728
|
'Arceus', 'Darkrai', 'Deoxys-Base', 'Deoxys-Attack', 'Deoxys-Defense', 'Dialga', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kangaskhan-Mega',
|
|
2650
2729
|
'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Marshadow', 'Mewtwo', 'Mimikyu', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane',
|
|
2651
2730
|
'Palkia', 'Rayquaza', 'Reshiram', 'Salamence-Mega', 'Shaymin-Sky', 'Snorlax', 'Solgaleo', 'Tapu Koko', 'Xerneas', 'Yveltal', 'Zekrom',
|
|
2652
|
-
'Moody', 'Focus Sash', 'Perish Song', 'Detect + Fightinium Z',
|
|
2731
|
+
'Moody', 'Focus Sash', 'Grass Whistle', 'Hypnosis', 'Perish Song', 'Sing', 'Detect + Fightinium Z',
|
|
2653
2732
|
],
|
|
2654
2733
|
},
|
|
2655
2734
|
{
|
|
@@ -2952,6 +3031,17 @@ exports.Formats = [
|
|
|
2952
3031
|
searchShow: false,
|
|
2953
3032
|
ruleset: ['Obtainable', 'Team Preview', 'Endless Battle Clause', 'HP Percentage Mod', 'Cancel Mod'],
|
|
2954
3033
|
},
|
|
3034
|
+
{
|
|
3035
|
+
name: "[Gen 6] ZU",
|
|
3036
|
+
threads: [
|
|
3037
|
+
`• <a href="https://www.smogon.com/dex/xy/formats/zu/">ORAS ZU Banlist</a>`,
|
|
3038
|
+
`• <a href="https://www.smogon.com/forums/posts/8034679/">ORAS ZU Viability Rankings</a>`,
|
|
3039
|
+
],
|
|
3040
|
+
mod: 'gen6',
|
|
3041
|
+
searchShow: false,
|
|
3042
|
+
ruleset: ['[Gen 6] PU'],
|
|
3043
|
+
banlist: ['PU', 'Fraxure', 'Regigigas', 'Simisear'],
|
|
3044
|
+
},
|
|
2955
3045
|
{
|
|
2956
3046
|
name: "[Gen 6] CAP",
|
|
2957
3047
|
threads: [
|
|
@@ -2962,7 +3052,7 @@ exports.Formats = [
|
|
|
2962
3052
|
mod: 'gen6',
|
|
2963
3053
|
searchShow: false,
|
|
2964
3054
|
ruleset: ['[Gen 6] OU', '+CAP'],
|
|
2965
|
-
banlist: ['Aurumoth', 'Cawmodore'
|
|
3055
|
+
banlist: ['Aurumoth', 'Cawmodore'],
|
|
2966
3056
|
},
|
|
2967
3057
|
{
|
|
2968
3058
|
name: "[Gen 6] Battle Spot Singles",
|
|
@@ -3140,7 +3230,7 @@ exports.Formats = [
|
|
|
3140
3230
|
mod: 'gen5',
|
|
3141
3231
|
searchShow: false,
|
|
3142
3232
|
ruleset: ['[Gen 5] NU', 'Sleep Moves Clause'],
|
|
3143
|
-
banlist: ['NU', 'PUBL'],
|
|
3233
|
+
banlist: ['NU', 'PUBL', 'Damp Rock'],
|
|
3144
3234
|
},
|
|
3145
3235
|
{
|
|
3146
3236
|
name: "[Gen 5] LC",
|
|
@@ -3164,7 +3254,7 @@ exports.Formats = [
|
|
|
3164
3254
|
],
|
|
3165
3255
|
mod: 'gen5',
|
|
3166
3256
|
searchShow: false,
|
|
3167
|
-
ruleset: ['[Gen 5] OU', 'Same Type Clause'],
|
|
3257
|
+
ruleset: ['[Gen 5] OU', 'Same Type Clause', '!Gems Clause'],
|
|
3168
3258
|
},
|
|
3169
3259
|
{
|
|
3170
3260
|
name: "[Gen 5] 1v1",
|
|
@@ -3294,7 +3384,7 @@ exports.Formats = [
|
|
|
3294
3384
|
],
|
|
3295
3385
|
mod: 'gen4',
|
|
3296
3386
|
searchShow: false,
|
|
3297
|
-
ruleset: ['[Gen 4] OU'],
|
|
3387
|
+
ruleset: ['[Gen 4] OU', '!Freeze Clause Mod'],
|
|
3298
3388
|
banlist: ['OU', 'UUBL'],
|
|
3299
3389
|
unbanlist: ['Arena Trap', 'Swagger'],
|
|
3300
3390
|
},
|
|
@@ -3356,7 +3446,7 @@ exports.Formats = [
|
|
|
3356
3446
|
searchShow: false,
|
|
3357
3447
|
ruleset: [
|
|
3358
3448
|
'Picked Team Size = 1', 'Max Team Size = 3',
|
|
3359
|
-
'[Gen 4] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview',
|
|
3449
|
+
'[Gen 4] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview', '!Freeze Clause Mod',
|
|
3360
3450
|
],
|
|
3361
3451
|
banlist: ['Latias', 'Machamp', 'Porygon-Z', 'Shaymin', 'Snorlax', 'Togekiss', 'Focus Sash', 'Destiny Bond', 'Explosion', 'Perish Song', 'Self-Destruct'],
|
|
3362
3452
|
unbanlist: ['Wobbuffet', 'Wynaut', 'Sand Veil', 'Swagger'],
|
|
@@ -3398,7 +3488,7 @@ exports.Formats = [
|
|
|
3398
3488
|
mod: 'gen4',
|
|
3399
3489
|
gameType: 'doubles',
|
|
3400
3490
|
searchShow: false,
|
|
3401
|
-
ruleset: ['[Gen 4] OU'],
|
|
3491
|
+
ruleset: ['[Gen 4] OU', '!Freeze Clause Mod'],
|
|
3402
3492
|
banlist: ['Explosion'],
|
|
3403
3493
|
unbanlist: ['Garchomp', 'Latias', 'Latios', 'Manaphy', 'Mew', 'Salamence', 'Wobbuffet', 'Wynaut', 'Swagger'],
|
|
3404
3494
|
},
|
|
@@ -3453,9 +3543,8 @@ exports.Formats = [
|
|
|
3453
3543
|
],
|
|
3454
3544
|
mod: 'gen3',
|
|
3455
3545
|
searchShow: false,
|
|
3456
|
-
ruleset: ['Standard'
|
|
3457
|
-
banlist: ['Uber', 'OU', 'UUBL', 'Smeargle + Ingrain', 'Baton Pass'],
|
|
3458
|
-
unbanlist: ['Scyther'],
|
|
3546
|
+
ruleset: ['Standard'],
|
|
3547
|
+
banlist: ['Uber', 'OU', 'UUBL', 'Smeargle + Ingrain', 'Arena Trap', 'Bright Powder', 'Lax Incense', 'Baton Pass', 'Swagger'],
|
|
3459
3548
|
},
|
|
3460
3549
|
{
|
|
3461
3550
|
name: "[Gen 3] NU",
|
|
@@ -3464,9 +3553,8 @@ exports.Formats = [
|
|
|
3464
3553
|
],
|
|
3465
3554
|
mod: 'gen3',
|
|
3466
3555
|
searchShow: false,
|
|
3467
|
-
ruleset: ['
|
|
3468
|
-
banlist: ['UU'],
|
|
3469
|
-
unbanlist: ['Baton Pass'],
|
|
3556
|
+
ruleset: ['Standard'],
|
|
3557
|
+
banlist: ['Uber', 'OU', 'UUBL', 'UU', 'Smeargle + Ingrain'],
|
|
3470
3558
|
},
|
|
3471
3559
|
{
|
|
3472
3560
|
name: "[Gen 3] Doubles OU",
|
|
@@ -3480,21 +3568,6 @@ exports.Formats = [
|
|
|
3480
3568
|
banlist: ['Uber'],
|
|
3481
3569
|
unbanlist: ['Deoxys-Speed', 'Wobbuffet', 'Wynaut'],
|
|
3482
3570
|
},
|
|
3483
|
-
{
|
|
3484
|
-
name: "[Gen 3] 1v1",
|
|
3485
|
-
desc: `Bring three Pokémon to Team Preview and choose one to battle.`,
|
|
3486
|
-
threads: [
|
|
3487
|
-
`• <a href="https://www.smogon.com/forums/posts/8031456/">ADV 1v1</a>`,
|
|
3488
|
-
],
|
|
3489
|
-
mod: 'gen3',
|
|
3490
|
-
searchShow: false,
|
|
3491
|
-
ruleset: [
|
|
3492
|
-
'Picked Team Size = 1', 'Max Team Size = 3',
|
|
3493
|
-
'[Gen 3] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview',
|
|
3494
|
-
],
|
|
3495
|
-
banlist: ['Clefable', 'Slaking', 'Snorlax', 'Suicune', 'Destiny Bond', 'Explosion', 'Ingrain', 'Perish Song', 'Self-Destruct', 'Bright Powder', 'Focus Band', 'King\'s Rock', 'Lax Incense', 'Quick Claw'],
|
|
3496
|
-
unbanlist: ['Mr. Mime', 'Wobbuffet', 'Wynaut', 'Sand Veil'],
|
|
3497
|
-
},
|
|
3498
3571
|
{
|
|
3499
3572
|
name: "[Gen 3] Custom Game",
|
|
3500
3573
|
mod: 'gen3',
|
|
@@ -3511,15 +3584,6 @@ exports.Formats = [
|
|
|
3511
3584
|
debug: true,
|
|
3512
3585
|
ruleset: ['HP Percentage Mod', 'Cancel Mod', 'Max Team Size = 24', 'Max Move Count = 24', 'Max Level = 9999', 'Default Level = 100'],
|
|
3513
3586
|
},
|
|
3514
|
-
{
|
|
3515
|
-
name: "[Gen 2] Ubers",
|
|
3516
|
-
threads: [
|
|
3517
|
-
`• <a href="https://www.smogon.com/forums/posts/8286282/">GSC Ubers</a>`,
|
|
3518
|
-
],
|
|
3519
|
-
mod: 'gen2',
|
|
3520
|
-
searchShow: false,
|
|
3521
|
-
ruleset: ['Standard'],
|
|
3522
|
-
},
|
|
3523
3587
|
{
|
|
3524
3588
|
name: "[Gen 2] UU",
|
|
3525
3589
|
threads: [`• <a href="https://www.smogon.com/forums/threads/3576710/">GSC UU</a>`],
|
|
@@ -3582,6 +3646,15 @@ exports.Formats = [
|
|
|
3582
3646
|
battle: { trunc: Math.trunc },
|
|
3583
3647
|
ruleset: ['HP Percentage Mod', 'Cancel Mod', 'Max Team Size = 24', 'Max Move Count = 24', 'Max Level = 9999', 'Default Level = 100'],
|
|
3584
3648
|
},
|
|
3649
|
+
{
|
|
3650
|
+
name: "[Gen 1] Ubers",
|
|
3651
|
+
threads: [
|
|
3652
|
+
`• <a href="https://www.smogon.com/forums/posts/8286283/">RBY Ubers</a>`,
|
|
3653
|
+
],
|
|
3654
|
+
mod: 'gen1',
|
|
3655
|
+
searchShow: false,
|
|
3656
|
+
ruleset: ['Standard'],
|
|
3657
|
+
},
|
|
3585
3658
|
{
|
|
3586
3659
|
name: "[Gen 1] UU",
|
|
3587
3660
|
threads: [
|
|
@@ -3590,7 +3663,7 @@ exports.Formats = [
|
|
|
3590
3663
|
],
|
|
3591
3664
|
mod: 'gen1',
|
|
3592
3665
|
searchShow: false,
|
|
3593
|
-
ruleset: ['[Gen 1] OU'],
|
|
3666
|
+
ruleset: ['[Gen 1] OU', 'APT Clause'],
|
|
3594
3667
|
banlist: ['OU', 'UUBL'],
|
|
3595
3668
|
},
|
|
3596
3669
|
{
|
|
@@ -3624,19 +3697,6 @@ exports.Formats = [
|
|
|
3624
3697
|
],
|
|
3625
3698
|
banlist: ['Uber'],
|
|
3626
3699
|
},
|
|
3627
|
-
{
|
|
3628
|
-
name: "[Gen 1] Stadium OU",
|
|
3629
|
-
threads: [
|
|
3630
|
-
`• <a href="https://www.smogon.com/forums/threads/3685877/">Stadium OU Viability Rankings</a>`,
|
|
3631
|
-
],
|
|
3632
|
-
mod: 'gen1stadium',
|
|
3633
|
-
searchShow: false,
|
|
3634
|
-
ruleset: ['Standard', 'Team Preview'],
|
|
3635
|
-
banlist: ['Uber',
|
|
3636
|
-
'Nidoking + Fury Attack + Thrash', 'Exeggutor + Poison Powder + Stomp', 'Exeggutor + Sleep Powder + Stomp',
|
|
3637
|
-
'Exeggutor + Stun Spore + Stomp', 'Jolteon + Focus Energy + Thunder Shock', 'Flareon + Focus Energy + Ember',
|
|
3638
|
-
],
|
|
3639
|
-
},
|
|
3640
3700
|
{
|
|
3641
3701
|
name: "[Gen 1] Tradebacks OU",
|
|
3642
3702
|
desc: `RBY OU with movepool additions from the Time Capsule.`,
|