mirror of
https://github.com/smogon/pokemon-showdown.git
synced 2026-03-21 17:25:10 -05:00
5463 lines
245 KiB
TypeScript
5463 lines
245 KiB
TypeScript
// Note: This is the list of formats
|
|
// The rules that formats use are stored in data/rulesets.ts
|
|
/*
|
|
If you want to add custom formats, create a file in this folder named: "custom-formats.ts"
|
|
|
|
Paste the following code into the file and add your desired formats and their sections between the brackets:
|
|
--------------------------------------------------------------------------------
|
|
// Note: This is the list of formats
|
|
// The rules that formats use are stored in data/rulesets.ts
|
|
|
|
export const Formats: FormatList = [
|
|
];
|
|
--------------------------------------------------------------------------------
|
|
|
|
If you specify a section that already exists, your format will be added to the bottom of that section.
|
|
New sections will be added to the bottom of the specified column.
|
|
The column value will be ignored for repeat sections.
|
|
*/
|
|
|
|
export const Formats: import('../sim/dex-formats').FormatList = [
|
|
|
|
// S/V Singles
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
{
|
|
section: "S/V Singles",
|
|
},
|
|
{
|
|
name: "[Gen 9] Random Battle",
|
|
desc: `Randomized teams of Pokémon with sets that are generated to be competitively viable.`,
|
|
mod: 'gen9',
|
|
team: 'random',
|
|
bestOfDefault: true,
|
|
ruleset: ['PotD', 'Obtainable', 'Species Clause', 'HP Percentage Mod', 'Cancel Mod', 'Sleep Clause Mod', 'Illusion Level Mod'],
|
|
},
|
|
{
|
|
name: "[Gen 9] Unrated Random Battle",
|
|
mod: 'gen9',
|
|
team: 'random',
|
|
challengeShow: false,
|
|
rated: false,
|
|
ruleset: ['Obtainable', 'Species Clause', 'HP Percentage Mod', 'Cancel Mod', 'Sleep Clause Mod', 'Illusion Level Mod'],
|
|
},
|
|
{
|
|
name: "[Gen 9] Free-For-All Random Battle",
|
|
mod: 'gen9',
|
|
team: 'randomFFA',
|
|
gameType: 'freeforall',
|
|
tournamentShow: false,
|
|
rated: false,
|
|
ruleset: ['Obtainable', 'Species Clause', 'HP Percentage Mod', 'Cancel Mod', 'Sleep Clause Mod', 'Illusion Level Mod'],
|
|
},
|
|
{
|
|
name: "[Gen 9] Random Battle (Blitz)",
|
|
mod: 'gen9',
|
|
team: 'random',
|
|
bestOfDefault: true,
|
|
ruleset: ['[Gen 9] Random Battle', 'Blitz'],
|
|
},
|
|
{
|
|
name: "[Gen 9] Multi Random Battle",
|
|
mod: 'gen9',
|
|
team: 'random',
|
|
gameType: 'multi',
|
|
searchShow: false,
|
|
tournamentShow: false,
|
|
rated: false,
|
|
ruleset: [
|
|
'Max Team Size = 3',
|
|
'Obtainable', 'Species Clause', 'HP Percentage Mod', 'Cancel Mod', 'Sleep Clause Mod', 'Illusion Level Mod',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 9] OU",
|
|
mod: 'gen9',
|
|
ruleset: ['Standard', 'Evasion Abilities Clause', 'Sleep Moves Clause', '!Sleep Clause Mod'],
|
|
banlist: ['Uber', 'AG', 'Arena Trap', 'Moody', 'Shadow Tag', 'King\'s Rock', 'Razor Fang', 'Baton Pass', 'Last Respects', 'Shed Tail'],
|
|
},
|
|
{
|
|
name: "[Gen 9] Ubers",
|
|
mod: 'gen9',
|
|
ruleset: ['Standard'],
|
|
banlist: ['AG', 'Moody', 'King\'s Rock', 'Razor Fang', 'Baton Pass', 'Last Respects'],
|
|
},
|
|
{
|
|
name: "[Gen 9] UU",
|
|
mod: 'gen9',
|
|
ruleset: ['[Gen 9] OU'],
|
|
banlist: ['OU', 'UUBL'],
|
|
},
|
|
{
|
|
name: "[Gen 9] RU",
|
|
mod: 'gen9',
|
|
ruleset: ['[Gen 9] UU'],
|
|
banlist: ['UU', 'RUBL', 'Light Clay'],
|
|
},
|
|
{
|
|
name: "[Gen 9] NU",
|
|
mod: 'gen9',
|
|
ruleset: ['[Gen 9] RU'],
|
|
banlist: ['RU', 'NUBL', 'Drought', 'Quick Claw'],
|
|
},
|
|
{
|
|
name: "[Gen 9] PU",
|
|
mod: 'gen9',
|
|
ruleset: ['[Gen 9] NU'],
|
|
banlist: ['NU', 'PUBL', 'Damp Rock'],
|
|
},
|
|
{
|
|
name: "[Gen 9] LC",
|
|
mod: 'gen9',
|
|
ruleset: ['Little Cup', 'Standard'],
|
|
banlist: [
|
|
'Aipom', 'Basculin-White-Striped', 'Cutiefly', 'Diglett-Base', 'Dunsparce', 'Duraludon', 'Flittle', 'Gastly', 'Girafarig', 'Gligar',
|
|
'Magby', 'Meditite', 'Misdreavus', 'Murkrow', 'Porygon', 'Qwilfish-Hisui', 'Rufflet', 'Scraggy', 'Scyther', 'Sneasel', 'Sneasel-Hisui',
|
|
'Snivy', 'Stantler', 'Torchic', 'Voltorb-Hisui', 'Vulpix', 'Vulpix-Alola', 'Yanma', 'Moody', 'Heat Rock', 'Baton Pass', 'Sticky Web',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 9] Monotype",
|
|
mod: 'gen9',
|
|
ruleset: ['Standard', 'Evasion Abilities Clause', 'Same Type Clause', 'Terastal Clause'],
|
|
banlist: [
|
|
'Annihilape', 'Arceus', 'Baxcalibur', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Blaziken', 'Deoxys-Normal', 'Deoxys-Attack',
|
|
'Dialga', 'Dialga-Origin', 'Espathra', 'Eternatus', 'Giratina', 'Giratina-Origin', 'Gouging Fire', 'Groudon', 'Ho-Oh', 'Iron Bundle', 'Kingambit',
|
|
'Koraidon', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane',
|
|
'Palafin', 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Reshiram', 'Shaymin-Sky', 'Solgaleo', 'Ursaluna-Bloodmoon', 'Urshifu-Single-Strike', 'Zacian',
|
|
'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Moody', 'Shadow Tag', 'Booster Energy', 'Damp Rock', 'Focus Band', 'King\'s Rock',
|
|
'Quick Claw', 'Razor Fang', 'Smooth Rock', 'Baton Pass', 'Last Respects', 'Shed Tail',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 9] CAP",
|
|
desc: "The Create-A-Pokémon project is a community dedicated to exploring and understanding the competitive Pokémon metagame by designing, creating, and playtesting new Pokémon concepts.",
|
|
mod: 'gen9',
|
|
ruleset: ['[Gen 9] OU', '+CAP'],
|
|
banlist: ['Crucibellite', 'Rage Fist'],
|
|
},
|
|
{
|
|
name: "[Gen 9] BSS Reg I",
|
|
mod: 'gen9',
|
|
bestOfDefault: true,
|
|
ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 9', 'VGC Timer', 'Limit Two Restricted'],
|
|
restricted: ['Restricted Legendary'],
|
|
},
|
|
{
|
|
name: "[Gen 9] BSS Reg J",
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
bestOfDefault: true,
|
|
ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 9', 'VGC Timer', 'Limit Two Restricted'],
|
|
restricted: ['Restricted Legendary', 'Mythical'],
|
|
},
|
|
{
|
|
name: "[Gen 9] Custom Game",
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
debug: true,
|
|
battle: { trunc: Math.trunc },
|
|
// no restrictions, for serious (other than team preview)
|
|
ruleset: ['Team Preview', 'Cancel Mod', 'Max Team Size = 24', 'Max Move Count = 24', 'Max Level = 9999', 'Default Level = 100'],
|
|
},
|
|
|
|
// S/V Doubles
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
{
|
|
section: "S/V Doubles",
|
|
},
|
|
{
|
|
name: "[Gen 9] Random Doubles Battle",
|
|
mod: 'gen9',
|
|
gameType: 'doubles',
|
|
team: 'random',
|
|
bestOfDefault: true,
|
|
ruleset: ['PotD', 'Obtainable', 'Species Clause', 'HP Percentage Mod', 'Cancel Mod', 'Illusion Level Mod', 'Sleep Clause Mod'],
|
|
},
|
|
{
|
|
name: "[Gen 9] Doubles OU",
|
|
mod: 'gen9',
|
|
gameType: 'doubles',
|
|
ruleset: ['Standard Doubles', 'Evasion Abilities Clause'],
|
|
banlist: ['DUber', 'Shadow Tag', 'Commander'],
|
|
},
|
|
{
|
|
name: "[Gen 9] Doubles Ubers",
|
|
mod: 'gen9',
|
|
gameType: 'doubles',
|
|
ruleset: ['Standard Doubles', '!Gravity Sleep Clause'],
|
|
},
|
|
{
|
|
name: "[Gen 9] Doubles UU",
|
|
mod: 'gen9',
|
|
gameType: 'doubles',
|
|
ruleset: ['[Gen 9] Doubles OU'],
|
|
banlist: ['DOU', 'DBL'],
|
|
},
|
|
{
|
|
name: "[Gen 9] Doubles LC",
|
|
mod: 'gen9',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
ruleset: ['Standard Doubles', 'Little Cup', 'Sleep Clause Mod'],
|
|
banlist: [
|
|
'Basculin-White-Striped', 'Dunsparce', 'Duraludon', 'Girafarig', 'Gligar', 'Misdreavus', 'Murkrow', 'Qwilfish-Hisui', 'Scyther', 'Sneasel', 'Sneasel-Hisui',
|
|
'Stantler', 'Vulpix', 'Vulpix-Alola', 'Yanma',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 9] VGC 2023 Reg C",
|
|
mod: 'gen9predlc',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
bestOfDefault: true,
|
|
ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 9', 'VGC Timer', 'Open Team Sheets', 'Paldea Pokedex'],
|
|
},
|
|
{
|
|
name: "[Gen 9] VGC 2023 Reg D",
|
|
mod: 'gen9predlc',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
bestOfDefault: true,
|
|
ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 9', 'VGC Timer', 'Open Team Sheets'],
|
|
banlist: ['Walking Wake', 'Iron Leaves'],
|
|
},
|
|
{
|
|
name: "[Gen 9] VGC 2024 Reg G",
|
|
mod: 'gen9',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
bestOfDefault: true,
|
|
ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 9', 'VGC Timer', 'Open Team Sheets', 'Limit One Restricted'],
|
|
restricted: ['Restricted Legendary'],
|
|
},
|
|
{
|
|
name: "[Gen 9] VGC 2026 Reg I", // Change back to 2025 after removing the ladder
|
|
mod: 'gen9',
|
|
gameType: 'doubles',
|
|
bestOfDefault: true,
|
|
ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 9', 'VGC Timer', 'Limit Two Restricted'],
|
|
restricted: ['Restricted Legendary'],
|
|
},
|
|
{
|
|
name: "[Gen 9] VGC 2026 Reg F",
|
|
|
|
mod: 'gen9',
|
|
gameType: 'doubles',
|
|
bestOfDefault: true,
|
|
ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 9', 'VGC Timer', 'Open Team Sheets'],
|
|
},
|
|
{
|
|
name: "[Gen 9] VGC 2026 Reg F (Bo3)",
|
|
|
|
mod: 'gen9',
|
|
gameType: 'doubles',
|
|
ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 9', 'VGC Timer', 'Force Open Team Sheets', 'Best of = 3'],
|
|
},
|
|
{
|
|
name: "[Gen 9] Doubles Custom Game",
|
|
mod: 'gen9',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
battle: { trunc: Math.trunc },
|
|
debug: true,
|
|
// no restrictions, for serious (other than team preview)
|
|
ruleset: ['Team Preview', 'Cancel Mod', 'Max Team Size = 24', 'Max Move Count = 24', 'Max Level = 9999', 'Default Level = 100'],
|
|
},
|
|
|
|
// S/V Doubles
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
{
|
|
section: "Unofficial Metagames",
|
|
},
|
|
{
|
|
name: "[Gen 9] 1v1",
|
|
desc: `Bring three Pokémon to Team Preview and choose one to battle.`,
|
|
mod: 'gen9',
|
|
ruleset: [
|
|
'Picked Team Size = 1', 'Max Team Size = 3',
|
|
'Standard', 'Terastal Clause', 'Sleep Moves Clause', 'Accuracy Moves Clause', '!Sleep Clause Mod',
|
|
],
|
|
banlist: [
|
|
'Arceus', 'Archaludon', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Cinderace', 'Deoxys', 'Deoxys-Attack', 'Deoxys-Defense', 'Deoxys-Speed', 'Dialga',
|
|
'Dialga-Origin', 'Dragonite', 'Eternatus', 'Flutter Mane', 'Gholdengo', 'Giratina', 'Giratina-Origin', 'Gouging Fire', 'Groudon', 'Ho-Oh', 'Jirachi',
|
|
'Koraidon', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Meloetta', 'Mew', 'Mewtwo', 'Mimikyu', 'Miraidon', 'Necrozma',
|
|
'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Ogerpon-Cornerstone', 'Ogerpon-Hearthflame', 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Regidrago', 'Reshiram',
|
|
'Scream Tail', 'Shaymin-Sky', 'Snorlax', 'Solgaleo', 'Terapagos', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Moody',
|
|
'Custap Berry', 'Focus Band', 'Focus Sash', 'King\'s Rock', 'Razor Fang', 'Quick Claw', 'Perish Song',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 9] 2v2 Doubles",
|
|
desc: `Double battle where you bring four Pokémon to Team Preview and choose only two.`,
|
|
mod: 'gen9',
|
|
gameType: 'doubles',
|
|
ruleset: [
|
|
'Picked Team Size = 2', 'Max Team Size = 4',
|
|
'Standard Doubles', 'Accuracy Moves Clause', 'Terastal Clause', 'Sleep Clause Mod', 'Evasion Items Clause',
|
|
],
|
|
banlist: [
|
|
'Arceus', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', 'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon',
|
|
'Ho-Oh', 'Koraidon', 'Kyogre', 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia',
|
|
'Palkia-Origin', 'Rayquaza', 'Reshiram', 'Solgaleo', 'Urshifu', 'Urshifu-Rapid-Strike', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned',
|
|
'Zekrom', 'Commander', 'Moody', 'Focus Sash', 'King\'s Rock', 'Razor Fang', 'Ally Switch', 'Final Gambit', 'Perish Song', 'Swagger',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 9] Anything Goes",
|
|
mod: 'gen9',
|
|
ruleset: ['Standard AG'],
|
|
},
|
|
{
|
|
name: "[Gen 9] ZU",
|
|
mod: 'gen9',
|
|
ruleset: ['[Gen 9] PU'],
|
|
banlist: ['PU', 'ZUBL', 'Unburden', 'Heat Rock'],
|
|
},
|
|
{
|
|
name: "[Gen 9] Free-For-All",
|
|
mod: 'gen9',
|
|
gameType: 'freeforall',
|
|
rated: false,
|
|
tournamentShow: false,
|
|
ruleset: ['Standard', 'Sleep Moves Clause', '!Sleep Clause Mod', '!Evasion Items Clause'],
|
|
banlist: [
|
|
'Annihilape', 'Arceus', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Darkrai', 'Deoxys-Normal', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin',
|
|
'Dondozo', 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Hoopa-Unbound', 'Iron Bundle', 'Koraidon', 'Kyogre', 'Kyurem-White',
|
|
'Landorus-Incarnate', 'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Ogerpon-Hearthflame', 'Palkia',
|
|
'Palkia-Origin', 'Rayquaza', 'Reshiram', 'Shaymin-Sky', 'Solgaleo', 'Spectrier', 'Terapagos', 'Ursaluna', 'Ursaluna-Bloodmoon', 'Urshifu', 'Urshifu-Rapid-Strike',
|
|
'Zacian', 'Zacian-Crowned', 'Zekrom', 'Moody', 'Shadow Tag', 'Toxic Chain', 'Toxic Debris', 'Aromatic Mist', 'Baton Pass', 'Coaching',
|
|
'Court Change', 'Decorate', 'Dragon Cheer', 'Final Gambit', 'Flatter', 'Fling', 'Floral Healing', 'Follow Me', 'Heal Pulse', 'Heart Swap', 'Last Respects',
|
|
'Malignant Chain', 'Poison Fang', 'Rage Powder', 'Skill Swap', 'Spicy Extract', 'Swagger', 'Toxic', 'Toxic Spikes',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 9] LC UU",
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 9] LC'],
|
|
banlist: [
|
|
'Chinchou', 'Diglett-Alola', 'Drifloon', 'Elekid', 'Foongus', 'Glimmet', 'Gothita', 'Grookey', 'Growlithe-Hisui', 'Koffing', 'Mareanie', 'Mienfoo', 'Mudbray',
|
|
'Pawniard', 'Sandshrew-Alola', 'Shellder', 'Shellos', 'Snover', 'Stunky', 'Timburr', 'Tinkatink', 'Toedscool', 'Trapinch', 'Vullaby', 'Wingull', 'Zorua-Hisui',
|
|
// LC UUBL
|
|
'Deerling', 'Minccino', 'Light Clay',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 9] NFE",
|
|
desc: `Only Pokémon that can evolve are allowed.`,
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
ruleset: ['Standard OMs', 'Not Fully Evolved', 'Sleep Moves Clause', 'Terastal Clause'],
|
|
banlist: [
|
|
'Basculin-White-Striped', 'Bisharp', 'Chansey', 'Combusken', 'Dipplin', 'Duraludon', 'Electabuzz', 'Gligar', 'Gurdurr',
|
|
'Haunter', 'Magmar', 'Magneton', 'Misdreavus', 'Porygon2', 'Primeape', 'Qwilfish-Hisui', 'Rhydon', 'Scyther', 'Sneasel',
|
|
'Sneasel-Hisui', 'Ursaring', 'Vigoroth', 'Vulpix-Base', 'Arena Trap', 'Magnet Pull', 'Moody', 'Shadow Tag', 'Baton Pass',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 9] Ubers UU",
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 9] Ubers'],
|
|
banlist: [
|
|
// Ubers OU
|
|
'Arceus-Normal', 'Arceus-Fairy', 'Arceus-Ghost', 'Arceus-Ground', 'Arceus-Water', 'Calyrex-Ice', 'Chien-Pao', 'Deoxys-Attack', 'Deoxys-Speed', 'Ditto',
|
|
'Dondozo', 'Eternatus', 'Flutter Mane', 'Giratina-Origin', 'Glimmora', 'Gliscor', 'Grimmsnarl', 'Groudon', 'Hatterene', 'Ho-Oh', 'Kingambit', 'Koraidon',
|
|
'Kyogre', 'Kyurem-Black', 'Landorus-Therian', 'Lunala', 'Necrozma-Dusk-Mane', 'Rayquaza', 'Ribombee', 'Skeledirge', 'Terapagos', 'Ting-Lu', 'Zacian-Crowned',
|
|
// Ubers UUBL + Lunala, Arceus-Ghost, Arceus-Water
|
|
'Arceus-Dragon', 'Arceus-Electric', 'Arceus-Fire', 'Arceus-Flying', 'Arceus-Steel', 'Giratina', 'Necrozma-Dawn-Wings', 'Shaymin-Sky', 'Spectrier', 'Zacian',
|
|
'Zekrom',
|
|
],
|
|
},
|
|
|
|
// Draft League
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
{
|
|
section: "Draft",
|
|
column: 1,
|
|
},
|
|
{
|
|
name: "[Gen 9] Draft",
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
teraPreviewDefault: true,
|
|
ruleset: ['Standard Draft', 'Min Source Gen = 9'],
|
|
},
|
|
{
|
|
name: "[Gen 9] 6v6 Doubles Draft",
|
|
mod: 'gen9',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
teraPreviewDefault: true,
|
|
ruleset: ['Standard Draft', '!Sleep Clause Mod', '!Evasion Clause', 'Min Source Gen = 9'],
|
|
},
|
|
{
|
|
name: "[Gen 9] 4v4 Doubles Draft",
|
|
mod: 'gen9',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
bestOfDefault: true,
|
|
teraPreviewDefault: true,
|
|
ruleset: ['Standard Draft', 'Item Clause = 1', 'VGC Timer', '!Sleep Clause Mod', '!OHKO Clause', '!Evasion Clause', 'Adjust Level = 50', 'Picked Team Size = 4', 'Min Source Gen = 9'],
|
|
},
|
|
{
|
|
name: "[Gen 9] NatDex Draft",
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
teraPreviewDefault: true,
|
|
ruleset: ['Standard Draft', '+Unobtainable', '+Past', 'Min Source Gen = 1'],
|
|
},
|
|
{
|
|
name: "[Gen 9] NatDex 6v6 Doubles Draft",
|
|
mod: 'gen9',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
teraPreviewDefault: true,
|
|
ruleset: ['[Gen 9] 6v6 Doubles Draft', '+Unobtainable', '+Past', '!! Min Source Gen = 3'],
|
|
},
|
|
{
|
|
name: "[Gen 9] NatDex LC Draft",
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
teraPreviewDefault: true,
|
|
ruleset: ['[Gen 9] NatDex Draft', 'Item Clause = 2', 'Little Cup'],
|
|
banlist: ['Dragon Rage', 'Sonic Boom'],
|
|
},
|
|
{
|
|
name: "[Gen 8] Draft",
|
|
mod: 'gen8',
|
|
searchShow: false,
|
|
ruleset: ['Standard Draft', 'Dynamax Clause'],
|
|
},
|
|
{
|
|
name: "[Gen 8] NatDex Draft",
|
|
mod: 'gen8',
|
|
searchShow: false,
|
|
ruleset: ['Standard Draft', 'NatDex Mod', 'Dynamax Clause'],
|
|
},
|
|
{
|
|
name: "[Gen 8] NatDex 4v4 Doubles Draft",
|
|
mod: 'gen8',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
ruleset: ['Standard Draft', 'Item Clause = 1', 'NatDex Mod', '!Sleep Clause Mod', '!OHKO Clause', '!Evasion Moves Clause', 'Adjust Level = 50', 'Picked Team Size = 4'],
|
|
},
|
|
{
|
|
name: "[Gen 7] Draft",
|
|
mod: 'gen7',
|
|
searchShow: false,
|
|
ruleset: ['Standard Draft', '+LGPE'],
|
|
},
|
|
{
|
|
name: "[Gen 6] Draft",
|
|
mod: 'gen6',
|
|
searchShow: false,
|
|
ruleset: ['Standard Draft', 'Moody Clause', 'Swagger Clause'],
|
|
banlist: ['Soul Dew'],
|
|
},
|
|
{
|
|
name: "[Gen 5] Draft",
|
|
mod: 'gen5',
|
|
searchShow: false,
|
|
ruleset: ['Standard Draft', '-Unreleased', 'Moody Clause', 'Swagger Clause', 'DryPass Clause', 'Gems Clause', 'Sleep Moves Clause'],
|
|
banlist: ['King\'s Rock', 'Quick Claw', 'Soul Dew', 'Assist', 'Drizzle ++ Swift Swim', 'Drought ++ Chlorophyll', 'Sand Stream ++ Sand Rush', 'Landorus + Sheer Force', 'Excadrill + Sand Rush'],
|
|
},
|
|
{
|
|
name: "[Gen 4] Draft",
|
|
mod: 'gen4',
|
|
searchShow: false,
|
|
ruleset: ['Standard Draft', 'Swagger Clause', 'DryPass Clause', '!Team Preview', '!Evasion Abilities Clause', 'Accuracy Moves Clause'],
|
|
banlist: ['King\'s Rock', 'Quick Claw', 'Assist', 'Sand Stream ++ Sand Veil', 'Snow Warning ++ Snow Cloak', 'No Guard + Dynamic Punch'],
|
|
},
|
|
{
|
|
name: "[Gen 3] Draft",
|
|
mod: 'gen3',
|
|
searchShow: false,
|
|
ruleset: ['Standard Draft'],
|
|
},
|
|
|
|
// Ladder Spotlight
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
{
|
|
section: "Ladder Spotlight",
|
|
column: 2,
|
|
},
|
|
{
|
|
name: "[Gen 9] BSS Factory (Bo3)",
|
|
desc: `Randomized 3v3 Singles featuring Pokémon and movesets popular in Battle Stadium Singles.`,
|
|
mod: 'gen9',
|
|
team: 'randomBSSFactory',
|
|
ruleset: ['Flat Rules', 'VGC Timer', 'Best of = 3'],
|
|
},
|
|
{
|
|
name: "[Gen 9] Linked",
|
|
desc: `The first two moves in a Pokémon's moveset are used simultaneously.`,
|
|
mod: 'linked',
|
|
// searchShow: false,
|
|
ruleset: ['Standard OMs', 'Sleep Moves Clause', 'Evasion Clause', 'Terastal Clause'],
|
|
banlist: [
|
|
'Annihilape', 'Arceus', 'Archaludon', 'Baxcalibur', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Deoxys-Attack', 'Deoxys-Normal', 'Dialga', 'Dialga-Origin',
|
|
'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Gouging Fire', 'Groudon', 'Ho-Oh', 'Iron Bundle', 'Jirachi', 'Koraidon', 'Kyogre', 'Kyurem-Black', 'Kyurem-White',
|
|
'Landorus-Incarnate', 'Lugia', 'Lunala', 'Magearna', 'Meloetta', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Ogerpon-Hearthflame', 'Palafin',
|
|
'Palkia', 'Palkia-Origin', 'Rayquaza', 'Reshiram', 'Roaring Moon', 'Shaymin-Sky', 'Sneasler', 'Solgaleo', 'Spectrier', 'Ursaluna-Bloodmoon', 'Urshifu-Single-Strike',
|
|
'Urshifu-Rapid-Strike', 'Volcarona', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', 'Arena Trap', 'Drought', 'Electric Surge', 'Moody', 'Sand Rush',
|
|
'Serene Grace', 'Shadow Tag', 'Slush Rush', 'Speed Boost', 'Swift Swim', 'Unburden', 'Booster Energy', 'King\'s Rock', 'Razor Fang', 'Baton Pass', 'Last Respects',
|
|
'Shed Tail',
|
|
],
|
|
restricted: [
|
|
'Baneful Bunker', 'Bounce', 'Burning Bulwark', 'Copycat', 'Detect', 'Dig', 'Dive', 'Encore', 'Fly', 'Imprison', 'Nasty Plot', 'Phantom Force', 'Protect', 'Ruination',
|
|
'Shadow Force', 'Shell Smash', 'Silk Trap', 'Spiky Shield', 'Super Fang', 'Swords Dance', 'Taunt', 'Trick Room',
|
|
],
|
|
onValidateSet(set) {
|
|
const problems = [];
|
|
for (const [i, moveid] of set.moves.entries()) {
|
|
const move = this.dex.moves.get(moveid);
|
|
if ([0, 1].includes(i) && this.ruleTable.isRestricted(`move:${move.id}`)) {
|
|
problems.push(`${set.name || set.species}'s move ${move.name} cannot be linked.`);
|
|
}
|
|
}
|
|
return problems;
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 9] 350 Cup",
|
|
desc: `Pokemon with a BST of 350 or lower have their stats doubled.`,
|
|
mod: 'gen9',
|
|
// searchShow: false,
|
|
ruleset: ['Standard OMs', 'Sleep Moves Clause', '350 Cup Mod', 'Evasion Clause'],
|
|
banlist: ['Calyrex-Shadow', 'Flittle', 'Gastly', 'Miraidon', 'Pikachu', 'Rufflet', 'Arena Trap', 'Moody', 'Shadow Tag', 'Eviolite', 'Baton Pass'],
|
|
},
|
|
{
|
|
name: "[Gen 9] Pokebilities AAA",
|
|
desc: `Pokémon have all of their released abilities simultaneously, as well as one ability they cannot normally use.`,
|
|
mod: 'pokebilities',
|
|
// searchShow: false,
|
|
ruleset: ['Standard OMs', '!Obtainable Abilities', 'Ability Clause = 1', 'AAA Restricted Abilities', 'Terastal Clause', 'Sleep Moves Clause'],
|
|
banlist: [
|
|
'Annihilape', 'Arcanine-Hisui', 'Arceus', 'Archaludon', 'Azumarill', 'Basculegion', 'Basculin', 'Baxcalibur', 'Blaziken', 'Braviary-Hisui', 'Calyrex-Ice', 'Calyrex-Shadow',
|
|
'Ceruledge', 'Chi-Yu', 'Chien-Pao', 'Clefable', 'Cloyster', 'Conkeldurr', 'Darkrai', 'Deoxys-Normal', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', 'Dondozo', 'Dragonite',
|
|
'Enamorus-Incarnate', 'Espathra', 'Eternatus', 'Excadrill', 'Flutter Mane', 'Gholdengo', 'Giratina', 'Giratina-Origin', 'Gouging Fire', 'Groudon', 'Hawlucha', 'Ho-Oh',
|
|
'Hoopa-Unbound', 'Iron Bundle', 'Iron Valiant', 'Kingambit', 'Keldeo', 'Kleavor', 'Koraidon', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Incarnate',
|
|
'Lugia', 'Lunala', 'Magearna', 'Manaphy', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Noivern', 'Ogerpon-Hearthflame', 'Palkia', 'Palkia-Origin',
|
|
'Porygon-Z', 'Raging Bolt', 'Rayquaza', 'Reshiram', 'Roaring Moon', 'Serperior', 'Shaymin-Sky', 'Smeargle', 'Sneasler', 'Solgaleo', 'Spectrier', 'Ursaluna', 'Ursaluna-Bloodmoon',
|
|
'Urshifu-Single-Strike', 'Urshifu-Rapid-Strike', 'Volcarona', 'Walking Wake', 'Weavile', 'Yanmega', 'Zacian', 'Zacian-Crowned', 'Zapdos-Galar', 'Zekrom', 'Zoroark-Hisui',
|
|
'Arena Trap', 'Magnet Pull', 'Moody', 'Shadow Tag', 'Regenerator + Wimp Out', 'Regenerator + Emergency Exit', 'Regenerator > 2', 'Drizzle + Swift Swim', 'Primordial Sea + Swift Swim',
|
|
'Drought + Chlorophyll', 'Desolate Land + Chlorophyll', 'Electric Surge + Surge Surfer', 'Hadron Engine + Surge Surfer', 'Hadron Engine + Quark Drive', 'Electric Surge + Quark Drive',
|
|
'Drought + Protosynthesis', 'Sand Stream + Sand Rush', 'Sand Stream + Sand Veil', 'Snow Warning + Snow Cloak', 'Snow Warning + Slush Rush', 'King\'s Rock', 'Razor Fang', 'Baton Pass',
|
|
'Last Respects', 'Revival Blessing', 'Shed Tail', 'Stored Power',
|
|
],
|
|
restricted: [
|
|
'Comatose', 'Contrary', 'Fur Coat', 'Good as Gold', 'Gorilla Tactics', 'Huge Power', 'Ice Scales', 'Illusion', 'Imposter', 'Innards Out', 'Magic Bounce', 'Neutralizing Gas',
|
|
'Orichalcum Pulse', 'Parental Bond', 'Poison Heal', 'Pure Power', 'Simple', 'Speed Boost', 'Stakeout', 'Toxic Debris', 'Triage', 'Unburden', 'Water Bubble', 'Wonder Guard',
|
|
],
|
|
onValidateSet(set) {
|
|
const species = this.dex.species.get(set.species);
|
|
const unSeenAbilities = Object.keys(species.abilities)
|
|
.filter(key => key !== 'S' && (key !== 'H' || !species.unreleasedHidden))
|
|
.map(key => species.abilities[key as "0" | "1" | "H" | "S"])
|
|
.filter(ability => ability !== set.ability);
|
|
if (unSeenAbilities.length && this.toID(set.ability) !== this.toID(species.abilities['S'])) {
|
|
for (const abilityName of unSeenAbilities) {
|
|
const banReason = this.ruleTable.check('ability:' + this.toID(abilityName));
|
|
if (banReason) {
|
|
return [`${set.name}'s ability ${abilityName} is ${banReason}.`];
|
|
}
|
|
}
|
|
}
|
|
},
|
|
onBegin() {
|
|
for (const pokemon of this.getAllPokemon()) {
|
|
if (pokemon.ability === this.toID(pokemon.species.abilities['S'])) {
|
|
continue;
|
|
}
|
|
pokemon.m.innates = Object.keys(pokemon.species.abilities)
|
|
.filter(key => key !== 'S' && (key !== 'H' || !pokemon.species.unreleasedHidden))
|
|
.map(key => this.toID(pokemon.species.abilities[key as "0" | "1" | "H" | "S"]))
|
|
.filter(ability => ability !== pokemon.ability);
|
|
}
|
|
},
|
|
onBeforeSwitchIn(pokemon) {
|
|
if (pokemon.m.innates) {
|
|
for (const innate of pokemon.m.innates) {
|
|
if (pokemon.hasAbility(innate)) continue;
|
|
const effect = 'ability:' + this.toID(innate);
|
|
pokemon.volatiles[effect] = this.initEffectState({ id: effect, target: pokemon });
|
|
}
|
|
}
|
|
},
|
|
onSwitchOut(pokemon) {
|
|
for (const innate of Object.keys(pokemon.volatiles).filter(i => i.startsWith('ability:'))) {
|
|
pokemon.removeVolatile(innate);
|
|
}
|
|
},
|
|
onFaint(pokemon) {
|
|
for (const innate of Object.keys(pokemon.volatiles).filter(i => i.startsWith('ability:'))) {
|
|
const innateEffect = this.dex.conditions.get(innate) as Effect;
|
|
this.singleEvent('End', innateEffect, null, pokemon);
|
|
}
|
|
},
|
|
onAfterMega(pokemon) {
|
|
for (const innate of Object.keys(pokemon.volatiles).filter(i => i.startsWith('ability:'))) {
|
|
pokemon.removeVolatile(innate);
|
|
}
|
|
pokemon.m.innates = undefined;
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 9] 4v4 Doubles UU",
|
|
desc: "VGC rules, but only Pokémon that get less than 4.52% usage on the VGC ladder are legal, as well as a few other guidelines.",
|
|
mod: 'gen9',
|
|
gameType: 'doubles',
|
|
bestOfDefault: true,
|
|
ruleset: ['[Gen 9] VGC 2026 Reg F', 'Evasion Abilities Clause', 'Evasion Moves Clause', 'OHKO Clause'],
|
|
banlist: [
|
|
'Amoonguss', 'Annihilape', 'Arcanine-Hisui', 'Basculegion-M', 'Chi-Yu', 'Chien-Pao', 'Cresselia', 'Dondozo', 'Dragonite', 'Enamorus-Incarnate', 'Farigiraf', 'Flutter Mane',
|
|
'Gholdengo', 'Gouging Fire', 'Incineroar', 'Indeedee-F', 'Iron Crown', 'Landorus-Incarnate', 'Landorus-Therian', 'Ogerpon-Cornerstone', 'Ogerpon-Hearthflame', 'Ogerpon-Wellspring',
|
|
'Porygon2', 'Raging Bolt', 'Regidrago', 'Rillaboom', 'Roaring Moon', 'Sneasler', 'Ting-Lu', 'Torkoal', 'Tornadus-Incarnate', 'Ursaluna-Base', 'Urshifu-Single-Strike',
|
|
'Urshifu-Rapid-Strike', 'Whimsicott', 'Commander', 'Bright Powder', 'King\'s Rock', 'Razor Fang',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 9] National Dex RU",
|
|
mod: 'gen9',
|
|
// searchShow: false,
|
|
ruleset: ['[Gen 9] National Dex UU'],
|
|
banlist: ['ND UU', 'ND RUBL', 'Slowbronite'],
|
|
},
|
|
{
|
|
name: "[Gen 6] Megas Revisited Random Battle",
|
|
desc: `A Gen 6 metagame where every Mega Evolution was reevaluated and redesigned.`,
|
|
mod: 'gen6megasrevisited',
|
|
team: 'random',
|
|
bestOfDefault: true,
|
|
ruleset: ['Obtainable', 'Sleep Clause Mod', 'HP Percentage Mod', 'Cancel Mod', 'Illusion Level Mod', 'Mega Data Mod'],
|
|
onBegin() {
|
|
this.add(`raw|<div class='broadcast-green'><b>Need help with all of the new Megas and abilities?<br />Then make sure to check out the <a href="https://docs.google.com/spreadsheets/d/1wK11cPHnPCmH7JFss6leKW6_-cumn3DuZA-YMzrzF-U/edit?usp=sharing" target="_blank">spreadsheet</a> or use /dt!</b></div>`);
|
|
this.add('-message', `Welcome to Megas Revisited!`);
|
|
this.add('-message', `This is a Generation 6 OU-based Pet Mod where every existing Mega Evolution has been redesigned.`);
|
|
this.add('-message', `You can find our thread and metagame resources here:`);
|
|
this.add('-message', `https://www.smogon.com/forums/threads/3713949/`);
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 9] ChatBats",
|
|
desc: `A Random Battles Solomod made by the Pet Mods chatroom on Showdown.`,
|
|
mod: 'chatbats',
|
|
team: 'randomChatBats',
|
|
ruleset: ['Obtainable', 'Species Clause', 'HP Percentage Mod', 'Sleep Clause Mod', 'Data Preview', 'Cancel Mod'],
|
|
onSwitchIn(pokemon) {
|
|
this.add('-start', pokemon, 'typechange', pokemon.species.types.join('/'), '[silent]');
|
|
},
|
|
// Dachsbun causes Koraidon to generate on enemy team. Implemented here.
|
|
onBegin() {
|
|
this.add(`raw|<div class='broadcast-green'><b>Need help with all of the new moves, abilities, and wacky sets?<br />Then make sure to check out the <a href="https://www.smogon.com/forums/threads/chatbats.3760234/post-10645803" target="_blank">ChatBats Compendium</a> or use /dt!</b></div>`);
|
|
this.add(`raw|Welcome to ChatBats!`);
|
|
this.add(`raw|ChatBats is a Random Battles format created by the Pet Mods room here on Showdown!`);
|
|
this.add(`raw|If you want to help create new sets, we will host events periodically in the Pet Mods room!`);
|
|
this.add(`raw|Anyone who is there can help create a new set for a random mon, changing moves, abilities, stats, and even custom formes.`);
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 4] Ubers",
|
|
mod: 'gen4',
|
|
// searchShow: false,
|
|
ruleset: ['Standard'],
|
|
banlist: ['AG'],
|
|
},
|
|
{
|
|
name: "[Gen 6] NU",
|
|
mod: 'gen6',
|
|
// searchShow: false,
|
|
ruleset: ['[Gen 6] RU'],
|
|
banlist: ['RU', 'NUBL'],
|
|
},
|
|
{
|
|
name: "[Gen 4] VGC 2009",
|
|
mod: 'gen4pt',
|
|
gameType: 'doubles',
|
|
bestOfDefault: true,
|
|
// searchShow: false,
|
|
ruleset: ['Flat Rules', '! Adjust Level Down', 'Max Level = 50'],
|
|
banlist: ['Tyranitar', 'Rotom', 'Judgment', 'Soul Dew'],
|
|
},
|
|
|
|
// Other Metagames
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
{
|
|
section: "Other Metagames",
|
|
column: 2,
|
|
},
|
|
{
|
|
name: "[Gen 9] Almost Any Ability",
|
|
desc: `Pokémon have access to almost any ability.`,
|
|
mod: 'gen9',
|
|
ruleset: ['Standard OMs', '!Obtainable Abilities', 'Ability Clause = 1', 'Sleep Moves Clause', 'Terastal Clause'],
|
|
banlist: [
|
|
'Annihilape', 'Arceus', 'Baxcalibur', 'Calyrex-Ice', 'Calyrex-Shadow', 'Ceruledge', 'Darkrai', 'Deoxys-Normal', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', 'Dragapult', 'Dragonite',
|
|
'Enamorus-Incarnate', 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Gouging Fire', 'Groudon', 'Ho-Oh', 'Hoopa-Unbound', 'Iron Bundle', 'Iron Valiant', 'Keldeo',
|
|
'Koraidon', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Noivern',
|
|
'Palkia', 'Palkia-Origin', 'Raging Bolt', 'Rayquaza', 'Regigigas', 'Reshiram', 'Shaymin-Sky', 'Slaking', 'Sneasler', 'Solgaleo', 'Spectrier', 'Urshifu', 'Urshifu-Rapid-Strike',
|
|
'Volcarona', 'Walking Wake', 'Weavile', 'Zacian', 'Zacian-Crowned', 'Zekrom', 'Arena Trap', 'Comatose', 'Contrary', 'Fur Coat', 'Good as Gold', 'Gorilla Tactics', 'Huge Power',
|
|
'Ice Scales', 'Illusion', 'Imposter', 'Innards Out', 'Magic Bounce', 'Magnet Pull', 'Moody', 'Neutralizing Gas', 'Orichalcum Pulse', 'Parental Bond', 'Poison Heal', 'Pure Power',
|
|
'Shadow Tag', 'Simple', 'Speed Boost', 'Stakeout', 'Toxic Debris', 'Triage', 'Unburden', 'Water Bubble', 'Wonder Guard', 'King\'s Rock', 'Razor Fang', 'Baton Pass',
|
|
'Last Respects', 'Shed Tail',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 9] Balanced Hackmons",
|
|
desc: `Anything directly hackable onto a set (EVs, IVs, forme, ability, item, and move) and is usable in local battles is allowed.`,
|
|
mod: 'gen9',
|
|
ruleset: [
|
|
'OHKO Clause', 'Evasion Clause', 'Species Clause', 'Team Preview', 'HP Percentage Mod', 'Cancel Mod', 'Sleep Moves Clause',
|
|
'Endless Battle Clause', 'Hackmons Forme Legality', 'Species Reveal Clause', 'Terastal Clause',
|
|
],
|
|
banlist: [
|
|
'Calyrex-Shadow', 'Deoxys-Attack', 'Gengar-Mega', 'Mewtwo-Mega-X', 'Mewtwo-Mega-Y', 'Rayquaza-Mega', 'Regigigas', 'Shedinja', 'Slaking', 'Arena Trap',
|
|
'Contrary', 'Gorilla Tactics', 'Hadron Engine', 'Huge Power', 'Illusion', 'Innards Out', 'Libero', 'Liquid Ooze', 'Magnet Pull', 'Moody', 'Neutralizing Gas',
|
|
'Orichalcum Pulse', 'Parental Bond', 'Poison Heal', 'Protean', 'Pure Power', 'Shadow Tag', 'Stakeout', 'Water Bubble', 'Wonder Guard', 'King\'s Rock',
|
|
'Razor Fang', 'Baton Pass', 'Belly Drum', 'Ceaseless Edge', 'Clangorous Soul', 'Dire Claw', 'Electro Shot', 'Fillet Away', 'Imprison', 'Last Respects',
|
|
'Lumina Crash', 'No Retreat', 'Photon Geyser', 'Power Trip', 'Quiver Dance', 'Rage Fist', 'Revival Blessing', 'Shed Tail', 'Sleep Talk', 'Substitute',
|
|
'Shell Smash', 'Tail Glow', 'V-create',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 9] Godly Gift",
|
|
desc: `Each Pokémon receives one base stat from a God (Restricted Pokémon) depending on its position in the team. If there is no restricted Pokémon, it uses the Pokémon in the first slot.`,
|
|
mod: 'gen9',
|
|
ruleset: ['Standard OMs', 'Evasion Abilities Clause', 'Evasion Items Clause', 'Sleep Moves Clause', 'Godly Gift Mod'],
|
|
banlist: [
|
|
'Blissey', 'Calyrex-Shadow', 'Chansey', 'Deoxys-Attack', 'Koraidon', 'Kyurem-Black', 'Miraidon', 'Arena Trap', 'Gale Wings', 'Huge Power', 'Moody', 'Pure Power', 'Shadow Tag',
|
|
'Swift Swim', 'Focus Band', 'King\'s Rock', 'Quick Claw', 'Razor Fang', 'Baton Pass', 'Last Respects', 'Shed Tail',
|
|
],
|
|
restricted: [
|
|
'Alomomola', 'Annihilape', 'Araquanid', 'Arceus', 'Baxcalibur', 'Calyrex-Ice', 'Chien-Pao', 'Chi-Yu', 'Crawdaunt', 'Deoxys-Normal', 'Deoxys-Speed', 'Dialga', 'Dialga-Origin', 'Dragapult',
|
|
'Espathra', 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Gliscor', 'Gouging Fire', 'Groudon', 'Hawlucha', 'Ho-Oh', 'Iron Bundle', 'Iron Hands', 'Kingambit', 'Kyogre',
|
|
'Kyurem', 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Ogerpon-Hearthflame', 'Palafin', 'Palkia', 'Palkia-Origin', 'Raging Bolt',
|
|
'Rayquaza', 'Regieleki', 'Reshiram', 'Serperior', 'Shaymin-Sky', 'Smeargle', 'Solgaleo', 'Spectrier', 'Terapagos', 'Toxapex', 'Ursaluna', 'Ursaluna-Bloodmoon', 'Volcarona', 'Zacian',
|
|
'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 9] Mix and Mega",
|
|
desc: `Mega evolve any Pokémon with any mega stone, or transform them with Genesect Drives, Primal orbs, Origin orbs, Rusted items, Ogerpon Masks, Arceus Plates, and Silvally Memories with no limit. Mega and Primal boosts based on form changes from gen 7.`,
|
|
mod: 'mixandmega',
|
|
ruleset: ['Standard OMs', 'Evasion Items Clause', 'Evasion Abilities Clause', 'Sleep Moves Clause', 'Terastal Clause'],
|
|
banlist: [
|
|
'Calyrex-Shadow', 'Koraidon', 'Kyogre', 'Miraidon', 'Moody', 'Shadow Tag', 'Beedrillite', 'Blazikenite', 'Gengarite',
|
|
'Kangaskhanite', 'Lucarionite Z', 'Malamarite', 'Mawilite', 'Medichamite', 'Pidgeotite', 'Red Orb', 'Baton Pass',
|
|
'Shed Tail',
|
|
],
|
|
restricted: [
|
|
'Arceus', 'Basculegion-M', 'Calyrex-Ice', 'Ceruledge', 'Deoxys-Normal', 'Deoxys-Attack', 'Dialga', 'Eternatus', 'Flutter Mane',
|
|
'Gengar', 'Gholdengo', 'Giratina', 'Gouging Fire', 'Groudon', 'Ho-Oh', 'Iron Bundle', 'Kyurem-Black', 'Kyurem-White', 'Lugia',
|
|
'Lunala', 'Manaphy', 'Mewtwo', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Rayquaza', 'Regigigas', 'Reshiram',
|
|
'Slaking', 'Sneasler', 'Solgaleo', 'Ursaluna-Bloodmoon', 'Urshifu-Single-Strike', 'Walking Wake', 'Zacian', 'Zekrom',
|
|
],
|
|
onValidateTeam(team) {
|
|
const itemTable = new Set<ID>();
|
|
for (const set of team) {
|
|
const item = this.dex.items.get(set.item);
|
|
if (!(item.forcedForme && !item.zMove) && !item.megaStone &&
|
|
!item.isPrimalOrb && !item.name.startsWith('Rusted')) continue;
|
|
const natdex = this.ruleTable.has('natdexmod');
|
|
if (natdex && item.id !== 'ultranecroziumz') continue;
|
|
const species = this.dex.species.get(set.species);
|
|
if (species.isNonstandard && !this.ruleTable.has(`+pokemontag:${this.toID(species.isNonstandard)}`)) {
|
|
return [`${species.baseSpecies} does not exist in gen 9.`];
|
|
}
|
|
if (((item.itemUser?.includes(species.name) || item.forcedForme === species.name) &&
|
|
!item.megaStone && !item.isPrimalOrb) || (natdex && species.name.startsWith('Necrozma-') &&
|
|
item.id === 'ultranecroziumz')) {
|
|
continue;
|
|
}
|
|
if (this.ruleTable.isRestrictedSpecies(species) || this.toID(set.ability) === 'powerconstruct') {
|
|
return [`${species.name} is not allowed to hold ${item.name}.`];
|
|
}
|
|
if (itemTable.has(item.id)) {
|
|
return [
|
|
`You are limited to one of each Mega Stone/Primal Orb/Rusted item/Origin item/Ogerpon Mask/Arceus Plate/Silvally Memory.`,
|
|
`(You have more than one ${item.name})`,
|
|
];
|
|
}
|
|
itemTable.add(item.id);
|
|
}
|
|
},
|
|
onBegin() {
|
|
for (const pokemon of this.getAllPokemon()) {
|
|
pokemon.m.originalSpecies = pokemon.baseSpecies.name;
|
|
}
|
|
},
|
|
onSwitchIn(pokemon) {
|
|
const originalSpecies = this.dex.species.get((pokemon.species as any).originalSpecies);
|
|
if (originalSpecies.exists && pokemon.m.originalSpecies !== originalSpecies.baseSpecies) {
|
|
// Place volatiles on the Pokémon to show its mega-evolved condition and details
|
|
this.add('-start', pokemon, originalSpecies.requiredItems?.[0] || originalSpecies.requiredItem || originalSpecies.requiredMove, '[silent]');
|
|
const oSpecies = this.dex.species.get(pokemon.m.originalSpecies);
|
|
if (oSpecies.types.join('/') !== pokemon.species.types.join('/')) {
|
|
this.add('-start', pokemon, 'typechange', pokemon.species.types.join('/'), '[silent]');
|
|
}
|
|
}
|
|
},
|
|
onSwitchOut(pokemon) {
|
|
const originalSpecies = this.dex.species.get((pokemon.species as any).originalSpecies);
|
|
if (originalSpecies.exists && pokemon.m.originalSpecies !== originalSpecies.baseSpecies) {
|
|
this.add('-end', pokemon, originalSpecies.requiredItems?.[0] || originalSpecies.requiredItem || originalSpecies.requiredMove, '[silent]');
|
|
}
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 9] Shared Power",
|
|
desc: `Once a Pokémon switches in, its ability is shared with the rest of the team.`,
|
|
mod: 'sharedpower',
|
|
ruleset: ['Standard OMs', 'Evasion Abilities Clause', 'Evasion Items Clause', 'Sleep Moves Clause'],
|
|
banlist: [
|
|
'Arceus', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Conkeldurr', 'Deoxys-Attack', 'Eternatus', 'Greninja', 'Kingambit', 'Kyogre', 'Kyurem-Black',
|
|
'Kyurem-White', 'Koraidon', 'Lunala', 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Ogerpon-Hearthflame', 'Palafin', 'Rayquaza',
|
|
'Regieleki', 'Reshiram', 'Rillaboom', 'Scizor', 'Shaymin-Sky', 'Spectrier', 'Sneasler', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom',
|
|
'Arena Trap', 'Moody', 'Neutralizing Gas', 'Shadow Tag', 'Speed Boost', 'Stench', 'Swift Swim', 'King\'s Rock', 'Leppa Berry', 'Razor Fang', 'Starf Berry',
|
|
'Baton Pass', 'Extreme Speed', 'Last Respects',
|
|
],
|
|
unbanlist: ['Arceus-Bug', 'Arceus-Dragon', 'Arceus-Fire', 'Arceus-Ice'],
|
|
restricted: [
|
|
'Armor Tail', 'Chlorophyll', 'Comatose', 'Contrary', 'Dazzling', 'Fur Coat', 'Gale Wings', 'Good as Gold', 'Huge Power', 'Ice Scales', 'Illusion', 'Imposter',
|
|
'Magic Bounce', 'Magic Guard', 'Magnet Pull', 'Mold Breaker', 'Multiscale', 'Poison Heal', 'Prankster', 'Protosynthesis', 'Psychic Surge', 'Pure Power',
|
|
'Quark Drive', 'Queenly Majesty', 'Quick Draw', 'Quick Feet', 'Regenerator', 'Sand Rush', 'Simple', 'Slush Rush', 'Stakeout', 'Stamina', 'Sturdy',
|
|
'Surge Surfer', 'Technician', 'Tinted Lens', 'Triage', 'Unaware', 'Unburden', 'Water Bubble',
|
|
],
|
|
onValidateRule() {
|
|
if (this.format.gameType !== 'singles') {
|
|
throw new Error(`Shared Power currently does not support ${this.format.gameType} battles.`);
|
|
}
|
|
},
|
|
getSharedPower(pokemon) {
|
|
const sharedPower = new Set<string>();
|
|
for (const ally of pokemon.side.pokemon) {
|
|
if (pokemon.battle.ruleTable.isRestricted(`ability:${ally.baseAbility}`)) continue;
|
|
if (ally.previouslySwitchedIn > 0) {
|
|
if (pokemon.battle.dex.currentMod !== 'sharedpower' && ['trace', 'mirrorarmor'].includes(ally.baseAbility)) {
|
|
sharedPower.add('noability');
|
|
continue;
|
|
}
|
|
sharedPower.add(ally.baseAbility);
|
|
}
|
|
}
|
|
sharedPower.delete(pokemon.baseAbility);
|
|
return sharedPower;
|
|
},
|
|
onBeforeSwitchIn(pokemon) {
|
|
let format = this.format;
|
|
if (!format.getSharedPower) format = this.dex.formats.get('gen9sharedpower');
|
|
for (const ability of format.getSharedPower!(pokemon)) {
|
|
const effect = 'ability:' + this.toID(ability);
|
|
pokemon.volatiles[effect] = this.initEffectState({ id: effect, target: pokemon });
|
|
if (!pokemon.m.abils) pokemon.m.abils = [];
|
|
if (!pokemon.m.abils.includes(effect)) pokemon.m.abils.push(effect);
|
|
}
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 9] STABmons",
|
|
desc: `Pokémon can use any move of their typing, in addition to the moves they can normally learn.`,
|
|
mod: 'gen9',
|
|
ruleset: ['Standard OMs', 'STABmons Move Legality', 'Sleep Moves Clause', 'Terastal Clause'],
|
|
banlist: [
|
|
'Arceus', 'Azumarill', 'Baxcalibur', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Deoxys-Normal', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', 'Dragapult',
|
|
'Dragonite', 'Enamorus-Incarnate', 'Eternatus', 'Flutter Mane', 'Garchomp', 'Giratina', 'Giratina-Origin', 'Gouging Fire', 'Groudon', 'Gyarados', 'Ho-Oh', 'Iron Bundle',
|
|
'Komala', 'Koraidon', 'Kyogre', 'Kyurem-Base', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Incarnate', 'Lugia', 'Lunala', 'Magearna', 'Meloetta', 'Mewtwo', 'Miraidon',
|
|
'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Ogerpon-Hearthflame', 'Ogerpon-Wellspring', 'Palkia', 'Palkia-Origin', 'Porygon-Z', 'Rayquaza', 'Reshiram', 'Roaring Moon',
|
|
'Shaymin-Sky', 'Solgaleo', 'Spectrier', 'Terapagos', 'Ursaluna', 'Ursaluna-Bloodmoon', 'Urshifu-Single-Strike', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom',
|
|
'Zoroark-Hisui', 'Arena Trap', 'Moody', 'Shadow Tag', 'Damp Rock', 'King\'s Rock', 'Razor Fang', 'Baton Pass', 'Last Respects', 'Shed Tail',
|
|
],
|
|
restricted: [
|
|
'Astral Barrage', 'Belly Drum', 'Ceaseless Edge', 'Clangorous Soul', 'Combat Torque', 'Dire Claw', 'Dragon Energy', 'Electro Shot', 'Esper Wing', 'Extreme Speed', 'Fillet Away',
|
|
'Final Gambit', 'Flower Trick', 'Gigaton Hammer', 'No Retreat', 'Rage Fist', 'Revival Blessing', 'Shell Smash', 'Shift Gear', 'Torch Song', 'Triple Arrows', 'V-create',
|
|
'Victory Dance', 'Water Shuriken', 'Wicked Blow', 'Wicked Torque',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 6] Pure Hackmons",
|
|
desc: `Anything that can be hacked in-game and is usable in local battles is allowed.`,
|
|
mod: 'gen6',
|
|
ruleset: ['-Nonexistent', 'Team Preview', 'HP Percentage Mod', 'Cancel Mod', 'Endless Battle Clause', 'EV limit = 510'],
|
|
},
|
|
|
|
// Challengeable OMs
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
{
|
|
section: "Challengeable OMs",
|
|
column: 2,
|
|
},
|
|
{
|
|
name: "[Gen 9] 1-2 Switch",
|
|
desc: `Doubles-based metagame where each Pokémon takes turns being "active" every few turns.`,
|
|
mod: 'gen9',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
ruleset: ['Standard OMs', 'Gravity Sleep Clause'],
|
|
banlist: [
|
|
'Annihilape', 'Arceus', 'Basculegion-M', 'Calyrex-Ice', 'Calyrex-Shadow', 'Darkrai', 'Deoxys-Attack', 'Deoxys-Normal', 'Dialga', 'Dialga-Origin', 'Eternatus', 'Flutter Mane',
|
|
'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Lugia', 'Lunala', 'Koraidon', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings',
|
|
'Necrozma-Dusk-Mane', 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Reshiram', 'Tatsugiri', 'Terapagos', 'Urshifu', 'Urshifu-Rapid-Strike', 'Zacian', 'Zacian-Crowned', 'Zamazenta',
|
|
'Zamazenta-Crowned', 'Moody', 'Shadow Tag',
|
|
],
|
|
battle: {
|
|
endTurn() {
|
|
// @ts-expect-error Hack
|
|
for (const pokemon of this.getAllActive(false, true)) {
|
|
// turn counter hasn't been incremented yet
|
|
if (this.turn & 1 && pokemon.position === (this.turn & 2 ? 0 : 1) && pokemon.hp && pokemon.allies().length) {
|
|
pokemon.volatiles['commanding'] = this.initEffectState({ id: 'commanding', name: 'Commanding', target: pokemon });
|
|
pokemon.volatiles['gastroacid'] = this.initEffectState({ id: 'gastroacid', name: 'Gastro Acid', target: pokemon });
|
|
this.add('-message', `${pokemon.side.name}'s ${pokemon.name !== pokemon.species.name ? `${pokemon.name} (${pokemon.species.name})` : pokemon.name} will be skipped next turn.`);
|
|
} else {
|
|
pokemon.removeVolatile('commanding');
|
|
pokemon.removeVolatile('gastroacid');
|
|
}
|
|
}
|
|
this.constructor.prototype.endTurn.call(this);
|
|
},
|
|
getAllActive(includeFainted, includeCommanding) {
|
|
const pokemonList: Pokemon[] = [];
|
|
for (const side of this.sides) {
|
|
for (const pokemon of side.active) {
|
|
if (pokemon && (includeFainted || !pokemon.fainted) && (includeCommanding || !pokemon.volatiles['commanding'])) {
|
|
pokemonList.push(pokemon);
|
|
}
|
|
}
|
|
}
|
|
return pokemonList;
|
|
},
|
|
},
|
|
side: {
|
|
allies(all?: boolean) {
|
|
let allies = this.active.filter(ally => ally);
|
|
if (!all) allies = allies.filter(ally => ally.hp && !ally.volatiles['commanding']);
|
|
return allies;
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 9] Alphabet Cup",
|
|
desc: `Allows Pokémon to use any move that shares the same first letter as their name or a previous evolution's name.`,
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
ruleset: ['Standard OMs', 'Alphabet Cup Move Legality', 'Sleep Moves Clause', 'Terastal Clause'],
|
|
banlist: [
|
|
'Annihilape', 'Arceus', 'Baxcalibur', 'Blaziken', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Deoxys-Attack', 'Deoxys-Normal', 'Dialga', 'Dialga-Origin',
|
|
'Dragapult', 'Dragonite', 'Espathra', 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Gouging Fire', 'Groudon', 'Ho-Oh', 'Iron Bundle', 'Kingambit', 'Koraidon',
|
|
'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Incarnate', 'Lugia', 'Lunala', 'Magearna', 'Mamoswine', 'Meowscarada', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings',
|
|
'Necrozma-Dusk-Mane', 'Palafin', 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Reshiram', 'Sceptile', 'Shaymin-Sky', 'Sneasler', 'Solgaleo', 'Spectrier', 'Ursaluna',
|
|
'Urshifu-Single-Strike', 'Weavile', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', 'Arena Trap', 'Moody', 'Shadow Tag', 'Damp Rock', 'Heat Rock',
|
|
'King\'s Rock', 'Light Clay', 'Razor Fang', 'Baton Pass', 'Last Respects', 'Shed Tail',
|
|
],
|
|
restricted: [
|
|
'Belly Drum', 'Ceaseless Edge', 'Clangorous Soul', 'Dire Claw', 'Extreme Speed', 'Fillet Away', 'Glacial Lance', 'Glare', 'Lumina Crash', 'Rage Fist', 'Revival Blessing',
|
|
'Sacred Fire', 'Salt Cure', 'Shell Smash', 'Shift Gear', 'Surging Strikes', 'Tail Glow', 'Triple Arrows',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 9] Bad 'n Boosted",
|
|
desc: `All base stats of 70 and lower are doubled.`,
|
|
searchShow: false,
|
|
ruleset: ['Standard', 'Bad \'n Boosted Mod', 'Sleep Moves Clause', '!Sleep Clause Mod'],
|
|
banlist: ['AG', 'Araquanid', 'Cyclizar', 'Espathra', 'Espeon', 'Pawmot', 'Polteageist', 'Huge Power', 'Moody', 'Pure Power', 'Shadow Tag', 'Eviolite', 'King\'s Rock', 'Razor Fang', 'Baton Pass', 'Last Respects'],
|
|
},
|
|
{
|
|
name: "[Gen 9] Battlefields",
|
|
desc: `Any field condition with a set duration becomes permanent once triggered unless directly replaced, removed, or reversed. Namely, this impacts screens, weathers, terrains, room effects, gravity, and side conditions like Tailwind and Safeguard.`,
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
ruleset: ['Standard OMs', 'Sleep Moves Clause', 'Evasion Abilities Clause'],
|
|
banlist: [
|
|
'Annihilape', 'Arceus', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Deoxys-Attack', 'Deoxys-Normal', 'Dialga', 'Dialga-Origin', 'Espathra',
|
|
'Eternatus', 'Flutter Mane', 'Gholdengo', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Koraidon', 'Kyogre', 'Kyurem-Black', 'Kyurem-White',
|
|
'Landorus-Incarnate', 'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Ogerpon-Hearthflame', 'Palafin',
|
|
'Palkia', 'Palkia-Origin', 'Rayquaza', 'Reshiram', 'Shaymin-Sky', 'Sneasler', 'Spectrier', 'Terapagos', 'Urshifu', 'Urshifu-Rapid-Strike', 'Zacian',
|
|
'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', 'Arena Trap', 'Moody', 'Shadow Tag', 'King\'s Rock', 'Razor Fang', 'Aurora Veil', 'Baton Pass', 'Fairy Lock',
|
|
'Last Respects', 'Light Screen', 'Quick Guard', 'Reflect', 'Shed Tail', 'Tailwind', 'Trick Room',
|
|
],
|
|
onWeatherChange() {
|
|
this.field.weatherState.duration = 0;
|
|
},
|
|
onTerrainChange() {
|
|
this.field.terrainState.duration = 0;
|
|
},
|
|
onPseudoWeatherChange(target, source, pseudoWeather) {
|
|
this.field.pseudoWeather[pseudoWeather.id].duration = 0;
|
|
},
|
|
onSideConditionStart(side, source, sideCondition) {
|
|
side.sideConditions[sideCondition.id].duration = 0;
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 9] Bio Mech Mons",
|
|
desc: `Items, abilities, and moves a Pokémon has access to can be put in any item/move/ability slot.`,
|
|
mod: 'biomechmons',
|
|
searchShow: false,
|
|
ruleset: ['Standard OMs', 'Sleep Moves Clause'],
|
|
banlist: [
|
|
'Annihilape', 'Arceus', 'Archaludon', 'Baxcalibur', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chien-Pao', 'Chi-Yu', 'Deoxys-Normal', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin',
|
|
'Espathra', 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Gouging Fire', 'Groudon', 'Ho-Oh', 'Iron Bundle', 'Koraidon', 'Kyogre', 'Kyurem-Black', 'Kyurem-White',
|
|
'Landorus-Incarnate', 'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Ogerpon-Hearthflame', 'Palafin', 'Palkia', 'Palkia-Origin',
|
|
'Rayquaza', 'Regieleki', 'Regigigas', 'Reshiram', 'Roaring Moon', 'Slaking', 'Shaymin-Sky', 'Sneasler', 'Solgaleo', 'Spectrier', 'Terapagos', 'Ursaluna-Bloodmoon', 'Urshifu',
|
|
'Urshifu-Rapid-Strike', 'Volcarona', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', 'Arena Trap', 'Moody', 'Sand Veil', 'Shadow Tag', 'Snow Cloak', 'Bright Powder',
|
|
'Choice Band', 'Choice Specs', 'King\'s Rock', 'Razor Fang', 'Baton Pass', 'Last Respects', 'Shed Tail',
|
|
],
|
|
validateSet(set, teamHas) {
|
|
const dex = this.dex;
|
|
let species = dex.species.get(set.species);
|
|
let requiredItems: string[] = [];
|
|
let requiredMove = '';
|
|
let requiredAbility = '';
|
|
if (species.requiredItems) requiredItems = species.requiredItems;
|
|
if (species.requiredMove) requiredMove = species.requiredMove;
|
|
if (species.requiredAbility) requiredAbility = species.requiredAbility;
|
|
if (species.battleOnly) species = dex.species.get(species.battleOnly as string);
|
|
|
|
const effectFunctions = [dex.abilities, dex.items, dex.moves];
|
|
if (
|
|
!effectFunctions.some(f => f.get(set.ability).exists) &&
|
|
!(set.item && effectFunctions.some(f => f.get(set.item).exists)) &&
|
|
!set.moves.every(move => effectFunctions.some(f => f.get(move).exists))
|
|
) {
|
|
return this.validateSet(set, teamHas);
|
|
}
|
|
const allThings = [set.ability, set.item, ...set.moves].filter(e => e.length);
|
|
for (const thing of allThings) {
|
|
if (this.toID(thing) === 'trace' || this.toID(thing) === 'neutralizinggas') {
|
|
return [`${thing} is currently bugged and is banned.`];
|
|
}
|
|
if (!dex.moves.get(thing).exists && !dex.abilities.get(thing).exists && !dex.items.get(thing).exists) {
|
|
return [`${thing} does not exist.`];
|
|
}
|
|
}
|
|
if (
|
|
allThings.some(y => effectFunctions.some(x => x.get(y).isNonstandard &&
|
|
!this.ruleTable.has(`+pokemontag:${this.toID(x.get(y).isNonstandard)}`)))
|
|
) {
|
|
return this.validateSet(set, teamHas);
|
|
}
|
|
const moves = allThings.map(e => this.dex.moves.get(e)).filter(thing => thing.id !== 'metronome' && thing.exists);
|
|
for (const m of moves) {
|
|
if (this.ruleTable.isBanned(`move:${m.id}`)) return [`${set.species}'s move ${m.name} is banned.`];
|
|
}
|
|
|
|
const abilities = allThings.map(e => this.dex.abilities.get(e)).filter(thing => thing.exists);
|
|
for (const a of abilities) {
|
|
if (this.ruleTable.isBanned(`ability:${a.id}`)) return [`${set.species}'s ability ${a.name} is banned.`];
|
|
}
|
|
|
|
const items = allThings.map(e => this.dex.items.get(e)).filter(thing => thing.exists);
|
|
for (const i of items) {
|
|
if (this.ruleTable.isBanned(`item:${i.id}`)) return [`${set.species}'s item ${i.name} is banned.`];
|
|
}
|
|
|
|
const setHas: { [k: string]: true } = {};
|
|
for (const thing of [...moves, ...items, ...abilities]) {
|
|
if (setHas[thing.id]) return [`${set.species} has multiple copies of ${thing.name}.`];
|
|
setHas[thing.id] = true;
|
|
}
|
|
const normalAbility = set.ability;
|
|
if (!abilities.length) {
|
|
set.ability = 'noability';
|
|
} else {
|
|
set.ability = abilities[0].id;
|
|
}
|
|
if (abilities.some(abil => !Object.values(species.abilities).map(this.toID).includes(abil.id)) &&
|
|
this.ruleTable.has('obtainableabilities')
|
|
) {
|
|
if (set.ability !== 'noability') return [`${set.species} has illegal abilities.`];
|
|
}
|
|
if (requiredAbility && !abilities.map(a => a.id).includes(this.toID(requiredAbility))) {
|
|
return [`${set.species} requires ${requiredAbility} on its set.`];
|
|
}
|
|
if (!moves.length) {
|
|
return [`${set.species} requires at least one move.`];
|
|
}
|
|
if (set.moves.length > this.ruleTable.maxMoveCount) {
|
|
return [`${set.name} has ${set.moves.length} moves, which is more than the limit of ${this.ruleTable.maxMoveCount}.`];
|
|
}
|
|
const normalMoves = set.moves;
|
|
set.moves = [moves[0].id];
|
|
if (moves.some(move => this.checkCanLearn(move, species)) && this.ruleTable.has('obtainablemoves')) {
|
|
return [`${set.species} has illegal moves.`];
|
|
}
|
|
if (requiredMove && !moves.map(m => m.id).includes(this.toID(requiredMove))) {
|
|
return [`${set.species} requires ${requiredMove} on its set.`];
|
|
}
|
|
if (!items.length && requiredItems.length) {
|
|
return [`${set.species} requires ${requiredItems.join(', ')} on its set.`];
|
|
}
|
|
const normalItem = set.item;
|
|
if (items.length) {
|
|
set.item = (items.find(i => i.forcedForme || i.itemUser) || items[0]).id;
|
|
} else {
|
|
set.item = '';
|
|
}
|
|
if (!this.ruleTable.has('+ability:noability')) {
|
|
this.ruleTable.set('+ability:noability', '');
|
|
}
|
|
for (const curMove of moves) {
|
|
set.moves = [curMove.id];
|
|
if (requiredMove && moves.map(m => m.id).includes(curMove.id) &&
|
|
curMove.id !== this.toID(requiredMove)) {
|
|
set.moves.push(requiredMove);
|
|
}
|
|
let problems = this.validateSet(set, teamHas);
|
|
if (problems) problems = problems.filter(p => !p.endsWith('needs to have an ability.'));
|
|
if (problems?.length) return problems;
|
|
}
|
|
set.ability = normalAbility;
|
|
set.item = normalItem;
|
|
set.moves = normalMoves;
|
|
return null;
|
|
},
|
|
onBeforeSwitchIn(pokemon) {
|
|
let ngas = false;
|
|
for (const poke of this.getAllActive()) {
|
|
if (this.toID(poke.ability) === ('neutralizinggas' as ID)) {
|
|
ngas = true;
|
|
break;
|
|
}
|
|
}
|
|
if (pokemon.hasItem('abilityshield') ||
|
|
pokemon.m.scrambled.items.some((e: { thing: string }) => this.toID(e.thing) === 'abilityshield')) {
|
|
ngas = false;
|
|
}
|
|
for (const ability of pokemon.m.scrambled.abilities) {
|
|
if (this.field.getPseudoWeather('magicroom') && ability.inSlot === 'Item') continue;
|
|
const effect = 'ability:' + this.toID(ability.thing);
|
|
pokemon.volatiles[effect] = this.initEffectState({ id: effect, target: pokemon });
|
|
pokemon.volatiles[effect].inSlot = ability.inSlot;
|
|
}
|
|
for (const item of pokemon.m.scrambled.items) {
|
|
if (ngas && item.inSlot === 'Ability') continue;
|
|
const effect = 'item:' + this.toID(item.thing);
|
|
pokemon.volatiles[effect] = this.initEffectState({ id: effect, target: pokemon });
|
|
pokemon.volatiles[effect].inSlot = item.inSlot;
|
|
}
|
|
if (ngas) {
|
|
if ((pokemon.m.scrambled.moves as { inSlot: string }[]).findIndex(e => e.inSlot === 'Ability') >= 0) {
|
|
const isMove = (pokemon.m.scrambled.moves as { inSlot: string }[]).findIndex(e => e.inSlot === 'Ability');
|
|
const indexOfMove = pokemon.moveSlots.findIndex(m => this.toID(pokemon.m.scrambled.moves[isMove].thing) === m.id);
|
|
if (indexOfMove >= 0) pokemon.moveSlots.splice(indexOfMove, 1);
|
|
}
|
|
}
|
|
if (this.field.getPseudoWeather('magicroom')) {
|
|
if ((pokemon.m.scrambled.moves as { inSlot: string }[]).findIndex(e => e.inSlot === 'Item') >= 0) {
|
|
const isMove = (pokemon.m.scrambled.moves as { inSlot: string }[]).findIndex(e => e.inSlot === 'Item');
|
|
const indexOfMove = pokemon.moveSlots.findIndex(m => this.toID(pokemon.m.scrambled.moves[isMove].thing) === m.id);
|
|
if (indexOfMove >= 0) pokemon.moveSlots.splice(indexOfMove, 1);
|
|
}
|
|
}
|
|
},
|
|
onBegin() {
|
|
for (const pokemon of this.getAllPokemon()) {
|
|
// for everything not in the correct slot
|
|
pokemon.m.scrambled = {
|
|
abilities: [] as object[],
|
|
items: [] as object[],
|
|
moves: [] as object[],
|
|
};
|
|
|
|
if (this.dex.items.get(pokemon.set.ability).exists) {
|
|
pokemon.m.scrambled.items.push({ thing: this.dex.items.get(pokemon.set.ability).name, inSlot: 'Ability' });
|
|
} else if (this.dex.moves.get(pokemon.set.ability).exists) {
|
|
pokemon.m.scrambled.moves.push({ thing: this.dex.moves.get(pokemon.set.ability).name, inSlot: 'Ability' });
|
|
}
|
|
|
|
if (this.dex.abilities.get(pokemon.set.item).exists) {
|
|
pokemon.m.scrambled.abilities.push({ thing: this.dex.abilities.get(pokemon.set.item).name, inSlot: 'Item' });
|
|
} else if (this.dex.moves.get(pokemon.set.item).exists && this.dex.moves.get(pokemon.set.item).id !== 'metronome') {
|
|
pokemon.m.scrambled.moves.push({ thing: this.dex.moves.get(pokemon.set.item).name, inSlot: 'Item' });
|
|
}
|
|
|
|
for (const move of pokemon.set.moves) {
|
|
if (this.dex.moves.get(move).id === 'metronome') continue;
|
|
if (this.dex.abilities.get(move).exists) {
|
|
pokemon.m.scrambled.abilities.push({ thing: this.dex.abilities.get(move).name, inSlot: 'Move' });
|
|
} else if (this.dex.items.get(move).exists) {
|
|
pokemon.m.scrambled.items.push({ thing: this.dex.items.get(move).name, inSlot: 'Move' });
|
|
}
|
|
}
|
|
|
|
const newMoveSlots = [];
|
|
for (const moveSlot of pokemon.baseMoveSlots) {
|
|
if (moveSlot.id === 'metronome') {
|
|
const TeamValidator: typeof import('../sim/team-validator').TeamValidator =
|
|
require('../sim/team-validator').TeamValidator;
|
|
const cantMetronome = TeamValidator.get(this.format).checkCanLearn(this.dex.moves.get('metronome'), pokemon.species);
|
|
if (!cantMetronome) {
|
|
newMoveSlots.push(moveSlot);
|
|
} else {
|
|
pokemon.m.scrambled.items.push({ thing: this.dex.items.get('metronome').name, inSlot: 'Move' });
|
|
}
|
|
continue;
|
|
}
|
|
if (!this.dex.moves.get(moveSlot.id).exists) continue;
|
|
newMoveSlots.push(moveSlot);
|
|
}
|
|
|
|
(pokemon as any).baseMoveSlots = newMoveSlots;
|
|
|
|
for (const scrambledMove of pokemon.m.scrambled.moves) {
|
|
const move = this.dex.moves.get(scrambledMove.thing);
|
|
const newMove = {
|
|
move: move.name,
|
|
id: move.id,
|
|
pp: move.noPPBoosts ? move.pp : move.pp * 8 / 5,
|
|
maxpp: move.noPPBoosts ? move.pp : move.pp * 8 / 5,
|
|
target: move.target,
|
|
disabled: false,
|
|
used: false,
|
|
};
|
|
pokemon.baseMoveSlots.push(newMove);
|
|
}
|
|
pokemon.moveSlots = pokemon.baseMoveSlots.slice();
|
|
}
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 9] Camomons",
|
|
desc: `Pokémon have their types set to match their first two moves.`,
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
ruleset: ['Standard OMs', 'Sleep Clause Mod', 'Evasion Items Clause', 'Evasion Abilities Clause', 'Terastal Clause', 'Camomons Mod'],
|
|
banlist: [
|
|
'Arceus', 'Baxcalibur', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Darkrai', 'Deoxys-Normal', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', 'Dragonite', 'Drednaw',
|
|
'Enamorus-Incarnate', 'Espathra', 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Gouging Fire', 'Groudon', 'Ho-Oh', 'Iron Bundle', 'Kommo-o', 'Koraidon', 'Kyogre',
|
|
'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Incarnate', 'Lugia', 'Lunala', 'Magearna', 'Manaphy', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane',
|
|
'Palafin', 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Reshiram', 'Roaring Moon', 'Shaymin-Sky', 'Sneasler', 'Solgaleo', 'Spectrier', 'Tornadus-Therian', 'Ursaluna-Bloodmoon',
|
|
'Volcarona', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', 'Arena Trap', 'Moody', 'Shadow Tag', 'Booster Energy', 'King\'s Rock', 'Light Clay', 'Razor Fang',
|
|
'Baton Pass', 'Last Respects', 'Shed Tail',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 9] Category Swap",
|
|
desc: `All Special moves become Physical, and all Physical moves become Special.`,
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
ruleset: ['Standard OMs', 'Sleep Clause Mod', 'Category Swap Mod'],
|
|
banlist: [
|
|
'Arceus', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Darkrai', 'Deoxys-Normal', 'Deoxys-Attack', 'Deoxys-Speed', 'Dialga', 'Dialga-Origin', 'Dragapult', 'Eternatus',
|
|
'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Iron Valiant', 'Koraidon', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Incarnate', 'Lugia', 'Lunala',
|
|
'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Regieleki', 'Reshiram', 'Roaring Moon', 'Solgaleo',
|
|
'Spectrier', 'Terapagos', 'Volcarona', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', 'Arena Trap', 'Moody', 'Shadow Tag', 'Damp Rock', 'King\'s Rock',
|
|
'Razor Fang', 'Baton Pass', 'Draco Meteor', 'Last Respects', 'Overheat', 'Shed Tail',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 9] Convergence",
|
|
desc: `Allows all Pokémon that have identical types to share moves and abilities.`,
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
ruleset: ['Standard OMs', 'Ability Clause = 1', 'Sleep Moves Clause', 'Convergence Legality', 'Terastal Clause', '!Obtainable Abilities'],
|
|
banlist: [
|
|
'Arceus', 'Baxcalibur', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Comfey', 'Darkrai', 'Deoxys-Normal', 'Deoxys-Attack', 'Deoxys-Speed',
|
|
'Dialga', 'Dialga-Origin', 'Dondozo', 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Groudon', 'Haxorus', 'Ho-oh', 'Inteleon',
|
|
'Iron Bundle', 'Iron Hands', 'Koraidon', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Incarnate', 'Lilligant-Hisui', 'Lugia', 'Lunala',
|
|
'Magearna', 'Manaphy', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Ogerpon-Hearthflame', 'Palafin', 'Palkia', 'Palkia-Origin',
|
|
'Porygon-Z', 'Primarina', 'Rayquaza', 'Regieleki', 'Regigigas', 'Reshiram', 'Roaring Moon', 'Shaymin-Sky', 'Solgaleo', 'Slaking', 'Smeargle', 'Sneasler',
|
|
'Spectrier', 'Umbreon', 'Urshifu-Single-Strike', 'Urshifu-Rapid-Strike', 'Walking Wake', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned',
|
|
'Zekrom', 'Arena Trap', 'Comatose', 'Contrary', 'Drizzle', 'Drought', 'Imposter', 'Moody', 'Pure Power', 'Shadow Tag', 'Speed Boost', 'Unburden',
|
|
'King\'s Rock', 'Light Clay', 'Razor Fang', 'Baton Pass', 'Belly Drum', 'Boomburst', 'Extreme Speed', 'Final Gambit', 'Last Respects', 'Population Bomb',
|
|
'Quiver Dance', 'Rage Fist', 'Shed Tail', 'Shell Smash', 'Spore', 'Transform',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 9] Cross Evolution",
|
|
desc: `Give a Pokémon a Pokémon name of the next evolution stage as a nickname to inherit stat changes, typing, abilities, and moves from the next stage Pokémon.`,
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
ruleset: ['Standard OMs', 'Sleep Moves Clause', 'Terastal Clause'],
|
|
banlist: [
|
|
'Basculin-White-Striped', 'Duraludon', 'Kyogre', 'Miraidon', 'Scyther', 'Sneasel', 'Sneasel-Hisui', 'Ursaring', 'Arena Trap',
|
|
'Huge Power', 'Pure Power', 'Shadow Tag', 'Moody', 'King\'s Rock', 'Razor Fang', 'Baton Pass', 'Shed Tail',
|
|
],
|
|
restricted: ['Espathra', 'Frosmoth', 'Gallade', 'Lilligant-Hisui', 'Lunala', 'Solgaleo'],
|
|
onValidateTeam(team) {
|
|
const nums = new Set<number>();
|
|
for (const set of team) {
|
|
const name = set.name;
|
|
const species = this.dex.species.get(name);
|
|
if (nums.has(species.num)) {
|
|
return [
|
|
`Your Pok\u00e9mon must have different nicknames.`,
|
|
`(You have more than one Pok\u00e9mon named after a form of '${species.name}')`,
|
|
];
|
|
}
|
|
if (species.exists && species.name !== set.species) nums.add(species.num);
|
|
}
|
|
if (!nums.size) {
|
|
return [
|
|
`${this.format.name} works using nicknames; your team has 0 nicknamed Pok\u00e9mon.`,
|
|
`(If this was intentional, add a nickname to one Pok\u00e9mon that isn't the name of a Pok\u00e9mon species.)`,
|
|
];
|
|
}
|
|
},
|
|
checkCanLearn(move, species, lsetData, set) {
|
|
if (!(set as any).sp?.exists || !(set as any).crossSpecies?.exists) {
|
|
return this.checkCanLearn(move, species, lsetData, set);
|
|
}
|
|
const problem = this.checkCanLearn(move, (set as any).sp);
|
|
if (!problem) return null;
|
|
if (this.checkCanLearn(move, (set as any).crossSpecies)) return problem;
|
|
return null;
|
|
},
|
|
validateSet(set, teamHas) {
|
|
const crossSpecies = this.dex.species.get(set.name);
|
|
let problems = this.dex.formats.get('Obtainable Misc').onChangeSet?.call(this, set, this.format) || null;
|
|
if (Array.isArray(problems) && problems.length) return problems;
|
|
const crossNonstandard = (!this.ruleTable.has('natdexmod') && crossSpecies.isNonstandard === 'Past') ||
|
|
crossSpecies.isNonstandard === 'Future';
|
|
const crossIsCap = !this.ruleTable.has('+pokemontag:cap') && crossSpecies.isNonstandard === 'CAP';
|
|
if (!crossSpecies.exists || crossNonstandard || crossIsCap) return this.validateSet(set, teamHas);
|
|
const species = this.dex.species.get(set.species);
|
|
const check = this.checkSpecies(set, species, species, {});
|
|
if (check) return [check];
|
|
const nonstandard = !this.ruleTable.has('natdexmod') && species.isNonstandard === 'Past';
|
|
const isCap = !this.ruleTable.has('+pokemontag:cap') && species.isNonstandard === 'CAP';
|
|
if (!species.exists || nonstandard || isCap || species === crossSpecies) return this.validateSet(set, teamHas);
|
|
if (!species.nfe) return [`${species.name} cannot cross evolve because it doesn't evolve.`];
|
|
const crossIsUnreleased = (crossSpecies.tier === "Unreleased" && crossSpecies.isNonstandard === "Unobtainable" &&
|
|
!this.ruleTable.has('+unobtainable'));
|
|
if (crossSpecies.battleOnly || crossIsUnreleased || !crossSpecies.prevo) {
|
|
return [`${species.name} cannot cross evolve into ${crossSpecies.name} because it isn't an evolution.`];
|
|
}
|
|
if (this.ruleTable.isRestrictedSpecies(crossSpecies)) {
|
|
return [`${species.name} cannot cross evolve into ${crossSpecies.name} because it is banned.`];
|
|
}
|
|
const crossPrevoSpecies = this.dex.species.get(crossSpecies.prevo);
|
|
if (!crossPrevoSpecies.prevo !== !species.prevo) {
|
|
return [
|
|
`${species.name} cannot cross evolve into ${crossSpecies.name} because they are not consecutive evolution stages.`,
|
|
];
|
|
}
|
|
const item = this.dex.items.get(set.item);
|
|
if (item.itemUser?.length) {
|
|
if (!item.itemUser.includes(crossSpecies.name) || crossSpecies.name !== species.name) {
|
|
return [`${species.name} cannot use ${item.name} because it is cross evolved into ${crossSpecies.name}.`];
|
|
}
|
|
}
|
|
const ability = this.dex.abilities.get(set.ability);
|
|
if (!this.ruleTable.isRestricted(`ability:${ability.id}`) || Object.values(species.abilities).includes(ability.name)) {
|
|
set.species = crossSpecies.name;
|
|
}
|
|
|
|
(set as any).sp = species;
|
|
(set as any).crossSpecies = crossSpecies;
|
|
problems = this.validateSet(set, teamHas);
|
|
set.name = crossSpecies.name;
|
|
set.species = species.name;
|
|
return problems;
|
|
},
|
|
onModifySpecies(species, target, source, effect) {
|
|
if (!target) return; // chat
|
|
if (effect && ['imposter', 'transform'].includes(effect.id)) return;
|
|
if (target.set.name === target.set.species) return;
|
|
const crossSpecies = this.dex.species.get(target.set.name);
|
|
if (!crossSpecies.exists) return;
|
|
if (species.battleOnly || !species.nfe) return;
|
|
const crossIsUnreleased = (crossSpecies.tier === "Unreleased" && crossSpecies.isNonstandard === "Unobtainable" &&
|
|
!this.ruleTable.has('+unobtainable'));
|
|
if (crossSpecies.battleOnly || crossIsUnreleased || !crossSpecies.prevo) return;
|
|
const crossPrevoSpecies = this.dex.species.get(crossSpecies.prevo);
|
|
if (!crossPrevoSpecies.prevo !== !species.prevo) return;
|
|
|
|
const mixedSpecies = this.dex.deepClone(species);
|
|
mixedSpecies.weightkg =
|
|
Math.max(0.1, species.weightkg + crossSpecies.weightkg - crossPrevoSpecies.weightkg).toFixed(1);
|
|
mixedSpecies.nfe = false;
|
|
mixedSpecies.evos = [];
|
|
mixedSpecies.eggGroups = crossSpecies.eggGroups;
|
|
mixedSpecies.abilities = crossSpecies.abilities;
|
|
mixedSpecies.bst = 0;
|
|
let i: StatID;
|
|
for (i in species.baseStats) {
|
|
const statChange = crossSpecies.baseStats[i] - crossPrevoSpecies.baseStats[i];
|
|
mixedSpecies.baseStats[i] = this.clampIntRange(species.baseStats[i] + statChange, 1, 255);
|
|
mixedSpecies.bst += mixedSpecies.baseStats[i];
|
|
}
|
|
if (crossSpecies.types[0] !== crossPrevoSpecies.types[0]) mixedSpecies.types[0] = crossSpecies.types[0];
|
|
if (crossSpecies.types[1] !== crossPrevoSpecies.types[1]) {
|
|
mixedSpecies.types[1] = crossSpecies.types[1] || crossSpecies.types[0];
|
|
}
|
|
if (mixedSpecies.types[0] === mixedSpecies.types[1]) mixedSpecies.types = [mixedSpecies.types[0]];
|
|
|
|
return mixedSpecies;
|
|
},
|
|
onBegin() {
|
|
for (const pokemon of this.getAllPokemon()) {
|
|
pokemon.baseSpecies = pokemon.species;
|
|
}
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 9] Fervent Impersonation",
|
|
desc: `Nickname a Pokémon after another Pokémon that it shares a moveset with, and it will transform into the Pokémon it's nicknamed after once it drops to or below 50% health.`,
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
ruleset: ['Standard OMs', 'Sleep Moves Clause', 'Fervent Impersonation Mod', '!Nickname Clause'],
|
|
banlist: ['Arena Trap', 'Moody', 'Shadow Tag', 'King\'s Rock', 'Razor Fang', 'Baton Pass', 'Dire Claw', 'Shed Tail', 'Last Respects'],
|
|
restricted: [
|
|
'Arceus', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Deoxys-Normal', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', 'Espathra', 'Eternatus',
|
|
'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Koraidon', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna',
|
|
'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palafin', 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Regieleki', 'Reshiram', 'Shaymin-Sky',
|
|
'Solgaleo', 'Terapagos', 'Urshifu-Single-Strike', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom',
|
|
],
|
|
// Implemented the mechanics as a Rule because I'm too lazy to make battles read base format for `onResidual` at the moment
|
|
},
|
|
{
|
|
name: "[Gen 9] Flipped",
|
|
desc: `All Pokémon have their base stats flipped. For example, Sylveon's HP and Speed stats, Attack and Special Defense stats, and Defense and Special Attack stats swap.`,
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
ruleset: ['Standard OMs', 'Sleep Moves Clause', 'Evasion Abilities Clause', 'Evasion Items Clause', 'Flipped Mod'],
|
|
banlist: [
|
|
'Annihilape', 'Araquanid', 'Arceus', 'Azumarill', 'Blissey', 'Calyrex-Ice', 'Calyrex-Shadow', 'Cloyster', 'Cyclizar', 'Deoxys-Attack', 'Deoxys-Normal',
|
|
'Deoxys-Speed', 'Dialga', 'Dialga-Origin', 'Espathra', 'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Hoopa-Unbound', 'Koraidon', 'Kyogre',
|
|
'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Miraidon', 'Mienshao', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia',
|
|
'Palkia-Origin', 'Rayquaza', 'Regieleki', 'Reshiram', 'Shaymin-Sky', 'Snorlax', 'Solgaleo', 'Sylveon', 'Terapagos', 'Torkoal', 'Tornadus-Therian', 'Zacian',
|
|
'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', 'Arena Trap', 'Moody', 'Shadow Tag', 'Damp Rock', 'King\'s Rock', 'Light Clay', 'Razor Fang', 'Baton Pass',
|
|
'Last Respects', 'Shed Tail',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 9] Foresighters",
|
|
desc: `Moves in the first moveslot will be delayed by two turns.`,
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
ruleset: ['Standard OMs', 'Sleep Moves Clause', 'Terastal Clause'],
|
|
banlist: [
|
|
'Annihilape', 'Arceus', 'Baxcalibur', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chien-Pao', 'Chi-Yu', 'Deoxys-Normal', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', 'Espathra',
|
|
'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Iron Bundle', 'Koraidon', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Incarnate',
|
|
'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palafin', 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Reshiram', 'Shaymin-Sky',
|
|
'Solgaleo', 'Spectrier', 'Ursaluna-Bloodmoon', 'Urshifu', 'Urshifu-Rapid-Strike', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', 'Arena Trap', 'Moody', 'Shadow Tag',
|
|
'Sand Veil', 'Snow Cloak', 'King\'s Rock', 'Razor Fang', 'Baton Pass', 'Dire Claw', 'Last Respects', 'Shed Tail',
|
|
],
|
|
restricted: [
|
|
'Belly Drum', 'Clangorous Soul', 'Dragon Dance', 'Endeavor', 'Quiver Dance', 'Shell Smash', 'Shift Gear', 'Tail Glow', 'Tidy Up', 'Victory Dance',
|
|
],
|
|
onValidateSet(set) {
|
|
const fsMove = this.dex.moves.get(set.moves[0]);
|
|
if (this.ruleTable.isRestricted(`move:${fsMove.id}`)) {
|
|
return [`${set.name}'s move ${fsMove.name} cannot be used as a future move.`];
|
|
}
|
|
},
|
|
onModifyMove(move, pokemon) {
|
|
if (move.id === pokemon.moveSlots[0].id && !move.flags['futuremove']) {
|
|
move.flags['futuremove'] = 1;
|
|
delete move.flags['protect'];
|
|
move.onTry = function (source, t) {
|
|
if (!t.side.addSlotCondition(t, 'futuremove')) {
|
|
this.hint('Future moves fail when the targeted slot already has a future move focused on it.');
|
|
return false;
|
|
}
|
|
const moveData = this.dex.getActiveMove(move.id);
|
|
moveData.flags['futuremove'] = 1;
|
|
delete moveData.flags['protect'];
|
|
if (moveData.id === 'beatup') this.singleEvent('ModifyMove', moveData, null, pokemon, null, null, moveData);
|
|
Object.assign(t.side.slotConditions[t.position]['futuremove'], {
|
|
duration: 3,
|
|
move: moveData.id,
|
|
source,
|
|
moveData,
|
|
});
|
|
this.add('-message', `${source.name} foresaw an attack!`);
|
|
return this.NOT_FAIL;
|
|
};
|
|
}
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 9] Formemons",
|
|
desc: `Alternate formes of existing Pokemon can be used directly without required items/moves.`,
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
ruleset: [
|
|
'Standard AG', '!Obtainable Formes', '+Past', '+LGPE', 'Evasion Clause', 'Forme Clause', 'OHKO Clause', 'Overflow Stat Mod',
|
|
'Sleep Moves Clause', 'Species Reveal Clause', 'Hackmons Forme Legality', 'Mega Rayquaza Clause',
|
|
],
|
|
banlist: ['Calyrex-Shadow', 'Gengar-Mega', 'Miraidon', 'Moody', 'King\'s Rock', 'Razor Fang', 'Baton Pass'],
|
|
onValidateSet(set, format, setHas, teamHas) {
|
|
const species = this.dex.species.get(set.species);
|
|
if (this.dex.species.get(species.baseSpecies).isNonstandard) return [`${species.name} does not exist in Gen 9.`];
|
|
if (species.name !== species.baseSpecies && species.baseSpecies === 'Arceus' &&
|
|
this.dex.items.get(set.item).onPlate !== species.types[0]) {
|
|
return [`${species.name} is required to hold the ${species.requiredItems![0]}.`];
|
|
}
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 9] Fortemons",
|
|
desc: `Put an attacking move in the item slot to have all of a Pokémon's attacks inherit its properties.`,
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
ruleset: ['Standard OMs', 'Sleep Moves Clause', 'Terastal Clause'],
|
|
banlist: [
|
|
'Annihilape', 'Arceus', 'Archaludon', 'Azumarill', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Cloyster', 'Comfey', 'Deoxys-Normal', 'Deoxys-Attack',
|
|
'Dialga-Base', 'Espathra', 'Eternatus', 'Flutter Mane', 'Giratina-Altered', 'Great Tusk', 'Groudon', 'Ho-Oh', 'Iron Bundle', 'Iron Treads', 'Koraidon', 'Kyogre',
|
|
'Kyurem-Black', 'Kyurem-White', 'Landorus-Incarnate', 'Lugia', 'Lunala', 'Magearna', 'Meowscarada', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane',
|
|
'Palafin', 'Palkia', 'Palkia-Origin', 'Quaquaval', 'Raging Bolt', 'Rayquaza', 'Reshiram', 'Samurott-Hisui', 'Shaymin-Sky', 'Skeledirge', 'Smeargle', 'Solgaleo',
|
|
'Spectrier', 'Sneasler', 'Terapagos', 'Urshifu', 'Urshifu-Rapid-Strike', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Arena Trap',
|
|
'Moody', 'Serene Grace', 'Shadow Tag', 'Damp Rock', 'Heat Rock', 'Light Clay', 'Baton Pass', 'Beat Up', 'Fake Out', 'Last Respects', 'move:Metronome', 'Shed Tail',
|
|
],
|
|
restricted: [
|
|
'Doom Desire', 'Dynamic Punch', 'Electro Ball', 'Explosion', 'Gyro Ball', 'Final Gambit', 'Flail', 'Flip Turn', 'Fury Cutter', 'Future Sight', 'Grass Knot',
|
|
'Grassy Glide', 'Hard Press', 'Heavy Slam', 'Heat Crash', 'Inferno', 'Low Kick', 'Misty Explosion', 'Nuzzle', 'Power Trip', 'Reversal', 'Self-Destruct',
|
|
'Spit Up', 'Stored Power', 'Tera Blast', 'U-turn', 'Weather Ball', 'Zap Cannon',
|
|
],
|
|
onValidateTeam(team) {
|
|
const itemTable = new Set<string>();
|
|
for (const set of team) {
|
|
const forte = this.toID(set.item);
|
|
if (!forte) continue;
|
|
const move = this.dex.moves.get(forte);
|
|
if (move.exists && move.id !== 'metronome') {
|
|
if (itemTable.has(forte)) {
|
|
return [
|
|
`You are limited to one of each move in the item slot per team.`,
|
|
`(You have more than one ${move.name}.)`,
|
|
];
|
|
}
|
|
itemTable.add(forte);
|
|
}
|
|
}
|
|
},
|
|
validateSet(set, teamHas) {
|
|
const item = set.item;
|
|
const species = this.dex.species.get(set.species);
|
|
const move = this.dex.moves.get(item);
|
|
if (!move.exists || move.id === 'metronome' || move.category === 'Status') {
|
|
return this.validateSet(set, teamHas);
|
|
}
|
|
set.item = '';
|
|
const problems = this.validateSet(set, teamHas) || [];
|
|
set.item = item;
|
|
if (this.ruleTable.has('obtainablemoves') && this.checkCanLearn(move, species, this.allSources(species), set)) {
|
|
problems.push(`${species.name} can't learn ${move.name}.`);
|
|
}
|
|
if (set.moves.map(this.toID).includes(move.id)) {
|
|
problems.push(`Moves in the item slot can't be in the moveslots as well.`);
|
|
}
|
|
if (this.ruleTable.has(`-move:${move.id}`)) {
|
|
problems.push(`The move ${move.name} is fully banned.`);
|
|
}
|
|
const accuracyLoweringMove =
|
|
move.secondaries?.some(secondary => secondary.boosts?.accuracy && secondary.boosts?.accuracy < 0);
|
|
const flinchMove = move.secondaries?.some(secondary => secondary.volatileStatus === 'flinch');
|
|
const freezeMove = move.secondaries?.some(secondary => secondary.status === 'frz') || move.id === 'triattack';
|
|
if (
|
|
this.ruleTable.isRestricted(`move:${move.id}`) ||
|
|
((accuracyLoweringMove || move.ohko || move.multihit || move.id === 'beatup' || move.flags['charge'] ||
|
|
move.priority > 0 || move.damageCallback || flinchMove || freezeMove) &&
|
|
!this.ruleTable.has(`+move:${move.id}`))
|
|
) {
|
|
problems.push(`The move ${move.name} can't be used as an item.`);
|
|
}
|
|
return problems.length ? problems : null;
|
|
},
|
|
onBegin() {
|
|
for (const pokemon of this.getAllPokemon()) {
|
|
const move = this.dex.getActiveMove(pokemon.set.item);
|
|
if (move.exists && move.category !== 'Status') {
|
|
pokemon.m.forte = move;
|
|
pokemon.item = 'mail' as ID;
|
|
}
|
|
}
|
|
},
|
|
onModifyMovePriority: 1,
|
|
onModifyMove(move, pokemon, target) {
|
|
const forte: ActiveMove = pokemon.m.forte;
|
|
if (move.category !== 'Status' && forte) {
|
|
move.flags = { ...move.flags, ...forte.flags };
|
|
if (forte.self) {
|
|
if (forte.self.onHit && move.self?.onHit) {
|
|
for (const i in forte.self) {
|
|
if (i.startsWith('onHit')) continue;
|
|
(move.self as any)[i] = (forte.self as any)[i];
|
|
}
|
|
} else {
|
|
move.self = { ...move.self, ...forte.self };
|
|
}
|
|
}
|
|
if (forte.selfBoost?.boosts) {
|
|
if (!move.selfBoost?.boosts) move.selfBoost = { boosts: {} };
|
|
let boostid: BoostID;
|
|
for (boostid in forte.selfBoost.boosts) {
|
|
if (!move.selfBoost.boosts![boostid]) move.selfBoost.boosts![boostid] = 0;
|
|
move.selfBoost.boosts![boostid]! += forte.selfBoost.boosts[boostid]!;
|
|
}
|
|
}
|
|
if (forte.secondaries) {
|
|
move.secondaries = [...(move.secondaries || []), ...forte.secondaries];
|
|
}
|
|
move.critRatio = (move.critRatio || 1) + (forte.critRatio || 1) - 1;
|
|
const VALID_PROPERTIES = [
|
|
'alwaysHit', 'basePowerCallback', 'breaksProtect', 'drain', 'forceSTAB', 'forceSwitch', 'hasCrashDamage', 'hasSheerForce',
|
|
'ignoreAbility', 'ignoreAccuracy', 'ignoreDefensive', 'ignoreEvasion', 'ignoreImmunity', 'mindBlownRecoil', 'noDamageVariance',
|
|
'ohko', 'overrideDefensivePokemon', 'overrideDefensiveStat', 'overrideOffensivePokemon', 'overrideOffensiveStat', 'pseudoWeather',
|
|
'recoil', 'selfdestruct', 'selfSwitch', 'sleepUsable', 'smartTarget', 'stealsBoosts', 'thawsTarget', 'volatileStatus', 'willCrit',
|
|
] as const;
|
|
for (const property of VALID_PROPERTIES) {
|
|
if (forte[property]) {
|
|
move[property] = forte[property] as any;
|
|
}
|
|
}
|
|
// Added here because onEffectiveness doesn't have an easy way to reference the source
|
|
if (forte.onEffectiveness) {
|
|
move.onEffectiveness = function (typeMod, t, type, m) {
|
|
return forte.onEffectiveness!.call(this, typeMod, t, type, m);
|
|
};
|
|
}
|
|
forte.onModifyMove?.call(this, move, pokemon, target);
|
|
}
|
|
},
|
|
onModifyPriority(priority, source, target, move) {
|
|
const forte = source?.m.forte;
|
|
if (move.category !== 'Status' && forte) {
|
|
if (source.hasAbility('Triage') && forte.flags['heal']) {
|
|
return priority + (move.flags['heal'] ? 0 : 3);
|
|
}
|
|
return priority + forte.priority;
|
|
}
|
|
},
|
|
onModifyTypePriority: 1,
|
|
onModifyType(move, pokemon, target) {
|
|
const forte = pokemon.m.forte;
|
|
if (move.category !== 'Status' && forte) {
|
|
this.singleEvent('ModifyType', forte, null, pokemon, target, move, move);
|
|
}
|
|
},
|
|
onHitPriority: 1,
|
|
onHit(target, source, move) {
|
|
const forte = source.m.forte;
|
|
if (move?.category !== 'Status' && forte) {
|
|
this.singleEvent('Hit', forte, {}, target, source, move);
|
|
if (forte.self) this.singleEvent('Hit', forte.self, {}, source, source, move);
|
|
this.singleEvent('AfterHit', forte, {}, target, source, move);
|
|
}
|
|
},
|
|
onAfterSubDamage(damage, target, source, move) {
|
|
const forte = source.m.forte;
|
|
if (move?.category !== 'Status' && forte) {
|
|
this.singleEvent('AfterSubDamage', forte, null, target, source, move, damage);
|
|
}
|
|
},
|
|
onModifySecondaries(secondaries, target, source, move) {
|
|
if (secondaries.some(s => !!s.self)) move.selfDropped = false;
|
|
},
|
|
onAfterMoveSecondaryPriority: 1,
|
|
onAfterMoveSecondarySelf(source, target, move) {
|
|
const forte = source.m.forte;
|
|
if (move?.category !== 'Status' && forte) {
|
|
this.singleEvent('AfterMoveSecondarySelf', forte, null, source, target, move);
|
|
}
|
|
},
|
|
onBasePowerPriority: 1,
|
|
onBasePower(basePower, source, target, move) {
|
|
const forte = source.m.forte;
|
|
if (move.category !== 'Status' && forte?.onBasePower) {
|
|
forte.onBasePower.call(this, basePower, source, target, move);
|
|
}
|
|
},
|
|
pokemon: {
|
|
getItem() {
|
|
const move = this.battle.dex.moves.get(this.m.forte);
|
|
if (!move.exists) return Object.getPrototypeOf(this).getItem.call(this);
|
|
return {
|
|
...this.battle.dex.items.get('mail'),
|
|
name: move.name, id: move.id, ignoreKlutz: true, onTakeItem: false,
|
|
};
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 9] Frantic Fusions",
|
|
desc: `Pokémon nicknamed after another Pokémon get their stats buffed by 1/4 of that Pokémon's stats, barring HP, and access to one of their abilities.`,
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
ruleset: ['Standard OMs', '!Nickname Clause', '!Obtainable Abilities', 'Ability Clause = 2', 'Sleep Moves Clause', 'Frantic Fusions Mod', 'Terastal Clause'],
|
|
banlist: [
|
|
'Annihilape', 'Arceus', 'Baxcalibur', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Comfey', 'Cresselia', 'Darkrai', 'Deoxys-Normal', 'Deoxys-Attack',
|
|
'Deoxys-Speed', 'Dialga', 'Dialga-Origin', 'Ditto', 'Dragapult', 'Enamorus-Incarnate', 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Gouging Fire',
|
|
'Groudon', 'Ho-Oh', 'Hoopa-Unbound', 'Iron Boulder', 'Iron Bundle', 'Iron Moth', 'Iron Valiant', 'Keldeo', 'Koraidon', 'Komala', 'Kyogre', 'Kyurem', 'Kyurem-Black',
|
|
'Kyurem-White', 'Landorus-Incarnate', 'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Numel', 'Ogerpon-Hearthflame',
|
|
'Ogerpon-Wellspring', 'Palafin', 'Palkia', 'Palkia-Origin', 'Persian-Alola', 'Rayquaza', 'Regieleki', 'Regigigas', 'Reshiram', 'Shaymin-Sky', 'Slaking', 'Sneasler',
|
|
'Solgaleo', 'Spectrier', 'Toxapex', 'Urshifu', 'Urshifu-Rapid-Strike', 'Volcarona', 'Walking Wake', 'Weavile', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned',
|
|
'Zekrom', 'Arena Trap', 'Contrary', 'Huge Power', 'Ice Scales', 'Illusion', 'Magnet Pull', 'Moody', 'Neutralizing Gas', 'Poison Heal', 'Pure Power', 'Shadow Tag',
|
|
'Stakeout', 'Stench', 'Speed Boost', 'Unburden', 'Water Bubble', 'Damp Rock', 'Heat Rock', 'King\'s Rock', 'Quick Claw', 'Razor Fang', 'Baton Pass', 'Last Respects',
|
|
'Revival Blessing', 'Shed Tail',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 9] Full Potential",
|
|
desc: `Pokémon's moves hit off of their highest stat, except HP.`,
|
|
mod: 'fullpotential',
|
|
searchShow: false,
|
|
ruleset: ['Standard OMs', 'Evasion Abilities Clause', 'Evasion Items Clause', 'Sleep Moves Clause', 'Terastal Clause'],
|
|
banlist: [
|
|
'Arceus', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chien-Pao', 'Deoxys', 'Deoxys-Attack', 'Deoxys-Defense', 'Deoxys-Speed', 'Dialga', 'Dialga-Origin', 'Diancie',
|
|
'Dragapult', 'Electrode-Hisui', 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Goodra-Hisui', 'Groudon', 'Ho-Oh', 'Jolteon', 'Koraidon', 'Kyogre',
|
|
'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Mewtwo', 'Miraidon', 'Necrozma-Dusk-Mane', 'Necrozma-Dawn-Wings', 'Palkia', 'Palkia-Origin', 'Rayquaza',
|
|
'Regieleki', 'Scream Tail', 'Shaymin-Sky', 'Spectrier', 'Solgaleo', 'Talonflame', 'Terapagos', 'Toxapex', 'Tyranitar', 'Zacian', 'Zacian-Crowned', 'Zamazenta',
|
|
'Zamazenta-Crowned', 'Zekrom', 'Arena Trap', 'Chlorophyll', 'Drought', 'Moody', 'Sand Rush', 'Shadow Tag', 'Slush Rush', 'Speed Boost', 'Surge Surfer',
|
|
'Swift Swim', 'Unburden', 'Booster Energy', 'Choice Scarf', 'Heat Rock', 'King\'s Rock', 'Light Clay', 'Razor Fang', 'Agility', 'Baton Pass', 'Last Respects',
|
|
'Shed Tail', 'Tailwind',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 9] Inheritance",
|
|
desc: `Pokémon may use the ability and moves of another, as long as they forfeit their own learnset.`,
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
ruleset: ['Standard OMs', 'Ability Clause = 1', 'Sleep Moves Clause', 'Terastal Clause'],
|
|
banlist: [
|
|
'Arceus', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chien-Pao', 'Cresselia', 'Deoxys-Normal', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', 'Dondozo', 'Dragapult', 'Eternatus',
|
|
'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Groudon', 'Hoopa-Unbound', 'Ho-Oh', 'Iron Bundle', 'Iron Valiant', 'Koraidon', 'Kyogre', 'Kyurem', 'Kyurem-Black',
|
|
'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Palkia-Origin', 'Pecharunt', 'Rayquaza',
|
|
'Regieleki', 'Regigigas', 'Reshiram', 'Roaring Moon', 'Sableye', 'Scream Tail', 'Shaymin-Sky', 'Slaking', 'Smeargle', 'Solgaleo', 'Spectrier', 'Urshifu-Single-Strike',
|
|
'Ursaluna-Base', 'Weavile', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Arena Trap', 'Drizzle', 'Drought', 'Good as Gold', 'Huge Power',
|
|
'Imposter', 'Magic Bounce', 'Magnet Pull', 'Moody', 'Neutralizing Gas', 'Poison Heal', 'Pure Power', 'Shadow Tag', 'Sheer Force', 'Speed Boost', 'Stakeout', 'Water Bubble',
|
|
'King\'s Rock', 'Razor Fang', 'Baton Pass', 'Ceaseless Edge', 'Fillet Away', 'Last Respects', 'Quiver Dance', 'Rage Fist', 'Shed Tail', 'Shell Smash',
|
|
],
|
|
getEvoFamily(speciesid) {
|
|
let species = Dex.species.get(speciesid);
|
|
while (species.prevo) {
|
|
const prevoSpecies = Dex.species.get(species.prevo);
|
|
if (prevoSpecies.evos.length > 1) break;
|
|
species = prevoSpecies;
|
|
}
|
|
return species.id;
|
|
},
|
|
validateSet(set, teamHas) {
|
|
if (!teamHas.abilityMap) {
|
|
teamHas.abilityMap = Object.create(null);
|
|
for (const pokemon of Dex.species.all()) {
|
|
if (pokemon.isNonstandard && !this.ruleTable.has(`+pokemontag:${this.toID(pokemon.isNonstandard)}`)) continue;
|
|
if (pokemon.battleOnly) continue;
|
|
if (this.ruleTable.isBannedSpecies(pokemon)) continue;
|
|
|
|
for (const key of Object.values(pokemon.abilities)) {
|
|
const abilityId = this.dex.toID(key);
|
|
if (abilityId in teamHas.abilityMap) {
|
|
teamHas.abilityMap[abilityId][pokemon.evos ? 'push' : 'unshift'](pokemon.id);
|
|
} else {
|
|
teamHas.abilityMap[abilityId] = [pokemon.id];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
const problem = this.validateForme(set);
|
|
if (problem.length) return problem;
|
|
|
|
const species = this.dex.species.get(set.species);
|
|
if (!species.exists || species.num < 1) return [`The Pok\u00e9mon "${set.species}" does not exist.`];
|
|
if (species.isNonstandard && !this.ruleTable.has(`+pokemontag:${this.toID(species.isNonstandard)}`)) {
|
|
return [`${species.name} is not obtainable in Generation ${this.dex.gen}.`];
|
|
}
|
|
|
|
const name = set.name;
|
|
if (this.ruleTable.isBannedSpecies(species)) {
|
|
return this.validateSet(set, teamHas);
|
|
}
|
|
|
|
const ability = this.dex.abilities.get(set.ability);
|
|
if (!ability.exists || ability.isNonstandard) return [`${name} needs to have a valid ability.`];
|
|
const pokemonWithAbility = teamHas.abilityMap[ability.id];
|
|
if (!pokemonWithAbility) return [`${ability.name} is not available on a legal Pok\u00e9mon.`];
|
|
|
|
(this.format as any).debug = true;
|
|
|
|
if (!teamHas.abilitySources) teamHas.abilitySources = Object.create(null);
|
|
const validSources: string[] = teamHas.abilitySources[this.toID(set.species)] = []; // Evolution families
|
|
|
|
let canonicalSource = ''; // Specific for the basic implementation of Donor Clause (see onValidateTeam).
|
|
const hpType = set.hpType;
|
|
|
|
for (const donor of pokemonWithAbility) {
|
|
const donorSpecies = this.dex.species.get(donor);
|
|
let format = this.format;
|
|
if (!format.getEvoFamily) format = this.dex.formats.get('gen9inheritance');
|
|
const evoFamily = format.getEvoFamily!(donorSpecies.id);
|
|
if (validSources.includes(evoFamily)) continue;
|
|
|
|
set.species = donorSpecies.name;
|
|
set.name = donorSpecies.baseSpecies;
|
|
// TODO: Make this less hardcoded. Is it even possible?
|
|
// Do I even need to add special cases for Pagos and pokemon with fixed minimum IVs?
|
|
const min20IVs = ["Iron Boulder", "Gouging Fire", "Iron Crown", "Raging Bolt"];
|
|
if (min20IVs.includes(donorSpecies.name)) {
|
|
let iv: StatID;
|
|
for (iv in set.ivs) {
|
|
if (set.ivs[iv] < 20) set.ivs[iv] = 20;
|
|
}
|
|
}
|
|
const problems = this.validateSet(set, teamHas);
|
|
if (!problems?.length) {
|
|
validSources.push(evoFamily);
|
|
canonicalSource = donorSpecies.name;
|
|
}
|
|
// Specific for the basic implementation of Donor Clause (see onValidateTeam).
|
|
if (validSources.length > 1) break;
|
|
}
|
|
(this.format as any).debug = false;
|
|
|
|
set.name = name;
|
|
set.species = species.name;
|
|
set.hpType = hpType;
|
|
if (!validSources.length) {
|
|
if (pokemonWithAbility.length > 1) return [`${name}'s set is illegal.`];
|
|
return [`${name} has an illegal set with an ability from ${this.dex.species.get(pokemonWithAbility[0]).name}.`];
|
|
}
|
|
|
|
// Protocol: Include the data of the donor species in the `pokeball` data slot.
|
|
// Afterwards, we are going to reset the name to what the user intended.
|
|
set.pokeball = `${set.pokeball}0${canonicalSource}`;
|
|
return null;
|
|
},
|
|
onValidateTeam(team, f, teamHas) {
|
|
if (this.ruleTable.has('abilityclause')) {
|
|
const abilityTable = new this.dex.Multiset<string>();
|
|
const base: { [k: string]: string } = {
|
|
airlock: 'cloudnine',
|
|
armortail: 'queenlymajesty',
|
|
battlearmor: 'shellarmor',
|
|
clearbody: 'whitesmoke',
|
|
dazzling: 'queenlymajesty',
|
|
emergencyexit: 'wimpout',
|
|
filter: 'solidrock',
|
|
gooey: 'tanglinghair',
|
|
insomnia: 'vitalspirit',
|
|
ironbarbs: 'roughskin',
|
|
keeneye: 'illuminate',
|
|
libero: 'protean',
|
|
minus: 'plus',
|
|
moxie: 'chillingneigh',
|
|
powerofalchemy: 'receiver',
|
|
propellertail: 'stalwart',
|
|
teravolt: 'moldbreaker',
|
|
turboblaze: 'moldbreaker',
|
|
};
|
|
const num = parseInt(this.ruleTable.valueRules.get('abilityclause')!);
|
|
for (const set of team) {
|
|
let ability = this.toID(set.ability.split('0')[0]);
|
|
if (!ability) continue;
|
|
if (ability in base) ability = base[ability] as ID;
|
|
if (abilityTable.get(ability) >= num) {
|
|
return [
|
|
`You are limited to ${num} of each ability by ${num} Ability Clause.`,
|
|
`(You have more than ${num} ${this.dex.abilities.get(ability).name} variants)`,
|
|
];
|
|
}
|
|
abilityTable.add(ability);
|
|
}
|
|
}
|
|
|
|
// Donor Clause
|
|
const evoFamilyLists = [];
|
|
for (const set of team) {
|
|
const abilitySources = teamHas.abilitySources?.[this.toID(set.species)];
|
|
if (!abilitySources) continue;
|
|
let format = this.format;
|
|
if (!format.getEvoFamily) format = this.dex.formats.get('gen9inheritance');
|
|
evoFamilyLists.push(abilitySources.map(format.getEvoFamily!));
|
|
}
|
|
|
|
// Checking actual full incompatibility would require expensive algebra.
|
|
// Instead, we only check the trivial case of multiple Pokémon only legal for exactly one family. FIXME?
|
|
const requiredFamilies = Object.create(null);
|
|
for (const evoFamilies of evoFamilyLists) {
|
|
if (evoFamilies.length !== 1) continue;
|
|
const [familyId] = evoFamilies;
|
|
if (!(familyId in requiredFamilies)) {
|
|
requiredFamilies[familyId] = 1;
|
|
} else {
|
|
requiredFamilies[familyId]++;
|
|
}
|
|
if (requiredFamilies[familyId] > 1) {
|
|
return [
|
|
`You are limited to up to one inheritance from each evolution family by the Donor Clause.`,
|
|
`(You inherit more than once from ${this.dex.species.get(familyId).name}).`,
|
|
];
|
|
}
|
|
}
|
|
},
|
|
onBegin() {
|
|
for (const pokemon of this.getAllPokemon()) {
|
|
if (pokemon.pokeball.includes('0')) {
|
|
const donor = pokemon.pokeball.split('0')[1];
|
|
pokemon.m.donor = this.toID(donor);
|
|
(pokemon as any).pokeball = this.toID(pokemon.pokeball.split('0')[0]);
|
|
}
|
|
}
|
|
},
|
|
onSwitchIn(pokemon) {
|
|
if (!pokemon.m.donor) return;
|
|
const donorTemplate = this.dex.species.get(pokemon.m.donor);
|
|
if (!donorTemplate.exists) return;
|
|
// Place volatiles on the Pokémon to show the donor details.
|
|
this.add('-start', pokemon, donorTemplate.name, '[silent]');
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 9] Inverse",
|
|
desc: `The type chart is inverted; weaknesses become resistances, while resistances and immunities become weaknesses.`,
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
ruleset: ['Standard OMs', 'Sleep Moves Clause', 'Inverse Mod', 'Terastal Clause'],
|
|
banlist: [
|
|
'Arceus', 'Baxcalibur', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chien-Pao', 'Deoxys-Attack', 'Deoxys-Normal', 'Deoxys-Speed', 'Espathra', 'Eternatus', 'Flutter Mane',
|
|
'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Indeedee', 'Indeedee-F', 'Koraidon', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Lunala', 'Maushold', 'Mewtwo',
|
|
'Miraidon', 'Necrozma-Dawn-Wings', 'Palafin', 'Palkia', 'Palkia-Origin', 'Porygon-Z', 'Rayquaza', 'Regidrago', 'Regieleki', 'Reshiram', 'Rillaboom', 'Shaymin-Sky',
|
|
'Spectrier', 'Ursaluna', 'Ursaluna-Bloodmoon', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Hero', 'Zekrom', 'Arena Trap', 'Moody', 'Shadow Tag', 'King\'s Rock', 'Light Clay',
|
|
'Baton Pass', 'Last Respects', 'Shed Tail',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 9] Nature Swap",
|
|
desc: `Pokémon have their stats swapped around based on their nature. A Pokémon with a Modest nature will have its Atk and Sp. Atk stats swap.`,
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
ruleset: ['Standard OMs', 'Sleep Moves Clause'],
|
|
banlist: [
|
|
'Annihilape', 'Arceus', 'Azumarill', 'Blissey', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chansey', 'Chi-Yu', 'Chien-Pao', 'Cloyster', 'Deoxys', 'Deoxys-Attack', 'Deoxys-Defense',
|
|
'Deoxys-Speed', 'Dialga', 'Dialga-Origin', 'Espathra', 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Gouging Fire', 'Groudon', 'Ho-Oh', 'Hoopa-Unbound',
|
|
'Iron Bundle', 'Koraidon', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Incarnate', 'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings',
|
|
'Necrozma-Dusk-Mane', 'Palafin', 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Regieleki', 'Reshiram', 'Shaymin-Sky', 'Sneasler', 'Solgaleo', 'Terapagos', 'Ursaluna',
|
|
'Ursaluna-Bloodmoon', 'Urshifu-Single-Strike', 'Urshifu-Rapid-Strike', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', 'Arena Trap', 'Moody', 'Shadow Tag',
|
|
'Baton Pass', 'Last Respects', 'Shed Tail',
|
|
],
|
|
onSwitchIn(pokemon) {
|
|
this.add('-start', pokemon, pokemon.getNature().name, '[silent]');
|
|
},
|
|
battle: {
|
|
statModify(baseStats, set, statName) {
|
|
const tr = this.trunc;
|
|
const nature = this.dex.natures.get(set.nature);
|
|
let baseStatName = statName;
|
|
if (nature.plus) {
|
|
if (statName === nature.minus) {
|
|
baseStatName = nature.plus;
|
|
} else if (statName === nature.plus) {
|
|
baseStatName = nature.minus!;
|
|
}
|
|
}
|
|
let stat = baseStats[baseStatName];
|
|
if (statName === 'hp') {
|
|
return tr(tr(2 * stat + set.ivs[statName] + tr(set.evs[statName] / 4) + 100) * set.level / 100 + 10);
|
|
}
|
|
stat = tr(tr(2 * stat + set.ivs[statName] + tr(set.evs[statName] / 4)) * set.level / 100 + 5);
|
|
if (nature.plus === statName) {
|
|
stat = this.ruleTable.has('overflowstatmod') ? Math.min(stat, 595) : stat;
|
|
stat = tr(tr(stat * 110, 16) / 100);
|
|
}
|
|
return stat;
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 9] Partners in Crime",
|
|
desc: `Doubles-based metagame where both active ally Pokémon share abilities and moves.`,
|
|
mod: 'partnersincrime',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
ruleset: ['Standard Doubles', 'Evasion Abilities Clause'],
|
|
banlist: [
|
|
'Annihilape', 'Arceus', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Cresselia', 'Darkrai', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', 'Eternatus', 'Flutter Mane',
|
|
'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Koraidon', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Miraidon',
|
|
'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Oricorio', 'Oricorio-Pa\'u', 'Oricorio-Pom-Pom', 'Oricorio-Sensu', 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Reshiram',
|
|
'Smeargle', 'Solgaleo', 'Terapagos', 'Urshifu', 'Urshifu-Rapid-Strike', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Contrary', 'Huge Power',
|
|
'Moody', 'Pure Power', 'Serene Grace', 'Shadow Tag', 'Stench', 'Bright Powder', 'King\'s Rock', 'Razor Fang', 'Ally Switch', 'Dragon Cheer', 'Last Respects',
|
|
'Revival Blessing', 'Swagger',
|
|
],
|
|
onBegin() {
|
|
for (const pokemon of this.getAllPokemon()) {
|
|
pokemon.m.trackPP = new Map<string, number>();
|
|
}
|
|
},
|
|
onBeforeSwitchIn(pokemon) {
|
|
pokemon.m.curMoves = this.dex.deepClone(pokemon.moves);
|
|
let ngas = false;
|
|
for (const poke of this.getAllActive()) {
|
|
if (this.toID(poke.ability) === ('neutralizinggas' as ID)) {
|
|
ngas = true;
|
|
break;
|
|
}
|
|
}
|
|
const BAD_ABILITIES = ['trace', 'imposter', 'neutralizinggas', 'illusion', 'wanderingspirit'];
|
|
const ally = pokemon.side.active.find(mon => mon && mon !== pokemon && !mon.fainted);
|
|
if (ally && ally.ability !== pokemon.ability) {
|
|
if (!pokemon.m.innate && !BAD_ABILITIES.includes(this.toID(ally.ability))) {
|
|
pokemon.m.innate = 'ability:' + ally.ability;
|
|
if (!ngas || ally.getAbility().flags['cantsuppress'] || pokemon.hasItem('Ability Shield')) {
|
|
pokemon.volatiles[pokemon.m.innate] = this.initEffectState({ id: pokemon.m.innate, target: pokemon, pic: ally });
|
|
}
|
|
}
|
|
if (!ally.m.innate && !BAD_ABILITIES.includes(this.toID(pokemon.ability))) {
|
|
ally.m.innate = 'ability:' + pokemon.ability;
|
|
if (!ngas || pokemon.getAbility().flags['cantsuppress'] || ally.hasItem('Ability Shield')) {
|
|
ally.volatiles[ally.m.innate] = this.initEffectState({ id: ally.m.innate, target: ally, pic: pokemon });
|
|
}
|
|
}
|
|
}
|
|
},
|
|
// Starting innate abilities in scripts
|
|
onSwitchOut(pokemon) {
|
|
if (pokemon.m.innate) {
|
|
pokemon.removeVolatile(pokemon.m.innate);
|
|
delete pokemon.m.innate;
|
|
}
|
|
const ally = pokemon.side.active.find(mon => mon && mon !== pokemon && !mon.fainted);
|
|
if (ally?.m.innate) {
|
|
ally.removeVolatile(ally.m.innate);
|
|
delete ally.m.innate;
|
|
}
|
|
},
|
|
onFaint(pokemon) {
|
|
if (pokemon.m.innate) {
|
|
pokemon.removeVolatile(pokemon.m.innate);
|
|
delete pokemon.m.innate;
|
|
}
|
|
const ally = pokemon.side.active.find(mon => mon && mon !== pokemon && !mon.fainted);
|
|
if (ally?.m.innate) {
|
|
ally.removeVolatile(ally.m.innate);
|
|
delete ally.m.innate;
|
|
}
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 9] Passive Aggressive",
|
|
desc: `All forms of passive damage deal type-based damage based on the primary type of the Pokémon that inflicted the passive damage against the target Pokémon.`,
|
|
mod: 'passiveaggressive',
|
|
searchShow: false,
|
|
ruleset: ['Standard OMs', 'Sleep Moves Clause', 'Evasion Items Clause', 'Terastal Clause'],
|
|
banlist: [
|
|
'Annihilape', 'Arceus', 'Baxcalibur', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Deoxys-Attack', 'Deoxys-Normal', 'Dialga', 'Dialga-Origin', 'Eternatus', 'Flutter Mane',
|
|
'Gholdengo', 'Giratina', 'Giratina-Origin', 'Gouging Fire', 'Groudon', 'Ho-Oh', 'Iron Bundle', 'Koraidon', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Incarnate',
|
|
'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Ogerpon-Hearthflame', 'Palafin', 'Palkia', 'Palkia-Origin', 'Raging Bolt', 'Rayquaza',
|
|
'Reshiram', 'Shaymin-Sky', 'Sneasler', 'Solgaleo', 'Spectrier', 'Ursaluna-Bloodmoon', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', 'Arena Trap', 'Moody', 'Shadow Tag',
|
|
'Speed Boost', 'Heat Rock', 'King\'s Rock', 'Razor Fang', 'Quick Claw', 'Baton Pass', 'Last Respects', 'Shed Tail',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 9] Pokebilities",
|
|
desc: `Pokémon have all of their released abilities simultaneously.`,
|
|
mod: 'pokebilities',
|
|
searchShow: false,
|
|
ruleset: ['Standard OMs', 'Sleep Moves Clause'],
|
|
banlist: [
|
|
'Arceus', 'Annihilape', 'Archaludon', 'Basculegion', 'Basculegion-F', 'Baxcalibur', 'Braviary-Hisui', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Conkeldurr',
|
|
'Deoxys-Normal', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', 'Espathra', 'Eternatus', 'Excadrill', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Gouging Fire', 'Groudon',
|
|
'Ho-Oh', 'Iron Bundle', 'Kingambit', 'Koraidon', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Incarnate', 'Lugia', 'Lunala', 'Magearna', 'Miraidon', 'Mewtwo', 'Necrozma-Dusk-Mane',
|
|
'Necrozma-Dawn-Wings', 'Ogerpon-Hearthflame', 'Palafin', 'Palkia', 'Palkia-Origin', 'Porygon-Z', 'Rayquaza', 'Regieleki', 'Reshiram', 'Roaring Moon', 'Shaymin-Sky', 'Sneasler',
|
|
'Solgaleo', 'Spectrier', 'Terapagos', 'Ursaluna-Bloodmoon', 'Urshifu-Single-Strike', 'Urshifu-Rapid-Strike', 'Volcarona', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Crowned',
|
|
'Zekrom', 'Arena Trap', 'Moody', 'Shadow Tag', 'Bright Powder', 'Damp Rock', 'Icy Rock', 'King\'s Rock', 'Razor Fang', 'Smooth Rock', 'Baton Pass', 'Shed Tail', 'Last Respects',
|
|
],
|
|
onValidateSet(set) {
|
|
const species = this.dex.species.get(set.species);
|
|
const unSeenAbilities = Object.keys(species.abilities)
|
|
.filter(key => key !== 'S' && (key !== 'H' || !species.unreleasedHidden))
|
|
.map(key => species.abilities[key as "0" | "1" | "H" | "S"])
|
|
.filter(ability => ability !== set.ability);
|
|
if (unSeenAbilities.length && this.toID(set.ability) !== this.toID(species.abilities['S'])) {
|
|
for (const abilityName of unSeenAbilities) {
|
|
const banReason = this.ruleTable.check('ability:' + this.toID(abilityName));
|
|
if (banReason) {
|
|
return [`${set.name}'s ability ${abilityName} is ${banReason}.`];
|
|
}
|
|
}
|
|
}
|
|
},
|
|
onBegin() {
|
|
for (const pokemon of this.getAllPokemon()) {
|
|
if (pokemon.ability === this.toID(pokemon.species.abilities['S'])) {
|
|
continue;
|
|
}
|
|
pokemon.m.innates = Object.keys(pokemon.species.abilities)
|
|
.filter(key => key !== 'S' && (key !== 'H' || !pokemon.species.unreleasedHidden))
|
|
.map(key => this.toID(pokemon.species.abilities[key as "0" | "1" | "H" | "S"]))
|
|
.filter(ability => ability !== pokemon.ability);
|
|
}
|
|
},
|
|
onBeforeSwitchIn(pokemon) {
|
|
if (pokemon.m.innates) {
|
|
for (const innate of pokemon.m.innates) {
|
|
if (pokemon.hasAbility(innate)) continue;
|
|
const effect = 'ability:' + this.toID(innate);
|
|
pokemon.volatiles[effect] = this.initEffectState({ id: effect, target: pokemon });
|
|
}
|
|
}
|
|
},
|
|
onSwitchOut(pokemon) {
|
|
for (const innate of Object.keys(pokemon.volatiles).filter(i => i.startsWith('ability:'))) {
|
|
pokemon.removeVolatile(innate);
|
|
}
|
|
},
|
|
onFaint(pokemon) {
|
|
for (const innate of Object.keys(pokemon.volatiles).filter(i => i.startsWith('ability:'))) {
|
|
const innateEffect = this.dex.conditions.get(innate) as Effect;
|
|
this.singleEvent('End', innateEffect, null, pokemon);
|
|
}
|
|
},
|
|
onAfterMega(pokemon) {
|
|
for (const innate of Object.keys(pokemon.volatiles).filter(i => i.startsWith('ability:'))) {
|
|
pokemon.removeVolatile(innate);
|
|
}
|
|
pokemon.m.innates = undefined;
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 9] Pokemoves",
|
|
desc: `Put a Pokémon's name in a moveslot to turn them into a move. The move has 8 PP, 100% accuracy, and a category and Base Power matching their highest attacking stat. Use /pokemove for more info.`,
|
|
mod: 'pokemoves',
|
|
searchShow: false,
|
|
ruleset: ['Standard OMs', 'Sleep Moves Clause', 'Terastal Clause', 'Evasion Abilities Clause', 'Evasion Items Clause', 'Allowed Pokemoves = 1', 'Unique Pokemoves = 1'],
|
|
banlist: [
|
|
'Arceus', 'Annihilape', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Darkrai', 'Deoxys-Normal', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin',
|
|
'Dragapult', 'Espathra', 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Groudon', 'Hoopa-Unbound', 'Ho-Oh', 'Iron Bundle', 'Koraidon',
|
|
'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palafin',
|
|
'Palkia', 'Palkia-Origin', 'Rayquaza', 'Reshiram', 'Regieleki', 'Shaymin-Sky', 'Solgaleo', 'Spectrier', 'Urshifu', 'Urshifu-Rapid-Strike', 'Zacian',
|
|
'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', 'Arena Trap', 'Moody', 'Shadow Tag', 'Damp Rock', 'King\'s Rock', 'Razor Fang', 'Baton Pass',
|
|
'Last Respects', 'Shed Tail',
|
|
],
|
|
restricted: [
|
|
'Araquanid', 'Baxcalibur', 'Beartic', 'Cacnea', 'Cacturne', 'Chandelure', 'Conkeldurr', 'Crabominable', 'Cubchoo', 'Dewpider', 'Diglett', 'Diglett-Alola', 'Dragonite',
|
|
'Dugtrio', 'Dugtrio-Alola', 'Enamorus', 'Enamorus-Therian', 'Excadrill', 'Froslass', 'Gabite', 'Garchomp', 'Gholdengo', 'Gible', 'Glaceon', 'Glastrier', 'Great Tusk',
|
|
'Grimer-Base', 'Hatterene', 'Haxorus', 'Hoopa-Confined', 'Iron Hands', 'Iron Moth', 'Iron Thorns', 'Kingambit', 'Landorus-Therian', 'Medicham', 'Meditite', 'Metagross',
|
|
'Muk-Base', 'Ninetales-Alola', 'Polteageist', 'Porygon-Z', 'Raging Bolt', 'Rampardos', 'Regigigas', 'Rhyperior', 'Roaring Moon', 'Salamence', 'Sandshrew', 'Sandshrew-Alola',
|
|
'Sandslash', 'Sandslash-Alola', 'Skuntank', 'Slaking', 'Slither Wing', 'Stunky', 'Thundurus-Therian', 'Tyranitar', 'Ursaluna', 'Ursaluna-Bloodmoon', 'Vikavolt', 'Volcarona',
|
|
'Vulpix-Alola', 'Yanma', 'Yanmega',
|
|
],
|
|
validateSet(set, teamHas) {
|
|
let pokemoves = 0;
|
|
const problems: string[] = [];
|
|
const moves = [];
|
|
if (set.moves?.length) {
|
|
if (set.moves.length > this.ruleTable.maxMoveCount) {
|
|
problems.push(`${set.name} has ${set.moves.length} moves, which is more than the limit of ${this.ruleTable.maxMoveCount}.`);
|
|
return problems;
|
|
}
|
|
const originalMoves = [...set.moves];
|
|
set.moves = [];
|
|
for (const moveid of originalMoves) {
|
|
const pokemove = this.dex.species.get(moveid);
|
|
if (!pokemove.exists) {
|
|
set.moves.push(moveid);
|
|
continue;
|
|
}
|
|
if (pokemove.isNonstandard &&
|
|
!(this.ruleTable.has(`+pokemontag:${this.toID(pokemove.isNonstandard)}`) ||
|
|
this.ruleTable.has(`+pokemon:${pokemove.id}`) ||
|
|
this.ruleTable.has(`+basepokemon:${this.toID(pokemove.baseSpecies)}`))) {
|
|
problems.push(`${pokemove.isNonstandard} Pok\u00e9mon are not allowed to be used as Pokemoves.`);
|
|
continue;
|
|
}
|
|
if (this.ruleTable.isRestrictedSpecies(pokemove) || this.ruleTable.isBannedSpecies(pokemove)) {
|
|
problems.push(`${pokemove.name} is unable to be used as a Pokemove.`);
|
|
continue;
|
|
}
|
|
pokemoves++;
|
|
moves.push(moveid);
|
|
}
|
|
}
|
|
const allowedPokemoves = Number(this.ruleTable.valueRules.get('allowedpokemoves') || '1');
|
|
if (pokemoves > allowedPokemoves) {
|
|
problems.push(
|
|
`${set.species} has ${pokemoves} Pokemoves.`,
|
|
`(Pok\u00e9mon can only have ${allowedPokemoves} Pokemove${allowedPokemoves === 1 ? '' : 's'} each.)`
|
|
);
|
|
}
|
|
if (this.validateSet(set, teamHas)) {
|
|
return this.validateSet(set, teamHas);
|
|
}
|
|
set.moves.push(...moves);
|
|
return problems.length ? problems : null;
|
|
},
|
|
onBegin() {
|
|
for (const pokemon of this.getAllPokemon()) {
|
|
pokemon.m.pokemoves = [];
|
|
for (const move of pokemon.moves) {
|
|
const pokemove = this.dex.species.get(move);
|
|
if (pokemove.exists) {
|
|
pokemon.m.pokemoves.push(pokemove);
|
|
const idx = pokemon.moveSlots.findIndex(x => x.id === pokemove.id);
|
|
if (idx >= 0) {
|
|
pokemon.moveSlots[idx] = pokemon.baseMoveSlots[idx] = {
|
|
move: pokemove.name,
|
|
id: pokemove.id,
|
|
pp: 8,
|
|
maxpp: 8,
|
|
target: 'normal',
|
|
disabled: false,
|
|
disabledSource: '',
|
|
used: false,
|
|
};
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
onSwitchIn(pokemon) {
|
|
if (!pokemon.m.pokemoves?.length) return;
|
|
for (const pokemove of pokemon.m.pokemoves) {
|
|
this.add('-start', pokemon, pokemove.name, '[silent]');
|
|
}
|
|
},
|
|
onModifyMovePriority: 999,
|
|
onModifyMove(move, pokemon, target) {
|
|
const species = this.dex.species.get(move.id);
|
|
if (species.exists) {
|
|
move.type = species.types[0];
|
|
move.basePower = Math.max(species.baseStats['atk'], species.baseStats['spa']);
|
|
move.accuracy = 100;
|
|
move.flags = {};
|
|
move.flags['protect'] = 1;
|
|
move.category = species.baseStats['spa'] > species.baseStats['atk'] ? 'Special' :
|
|
species.baseStats['spa'] < species.baseStats['atk'] ? 'Physical' :
|
|
pokemon.getStat('atk', false, true) > pokemon.getStat('spa', false, true) ? 'Physical' :
|
|
'Special';
|
|
move.onAfterHit = function (t, s, m) {
|
|
if (s.getAbility().name === species.abilities['0']) return;
|
|
const effect = 'ability:' + this.toID(species.abilities['0']);
|
|
if (s.volatiles[effect]) return;
|
|
s.addVolatile(effect);
|
|
if (s.volatiles[effect]) {
|
|
(s.volatiles[effect] as any).id = this.toID(effect);
|
|
(s.volatiles[effect] as any).target = s;
|
|
}
|
|
};
|
|
move.onAfterSubDamage = function (d, t, s, m) {
|
|
if (s.getAbility().name === species.abilities['0']) return;
|
|
const effect = 'ability:' + this.toID(species.abilities['0']);
|
|
if (s.volatiles[effect]) return;
|
|
s.addVolatile(effect);
|
|
if (s.volatiles[effect]) {
|
|
(s.volatiles[effect] as any).id = this.toID(effect);
|
|
(s.volatiles[effect] as any).target = s;
|
|
}
|
|
};
|
|
}
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 9] Pure Hackmons",
|
|
desc: `Anything directly hackable onto a set (EVs, IVs, forme, ability, item, and move) and is usable in local battles is allowed.`,
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
ruleset: ['Team Preview', 'HP Percentage Mod', 'Cancel Mod', 'Hackmons Forme Legality', 'Species Reveal Clause', 'Endless Battle Clause'],
|
|
},
|
|
{
|
|
name: "[Gen 9] Relay Race",
|
|
desc: `The effects of the move Baton Pass are triggered upon manually withdrawing a Pokémon from battle.`,
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
ruleset: ['Standard OMs', 'Sleep Moves Clause', 'Terastal Clause'],
|
|
banlist: [
|
|
'Annihilape', 'Arceus', 'Archaludon', 'Baxcalibur', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chien-Pao', 'Chi-Yu', 'Deoxys-Attack', 'Deoxys-Normal', 'Dialga',
|
|
'Dialga-Origin', 'Enamorus-Incarnate', 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Gouging Fire', 'Groudon', 'Ho-Oh', 'Iron Bundle',
|
|
'Koraidon', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Incarnate', 'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings',
|
|
'Necrozma-Dusk-Mane', 'Ogerpon-Hearthflame', 'Ogerpon-Wellspring', 'Palafin', 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Reshiram', 'Shaymin-Sky', 'Sneasler',
|
|
'Solgaleo', 'Skeledirge', 'Spectrier', 'Ursaluna-Bloodmoon', 'Urshifu', 'Urshifu-Rapid-Strike', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom',
|
|
'Arena Trap', 'Moody', 'Sand Veil', 'Shadow Tag', 'Snow Cloak', 'Speed Boost', 'Bright Powder', 'King\'s Rock', 'Razor Fang', 'Clangorous Soul',
|
|
'Last Respects', 'Mud-Slap', 'Muddy Water', 'Night Daze', 'No Retreat', 'Perish Song', 'Sand Attack', 'Shell Smash', 'Smokescreen', 'Quiver Dance', 'Victory Dance',
|
|
],
|
|
actions: {
|
|
switchIn(pokemon, pos, sourceEffect, isDrag) {
|
|
if (!pokemon || pokemon.isActive) {
|
|
this.battle.hint("A switch failed because the Pokémon trying to switch in is already in.");
|
|
return false;
|
|
}
|
|
|
|
const side = pokemon.side;
|
|
if (pos >= side.active.length) {
|
|
throw new Error(`Invalid switch position ${pos} / ${side.active.length}`);
|
|
}
|
|
const oldActive = side.active[pos];
|
|
const unfaintedActive = oldActive?.hp ? oldActive : null;
|
|
if (unfaintedActive) {
|
|
oldActive.beingCalledBack = true;
|
|
let switchCopyFlag: 'copyvolatile' | 'shedtail' | boolean = false;
|
|
if (sourceEffect && typeof (sourceEffect as Move).selfSwitch) {
|
|
if (typeof (sourceEffect as Move).selfSwitch === 'string') {
|
|
switchCopyFlag = (sourceEffect as Move).selfSwitch!;
|
|
}
|
|
} else {
|
|
if (!isDrag && !sourceEffect) switchCopyFlag = 'copyvolatile';
|
|
}
|
|
if (!oldActive.skipBeforeSwitchOutEventFlag && !isDrag) {
|
|
this.battle.runEvent('BeforeSwitchOut', oldActive);
|
|
if (this.battle.gen >= 5) {
|
|
this.battle.eachEvent('Update');
|
|
}
|
|
}
|
|
oldActive.skipBeforeSwitchOutEventFlag = false;
|
|
if (!this.battle.runEvent('SwitchOut', oldActive)) {
|
|
// Warning: DO NOT interrupt a switch-out if you just want to trap a pokemon.
|
|
// To trap a pokemon and prevent it from switching out, (e.g. Mean Look, Magnet Pull)
|
|
// use the 'trapped' flag instead.
|
|
|
|
// Note: Nothing in the real games can interrupt a switch-out (except Pursuit KOing,
|
|
// which is handled elsewhere); this is just for custom formats.
|
|
return false;
|
|
}
|
|
if (!oldActive.hp) {
|
|
// a pokemon fainted from Pursuit before it could switch
|
|
return 'pursuitfaint';
|
|
}
|
|
|
|
// will definitely switch out at this point
|
|
|
|
oldActive.illusion = null;
|
|
this.battle.singleEvent('End', oldActive.getAbility(), oldActive.abilityState, oldActive);
|
|
this.battle.singleEvent('End', oldActive.getItem(), oldActive.itemState, oldActive);
|
|
|
|
// if a pokemon is forced out by Whirlwind/etc or Eject Button/Pack, it can't use its chosen move
|
|
this.battle.queue.cancelAction(oldActive);
|
|
|
|
let newMove = null;
|
|
if (this.battle.gen === 4 && sourceEffect) {
|
|
newMove = oldActive.lastMove;
|
|
}
|
|
if (switchCopyFlag) {
|
|
pokemon.copyVolatileFrom(oldActive, switchCopyFlag);
|
|
}
|
|
if (newMove) pokemon.lastMove = newMove;
|
|
oldActive.clearVolatile();
|
|
}
|
|
if (oldActive) {
|
|
oldActive.isActive = false;
|
|
oldActive.isStarted = false;
|
|
oldActive.usedItemThisTurn = false;
|
|
oldActive.statsRaisedThisTurn = false;
|
|
oldActive.statsLoweredThisTurn = false;
|
|
oldActive.position = pokemon.position;
|
|
if (oldActive.fainted) oldActive.status = '';
|
|
pokemon.position = pos;
|
|
side.pokemon[pokemon.position] = pokemon;
|
|
side.pokemon[oldActive.position] = oldActive;
|
|
}
|
|
pokemon.isActive = true;
|
|
side.active[pos] = pokemon;
|
|
pokemon.activeTurns = 0;
|
|
pokemon.activeMoveActions = 0;
|
|
for (const moveSlot of pokemon.moveSlots) {
|
|
moveSlot.used = false;
|
|
}
|
|
pokemon.abilityState = this.battle.initEffectState({ id: pokemon.ability, target: pokemon });
|
|
pokemon.itemState = this.battle.initEffectState({ id: pokemon.item, target: pokemon });
|
|
this.battle.runEvent('BeforeSwitchIn', pokemon);
|
|
if (sourceEffect) {
|
|
this.battle.add(isDrag ? 'drag' : 'switch', pokemon, pokemon.getFullDetails, `[from] ${sourceEffect}`);
|
|
} else {
|
|
this.battle.add(isDrag ? 'drag' : 'switch', pokemon, pokemon.getFullDetails);
|
|
}
|
|
if (isDrag && this.battle.gen === 2) pokemon.draggedIn = this.battle.turn;
|
|
pokemon.previouslySwitchedIn++;
|
|
|
|
if (isDrag && this.battle.gen >= 5) {
|
|
// runSwitch happens immediately so that Mold Breaker can make hazards bypass Clear Body and Levitate
|
|
this.runSwitch(pokemon);
|
|
} else {
|
|
this.battle.queue.insertChoice({ choice: 'runSwitch', pokemon });
|
|
}
|
|
|
|
return true;
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 9] Revelationmons",
|
|
desc: `The moves in the first slot(s) of a Pokémon's set have their types changed to match the Pokémon's type(s).`,
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
ruleset: ['Standard OMs', 'Sleep Clause Mod', 'Revelationmons Mod', 'Terastal Clause'],
|
|
banlist: [
|
|
'Arcanine-Hisui', 'Arceus', 'Archaludon', 'Barraskewda', 'Basculegion-M', 'Baxcalibur', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Darkrai',
|
|
'Deoxys-Normal', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', 'Dragapult', 'Dragonite', 'Enamorus-Incarnate', 'Espathra', 'Eternatus', 'Flutter Mane',
|
|
'Giratina', 'Giratina-Origin', 'Gliscor', 'Gouging Fire', 'Groudon', 'Ho-Oh', 'Iron Bundle', 'Kommo-o', 'Koraidon', 'Kyogre', 'Kyurem', 'Kyurem-Black',
|
|
'Kyurem-White', 'Landorus-Incarnate', 'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Noivern',
|
|
'Ogerpon-Hearthflame', 'Palafin', 'Palkia', 'Palkia-Origin', 'Polteageist', 'Rayquaza', 'Reshiram', 'Roaring Moon', 'Shaymin-Sky', 'Solgaleo', 'Spectrier',
|
|
'Ursaluna-Bloodmoon', 'Urshifu', 'Urshifu-Single-Strike', 'Zacian', 'Zacian-Crowned', 'Zekrom', 'Arena Trap', 'Moody', 'Shadow Tag', 'King\'s Rock',
|
|
'Razor Fang', 'Baton Pass', 'Last Respects', 'Shed Tail',
|
|
],
|
|
restricted: ['U-turn', 'Volt Switch'],
|
|
},
|
|
{
|
|
name: "[Gen 9] Sharing is Caring",
|
|
desc: `All Pokémon on a team share their items.`,
|
|
mod: 'sharingiscaring',
|
|
searchShow: false,
|
|
ruleset: ['Standard OMs', 'Evasion Items Clause', 'Sleep Moves Clause', 'Terastal Clause'],
|
|
banlist: [
|
|
'Arceus', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Darkrai', 'Deoxys-Normal', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', 'Espathra',
|
|
'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Iron Bundle', 'Koraidon', 'Kyogre', 'Kyurem-Black', 'Kyurem-White',
|
|
'Landorus-Incarnate', 'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palafin', 'Palkia',
|
|
'Palkia-Origin', 'Rayquaza', 'Regieleki', 'Reshiram', 'Shaymin-Sky', 'Solgaleo', 'Spectrier', 'Terapagos', 'Urshifu-Single-Strike', 'Zacian',
|
|
'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Arena Trap', 'Moody', 'Scope Lens', 'Shadow Tag', 'Choice Band', 'Choice Scarf',
|
|
'Choice Specs', 'Focus Band', 'Focus Sash', 'King\'s Rock', 'Quick Claw', 'Razor Fang', 'Baton Pass', 'Last Respects', 'Revival Blessing', 'Shed Tail',
|
|
],
|
|
onValidateRule() {
|
|
if (this.format.gameType !== 'singles') {
|
|
throw new Error(`Sharing is Caring currently does not support ${this.format.gameType} battles.`);
|
|
}
|
|
},
|
|
getSharedItems(pokemon) {
|
|
const items = new Set<string>();
|
|
for (const ally of pokemon.side.pokemon) {
|
|
if (!ally.item || ally.fainted) continue;
|
|
items.add(ally.item);
|
|
}
|
|
items.delete(pokemon.item);
|
|
return items;
|
|
},
|
|
onBeforeSwitchIn(pokemon) {
|
|
let format = this.format;
|
|
if (!format.getSharedItems) format = this.dex.formats.get('gen9sharingiscaring');
|
|
if (!pokemon.m.sharedItemsUsed) pokemon.m.sharedItemsUsed = [];
|
|
for (const item of format.getSharedItems!(pokemon)) {
|
|
if (pokemon.m.sharedItemsUsed.includes(item)) continue;
|
|
const effect = 'item:' + this.toID(item);
|
|
pokemon.volatiles[effect] = this.initEffectState({ id: effect, target: pokemon });
|
|
}
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 9] Tera Donation",
|
|
desc: `The first Pokémon sent out immediately terastallizes. The other Pokémon in the party inherit that Tera Type as an additional type.`,
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
ruleset: ['Standard OMs', 'Sleep Moves Clause', 'Tera Type Preview'],
|
|
banlist: [
|
|
'Annihilape', 'Arceus', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Darkrai', 'Deoxys-Normal', 'Deoxys-Attack', 'Deoxys-Speed', 'Dialga',
|
|
'Dialga-Origin', 'Espathra', 'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon', 'Flutter Mane', 'Ho-Oh', 'Hoopa-Unbound', 'Iron Bundle', 'Koraidon',
|
|
'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Incarnate', 'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings',
|
|
'Necrozma-Dusk-Mane', 'Palafin', 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Regieleki', 'Reshiram', 'Shaymin-Sky', 'Solgaleo', 'Spectrier', 'Terapagos',
|
|
'Urshifu', 'Urshifu-Rapid-Strike', 'Volcarona', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', 'Arena Trap', 'Moody', 'Shadow Tag',
|
|
'Booster Energy', 'Heat Rock', 'King\'s Rock', 'Razor Fang', 'Baton Pass', 'Last Respects', 'Shed Tail',
|
|
],
|
|
onValidateRule() {
|
|
if (this.dex.gen !== 9) {
|
|
throw new Error(`Tera Donation is not supported in generations without terastallization.`);
|
|
}
|
|
},
|
|
onSwitchIn(pokemon) {
|
|
if (this.turn === 0) {
|
|
this.actions.terastallize(pokemon);
|
|
const teraType = pokemon.teraType;
|
|
for (const poke of pokemon.side.pokemon) {
|
|
poke.m.thirdType = teraType;
|
|
}
|
|
}
|
|
if (!pokemon.terastallized) {
|
|
this.add('-start', pokemon, 'typechange', (pokemon.illusion || pokemon).getTypes(true).join('/'), '[silent]');
|
|
}
|
|
},
|
|
onModifyMove(move, pokemon, target) {
|
|
if (move.id === 'terablast') {
|
|
const teraType = pokemon.m.thirdType;
|
|
move.basePowerCallback = function (p, t, m) {
|
|
if ((p.terastallized || teraType) === 'Stellar') {
|
|
return 100;
|
|
}
|
|
return 80;
|
|
};
|
|
if (teraType) {
|
|
if (pokemon.getStat('atk', false, true) > pokemon.getStat('spa', false, true)) {
|
|
move.category = 'Physical';
|
|
}
|
|
if (teraType === "Stellar") {
|
|
move.self = { boosts: { atk: -1, spa: -1 } };
|
|
}
|
|
}
|
|
}
|
|
},
|
|
onModifyType(move, pokemon, target) {
|
|
if (move.id === 'terablast') {
|
|
const teraType = pokemon.m.thirdType;
|
|
if (teraType) {
|
|
move.type = teraType;
|
|
}
|
|
}
|
|
},
|
|
onPrepareHit(target, source, move) {
|
|
if (move.id === 'terablast' && source.m.thirdType) {
|
|
this.attrLastMove('[anim] Tera Blast ' + source.m.thirdType);
|
|
}
|
|
},
|
|
actions: {
|
|
modifyDamage(baseDamage, pokemon, target, move, suppressMessages) {
|
|
const tr = this.battle.trunc;
|
|
if (!move.type) move.type = '???';
|
|
const type = move.type;
|
|
|
|
baseDamage += 2;
|
|
|
|
if (move.spreadHit) {
|
|
// multi-target modifier (doubles only)
|
|
const spreadModifier = this.battle.gameType === 'freeforall' ? 0.5 : 0.75;
|
|
this.battle.debug(`Spread modifier: ${spreadModifier}`);
|
|
baseDamage = this.battle.modify(baseDamage, spreadModifier);
|
|
} else if (move.multihitType === 'parentalbond' && move.hit > 1) {
|
|
// Parental Bond modifier
|
|
const bondModifier = this.battle.gen > 6 ? 0.25 : 0.5;
|
|
this.battle.debug(`Parental Bond modifier: ${bondModifier}`);
|
|
baseDamage = this.battle.modify(baseDamage, bondModifier);
|
|
}
|
|
|
|
// weather modifier
|
|
baseDamage = this.battle.runEvent('WeatherModifyDamage', pokemon, target, move, baseDamage);
|
|
|
|
// crit - not a modifier
|
|
const isCrit = target.getMoveHitData(move).crit;
|
|
if (isCrit) {
|
|
baseDamage = tr(baseDamage * (move.critModifier || (this.battle.gen >= 6 ? 1.5 : 2)));
|
|
}
|
|
|
|
// random factor - also not a modifier
|
|
baseDamage = this.battle.randomizer(baseDamage);
|
|
|
|
// STAB
|
|
// The "???" type never gets STAB
|
|
// Not even if you Roost in Gen 4 and somehow manage to use
|
|
// Struggle in the same turn.
|
|
// (On second thought, it might be easier to get a MissingNo.)
|
|
if (type !== '???') {
|
|
let stab: number | [number, number] = 1;
|
|
|
|
const isSTAB = move.forceSTAB || pokemon.hasType(type) || pokemon.getTypes(false, true).includes(type);
|
|
if (isSTAB) {
|
|
stab = 1.5;
|
|
}
|
|
|
|
// The Stellar tera type makes this incredibly confusing
|
|
// If the move's type does not match one of the user's base types,
|
|
// the Stellar tera type applies a one-time 1.2x damage boost for that type.
|
|
//
|
|
// If the move's type does match one of the user's base types,
|
|
// then the Stellar tera type applies a one-time 2x STAB boost for that type,
|
|
// and then goes back to using the regular 1.5x STAB boost for those types.
|
|
if ((pokemon.terastallized || pokemon.m.thirdType) === 'Stellar') {
|
|
if (!pokemon.stellarBoostedTypes.includes(type)) {
|
|
stab = isSTAB ? 2 : [4915, 4096];
|
|
if (pokemon.species.name !== 'Terapagos-Stellar') {
|
|
pokemon.stellarBoostedTypes.push(type);
|
|
}
|
|
}
|
|
} else {
|
|
if (pokemon.terastallized === type && pokemon.getTypes(false, true).includes(type)) {
|
|
stab = 2;
|
|
}
|
|
stab = this.battle.runEvent('ModifySTAB', pokemon, target, move, stab);
|
|
}
|
|
|
|
baseDamage = this.battle.modify(baseDamage, stab);
|
|
}
|
|
|
|
// types
|
|
let typeMod = target.runEffectiveness(move);
|
|
typeMod = this.battle.clampIntRange(typeMod, -6, 6);
|
|
target.getMoveHitData(move).typeMod = typeMod;
|
|
if (typeMod > 0) {
|
|
if (!suppressMessages) this.battle.add('-supereffective', target);
|
|
|
|
for (let i = 0; i < typeMod; i++) {
|
|
baseDamage *= 2;
|
|
}
|
|
}
|
|
if (typeMod < 0) {
|
|
if (!suppressMessages) this.battle.add('-resisted', target);
|
|
|
|
for (let i = 0; i > typeMod; i--) {
|
|
baseDamage = tr(baseDamage / 2);
|
|
}
|
|
}
|
|
|
|
if (isCrit && !suppressMessages) this.battle.add('-crit', target);
|
|
|
|
if (pokemon.status === 'brn' && move.category === 'Physical' && !pokemon.hasAbility('guts')) {
|
|
if (this.battle.gen < 6 || move.id !== 'facade') {
|
|
baseDamage = this.battle.modify(baseDamage, 0.5);
|
|
}
|
|
}
|
|
|
|
// Generation 5, but nothing later, sets damage to 1 before the final damage modifiers
|
|
if (this.battle.gen === 5 && !baseDamage) baseDamage = 1;
|
|
|
|
// Final modifier. Modifiers that modify damage after min damage check, such as Life Orb.
|
|
baseDamage = this.battle.runEvent('ModifyDamage', pokemon, target, move, baseDamage);
|
|
|
|
if (move.isZOrMaxPowered && target.getMoveHitData(move).zBrokeProtect) {
|
|
baseDamage = this.battle.modify(baseDamage, 0.25);
|
|
this.battle.add('-zbroken', target);
|
|
}
|
|
|
|
// Generation 6-7 moves the check for minimum 1 damage after the final modifier...
|
|
if (this.battle.gen !== 5 && !baseDamage) return 1;
|
|
|
|
// ...but 16-bit truncation happens even later, and can truncate to 0
|
|
return tr(baseDamage, 16);
|
|
},
|
|
},
|
|
pokemon: {
|
|
getTypes(excludeAdded, preterastallized) {
|
|
if (!preterastallized && this.terastallized && this.terastallized !== 'Stellar') {
|
|
return [this.terastallized];
|
|
}
|
|
const types = this.battle.runEvent('Type', this, null, null, this.types);
|
|
if (!types.length) types.push(this.battle.gen >= 5 ? 'Normal' : '???');
|
|
if (!excludeAdded && this.addedType) return types.concat(this.addedType);
|
|
const addTeraType = this.m.thirdType;
|
|
if (addTeraType) return Array.from(new Set([...types, addTeraType]));
|
|
return types;
|
|
},
|
|
runEffectiveness(move) {
|
|
if ((this.terastallized || this.m.thirdType) && move.type === 'Stellar') return 1;
|
|
let totalTypeMod = 0;
|
|
for (const type of this.getTypes()) {
|
|
let typeMod = this.battle.dex.getEffectiveness(move, type);
|
|
typeMod = this.battle.singleEvent('Effectiveness', move, null, this, type, move, typeMod);
|
|
totalTypeMod += this.battle.runEvent('Effectiveness', this, type, move, typeMod);
|
|
}
|
|
return totalTypeMod;
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 9] Tera Override",
|
|
desc: `Any moves/items/abilities with mechanics relating to a specific type get that type replaced with the user's Tera type.`,
|
|
mod: 'teraoverride',
|
|
searchShow: false,
|
|
ruleset: ['Standard OMs', 'Evasion Abilities Clause', 'Evasion Items Clause', 'Tera Type Preview'],
|
|
banlist: [
|
|
'Annihilape', 'Arceus', 'Archaludon', 'Baxcalibur', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Deoxys-Attack', 'Deoxys-Normal', 'Dialga', 'Dialga-Origin', 'Espathra',
|
|
'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Groudon', 'Hawlucha', 'Ho-Oh', 'Iron Bundle', 'Koraidon', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Incarnate',
|
|
'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Ninetales-Alola', 'Ogerpon-Hearthflame', 'Palafin', 'Palkia', 'Palkia-Origin',
|
|
'Rayquaza', 'Regieleki', 'Reshiram', 'Roaring Moon', 'Shaymin-Sky', 'Sneasler', 'Solgaleo', 'Spectrier', 'Terapagos', 'Ursaluna-Bloodmoon', 'Urshifu', 'Urshifu-Rapid-Strike',
|
|
'Volcarona', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', 'Arena Trap', 'Magnet Pull', 'Moody', 'Shadow Tag', 'Focus Band', 'King\'s Rock', 'Razor Fang', 'Quick Claw',
|
|
'Baton Pass', 'Last Respects', 'Shed Tail', 'Weather Ball',
|
|
],
|
|
onSwitchIn(pokemon) {
|
|
this.add('-start', pokemon, pokemon.teraType, '[silent]');
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 9] The Card Game",
|
|
desc: `The type chart is simplified based off of the Pokémon Trading Card Game.`,
|
|
mod: 'thecardgame',
|
|
searchShow: false,
|
|
ruleset: ['Standard OMs', 'Sleep Moves Clause', 'Evasion Abilities Clause', 'Evasion Items Clause', 'Terastal Clause'],
|
|
banlist: [
|
|
'Annihilape', 'Arceus', 'Baxcalibur', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Deoxys-Normal', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin',
|
|
'Dragapult', 'Dragonite', 'Dudunsparce', 'Eternatus', 'Garchomp', 'Giratina', 'Giratina-Origin', 'Gouging Fire', 'Groudon', 'Haxorus', 'Ho-Oh', 'Hydreigon',
|
|
'Iron Valiant', 'Kommo-o', 'Koraidon', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Incarnate', 'Latias', 'Latios', 'Lugia', 'Lunala',
|
|
'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Noivern', 'Ogerpon-Hearthflame', 'Palafin', 'Palkia', 'Palkia-Origin', 'Raging Bolt',
|
|
'Rayquaza', 'Regidrago', 'Regieleki', 'Reshiram', 'Roaring Moon', 'Salamence', 'Shaymin-Sky', 'Solgaleo', 'Ursaluna', 'Ursaluna-Bloodmoon', 'Urshifu-Single-Strike',
|
|
'Walking Wake', 'Zacian', 'Zacian-Crowned', 'Zekrom', 'Arena Trap', 'Moody', 'Shadow Tag', 'Baton Pass', 'Last Respects', 'Shed Tail',
|
|
],
|
|
onBegin() {
|
|
for (const pokemon of this.getAllPokemon()) {
|
|
pokemon.hpType = pokemon.hpType.replace(/(Ghost|Fairy)/g, 'Psychic')
|
|
.replace(/Bug/g, 'Grass')
|
|
.replace(/Ice/g, 'Water')
|
|
.replace(/(Rock|Ground)/g, 'Fighting')
|
|
.replace(/Flying/g, 'Normal')
|
|
.replace(/Poison/g, 'Dark');
|
|
pokemon.teraType = pokemon.teraType.replace(/(Ghost|Fairy)/g, 'Psychic')
|
|
.replace(/Bug/g, 'Grass')
|
|
.replace(/Ice/g, 'Water')
|
|
.replace(/(Rock|Ground)/g, 'Fighting')
|
|
.replace(/Flying/g, 'Normal')
|
|
.replace(/Poison/g, 'Dark');
|
|
}
|
|
},
|
|
onSwitchIn(pokemon) {
|
|
this.add('-start', pokemon, 'typechange', (pokemon.illusion || pokemon).getTypes(true).join('/'), '[silent]');
|
|
pokemon.apparentType = pokemon.getTypes(true).join('/');
|
|
},
|
|
onAfterMega(pokemon) {
|
|
this.add('-start', pokemon, 'typechange', (pokemon.illusion || pokemon).getTypes(true).join('/'), '[silent]');
|
|
pokemon.apparentType = pokemon.getTypes(true).join('/');
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 9] The Loser's Game",
|
|
desc: `The first player to lose all of their Pokémon wins.`,
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
ruleset: ['Standard OMs', 'Sleep Clause Mod', '!OHKO Clause', 'Picked Team Size = 6', 'Adjust Level = 100'],
|
|
banlist: ['Infiltrator', 'Choice Scarf', 'Explosion', 'Final Gambit', 'Healing Wish', 'Lunar Dance', 'Magic Room', 'Memento', 'Misty Explosion', 'Self-Destruct'],
|
|
onValidateTeam(team) {
|
|
const familyTable = new Set<ID>();
|
|
for (const set of team) {
|
|
let species = this.dex.species.get(set.species);
|
|
while (species.prevo) {
|
|
species = this.dex.species.get(species.prevo);
|
|
}
|
|
if (familyTable.has(species.id)) {
|
|
return [
|
|
`You are limited to one Pokémon from each family by the Family Clause.`,
|
|
`(You have more than one evolution of ${species.name}.)`,
|
|
];
|
|
}
|
|
familyTable.add(species.id);
|
|
}
|
|
},
|
|
battle: {
|
|
tiebreak() {
|
|
if (this.ended) return false;
|
|
|
|
this.inputLog.push(`>tiebreak`);
|
|
this.add('message', "Time's up! Going to tiebreaker...");
|
|
const notFainted = this.sides.map(side => (
|
|
side.pokemon.filter(pokemon => !pokemon.fainted).length
|
|
));
|
|
this.add('-message', this.sides.map((side, i) => (
|
|
`${side.name}: ${notFainted[i]} Pokemon left`
|
|
)).join('; '));
|
|
const maxNotFainted = Math.max(...notFainted);
|
|
let tiedSides = this.sides.filter((side, i) => notFainted[i] === maxNotFainted);
|
|
if (tiedSides.length <= 1) {
|
|
return this.win(tiedSides[1]);
|
|
}
|
|
|
|
const hpPercentage = tiedSides.map(side => (
|
|
side.pokemon.map(pokemon => pokemon.hp / pokemon.maxhp).reduce((a, b) => a + b) * 100 / 6
|
|
));
|
|
this.add('-message', tiedSides.map((side, i) => (
|
|
`${side.name}: ${Math.round(hpPercentage[i])}% total HP left`
|
|
)).join('; '));
|
|
const maxPercentage = Math.max(...hpPercentage);
|
|
tiedSides = tiedSides.filter((side, i) => hpPercentage[i] === maxPercentage);
|
|
if (tiedSides.length <= 1) {
|
|
return this.win(tiedSides[1]);
|
|
}
|
|
|
|
const hpTotal = tiedSides.map(side => (
|
|
side.pokemon.map(pokemon => pokemon.hp).reduce((a, b) => a + b)
|
|
));
|
|
this.add('-message', tiedSides.map((side, i) => (
|
|
`${side.name}: ${Math.round(hpTotal[i])} total HP left`
|
|
)).join('; '));
|
|
const maxTotal = Math.max(...hpTotal);
|
|
tiedSides = tiedSides.filter((side, i) => hpTotal[i] === maxTotal);
|
|
if (tiedSides.length <= 1) {
|
|
return this.win(tiedSides[1]);
|
|
}
|
|
return this.tie();
|
|
},
|
|
checkWin(faintData) {
|
|
const team1PokemonLeft = this.sides[0].pokemonLeft;
|
|
const team2PokemonLeft = this.sides[1].pokemonLeft;
|
|
if (!team1PokemonLeft && !team2PokemonLeft) {
|
|
this.win(faintData?.target.side || null);
|
|
return true;
|
|
}
|
|
for (const side of this.sides) {
|
|
if (!side.pokemonLeft) {
|
|
this.win(side);
|
|
return true;
|
|
}
|
|
}
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 9] Tier Shift",
|
|
desc: `Pokémon below OU get their stats, excluding HP, boosted. UU/RUBL get +15, RU/NUBL get +20, NU/PUBL get +25, and PU or lower get +30.`,
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
ruleset: ['Standard OMs', 'Sleep Moves Clause', 'Terastal Clause', 'Evasion Clause', 'Tier Shift Mod'],
|
|
banlist: [
|
|
'Arceus', 'Calyrex-Shadow', 'Koraidon', 'Kyogre', 'Medicham', 'Miraidon', 'Necrozma-Dusk-Mane', 'Zacian-Crowned', 'Drizzle', 'Moody', 'Arena Trap', 'Shadow Tag',
|
|
'Baton Pass', 'Last Respects', 'Shed Tail', 'Heat Rock', 'King\'s Rock', 'Light Clay', 'Razor Fang',
|
|
],
|
|
unbanlist: ['Arceus-Bug', 'Arceus-Grass', 'Arceus-Ice'],
|
|
},
|
|
{
|
|
name: "[Gen 9] Trademarked",
|
|
desc: `Sacrifice your Pokémon's ability for a status move that activates on switch-in.`,
|
|
mod: 'trademarked',
|
|
searchShow: false,
|
|
ruleset: ['Standard OMs', 'Sleep Moves Clause'],
|
|
banlist: [
|
|
'Annihilape', 'Arceus', 'Calyrex-Ice', 'Calyrex-Shadow', 'Decidueye-Base', 'Deoxys-Attack', 'Deoxys-Base', 'Dialga', 'Dialga-Origin', 'Eternatus', 'Flutter Mane',
|
|
'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Hoopa-Unbound', 'Keldeo', 'Koraidon', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna',
|
|
'Mew', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Ogerpon-Hearthflame', 'Palkia', 'Palkia-Origin', 'Raging Bolt', 'Rayquaza', 'Reshiram',
|
|
'Slaking', 'Smeargle', 'Sneasler', 'Solgaleo', 'Spectrier', 'Urshifu-Base', 'Urshifu-Rapid-Strike', 'Volcarona', 'Weavile', 'Zacian', 'Zacian-Crowned', 'Zamazenta',
|
|
'Shaymin-Sky', 'Zekrom', 'Arena Trap', 'Moody', 'Shadow Tag', 'Light Clay', 'Baton Pass', 'Last Respects', 'Revival Blessing', 'Shed Tail',
|
|
],
|
|
restricted: [
|
|
'Agility', 'Baneful Bunker', 'Belly Drum', 'Block', 'Burning Bulwark', 'Chilly Reception', 'Confuse Ray', 'Copycat', 'Dragon Dance', 'Detect', 'Destiny Bond',
|
|
'Endure', 'Encore', 'Fairy Lock', 'Flatter', 'Focus Energy', 'Glare', 'Heal Bell', 'Ingrain', 'Instruct', 'Mean Look', 'move:Metronome', 'Nasty Plot', 'Parting Shot',
|
|
'Poison Gas', 'Poison Powder', 'Protect', 'Roar', 'Silk Trap', 'Spiky Shield', 'Sleep Talk', 'Shell Smash', 'Stun Spore', 'Substitute', 'Supersonic', 'Swagger',
|
|
'Sweet Kiss', 'Switcheroo', 'Swords Dance', 'Tail Glow', 'Tailwind', 'Taunt', 'Teeter Dance', 'Teleport', 'Thunder Wave', 'Toxic', 'Toxic Thread', 'Trick',
|
|
'Trick Room', 'Will-O-Wisp', 'Wish', 'Whirlwind',
|
|
],
|
|
onValidateTeam(team, format, teamHas) {
|
|
const problems = [];
|
|
if (!teamHas.trademarks) return;
|
|
for (const trademark of teamHas.trademarks.keys()) {
|
|
if (teamHas.trademarks.get(trademark) > 1) {
|
|
problems.push(`You are limited to 1 of each Trademark.`, `(You have ${teamHas.trademarks.get(trademark)} Pok\u00e9mon with ${trademark} as a Trademark.)`);
|
|
}
|
|
}
|
|
return problems;
|
|
},
|
|
validateSet(set, teamHas) {
|
|
const dex = this.dex;
|
|
const ability = dex.moves.get(set.ability);
|
|
if (!ability.exists) { // Not even a real move
|
|
return this.validateSet(set, teamHas);
|
|
}
|
|
// Absolute trademark bans
|
|
if (ability.category !== 'Status') {
|
|
return [`${ability.name} is not a status move and cannot be used as a trademark.`];
|
|
}
|
|
// Contingent trademark bans
|
|
if (this.ruleTable.isRestricted(`move:${ability.id}`)) {
|
|
return [`${ability.name} is restricted from being used as a trademark.`];
|
|
}
|
|
if (set.moves.map(this.toID).includes(ability.id)) {
|
|
return [`${set.name} may not use ${ability.name} as both a trademark and one of its moves simultaneously.`];
|
|
}
|
|
const customRules = this.format.customRules || [];
|
|
if (!customRules.includes('!obtainableabilities')) customRules.push('!obtainableabilities');
|
|
if (!customRules.includes('+noability')) customRules.push('+noability');
|
|
|
|
const TeamValidator: typeof import('../sim/team-validator').TeamValidator =
|
|
require('../sim/team-validator').TeamValidator;
|
|
|
|
const validator = new TeamValidator(dex.formats.get(`${this.format.id}@@@${customRules.join(',')}`));
|
|
const moves = set.moves;
|
|
set.moves = [ability.id];
|
|
set.ability = 'No Ability';
|
|
let problems = validator.validateSet(set, {}) || [];
|
|
if (problems.length) return problems;
|
|
set.moves = moves;
|
|
set.ability = 'No Ability';
|
|
problems = problems.concat(validator.validateSet(set, teamHas) || []);
|
|
set.ability = ability.id;
|
|
if (!teamHas.trademarks) teamHas.trademarks = new this.dex.Multiset<string>();
|
|
teamHas.trademarks.add(ability.name);
|
|
return problems.length ? problems : null;
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 9] Triples",
|
|
mod: 'gen9',
|
|
gameType: 'triples',
|
|
searchShow: false,
|
|
ruleset: ['Standard Doubles', 'Evasion Abilities Clause'],
|
|
banlist: [
|
|
'Annihilape', 'Arceus', 'Calyrex-Ice', 'Calyrex-Shadow', 'Darkrai', 'Dialga', 'Dialga-Origin', 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin',
|
|
'Groudon', 'Ho-Oh', 'Indeedee-M', 'Indeedee-F', 'Koraidon', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Miraidon',
|
|
'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Reshiram', 'Solgaleo', 'Terapagos', 'Urshifu', 'Urshifu-Rapid-Strike',
|
|
'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Moody', 'Shadow Tag', 'Bright Powder', 'King\'s Rock', 'Razor Fang',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 9] Type Split",
|
|
desc: `The Physical/Special split is reverted; All non-Status moves are Physical or Special depending on their type, no exceptions.`,
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
ruleset: ['Standard OMs', 'Sleep Moves Clause', 'Evasion Abilities Clause'],
|
|
banlist: [
|
|
'Annihilape', 'Arceus', 'Archaludon', 'Calyrex-Shadow', 'Chi-Yu', 'Darkrai', 'Deoxys-Normal', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', 'Espathra',
|
|
'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Iron Bundle', 'Koraidon', 'Kyogre', 'Kyurem-White', 'Landorus-Incarnate',
|
|
'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Regieleki',
|
|
'Reshiram', 'Shaymin-Sky', 'Sneasler', 'Solgaleo', 'Terapagos', 'Volcarona', 'Zacian-Crowned', 'Zamazenta-Crowned', 'Arena Trap', 'Moody', 'Shadow Tag',
|
|
'Bright Powder', 'Damp Rock', 'King\'s Rock', 'Razor Fang', 'Baton Pass', 'Last Respects', 'Shed Tail',
|
|
],
|
|
onModifyMovePriority: -1000,
|
|
onModifyMove(move, pokemon, target) {
|
|
if (move.category === 'Status') return;
|
|
const specialTypes = ['Dark', 'Dragon', 'Electric', 'Fairy', 'Fire', 'Grass', 'Ice', 'Psychic', 'Water'];
|
|
if (specialTypes.includes(move.type)) {
|
|
move.category = 'Special';
|
|
} else if (move.type === 'Stellar') {
|
|
move.category = pokemon.getStat('atk', false, true) > pokemon.getStat('spa', false, true) ? 'Physical' : 'Special';
|
|
} else {
|
|
move.category = 'Physical';
|
|
}
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 9] VoltTurn Mayhem",
|
|
desc: `Every move that targets a foe causes the user to switch out after use.`,
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
ruleset: ['Standard OMs', 'Sleep Moves Clause', 'VoltTurn Mayhem Mod'],
|
|
banlist: [
|
|
'Arceus', 'Chi-Yu', 'Chien-Pao', 'Calyrex-Ice', 'Calyrex-Shadow', 'Darkrai', 'Deoxys-Attack', 'Deoxys-Normal', 'Deoxys-Speed', 'Dialga', 'Dialga-Origin', 'Dragonite',
|
|
'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Gouging Fire', 'Groudon', 'Ho-Oh', 'Iron Bundle', 'Koraidon', 'Kyogre', 'Kyurem-Black', 'Kyurem-White',
|
|
'Lunala', 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palafin', 'Palkia', 'Palkia-Origin', 'Raging Bolt', 'Rayquaza', 'Regieleki',
|
|
'Reshiram', 'Shaymin-Sky', 'Solgaleo', 'Terapagos', 'Urshifu-Single-Strike', 'Zacian', 'Zacian-Crowned', 'Zekrom', 'King\'s Rock', 'Razor Fang', 'Fake Out',
|
|
'Last Respects', 'Revival Blessing',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 7] Pure Hackmons",
|
|
desc: `Anything that can be hacked in-game and is usable in local battles is allowed.`,
|
|
mod: 'gen7',
|
|
searchShow: false,
|
|
ruleset: ['-Nonexistent', 'Team Preview', 'HP Percentage Mod', 'Cancel Mod', 'Endless Battle Clause'],
|
|
},
|
|
|
|
// Temporary Tour Metas
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
{
|
|
section: "Temporary Tour Metas",
|
|
},
|
|
{
|
|
name: "[Gen 9] Mix and Mega LC",
|
|
desc: `Mega evolve any Pokémon with any mega stone, or transform them with Genesect Drives, Primal orbs, Origin orbs, Rusted items, Ogerpon Masks, Arceus Plates, and Silvally Memories with no limit. Mega and Primal boosts based on form changes from gen 7.`,
|
|
mod: 'mixandmega',
|
|
searchShow: false,
|
|
ruleset: ['Standard OMs', 'Little Cup', 'Sleep Clause Mod', 'Terastal Clause'],
|
|
banlist: [
|
|
'Basculin-White-Striped', 'Dunsparce', 'Duraludon', 'Meditite', 'Rufflet', 'Scyther', 'Sneasel', 'Sneasel-Hisui', 'Stantler', 'Moody',
|
|
'Absolite Z', 'Beedrillite', 'Blazikenite', 'Gengarite', 'Kangaskhanite', 'Lucarionite', 'Lucarionite Z', 'Mawilite', 'Medichamite', 'Pidgeotite', 'Zygardite',
|
|
'Baton Pass', 'Sticky Web',
|
|
],
|
|
restricted: [
|
|
'Aipom', 'Buizel', 'Cutiefly', 'Dratini', 'Elekid', 'Gastly', 'Girafarig', 'Gligar', 'Mienfoo',
|
|
'Misdreavus', 'Murkrow', 'Pawniard', 'Qwilfish-Hisui', 'Voltorb-Hisui', 'Wattrel', 'Yanma',
|
|
],
|
|
onValidateTeam(team) {
|
|
const itemTable = new Set<ID>();
|
|
for (const set of team) {
|
|
const item = this.dex.items.get(set.item);
|
|
if (!(item.forcedForme && !item.zMove) && !item.megaStone &&
|
|
!item.isPrimalOrb && !item.name.startsWith('Rusted')) continue;
|
|
const natdex = this.ruleTable.has('natdexmod');
|
|
if (natdex && item.id !== 'ultranecroziumz') continue;
|
|
const species = this.dex.species.get(set.species);
|
|
if (species.isNonstandard && !this.ruleTable.has(`+pokemontag:${this.toID(species.isNonstandard)}`)) {
|
|
return [`${species.baseSpecies} does not exist in gen 9.`];
|
|
}
|
|
if (((item.itemUser?.includes(species.name) || item.forcedForme === species.name) &&
|
|
!item.megaStone && !item.isPrimalOrb) || (natdex && species.name.startsWith('Necrozma-') &&
|
|
item.id === 'ultranecroziumz')) {
|
|
continue;
|
|
}
|
|
if (this.ruleTable.isRestrictedSpecies(species) || this.toID(set.ability) === 'powerconstruct') {
|
|
return [`${species.name} is not allowed to hold ${item.name}.`];
|
|
}
|
|
if (itemTable.has(item.id)) {
|
|
return [
|
|
`You are limited to one of each Mega Stone/Primal Orb/Rusted item/Origin item/Ogerpon Mask/Arceus Plate/Silvally Memory.`,
|
|
`(You have more than one ${item.name})`,
|
|
];
|
|
}
|
|
itemTable.add(item.id);
|
|
}
|
|
},
|
|
onBegin() {
|
|
for (const pokemon of this.getAllPokemon()) {
|
|
pokemon.m.originalSpecies = pokemon.baseSpecies.name;
|
|
}
|
|
},
|
|
onSwitchIn(pokemon) {
|
|
const originalSpecies = this.dex.species.get((pokemon.species as any).originalSpecies);
|
|
if (originalSpecies.exists && pokemon.m.originalSpecies !== originalSpecies.baseSpecies) {
|
|
// Place volatiles on the Pokémon to show its mega-evolved condition and details
|
|
this.add('-start', pokemon, originalSpecies.requiredItems?.[0] || originalSpecies.requiredItem || originalSpecies.requiredMove, '[silent]');
|
|
const oSpecies = this.dex.species.get(pokemon.m.originalSpecies);
|
|
if (oSpecies.types.join('/') !== pokemon.species.types.join('/')) {
|
|
this.add('-start', pokemon, 'typechange', pokemon.species.types.join('/'), '[silent]');
|
|
}
|
|
}
|
|
},
|
|
onSwitchOut(pokemon) {
|
|
const originalSpecies = this.dex.species.get((pokemon.species as any).originalSpecies);
|
|
if (originalSpecies.exists && pokemon.m.originalSpecies !== originalSpecies.baseSpecies) {
|
|
this.add('-end', pokemon, originalSpecies.requiredItems?.[0] || originalSpecies.requiredItem || originalSpecies.requiredMove, '[silent]');
|
|
}
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 8] Mix and Mega",
|
|
desc: `Mega evolve any Pokémon with any mega stone with no limit. Boosts based on mega evolution from gen 7.`,
|
|
mod: 'gen8mixandmega',
|
|
searchShow: false,
|
|
ruleset: ['Standard', 'Dynamax Clause', 'Overflow Stat Mod'],
|
|
banlist: [
|
|
'Calyrex-Shadow', 'Eternatus', 'Kyogre', 'Zacian', 'Zacian-Crowned', 'Moody', 'Shadow Tag', 'Beedrillite', 'Blazikenite',
|
|
'Gengarite', 'Kangaskhanite', 'Mawilite', 'Medichamite', 'Pidgeotite', 'Baton Pass', 'Electrify',
|
|
],
|
|
restricted: [
|
|
'Calyrex-Ice', 'Dialga', 'Gengar', 'Giratina', 'Groudon', 'Ho-Oh', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Marshadow', 'Melmetal', 'Mewtwo',
|
|
'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Regigigas', 'Reshiram', 'Urshifu', 'Urshifu-Rapid-Strike', 'Solgaleo',
|
|
'Xerneas', 'Yveltal', 'Zekrom', 'Power Construct',
|
|
],
|
|
onValidateTeam(team) {
|
|
const itemTable = new Set<ID>();
|
|
for (const set of team) {
|
|
const item = this.dex.items.get(set.item);
|
|
if (!item.megaStone) continue;
|
|
const species = this.dex.species.get(set.species);
|
|
const ability = this.dex.abilities.get(set.ability);
|
|
if (this.ruleTable.isRestricted(`item:${item.id}`) || this.ruleTable.isRestricted(`ability:${ability.id}`)) {
|
|
return [`${species.name} is not allowed to hold ${item.name}.`];
|
|
}
|
|
if (itemTable.has(item.id)) {
|
|
return [
|
|
`You are limited to one of each Mega Stone.`,
|
|
`(You have more than one ${item.name})`,
|
|
];
|
|
}
|
|
itemTable.add(item.id);
|
|
}
|
|
},
|
|
onBegin() {
|
|
for (const pokemon of this.getAllPokemon()) {
|
|
pokemon.m.originalSpecies = pokemon.baseSpecies.name;
|
|
}
|
|
},
|
|
onSwitchIn(pokemon) {
|
|
const originalSpecies = this.dex.species.get((pokemon.species as any).originalSpecies);
|
|
if (originalSpecies.exists && pokemon.m.originalSpecies !== originalSpecies.baseSpecies) {
|
|
// Place volatiles on the Pokémon to show its mega-evolved condition and details
|
|
this.add('-start', pokemon, originalSpecies.requiredItem || originalSpecies.requiredMove, '[silent]');
|
|
const oSpecies = this.dex.species.get(pokemon.m.originalSpecies);
|
|
if (oSpecies.types.join('/') !== pokemon.species.types.join('/')) {
|
|
this.add('-start', pokemon, 'typechange', pokemon.species.types.join('/'), '[silent]');
|
|
}
|
|
}
|
|
},
|
|
onSwitchOut(pokemon) {
|
|
const originalSpecies = this.dex.species.get((pokemon.species as any).originalSpecies);
|
|
if (originalSpecies.exists && pokemon.m.originalSpecies !== originalSpecies.baseSpecies) {
|
|
this.add('-end', pokemon, originalSpecies.requiredItem || originalSpecies.requiredMove, '[silent]');
|
|
}
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 7] Mix and Mega",
|
|
desc: `Mega evolve any Pokémon with any mega stone, or transform them with Primal orbs, with no limit.`,
|
|
mod: 'gen7mixandmega',
|
|
searchShow: false,
|
|
ruleset: ['Standard', 'Mega Rayquaza Clause', 'Overflow Stat Mod'],
|
|
banlist: ['Shadow Tag', 'Gengarite', 'Baton Pass', 'Electrify'],
|
|
restricted: [
|
|
'Beedrillite', 'Blazikenite', 'Kangaskhanite', 'Mawilite', 'Medichamite', 'Pidgeotite', 'Ultranecrozium Z', 'Power Construct',
|
|
'Arceus', 'Deoxys-Attack', 'Deoxys-Normal', 'Deoxys-Speed', 'Dialga', 'Dragonite', 'Giratina', 'Groudon', 'Ho-Oh', 'Kyogre', 'Kyurem-Black', 'Kyurem-White',
|
|
'Landorus-Therian', 'Lugia', 'Lunala', 'Marshadow', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza',
|
|
'Regigigas', 'Reshiram', 'Shuckle', 'Slaking', 'Solgaleo', 'Xerneas', 'Yveltal', 'Zekrom',
|
|
],
|
|
onValidateTeam(team) {
|
|
const itemTable = new Set<ID>();
|
|
for (const set of team) {
|
|
const item = this.dex.items.get(set.item);
|
|
if (!item.megaStone && !item.isPrimalOrb && item.id !== 'ultranecroziumz') continue;
|
|
const species = this.dex.species.get(set.species);
|
|
const ability = this.dex.abilities.get(set.ability);
|
|
if ((this.ruleTable.isRestrictedSpecies(species) || this.ruleTable.isRestricted(`item:${item.id}`) ||
|
|
this.ruleTable.isRestricted(`ability:${ability.id}`)) &&
|
|
!(((item.megaStone || item.isPrimalOrb) && item.itemUser?.includes(species.baseSpecies) ||
|
|
(item.id === 'ultranecroziumz' && species.name.startsWith('Necrozma-'))))) {
|
|
return [`${species.name} is not allowed to hold ${item.name}.`];
|
|
}
|
|
if (itemTable.has(item.id)) {
|
|
return [
|
|
`You are limited to one of each Mega Stone/Primal Orb.`,
|
|
`(You have more than one ${item.name})`,
|
|
];
|
|
}
|
|
itemTable.add(item.id);
|
|
}
|
|
},
|
|
onBegin() {
|
|
for (const pokemon of this.getAllPokemon()) {
|
|
pokemon.m.originalSpecies = pokemon.baseSpecies.name;
|
|
}
|
|
},
|
|
onSwitchIn(pokemon) {
|
|
const originalSpecies = this.dex.species.get((pokemon.species as any).originalSpecies);
|
|
if (originalSpecies.exists && pokemon.m.originalSpecies !== originalSpecies.baseSpecies) {
|
|
// Place volatiles on the Pokémon to show its mega-evolved condition and details
|
|
this.add('-start', pokemon, originalSpecies.requiredItem || originalSpecies.requiredMove, '[silent]');
|
|
const oSpecies = this.dex.species.get(pokemon.m.originalSpecies);
|
|
if (oSpecies.types.join('/') !== pokemon.species.types.join('/')) {
|
|
this.add('-start', pokemon, 'typechange', pokemon.species.types.join('/'), '[silent]');
|
|
}
|
|
}
|
|
},
|
|
onSwitchOut(pokemon) {
|
|
const originalSpecies = this.dex.species.get((pokemon.species as any).originalSpecies);
|
|
if (originalSpecies.exists && pokemon.m.originalSpecies !== originalSpecies.baseSpecies) {
|
|
this.add('-end', pokemon, originalSpecies.requiredItem || originalSpecies.requiredMove, '[silent]');
|
|
}
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 6] Mix and Mega",
|
|
desc: `Mega evolve any Pokémon with any mega stone, or transform them with Primal orbs, with no limit.`,
|
|
mod: 'gen6mixandmega',
|
|
searchShow: false,
|
|
ruleset: ['Standard', 'Swagger Clause', 'Mega Rayquaza Clause', 'Overflow Stat Mod', '!Sleep Clause Mod', 'Sleep Moves Clause'],
|
|
banlist: ['Shadow Tag', 'Gengarite', 'Baton Pass', 'Electrify'],
|
|
restricted: [
|
|
'Beedrillite', 'Kangaskhanite', 'Mawilite', 'Medichamite', 'Arceus', 'Darkrai', 'Deoxys-Attack', 'Deoxys-Normal', 'Deoxys-Speed',
|
|
'Dialga', 'Dragonite', 'Entei', 'Genesect', 'Giratina', 'Groudon', 'Ho-Oh', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Lugia',
|
|
'Manaphy', 'Mewtwo', 'Palkia', 'Rayquaza', 'Regigigas', 'Reshiram', 'Shaymin-Sky', 'Slaking', 'Xerneas', 'Yveltal', 'Zekrom',
|
|
],
|
|
onValidateTeam(team) {
|
|
const itemTable = new Set<ID>();
|
|
for (const set of team) {
|
|
const item = this.dex.items.get(set.item);
|
|
if (!item.megaStone && !item.isPrimalOrb) continue;
|
|
const species = this.dex.species.get(set.species);
|
|
if ((this.ruleTable.isRestrictedSpecies(species) || this.ruleTable.isRestricted(`item:${item.id}`)) &&
|
|
!((item.megaStone || item.isPrimalOrb) && item.itemUser?.includes(species.baseSpecies))) {
|
|
return [`${species.name} is not allowed to hold ${item.name}.`];
|
|
}
|
|
if (itemTable.has(item.id)) {
|
|
return [
|
|
`You are limited to one of each Mega Stone/Primal Orb.`,
|
|
`(You have more than one ${item.name})`,
|
|
];
|
|
}
|
|
itemTable.add(item.id);
|
|
}
|
|
},
|
|
onBegin() {
|
|
for (const pokemon of this.getAllPokemon()) {
|
|
pokemon.m.originalSpecies = pokemon.baseSpecies.name;
|
|
}
|
|
},
|
|
onSwitchIn(pokemon) {
|
|
const originalSpecies = this.dex.species.get((pokemon.species as any).originalSpecies);
|
|
if (originalSpecies.exists && pokemon.m.originalSpecies !== originalSpecies.baseSpecies) {
|
|
// Place volatiles on the Pokémon to show its mega-evolved condition and details
|
|
this.add('-start', pokemon, originalSpecies.requiredItem || originalSpecies.requiredMove, '[silent]');
|
|
const oSpecies = this.dex.species.get(pokemon.m.originalSpecies);
|
|
if (oSpecies.types.join('/') !== pokemon.species.types.join('/')) {
|
|
this.add('-start', pokemon, 'typechange', pokemon.species.types.join('/'), '[silent]');
|
|
}
|
|
}
|
|
},
|
|
onSwitchOut(pokemon) {
|
|
const originalSpecies = this.dex.species.get((pokemon.species as any).originalSpecies);
|
|
if (originalSpecies.exists && pokemon.m.originalSpecies !== originalSpecies.baseSpecies) {
|
|
this.add('-end', pokemon, originalSpecies.requiredItem || originalSpecies.requiredMove, '[silent]');
|
|
}
|
|
},
|
|
},
|
|
|
|
// National Dex
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
{
|
|
section: "National Dex",
|
|
},
|
|
{
|
|
name: "[Gen 9] National Dex",
|
|
mod: 'gen9',
|
|
ruleset: ['Standard NatDex', 'Terastal Clause'],
|
|
banlist: [
|
|
'ND Uber', 'ND AG', 'Arena Trap', 'Moody', 'Power Construct', 'Shadow Tag', 'King\'s Rock',
|
|
'Quick Claw', 'Razor Fang', 'Assist', 'Baton Pass', 'Last Respects', 'Shed Tail',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 8] National Dex",
|
|
mod: 'gen8',
|
|
ruleset: ['Standard NatDex', 'Dynamax Clause'],
|
|
banlist: ['ND Uber', 'Arena Trap', 'Moody', 'Power Construct', 'Shadow Tag', 'King\'s Rock', 'Razor Fang', 'Quick Claw', 'Baton Pass'],
|
|
},
|
|
|
|
// National Dex Other Tiers
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
{
|
|
section: "National Dex Other Tiers",
|
|
},
|
|
{
|
|
name: "[Gen 9] National Dex 35 Pokes",
|
|
desc: `Only 35 Pokémon are legal.`,
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
ruleset: [
|
|
'Standard NatDex',
|
|
'!Species Clause', 'Forme Clause', '!Sleep Clause Mod', 'Sleep Moves Clause', 'Terastal Clause', 'DryPass Clause', 'Mega Rayquaza Clause',
|
|
],
|
|
banlist: [
|
|
'ND Uber', 'ND AG', 'ND OU', 'ND UUBL', 'ND UU', 'ND RUBL', 'ND RU', 'ND NFE', 'ND LC',
|
|
'Battle Bond', 'Moody', 'Power Construct', 'Shadow Tag', 'Tangled Feet', 'Berserk Gene', 'Booster Energy', 'King\'s Rock', 'Quick Claw',
|
|
'Razor Fang', 'Last Respects', 'Shed Tail', 'Baton Pass + Contrary', 'Baton Pass + Rapid Spin', 'Baton Pass + Well-Baked Body',
|
|
],
|
|
unbanlist: [
|
|
'Aerodactyl-Base', 'Arctozolt', 'Armaldo', 'Armarouge', 'Bronzong', 'Centiskorch', 'Cherrim-Base', 'Cyclizar', 'Dhelmise', 'Dondozo',
|
|
'Drakloak', 'Empoleon', 'Glaceon', 'Golduck', 'Gyarados-Base', 'Jellicent', 'Jumpluff', 'Kecleon', 'Kilowattrel', 'Kingdra', 'Lunatone',
|
|
'Musharna', 'Noivern', 'Palossand', 'Pincurchin', 'Reuniclus', 'Revavroom', 'Sandslash-Alola', 'Snorlax', 'Solrock', 'Stonjourner',
|
|
'Tyranitar-Base', 'Vaporeon', 'Virizion', 'Wigglytuff', 'Ultranecrozium Z', 'Solganium Z', 'Lunalium Z', 'Mewnium Z', 'Marshadium Z', 'Yawn',
|
|
],
|
|
// Stupid hardcode
|
|
onValidateSet(set, format, setHas, teamHas) {
|
|
if (set.item) {
|
|
const item = this.dex.items.get(set.item);
|
|
if (item.megaStone && !(this.ruleTable.has(`+item:${item.id}`) || this.ruleTable.has(`+pokemontag:mega`))) {
|
|
return [`Mega Evolution is banned.`];
|
|
}
|
|
if (item.zMove && !(this.ruleTable.has(`+item:${item.id}`))) {
|
|
return [`${item.name} is banned.`];
|
|
}
|
|
}
|
|
const species = this.dex.species.get(set.species);
|
|
if (set.moves.map(x => this.toID(this.dex.moves.get(x).realMove) || x).includes('hiddenpower') &&
|
|
species.baseSpecies !== 'Unown' && !this.ruleTable.has(`+move:hiddenpower`)) {
|
|
return [`Hidden Power is banned.`];
|
|
}
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 9] National Dex Ubers",
|
|
mod: 'gen9',
|
|
ruleset: ['Standard NatDex', '!Evasion Clause', 'Evasion Moves Clause', 'Evasion Items Clause', 'Mega Rayquaza Clause'],
|
|
banlist: ['ND AG', 'Shedinja', 'Assist', 'Baton Pass'],
|
|
},
|
|
{
|
|
name: "[Gen 9] National Dex UU",
|
|
mod: 'gen9',
|
|
ruleset: ['[Gen 9] National Dex'],
|
|
banlist: ['ND OU', 'ND UUBL', 'Drizzle', 'Drought', 'Light Clay'],
|
|
},
|
|
{
|
|
name: "[Gen 9] National Dex Ubers UU",
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 9] National Dex Ubers'],
|
|
banlist: [
|
|
'Alomomola', 'Arceus-Normal', 'Arceus-Dark', 'Arceus-Ground', 'Calyrex-Ice', 'Chansey', 'Deoxys-Attack', 'Ditto', 'Dondozo', 'Eternatus', 'Giratina-Origin', 'Groudon-Primal',
|
|
'Hatterene', 'Ho-Oh', 'Kingambit', 'Kyogre-Primal', 'Lunala', 'Marshadow', 'Mewtwo-Mega-Y', 'Necrozma-Dusk-Mane', 'Necrozma-Ultra', 'Salamence-Mega', 'Smeargle', 'Yveltal',
|
|
'Zacian-Crowned', 'Zygarde-50%',
|
|
// UUBL
|
|
'Arceus-Dragon', 'Arceus-Fairy', 'Arceus-Fire', 'Arceus-Flying', 'Arceus-Ghost', 'Arceus-Water', 'Blaziken-Mega', 'Chi-Yu', 'Chien-Pao', 'Dracovish', 'Flutter Mane', 'Groudon',
|
|
'Kyogre', 'Kyurem-Black', 'Rayquaza', 'Shaymin-Sky', 'Zacian', 'Zekrom', 'Power Construct', 'Light Clay', 'Ultranecrozium Z', 'Last Respects',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 9] National Dex LC",
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
ruleset: ['Standard NatDex', 'Little Cup'],
|
|
banlist: [
|
|
'Aipom', 'Basculin-White-Striped', 'Clamperl', 'Corsola-Galar', 'Cutiefly', 'Drifloon', 'Dunsparce', 'Duraludon', 'Flittle', 'Girafarig',
|
|
'Gligar', 'Meditite', 'Misdreavus', 'Murkrow', 'Porygon', 'Qwilfish-Hisui', 'Rufflet', 'Scraggy', 'Scyther', 'Sneasel', 'Sneasel-Hisui',
|
|
'Stantler', 'Swirlix', 'Tangela', 'Voltorb-Hisui', 'Woobat', 'Yanma', 'Zigzagoon-Base', 'Chlorophyll', 'Moody', 'Eevium Z', 'King\'s Rock',
|
|
'Quick Claw', 'Razor Fang', 'Assist', 'Aurora Veil', 'Baton Pass', 'Dragon Rage', 'Sonic Boom', 'Sticky Web',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 9] National Dex Monotype",
|
|
mod: 'gen9',
|
|
ruleset: ['Standard NatDex', 'Same Type Clause', 'Terastal Clause'],
|
|
banlist: [
|
|
'Annihilape', 'Arceus', 'Baxcalibur', 'Blastoise-Mega', 'Blaziken', 'Blaziken-Mega', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Darkrai',
|
|
'Deoxys-Normal', 'Deoxys-Attack', 'Dialga', 'Dracovish', 'Dragapult', 'Espathra', 'Eternatus', 'Flutter Mane', 'Genesect', 'Gengar-Mega', 'Giratina',
|
|
'Giratina-Origin', 'Gouging Fire', 'Groudon', 'Ho-Oh', 'Hoopa-Unbound', 'Iron Bundle', 'Kangaskhan-Mega', 'Kartana', 'Kingambit', 'Koraidon', 'Kyogre',
|
|
'Kyurem-Black', 'Kyurem-White', 'Lucario-Mega', 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Mawile-Mega', 'Medicham-Mega', 'Metagross-Mega', 'Mewtwo',
|
|
'Miraidon', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Ogerpon-Hearthflame', 'Palafin', 'Palkia', 'Pheromosa', 'Rayquaza', 'Reshiram',
|
|
'Salamence-Mega', 'Shaymin-Sky', 'Solgaleo', 'Spectrier', 'Ursaluna-Bloodmoon', 'Urshifu-Single-Strike', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned',
|
|
'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Zygarde-50%', 'Zygarde-Complete', 'Moody', 'Shadow Tag', 'Power Construct', 'Booster Energy', 'Damp Rock',
|
|
'Focus Band', 'Icy Rock', 'King\'s Rock', 'Leppa Berry', 'Quick Claw', 'Razor Fang', 'Smooth Rock', 'Terrain Extender', 'Baton Pass',
|
|
'Last Respects', 'Shed Tail',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 9] National Dex Doubles",
|
|
mod: 'gen9',
|
|
gameType: 'doubles',
|
|
ruleset: ['Standard Doubles', 'NatDex Mod', 'Evasion Abilities Clause'],
|
|
banlist: [
|
|
'Annihilape', 'Arceus', 'Calyrex-Ice', 'Calyrex-Shadow', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', 'Espathra', 'Eternatus', 'Genesect', 'Gengar-Mega',
|
|
'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Koraidon', 'Kyogre', 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Melmetal', 'Metagross-Mega',
|
|
'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Necrozma-Ultra', 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Reshiram', 'Shedinja',
|
|
'Solgaleo', 'Stakataka', 'Terapagos', 'Urshifu', 'Urshifu-Rapid-Strike', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned',
|
|
'Zekrom', 'Zygarde-50%', 'Zygarde-Complete', 'Commander', 'Power Construct', 'Shadow Tag', 'Eevium Z', 'Assist', 'Coaching', 'Dark Void', 'Swagger',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 9] National Dex Doubles Ubers",
|
|
mod: 'gen9',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
ruleset: ['Standard Doubles', 'NatDex Mod', '!Gravity Sleep Clause'],
|
|
banlist: ['Shedinja', 'Assist'],
|
|
},
|
|
{
|
|
name: "[Gen 9] National Dex 1v1",
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
ruleset: ['Standard AG', 'NatDex Mod', 'Nickname Clause', 'Evasion Moves Clause', 'OHKO Clause', 'Species Clause', 'Sleep Moves Clause', 'Terastal Clause', 'Accuracy Moves Clause', 'Picked Team Size = 1', 'Max Team Size = 3'],
|
|
banlist: [
|
|
'Arceus', 'Archaludon', 'Blastoise-Mega', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Deoxys-Normal', 'Deoxys-Attack', 'Deoxys-Defense', 'Dialga', 'Dialga-Origin', 'Dragonite',
|
|
'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Gouging Fire', 'Groudon', 'Ho-Oh', 'Jirachi', 'Kangaskhan-Mega', 'Koraidon', 'Kyogre', 'Kyurem-Black', 'Kyurem-White',
|
|
'Lugia', 'Lunala', 'Marshadow', 'Melmetal', 'Metagross-Mega', 'Mew', 'Mewtwo', 'Mimikyu', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Ogerpon-Cornerstone', 'Palkia',
|
|
'Palkia-Origin', 'Rayquaza', 'Reshiram', 'Salamence-Mega', 'Shaymin-Sky', 'Snorlax', 'Solgaleo', 'Terapagos', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta',
|
|
'Zamazenta-Crowned', 'Zekrom', 'Moody', 'Focus Band', 'Focus Sash', 'Fightinium Z + Detect', 'Perish Song',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 9] National Dex AG",
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
ruleset: ['Standard AG', 'NatDex Mod'],
|
|
},
|
|
{
|
|
name: "[Gen 9] National Dex AAA",
|
|
desc: `Pokémon have access to almost any ability.`,
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
ruleset: ['Standard NatDex', '!Obtainable Abilities', 'Ability Clause = 2', '!Sleep Clause Mod', 'Sleep Moves Clause', 'Terastal Clause'],
|
|
banlist: [
|
|
'Alakazam-Mega', 'Annihilape', 'Arceus', 'Archeops', 'Baxcalibur', 'Blacephalon', 'Blastoise-Mega', 'Blaziken-Mega', 'Calyrex-Ice', 'Calyrex-Shadow', 'Ceruledge', 'Chien-Pao', 'Darkrai', 'Deoxys-Attack',
|
|
'Deoxys-Normal', 'Dialga', 'Dialga-Origin', 'Dracovish', 'Dragapult', 'Enamorus-Incarnate', 'Eternatus', 'Flutter Mane', 'Gengar-Mega', 'Giratina', 'Giratina-Origin', 'Gouging Fire', 'Groudon', 'Ho-Oh',
|
|
'Hoopa-Unbound', 'Iron Boulder', 'Iron Bundle', 'Iron Valiant', 'Kangaskhan-Mega', 'Kartana', 'Keldeo', 'Kingambit', 'Koraidon', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Lucario-Mega', 'Lugia',
|
|
'Lunala', 'Magearna', 'Marshadow', 'Melmetal', 'Mewtwo', 'Miraidon', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Noivern', 'Palkia', 'Palkia-Origin', 'Pheromosa', 'Raging Bolt', 'Rayquaza',
|
|
'Regigigas', 'Reshiram', 'Salamence-Mega', 'Shaymin-Sky', 'Shedinja', 'Slaking', 'Sneasler', 'Solgaleo', 'Spectrier', 'Urshifu', 'Urshifu-Rapid-Strike', 'Weavile', 'Xerneas', 'Xurkitree', 'Yveltal', 'Zacian',
|
|
'Zacian-Crowned', 'Zekrom', 'Zeraora', 'Zygarde-50%', 'Arena Trap', 'Comatose', 'Contrary', 'Fur Coat', 'Good as Gold', 'Gorilla Tactics', 'Huge Power', 'Ice Scales', 'Illusion', 'Imposter', 'Innards Out',
|
|
'Intrepid Sword', 'Magic Bounce', 'Magnet Pull', 'Moody', 'Neutralizing Gas', 'Orichalcum Pulse', 'Parental Bond', 'Poison Heal', 'Pure Power', 'Shadow Tag', 'Simple', 'Speed Boost', 'Stakeout', 'Triage',
|
|
'Unburden', 'Water Bubble', 'Wonder Guard', 'King\'s Rock', 'Light Clay', 'Assist', 'Baton Pass', 'Electrify', 'Last Respects', 'Shed Tail',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 9] National Dex BH",
|
|
desc: `Balanced Hackmons with National Dex elements mixed in.`,
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
ruleset: [
|
|
'Standard AG', 'NatDex Mod', '!Obtainable',
|
|
'Forme Clause', 'Sleep Moves Clause', 'Ability Clause = 2', 'OHKO Clause', 'Evasion Moves Clause', 'Dynamax Clause', 'CFZ Clause', 'Terastal Clause',
|
|
],
|
|
banlist: [
|
|
'Cramorant-Gorging', 'Calyrex-Shadow', 'Darmanitan-Galar-Zen', 'Eternatus-Eternamax', 'Greninja-Ash', 'Groudon-Primal', 'Rayquaza-Mega', 'Shedinja', 'Terapagos-Stellar', 'Arena Trap',
|
|
'Contrary', 'Gorilla Tactics', 'Hadron Engine', 'Huge Power', 'Illusion', 'Innards Out', 'Magnet Pull', 'Moody', 'Neutralizing Gas', 'Orichalcum Pulse', 'Parental Bond', 'Pure Power',
|
|
'Shadow Tag', 'Stakeout', 'Water Bubble', 'Wonder Guard', 'Gengarite', 'Berserk Gene', 'Belly Drum', 'Bolt Beak', 'Ceaseless Edge', 'Chatter', 'Double Iron Bash', 'Electrify', 'Imprison',
|
|
'Last Respects', 'Octolock', 'Rage Fist', 'Revival Blessing', 'Shed Tail', 'Shell Smash', 'Sleep Talk',
|
|
],
|
|
restricted: ['Arceus'],
|
|
onValidateTeam(team, format) {
|
|
// baseSpecies:count
|
|
const restrictedPokemonCount = new this.dex.Multiset<string>();
|
|
for (const set of team) {
|
|
const species = this.dex.species.get(set.species);
|
|
if (!this.ruleTable.isRestrictedSpecies(species)) continue;
|
|
restrictedPokemonCount.add(species.baseSpecies);
|
|
}
|
|
for (const [baseSpecies, count] of restrictedPokemonCount) {
|
|
if (count > 1) {
|
|
return [
|
|
`You are limited to one ${baseSpecies} forme.`,
|
|
`(You have ${count} ${baseSpecies} forme${count === 1 ? '' : 's'}.)`,
|
|
];
|
|
}
|
|
}
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 9] National Dex Godly Gift",
|
|
desc: `Each Pokémon receives one base stat from a God (Restricted Pokémon) depending on its position in the team. If there is no restricted Pokémon, it uses the Pokémon in the first slot.`,
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
ruleset: ['Standard NatDex', 'Terastal Clause', '!Sleep Clause Mod', 'Sleep Moves Clause', 'Godly Gift Mod', 'Mega Rayquaza Clause'],
|
|
banlist: [
|
|
'Blissey', 'Calyrex-Shadow', 'Chansey', 'Deoxys-Attack', 'Groudon-Primal', 'Koraidon', 'Miraidon', 'Shuckle', 'Xerneas',
|
|
'Arena Trap', 'Huge Power', 'Moody', 'Pure Power', 'Shadow Tag', 'Swift Swim', 'King\'s Rock', 'Quick Claw', 'Assist',
|
|
'Baton Pass', 'Last Respects', 'Shed Tail',
|
|
],
|
|
restricted: [
|
|
'Arceus', 'Blastoise-Mega', 'Blaziken-Mega', 'Calyrex-Ice', 'Chi-Yu', 'Chien-Pao', 'Darmanitan-Galar', 'Deoxys-Normal', 'Deoxys-Defense', 'Deoxys-Speed', 'Dialga', 'Dialga-Origin', 'Dracovish',
|
|
'Dragapult', 'Espathra', 'Eternatus', 'Flutter Mane', 'Genesect', 'Gengar Mega', 'Giratina', 'Giratina-Origin', 'Groudon', 'Hawlucha', 'Ho-Oh', 'Iron Bundle', 'Kangaskhan-Mega', 'Kingambit',
|
|
'Kyogre', 'Kyogre-Primal', 'Kyurem-Black', 'Kyurem-White', 'Lucario-Mega', 'Lugia', 'Lunala', 'Magearna', 'Marowak-Alola', 'Marshadow', 'Mawile-Mega', 'Medicham-Mega', 'Melmetal', 'Metagross-Mega',
|
|
'Mewtwo', 'Mewtwo-Mega-X', 'Mewtwo-Mega-Y', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Palkia-Origin', 'Pheromosa', 'Pikachu', 'Rayquaza', 'Reshiram', 'Sableye-Mega',
|
|
'Salamence-Mega', 'Serperior', 'Shaymin-Sky', 'Smeargle', 'Solgaleo', 'Spectrier', 'Swellow', 'Toxapex', 'Ursaluna', 'Ursaluna-Bloodmoon', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Crowned',
|
|
'Zekrom', 'Power Construct',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 9] National Dex STABmons",
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
ruleset: ['Standard NatDex', 'STABmons Move Legality', '!Sleep Clause Mod', 'Sleep Moves Clause', 'Terastal Clause'],
|
|
banlist: [
|
|
'Araquanid', 'Arceus', 'Azumarill', 'Baxcalibur', 'Blastoise-Mega', 'Blaziken-Mega', 'Basculegion', 'Basculegion-F', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao',
|
|
'Cloyster', 'Darkrai', 'Darmanitan-Galar', 'Deoxys-Attack', 'Deoxys-Normal', 'Dialga', 'Dialga-Origin', 'Dracovish', 'Dragapult', 'Dragonite', 'Enamorus-Incarnate', 'Espathra',
|
|
'Eternatus', 'Flutter Mane', 'Garchomp', 'Gengar-Mega', 'Genesect', 'Giratina', 'Giratina-Origin', 'Groudon', 'Gouging Fire', 'Ho-Oh', 'Iron Bundle', 'Kangaskhan-Mega',
|
|
'Kartana', 'Koraidon', 'Komala', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Incarnate', 'Lilligant-Hisui', 'Lucario-Mega', 'Lugia', 'Lunala', 'Magearna',
|
|
'Manaphy', 'Marshadow', 'Metagross-Mega', 'Mewtwo', 'Miraidon', 'Naganadel', 'Necrozma-Dusk-Mane', 'Necrozma-Dawn-Wings', 'Ogerpon-Hearthflame', 'Ogerpon-Wellspring', 'Palkia',
|
|
'Palkia-Origin', 'Porygon-Z', 'Pheromosa', 'Rayquaza', 'Reshiram', 'Salamence-Mega', 'Shaymin-Sky', 'Silvally', 'Solgaleo', 'Spectrier', 'Tapu Koko', 'Tapu Lele', 'Terapagos',
|
|
'Ursaluna-Bloodmoon', 'Urshifu-Single-Strike', 'Walking Wake', 'Xerneas', 'Xurkitree', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', 'Zoroark-Hisui',
|
|
'Zygarde-50%', 'Arena Trap', 'Moody', 'Shadow Tag', 'Power Construct', 'Damp Rock', 'King\'s Rock', 'Quick Claw', 'Razor Fang', 'Assist', 'Baton Pass', 'Last Respects',
|
|
'Shed Tail', 'Wicked Blow', 'Wicked Torque',
|
|
],
|
|
restricted: [
|
|
'Astral Barrage', 'Belly Drum', 'Bolt Beak', 'Chatter', 'Clangorous Soul', 'Dire Claw', 'Double Iron Bash', 'Dragon Energy', 'Electrify', 'Extreme Speed',
|
|
'Fillet Away', 'Final Gambit', 'Fishious Rend', 'Geomancy', 'Gigaton Hammer', 'No Retreat', 'Rage Fist', 'Revival Blessing', 'Shell Smash', 'Shift Gear', 'Thousand Arrows',
|
|
'Trick-or-Treat', 'Triple Arrows', 'V-create', 'Victory Dance',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 8] National Dex UU",
|
|
mod: 'gen8',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 8] National Dex'],
|
|
banlist: ['ND OU', 'ND UUBL', 'Drizzle', 'Drought', 'Light Clay', 'Slowbronite'],
|
|
},
|
|
{
|
|
name: "[Gen 8] National Dex RU",
|
|
mod: 'gen8',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 8] National Dex UU'],
|
|
banlist: ['ND UU', 'ND RUBL'],
|
|
},
|
|
{
|
|
name: "[Gen 8] National Dex Doubles",
|
|
mod: 'gen8',
|
|
// searchShow: false,
|
|
gameType: 'doubles',
|
|
ruleset: ['Standard Doubles', 'NatDex Mod', 'Evasion Abilities Clause'],
|
|
banlist: [
|
|
'Arceus', 'Calyrex-Ice', 'Calyrex-Shadow', 'Charizard', 'Dialga', 'Eternatus', 'Gengar-Mega', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kyogre', 'Kyurem-White',
|
|
'Lugia', 'Lunala', 'Magearna', 'Melmetal', 'Mewtwo', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Rayquaza', 'Regieleki', 'Reshiram', 'Solgaleo', 'Venusaur',
|
|
'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Zygarde-Complete', 'Power Construct', 'Shadow Tag', 'Weakness Policy',
|
|
'Ally Switch', 'Beat Up', 'Coaching', 'Dark Void', 'Guard Split', 'Swagger',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 8] National Dex Monotype",
|
|
mod: 'gen8',
|
|
searchShow: false,
|
|
ruleset: ['Standard NatDex', 'Same Type Clause', '!Evasion Clause', 'Evasion Moves Clause', 'Evasion Items Clause', 'Dynamax Clause'],
|
|
banlist: [
|
|
'Arceus', 'Blastoise-Mega', 'Blaziken', 'Blaziken-Mega', 'Calyrex-Ice', 'Calyrex-Shadow', 'Darkrai', 'Deoxys-Normal', 'Deoxys-Attack', 'Dialga', 'Dracovish', 'Dragapult',
|
|
'Eternatus', 'Genesect', 'Gengar-Mega', 'Giratina', 'Giratina-Origin', 'Greninja-Bond', 'Greninja-Ash', 'Groudon', 'Ho-Oh', 'Hoopa-Unbound', 'Kangaskhan-Mega', 'Kartana',
|
|
'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Lucario-Mega', 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Mawile-Mega', 'Medicham-Mega', 'Metagross-Mega', 'Mewtwo', 'Moltres-Galar',
|
|
'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Reshiram', 'Salamence-Mega', 'Shaymin-Sky', 'Solgaleo', 'Spectrier',
|
|
'Urshifu-Single-Strike', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Zygarde-50%', 'Zygarde-Complete', 'Battle Bond',
|
|
'Power Construct', 'Moody', 'Shadow Tag', 'Damp Rock', 'Focus Band', 'King\'s Rock', 'Quick Claw', 'Razor Fang', 'Smooth Rock', 'Terrain Extender', 'Baton Pass',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 8 DLC 1] National Dex AG",
|
|
mod: 'gen8dlc1',
|
|
searchShow: false,
|
|
ruleset: ['Standard AG', 'NatDex Mod'],
|
|
},
|
|
|
|
// Pet Mods
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
{
|
|
section: "Pet Mods",
|
|
},
|
|
{
|
|
name: "[Gen 6] Megas Revisited", // Roomtours
|
|
desc: `A Gen 6 metagame where every Mega Evolution was reevaluated and redesigned.`,
|
|
mod: 'gen6megasrevisited',
|
|
searchShow: false,
|
|
ruleset: ['Standard', 'Swagger Clause', 'Mega Data Mod'],
|
|
banlist: ['Uber', 'Arena Trap', 'Shadow Tag', 'Soul Dew', 'Baton Pass', 'Blaziken + Speed Boost'],
|
|
onBegin() {
|
|
this.add(`raw|<div class='broadcast-green'><b>Need help with all of the new Megas and abilities?<br />Then make sure to check out the <a href="https://docs.google.com/spreadsheets/d/1wK11cPHnPCmH7JFss6leKW6_-cumn3DuZA-YMzrzF-U/edit?usp=sharing" target="_blank">spreadsheet</a> or use /dt!</b></div>`);
|
|
this.add('-message', `Welcome to Megas Revisited!`);
|
|
this.add('-message', `This is a Generation 6 OU-based Pet Mod where every existing Mega Evolution has been redesigned.`);
|
|
this.add('-message', `You can find our thread and metagame resources here:`);
|
|
this.add('-message', `https://www.smogon.com/forums/threads/3713949/`);
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 9] Legends Z-A OU",
|
|
desc: `Speculative turn-based metagame using Pokémon obtainable in Legends: Z-A, but with National Dex learnsets.`,
|
|
threads: [
|
|
`• <a href="https://www.smogon.com/forums/threads/3772808/">Discussion</a>`,
|
|
`• <a href="https://www.smogon.com/forums/posts/10749086">List of Changes</a>`,
|
|
],
|
|
mod: 'gen9legendsou',
|
|
ruleset: ['Standard', 'Sleep Moves Clause', '!Sleep Clause Mod', 'Min Source Gen = 3', 'Terastal Clause'],
|
|
banlist: ['Uber', 'Arena Trap', 'Moody', 'Power Construct', 'Shadow Tag', 'King\'s Rock', 'Light Clay', 'Quick Claw', 'Razor Fang', 'Baton Pass', 'Last Respects', 'Shed Tail'],
|
|
},
|
|
|
|
// Randomized Metas
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
{
|
|
section: "Randomized Metas",
|
|
column: 3,
|
|
},
|
|
{
|
|
name: "[Gen 9] Random Roulette",
|
|
desc: `Random Battles in a random generation! [Gen 1] Random Battle - [Gen 9] Random Battle.`,
|
|
mod: 'randomroulette',
|
|
team: 'random',
|
|
bestOfDefault: true,
|
|
},
|
|
{
|
|
name: "[Gen 9] Super Staff Bros Ultimate",
|
|
desc: "The fifth iteration of Super Staff Bros is here! Battle with a random team of pokemon created by the sim staff.",
|
|
mod: 'gen9ssb',
|
|
debug: true,
|
|
team: 'randomStaffBros',
|
|
bestOfDefault: true,
|
|
ruleset: ['HP Percentage Mod', 'Cancel Mod', 'Sleep Clause Mod'],
|
|
onBegin() {
|
|
// TODO look into making an event to put this right after turn|1
|
|
// https://discordapp.com/channels/630837856075513856/630845310033330206/716126469528485909
|
|
// Requires client change
|
|
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-ultimate" target="_blank">Super Staff Bros: Ultimate Guide</a> or use /ssb to find out!</b></div>`);
|
|
if (this.ruleTable.has('dynamaxclause')) {
|
|
// Old joke format we're bringing back
|
|
this.add('message', 'Fox only');
|
|
this.add('message', 'No items');
|
|
this.add('message', 'Final Destination');
|
|
return;
|
|
} else if (this.ruleTable.has('zmoveclause')) {
|
|
// Old joke format we're bringing back
|
|
this.add('message', 'April Fool\'s Day');
|
|
return;
|
|
}
|
|
|
|
this.add('message', 'EVERYONE IS HERE!');
|
|
this.add('message', 'FIGHT!');
|
|
},
|
|
onSwitchInPriority: 100,
|
|
onSwitchIn(pokemon) {
|
|
let name: string = this.toID(pokemon.illusion ? pokemon.illusion.name : pokemon.name);
|
|
if (this.dex.species.get(name).exists || this.dex.moves.get(name).exists ||
|
|
this.dex.abilities.get(name).exists || name === 'blitz') {
|
|
// Certain pokemon have volatiles named after their id
|
|
// To prevent overwriting those, and to prevent accidentally leaking
|
|
// that a pokemon is on a team through the onStart even triggering
|
|
// at the start of a match, users with pokemon names will need their
|
|
// statuses to end in "user".
|
|
name = `${name}user`;
|
|
}
|
|
// Add the mon's status effect to it as a volatile.
|
|
const status = this.dex.conditions.get(name);
|
|
if (status?.exists) {
|
|
pokemon.addVolatile(name, pokemon);
|
|
}
|
|
if ((pokemon.illusion || pokemon).getTypes(true, true).join('/') !==
|
|
this.dex.forGen(9).species.get((pokemon.illusion || pokemon).species.name).types.join('/') &&
|
|
!pokemon.terastallized) {
|
|
this.add('-start', pokemon, 'typechange', (pokemon.illusion || pokemon).getTypes(true).join('/'), '[silent]');
|
|
}
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 9] Monotype Random Battle",
|
|
mod: 'gen9',
|
|
team: 'random',
|
|
bestOfDefault: true,
|
|
ruleset: ['Obtainable', 'Same Type Clause', 'HP Percentage Mod', 'Cancel Mod', 'Sleep Clause Mod', 'Illusion Level Mod'],
|
|
},
|
|
{
|
|
name: "[Gen 9] Random Battle (Shared Power, B12P6)",
|
|
desc: `[Gen 9] Random Battle with Team Preview, Bring 12 Pick 6, and Shared Power.`,
|
|
mod: 'sharedpower',
|
|
team: 'random',
|
|
bestOfDefault: true,
|
|
ruleset: ['[Gen 9] Random Battle', 'Team Preview', 'Max Team Size = 12', 'Picked Team Size = 6'],
|
|
onValidateRule() {
|
|
if (this.format.gameType !== 'singles') {
|
|
throw new Error(`Shared Power currently does not support ${this.format.gameType} battles.`);
|
|
}
|
|
},
|
|
onBeforeSwitchIn(pokemon) {
|
|
let format = this.format;
|
|
if (!format.getSharedPower) format = this.dex.formats.get('gen9sharedpower');
|
|
for (const ability of format.getSharedPower!(pokemon)) {
|
|
const effect = 'ability:' + this.toID(ability);
|
|
pokemon.volatiles[effect] = this.initEffectState({ id: effect, target: pokemon });
|
|
if (!pokemon.m.abils) pokemon.m.abils = [];
|
|
if (!pokemon.m.abils.includes(effect)) pokemon.m.abils.push(effect);
|
|
}
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 9] Random Battle Mayhem",
|
|
desc: `[Gen 9] Random Battle with Team Preview and elements of Camomons, Inverse, Scalemons, and Shared Power.`,
|
|
mod: 'sharedpower',
|
|
team: 'random',
|
|
bestOfDefault: true,
|
|
ruleset: ['[Gen 9] Random Battle', 'Team Preview', 'Camomons Mod', 'Inverse Mod', 'Scalemons Mod'],
|
|
onValidateRule() {
|
|
if (this.format.gameType !== 'singles') {
|
|
throw new Error(`Shared Power currently does not support ${this.format.gameType} battles.`);
|
|
}
|
|
},
|
|
onBeforeSwitchIn(pokemon) {
|
|
let format = this.format;
|
|
if (!format.getSharedPower) format = this.dex.formats.get('gen9sharedpower');
|
|
for (const ability of format.getSharedPower!(pokemon)) {
|
|
const effect = 'ability:' + this.toID(ability);
|
|
pokemon.volatiles[effect] = this.initEffectState({ id: effect, target: pokemon });
|
|
if (!pokemon.m.abils) pokemon.m.abils = [];
|
|
if (!pokemon.m.abils.includes(effect)) pokemon.m.abils.push(effect);
|
|
}
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 9] Battle Factory",
|
|
desc: `Randomized teams of Pokémon for a generated Smogon tier with sets that are competitively viable.`,
|
|
mod: 'gen9',
|
|
team: 'randomFactory',
|
|
bestOfDefault: true,
|
|
ruleset: ['Standard'],
|
|
onBegin() {
|
|
this.add(`raw|<div class="broadcast-blue"><b>Battle Factory Tier: ${this.teamGenerator.factoryTier}</b></div>`);
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 9] 1v1 Factory",
|
|
desc: `Randomized teams of Pokémon for a generated Smogon tier with sets that are competitively viable.`,
|
|
threads: [`• <a href="https://www.smogon.com/forums/threads/3775744/">1v1 Factory Set Discussion</a>`],
|
|
mod: 'gen9',
|
|
team: 'random1v1Factory',
|
|
bestOfDefault: true,
|
|
ruleset: ['[Gen 9] 1v1'],
|
|
},
|
|
{
|
|
name: "[Gen 9] BSS Factory",
|
|
desc: `Randomized 3v3 Singles featuring Pokémon and movesets popular in Battle Stadium Singles.`,
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
team: 'randomBSSFactory',
|
|
bestOfDefault: true,
|
|
ruleset: ['Flat Rules', 'VGC Timer'],
|
|
},
|
|
{
|
|
name: "[Gen 9] Draft Factory",
|
|
desc: `Randomized matchups sourced from various 6v6 singles draft leagues.`,
|
|
mod: 'gen9',
|
|
searchShow: false,
|
|
team: 'randomDraftFactory',
|
|
bestOfDefault: true,
|
|
ruleset: ['Standard Draft', '!Team Preview'],
|
|
onBegin() {
|
|
for (const pokemon of this.getAllPokemon()) {
|
|
if (!(pokemon.set as any).teraCaptain) pokemon.canTerastallize = null;
|
|
}
|
|
this.add('rule', 'Tera Captain Clause: Only Tera Captains can Terastallize');
|
|
},
|
|
onTeamPreview() {
|
|
this.add('clearpoke');
|
|
for (const pokemon of this.getAllPokemon()) {
|
|
const details = pokemon.details.replace(', shiny', '')
|
|
.replace(/(Greninja|Gourgeist|Pumpkaboo|Xerneas|Zacian|Zamazenta|Dudunsparce)(-[a-zA-Z?-]+)?/g, '$1-*');
|
|
this.add('poke', pokemon.side.id, details, '');
|
|
}
|
|
this.makeRequest('teampreview');
|
|
for (const side of this.sides) {
|
|
let buf = ``;
|
|
for (const pokemon of side.pokemon) {
|
|
if (!(pokemon.set as any).teraCaptain) continue;
|
|
buf += buf ? ` / ` : `raw|${side.name}'s Tera Captains:<br />`;
|
|
buf += `<psicon pokemon="${pokemon.species.id}" /><psicon type="${pokemon.teraType}" />`;
|
|
}
|
|
this.add(`${buf}`);
|
|
}
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 9] Baby Random Battle",
|
|
mod: 'gen9',
|
|
team: 'randomBaby',
|
|
bestOfDefault: true,
|
|
ruleset: ['Obtainable', 'Species Clause', 'HP Percentage Mod', 'Cancel Mod', 'Sleep Clause Mod', 'Illusion Level Mod'],
|
|
},
|
|
{
|
|
name: "[Gen 9] Hackmons Cup",
|
|
desc: `Randomized teams of level-balanced Pokémon with absolutely any ability, moves, and item.`,
|
|
mod: 'gen9',
|
|
team: 'randomHC',
|
|
bestOfDefault: true,
|
|
ruleset: ['HP Percentage Mod', 'Cancel Mod'],
|
|
banlist: ['CAP', 'Custom', 'Future', 'LGPE', 'MissingNo.', 'Pikachu-Cosplay', 'Pichu-Spiky-eared', 'Xerneas-Neutral'],
|
|
},
|
|
{
|
|
name: "[Gen 9] Doubles Hackmons Cup",
|
|
desc: `Randomized teams of level-balanced Pokémon with absolutely any ability, moves, and item. Now with TWICE the Pokémon per side!`,
|
|
mod: 'gen9',
|
|
team: 'randomHC',
|
|
searchShow: false,
|
|
bestOfDefault: true,
|
|
gameType: 'doubles',
|
|
ruleset: ['[Gen 9] Hackmons Cup'],
|
|
},
|
|
{
|
|
name: "[Gen 9] Broken Cup",
|
|
desc: `[Gen 9] Hackmons Cup but with only the most powerful Pokémon, moves, abilities, and items.`,
|
|
|
|
team: 'randomHC',
|
|
bestOfDefault: true,
|
|
ruleset: ['HP Percentage Mod', 'Cancel Mod'],
|
|
banlist: ['All Pokemon', 'All Abilities', 'All Items', 'All Moves'],
|
|
unbanlist: [
|
|
'10,000,000 Volt Thunderbolt', 'Abomasnow-Mega', 'Absol-Mega', 'Accelerock', 'Acid Spray', 'Adaptability', 'Aeroblast',
|
|
'Aerodactyl-Mega', 'Aftermath', 'Aggron', 'Aggron-Mega', 'Aguav Berry', 'Air Balloon', 'Air Slash', 'Alakazam-Mega',
|
|
'Alluring Voice', 'Altaria-Mega', 'Ampharos-Mega', 'Analytic', 'Anchor Shot', 'Anger Shell', 'Annihilape', 'Anticipation',
|
|
'Apple Acid', 'Aqua Step', 'Arcanine', 'Arcanine-Hisui', 'Archaludon', 'Archeops', 'Arena Trap', 'Armarouge', 'Armor Cannon',
|
|
'Aromatherapy', 'Articuno', 'Articuno-Galar', 'As One (Glastrier)', 'As One (Spectrier)', 'Assault Vest', 'Astral Barrage',
|
|
'Attack Order', 'Audino-Mega', 'Aura Sphere', 'Axe Kick', 'Azelf', 'Baddy Bad', 'Baneful Bunker', 'Banette-Mega',
|
|
'Barb Barrage', 'Basculegion', 'Basculegion-F', 'Baton Pass', 'Baxcalibur', 'Beads of Ruin', 'Beak Blast', 'Beast Boost',
|
|
'Behemoth Bash', 'Behemoth Blade', 'Belly Drum', 'Berserk', 'Bitter Blade', 'Bitter Malice', 'Blacephalon', 'Blastoise',
|
|
'Blastoise-Mega', 'Blaziken', 'Blaziken-Mega', 'Blazing Torque', 'Bleakwind Storm', 'Blissey', 'Blizzard', 'Blood Moon',
|
|
'Blue Flare', 'Blunder Policy', 'Body Press', 'Body Slam', 'Bolt Beak', 'Bolt Strike', 'Boomburst', 'Bouncy Bubble',
|
|
'Brave Bird', 'Bright Powder', 'Brute Bonnet', 'Bug Buzz', 'Bullet Punch', 'Burning Bulwark', 'Buzzwole', 'Buzzy Buzz',
|
|
'Calm Mind', 'Calyrex-Ice', 'Calyrex-Shadow', 'Camerupt-Mega', 'Catastropika', 'Ceaseless Edge', 'Celebi', 'Celesteela',
|
|
'Centiskorch', 'Ceruledge', 'Charizard', 'Charizard-Mega-X', 'Charizard-Mega-Y', 'Chatter', 'Chesnaught', 'Chesto Berry',
|
|
'Chi-Yu', 'Chien-Pao', 'Chilan Berry', 'Chilling Neigh', 'Chilly Reception', 'Choice Band', 'Choice Scarf', 'Choice Specs',
|
|
'Cinderace', 'Circle Throw', 'Clanging Scales', 'Clangorous Soul', 'Clangorous Soulblaze', 'Clear Amulet', 'Clear Body',
|
|
'Clear Smog', 'Close Combat', 'Cloyster', 'Cobalion', 'Coil', 'Collision Course', 'Comatose', 'Combat Torque', 'Competitive',
|
|
'Compound Eyes', 'Contrary', 'Core Enforcer', 'Cosmic Power', 'Cotton Guard', 'Court Change', 'Covert Cloak', 'Crabhammer',
|
|
'Cresselia', 'Crobat', 'Cross Chop', 'Curse', 'Custap Berry', 'Dark Pulse', 'Darkest Lariat', 'Darkrai',
|
|
'Darmanitan-Galar-Zen', 'Darmanitan-Zen', 'Decidueye', 'Decidueye-Hisui', 'Defend Order', 'Defiant', 'Defog', 'Delphox',
|
|
'Deoxys', 'Deoxys-Attack', 'Deoxys-Defense', 'Deoxys-Speed', 'Desolate Land', 'Dialga', 'Dialga-Origin', 'Diamond Storm',
|
|
'Diancie', 'Diancie-Mega', 'Dire Claw', 'Disable', 'Discharge', 'Dondozo', 'Doom Desire', 'Double Iron Bash', 'Download',
|
|
'Draco Meteor', 'Draco Plate', 'Dragapult', 'Dragon Ascent', 'Dragon Dance', 'Dragon Darts', 'Dragon Energy', 'Dragon Hammer',
|
|
'Dragon Pulse', 'Dragon Tail', 'Dragonite', 'Drain Punch', 'Dread Plate', 'Drill Peck', 'Drizzle', 'Drought', 'Drum Beating',
|
|
'Dry Skin', 'Duraludon', 'Dusknoir', 'Dynamax Cannon', 'Earth Eater', 'Earth Plate', 'Earth Power', 'Earthquake',
|
|
'Eerie Spell', 'Effect Spore', 'Eject Pack', 'Electivire', 'Electric Surge', 'Electro Drift', 'Emboar', 'Empoleon',
|
|
'Enamorus', 'Enamorus-Therian', 'Encore', 'Energy Ball', 'Entei', 'Eruption', 'Espeon', 'Esper Wing', 'Eternatus',
|
|
'Eternatus-Eternamax', 'Exeggutor', 'Exeggutor-Alola', 'Expanding Force', 'Expert Belt', 'Explosion', 'Extreme Evoboost',
|
|
'Extreme Speed', 'Fake Out', 'Feraligatr', 'Fezandipiti', 'Fickle Beam', 'Fiery Wrath', 'Figy Berry', 'Filter',
|
|
'Fire Blast', 'Fire Lash', 'First Impression', 'Fishious Rend', 'Fist Plate', 'Flame Body', 'Flame Charge', 'Flame Plate',
|
|
'Flamethrower', 'Flare Blitz', 'Flareon', 'Flash Cannon', 'Fleur Cannon', 'Flip Turn', 'Floaty Fall', 'Florges',
|
|
'Flower Trick', 'Fluffy', 'Flutter Mane', 'Focus Blast', 'Focus Sash', 'Forewarn', 'Foul Play', 'Freeze-Dry', 'Freezing Glare',
|
|
'Freezy Frost', 'Frost Breath', 'Full Metal Body', 'Fur Coat', 'Fusion Bolt', 'Fusion Flare', 'Future Sight', 'G-Max Befuddle',
|
|
'G-Max Cannonade', 'G-Max Centiferno', 'G-Max Resonance', 'G-Max Steelsurge', 'G-Max Stonesurge', 'G-Max Sweetness',
|
|
'G-Max Vine Lash', 'G-Max Volcalith', 'G-Max Wildfire', 'G-Max Wind Rage', 'Gallade-Mega', 'Garchomp', 'Garchomp-Mega',
|
|
'Gardevoir-Mega', 'Gear Grind', 'Genesect', 'Genesis Supernova', 'Gengar-Mega', 'Gholdengo', 'Giga Drain', 'Gigaton Hammer',
|
|
'Giratina', 'Giratina-Origin', 'Glaceon', 'Glacial Lance', 'Glaive Rush', 'Glalie-Mega', 'Glare', 'Glastrier', 'Glimmora',
|
|
'Glitzy Glow', 'Gogoat', 'Golisopod', 'Good as Gold', 'Goodra', 'Goodra-Hisui', 'Gooey', 'Gorilla Tactics', 'Gouging Fire',
|
|
'Grassy Surge', 'Grav Apple', 'Great Tusk', 'Greninja', 'Greninja-Ash', 'Grim Neigh', 'Groudon', 'Groudon-Primal',
|
|
'Guardian of Alola', 'Gunk Shot', 'Guzzlord', 'Gyarados', 'Gyarados-Mega', 'Hadron Engine', 'Hammer Arm', 'Haxorus',
|
|
'Haze', 'Head Charge', 'Head Smash', 'Headlong Rush', 'Heal Bell', 'Heal Order', 'Healing Wish', 'Heart Swap', 'Heat Crash',
|
|
'Heat Wave', 'Heatran', 'Heavy-Duty Boots', 'Heracross-Mega', 'High Horsepower', 'High Jump Kick', 'Hippowdon', 'Ho-Oh',
|
|
'Hone Claws', 'Hoopa', 'Hoopa-Unbound', 'Horn Leech', 'Houndoom-Mega', 'Huge Power', 'Hurricane', 'Hustle', 'Hydreigon',
|
|
'Hydrapple', 'Hydro Pump', 'Hydro Steam', 'Hyper Drill', 'Iapapa Berry', 'Ice Beam', 'Ice Hammer', 'Ice Scales', 'Ice Shard',
|
|
'Ice Spinner', 'Icicle Plate', 'Illusion', 'Imposter', 'Incineroar', 'Infernape', 'Innards Out', 'Insect Plate', 'Inteleon',
|
|
'Intimidate', 'Intrepid Sword', 'Iron Barbs', 'Iron Boulder', 'Iron Bundle', 'Iron Crown', 'Iron Hands', 'Iron Head',
|
|
'Iron Jugulis', 'Iron Leaves', 'Iron Moth', 'Iron Plate', 'Iron Tail', 'Iron Thorns', 'Iron Treads', 'Iron Valiant',
|
|
'Ivy Cudgel', 'Jet Punch', 'Jirachi', 'Jolteon', 'Judgment', 'Jungle Healing', 'Kangaskhan-Mega', 'Kartana', 'Keldeo',
|
|
'Keldeo-Resolute', 'King\'s Rock', 'King\'s Shield', 'Kingambit', 'Kingdra', 'Knock Off', 'Kommo-o', 'Koraidon', 'Kyogre',
|
|
'Kyogre-Primal', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus', 'Landorus-Therian', 'Lapras', 'Last Respects', 'Latias',
|
|
'Latias-Mega', 'Latios', 'Latios-Mega', 'Lava Plume', 'Leaf Blade', 'Leaf Storm', 'Leafeon', 'Leech Life', 'Leech Seed',
|
|
'Leftovers', 'Leppa Berry', 'Let\'s Snuggle Forever', 'Levitate', 'Libero', 'Liechi Berry', 'Life Orb', 'Light Screen',
|
|
'Light That Burns the Sky', 'Light of Ruin', 'Lightning Rod', 'Liquidation', 'Lopunny-Mega', 'Lovely Kiss', 'Low Kick',
|
|
'Lucario', 'Lucario-Mega', 'Lugia', 'Lum Berry', 'Lumina Crash', 'Lunala', 'Lunar Blessing', 'Lunar Dance', 'Lunge',
|
|
'Luster Purge', 'Mach Punch', 'Magearna', 'Magic Bounce', 'Magic Guard', 'Magical Torque', 'Magma Storm', 'Magmortar',
|
|
'Magnezone', 'Mago Berry', 'Make It Rain', 'Malicious Moonsault', 'Malignant Chain', 'Mamoswine', 'Manaphy', 'Manectric-Mega',
|
|
'Marshadow', 'Marvel Scale', 'Matcha Gotcha', 'Max Guard', 'Meadow Plate', 'Megahorn', 'Meganium', 'Melmetal', 'Meloetta',
|
|
'Meloetta-Pirouette', 'Memento', 'Menacing Moonraze Maelstrom', 'Mental Herb', 'Meowscarada', 'Mesprit', 'Metagross',
|
|
'Metagross-Mega', 'Meteor Mash', 'item: Metronome', 'Mew', 'Mewtwo', 'Mewtwo-Mega-X', 'Mewtwo-Mega-Y', 'Mighty Cleave',
|
|
'Milk Drink', 'Milotic', 'Mind Plate', 'Mind\'s Eye', 'Minimize', 'Miraidon', 'Mirror Herb', 'Mist Ball', 'Misty Surge',
|
|
'Mold Breaker', 'Moltres', 'Moltres-Galar', 'Moody', 'Moonblast', 'Moongeist Beam', 'Moonlight', 'Morning Sun', 'Mortal Spin',
|
|
'Mountain Gale', 'Moxie', 'Multiscale', 'Munkidori', 'Muscle Band', 'Mystical Fire', 'Mystical Power', 'Naganadel',
|
|
'Nasty Plot', 'Natural Cure', 'Nature\'s Madness', 'Necrozma', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Necrozma-Ultra',
|
|
'Neuroforce', 'Neutralizing Gas', 'Night Daze', 'Night Shade', 'Nihilego', 'No Retreat', 'Noivern', 'Noxious Torque',
|
|
'Nuzzle', 'Oblivion Wing', 'Obstruct', 'Oceanic Operetta', 'Octolock', 'Ogerpon', 'Ogerpon-Cornerstone', 'Ogerpon-Hearthflame',
|
|
'Ogerpon-Wellspring', 'Okidogi', 'Opportunist', 'Orichalcum Pulse', 'Origin Pulse', 'Outrage', 'Overdrive', 'Overheat',
|
|
'Pain Split', 'Palafin-Hero', 'Palkia', 'Palkia-Origin', 'Parental Bond', 'Parting Shot', 'Pecharunt', 'Perish Body',
|
|
'Perish Song', 'Petaya Berry', 'Pheromosa', 'Photon Geyser', 'Pidgeot-Mega', 'Pinsir-Mega', 'Pixie Plate', 'Plasma Fists',
|
|
'Play Rough', 'Poison Heal', 'Poison Point', 'Poison Touch', 'Pollen Puff', 'Poltergeist', 'Population Bomb', 'Porygon-Z',
|
|
'Power Gem', 'Power Trip', 'Power Whip', 'Prankster', 'Precipice Blades', 'Primarina', 'Primordial Sea', 'Prism Armor',
|
|
'Probopass', 'Protean', 'Protect', 'Psyblade', 'Psychic Fangs', 'Psychic Surge', 'Psychic', 'Psycho Boost', 'Psyshield Bash',
|
|
'Psystrike', 'Pulverizing Pancake', 'Pure Power', 'Purifying Salt', 'Pursuit', 'Pyro Ball', 'Quaquaval', 'Quick Claw',
|
|
'Quiver Dance', 'Rage Fist', 'Raging Bolt', 'Raging Bull', 'Raging Fury', 'Raikou', 'Rapid Spin', 'Rayquaza', 'Rayquaza-Mega',
|
|
'Razor Claw', 'Recover', 'Red Card', 'Reflect', 'Regenerator', 'Regice', 'Regidrago', 'Regieleki', 'Regigigas', 'Regirock',
|
|
'Registeel', 'Reshiram', 'Rest', 'Revelation Dance', 'Revival Blessing', 'Rhyperior', 'Rillaboom', 'Roar', 'Roaring Moon',
|
|
'Rocky Helmet', 'Roost', 'Rough Skin', 'Ruination', 'Sacred Fire', 'Sacred Sword', 'Salac Berry', 'Salamence', 'Salamence-Mega',
|
|
'Salt Cure', 'Samurott', 'Samurott-Hisui', 'Sandsear Storm', 'Sandy Shocks', 'Sap Sipper', 'Sappy Seed', 'Scald', 'Sceptile',
|
|
'Sceptile-Mega', 'Scizor-Mega', 'Scope Lens', 'Scream Tail', 'Searing Shot', 'Searing Sunraze Smash', 'Secret Sword',
|
|
'Seed Flare', 'Seismic Toss', 'Serene Grace', 'Serperior', 'Shadow Ball', 'Shadow Bone', 'Shadow Shield', 'Shadow Sneak',
|
|
'Shadow Tag', 'Sharpedo-Mega', 'Shaymin', 'Shaymin-Sky', 'Shed Skin', 'Shed Tail', 'Sheer Force', 'Shell Side Arm',
|
|
'Shell Smash', 'Shield Dust', 'Shift Gear', 'Silk Scarf', 'Silk Trap', 'Silvally', 'Simple', 'Sinister Arrow Raid',
|
|
'Sitrus Berry', 'Sizzly Slide', 'Skeledirge', 'Sky Plate', 'Slack Off', 'Slaking', 'Sleep Powder', 'Slither Wing',
|
|
'Slowbro-Mega', 'Sludge Bomb', 'Sludge Wave', 'Snarl', 'Snipe Shot', 'Snorlax', 'Soft-Boiled', 'Solgaleo', 'Solid Rock',
|
|
'Soul-Heart', 'Soul-Stealing 7-Star Strike', 'Spacial Rend', 'Sparkly Swirl', 'Spectral Thief', 'Spectrier', 'Speed Boost',
|
|
'Spikes', 'Spiky Shield', 'Spin Out', 'Spirit Break', 'Spirit Shackle', 'Splash Plate', 'Splintered Stormshards',
|
|
'Splishy Splash', 'Spooky Plate', 'Spore', 'Springtide Storm', 'Stakataka', 'Stakeout', 'Stamina', 'Static', 'Stealth Rock',
|
|
'Steam Eruption', 'Steelix-Mega', 'Sticky Web', 'Stoked Sparksurfer', 'Stone Axe', 'Stone Edge', 'Stone Plate', 'Stored Power',
|
|
'Storm Drain', 'Storm Throw', 'Strange Steam', 'Strength Sap', 'Sturdy', 'Sucker Punch', 'Suicune', 'Sunsteel Strike',
|
|
'Super Fang', 'Supercell Slam', 'Superpower', 'Supreme Overlord', 'Surf', 'Surging Strikes', 'Swampert', 'Swampert-Mega',
|
|
'Sword of Ruin', 'Swords Dance', 'Sylveon', 'Synthesis', 'Tablets of Ruin', 'Tachyon Cutter', 'Tail Glow', 'Tangling Hair',
|
|
'Tangrowth', 'Tapu Bulu', 'Tapu Fini', 'Tapu Koko', 'Tapu Lele', 'Taunt', 'Techno Blast', 'Teleport', 'Tera Blast',
|
|
'Tera Starstorm', 'Terapagos-Stellar', 'Terapagos-Terastal', 'Teravolt', 'Terrakion', 'Thermal Exchange', 'Thick Fat',
|
|
'Thousand Arrows', 'Thousand Waves', 'Throat Spray', 'Thunder Cage', 'Thunder Wave', 'Thunder', 'Thunderbolt', 'Thunderclap',
|
|
'Thunderous Kick', 'Thundurus', 'Thundurus-Therian', 'Tidy Up', 'Ting-Lu', 'Tinted Lens', 'Togekiss', 'Topsy-Turvy',
|
|
'Torch Song', 'Tornadus', 'Tornadus-Therian', 'Torterra', 'Tough Claws', 'Toxic Chain', 'Toxic Debris', 'Toxic Plate',
|
|
'Toxic Spikes', 'Toxic', 'Tri Attack', 'Triage', 'Triple Arrows', 'Triple Axel', 'Turboblaze', 'Type: Null', 'Typhlosion',
|
|
'Typhlosion-Hisui', 'Tyranitar', 'Tyranitar-Mega', 'U-turn', 'Umbreon', 'Unaware', 'Unburden', 'Ursaluna', 'Ursaluna-Bloodmoon',
|
|
'Urshifu', 'Urshifu-Rapid-Strike', 'Uxie', 'V-create', 'Vanilluxe', 'Vaporeon', 'Venusaur', 'Venusaur-Mega', 'Vessel of Ruin',
|
|
'Victini', 'Victory Dance', 'Virizion', 'Volcanion', 'Volcarona', 'Volt Absorb', 'Volt Switch', 'Volt Tackle', 'Walking Wake',
|
|
'Walrein', 'Water Absorb', 'Water Bubble', 'Water Shuriken', 'Water Spout', 'Waterfall', 'Wave Crash', 'Weakness Policy',
|
|
'Well-Baked Body', 'Whirlwind', 'White Herb', 'Wicked Blow', 'Wicked Torque', 'Wide Lens', 'Wiki Berry', 'Wild Charge',
|
|
'Wildbolt Storm', 'Will-O-Wisp', 'Wise Glasses', 'Wish', 'Wishiwashi-School', 'Wo-Chien', 'Wonder Guard', 'Wood Hammer',
|
|
'Wyrdeer', 'Xerneas', 'Xurkitree', 'Yawn', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zap Plate',
|
|
'Zapdos', 'Zapdos-Galar', 'Zarude', 'Zekrom', 'Zeraora', 'Zing Zap', 'Zippy Zap', 'Zygarde', 'Zygarde-Complete',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 9] Challenge Cup 1v1",
|
|
desc: `Get a randomized team of level-balanced Pokémon with absolutely any legal ability, moves, and item, and choose one to battle.`,
|
|
mod: 'gen9',
|
|
team: 'randomCC',
|
|
bestOfDefault: true,
|
|
ruleset: ['Obtainable', 'HP Percentage Mod', 'Cancel Mod', 'Team Preview', 'Terastal Clause', 'Picked Team Size = 1'],
|
|
},
|
|
{
|
|
name: "[Gen 9] Challenge Cup 2v2",
|
|
desc: `Get a randomized team of level-balanced Pokémon with absolutely any legal ability, moves, and item, and choose two to battle in a doubles format.`,
|
|
mod: 'gen9',
|
|
team: 'randomCC',
|
|
gameType: 'doubles',
|
|
bestOfDefault: true,
|
|
ruleset: ['Obtainable', 'HP Percentage Mod', 'Cancel Mod', 'Team Preview', 'Picked Team Size = 2'],
|
|
},
|
|
{
|
|
name: "[Gen 9] Challenge Cup 6v6",
|
|
desc: `Randomized teams of level-balanced Pokémon with absolutely any legal ability, moves, and item.`,
|
|
mod: 'gen9',
|
|
team: 'randomCC',
|
|
searchShow: false,
|
|
bestOfDefault: true,
|
|
ruleset: ['Obtainable', 'HP Percentage Mod', 'Cancel Mod'],
|
|
},
|
|
{
|
|
name: "[Gen 9] Metronome Battle",
|
|
mod: 'gen9',
|
|
gameType: 'doubles',
|
|
bestOfDefault: true,
|
|
ruleset: ['Max Team Size = 2', 'HP Percentage Mod', 'Cancel Mod'],
|
|
banlist: [
|
|
'Pokestar Spirit', 'Pecharunt', 'Terapagos', 'Shedinja + Sturdy', 'Cheek Pouch', 'Commander', 'Cursed Body', 'Dry Skin', 'Earth Eater', 'Fur Coat',
|
|
'Gorilla Tactics', 'Grassy Surge', 'Huge Power', 'Ice Body', 'Iron Barbs', 'Moody', 'Neutralizing Gas', 'Opportunist', 'Parental Bond', 'Perish Body',
|
|
'Poison Heal', 'Power Construct', 'Pressure', 'Pure Power', 'Rain Dish', 'Rough Skin', 'Sand Spit', 'Sand Stream', 'Seed Sower', 'Stamina', 'Toxic Chain',
|
|
'Volt Absorb', 'Water Absorb', 'Wonder Guard', 'Harvest + Jaboca Berry', 'Harvest + Rowap Berry', 'Aguav Berry', 'Assault Vest', 'Berry', 'Berry Juice',
|
|
'Berserk Gene', 'Black Sludge', 'Enigma Berry', 'Figy Berry', 'Gold Berry', 'Iapapa Berry', 'Kangaskhanite', 'Leftovers', 'Mago Berry', 'Medichamite',
|
|
'Steel Memory', 'Oran Berry', 'Rocky Helmet', 'Shell Bell', 'Sitrus Berry', 'Tatsugirinite', 'Wiki Berry',
|
|
],
|
|
onValidateSet(set) {
|
|
const species = this.dex.species.get(set.species);
|
|
if (species.types.includes('Steel')) {
|
|
return [`${species.name} is a Steel-type, which is banned from Metronome Battle.`];
|
|
}
|
|
if (set.teraType === 'Steel') {
|
|
return [`${species.name} has Steel as its Tera type, which is banned from Metronome Battle.`];
|
|
}
|
|
if (species.bst > 625) {
|
|
return [`${species.name} is banned.`, `(Pok\u00e9mon with a BST higher than 625 are banned)`];
|
|
}
|
|
const item = this.dex.items.get(set.item);
|
|
if (set.item && item.megaStone) {
|
|
const megaSpecies = this.dex.species.get(item.megaStone[species.baseSpecies]);
|
|
if (megaSpecies.bst > 625) {
|
|
return [
|
|
`${set.name || set.species}'s item ${item.name} is banned.`, `(Pok\u00e9mon with a BST higher than 625 are banned)`,
|
|
];
|
|
}
|
|
}
|
|
if (set.moves.length !== 1 || this.dex.moves.get(set.moves[0]).id !== 'metronome') {
|
|
return [`${set.name || set.species} has illegal moves.`, `(Pok\u00e9mon can only have one Metronome in their moveset)`];
|
|
}
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 8] Random Battle",
|
|
desc: `Randomized teams of level-balanced Pokémon with sets that are generated to be competitively viable.`,
|
|
mod: 'gen8',
|
|
team: 'random',
|
|
bestOfDefault: true,
|
|
ruleset: ['PotD', 'Obtainable', 'Species Clause', 'HP Percentage Mod', 'Cancel Mod', 'Sleep Clause Mod', 'Illusion Level Mod'],
|
|
},
|
|
{
|
|
name: "[Gen 8] Random Doubles Battle",
|
|
mod: 'gen8',
|
|
gameType: 'doubles',
|
|
team: 'random',
|
|
searchShow: false,
|
|
bestOfDefault: true,
|
|
ruleset: ['PotD', 'Obtainable', 'Species Clause', 'HP Percentage Mod', 'Cancel Mod', 'Illusion Level Mod'],
|
|
},
|
|
{
|
|
name: "[Gen 8] Free-For-All Random Battle",
|
|
mod: 'gen8',
|
|
team: 'random',
|
|
gameType: 'freeforall',
|
|
searchShow: false,
|
|
tournamentShow: false,
|
|
rated: false,
|
|
ruleset: ['Obtainable', 'Species Clause', 'HP Percentage Mod', 'Cancel Mod', 'Sleep Clause Mod', 'Illusion Level Mod'],
|
|
},
|
|
{
|
|
name: "[Gen 8] Multi Random Battle",
|
|
mod: 'gen8',
|
|
team: 'random',
|
|
gameType: 'multi',
|
|
searchShow: false,
|
|
tournamentShow: false,
|
|
rated: false,
|
|
ruleset: [
|
|
'Max Team Size = 3',
|
|
'Obtainable', 'Species Clause', 'HP Percentage Mod', 'Cancel Mod', 'Sleep Clause Mod', 'Illusion Level Mod',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 8] Battle Factory",
|
|
desc: `Randomized teams of Pokémon for a generated Smogon tier with sets that are competitively viable.`,
|
|
mod: 'gen8',
|
|
team: 'randomFactory',
|
|
searchShow: false,
|
|
bestOfDefault: true,
|
|
ruleset: ['Standard', 'Dynamax Clause'],
|
|
onBegin() {
|
|
this.add(`raw|<div class="broadcast-blue"><b>Battle Factory Tier: ${this.teamGenerator.factoryTier}</b></div>`);
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 8] BSS Factory",
|
|
desc: `Randomized 3v3 Singles featuring Pokémon and movesets popular in Battle Stadium Singles.`,
|
|
mod: 'gen8',
|
|
team: 'randomBSSFactory',
|
|
searchShow: false,
|
|
bestOfDefault: true,
|
|
ruleset: ['Flat Rules'],
|
|
},
|
|
{
|
|
name: "[Gen 8] Hackmons Cup",
|
|
desc: `Randomized teams of level-balanced Pokémon with absolutely any ability, moves, and item.`,
|
|
mod: 'gen8',
|
|
team: 'randomHC',
|
|
searchShow: false,
|
|
bestOfDefault: true,
|
|
ruleset: ['HP Percentage Mod', 'Cancel Mod'],
|
|
banlist: ['Nonexistent'],
|
|
},
|
|
{
|
|
name: "[Gen 8] CAP 1v1",
|
|
desc: `Randomly generated 1v1-style teams only including Pokémon made by the Create-A-Pokémon Project.`,
|
|
mod: 'gen8',
|
|
team: 'randomCAP1v1',
|
|
searchShow: false,
|
|
bestOfDefault: true,
|
|
ruleset: [
|
|
'Picked Team Size = 1',
|
|
'Max Team Size = 3',
|
|
'Species Clause', 'Team Preview', 'HP Percentage Mod', 'Cancel Mod', 'Sleep Clause Mod', 'Dynamax Clause',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 8 BDSP] Random Battle",
|
|
desc: `Randomized teams of level-balanced Pokémon with sets that are generated to be competitively viable.`,
|
|
mod: 'gen8bdsp',
|
|
team: 'random',
|
|
bestOfDefault: true,
|
|
searchShow: false,
|
|
ruleset: ['[Gen 8] Random Battle', '!PotD'],
|
|
},
|
|
{
|
|
name: "[Gen 7] Random Battle",
|
|
desc: `Randomized teams of level-balanced Pokémon with sets that are generated to be competitively viable.`,
|
|
mod: 'gen7',
|
|
team: 'random',
|
|
bestOfDefault: true,
|
|
ruleset: ['Obtainable', 'Sleep Clause Mod', 'HP Percentage Mod', 'Cancel Mod', 'Illusion Level Mod'],
|
|
},
|
|
{
|
|
name: "[Gen 7] Battle Factory",
|
|
desc: `Randomized teams of Pokémon for a generated Smogon tier with sets that are competitively viable.`,
|
|
mod: 'gen7',
|
|
team: 'randomFactory',
|
|
searchShow: false,
|
|
bestOfDefault: true,
|
|
ruleset: ['Obtainable', 'Sleep Clause Mod', 'Team Preview', 'HP Percentage Mod', 'Cancel Mod', 'Mega Rayquaza Clause'],
|
|
onBegin() {
|
|
this.add(`raw|<div class="broadcast-blue"><b>Battle Factory Tier: ${this.teamGenerator.factoryTier}</b></div>`);
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 7] BSS Factory",
|
|
desc: `Randomized 3v3 Singles featuring Pokémon and movesets popular in Battle Spot Singles.`,
|
|
mod: 'gen7',
|
|
team: 'randomBSSFactory',
|
|
searchShow: false,
|
|
bestOfDefault: true,
|
|
ruleset: ['Flat Rules'],
|
|
},
|
|
{
|
|
name: "[Gen 7] Hackmons Cup",
|
|
desc: `Randomized teams of level-balanced Pokémon with absolutely any ability, moves, and item.`,
|
|
mod: 'gen7',
|
|
team: 'randomHC',
|
|
searchShow: false,
|
|
challengeShow: false,
|
|
ruleset: ['HP Percentage Mod', 'Cancel Mod'],
|
|
banlist: ['Nonexistent'],
|
|
},
|
|
{
|
|
name: "[Gen 7 Let's Go] Random Battle",
|
|
mod: 'gen7letsgo',
|
|
team: 'random',
|
|
searchShow: false,
|
|
bestOfDefault: true,
|
|
ruleset: ['Obtainable', 'HP Percentage Mod', 'Cancel Mod', 'Sleep Clause Mod'],
|
|
},
|
|
{
|
|
name: "[Gen 6] Random Battle",
|
|
mod: 'gen6',
|
|
team: 'random',
|
|
bestOfDefault: true,
|
|
ruleset: ['Obtainable', 'Sleep Clause Mod', 'HP Percentage Mod', 'Cancel Mod', 'Illusion Level Mod'],
|
|
},
|
|
{
|
|
name: "[Gen 6] Battle Factory",
|
|
desc: `Randomized teams of Pokémon for a generated Smogon tier with sets that are competitively viable.`,
|
|
mod: 'gen6',
|
|
team: 'randomFactory',
|
|
searchShow: false,
|
|
challengeShow: false,
|
|
ruleset: ['Obtainable', 'Sleep Clause Mod', 'Team Preview', 'HP Percentage Mod', 'Cancel Mod', 'Mega Rayquaza Clause'],
|
|
onBegin() {
|
|
this.add(`raw|<div class="broadcast-blue"><b>Battle Factory Tier: ${this.teamGenerator.factoryTier}</b></div>`);
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 5] Random Battle",
|
|
mod: 'gen5',
|
|
team: 'random',
|
|
bestOfDefault: true,
|
|
ruleset: ['Obtainable', 'Sleep Clause Mod', 'HP Percentage Mod', 'Cancel Mod', 'Illusion Level Mod'],
|
|
},
|
|
{
|
|
name: "[Gen 4] Random Battle",
|
|
mod: 'gen4',
|
|
team: 'random',
|
|
bestOfDefault: true,
|
|
ruleset: ['Obtainable', 'Sleep Clause Mod', 'HP Percentage Mod', 'Cancel Mod'],
|
|
},
|
|
{
|
|
name: "[Gen 3] Random Battle",
|
|
mod: 'gen3',
|
|
team: 'random',
|
|
bestOfDefault: true,
|
|
ruleset: ['Standard'],
|
|
},
|
|
{
|
|
name: "[Gen 2] Random Battle",
|
|
mod: 'gen2',
|
|
team: 'random',
|
|
bestOfDefault: true,
|
|
ruleset: ['Standard'],
|
|
},
|
|
{
|
|
name: "[Gen 1] Random Battle",
|
|
mod: 'gen1',
|
|
team: 'random',
|
|
bestOfDefault: true,
|
|
ruleset: ['Standard'],
|
|
},
|
|
{
|
|
name: "[Gen 1] Challenge Cup",
|
|
desc: `Randomized teams of level-balanced Pokémon with absolutely any legal moves.`,
|
|
mod: 'gen1',
|
|
team: 'randomCC',
|
|
searchShow: false,
|
|
challengeShow: false,
|
|
ruleset: ['Obtainable', 'HP Percentage Mod', 'Cancel Mod', 'Desync Clause Mod', 'Sleep Clause Mod', 'Freeze Clause Mod'],
|
|
},
|
|
{
|
|
name: "[Gen 1] Hackmons Cup",
|
|
desc: `Randomized teams of level-balanced Pokémon with absolutely any moves, types, and stats.`,
|
|
mod: 'gen1',
|
|
team: 'randomHC',
|
|
searchShow: false,
|
|
challengeShow: false,
|
|
ruleset: ['HP Percentage Mod', 'Cancel Mod', 'Desync Clause Mod', 'Sleep Clause Mod', 'Freeze Clause Mod', 'Team Type Preview'],
|
|
banlist: ['Nonexistent'],
|
|
onModifySpecies(species, target, source, effect) {
|
|
if (!target) return;
|
|
return { ...species, ...(target.set as any).hc };
|
|
},
|
|
onSwitchIn(pokemon) {
|
|
this.add('-start', pokemon, 'typechange', pokemon.getTypes(true).join('/'), '[silent]');
|
|
for (const i in pokemon.species.baseStats) {
|
|
if (i === 'spd') continue;
|
|
this.add('-start', pokemon, `${pokemon.species.baseStats[i as keyof StatsTable]}${i === 'spa' ? 'spc' : i}`, '[silent]');
|
|
}
|
|
},
|
|
},
|
|
|
|
// Past Gens OU
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
{
|
|
section: "Past Gens OU",
|
|
column: 4,
|
|
},
|
|
{
|
|
name: "[Gen 8] OU",
|
|
mod: 'gen8',
|
|
ruleset: ['Standard', 'Dynamax Clause'],
|
|
banlist: ['Uber', 'AG', 'Arena Trap', 'Moody', 'Power Construct', 'Sand Veil', 'Shadow Tag', 'Snow Cloak', 'King\'s Rock', 'Baton Pass'],
|
|
},
|
|
{
|
|
name: "[Gen 7] OU",
|
|
mod: 'gen7',
|
|
ruleset: ['Standard'],
|
|
banlist: ['Uber', 'Arena Trap', 'Power Construct', 'Shadow Tag', 'Baton Pass'],
|
|
},
|
|
{
|
|
name: "[Gen 6] OU",
|
|
mod: 'gen6',
|
|
ruleset: ['Standard', 'Evasion Abilities Clause', 'Swagger Clause'],
|
|
banlist: ['Uber', 'Arena Trap', 'Shadow Tag', 'King\'s Rock', 'Quick Claw', 'Razor Fang', 'Soul Dew', 'Baton Pass'],
|
|
},
|
|
{
|
|
name: "[Gen 5] OU",
|
|
mod: 'gen5',
|
|
ruleset: ['Standard', 'Evasion Abilities Clause', 'Sleep Moves Clause', 'Swagger Clause', 'Gems Clause', 'Baton Pass Stat Clause'],
|
|
banlist: ['Uber', 'Arena Trap', 'Drizzle ++ Swift Swim', 'Drought ++ Chlorophyll', 'Sand Rush', 'Shadow Tag', 'King\'s Rock', 'Razor Fang', 'Soul Dew', 'Assist'],
|
|
},
|
|
{
|
|
name: "[Gen 4] OU",
|
|
mod: 'gen4',
|
|
ruleset: ['Standard', 'Evasion Abilities Clause', 'Baton Pass Stat Trap Clause', 'Freeze Clause Mod', 'Sleep Moves Clause', '!Sleep Clause Mod'],
|
|
banlist: ['AG', 'Uber', 'Arena Trap', 'Quick Claw', 'Soul Dew', 'Swagger'],
|
|
},
|
|
{
|
|
name: "[Gen 3] OU",
|
|
mod: 'gen3',
|
|
ruleset: ['Standard', 'One Boost Passer Clause', 'Accuracy Trap Clause', 'Freeze Clause Mod', 'Speed Pass Clause'],
|
|
banlist: ['Uber', 'Smeargle + Ingrain', 'Sand Veil', 'Soundproof', 'Assist', 'Baton Pass + Block', 'Baton Pass + Mean Look', 'Baton Pass + Spider Web', 'Swagger'],
|
|
},
|
|
{
|
|
name: "[Gen 2] OU",
|
|
mod: 'gen2',
|
|
ruleset: ['Standard'],
|
|
banlist: ['Uber', 'Mean Look + Baton Pass', 'Spider Web + Baton Pass'],
|
|
},
|
|
{
|
|
name: "[Gen 1] OU",
|
|
mod: 'gen1',
|
|
ruleset: ['Standard'],
|
|
banlist: ['Uber'],
|
|
},
|
|
|
|
// Past Gens Doubles OU
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
{
|
|
section: "Past Gens Doubles OU",
|
|
column: 4,
|
|
},
|
|
{
|
|
name: "[Gen 8] Doubles OU",
|
|
mod: 'gen8',
|
|
gameType: 'doubles',
|
|
ruleset: ['Standard Doubles', 'Dynamax Clause', 'Swagger Clause'],
|
|
banlist: ['DUber', 'Power Construct', 'Shadow Tag'],
|
|
},
|
|
{
|
|
name: "[Gen 7] Doubles OU",
|
|
mod: 'gen7',
|
|
gameType: 'doubles',
|
|
ruleset: ['Standard Doubles', 'Swagger Clause'],
|
|
banlist: ['DUber', 'Power Construct', 'Eevium Z', 'Dark Void'],
|
|
},
|
|
{
|
|
name: "[Gen 6] Doubles OU",
|
|
mod: 'gen6',
|
|
gameType: 'doubles',
|
|
ruleset: ['Standard Doubles', 'Swagger Clause'],
|
|
banlist: ['DUber', 'Soul Dew', 'Dark Void'],
|
|
},
|
|
{
|
|
name: "[Gen 5] Doubles OU",
|
|
mod: 'gen5',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
ruleset: ['Standard', 'Evasion Abilities Clause', 'Swagger Clause', 'Sleep Clause Mod'],
|
|
banlist: ['DUber', 'Shadow Tag', 'Soul Dew', 'Dark Void', 'Gravity'],
|
|
},
|
|
{
|
|
name: "[Gen 4] Doubles OU",
|
|
mod: 'gen4',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
ruleset: ['Standard', 'Evasion Abilities Clause'],
|
|
banlist: ['AG', 'Uber', 'Soul Dew', 'Explosion', 'Dark Void', 'Self-Destruct', 'Swagger', 'Thunder Wave'],
|
|
unbanlist: ['Machamp', 'Manaphy', 'Mew', 'Salamence', 'Wobbuffet', 'Wynaut'],
|
|
},
|
|
{
|
|
name: "[Gen 3] Doubles OU",
|
|
mod: 'gen3',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
ruleset: ['Standard', '!Switch Priority Clause Mod'],
|
|
banlist: ['Uber', 'Quick Claw', 'Soul Dew', 'Explosion', 'Self-Destruct', 'Swagger'],
|
|
unbanlist: ['Wobbuffet', 'Wynaut'],
|
|
},
|
|
|
|
// Sw/Sh Singles
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
{
|
|
section: "Sw/Sh Singles",
|
|
column: 4,
|
|
},
|
|
{
|
|
name: "[Gen 8] Ubers",
|
|
mod: 'gen8',
|
|
searchShow: false,
|
|
ruleset: ['Standard', 'Dynamax Clause'],
|
|
banlist: ['AG', 'Shadow Tag', 'Baton Pass'],
|
|
},
|
|
{
|
|
name: "[Gen 8] UU",
|
|
mod: 'gen8',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 8] OU'],
|
|
banlist: ['OU', 'UUBL', 'Light Clay'],
|
|
},
|
|
{
|
|
name: "[Gen 8] RU",
|
|
mod: 'gen8',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 8] UU'],
|
|
banlist: ['UU', 'RUBL'],
|
|
},
|
|
{
|
|
name: "[Gen 8] NU",
|
|
mod: 'gen8',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 8] RU'],
|
|
banlist: ['RU', 'NUBL', 'Drizzle', 'Drought', 'Slush Rush'],
|
|
},
|
|
{
|
|
name: "[Gen 8] PU",
|
|
mod: 'gen8',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 8] NU'],
|
|
banlist: ['NU', 'PUBL'],
|
|
},
|
|
{
|
|
name: "[Gen 8] LC",
|
|
mod: 'gen8',
|
|
searchShow: false,
|
|
ruleset: ['Little Cup', 'Standard', 'Dynamax Clause'],
|
|
banlist: [
|
|
'Corsola-Galar', 'Cutiefly', 'Drifloon', 'Gastly', 'Gothita', 'Magby', 'Rufflet', 'Scraggy', 'Scyther', 'Sneasel', 'Swirlix',
|
|
'Tangela', 'Vulpix-Alola', 'Woobat', 'Zigzagoon-Base', 'Chlorophyll', 'Moody', 'Baton Pass', 'Sticky Web',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 8] Monotype",
|
|
desc: `All the Pokémon on a team must share a type.`,
|
|
mod: 'gen8',
|
|
searchShow: false,
|
|
ruleset: ['Same Type Clause', 'Standard', 'Evasion Abilities Clause', 'Dynamax Clause'],
|
|
banlist: [
|
|
'Blaziken', 'Calyrex-Ice', 'Calyrex-Shadow', 'Dialga', 'Dracovish', 'Eternatus', 'Genesect', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh',
|
|
'Kartana', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Incarnate', 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Mewtwo', 'Naganadel',
|
|
'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Reshiram', 'Solgaleo', 'Urshifu-Single-Strike', 'Xerneas',
|
|
'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Zygarde-50%', 'Moody', 'Power Construct', 'Shadow Tag',
|
|
'Damp Rock', 'Focus Band', 'King\'s Rock', 'Quick Claw', 'Smooth Rock', 'Terrain Extender', 'Baton Pass',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 8] 1v1",
|
|
desc: `Bring three Pokémon to Team Preview and choose one to battle.`,
|
|
mod: 'gen8',
|
|
searchShow: false,
|
|
ruleset: [
|
|
'Picked Team Size = 1', 'Max Team Size = 3',
|
|
'Obtainable', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Moves Clause', 'Accuracy Moves Clause', 'Team Preview', 'HP Percentage Mod', 'Cancel Mod', 'Dynamax Clause', 'Endless Battle Clause',
|
|
],
|
|
banlist: [
|
|
'Calyrex-Ice', 'Calyrex-Shadow', 'Cinderace', 'Dialga', 'Dragonite', 'Eternatus', 'Genesect', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Jirachi',
|
|
'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Melmetal', 'Mew', 'Mewtwo', 'Mimikyu', 'Necrozma', 'Necrozma-Dawn-Wings',
|
|
'Necrozma-Dusk-Mane', 'Palkia', 'Rayquaza', 'Reshiram', 'Sableye', 'Snorlax', 'Solgaleo', 'Victini', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned',
|
|
'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Moody', 'Power Construct', 'Bright Powder', 'Focus Band', 'Focus Sash', 'Lax Incense', 'Quick Claw',
|
|
'Hypnosis', 'Perish Song', 'Sing',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 8] Anything Goes",
|
|
mod: 'gen8',
|
|
searchShow: false,
|
|
ruleset: ['Obtainable', 'Team Preview', 'HP Percentage Mod', 'Cancel Mod', 'Endless Battle Clause'],
|
|
},
|
|
{
|
|
name: "[Gen 8] ZU",
|
|
desc: `The unofficial usage-based tier below PU.`,
|
|
mod: 'gen8',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 8] PU'],
|
|
banlist: ['PU', 'ZUBL', 'Damp Rock', 'Grassy Seed'],
|
|
},
|
|
{
|
|
name: "[Gen 8] CAP",
|
|
desc: "The Create-A-Pokémon project is a community dedicated to exploring and understanding the competitive Pokémon metagame by designing, creating, and playtesting new Pokémon concepts.",
|
|
mod: 'gen8',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 8] OU', '+CAP'],
|
|
banlist: ['Crucibellite'],
|
|
},
|
|
{
|
|
name: "[Gen 8] Battle Stadium Singles",
|
|
mod: 'gen8',
|
|
searchShow: false,
|
|
bestOfDefault: true,
|
|
ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 8', 'VGC Timer', 'Limit Two Restricted'],
|
|
restricted: ['Restricted Legendary'],
|
|
},
|
|
{
|
|
name: "[Gen 8 BDSP] OU",
|
|
mod: 'gen8bdsp',
|
|
searchShow: false,
|
|
ruleset: ['Standard', 'Evasion Abilities Clause'],
|
|
banlist: ['Uber', 'Arena Trap', 'Drizzle', 'Moody', 'Shadow Tag', 'King\'s Rock', 'Razor Fang', 'Baton Pass'],
|
|
},
|
|
{
|
|
name: "[Gen 8 BDSP] Ubers",
|
|
mod: 'gen8bdsp',
|
|
searchShow: false,
|
|
ruleset: ['Standard'],
|
|
banlist: ['AG', 'Baton Pass'],
|
|
},
|
|
{
|
|
name: "[Gen 8] Custom Game",
|
|
mod: 'gen8',
|
|
searchShow: false,
|
|
debug: true,
|
|
battle: { trunc: Math.trunc },
|
|
// no restrictions, for serious (other than team preview)
|
|
ruleset: ['Team Preview', 'Cancel Mod', 'Max Team Size = 24', 'Max Move Count = 24', 'Max Level = 9999', 'Default Level = 100'],
|
|
},
|
|
|
|
// Sw/Sh Doubles
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
{
|
|
section: "Sw/Sh Doubles",
|
|
column: 4,
|
|
},
|
|
{
|
|
name: "[Gen 8] Doubles Ubers",
|
|
mod: 'gen8',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
ruleset: ['Standard Doubles', '!Gravity Sleep Clause'],
|
|
banlist: [],
|
|
},
|
|
{
|
|
name: "[Gen 8] Doubles UU",
|
|
mod: 'gen8',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 8] Doubles OU'],
|
|
banlist: ['DOU', 'DBL'],
|
|
},
|
|
{
|
|
name: "[Gen 8] VGC 2022",
|
|
mod: 'gen8',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
bestOfDefault: true,
|
|
ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 8', 'VGC Timer', 'Limit Two Restricted'],
|
|
restricted: ['Restricted Legendary'],
|
|
},
|
|
{
|
|
name: "[Gen 8] VGC 2021",
|
|
mod: 'gen8',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
bestOfDefault: true,
|
|
ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 8', 'VGC Timer'],
|
|
},
|
|
{
|
|
name: "[Gen 8] VGC 2020",
|
|
mod: 'gen8dlc1',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
bestOfDefault: true,
|
|
ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 8', 'VGC Timer'],
|
|
},
|
|
{
|
|
name: "[Gen 8 BDSP] Doubles OU",
|
|
mod: 'gen8bdsp',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
ruleset: ['Standard Doubles'],
|
|
banlist: ['DUber', 'Dark Void'],
|
|
},
|
|
{
|
|
name: "[Gen 8 BDSP] Battle Festival Doubles",
|
|
mod: 'gen8bdsp',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
ruleset: ['Flat Rules', 'Min Source Gen = 8'],
|
|
},
|
|
{
|
|
name: "[Gen 8] Doubles Custom Game",
|
|
mod: 'gen8',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
battle: { trunc: Math.trunc },
|
|
debug: true,
|
|
// no restrictions, for serious (other than team preview)
|
|
ruleset: ['Team Preview', 'Cancel Mod', 'Max Team Size = 24', 'Max Move Count = 24', 'Max Level = 9999', 'Default Level = 100'],
|
|
},
|
|
|
|
// US/UM Singles
|
|
///////////////////////////////////////////////////////////////////
|
|
{
|
|
section: "US/UM Singles",
|
|
column: 4,
|
|
},
|
|
{
|
|
name: "[Gen 7] Ubers",
|
|
mod: 'gen7',
|
|
searchShow: false,
|
|
ruleset: ['Standard', 'Mega Rayquaza Clause'],
|
|
banlist: ['Baton Pass'],
|
|
},
|
|
{
|
|
name: "[Gen 7] UU",
|
|
mod: 'gen7',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 7] OU'],
|
|
banlist: ['OU', 'UUBL', 'Drizzle', 'Drought', 'Kommonium Z', 'Mewnium Z'],
|
|
},
|
|
{
|
|
name: "[Gen 7] RU",
|
|
mod: 'gen7',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 7] UU'],
|
|
banlist: ['UU', 'RUBL', 'Mimikyu', 'Aurora Veil'],
|
|
unbanlist: ['Drought'],
|
|
},
|
|
{
|
|
name: "[Gen 7] NU",
|
|
mod: 'gen7',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 7] RU'],
|
|
banlist: ['RU', 'NUBL', 'Drought'],
|
|
},
|
|
{
|
|
name: "[Gen 7] PU",
|
|
mod: 'gen7',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 7] NU'],
|
|
banlist: ['NU', 'PUBL'],
|
|
},
|
|
{
|
|
name: "[Gen 7] LC",
|
|
mod: 'gen7',
|
|
searchShow: false,
|
|
ruleset: ['Little Cup', 'Standard', 'Swagger Clause'],
|
|
banlist: [
|
|
'Aipom', 'Cutiefly', 'Drifloon', 'Gligar', 'Gothita', 'Meditite', 'Misdreavus', 'Murkrow', 'Porygon',
|
|
'Scyther', 'Sneasel', 'Swirlix', 'Tangela', 'Trapinch', 'Vulpix-Base', 'Vulpix-Alola', 'Wingull', 'Yanma',
|
|
'Eevium Z', 'Baton Pass', 'Dragon Rage', 'Sonic Boom', 'Sticky Web',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 7] Monotype",
|
|
desc: `All the Pokémon on a team must share a type.`,
|
|
mod: 'gen7',
|
|
searchShow: false,
|
|
ruleset: ['Same Type Clause', 'Standard', 'Evasion Abilities Clause', 'Swagger Clause'],
|
|
banlist: [
|
|
'Aegislash', 'Arceus', 'Blaziken', 'Darkrai', 'Deoxys-Normal', 'Deoxys-Attack', 'Dialga', 'Genesect', 'Gengar-Mega', 'Giratina', 'Giratina-Origin',
|
|
'Groudon', 'Ho-Oh', 'Hoopa-Unbound', 'Kangaskhan-Mega', 'Kartana', 'Kyogre', 'Kyurem-White', 'Lucario-Mega', 'Lugia', 'Lunala', 'Magearna',
|
|
'Marshadow', 'Mawile-Mega', 'Medicham-Mega', 'Metagross-Mega', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia',
|
|
'Pheromosa', 'Rayquaza', 'Reshiram', 'Salamence-Mega', 'Shaymin-Sky', 'Solgaleo', 'Tapu Lele', 'Xerneas', 'Yveltal', 'Zekrom', 'Zygarde',
|
|
'Battle Bond', 'Shadow Tag', 'Damp Rock', 'Focus Band', 'King\'s Rock', 'Quick Claw', 'Razor Fang', 'Smooth Rock', 'Terrain Extender', 'Baton Pass',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 7] 1v1",
|
|
desc: `Bring three Pokémon to Team Preview and choose one to battle.`,
|
|
mod: 'gen7',
|
|
searchShow: false,
|
|
ruleset: [
|
|
'Picked Team Size = 1', 'Max Team Size = 3',
|
|
'Obtainable', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Swagger Clause', 'Evasion Moves Clause', 'Accuracy Moves Clause', 'Team Preview', 'HP Percentage Mod', 'Cancel Mod', 'Endless Battle Clause',
|
|
],
|
|
banlist: [
|
|
'Arceus', 'Darkrai', 'Deoxys-Normal', 'Deoxys-Attack', 'Deoxys-Defense', 'Dialga', 'Giratina', 'Giratina-Origin', 'Groudon',
|
|
'Ho-Oh', 'Kangaskhan-Mega', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Marshadow', 'Mew', 'Mewtwo',
|
|
'Mimikyu', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Rayquaza', 'Reshiram', 'Salamence-Mega', 'Shaymin-Sky',
|
|
'Snorlax', 'Solgaleo', 'Tapu Koko', 'Xerneas', 'Yveltal', 'Zekrom', 'Moody', 'Focus Sash', 'Grass Whistle', 'Hypnosis',
|
|
'Perish Song', 'Sing', 'Detect + Fightinium Z',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 7] Anything Goes",
|
|
mod: 'gen7',
|
|
searchShow: false,
|
|
ruleset: ['Obtainable', 'Team Preview', 'HP Percentage Mod', 'Cancel Mod', 'Endless Battle Clause'],
|
|
},
|
|
{
|
|
name: "[Gen 7] ZU",
|
|
desc: `The unofficial usage-based tier below PU.`,
|
|
mod: 'gen7',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 7] PU'],
|
|
banlist: ['PU', 'ZUBL'],
|
|
},
|
|
{
|
|
name: "[Gen 7] CAP",
|
|
desc: "The Create-A-Pokémon project is a community dedicated to exploring and understanding the competitive Pokémon metagame by designing, creating, and playtesting new Pokémon concepts.",
|
|
mod: 'gen7',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 7] OU', '+CAP'],
|
|
},
|
|
{
|
|
name: "[Gen 7] Battle Spot Singles",
|
|
mod: 'gen7',
|
|
searchShow: false,
|
|
bestOfDefault: true,
|
|
ruleset: ['Flat Rules', 'Min Source Gen = 6'],
|
|
banlist: ['Battle Bond'],
|
|
},
|
|
{
|
|
name: "[Gen 7 Let's Go] OU",
|
|
mod: 'gen7letsgo',
|
|
searchShow: false,
|
|
ruleset: ['Standard'],
|
|
banlist: ['Uber'],
|
|
},
|
|
{
|
|
name: "[Gen 7] Custom Game",
|
|
mod: 'gen7',
|
|
searchShow: false,
|
|
debug: true,
|
|
battle: { trunc: Math.trunc },
|
|
// no restrictions, for serious (other than team preview)
|
|
ruleset: ['Team Preview', 'Cancel Mod', 'Max Team Size = 24', 'Max Move Count = 24', 'Max Level = 9999', 'Default Level = 100'],
|
|
},
|
|
|
|
// US/UM Doubles
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
{
|
|
section: "US/UM Doubles",
|
|
column: 4,
|
|
},
|
|
{
|
|
name: "[Gen 7] Doubles UU",
|
|
mod: 'gen7',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 7] Doubles OU'],
|
|
banlist: ['DOU', 'DBL'],
|
|
},
|
|
{
|
|
name: "[Gen 7] VGC 2019",
|
|
mod: 'gen7',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
bestOfDefault: true,
|
|
ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 7', 'VGC Timer', 'Limit Two Restricted'],
|
|
restricted: ['Restricted Legendary'],
|
|
banlist: ['Unown', 'Battle Bond'],
|
|
},
|
|
{
|
|
name: "[Gen 7] VGC 2018",
|
|
mod: 'gen7',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
bestOfDefault: true,
|
|
ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 7', 'VGC Timer', '!! Timer Starting = 300'],
|
|
banlist: ['Oranguru + Symbiosis', 'Passimian + Defiant', 'Unown', 'Custap Berry', 'Enigma Berry', 'Jaboca Berry', 'Micle Berry', 'Rowap Berry', 'Battle Bond'],
|
|
},
|
|
{
|
|
name: "[Gen 7] VGC 2017",
|
|
mod: 'gen7sm',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
bestOfDefault: true,
|
|
ruleset: [
|
|
'Flat Rules', 'Old Alola Pokedex', '!! Adjust Level = 50', 'Min Source Gen = 7',
|
|
'VGC Timer', '!! Timer Starting = 900',
|
|
],
|
|
banlist: ['Mega', 'Custap Berry', 'Enigma Berry', 'Jaboca Berry', 'Micle Berry', 'Rowap Berry'],
|
|
},
|
|
{
|
|
name: "[Gen 7] Battle Spot Doubles",
|
|
mod: 'gen7',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
bestOfDefault: true,
|
|
ruleset: ['Flat Rules', 'Min Source Gen = 6'],
|
|
banlist: ['Battle Bond'],
|
|
},
|
|
{
|
|
name: "[Gen 7 Let's Go] Doubles OU",
|
|
mod: 'gen7letsgo',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
ruleset: ['Standard Doubles', 'Sleep Clause Mod'],
|
|
banlist: ['DUber'],
|
|
},
|
|
{
|
|
name: "[Gen 7] Doubles Custom Game",
|
|
mod: 'gen7',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
battle: { trunc: Math.trunc },
|
|
debug: true,
|
|
// no restrictions, for serious (other than team preview)
|
|
ruleset: ['Team Preview', 'Cancel Mod', 'Max Team Size = 24', 'Max Move Count = 24', 'Max Level = 9999', 'Default Level = 100'],
|
|
},
|
|
|
|
// OR/AS Singles
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
{
|
|
section: "OR/AS Singles",
|
|
column: 4,
|
|
},
|
|
{
|
|
name: "[Gen 6] Ubers",
|
|
mod: 'gen6',
|
|
searchShow: false,
|
|
ruleset: ['Standard', 'Swagger Clause', 'Mega Rayquaza Clause'],
|
|
},
|
|
{
|
|
name: "[Gen 6] UU",
|
|
mod: 'gen6',
|
|
searchShow: false,
|
|
ruleset: ['Standard', 'Swagger Clause'],
|
|
banlist: ['Uber', 'OU', 'UUBL', 'Arena Trap', 'Drizzle', 'Drought', 'Shadow Tag', 'Soul Dew', 'Baton Pass'],
|
|
},
|
|
{
|
|
name: "[Gen 6] RU",
|
|
mod: 'gen6',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 6] UU'],
|
|
banlist: ['UU', 'RUBL'],
|
|
},
|
|
{
|
|
name: "[Gen 6] PU",
|
|
mod: 'gen6',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 6] NU'],
|
|
banlist: ['NU', 'PUBL', 'Chatter'],
|
|
},
|
|
{
|
|
name: "[Gen 6] LC",
|
|
mod: 'gen6',
|
|
searchShow: false,
|
|
ruleset: ['Standard', 'Little Cup'],
|
|
banlist: [
|
|
'Drifloon', 'Gligar', 'Meditite', 'Misdreavus', 'Murkrow', 'Scyther', 'Sneasel', 'Swirlix', 'Tangela', 'Yanma',
|
|
'Baton Pass', 'Dragon Rage', 'Sonic Boom', 'Swagger',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 6] Monotype",
|
|
desc: `All the Pokémon on a team must share a type.`,
|
|
mod: 'gen6',
|
|
searchShow: false,
|
|
ruleset: ['Standard', 'Swagger Clause', 'Evasion Abilities Clause', 'Same Type Clause'],
|
|
banlist: [
|
|
'Aegislash', 'Altaria-Mega', 'Arceus', 'Blaziken', 'Darkrai', 'Deoxys-Normal', 'Deoxys-Attack', 'Deoxys-Speed', 'Dialga', 'Genesect', 'Gengar-Mega',
|
|
'Giratina', 'Giratina-Origin', 'Greninja', 'Groudon', 'Ho-Oh', 'Hoopa-Unbound', 'Kangaskhan-Mega', 'Keldeo', 'Kyogre', 'Kyurem-White', 'Lucario-Mega',
|
|
'Lugia', 'Mawile-Mega', 'Medicham-Mega', 'Metagross-Mega', 'Mewtwo', 'Palkia', 'Rayquaza', 'Reshiram', 'Sableye-Mega', 'Salamence-Mega', 'Shaymin-Sky',
|
|
'Slowbro-Mega', 'Talonflame', 'Xerneas', 'Yveltal', 'Zekrom', 'Shadow Tag', 'Damp Rock', 'Focus Band', 'King\'s Rock', 'Quick Claw', 'Razor Fang',
|
|
'Smooth Rock', 'Soul Dew', 'Baton Pass',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 6] 1v1",
|
|
desc: `Bring three Pokémon to Team Preview and choose one to battle.`,
|
|
mod: 'gen6',
|
|
searchShow: false,
|
|
ruleset: [
|
|
'Max Team Size = 3', 'Picked Team Size = 1', 'Obtainable', 'Nickname Clause', 'Moody Clause', 'OHKO Clause',
|
|
'Evasion Moves Clause', 'Accuracy Moves Clause', 'Swagger Clause', 'Endless Battle Clause', 'HP Percentage Mod',
|
|
'Cancel Mod', 'Team Preview',
|
|
],
|
|
banlist: [
|
|
'Arceus', 'Charizard-Mega-X', 'Charizard-Mega-Y', 'Deoxys-Normal', 'Deoxys-Attack', 'Deoxys-Defense', 'Dialga', 'Giratina', 'Giratina-Origin', 'Groudon',
|
|
'Ho-Oh', 'Kangaskhan-Mega', 'Kyogre', 'Kyurem-White', 'Lugia', 'Mew', 'Mewtwo', 'Palkia', 'Rayquaza', 'Reshiram', 'Salamence-Mega', 'Shaymin-Sky',
|
|
'Snorlax', 'Xerneas', 'Yveltal', 'Zekrom', 'Focus Sash', 'Soul Dew', 'Dark Void', 'Grass Whistle', 'Hypnosis', 'Perish Song', 'Sing', 'Sleep Powder', 'Yawn',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 6] Anything Goes",
|
|
mod: 'gen6',
|
|
searchShow: false,
|
|
ruleset: ['Obtainable', 'Team Preview', 'Endless Battle Clause', 'HP Percentage Mod', 'Cancel Mod'],
|
|
},
|
|
{
|
|
name: "[Gen 6] ZU",
|
|
mod: 'gen6',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 6] PU'],
|
|
banlist: ['PU', 'ZUBL', 'Light Clay'],
|
|
},
|
|
{
|
|
name: "[Gen 6] CAP",
|
|
desc: "The Create-A-Pokémon project is a community dedicated to exploring and understanding the competitive Pokémon metagame by designing, creating, and playtesting new Pokémon concepts.",
|
|
mod: 'gen6',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 6] OU', '+CAP'],
|
|
banlist: ['Cawmodore'],
|
|
},
|
|
{
|
|
name: "[Gen 6] Battle Spot Singles",
|
|
mod: 'gen6',
|
|
searchShow: false,
|
|
bestOfDefault: true,
|
|
ruleset: ['Flat Rules', 'Min Source Gen = 6'],
|
|
banlist: ['Soul Dew'],
|
|
},
|
|
{
|
|
name: "[Gen 6] Custom Game",
|
|
mod: 'gen6',
|
|
searchShow: false,
|
|
debug: true,
|
|
battle: { trunc: Math.trunc },
|
|
// no restrictions, for serious (other than team preview)
|
|
ruleset: ['Team Preview', 'Cancel Mod', 'Max Team Size = 24', 'Max Move Count = 24', 'Max Level = 9999', 'Default Level = 100'],
|
|
},
|
|
|
|
// OR/AS Doubles/Triples
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
{
|
|
section: "OR/AS Doubles/Triples",
|
|
column: 4,
|
|
},
|
|
{
|
|
name: "[Gen 6] VGC 2016",
|
|
mod: 'gen6',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
bestOfDefault: true,
|
|
ruleset: ['Flat Rules', 'Min Source Gen = 6', 'Limit Two Restricted'],
|
|
restricted: ['Restricted Legendary'],
|
|
banlist: ['Soul Dew'],
|
|
},
|
|
{
|
|
name: "[Gen 6] VGC 2015",
|
|
mod: 'gen6',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
bestOfDefault: true,
|
|
ruleset: ['Flat Rules', 'Min Source Gen = 6'],
|
|
banlist: ['Soul Dew', 'Articuno + Snow Cloak', 'Zapdos + Static', 'Moltres + Flame Body', 'Dragonite + Barrier'],
|
|
},
|
|
{
|
|
name: "[Gen 6] VGC 2014",
|
|
mod: 'gen6xy',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
bestOfDefault: true,
|
|
ruleset: ['Flat Rules', 'Kalos Pokedex', 'Min Source Gen = 6'],
|
|
},
|
|
{
|
|
name: "[Gen 6] Battle Spot Doubles",
|
|
mod: 'gen6',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
bestOfDefault: true,
|
|
ruleset: ['Flat Rules', 'Min Source Gen = 6'],
|
|
banlist: ['Soul Dew'],
|
|
},
|
|
{
|
|
name: "[Gen 6] Doubles Custom Game",
|
|
mod: 'gen6',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
battle: { trunc: Math.trunc },
|
|
debug: true,
|
|
// no restrictions, for serious (other than team preview)
|
|
ruleset: ['Team Preview', 'Cancel Mod', 'Max Team Size = 24', 'Max Move Count = 24', 'Max Level = 9999', 'Default Level = 100'],
|
|
},
|
|
{
|
|
name: "[Gen 6] Battle Spot Triples",
|
|
mod: 'gen6',
|
|
gameType: 'triples',
|
|
searchShow: false,
|
|
ruleset: ['Flat Rules', 'Min Source Gen = 6'],
|
|
},
|
|
{
|
|
name: "[Gen 6] Triples Custom Game",
|
|
mod: 'gen6',
|
|
gameType: 'triples',
|
|
searchShow: false,
|
|
battle: { trunc: Math.trunc },
|
|
debug: true,
|
|
// no restrictions, for serious (other than team preview)
|
|
ruleset: ['Team Preview', 'Cancel Mod', 'Max Team Size = 24', 'Max Move Count = 24', 'Max Level = 9999', 'Default Level = 100'],
|
|
},
|
|
|
|
// B2/W2 Singles
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
{
|
|
section: "B2/W2 Singles",
|
|
column: 4,
|
|
},
|
|
{
|
|
name: "[Gen 5] Ubers",
|
|
mod: 'gen5',
|
|
searchShow: false,
|
|
ruleset: ['Standard', 'Sleep Clause Mod'],
|
|
},
|
|
{
|
|
name: "[Gen 5] UU",
|
|
mod: 'gen5',
|
|
searchShow: false,
|
|
ruleset: ['Standard', 'Evasion Abilities Clause', 'Swagger Clause', 'Sleep Clause Mod'],
|
|
banlist: ['Uber', 'OU', 'UUBL', 'Arena Trap', 'Drought', 'Sand Stream', 'Snow Warning', 'Prankster + Assist', 'Prankster + Copycat', 'Baton Pass'],
|
|
},
|
|
{
|
|
name: "[Gen 5] RU",
|
|
mod: 'gen5',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 5] UU', 'Baton Pass Clause', '!Sleep Clause Mod', 'Sleep Moves Clause'],
|
|
banlist: ['UU', 'RUBL', 'Shadow Tag', 'Shell Smash + Baton Pass'],
|
|
unbanlist: ['Prankster + Assist', 'Prankster + Copycat', 'Baton Pass'],
|
|
},
|
|
{
|
|
name: "[Gen 5] NU",
|
|
mod: 'gen5',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 5] RU', '!Sleep Moves Clause', 'Sleep Clause Mod'],
|
|
banlist: ['RU', 'NUBL', 'Assist', 'Copycat'],
|
|
},
|
|
{
|
|
name: "[Gen 5] PU",
|
|
mod: 'gen5',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 5] NU', 'Sleep Moves Clause'],
|
|
banlist: ['NU', 'PUBL', 'Damp Rock'],
|
|
},
|
|
{
|
|
name: "[Gen 5] Monotype",
|
|
desc: `All the Pokémon on a team must share a type.`,
|
|
mod: 'gen5',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 5] OU', 'Same Type Clause', '!Gems Clause'],
|
|
banlist: ['Latios'],
|
|
unbanlist: ['Cloyster'],
|
|
},
|
|
{
|
|
name: "[Gen 5] LC",
|
|
mod: 'gen5',
|
|
searchShow: false,
|
|
ruleset: ['Standard', 'Little Cup', 'Sleep Moves Clause'],
|
|
banlist: [
|
|
'Gligar', 'Meditite', 'Misdreavus', 'Murkrow', 'Scraggy', 'Scyther', 'Sneasel', 'Tangela', 'Vulpix', 'Yanma',
|
|
'Sand Rush', 'Sand Veil', 'Berry Juice', 'Soul Dew', 'Baton Pass', 'Dragon Rage', 'Sonic Boom', 'Swagger',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 5] 1v1",
|
|
desc: `Bring three Pokémon to Team Preview and choose one to battle.`,
|
|
mod: 'gen5',
|
|
searchShow: false,
|
|
ruleset: [
|
|
'Picked Team Size = 1', 'Max Team Size = 3',
|
|
'Standard', 'Baton Pass Clause', 'Swagger Clause', 'Accuracy Moves Clause', 'Sleep Moves Clause',
|
|
],
|
|
banlist: [
|
|
'Arceus', 'Blaziken', 'Cottonee', 'Darkrai', 'Deoxys', 'Dialga', 'Dragonite', 'Giratina', 'Groudon', 'Ho-Oh',
|
|
'Jirachi', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Mew', 'Mewtwo', 'Palkia', 'Rayquaza', 'Reshiram',
|
|
'Shaymin-Sky', 'Thundurus-Incarnate', 'Togekiss', 'Victini', 'Whimsicott', 'Zekrom', 'Focus Band', 'Focus Sash',
|
|
'Quick Claw', 'Soul Dew', 'Perish Song',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 5] CAP",
|
|
desc: "The Create-A-Pokémon project is a community dedicated to exploring and understanding the competitive Pokémon metagame by designing, creating, and playtesting new Pokémon concepts.",
|
|
mod: 'gen5',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 5] OU', '+CAP'],
|
|
banlist: ['Cawmodore'],
|
|
},
|
|
{
|
|
name: "[Gen 5] ZU",
|
|
mod: 'gen5',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 5] PU'],
|
|
banlist: [
|
|
// PU
|
|
'Audino', 'Banette', 'Beheeyem', 'Bronzor', 'Dodrio', 'Duosion', 'Dwebble', 'Fraxure', 'Gabite', 'Golduck',
|
|
'Huntail', 'Jumpluff', 'Klang', 'Krokorok', 'Mantine', 'Maractus', 'Mawile', 'Monferno', 'Murkrow', 'Natu',
|
|
'Purugly', 'Rampardos', 'Rapidash', 'Relicanth', 'Scraggy', 'Shiftry', 'Simisage', 'Sneasel', 'Stoutland',
|
|
'Stunfisk', 'Swanna', 'Swoobat', 'Tentacool', 'Torterra', 'Ursaring', 'Victreebel', 'Vileplume', 'Volbeat',
|
|
'Zebstrika', 'Zweilous',
|
|
// ZUBL
|
|
'Articuno', 'Dragonair', 'Glalie', 'Machoke', 'Marowak', 'Omanyte', 'Regigigas', 'Trubbish', 'Whirlipede',
|
|
'King\'s Rock', 'Quick Claw', 'Razor Fang', 'Baton Pass',
|
|
],
|
|
unbanlist: ['Damp Rock'],
|
|
},
|
|
{
|
|
name: "[Gen 5] BW1 OU",
|
|
mod: 'gen5bw1',
|
|
searchShow: false,
|
|
ruleset: ['Standard', 'Sleep Clause Mod', 'Swagger Clause', 'Baton Pass Stat Clause'],
|
|
banlist: ['Uber', 'Drizzle ++ Swift Swim', 'King\'s Rock', 'Razor Fang', 'Soul Dew'],
|
|
},
|
|
{
|
|
name: "[Gen 5] GBU Singles",
|
|
mod: 'gen5',
|
|
searchShow: false,
|
|
bestOfDefault: true,
|
|
ruleset: ['Flat Rules'],
|
|
banlist: ['Dark Void', 'Sky Drop', 'Soul Dew'],
|
|
},
|
|
{
|
|
name: "[Gen 5] Custom Game",
|
|
mod: 'gen5',
|
|
searchShow: false,
|
|
debug: true,
|
|
battle: { trunc: Math.trunc },
|
|
// no restrictions, for serious (other than team preview)
|
|
ruleset: ['Team Preview', 'Cancel Mod', 'Max Team Size = 24', 'Max Move Count = 24', 'Max Level = 9999', 'Default Level = 100'],
|
|
},
|
|
|
|
// B2/W2 Doubles
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
{
|
|
section: "B2/W2 Doubles",
|
|
column: 4,
|
|
},
|
|
{
|
|
name: "[Gen 5] VGC 2013",
|
|
mod: 'gen5',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
bestOfDefault: true,
|
|
ruleset: ['Flat Rules'],
|
|
banlist: ['Chatot', 'Dark Void', 'Sky Drop', 'Soul Dew'],
|
|
},
|
|
{
|
|
name: "[Gen 5] VGC 2012",
|
|
mod: 'gen5bw1',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
bestOfDefault: true,
|
|
ruleset: ['Flat Rules'],
|
|
banlist: ['Dark Void', 'Sky Drop'],
|
|
},
|
|
{
|
|
name: "[Gen 5] VGC 2011",
|
|
mod: 'gen5bw1',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
bestOfDefault: true,
|
|
ruleset: ['Flat Rules', 'Old Unova Pokedex'],
|
|
banlist: ['Sky Drop', 'Belue Berry', 'Durin Berry', 'Nomel Berry', 'Rabuta Berry', 'Spelon Berry', 'Watmel Berry'],
|
|
},
|
|
{
|
|
name: "[Gen 5] Doubles Custom Game",
|
|
mod: 'gen5',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
debug: true,
|
|
battle: { trunc: Math.trunc },
|
|
// no restrictions, for serious (other than team preview)
|
|
ruleset: ['Team Preview', 'Cancel Mod', 'Max Team Size = 24', 'Max Move Count = 24', 'Max Level = 9999', 'Default Level = 100'],
|
|
},
|
|
{
|
|
name: "[Gen 5] Triples Custom Game",
|
|
mod: 'gen5',
|
|
gameType: 'triples',
|
|
searchShow: false,
|
|
debug: true,
|
|
battle: { trunc: Math.trunc },
|
|
// no restrictions, for serious (other than team preview)
|
|
ruleset: ['Team Preview', 'Cancel Mod'],
|
|
},
|
|
|
|
// DPP Singles
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
{
|
|
section: "DPP Singles",
|
|
column: 4,
|
|
},
|
|
{
|
|
name: "[Gen 4] UU",
|
|
mod: 'gen4',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 4] OU', '!Baton Pass Stat Trap Clause', '!Freeze Clause Mod'],
|
|
banlist: ['OU', 'UUBL', 'Baton Pass'],
|
|
unbanlist: ['Arena Trap', 'Snow Cloak', 'Quick Claw', 'Swagger'],
|
|
},
|
|
{
|
|
name: "[Gen 4] NU",
|
|
mod: 'gen4',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 4] UU', 'Baton Pass Clause', '!Sleep Moves Clause', 'Sleep Clause Mod'],
|
|
banlist: ['UU', 'NUBL'],
|
|
unbanlist: ['Sand Veil', 'Baton Pass'],
|
|
},
|
|
{
|
|
name: "[Gen 4] LC",
|
|
mod: 'gen4',
|
|
searchShow: false,
|
|
ruleset: ['Standard', 'Little Cup', 'Evasion Abilities Clause', 'Sleep Moves Clause'],
|
|
banlist: [
|
|
'Meditite', 'Misdreavus', 'Murkrow', 'Scyther', 'Sneasel', 'Tangela', 'Yanma',
|
|
'Berry Juice', 'Deep Sea Tooth', 'Dragon Rage', 'Sonic Boom', 'Swagger',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 4] Anything Goes",
|
|
mod: 'gen4',
|
|
searchShow: false,
|
|
ruleset: ['Obtainable', 'Endless Battle Clause', 'HP Percentage Mod', 'Cancel Mod'],
|
|
},
|
|
{
|
|
name: "[Gen 4] 1v1",
|
|
desc: `Bring three Pokémon to Team Preview and choose one to battle.`,
|
|
mod: 'gen4',
|
|
searchShow: false,
|
|
ruleset: [
|
|
'Picked Team Size = 1', 'Max Team Size = 3',
|
|
'Standard', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview',
|
|
],
|
|
banlist: [
|
|
'Arceus', 'Clefable', 'Darkrai', 'Deoxys-Attack', 'Deoxys-Normal', 'Deoxys-Defense', 'Deoxys-Speed', 'Dialga', 'Garchomp',
|
|
'Giratina', 'Groudon', 'Ho-Oh', 'Jirachi', 'Kyogre', 'Latias', 'Latios', 'Lugia', 'Machamp', 'Manaphy', 'Mew', 'Mewtwo',
|
|
'Palkia', 'Porygon-Z', 'Rayquaza', 'Salamence', 'Shaymin', 'Shaymin-Sky', 'Snorlax', 'Togekiss', 'Focus Band', 'Focus Sash',
|
|
'Quick Claw', 'Soul Dew', 'Destiny Bond', 'Explosion', 'Perish Song', 'Self-Destruct',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 4] CAP",
|
|
desc: "The Create-A-Pokémon project is a community dedicated to exploring and understanding the competitive Pokémon metagame by designing, creating, and playtesting new Pokémon concepts.",
|
|
mod: 'gen4',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 4] OU', '+CAP'],
|
|
},
|
|
{
|
|
name: "[Gen 4] PU",
|
|
mod: 'gen4',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 4] NU'],
|
|
banlist: [
|
|
'Articuno', 'Cacturne', 'Charizard', 'Cradily', 'Dodrio', 'Drifblim', 'Dusclops', 'Electrode', 'Floatzel', 'Gardevoir', 'Gligar', 'Golem',
|
|
'Grumpig', 'Haunter', 'Hitmonchan', 'Hypno', 'Jumpluff', 'Jynx', 'Lickilicky', 'Linoone', 'Magmortar', 'Magneton', 'Manectric', 'Medicham',
|
|
'Meganium', 'Nidoqueen', 'Ninetales', 'Piloswine', 'Poliwrath', 'Porygon2', 'Regice', 'Regirock', 'Roselia', 'Sandslash', 'Sharpedo', 'Shiftry',
|
|
'Skuntank', 'Slowking', 'Tauros', 'Typhlosion', 'Venomoth', 'Vileplume',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 4] ZU",
|
|
mod: 'gen4',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 4] PU'],
|
|
banlist: [
|
|
'Ampharos', 'Armaldo', 'Bellossom', 'Dragonair', 'Electabuzz', 'Gabite', 'Gastrodon', 'Glaceon', 'Glalie',
|
|
'Golduck', 'Gorebyss', 'Hippopotas', 'Kadabra', 'Kingler', 'Lapras', 'Machoke', 'Magmar', 'Mantine', 'Marowak',
|
|
'Metang', 'Misdreavus', 'Monferno', 'Mr. Mime', 'Muk', 'Murkrow', 'Pinsir', 'Politoed', 'Purugly', 'Quagsire',
|
|
'Raichu', 'Rampardos', 'Rapidash', 'Regigigas', 'Relicanth', 'Rhydon', 'Scyther', 'Sneasel', 'Snover',
|
|
'Solrock', 'Tangela', 'Torkoal', 'Victreebel', 'Xatu', 'Walrein', 'Zangoose', 'Damp Rock',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 4] Custom Game",
|
|
mod: 'gen4',
|
|
searchShow: false,
|
|
debug: true,
|
|
battle: { trunc: Math.trunc },
|
|
// no restrictions
|
|
ruleset: ['Cancel Mod', 'Max Team Size = 24', 'Max Move Count = 24', 'Max Level = 9999', 'Default Level = 100'],
|
|
},
|
|
|
|
// DPP Doubles
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
{
|
|
section: "DPP Doubles",
|
|
column: 4,
|
|
},
|
|
{
|
|
name: "[Gen 4] VGC 2010",
|
|
mod: 'gen4',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
bestOfDefault: true,
|
|
ruleset: ['Flat Rules'],
|
|
restricted: ['Restricted Legendary'],
|
|
banlist: ['Soul Dew'],
|
|
onValidateTeam(team) {
|
|
const problems = [];
|
|
const restrictedSpecies = [];
|
|
const nonRestrictedSpecies = [];
|
|
for (const set of team) {
|
|
const species = this.dex.species.get(set.species);
|
|
if (this.ruleTable.isRestrictedSpecies(species)) {
|
|
restrictedSpecies.push(species.name);
|
|
} else {
|
|
nonRestrictedSpecies.push(species.name);
|
|
}
|
|
}
|
|
if (restrictedSpecies.length > 4) {
|
|
problems.push(`You can only use up to four restricted Pok\u00e9mon; you have: ${restrictedSpecies.join(', ')}`);
|
|
}
|
|
if (nonRestrictedSpecies.length < 2) {
|
|
problems.push(`You must use at least two non-restricted Pok\u00e9mon; you have: ${nonRestrictedSpecies.length ? nonRestrictedSpecies[0] : 'None'}.`);
|
|
}
|
|
return problems;
|
|
},
|
|
onChooseTeam(positions, pokemon, autoChoose) {
|
|
if (autoChoose) {
|
|
positions = [];
|
|
let restrictedCount = 0;
|
|
for (let i = 0; i < pokemon.length; i++) {
|
|
if (this.ruleTable.isRestrictedSpecies(pokemon[i].species)) {
|
|
restrictedCount++;
|
|
if (restrictedCount > 2) continue;
|
|
}
|
|
positions.push(i);
|
|
}
|
|
return positions;
|
|
}
|
|
const restrictedCount = positions.filter(pos => this.ruleTable.isRestrictedSpecies(pokemon[pos].species)).length;
|
|
if (restrictedCount > 2) {
|
|
return `You can only bring up to two restricted Pok\u00e9mon to the battle.`;
|
|
}
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 4] Doubles Custom Game",
|
|
mod: 'gen4',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
debug: true,
|
|
battle: { trunc: Math.trunc },
|
|
// no restrictions
|
|
ruleset: ['Cancel Mod', 'Max Team Size = 24', 'Max Move Count = 24', 'Max Level = 9999', 'Default Level = 100'],
|
|
},
|
|
|
|
// Past Generations
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
{
|
|
section: "Past Generations",
|
|
column: 4,
|
|
},
|
|
{
|
|
name: "[Gen 3] Ubers",
|
|
mod: 'gen3',
|
|
searchShow: false,
|
|
ruleset: ['Standard', 'Deoxys Camouflage Clause', 'One Baton Pass Clause'],
|
|
banlist: ['Wobbuffet + Leftovers', 'Wynaut + Leftovers', 'Baton Pass'],
|
|
},
|
|
{
|
|
name: "[Gen 3] UU",
|
|
mod: 'gen3',
|
|
searchShow: false,
|
|
ruleset: ['Standard'],
|
|
banlist: ['Uber', 'OU', 'UUBL', 'Smeargle + Ingrain', 'Arena Trap', 'Baton Pass', 'Swagger'],
|
|
},
|
|
{
|
|
name: "[Gen 3] RU",
|
|
mod: 'gen3',
|
|
searchShow: false,
|
|
ruleset: ['Standard'],
|
|
banlist: ['Uber', 'OU', 'UUBL', 'UU', 'RUBL', 'Glalie', 'Smeargle + Ingrain', 'Arena Trap', 'Baton Pass', 'Swagger'],
|
|
},
|
|
{
|
|
name: "[Gen 3] NU",
|
|
mod: 'gen3',
|
|
searchShow: false,
|
|
ruleset: ['Standard', 'One Boost Passer Clause'],
|
|
banlist: ['Uber', 'OU', 'UUBL', 'UU', 'RUBL', 'RU', 'NUBL', 'Smeargle + Ingrain'],
|
|
},
|
|
{
|
|
name: "[Gen 3] PU",
|
|
mod: 'gen3',
|
|
searchShow: false,
|
|
ruleset: ['Standard', 'Baton Pass Stat Clause'],
|
|
banlist: ['Uber', 'OU', 'UUBL', 'UU', 'RUBL', 'RU', 'NUBL', 'NU', 'PUBL', 'Baton Pass + Substitute'],
|
|
},
|
|
{
|
|
name: "[Gen 3] LC",
|
|
mod: 'gen3',
|
|
searchShow: false,
|
|
ruleset: ['Standard', 'Little Cup', 'Sleep Moves Clause', 'Accuracy Moves Clause'],
|
|
banlist: ['Chansey', 'Diglett', 'Meditite', 'Omanyte', 'Porygon', 'Scyther', 'Wynaut', 'Zigzagoon', 'Deep Sea Tooth', 'Baton Pass', 'Dragon Rage', 'Sonic Boom', 'Swagger', 'Thunder Wave'],
|
|
},
|
|
{
|
|
name: "[Gen 3] 1v1",
|
|
desc: `Bring three Pokémon to Team Preview and choose one to battle.`,
|
|
mod: 'gen3',
|
|
searchShow: false,
|
|
ruleset: [
|
|
'Picked Team Size = 1', 'Max Team Size = 3',
|
|
'Standard', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview',
|
|
],
|
|
banlist: [
|
|
'Clefable', 'Deoxys', 'Deoxys-Attack', 'Deoxys-Defense', 'Deoxys-Speed', 'Groudon', 'Ho-Oh', 'Kyogre', 'Latias', 'Latios',
|
|
'Lugia', 'Mew', 'Mewtwo', 'Rayquaza', 'Slaking', 'Snorlax', 'Suicune', 'Zapdos', 'Destiny Bond', 'Explosion', 'Perish Song',
|
|
'Self-Destruct', 'Focus Band', 'King\'s Rock', 'Quick Claw',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 3] UUBL",
|
|
mod: 'gen3',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 3] OU', '!Accuracy Trap Clause'],
|
|
banlist: [
|
|
'OU', 'Smeargle + Ingrain', 'Baton Pass + Block', 'Baton Pass + Mean Look', 'Baton Pass + Spider Web', 'Flail', 'Reversal',
|
|
'Baton Pass + Speed Boost', 'Baton Pass + Agility', 'Baton Pass + Dragon Dance', 'Baton Pass + Salac Berry',
|
|
],
|
|
unbanlist: ['Soundproof', 'Sand Veil'],
|
|
},
|
|
{
|
|
name: "[Gen 3] ZU",
|
|
mod: 'gen3',
|
|
searchShow: false,
|
|
ruleset: ['Standard', 'Sleep Moves Clause', 'Baton Pass Stat Trap Clause', 'Swagger Clause'],
|
|
banlist: ['Uber', 'OU', 'UUBL', 'UU', 'RUBL', 'RU', 'NUBL', 'NU', 'PUBL', 'PU', 'ZUBL', 'Baton Pass + Substitute'],
|
|
},
|
|
{
|
|
name: "[Gen 3] ADV 200",
|
|
mod: 'gen3rs',
|
|
searchShow: false,
|
|
ruleset: ['Standard', 'One Boost Passer Clause'],
|
|
banlist: ['Uber', 'Swagger'],
|
|
},
|
|
{
|
|
name: "[Gen 3] ADV 200 Doubles",
|
|
mod: 'gen3rs',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
ruleset: ['Standard', '!Switch Priority Clause Mod'],
|
|
banlist: ['Uber', 'Quick Claw', 'Soul Dew', 'Swagger'],
|
|
},
|
|
{
|
|
name: "[Gen 3] Orre Colosseum",
|
|
mod: 'gen3colosseum',
|
|
searchShow: false,
|
|
gameType: 'doubles',
|
|
ruleset: [
|
|
'Obtainable', 'Team Preview', 'Species Clause', 'Stadium Sleep Clause', 'Freeze Clause Mod', 'Max Team Size = 6', 'VGC Timer',
|
|
'Nickname Clause', 'Endless Battle Clause', 'Cancel Mod', 'Picked Team Size = 4', 'Exact HP Mod', 'Item Clause = 1', 'Open Team Sheets',
|
|
],
|
|
banlist: ['Soul Dew', 'Deoxys-Defense', 'Deoxys-Attack', 'Deoxys-Speed', 'Restricted Legendary', 'Mythical'],
|
|
unbanlist: ['Latios', 'Latias', 'Wobbuffet', 'Wynaut'],
|
|
bestOfDefault: true,
|
|
onBegin() {
|
|
this.add('rule', 'Self-KO Clause: If your last Pok\u00e9mon faints to a self-KO move or effect, you will lose the battle');
|
|
},
|
|
},
|
|
{
|
|
name: "[Gen 3] Custom Game",
|
|
mod: 'gen3',
|
|
searchShow: false,
|
|
debug: true,
|
|
battle: { trunc: Math.trunc },
|
|
ruleset: ['HP Percentage Mod', 'Cancel Mod', 'Max Team Size = 24', 'Max Move Count = 24', 'Max Level = 9999', 'Default Level = 100'],
|
|
},
|
|
{
|
|
name: "[Gen 3] Doubles Custom Game",
|
|
mod: 'gen3',
|
|
gameType: 'doubles',
|
|
searchShow: false,
|
|
debug: true,
|
|
ruleset: ['HP Percentage Mod', 'Cancel Mod', 'Max Team Size = 24', 'Max Move Count = 24', 'Max Level = 9999', 'Default Level = 100'],
|
|
},
|
|
{
|
|
name: "[Gen 2] Ubers",
|
|
mod: 'gen2',
|
|
searchShow: false,
|
|
ruleset: ['Standard'],
|
|
},
|
|
{
|
|
name: "[Gen 2] UU",
|
|
mod: 'gen2',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 2] OU'],
|
|
banlist: ['OU', 'UUBL', 'Agility + Baton Pass'],
|
|
unbanlist: ['Mean Look + Baton Pass', 'Spider Web + Baton Pass'],
|
|
},
|
|
{
|
|
name: "[Gen 2] NU",
|
|
mod: 'gen2',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 2] UU'],
|
|
banlist: ['UU', 'NUBL', 'Swagger'],
|
|
unbanlist: ['Agility + Baton Pass'],
|
|
},
|
|
{
|
|
name: "[Gen 2] PU",
|
|
mod: 'gen2',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 2] NU'],
|
|
banlist: ['NU', 'PUBL', 'Baton Pass'],
|
|
unbanlist: ['Swagger'],
|
|
},
|
|
{
|
|
name: "[Gen 2] 1v1",
|
|
mod: 'gen2',
|
|
searchShow: false,
|
|
ruleset: [
|
|
'Picked Team Size = 1', 'Max Team Size = 3',
|
|
'Standard', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview',
|
|
],
|
|
banlist: [
|
|
'Alakazam', 'Celebi', 'Clefable', 'Ho-Oh', 'Lugia', 'Mew', 'Mewtwo', 'Snorlax', 'Zapdos',
|
|
'Berserk Gene', 'Focus Band', 'King\'s Rock', 'Quick Claw', 'Attract', 'Destiny Bond',
|
|
'Explosion', 'Perish Song', 'Present', 'Self-Destruct', 'Confuse Ray', 'Supersonic', 'Swagger',
|
|
'Sweet Kiss',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 2] ZU",
|
|
mod: 'gen2',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 2] PU'],
|
|
banlist: ['PU', 'ZUBL', 'Baton Pass + Mean Look', 'Baton Pass + Spider Web'],
|
|
unbanlist: ['Baton Pass'],
|
|
},
|
|
{
|
|
name: "[Gen 2] NC 2000",
|
|
mod: 'gen2stadium2',
|
|
bestOfDefault: true,
|
|
searchShow: false,
|
|
ruleset: [
|
|
'Picked Team Size = 3', 'Min Level = 50', 'Max Level = 55', 'Max Total Level = 155',
|
|
'Obtainable', 'Stadium Sleep Clause', 'Freeze Clause Mod', 'Species Clause', 'Item Clause = 1', 'Endless Battle Clause', 'Cancel Mod', 'Event Moves Clause', 'Nickname Clause', 'Team Preview',
|
|
],
|
|
banlist: ['Uber'],
|
|
},
|
|
{
|
|
name: "[Gen 2] Stadium OU",
|
|
mod: 'gen2stadium2',
|
|
searchShow: false,
|
|
ruleset: ['Standard'],
|
|
banlist: ['Uber'],
|
|
},
|
|
{
|
|
name: "[Gen 2] Custom Game",
|
|
mod: 'gen2',
|
|
searchShow: false,
|
|
debug: true,
|
|
battle: { trunc: Math.trunc },
|
|
ruleset: ['HP Percentage Mod', 'Cancel Mod', 'Max Team Size = 24', 'Max Move Count = 24', 'Max Level = 9999', 'Default Level = 100'],
|
|
},
|
|
{
|
|
name: "[Gen 1] Ubers",
|
|
mod: 'gen1',
|
|
searchShow: false,
|
|
ruleset: ['Standard'],
|
|
},
|
|
{
|
|
name: "[Gen 1] UU",
|
|
mod: 'gen1',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 1] OU'],
|
|
banlist: ['OU', 'UUBL', 'Bind', 'Clamp', 'Confuse Ray', 'Fire Spin', 'Supersonic', 'Wrap'],
|
|
},
|
|
{
|
|
name: "[Gen 1] NU",
|
|
mod: 'gen1',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 1] UU'],
|
|
banlist: ['UU', 'NUBL'],
|
|
},
|
|
{
|
|
name: "[Gen 1] PU",
|
|
mod: 'gen1',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 1] NU'],
|
|
banlist: ['NU', 'PUBL'],
|
|
},
|
|
{
|
|
name: "[Gen 1] ZU",
|
|
mod: 'gen1',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 1] PU'],
|
|
banlist: ['PU', 'ZUBL'],
|
|
},
|
|
{
|
|
name: "[Gen 1] LC",
|
|
mod: 'gen1',
|
|
searchShow: false,
|
|
ruleset: ['Little Cup', 'Standard', '!Max Level', 'Adjust Level = 5', 'Sleep Moves Clause', 'Accuracy Moves Clause'],
|
|
banlist: ['Dragon Rage', 'Fire Spin', 'Sonic Boom', 'Wrap'],
|
|
},
|
|
{
|
|
name: "[Gen 1] 1v1",
|
|
mod: 'gen1',
|
|
searchShow: false,
|
|
ruleset: [
|
|
'Picked Team Size = 1', 'Max Team Size = 3',
|
|
'Standard', 'Accuracy Moves Clause', 'Sleep Moves Clause', 'Team Preview',
|
|
],
|
|
banlist: ['Mew', 'Mewtwo', 'Bind', 'Clamp', 'Explosion', 'Fire Spin', 'Self-Destruct', 'Wrap'],
|
|
},
|
|
{
|
|
name: "[Gen 1] NC 1997",
|
|
mod: 'gen1jpn',
|
|
bestOfDefault: true,
|
|
searchShow: false,
|
|
ruleset: [
|
|
'Picked Team Size = 3', 'Min Level = 50', 'Max Level = 55', 'Max Total Level = 155',
|
|
'Obtainable', 'Team Preview', 'Stadium Sleep Clause', 'Species Clause', 'Nickname Clause', 'Cancel Mod', 'NC 1997 Move Legality',
|
|
],
|
|
banlist: ['Uber'],
|
|
},
|
|
{
|
|
name: "[Gen 1] Japanese OU",
|
|
desc: `Generation 1 with Japanese battle mechanics.`,
|
|
mod: 'gen1jpn',
|
|
searchShow: false,
|
|
ruleset: ['Standard'],
|
|
banlist: ['Uber'],
|
|
},
|
|
{
|
|
name: "[Gen 1] Stadium OU",
|
|
mod: 'gen1stadium',
|
|
searchShow: false,
|
|
ruleset: ['Standard', 'Team Preview'],
|
|
banlist: ['Uber',
|
|
'Nidoking + Fury Attack + Thrash', 'Exeggutor + Poison Powder + Stomp', 'Exeggutor + Sleep Powder + Stomp',
|
|
'Exeggutor + Stun Spore + Stomp', 'Jolteon + Focus Energy + Thunder Shock', 'Flareon + Focus Energy + Ember',
|
|
],
|
|
},
|
|
{
|
|
name: "[Gen 1] Tradebacks OU",
|
|
desc: `RBY OU with movepool additions from the Time Capsule.`,
|
|
mod: 'gen1',
|
|
searchShow: false,
|
|
ruleset: ['[Gen 1] OU', 'Allow Tradeback'],
|
|
},
|
|
{
|
|
name: "[Gen 1] Custom Game",
|
|
mod: 'gen1',
|
|
searchShow: false,
|
|
debug: true,
|
|
battle: { trunc: Math.trunc },
|
|
ruleset: ['HP Percentage Mod', 'Cancel Mod', 'Desync Clause Mod', 'Max Team Size = 24', 'Max Move Count = 24', 'Max Level = 9999', 'Default Level = 100'],
|
|
},
|
|
];
|