@pkmn/sim 0.5.18 → 0.5.21
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 +487 -432
- package/build/config/formats.js.map +1 -1
- package/build/data/aliases.js +2 -2
- package/build/data/aliases.js.map +1 -1
- package/build/data/formats-data.js +17 -13
- package/build/data/formats-data.js.map +1 -1
- package/build/data/learnsets.js +77 -9
- package/build/data/learnsets.js.map +1 -1
- package/build/data/mods/gen1/conditions.js +4 -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 +2 -10
- package/build/data/mods/gen1/moves.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/gen4/formats-data.js +1 -1
- package/build/data/mods/gen4/formats-data.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/formats-data.js +1 -1
- package/build/data/mods/gen7/formats-data.js.map +1 -1
- package/build/data/moves.js +2 -4
- package/build/data/moves.js.map +1 -1
- package/build/data/pokedex.js +20 -1
- package/build/data/pokedex.js.map +1 -1
- package/build/data/rulesets.js +29 -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/state.d.ts +1 -1
- package/build/sim/state.js +6 -6
- package/build/sim/state.js.map +1 -1
- package/build/sim/teams.d.ts +2 -2
- package/config/formats.ts +352 -302
- package/data/aliases.ts +2 -2
- package/data/formats-data.ts +17 -13
- package/data/learnsets.ts +77 -9
- package/data/mods/gen1/conditions.ts +4 -0
- package/data/mods/gen1/formats-data.ts +3 -3
- package/data/mods/gen1/moves.ts +2 -9
- package/data/mods/gen2/learnsets.ts +2 -2
- package/data/mods/gen2/scripts.ts +16 -0
- package/data/mods/gen4/formats-data.ts +1 -1
- package/data/mods/gen6/formats-data.ts +1 -1
- package/data/mods/gen6/learnsets.ts +0 -75
- package/data/mods/gen7/formats-data.ts +1 -1
- package/data/moves.ts +2 -4
- package/data/pokedex.ts +20 -1
- package/data/rulesets.ts +28 -0
- package/data/tags.ts +2 -2
- package/package.json +1 -1
- package/sim/battle.ts +1 -7
package/config/formats.ts
CHANGED
|
@@ -167,7 +167,7 @@ export const Formats: FormatList = [
|
|
|
167
167
|
mod: 'gen8',
|
|
168
168
|
ruleset: ['Little Cup', 'Standard', 'Dynamax Clause'],
|
|
169
169
|
banlist: [
|
|
170
|
-
'Corsola-Galar', 'Cutiefly', 'Drifloon', 'Gastly', 'Gothita', 'Rufflet', 'Scraggy', 'Scyther', 'Sneasel', 'Swirlix', 'Tangela', '
|
|
170
|
+
'Corsola-Galar', 'Cutiefly', 'Drifloon', 'Gastly', 'Gothita', 'Rufflet', 'Scraggy', 'Scyther', 'Sneasel', 'Swirlix', 'Tangela', 'Vulpix-Alola', 'Woobat', 'Zigzagoon-Base',
|
|
171
171
|
'Chlorophyll', 'Moody', 'Baton Pass', 'Sticky Web',
|
|
172
172
|
],
|
|
173
173
|
},
|
|
@@ -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', 'Vullaby',
|
|
256
256
|
// LC UUBL
|
|
257
257
|
'Archen', 'Farfetch\u2019d-Galar', 'Scorbunny', 'Shellder', 'Wingull',
|
|
258
258
|
],
|
|
@@ -289,6 +289,15 @@ export const Formats: FormatList = [
|
|
|
289
289
|
ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 8', 'Limit Two Restricted'],
|
|
290
290
|
restricted: ['Restricted Legendary'],
|
|
291
291
|
},
|
|
292
|
+
{
|
|
293
|
+
name: "[Gen 8] Single Battle Cup",
|
|
294
|
+
threads: [
|
|
295
|
+
`• <a href="https://www.pokemon.com/us/pokemon-news/register-now-for-the-single-battle-cup-competition/">Single Battle Cup</a>`,
|
|
296
|
+
],
|
|
297
|
+
|
|
298
|
+
mod: 'gen8',
|
|
299
|
+
ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 8'],
|
|
300
|
+
},
|
|
292
301
|
{
|
|
293
302
|
name: "[Gen 8] Custom Game",
|
|
294
303
|
|
|
@@ -404,10 +413,10 @@ export const Formats: FormatList = [
|
|
|
404
413
|
'Standard Doubles', 'Accuracy Moves Clause', 'Dynamax Clause', 'Sleep Clause Mod',
|
|
405
414
|
],
|
|
406
415
|
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',
|
|
416
|
+
'Calyrex-Ice', 'Calyrex-Shadow', 'Cottonee', 'Dialga', 'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Jirachi', 'Kyogre',
|
|
417
|
+
'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Rayquaza',
|
|
418
|
+
'Reshiram', 'Solgaleo', 'Tornadus-Base', 'Urshifu-Base', 'Urshifu-Rapid-Strike', 'Whimsicott', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned',
|
|
419
|
+
'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Moody', 'Power Construct', 'Focus Sash', 'Ally Switch', 'Final Gambit', 'Perish Song', 'Swagger',
|
|
411
420
|
],
|
|
412
421
|
},
|
|
413
422
|
{
|
|
@@ -616,47 +625,261 @@ export const Formats: FormatList = [
|
|
|
616
625
|
column: 2,
|
|
617
626
|
},
|
|
618
627
|
{
|
|
619
|
-
name: "[Gen 8]
|
|
620
|
-
desc: `Pokémon
|
|
628
|
+
name: "[Gen 8] Broken Record",
|
|
629
|
+
desc: `Pokémon can hold a TR to use that move in battle.`,
|
|
621
630
|
threads: [
|
|
622
|
-
`• <a href="https://www.smogon.com/forums/threads/
|
|
631
|
+
`• <a href="https://www.smogon.com/forums/threads/3701270/">Broken Record</a>`,
|
|
623
632
|
],
|
|
624
633
|
|
|
625
634
|
mod: 'gen8',
|
|
626
|
-
ruleset: ['Standard', '
|
|
635
|
+
ruleset: ['Standard', '!Sleep Clause Mod', 'Sleep Moves Clause', 'Dynamax Clause'],
|
|
627
636
|
banlist: [
|
|
628
|
-
'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Eternatus', 'Genesect', 'Giratina',
|
|
629
|
-
'
|
|
630
|
-
'
|
|
631
|
-
'
|
|
632
|
-
'
|
|
633
|
-
'King\'s Rock', 'Lax Incense', 'Baton Pass', 'Explosion', 'Final Gambit', 'Healing Wish', 'Lunar Dance', 'Memento',
|
|
634
|
-
'Misty Explosion', 'Self-Destruct',
|
|
637
|
+
'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Darmanitan-Galar', 'Dialga', 'Dracovish', 'Eternatus', 'Genesect', 'Giratina', 'Giratina-Origin',
|
|
638
|
+
'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala', 'Magearna', 'Marshadow',
|
|
639
|
+
'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Regieleki', 'Reshiram', 'Solgaleo',
|
|
640
|
+
'Spectrier', 'Urshifu-Base', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Zygarde-Base',
|
|
641
|
+
'Arena Trap', 'Magnet Pull', 'Moody', 'Power Construct', 'Shadow Tag', 'TR29 (Baton Pass)', 'TR82 (Stored Power)', 'Baton Pass',
|
|
635
642
|
],
|
|
643
|
+
onValidateSet(set) {
|
|
644
|
+
if (!set.item) return;
|
|
645
|
+
const item = this.dex.items.get(set.item);
|
|
646
|
+
if (!/^tr\d\d/i.test(item.name)) return;
|
|
647
|
+
const moveName = item.desc.split('move ')[1].split('.')[0];
|
|
648
|
+
if (set.moves.map(this.toID).includes(this.toID(moveName))) {
|
|
649
|
+
return [
|
|
650
|
+
`${set.species} can't run ${item.name} (${moveName}) as its item because it already has that move in its moveset.`,
|
|
651
|
+
];
|
|
652
|
+
}
|
|
653
|
+
},
|
|
654
|
+
onValidateTeam(team) {
|
|
655
|
+
const trs = new Set<string>();
|
|
656
|
+
for (const set of team) {
|
|
657
|
+
if (!set.item) continue;
|
|
658
|
+
const item = this.dex.items.get(set.item).name;
|
|
659
|
+
if (!/^tr\d\d/i.test(item)) continue;
|
|
660
|
+
if (trs.has(item)) {
|
|
661
|
+
return [`Your team already has a Pok\u00e9mon with ${item}.`];
|
|
662
|
+
}
|
|
663
|
+
trs.add(item);
|
|
664
|
+
}
|
|
665
|
+
},
|
|
666
|
+
onTakeItem(item) {
|
|
667
|
+
return !/^tr\d\d/i.test(item.name);
|
|
668
|
+
},
|
|
669
|
+
onModifyMove(move) {
|
|
670
|
+
if (move.id === 'knockoff') {
|
|
671
|
+
move.onBasePower = function (basePower, source, target, m) {
|
|
672
|
+
const item = target.getItem();
|
|
673
|
+
if (!this.singleEvent('TakeItem', item, target.itemState, target, target, m, item)) return;
|
|
674
|
+
// Very hardcode but I'd prefer to not make a mod for one damage calculation change
|
|
675
|
+
if (item.id && !/^tr\d\d/i.test(item.id)) {
|
|
676
|
+
return this.chainModify(1.5);
|
|
677
|
+
}
|
|
678
|
+
};
|
|
679
|
+
}
|
|
680
|
+
},
|
|
681
|
+
onBegin() {
|
|
682
|
+
for (const pokemon of this.getAllPokemon()) {
|
|
683
|
+
const item = pokemon.getItem();
|
|
684
|
+
if (/^tr\d\d/i.test(item.name)) {
|
|
685
|
+
const move = this.dex.moves.get(item.desc.split('move ')[1].split('.')[0]);
|
|
686
|
+
pokemon.moveSlots = (pokemon as any).baseMoveSlots = [
|
|
687
|
+
...pokemon.baseMoveSlots, {
|
|
688
|
+
id: move.id,
|
|
689
|
+
move: move.name,
|
|
690
|
+
pp: move.pp * 8 / 5,
|
|
691
|
+
maxpp: move.pp * 8 / 5,
|
|
692
|
+
target: move.target,
|
|
693
|
+
disabled: false,
|
|
694
|
+
disabledSource: '',
|
|
695
|
+
used: false,
|
|
696
|
+
},
|
|
697
|
+
];
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
},
|
|
636
701
|
},
|
|
637
702
|
{
|
|
638
|
-
name: "[Gen 8]
|
|
639
|
-
desc: `Pokémon
|
|
703
|
+
name: "[Gen 8] Inheritance",
|
|
704
|
+
desc: `Pokémon may use the ability and moves of another, as long as they forfeit their own learnset.`,
|
|
640
705
|
threads: [
|
|
641
|
-
`• <a href="https://www.smogon.com/forums/
|
|
706
|
+
`• <a href="https://www.smogon.com/forums/threads/3656811/">Inheritance</a>`,
|
|
642
707
|
],
|
|
643
708
|
|
|
644
|
-
mod: '
|
|
645
|
-
|
|
709
|
+
mod: 'gen8',
|
|
710
|
+
// searchShow: false,
|
|
711
|
+
ruleset: ['Standard', '!Sleep Clause Mod', 'Sleep Moves Clause', '2 Ability Clause', 'Dynamax Clause'],
|
|
646
712
|
banlist: [
|
|
647
|
-
'
|
|
648
|
-
'
|
|
649
|
-
'
|
|
650
|
-
'
|
|
651
|
-
'
|
|
652
|
-
'
|
|
653
|
-
|
|
654
|
-
restricted: [
|
|
655
|
-
'Comatose', 'Contrary', 'Fluffy', 'Fur Coat', 'Gorilla Tactics', 'Huge Power', 'Ice Scales', 'Illusion', 'Imposter', 'Innards Out',
|
|
656
|
-
'Intrepid Sword', 'Libero', 'Magnet Pull', 'Neutralizing Gas', 'Parental Bond', 'Poison Heal', 'Prankster', 'Protean', 'Pure Power',
|
|
657
|
-
'Quick Draw', 'Sand Veil', 'Serene Grace', 'Simple', 'Snow Cloak', 'Speed Boost', 'Stakeout', 'Stench', 'Tinted Lens', 'Triage',
|
|
658
|
-
'Unburden', 'Water Bubble',
|
|
713
|
+
'Blacephalon', 'Blaziken', 'Butterfree', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chansey', 'Combusken', 'Cresselia', 'Darmanitan-Galar', 'Dialga', 'Dracovish',
|
|
714
|
+
'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala',
|
|
715
|
+
'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Natu', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Regieleki',
|
|
716
|
+
'Regigigas', 'Reshiram', 'Sableye', 'Shedinja', 'Solgaleo', 'Spectrier', 'Tapu Koko', 'Toxtricity', 'Torkoal', 'Urshifu-Base', 'Xatu', 'Xerneas', 'Yveltal',
|
|
717
|
+
'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zeraora', 'Zekrom', 'Arena Trap', 'Contrary', 'Drizzle', 'Huge Power', 'Imposter', 'Innards Out',
|
|
718
|
+
'Libero', 'Moody', 'Power Construct', 'Pure Power', 'Quick Draw', 'Shadow Tag', 'Sheer Force', 'Simple', 'Unaware', 'Unburden', 'Water Bubble', 'King\'s Rock',
|
|
719
|
+
'Quick Claw', 'Baton Pass', 'Bolt Beak', 'Fishious Rend', 'Shell Smash', 'Thousand Arrows',
|
|
659
720
|
],
|
|
721
|
+
getEvoFamily(speciesid) {
|
|
722
|
+
let species = Dex.species.get(speciesid);
|
|
723
|
+
while (species.prevo) {
|
|
724
|
+
species = Dex.species.get(species.prevo);
|
|
725
|
+
}
|
|
726
|
+
return species.id;
|
|
727
|
+
},
|
|
728
|
+
validateSet(set, teamHas) {
|
|
729
|
+
const unreleased = (pokemon: Species) => pokemon.tier === "Unreleased" && pokemon.isNonstandard === "Unobtainable";
|
|
730
|
+
if (!teamHas.abilityMap) {
|
|
731
|
+
teamHas.abilityMap = Object.create(null);
|
|
732
|
+
for (const pokemon of Dex.species.all()) {
|
|
733
|
+
if (pokemon.isNonstandard || unreleased(pokemon)) continue;
|
|
734
|
+
if (pokemon.requiredAbility || pokemon.requiredItem || pokemon.requiredMove) continue;
|
|
735
|
+
if (this.ruleTable.isBannedSpecies(pokemon)) continue;
|
|
736
|
+
|
|
737
|
+
for (const key of Object.values(pokemon.abilities)) {
|
|
738
|
+
const abilityId = this.dex.toID(key);
|
|
739
|
+
if (abilityId in teamHas.abilityMap) {
|
|
740
|
+
teamHas.abilityMap[abilityId][pokemon.evos ? 'push' : 'unshift'](pokemon.id);
|
|
741
|
+
} else {
|
|
742
|
+
teamHas.abilityMap[abilityId] = [pokemon.id];
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
const problem = this.validateForme(set);
|
|
749
|
+
if (problem.length) return problem;
|
|
750
|
+
|
|
751
|
+
const species = this.dex.species.get(set.species);
|
|
752
|
+
if (!species.exists || species.num < 1) return [`The Pok\u00e9mon "${set.species}" does not exist.`];
|
|
753
|
+
if (species.isNonstandard || unreleased(species)) {
|
|
754
|
+
return [`${species.name} is not obtainable in Generation ${this.dex.gen}.`];
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
const name = set.name;
|
|
758
|
+
if (this.ruleTable.isBannedSpecies(species)) {
|
|
759
|
+
return this.validateSet(set, teamHas);
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
const ability = this.dex.abilities.get(set.ability);
|
|
763
|
+
if (!ability.exists || ability.isNonstandard) return [`${name} needs to have a valid ability.`];
|
|
764
|
+
const pokemonWithAbility = teamHas.abilityMap[ability.id];
|
|
765
|
+
if (!pokemonWithAbility) return [`${ability.name} is not available on a legal Pok\u00e9mon.`];
|
|
766
|
+
|
|
767
|
+
(this.format as any).debug = true;
|
|
768
|
+
|
|
769
|
+
if (!teamHas.abilitySources) teamHas.abilitySources = Object.create(null);
|
|
770
|
+
const validSources: string[] = teamHas.abilitySources[this.dex.toID(set.species)] = []; // Evolution families
|
|
771
|
+
|
|
772
|
+
let canonicalSource = ''; // Specific for the basic implementation of Donor Clause (see onValidateTeam).
|
|
773
|
+
|
|
774
|
+
for (const donor of pokemonWithAbility) {
|
|
775
|
+
const donorSpecies = this.dex.species.get(donor);
|
|
776
|
+
let format = this.format;
|
|
777
|
+
if (!format.getEvoFamily) format = this.dex.formats.get('gen8inheritance');
|
|
778
|
+
const evoFamily = format.getEvoFamily!(donorSpecies.id);
|
|
779
|
+
if (validSources.includes(evoFamily)) continue;
|
|
780
|
+
|
|
781
|
+
set.species = donorSpecies.name;
|
|
782
|
+
set.name = donorSpecies.baseSpecies;
|
|
783
|
+
const problems = this.validateSet(set, teamHas) || [];
|
|
784
|
+
if (!problems.length) {
|
|
785
|
+
validSources.push(evoFamily);
|
|
786
|
+
canonicalSource = donorSpecies.name;
|
|
787
|
+
}
|
|
788
|
+
// Specific for the basic implementation of Donor Clause (see onValidateTeam).
|
|
789
|
+
if (validSources.length > 1) break;
|
|
790
|
+
}
|
|
791
|
+
(this.format as any).debug = false;
|
|
792
|
+
|
|
793
|
+
set.name = name;
|
|
794
|
+
set.species = species.name;
|
|
795
|
+
if (!validSources.length) {
|
|
796
|
+
if (pokemonWithAbility.length > 1) return [`${name}'s set is illegal.`];
|
|
797
|
+
return [`${name} has an illegal set with an ability from ${this.dex.species.get(pokemonWithAbility[0]).name}.`];
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
// Protocol: Include the data of the donor species in the `ability` data slot.
|
|
801
|
+
// Afterwards, we are going to reset the name to what the user intended.
|
|
802
|
+
set.ability = `${set.ability}0${canonicalSource}`;
|
|
803
|
+
return null;
|
|
804
|
+
},
|
|
805
|
+
onValidateTeam(team, f, teamHas) {
|
|
806
|
+
if (this.ruleTable.has('2abilityclause')) {
|
|
807
|
+
const abilityTable = new Map<string, number>();
|
|
808
|
+
const base: {[k: string]: string} = {
|
|
809
|
+
airlock: 'cloudnine',
|
|
810
|
+
battlearmor: 'shellarmor',
|
|
811
|
+
clearbody: 'whitesmoke',
|
|
812
|
+
dazzling: 'queenlymajesty',
|
|
813
|
+
emergencyexit: 'wimpout',
|
|
814
|
+
filter: 'solidrock',
|
|
815
|
+
gooey: 'tanglinghair',
|
|
816
|
+
insomnia: 'vitalspirit',
|
|
817
|
+
ironbarbs: 'roughskin',
|
|
818
|
+
libero: 'protean',
|
|
819
|
+
minus: 'plus',
|
|
820
|
+
moxie: 'chillingneigh',
|
|
821
|
+
powerofalchemy: 'receiver',
|
|
822
|
+
propellertail: 'stalwart',
|
|
823
|
+
teravolt: 'moldbreaker',
|
|
824
|
+
turboblaze: 'moldbreaker',
|
|
825
|
+
};
|
|
826
|
+
for (const set of team) {
|
|
827
|
+
let ability = this.toID(set.ability.split('0')[0]);
|
|
828
|
+
if (!ability) continue;
|
|
829
|
+
if (ability in base) ability = base[ability] as ID;
|
|
830
|
+
if ((abilityTable.get(ability) || 0) >= 2) {
|
|
831
|
+
return [
|
|
832
|
+
`You are limited to two of each ability by 2 Ability Clause.`,
|
|
833
|
+
`(You have more than two ${this.dex.abilities.get(ability).name} variants)`,
|
|
834
|
+
];
|
|
835
|
+
}
|
|
836
|
+
abilityTable.set(ability, (abilityTable.get(ability) || 0) + 1);
|
|
837
|
+
}
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
// Donor Clause
|
|
841
|
+
const evoFamilyLists = [];
|
|
842
|
+
for (const set of team) {
|
|
843
|
+
const abilitySources = teamHas.abilitySources?.[this.dex.toID(set.species)];
|
|
844
|
+
if (!abilitySources) continue;
|
|
845
|
+
let format = this.format;
|
|
846
|
+
if (!format.getEvoFamily) format = this.dex.formats.get('gen8inheritance');
|
|
847
|
+
evoFamilyLists.push(abilitySources.map(format.getEvoFamily!));
|
|
848
|
+
}
|
|
849
|
+
|
|
850
|
+
// Checking actual full incompatibility would require expensive algebra.
|
|
851
|
+
// Instead, we only check the trivial case of multiple Pokémon only legal for exactly one family. FIXME?
|
|
852
|
+
const requiredFamilies = Object.create(null);
|
|
853
|
+
for (const evoFamilies of evoFamilyLists) {
|
|
854
|
+
if (evoFamilies.length !== 1) continue;
|
|
855
|
+
const [familyId] = evoFamilies;
|
|
856
|
+
if (!(familyId in requiredFamilies)) requiredFamilies[familyId] = 1;
|
|
857
|
+
requiredFamilies[familyId]++;
|
|
858
|
+
if (requiredFamilies[familyId] > 2) {
|
|
859
|
+
return [
|
|
860
|
+
`You are limited to up to two inheritances from each evolution family by the Donor Clause.`,
|
|
861
|
+
`(You inherit more than twice from ${this.dex.species.get(familyId).name}).`,
|
|
862
|
+
];
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
},
|
|
866
|
+
onBegin() {
|
|
867
|
+
for (const pokemon of this.getAllPokemon()) {
|
|
868
|
+
if (pokemon.baseAbility.includes('0')) {
|
|
869
|
+
const donor = pokemon.baseAbility.split('0')[1];
|
|
870
|
+
pokemon.m.donor = this.toID(donor);
|
|
871
|
+
pokemon.baseAbility = this.toID(pokemon.baseAbility.split('0')[0]);
|
|
872
|
+
pokemon.ability = pokemon.baseAbility;
|
|
873
|
+
}
|
|
874
|
+
}
|
|
875
|
+
},
|
|
876
|
+
onSwitchIn(pokemon) {
|
|
877
|
+
if (!pokemon.m.donor) return;
|
|
878
|
+
const donorTemplate = this.dex.species.get(pokemon.m.donor);
|
|
879
|
+
if (!donorTemplate.exists) return;
|
|
880
|
+
// Place volatiles on the Pokémon to show the donor details.
|
|
881
|
+
this.add('-start', pokemon, donorTemplate.name, '[silent]');
|
|
882
|
+
},
|
|
660
883
|
},
|
|
661
884
|
|
|
662
885
|
// Other Metagames
|
|
@@ -680,8 +903,8 @@ export const Formats: FormatList = [
|
|
|
680
903
|
'Calyrex-Shadow', 'Cramorant-Gorging', 'Darmanitan-Galar-Zen', 'Eternatus-Eternamax', 'Shedinja', 'Zacian-Crowned',
|
|
681
904
|
'Arena Trap', 'Contrary', 'Gorilla Tactics', 'Huge Power', 'Illusion', 'Innards Out', 'Intrepid Sword', 'Libero',
|
|
682
905
|
'Magnet Pull', 'Moody', 'Neutralizing Gas', 'Parental Bond', 'Protean', 'Pure Power', 'Shadow Tag', 'Stakeout',
|
|
683
|
-
'Water Bubble', 'Wonder Guard', 'Comatose + Sleep Talk', 'Rusted Sword', '
|
|
684
|
-
'Octolock', 'Shell Smash',
|
|
906
|
+
'Water Bubble', 'Wonder Guard', 'Comatose + Sleep Talk', 'Rusted Sword', 'Belly Drum', 'Bolt Beak', 'Court Change',
|
|
907
|
+
'Double Iron Bash', 'Octolock', 'Shell Smash',
|
|
685
908
|
],
|
|
686
909
|
},
|
|
687
910
|
{
|
|
@@ -695,8 +918,8 @@ export const Formats: FormatList = [
|
|
|
695
918
|
mod: 'gen8',
|
|
696
919
|
ruleset: ['Standard', '!Obtainable Abilities', '2 Ability Clause', 'Dynamax Clause', 'Sleep Moves Clause', '!Sleep Clause Mod'],
|
|
697
920
|
banlist: [
|
|
698
|
-
'Archeops', 'Blacephalon', 'Buzzwole', 'Calyrex-Ice', 'Calyrex-Shadow', 'Dialga', 'Dracovish', 'Dragapult', 'Dragonite', 'Eternatus',
|
|
699
|
-
'
|
|
921
|
+
'Archeops', 'Blacephalon', 'Buzzwole', 'Calyrex-Ice', 'Calyrex-Shadow', 'Dialga', 'Dracovish', 'Dragapult', 'Dragonite', 'Eternatus', 'Gengar',
|
|
922
|
+
'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Keldeo', 'Kommo-o', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White',
|
|
700
923
|
'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Noivern',
|
|
701
924
|
'Palkia', 'Pheromosa', 'Rayquaza', 'Regigigas', 'Reshiram', 'Shedinja', 'Solgaleo', 'Spectrier', 'Urshifu', 'Urshifu-Rapid-Strike',
|
|
702
925
|
'Victini', 'Weavile', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Base', 'Zekrom', 'Zeraora', 'Zygarde-Base',
|
|
@@ -793,9 +1016,9 @@ export const Formats: FormatList = [
|
|
|
793
1016
|
'Arena Trap', 'Magnet Pull', 'Moody', 'Power Construct', 'Shadow Tag', 'King\'s Rock', 'Baton Pass',
|
|
794
1017
|
],
|
|
795
1018
|
restricted: [
|
|
796
|
-
'Acupressure', 'Astral Barrage', 'Belly Drum', 'Bolt Beak', 'Clangorous Soul', 'Double Iron Bash', 'Electrify', 'Extreme Speed', '
|
|
797
|
-
'Geomancy', 'Glacial Lance', 'Oblivion Wing', 'Precipice Blades', 'Shell Smash', 'Shift Gear', 'Thousand Arrows', 'Thunderous Kick',
|
|
798
|
-
'Wicked Blow',
|
|
1019
|
+
'Acupressure', 'Astral Barrage', 'Belly Drum', 'Bolt Beak', 'Clangorous Soul', 'Double Iron Bash', 'Electrify', 'Extreme Speed', 'Final Gambit',
|
|
1020
|
+
'Fishious Rend', 'Geomancy', 'Glacial Lance', 'Oblivion Wing', 'Precipice Blades', 'Shell Smash', 'Shift Gear', 'Thousand Arrows', 'Thunderous Kick',
|
|
1021
|
+
'V-create', 'Wicked Blow',
|
|
799
1022
|
],
|
|
800
1023
|
},
|
|
801
1024
|
{
|
|
@@ -990,7 +1213,7 @@ export const Formats: FormatList = [
|
|
|
990
1213
|
|
|
991
1214
|
mod: 'gen8bdsp',
|
|
992
1215
|
ruleset: ['Little Cup', 'Standard'],
|
|
993
|
-
banlist: ['Gligar', 'Meditite', 'Misdreavus', 'Murkrow', 'Scyther', 'Sneasel', 'Tangela', 'Vulpix', 'Yanma', 'Moody', 'Baton Pass', 'Sticky Web'],
|
|
1216
|
+
banlist: ['Gligar', 'Meditite', 'Misdreavus', 'Munchlax', 'Murkrow', 'Scyther', 'Sneasel', 'Tangela', 'Vulpix', 'Yanma', 'Moody', 'Baton Pass', 'Sticky Web'],
|
|
994
1217
|
},
|
|
995
1218
|
{
|
|
996
1219
|
name: "[Gen 8 BDSP] Monotype",
|
|
@@ -1212,188 +1435,6 @@ export const Formats: FormatList = [
|
|
|
1212
1435
|
}
|
|
1213
1436
|
},
|
|
1214
1437
|
},
|
|
1215
|
-
{
|
|
1216
|
-
name: "[Gen 8] Inheritance",
|
|
1217
|
-
desc: `Pokémon may use the ability and moves of another, as long as they forfeit their own learnset.`,
|
|
1218
|
-
threads: [
|
|
1219
|
-
`• <a href="https://www.smogon.com/forums/threads/3656811/">Inheritance</a>`,
|
|
1220
|
-
],
|
|
1221
|
-
|
|
1222
|
-
mod: 'gen8',
|
|
1223
|
-
searchShow: false,
|
|
1224
|
-
ruleset: ['Standard', '2 Ability Clause', 'Dynamax Clause'],
|
|
1225
|
-
banlist: [
|
|
1226
|
-
'Blacephalon', 'Blaziken', 'Butterfree', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chansey', 'Combusken', 'Cresselia', 'Darmanitan-Galar', 'Dialga', 'Dracovish',
|
|
1227
|
-
'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala',
|
|
1228
|
-
'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Natu', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Regieleki',
|
|
1229
|
-
'Regigigas', 'Reshiram', 'Sableye', 'Shedinja', 'Solgaleo', 'Spectrier', 'Tapu Koko', 'Toxtricity', 'Torkoal', 'Urshifu-Base', 'Xatu', 'Xerneas', 'Yveltal',
|
|
1230
|
-
'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zeraora', 'Zekrom', 'Arena Trap', 'Contrary', 'Drizzle', 'Huge Power', 'Imposter', 'Innards Out',
|
|
1231
|
-
'Libero', 'Moody', 'Power Construct', 'Pure Power', 'Quick Draw', 'Shadow Tag', 'Sheer Force', 'Simple', 'Unaware', 'Unburden', 'Water Bubble', 'King\'s Rock',
|
|
1232
|
-
'Quick Claw', 'Baton Pass', 'Bolt Beak', 'Fishious Rend', 'Shell Smash', 'Thousand Arrows',
|
|
1233
|
-
],
|
|
1234
|
-
getEvoFamily(speciesid) {
|
|
1235
|
-
let species = Dex.species.get(speciesid);
|
|
1236
|
-
while (species.prevo) {
|
|
1237
|
-
species = Dex.species.get(species.prevo);
|
|
1238
|
-
}
|
|
1239
|
-
return species.id;
|
|
1240
|
-
},
|
|
1241
|
-
validateSet(set, teamHas) {
|
|
1242
|
-
const unreleased = (pokemon: Species) => pokemon.tier === "Unreleased" && pokemon.isNonstandard === "Unobtainable";
|
|
1243
|
-
if (!teamHas.abilityMap) {
|
|
1244
|
-
teamHas.abilityMap = Object.create(null);
|
|
1245
|
-
for (const pokemon of Dex.species.all()) {
|
|
1246
|
-
if (pokemon.isNonstandard || unreleased(pokemon)) continue;
|
|
1247
|
-
if (pokemon.requiredAbility || pokemon.requiredItem || pokemon.requiredMove) continue;
|
|
1248
|
-
if (this.ruleTable.isBannedSpecies(pokemon)) continue;
|
|
1249
|
-
|
|
1250
|
-
for (const key of Object.values(pokemon.abilities)) {
|
|
1251
|
-
const abilityId = this.dex.toID(key);
|
|
1252
|
-
if (abilityId in teamHas.abilityMap) {
|
|
1253
|
-
teamHas.abilityMap[abilityId][pokemon.evos ? 'push' : 'unshift'](pokemon.id);
|
|
1254
|
-
} else {
|
|
1255
|
-
teamHas.abilityMap[abilityId] = [pokemon.id];
|
|
1256
|
-
}
|
|
1257
|
-
}
|
|
1258
|
-
}
|
|
1259
|
-
}
|
|
1260
|
-
|
|
1261
|
-
const problem = this.validateForme(set);
|
|
1262
|
-
if (problem.length) return problem;
|
|
1263
|
-
|
|
1264
|
-
const species = this.dex.species.get(set.species);
|
|
1265
|
-
if (!species.exists || species.num < 1) return [`The Pok\u00e9mon "${set.species}" does not exist.`];
|
|
1266
|
-
if (species.isNonstandard || unreleased(species)) {
|
|
1267
|
-
return [`${species.name} is not obtainable in Generation ${this.dex.gen}.`];
|
|
1268
|
-
}
|
|
1269
|
-
|
|
1270
|
-
const name = set.name;
|
|
1271
|
-
if (this.ruleTable.isBannedSpecies(species)) {
|
|
1272
|
-
return this.validateSet(set, teamHas);
|
|
1273
|
-
}
|
|
1274
|
-
|
|
1275
|
-
const ability = this.dex.abilities.get(set.ability);
|
|
1276
|
-
if (!ability.exists || ability.isNonstandard) return [`${name} needs to have a valid ability.`];
|
|
1277
|
-
const pokemonWithAbility = teamHas.abilityMap[ability.id];
|
|
1278
|
-
if (!pokemonWithAbility) return [`${ability.name} is not available on a legal Pok\u00e9mon.`];
|
|
1279
|
-
|
|
1280
|
-
(this.format as any).debug = true;
|
|
1281
|
-
|
|
1282
|
-
if (!teamHas.abilitySources) teamHas.abilitySources = Object.create(null);
|
|
1283
|
-
const validSources: string[] = teamHas.abilitySources[this.dex.toID(set.species)] = []; // Evolution families
|
|
1284
|
-
|
|
1285
|
-
let canonicalSource = ''; // Specific for the basic implementation of Donor Clause (see onValidateTeam).
|
|
1286
|
-
|
|
1287
|
-
for (const donor of pokemonWithAbility) {
|
|
1288
|
-
const donorSpecies = this.dex.species.get(donor);
|
|
1289
|
-
let format = this.format;
|
|
1290
|
-
if (!format.getEvoFamily) format = this.dex.formats.get('gen8inheritance');
|
|
1291
|
-
const evoFamily = format.getEvoFamily!(donorSpecies.id);
|
|
1292
|
-
if (validSources.includes(evoFamily)) continue;
|
|
1293
|
-
|
|
1294
|
-
set.species = donorSpecies.name;
|
|
1295
|
-
set.name = donorSpecies.baseSpecies;
|
|
1296
|
-
const problems = this.validateSet(set, teamHas) || [];
|
|
1297
|
-
if (!problems.length) {
|
|
1298
|
-
validSources.push(evoFamily);
|
|
1299
|
-
canonicalSource = donorSpecies.name;
|
|
1300
|
-
}
|
|
1301
|
-
// Specific for the basic implementation of Donor Clause (see onValidateTeam).
|
|
1302
|
-
if (validSources.length > 1) break;
|
|
1303
|
-
}
|
|
1304
|
-
(this.format as any).debug = false;
|
|
1305
|
-
|
|
1306
|
-
set.name = name;
|
|
1307
|
-
set.species = species.name;
|
|
1308
|
-
if (!validSources.length) {
|
|
1309
|
-
if (pokemonWithAbility.length > 1) return [`${name}'s set is illegal.`];
|
|
1310
|
-
return [`${name} has an illegal set with an ability from ${this.dex.species.get(pokemonWithAbility[0]).name}.`];
|
|
1311
|
-
}
|
|
1312
|
-
|
|
1313
|
-
// Protocol: Include the data of the donor species in the `ability` data slot.
|
|
1314
|
-
// Afterwards, we are going to reset the name to what the user intended.
|
|
1315
|
-
set.ability = `${set.ability}0${canonicalSource}`;
|
|
1316
|
-
return null;
|
|
1317
|
-
},
|
|
1318
|
-
onValidateTeam(team, f, teamHas) {
|
|
1319
|
-
if (this.ruleTable.has('2abilityclause')) {
|
|
1320
|
-
const abilityTable = new Map<string, number>();
|
|
1321
|
-
const base: {[k: string]: string} = {
|
|
1322
|
-
airlock: 'cloudnine',
|
|
1323
|
-
battlearmor: 'shellarmor',
|
|
1324
|
-
clearbody: 'whitesmoke',
|
|
1325
|
-
dazzling: 'queenlymajesty',
|
|
1326
|
-
emergencyexit: 'wimpout',
|
|
1327
|
-
filter: 'solidrock',
|
|
1328
|
-
gooey: 'tanglinghair',
|
|
1329
|
-
insomnia: 'vitalspirit',
|
|
1330
|
-
ironbarbs: 'roughskin',
|
|
1331
|
-
libero: 'protean',
|
|
1332
|
-
minus: 'plus',
|
|
1333
|
-
moxie: 'chillingneigh',
|
|
1334
|
-
powerofalchemy: 'receiver',
|
|
1335
|
-
propellertail: 'stalwart',
|
|
1336
|
-
teravolt: 'moldbreaker',
|
|
1337
|
-
turboblaze: 'moldbreaker',
|
|
1338
|
-
};
|
|
1339
|
-
for (const set of team) {
|
|
1340
|
-
let ability = this.toID(set.ability.split('0')[0]);
|
|
1341
|
-
if (!ability) continue;
|
|
1342
|
-
if (ability in base) ability = base[ability] as ID;
|
|
1343
|
-
if ((abilityTable.get(ability) || 0) >= 2) {
|
|
1344
|
-
return [
|
|
1345
|
-
`You are limited to two of each ability by 2 Ability Clause.`,
|
|
1346
|
-
`(You have more than two ${this.dex.abilities.get(ability).name} variants)`,
|
|
1347
|
-
];
|
|
1348
|
-
}
|
|
1349
|
-
abilityTable.set(ability, (abilityTable.get(ability) || 0) + 1);
|
|
1350
|
-
}
|
|
1351
|
-
}
|
|
1352
|
-
|
|
1353
|
-
// Donor Clause
|
|
1354
|
-
const evoFamilyLists = [];
|
|
1355
|
-
for (const set of team) {
|
|
1356
|
-
const abilitySources = teamHas.abilitySources?.[this.dex.toID(set.species)];
|
|
1357
|
-
if (!abilitySources) continue;
|
|
1358
|
-
let format = this.format;
|
|
1359
|
-
if (!format.getEvoFamily) format = this.dex.formats.get('gen8inheritance');
|
|
1360
|
-
evoFamilyLists.push(abilitySources.map(format.getEvoFamily!));
|
|
1361
|
-
}
|
|
1362
|
-
|
|
1363
|
-
// Checking actual full incompatibility would require expensive algebra.
|
|
1364
|
-
// Instead, we only check the trivial case of multiple Pokémon only legal for exactly one family. FIXME?
|
|
1365
|
-
const requiredFamilies = Object.create(null);
|
|
1366
|
-
for (const evoFamilies of evoFamilyLists) {
|
|
1367
|
-
if (evoFamilies.length !== 1) continue;
|
|
1368
|
-
const [familyId] = evoFamilies;
|
|
1369
|
-
if (!(familyId in requiredFamilies)) requiredFamilies[familyId] = 1;
|
|
1370
|
-
requiredFamilies[familyId]++;
|
|
1371
|
-
if (requiredFamilies[familyId] > 2) {
|
|
1372
|
-
return [
|
|
1373
|
-
`You are limited to up to two inheritances from each evolution family by the Donor Clause.`,
|
|
1374
|
-
`(You inherit more than twice from ${this.dex.species.get(familyId).name}).`,
|
|
1375
|
-
];
|
|
1376
|
-
}
|
|
1377
|
-
}
|
|
1378
|
-
},
|
|
1379
|
-
onBegin() {
|
|
1380
|
-
for (const pokemon of this.getAllPokemon()) {
|
|
1381
|
-
if (pokemon.baseAbility.includes('0')) {
|
|
1382
|
-
const donor = pokemon.baseAbility.split('0')[1];
|
|
1383
|
-
pokemon.m.donor = this.toID(donor);
|
|
1384
|
-
pokemon.baseAbility = this.toID(pokemon.baseAbility.split('0')[0]);
|
|
1385
|
-
pokemon.ability = pokemon.baseAbility;
|
|
1386
|
-
}
|
|
1387
|
-
}
|
|
1388
|
-
},
|
|
1389
|
-
onSwitchIn(pokemon) {
|
|
1390
|
-
if (!pokemon.m.donor) return;
|
|
1391
|
-
const donorTemplate = this.dex.species.get(pokemon.m.donor);
|
|
1392
|
-
if (!donorTemplate.exists) return;
|
|
1393
|
-
// Place volatiles on the Pokémon to show the donor details.
|
|
1394
|
-
this.add('-start', pokemon, donorTemplate.name, '[silent]');
|
|
1395
|
-
},
|
|
1396
|
-
},
|
|
1397
1438
|
{
|
|
1398
1439
|
name: "[Gen 8] Linked",
|
|
1399
1440
|
desc: `The first two moves in a Pokémon's moveset are used simultaneously.`,
|
|
@@ -2126,7 +2167,18 @@ export const Formats: FormatList = [
|
|
|
2126
2167
|
mod: 'ssb',
|
|
2127
2168
|
team: 'randomStaffBros',
|
|
2128
2169
|
ruleset: ['Dynamax Clause', 'HP Percentage Mod', 'Cancel Mod', 'Sleep Clause Mod'],
|
|
2129
|
-
onBegin() {
|
|
2170
|
+
onBegin() {
|
|
2171
|
+
if (!this.ruleTable.has('dynamaxclause')) {
|
|
2172
|
+
// Old joke format we're bringing back
|
|
2173
|
+
for (const side of this.sides) {
|
|
2174
|
+
side.dynamaxUsed = true;
|
|
2175
|
+
}
|
|
2176
|
+
this.add('message', 'Delphox only');
|
|
2177
|
+
this.add('message', 'No items');
|
|
2178
|
+
this.add('message', 'Final Destination');
|
|
2179
|
+
return;
|
|
2180
|
+
}
|
|
2181
|
+
// TODO look into making an event to put this right after turn|1
|
|
2130
2182
|
// https://discordapp.com/channels/630837856075513856/630845310033330206/716126469528485909
|
|
2131
2183
|
// Requires client change
|
|
2132
2184
|
this.add(`raw|<div class='broadcast-green'><b>Wondering what all these custom moves, abilities, and items do?<br />Check out the <a href="https://www.smogon.com/articles/super-staff-bros-4" target="_blank">Super Staff Bros 4 Guide</a> or use /ssb to find out!</b></div>`);
|
|
@@ -2235,7 +2287,7 @@ export const Formats: FormatList = [
|
|
|
2235
2287
|
|
|
2236
2288
|
mod: 'gen7',
|
|
2237
2289
|
team: 'random',
|
|
2238
|
-
ruleset: ['Obtainable', 'Sleep Clause Mod', 'HP Percentage Mod', 'Cancel Mod'],
|
|
2290
|
+
ruleset: ['Obtainable', 'Sleep Clause Mod', 'HP Percentage Mod', 'Cancel Mod', 'Mega Rayquaza Clause'],
|
|
2239
2291
|
},
|
|
2240
2292
|
{
|
|
2241
2293
|
name: "[Gen 7] Random Doubles Battle",
|
|
@@ -2298,7 +2350,7 @@ export const Formats: FormatList = [
|
|
|
2298
2350
|
|
|
2299
2351
|
mod: 'gen6',
|
|
2300
2352
|
team: 'random',
|
|
2301
|
-
ruleset: ['Obtainable', 'Sleep Clause Mod', 'HP Percentage Mod', 'Cancel Mod'],
|
|
2353
|
+
ruleset: ['Obtainable', 'Sleep Clause Mod', 'HP Percentage Mod', 'Cancel Mod', 'Mega Rayquaza Clause'],
|
|
2302
2354
|
},
|
|
2303
2355
|
{
|
|
2304
2356
|
name: "[Gen 6] Battle Factory",
|
|
@@ -2382,36 +2434,44 @@ export const Formats: FormatList = [
|
|
|
2382
2434
|
column: 3,
|
|
2383
2435
|
},
|
|
2384
2436
|
{
|
|
2385
|
-
name: "[Gen
|
|
2437
|
+
name: "[Gen 2] Ubers",
|
|
2386
2438
|
threads: [
|
|
2387
|
-
`• <a href="https://www.smogon.com/
|
|
2388
|
-
`• <a href="https://www.smogon.com/forums/threads/3598164/">ORAS UU Viability Rankings</a>`,
|
|
2439
|
+
`• <a href="https://www.smogon.com/forums/posts/8286282/">GSC Ubers</a>`,
|
|
2389
2440
|
],
|
|
2390
2441
|
|
|
2391
|
-
mod: '
|
|
2442
|
+
mod: 'gen2',
|
|
2392
2443
|
// searchShow: false,
|
|
2393
|
-
ruleset: ['
|
|
2394
|
-
banlist: ['OU', 'UUBL', 'Drizzle', 'Drought'],
|
|
2444
|
+
ruleset: ['Standard'],
|
|
2395
2445
|
},
|
|
2396
2446
|
{
|
|
2397
|
-
name: "[Gen
|
|
2447
|
+
name: "[Gen 3] 1v1",
|
|
2448
|
+
desc: `Bring three Pokémon to Team Preview and choose one to battle.`,
|
|
2449
|
+
threads: [
|
|
2450
|
+
`• <a href="https://www.smogon.com/forums/posts/8031456/">ADV 1v1</a>`,
|
|
2451
|
+
],
|
|
2398
2452
|
|
|
2399
|
-
mod: '
|
|
2453
|
+
mod: 'gen3',
|
|
2400
2454
|
// searchShow: false,
|
|
2401
|
-
ruleset: [
|
|
2455
|
+
ruleset: [
|
|
2456
|
+
'Picked Team Size = 1', 'Max Team Size = 3',
|
|
2457
|
+
'[Gen 3] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview', '!Freeze Clause Mod',
|
|
2458
|
+
],
|
|
2459
|
+
banlist: ['Clefable', 'Slaking', 'Snorlax', 'Suicune', 'Destiny Bond', 'Explosion', 'Ingrain', 'Perish Song', 'Self-Destruct', 'Bright Powder', 'Focus Band', 'King\'s Rock', 'Lax Incense', 'Quick Claw'],
|
|
2460
|
+
unbanlist: ['Mr. Mime', 'Wobbuffet', 'Wynaut', 'Sand Veil'],
|
|
2402
2461
|
},
|
|
2403
2462
|
{
|
|
2404
|
-
name: "[Gen
|
|
2463
|
+
name: "[Gen 1] Stadium OU",
|
|
2405
2464
|
threads: [
|
|
2406
|
-
`• <a href="https://www.smogon.com/forums/threads/
|
|
2407
|
-
`• <a href="https://www.smogon.com/forums/threads/3645873/">USM RU Viability Rankings</a>`,
|
|
2465
|
+
`• <a href="https://www.smogon.com/forums/threads/3685877/">Stadium OU Viability Rankings</a>`,
|
|
2408
2466
|
],
|
|
2409
2467
|
|
|
2410
|
-
mod: '
|
|
2468
|
+
mod: 'gen1stadium',
|
|
2411
2469
|
// searchShow: false,
|
|
2412
|
-
ruleset: ['
|
|
2413
|
-
banlist: ['
|
|
2414
|
-
|
|
2470
|
+
ruleset: ['Standard', 'Team Preview'],
|
|
2471
|
+
banlist: ['Uber',
|
|
2472
|
+
'Nidoking + Fury Attack + Thrash', 'Exeggutor + Poison Powder + Stomp', 'Exeggutor + Sleep Powder + Stomp',
|
|
2473
|
+
'Exeggutor + Stun Spore + Stomp', 'Jolteon + Focus Energy + Thunder Shock', 'Flareon + Focus Energy + Ember',
|
|
2474
|
+
],
|
|
2415
2475
|
},
|
|
2416
2476
|
|
|
2417
2477
|
// Past Gens OU
|
|
@@ -2465,7 +2525,7 @@ export const Formats: FormatList = [
|
|
|
2465
2525
|
],
|
|
2466
2526
|
|
|
2467
2527
|
mod: 'gen4',
|
|
2468
|
-
ruleset: ['Standard'],
|
|
2528
|
+
ruleset: ['Standard', 'Freeze Clause Mod'],
|
|
2469
2529
|
banlist: ['AG', 'Uber', 'Arena Trap', 'Sand Veil', 'Swinub + Snow Cloak', 'Piloswine + Snow Cloak', 'Mamoswine + Snow Cloak', 'Soul Dew', 'Baton Pass', 'Swagger'],
|
|
2470
2530
|
},
|
|
2471
2531
|
{
|
|
@@ -2476,7 +2536,7 @@ export const Formats: FormatList = [
|
|
|
2476
2536
|
],
|
|
2477
2537
|
|
|
2478
2538
|
mod: 'gen3',
|
|
2479
|
-
ruleset: ['Standard', 'One Boost Passer Clause'],
|
|
2539
|
+
ruleset: ['Standard', 'One Boost Passer Clause', 'Freeze Clause Mod'],
|
|
2480
2540
|
banlist: ['Uber', 'Sand Veil', 'Soundproof', 'Assist', 'Baton Pass + Block', 'Baton Pass + Mean Look', 'Baton Pass + Spider Web', 'Smeargle + Ingrain'],
|
|
2481
2541
|
},
|
|
2482
2542
|
{
|
|
@@ -2657,6 +2717,19 @@ export const Formats: FormatList = [
|
|
|
2657
2717
|
ruleset: ['[Gen 7] OU'],
|
|
2658
2718
|
banlist: ['OU', 'UUBL', 'Drizzle', 'Drought', 'Kommonium Z', 'Mewnium Z'],
|
|
2659
2719
|
},
|
|
2720
|
+
{
|
|
2721
|
+
name: "[Gen 7] RU",
|
|
2722
|
+
threads: [
|
|
2723
|
+
`• <a href="https://www.smogon.com/forums/threads/3645338/">USM RU Sample Teams</a>`,
|
|
2724
|
+
`• <a href="https://www.smogon.com/forums/threads/3645873/">USM RU Viability Rankings</a>`,
|
|
2725
|
+
],
|
|
2726
|
+
|
|
2727
|
+
mod: 'gen7',
|
|
2728
|
+
searchShow: false,
|
|
2729
|
+
ruleset: ['[Gen 7] UU'],
|
|
2730
|
+
banlist: ['UU', 'RUBL', 'Mimikyu', 'Aurora Veil'],
|
|
2731
|
+
unbanlist: ['Drought'],
|
|
2732
|
+
},
|
|
2660
2733
|
{
|
|
2661
2734
|
name: "[Gen 7] NU",
|
|
2662
2735
|
threads: [
|
|
@@ -2949,6 +3022,18 @@ export const Formats: FormatList = [
|
|
|
2949
3022
|
searchShow: false,
|
|
2950
3023
|
ruleset: ['Standard', 'Swagger Clause', 'Mega Rayquaza Clause'],
|
|
2951
3024
|
},
|
|
3025
|
+
{
|
|
3026
|
+
name: "[Gen 6] UU",
|
|
3027
|
+
threads: [
|
|
3028
|
+
`• <a href="https://www.smogon.com/dex/xy/formats/uu/">ORAS UU Banlist</a>`,
|
|
3029
|
+
`• <a href="https://www.smogon.com/forums/threads/3598164/">ORAS UU Viability Rankings</a>`,
|
|
3030
|
+
],
|
|
3031
|
+
|
|
3032
|
+
mod: 'gen6',
|
|
3033
|
+
searchShow: false,
|
|
3034
|
+
ruleset: ['[Gen 6] OU'],
|
|
3035
|
+
banlist: ['OU', 'UUBL', 'Drizzle', 'Drought'],
|
|
3036
|
+
},
|
|
2952
3037
|
{
|
|
2953
3038
|
name: "[Gen 6] RU",
|
|
2954
3039
|
threads: [
|
|
@@ -3074,7 +3159,7 @@ export const Formats: FormatList = [
|
|
|
3074
3159
|
mod: 'gen6',
|
|
3075
3160
|
searchShow: false,
|
|
3076
3161
|
ruleset: ['[Gen 6] OU', '+CAP'],
|
|
3077
|
-
banlist: ['Aurumoth', 'Cawmodore'
|
|
3162
|
+
banlist: ['Aurumoth', 'Cawmodore'],
|
|
3078
3163
|
},
|
|
3079
3164
|
{
|
|
3080
3165
|
name: "[Gen 6] Battle Spot Singles",
|
|
@@ -3271,7 +3356,7 @@ export const Formats: FormatList = [
|
|
|
3271
3356
|
mod: 'gen5',
|
|
3272
3357
|
searchShow: false,
|
|
3273
3358
|
ruleset: ['[Gen 5] NU', 'Sleep Moves Clause'],
|
|
3274
|
-
banlist: ['NU', 'PUBL'],
|
|
3359
|
+
banlist: ['NU', 'PUBL', 'Damp Rock'],
|
|
3275
3360
|
},
|
|
3276
3361
|
{
|
|
3277
3362
|
name: "[Gen 5] LC",
|
|
@@ -3310,7 +3395,7 @@ export const Formats: FormatList = [
|
|
|
3310
3395
|
searchShow: false,
|
|
3311
3396
|
ruleset: [
|
|
3312
3397
|
'Picked Team Size = 1', 'Max Team Size = 3',
|
|
3313
|
-
'Standard', 'Baton Pass Clause', 'Swagger Clause', 'Accuracy Moves Clause',
|
|
3398
|
+
'Standard', 'Baton Pass Clause', 'Swagger Clause', 'Accuracy Moves Clause', 'Sleep Moves Clause',
|
|
3314
3399
|
],
|
|
3315
3400
|
banlist: ['Uber', 'Cottonee', 'Dragonite', 'Jirachi', 'Kyurem-Black', 'Mew', 'Togekiss', 'Whimsicott', 'Victini', 'Bright Powder', 'Focus Band', 'Focus Sash', 'Lax Incense', 'Quick Claw', 'Soul Dew', 'Perish Song'],
|
|
3316
3401
|
unbanlist: ['Genesect', 'Landorus', 'Manaphy', 'Thundurus', 'Tornadus-Therian'],
|
|
@@ -3443,7 +3528,7 @@ export const Formats: FormatList = [
|
|
|
3443
3528
|
|
|
3444
3529
|
mod: 'gen4',
|
|
3445
3530
|
searchShow: false,
|
|
3446
|
-
ruleset: ['[Gen 4] OU'],
|
|
3531
|
+
ruleset: ['[Gen 4] OU', '!Freeze Clause Mod'],
|
|
3447
3532
|
banlist: ['OU', 'UUBL'],
|
|
3448
3533
|
unbanlist: ['Arena Trap', 'Swagger'],
|
|
3449
3534
|
},
|
|
@@ -3492,6 +3577,13 @@ export const Formats: FormatList = [
|
|
|
3492
3577
|
'Berry Juice', 'Deep Sea Tooth', 'Dragon Rage', 'Sonic Boom', 'Swagger',
|
|
3493
3578
|
],
|
|
3494
3579
|
},
|
|
3580
|
+
{
|
|
3581
|
+
name: "[Gen 4] Anything Goes",
|
|
3582
|
+
|
|
3583
|
+
mod: 'gen4',
|
|
3584
|
+
searchShow: false,
|
|
3585
|
+
ruleset: ['Obtainable', 'Arceus EV Limit', 'Endless Battle Clause', 'HP Percentage Mod', 'Cancel Mod'],
|
|
3586
|
+
},
|
|
3495
3587
|
{
|
|
3496
3588
|
name: "[Gen 4] 1v1",
|
|
3497
3589
|
desc: `Bring three Pokémon to Team Preview and choose one to battle.`,
|
|
@@ -3503,7 +3595,7 @@ export const Formats: FormatList = [
|
|
|
3503
3595
|
searchShow: false,
|
|
3504
3596
|
ruleset: [
|
|
3505
3597
|
'Picked Team Size = 1', 'Max Team Size = 3',
|
|
3506
|
-
'[Gen 4] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview',
|
|
3598
|
+
'[Gen 4] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview', '!Freeze Clause Mod',
|
|
3507
3599
|
],
|
|
3508
3600
|
banlist: ['Latias', 'Machamp', 'Porygon-Z', 'Shaymin', 'Snorlax', 'Togekiss', 'Focus Sash', 'Destiny Bond', 'Explosion', 'Perish Song', 'Self-Destruct'],
|
|
3509
3601
|
unbanlist: ['Wobbuffet', 'Wynaut', 'Sand Veil', 'Swagger'],
|
|
@@ -3550,7 +3642,7 @@ export const Formats: FormatList = [
|
|
|
3550
3642
|
mod: 'gen4',
|
|
3551
3643
|
gameType: 'doubles',
|
|
3552
3644
|
searchShow: false,
|
|
3553
|
-
ruleset: ['[Gen 4] OU'],
|
|
3645
|
+
ruleset: ['[Gen 4] OU', '!Freeze Clause Mod'],
|
|
3554
3646
|
banlist: ['Explosion'],
|
|
3555
3647
|
unbanlist: ['Garchomp', 'Latias', 'Latios', 'Manaphy', 'Mew', 'Salamence', 'Wobbuffet', 'Wynaut', 'Swagger'],
|
|
3556
3648
|
},
|
|
@@ -3612,9 +3704,8 @@ export const Formats: FormatList = [
|
|
|
3612
3704
|
|
|
3613
3705
|
mod: 'gen3',
|
|
3614
3706
|
searchShow: false,
|
|
3615
|
-
ruleset: ['Standard'
|
|
3616
|
-
banlist: ['Uber', 'OU', 'UUBL', 'Smeargle + Ingrain', 'Baton Pass'],
|
|
3617
|
-
unbanlist: ['Scyther'],
|
|
3707
|
+
ruleset: ['Standard'],
|
|
3708
|
+
banlist: ['Uber', 'OU', 'UUBL', 'Smeargle + Ingrain', 'Arena Trap', 'Bright Powder', 'Lax Incense', 'Baton Pass', 'Swagger'],
|
|
3618
3709
|
},
|
|
3619
3710
|
{
|
|
3620
3711
|
name: "[Gen 3] NU",
|
|
@@ -3624,9 +3715,8 @@ export const Formats: FormatList = [
|
|
|
3624
3715
|
|
|
3625
3716
|
mod: 'gen3',
|
|
3626
3717
|
searchShow: false,
|
|
3627
|
-
ruleset: ['
|
|
3628
|
-
banlist: ['UU'],
|
|
3629
|
-
unbanlist: ['Baton Pass'],
|
|
3718
|
+
ruleset: ['Standard'],
|
|
3719
|
+
banlist: ['Uber', 'OU', 'UUBL', 'UU', 'Smeargle + Ingrain'],
|
|
3630
3720
|
},
|
|
3631
3721
|
{
|
|
3632
3722
|
name: "[Gen 3] Doubles OU",
|
|
@@ -3641,22 +3731,6 @@ export const Formats: FormatList = [
|
|
|
3641
3731
|
banlist: ['Uber'],
|
|
3642
3732
|
unbanlist: ['Deoxys-Speed', 'Wobbuffet', 'Wynaut'],
|
|
3643
3733
|
},
|
|
3644
|
-
{
|
|
3645
|
-
name: "[Gen 3] 1v1",
|
|
3646
|
-
desc: `Bring three Pokémon to Team Preview and choose one to battle.`,
|
|
3647
|
-
threads: [
|
|
3648
|
-
`• <a href="https://www.smogon.com/forums/posts/8031456/">ADV 1v1</a>`,
|
|
3649
|
-
],
|
|
3650
|
-
|
|
3651
|
-
mod: 'gen3',
|
|
3652
|
-
searchShow: false,
|
|
3653
|
-
ruleset: [
|
|
3654
|
-
'Picked Team Size = 1', 'Max Team Size = 3',
|
|
3655
|
-
'[Gen 3] OU', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview',
|
|
3656
|
-
],
|
|
3657
|
-
banlist: ['Clefable', 'Slaking', 'Snorlax', 'Suicune', 'Destiny Bond', 'Explosion', 'Ingrain', 'Perish Song', 'Self-Destruct', 'Bright Powder', 'Focus Band', 'King\'s Rock', 'Lax Incense', 'Quick Claw'],
|
|
3658
|
-
unbanlist: ['Mr. Mime', 'Wobbuffet', 'Wynaut', 'Sand Veil'],
|
|
3659
|
-
},
|
|
3660
3734
|
{
|
|
3661
3735
|
name: "[Gen 3] Custom Game",
|
|
3662
3736
|
|
|
@@ -3675,16 +3749,6 @@ export const Formats: FormatList = [
|
|
|
3675
3749
|
debug: true,
|
|
3676
3750
|
ruleset: ['HP Percentage Mod', 'Cancel Mod', 'Max Team Size = 24', 'Max Move Count = 24', 'Max Level = 9999', 'Default Level = 100'],
|
|
3677
3751
|
},
|
|
3678
|
-
{
|
|
3679
|
-
name: "[Gen 2] Ubers",
|
|
3680
|
-
threads: [
|
|
3681
|
-
`• <a href="https://www.smogon.com/forums/posts/8286282/">GSC Ubers</a>`,
|
|
3682
|
-
],
|
|
3683
|
-
|
|
3684
|
-
mod: 'gen2',
|
|
3685
|
-
searchShow: false,
|
|
3686
|
-
ruleset: ['Standard'],
|
|
3687
|
-
},
|
|
3688
3752
|
{
|
|
3689
3753
|
name: "[Gen 2] UU",
|
|
3690
3754
|
threads: [`• <a href="https://www.smogon.com/forums/threads/3576710/">GSC UU</a>`],
|
|
@@ -3772,7 +3836,7 @@ export const Formats: FormatList = [
|
|
|
3772
3836
|
|
|
3773
3837
|
mod: 'gen1',
|
|
3774
3838
|
searchShow: false,
|
|
3775
|
-
ruleset: ['[Gen 1] OU'],
|
|
3839
|
+
ruleset: ['[Gen 1] OU', 'APT Clause'],
|
|
3776
3840
|
banlist: ['OU', 'UUBL'],
|
|
3777
3841
|
},
|
|
3778
3842
|
{
|
|
@@ -3809,20 +3873,6 @@ export const Formats: FormatList = [
|
|
|
3809
3873
|
],
|
|
3810
3874
|
banlist: ['Uber'],
|
|
3811
3875
|
},
|
|
3812
|
-
{
|
|
3813
|
-
name: "[Gen 1] Stadium OU",
|
|
3814
|
-
threads: [
|
|
3815
|
-
`• <a href="https://www.smogon.com/forums/threads/3685877/">Stadium OU Viability Rankings</a>`,
|
|
3816
|
-
],
|
|
3817
|
-
|
|
3818
|
-
mod: 'gen1stadium',
|
|
3819
|
-
searchShow: false,
|
|
3820
|
-
ruleset: ['Standard', 'Team Preview'],
|
|
3821
|
-
banlist: ['Uber',
|
|
3822
|
-
'Nidoking + Fury Attack + Thrash', 'Exeggutor + Poison Powder + Stomp', 'Exeggutor + Sleep Powder + Stomp',
|
|
3823
|
-
'Exeggutor + Stun Spore + Stomp', 'Jolteon + Focus Energy + Thunder Shock', 'Flareon + Focus Energy + Ember',
|
|
3824
|
-
],
|
|
3825
|
-
},
|
|
3826
3876
|
{
|
|
3827
3877
|
name: "[Gen 1] Tradebacks OU",
|
|
3828
3878
|
desc: `RBY OU with movepool additions from the Time Capsule.`,
|