"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var formats_exports = {};
__export(formats_exports, {
Formats: () => Formats
});
module.exports = __toCommonJS(formats_exports);
const Formats = [
// 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",
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: "random",
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",
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", "Sleep Moves Clause", "!Sleep Clause Mod"],
banlist: ["Uber", "AG", "Arena Trap", "Moody", "Sand Veil", "Shadow Tag", "Snow Cloak", "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",
"Meditite",
"Misdreavus",
"Murkrow",
"Porygon",
"Qwilfish-Hisui",
"Rufflet",
"Scraggy",
"Scyther",
"Sneasel",
"Sneasel-Hisui",
"Snivy",
"Stantler",
"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",
"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",
"Acupressure",
"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 G",
mod: "gen9",
bestOfDefault: true,
ruleset: ["Flat Rules", "!! Adjust Level = 50", "Min Source Gen = 9", "VGC Timer", "Limit One Restricted"],
restricted: ["Restricted Legendary"]
},
{
name: "[Gen 9] BSS Reg H",
mod: "gen9",
searchShow: false,
bestOfDefault: true,
ruleset: ["Flat Rules", "!! Adjust Level = 50", "Min Source Gen = 9", "VGC Timer"],
banlist: ["Sub-Legendary", "Paradox", "Gouging Fire", "Iron Boulder", "Iron Crown", "Raging Bolt"]
},
{
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",
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"]
},
{
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", "Murkrow", "Qwilfish-Hisui", "Scyther", "Sneasel", "Sneasel-Hisui", "Vulpix", "Vulpix-Alola", "Yanma"]
},
{
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 2025 Reg G",
mod: "gen9",
gameType: "doubles",
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 2025 Reg G (Bo3)",
mod: "gen9",
gameType: "doubles",
bestOfDefault: true,
ruleset: ["Flat Rules", "!! Adjust Level = 50", "Min Source Gen = 9", "VGC Timer", "Force Open Team Sheets", "Best of = 3", "Limit One Restricted"],
restricted: ["Restricted Legendary"]
},
{
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",
"Reshiram",
"Scream Tail",
"Shaymin-Sky",
"Snorlax",
"Solgaleo",
"Terapagos",
"Zacian",
"Zacian-Crowned",
"Zamazenta",
"Zamazenta-Crowned",
"Zekrom",
"Moody",
"Focus Band",
"Focus Sash",
"King's Rock",
"Razor Fang",
"Quick Claw",
"Acupressure",
"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: ["Min Source Gen = 9", "Obtainable", "Team Preview", "HP Percentage Mod", "Cancel Mod", "Endless Battle Clause"]
},
{
name: "[Gen 9] Ubers UU",
mod: "gen9",
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",
"Eternatus",
"Flutter Mane",
"Giratina-Origin",
"Glimmora",
"Gliscor",
"Grimmsnarl",
"Groudon",
"Ho-Oh",
"Kingambit",
"Koraidon",
"Kyogre",
"Kyurem-Black",
"Landorus-Therian",
"Lunala",
"Mewtwo",
"Miraidon",
"Necrozma-Dusk-Mane",
"Rayquaza",
"Ribombee",
"Skeledirge",
"Ting-Lu",
"Zacian-Crowned",
// Ubers UUBL + Lunala, Arceus-Ghost, Arceus-Water
"Arceus-Dragon",
"Arceus-Fire",
"Arceus-Flying",
"Arceus-Steel",
"Necrozma-Dawn-Wings",
"Shaymin-Sky",
"Zekrom"
]
},
{
name: "[Gen 9] ZU",
mod: "gen9",
ruleset: ["[Gen 9] PU"],
banlist: ["PU", "ZUBL", "Unburden"]
},
{
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",
"Acupressure",
"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: [
"Bulbasaur",
"Chinchou",
"Diglett-Alola",
"Drifloon",
"Elekid",
"Foongus",
"Glimmet",
"Gothita",
"Grookey",
"Growlithe-Hisui",
"Houndour",
"Magby",
"Mareanie",
"Mienfoo",
"Minccino",
"Mudbray",
"Pawniard",
"Sandshrew-Alola",
"Shellder",
"Shellos",
"Snover",
"Stunky",
"Timburr",
"Tinkatink",
"Toedscool",
"Torchic",
"Vullaby",
"Wingull",
"Zorua-Hisui"
]
},
{
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",
"Porygon2",
"Primeape",
"Qwilfish-Hisui",
"Rhydon",
"Scyther",
"Sneasel",
"Sneasel-Hisui",
"Ursaring",
"Vulpix-Base",
"Arena Trap",
"Magnet Pull",
"Moody",
"Shadow Tag",
"Baton Pass"
]
},
// Pet Mods
///////////////////////////////////////////////////////////////////
{
section: "Pet Mods"
},
{
name: "[Gen 9] Little Colosseum LC",
desc: `A Little Cup metagame that aims to buff weaker Pokemon and nerf LC Ubers to create a more diverse metagame.`,
mod: "littlecolosseum",
searchShow: false,
ruleset: ["Little Cup", "Standard"],
banlist: [
"Aipom",
"Basculin-White-Striped",
"Diglett-Base",
"Dunsparce",
"Duraludon",
"Flittle",
"Girafarig",
"Gligar",
"Meditite",
"Misdreavus",
"Murkrow",
"Porygon",
"Qwilfish-Hisui",
"Rufflet",
"Scraggy",
"Scyther",
"Sneasel",
"Sneasel-Hisui",
"Snivy",
"Stantler",
"Vulpix",
"Vulpix-Alola",
"Yanma",
"Moody",
"Baton Pass",
"Sticky Web"
],
onBegin() {
this.add("-message", `Welcome to Little Colosseum!`);
this.add("-message", `This is a Generation 9 LC-based Pet Mod where multiple Pokemon have been reimagined in order to fit the LC metagame.`);
this.add("-message", `You can find our thread and metagame resources here:`);
this.add("-message", `https://www.smogon.com/forums/threads/3749020/`);
},
onSwitchIn(pokemon) {
this.add("-start", pokemon, "typechange", (pokemon.illusion || pokemon).getTypes(true).join("/"), "[silent]");
pokemon.apparentType = pokemon.getTypes(true).join("/");
}
},
{
name: "[Gen 2] GSC Doubles",
desc: `A Gen 2 metagame that adds doubles to the game.`,
mod: "gen2doubles",
gameType: "doubles",
searchShow: false,
ruleset: ["Standard Doubles", "Swagger Clause"],
banlist: ["Uber", "Bright Powder", "King's Rock", "Quick Claw"],
onBegin() {
this.add("-message", `Welcome to GSC Doubles!`);
this.add("-message", `This is a Generation 2 Pet Mod that brings the Doubles game mode introduced in Generation 3 back in time to GSC.`);
this.add("-message", `You can find our metagame resources here:`);
this.add("-message", `https://www.smogon.com/forums/threads/3755811/`);
}
},
// 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"]
},
{
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] Galar Dex Draft",
mod: "gen8",
searchShow: false,
ruleset: ["Standard Draft", "Dynamax Clause"]
},
{
name: "[Gen 8] NatDex Draft",
mod: "gen8",
searchShow: false,
ruleset: ["Standard Draft", "Dynamax Clause", "+Past"]
},
{
name: "[Gen 8] NatDex 4v4 Doubles Draft",
mod: "gen8",
gameType: "doubles",
searchShow: false,
ruleset: ["Standard Draft", "Item Clause = 1", "!Sleep Clause Mod", "!OHKO Clause", "!Evasion Moves Clause", "Adjust Level = 50", "Picked Team Size = 4", "+Past"]
},
{
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", "Landorus + Sheer Force", "Excadrill + Sand Rush"]
},
{
name: "[Gen 4] Draft",
mod: "gen4",
searchShow: false,
ruleset: ["Standard Draft", "Swagger Clause", "DryPass Clause", "Sleep Moves Clause", "!Team Preview", "!Evasion Abilities Clause"],
banlist: ["King's Rock", "Quick Claw", "Assist", "Acupressure", "Sand Stream ++ Sand Veil", "Snow Warning ++ Snow Cloak"]
},
{
name: "[Gen 3] Draft",
mod: "gen3",
searchShow: false,
ruleset: ["Standard Draft", "Swagger Clause", "DryPass Clause", "!Team Preview"],
banlist: ["King's Rock", "Quick Claw", "Assist"]
},
// OM of the Month
///////////////////////////////////////////////////////////////////
{
section: "OM of the Month",
column: 2
},
{
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",
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",
"Kingambit",
"Koraidon",
"Kyogre",
"Kyurem-Black",
"Kyurem-White",
"Landorus-Incarnate",
"Lugia",
"Lunala",
"Magearna",
"Mamoswine",
"Meowscarada",
"Mewtwo",
"Miraidon",
"Necrozma-Dawn-Wings",
"Necrozma-Dusk-Mane",
"Ogerpon-Hearthflame",
"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",
"Acupressure",
"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",
"Salt Cure",
"Shell Smash",
"Shift Gear",
"Surging Strikes",
"Tail Glow"
]
},
{
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",
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() {
for (const pokemon of this.getAllActive(false, true)) {
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 = [];
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) {
let allies = this.active.filter((ally) => ally);
if (!all)
allies = allies.filter((ally) => ally.hp && !ally.volatiles["commanding"]);
return allies;
}
}
},
// 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",
"Diancie-Mega",
"Gengar-Mega",
"Groudon-Primal",
"Kartana",
"Mewtwo-Mega-X",
"Mewtwo-Mega-Y",
"Rayquaza-Mega",
"Regigigas",
"Shedinja",
"Slaking",
"Arena Trap",
"Comatose",
"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",
"Baton Pass",
"Belly Drum",
"Ceaseless Edge",
"Clangorous Soul",
"Dire Claw",
"Electro Shot",
"Fillet Away",
"Imprison",
"Last Respects",
"Lumina Crash",
"No Retreat",
"Photon Geyser",
"Quiver Dance",
"Rage Fist",
"Revival Blessing",
"Shed Tail",
"Substitute",
"Shell Smash",
"Tail Glow"
]
},
{
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", "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",
"Bright Powder",
"Focus Band",
"King's Rock",
"Quick Claw",
"Razor Fang",
"Baton Pass",
"Last Respects",
"Shed Tail"
],
restricted: [
"Alomomola",
"Annihilape",
"Arceus",
"Baxcalibur",
"Calyrex-Ice",
"Chien-Pao",
"Chi-Yu",
"Crawdaunt",
"Deoxys-Normal",
"Deoxys-Speed",
"Dialga",
"Dialga-Origin",
"Dragapult",
"Espathra",
"Eternatus",
"Flutter Mane",
"Gholdengo",
"Giratina",
"Giratina-Origin",
"Gliscor",
"Gouging Fire",
"Groudon",
"Hawlucha",
"Ho-Oh",
"Iron Bundle",
"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",
"Mawilite",
"Medichamite",
"Pidgeotite",
"Red Orb",
"Baton Pass",
"Shed Tail"
],
restricted: [
"Arceus",
"Basculegion-M",
"Calyrex-Ice",
"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",
"Zacian",
"Zekrom"
],
onValidateTeam(team) {
const itemTable = /* @__PURE__ */ new Set();
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("standardnatdex");
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.originalSpecies);
if (originalSpecies.exists && pokemon.m.originalSpecies !== originalSpecies.baseSpecies) {
this.add("-start", pokemon, originalSpecies.requiredItems?.[0] || originalSpecies.requiredItem || originalSpecies.requiredMove, "[silent]");
const oSpecies = this.dex.species.get(pokemon.m.originalSpecies);
if (oSpecies.types.length !== pokemon.species.types.length || oSpecies.types[1] !== pokemon.species.types[1] || oSpecies.types[0] !== pokemon.species.types[0]) {
this.add("-start", pokemon, "typechange", pokemon.species.types.join("/"), "[silent]");
}
}
},
onSwitchOut(pokemon) {
const originalSpecies = this.dex.species.get(pokemon.species.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-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",
"Purifying Salt",
"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 = /* @__PURE__ */ new Set();
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:" + ability;
pokemon.volatiles[effect] = this.initEffectState({ id: this.toID(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: [
"Araquanid",
"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",
"Ho-Oh",
"Iron Bundle",
"Kingambit",
"Komala",
"Koraidon",
"Kyogre",
"Kyurem-Base",
"Kyurem-Black",
"Kyurem-White",
"Landorus-Incarnate",
"Lugia",
"Lunala",
"Magearna",
"Manaphy",
"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",
"Rage Fist",
"Shed Tail"
],
restricted: [
"Astral Barrage",
"Acupressure",
"Belly Drum",
"Clangorous Soul",
"Ceaseless Edge",
"Dire Claw",
"Dragon Energy",
"Electro Shot",
"Extreme Speed",
"Fillet Away",
"Final Gambit",
"Flower Trick",
"Gigaton Hammer",
"No Retreat",
"Revival Blessing",
"Shell Smash",
"Shift Gear",
"Triple Arrows",
"V-create",
"Victory Dance",
"Wicked Blow",
"Wicked Torque"
]
},
{
name: "[Gen 7] Pure Hackmons",
desc: `Anything that can be hacked in-game and is usable in local battles is allowed.`,
mod: "gen7",
ruleset: ["-Nonexistent", "Team Preview", "HP Percentage Mod", "Cancel Mod", "Endless Battle Clause"]
},
// Challengeable OMs
///////////////////////////////////////////////////////////////////
{
section: "Challengeable OMs",
column: 2
},
{
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] 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",
"Deoxys-Speed",
"Dialga",
"Dialga-Origin",
"Dragonite",
"Drednaw",
"Enamorus-Incarnate",
"Espathra",
"Eternatus",
"Flutter Mane",
"Giratina",
"Giratina-Origin",
"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",
"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", "Sleep Clause Mod", "Convergence Legality", "Terastal Clause", "!Obtainable Abilities"],
banlist: [
"Arceus",
"Calyrex-Ice",
"Calyrex-Shadow",
"Chi-Yu",
"Chien-Pao",
"Darkrai",
"Deoxys-Normal",
"Deoxys-Attack",
"Deoxys-Speed",
"Dialga",
"Dialga-Origin",
"Dondozo",
"Eternatus",
"Flutter Mane",
"Giratina",
"Giratina-Origin",
"Groudon",
"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",
"Primarina",
"Rayquaza",
"Regieleki",
"Regigigas",
"Reshiram",
"Shaymin-Sky",
"Solgaleo",
"Slaking",
"Smeargle",
"Spectrier",
"Urshifu-Single-Strike",
"Urshifu-Rapid-Strike",
"Walking Wake",
"Zacian",
"Zacian-Crowned",
"Zamazenta",
"Zamazenta-Crowned",
"Zekrom",
"Arena Trap",
"Comatose",
"Contrary",
"Drizzle",
"Imposter",
"Moody",
"Pure Power",
"Shadow Tag",
"Speed Boost",
"Unburden",
"Heat Rock",
"King's Rock",
"Light Clay",
"Razor Fang",
"Baton Pass",
"Boomburst",
"Extreme Speed",
"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 = /* @__PURE__ */ new Set();
for (const set of team) {
const name = set.name;
const species = this.dex.species.get(name);
if (nums.has(species.num)) {
return [
`Your Pok\xE9mon must have different nicknames.`,
`(You have more than one Pok\xE9mon 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\xE9mon.`,
`(If this was intentional, add a nickname to one Pok\xE9mon that isn't the name of a Pok\xE9mon species.)`
];
}
},
checkCanLearn(move, species, lsetData, set) {
if (!set.sp?.exists || !set.crossSpecies?.exists) {
return this.checkCanLearn(move, species, lsetData, set);
}
const problem = this.checkCanLearn(move, set.sp);
if (!problem)
return null;
if (this.checkCanLearn(move, set.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("standardnatdex") && 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("standardnatdex") && 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.sp = species;
set.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;
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;
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] 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] 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",
"Lugia",
"Lunala",
"Magearna",
"Meowscarada",
"Mewtwo",
"Miraidon",
"Necrozma-Dawn-Wings",
"Necrozma-Dusk-Mane",
"Palafin",
"Palkia",
"Palkia-Origin",
"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",
"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 = /* @__PURE__ */ new Set();
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.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";
}
}
},
onModifyMovePriority: 1,
onModifyMove(move, pokemon, target) {
const forte = 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[i] = forte.self[i];
}
} else {
move.self = { ...move.self || {}, ...forte.self };
}
}
if (forte.selfBoost?.boosts) {
if (!move.selfBoost?.boosts)
move.selfBoost = { boosts: {} };
let 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"
];
for (const property of VALID_PROPERTIES) {
if (forte[property]) {
move[property] = forte[property];
}
}
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", "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",
"Deoxys",
"Deoxys-Attack",
"Deoxys-Defense",
"Deoxys-Speed",
"Dialga",
"Dialga-Origin",
"Dragapult",
"Electrode-Hisui",
"Eternatus",
"Giratina",
"Giratina-Origin",
"Goodra-Hisui",
"Groudon",
"Ho-Oh",
"Iron Bundle",
"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",
"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",
"Razor Fang",
"Baton Pass",
"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 = /* @__PURE__ */ 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\xE9mon "${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\xE9mon.`];
this.format.debug = true;
if (!teamHas.abilitySources)
teamHas.abilitySources = /* @__PURE__ */ Object.create(null);
const validSources = teamHas.abilitySources[this.toID(set.species)] = [];
let canonicalSource = "";
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;
const annoyingPokemon = ["Iron Leaves", "Walking Wake", "Iron Boulder", "Gouging Fire", "Iron Crown", "Raging Bolt"];
if (annoyingPokemon.includes(donorSpecies.name) || annoyingPokemon.includes(species.name)) {
set.hpType = "Dark";
}
const problems = this.validateSet(set, teamHas);
if (!problems?.length) {
validSources.push(evoFamily);
canonicalSource = donorSpecies.name;
}
if (validSources.length > 1)
break;
}
this.format.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}.`];
}
set.pokeball = `${set.pokeball}0${canonicalSource}`;
return null;
},
onValidateTeam(team, f, teamHas) {
if (this.ruleTable.has("abilityclause")) {
const abilityTable = new this.dex.Multiset();
const base = {
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];
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);
}
}
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));
}
const requiredFamilies = /* @__PURE__ */ 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.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;
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: {
spreadModify(baseStats, set) {
const modStats = { atk: 10, def: 10, spa: 10, spd: 10, spe: 10 };
const tr = this.trunc;
const nature = this.dex.natures.get(set.nature);
let statName;
for (statName in modStats) {
const stat = baseStats[statName];
let usedStat = statName;
if (nature.plus) {
if (statName === nature.minus) {
usedStat = nature.plus;
} else if (statName === nature.plus) {
usedStat = nature.minus;
}
}
modStats[statName] = tr(tr(2 * stat + set.ivs[usedStat] + tr(set.evs[usedStat] / 4)) * set.level / 100 + 5);
}
if ("hp" in baseStats) {
const stat = baseStats["hp"];
modStats["hp"] = tr(tr(2 * stat + set.ivs["hp"] + tr(set.evs["hp"] / 4) + 100) * set.level / 100 + 10);
}
return this.natureModify(modStats, set);
},
natureModify(stats, set) {
const tr = this.trunc;
const nature = this.dex.natures.get(set.nature);
let s;
if (nature.plus) {
s = nature.minus;
const stat = this.ruleTable.has("overflowstatmod") ? Math.min(stats[s], 595) : stats[s];
stats[s] = this.ruleTable.has("overflowstatmod") ? Math.min(stats[nature.plus], 728) : stats[nature.plus];
stats[nature.plus] = tr(tr(stat * 110, 16) / 100);
}
return stats;
}
}
},
{
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",
"Palkia",
"Palkia-Origin",
"Rayquaza",
"Reshiram",
"Smeargle",
"Solgaleo",
"Terapagos",
"Urshifu",
"Urshifu-Rapid-Strike",
"Zacian",
"Zacian-Crowned",
"Zamazenta",
"Zamazenta-Crowned",
"Zekrom",
"Contrary",
"Dancer",
"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 = /* @__PURE__ */ new Map();
}
},
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") {
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",
"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",
"Groudon",
"Ho-Oh",
"Iron Bundle",
"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",
"Shaymin-Sky",
"Smeargle",
"Sneasler",
"Solgaleo",
"Spectrier",
"Terapagos",
"Ursaluna-Bloodmoon",
"Urshifu-Single-Strike",
"Zacian",
"Zacian-Crowned",
"Zamazenta-Crowned",
"Zekrom",
"Arena Trap",
"Moody",
"Shadow Tag",
"King's Rock",
"Razor Fang",
"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]).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])).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:" + innate;
pokemon.volatiles[effect] = this.initEffectState({ id: this.toID(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);
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 = void 0;
}
},
{
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 = [];
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;
}
for (const [i, moveid] of set.moves.entries()) {
const pokemove = this.dex.species.get(moveid);
if (!pokemove.exists)
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\xE9mon are not allowed to be used as Pokemoves.`);
}
if (this.ruleTable.isRestrictedSpecies(pokemove) || this.ruleTable.isBannedSpecies(pokemove)) {
problems.push(`${pokemove.name} is unable to be used as a Pokemove.`);
}
pokemoves++;
moves.push(moveid);
set.moves.splice(i, 1);
}
}
const allowedPokemoves = Number(this.ruleTable.valueRules.get("allowedpokemoves") || "1");
if (pokemoves > allowedPokemoves) {
problems.push(
`${set.species} has ${pokemoves} Pokemoves.`,
`(Pok\xE9mon 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()) {
for (const move of pokemon.moves) {
const pokemove = this.dex.species.get(move);
if (pokemove.exists) {
pokemon.m.pokemove = 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.pokemove)
return;
const pokemove = pokemon.m.pokemove;
if (!pokemove.exists)
return;
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" : "Physical";
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].id = this.toID(effect);
s.volatiles[effect].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] 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: [
"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",
"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",
"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-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 = /* @__PURE__ */ new Set();
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:" + item;
pokemon.volatiles[effect] = this.initEffectState({ id: this.toID(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) {
const spreadModifier = move.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) {
const bondModifier = this.battle.gen > 6 ? 0.25 : 0.5;
this.battle.debug(`Parental Bond modifier: ${bondModifier}`);
baseDamage = this.battle.modify(baseDamage, bondModifier);
}
baseDamage = this.battle.runEvent("WeatherModifyDamage", pokemon, target, move, baseDamage);
const isCrit = target.getMoveHitData(move).crit;
if (isCrit) {
baseDamage = tr(baseDamage * (move.critModifier || (this.battle.gen >= 6 ? 1.5 : 2)));
}
baseDamage = this.battle.randomizer(baseDamage);
if (type !== "???") {
let stab = 1;
const isSTAB = move.forceSTAB || pokemon.hasType(type) || pokemon.getTypes(false, true).includes(type);
if (isSTAB) {
stab = 1.5;
}
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);
}
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);
}
}
if (this.battle.gen === 5 && !baseDamage)
baseDamage = 1;
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);
}
if (this.battle.gen !== 5 && !baseDamage)
return 1;
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(/* @__PURE__ */ 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] 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 = /* @__PURE__ */ new Set();
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] 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: [
"Arceus",
"Calyrex-Ice",
"Calyrex-Shadow",
"Dialga",
"Dialga-Origin",
"Eternatus",
"Flutter Mane",
"Giratina",
"Giratina-Origin",
"Groudon",
"Koraidon",
"Kyogre",
"Landorus-Incarnate",
"Magearna",
"Mewtwo",
"Miraidon",
"Palkia",
"Palkia-Origin",
"Rayquaza",
"Slaking",
"Spectrier",
"Urshifu-Single-Strike",
"Zacian",
"Zacian-Crowned",
"Arena Trap",
"Magnet Pull",
"Moody",
"Shadow Tag",
"Baton Pass",
"Last Respects",
"Revival Blessing"
],
restricted: [
"Baneful Bunker",
"Block",
"Chilly Reception",
"Copycat",
"Detect",
"Destiny Bond",
"Encore",
"Fairy Lock",
"Ingrain",
"Instruct",
"Mean Look",
"move:Metronome",
"Nasty Plot",
"Parting Shot",
"Protect",
"Roar",
"Silk Trap",
"Spiky Shield",
"Sleep Talk",
"Shed Tail",
"Shell Smash",
"Substitute",
"Swords Dance",
"Teleport",
"Thunder Wave",
"Trick Room",
"Will-O-Wisp",
"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\xE9mon with ${trademark} as a Trademark.)`);
}
}
return problems;
},
validateSet(set, teamHas) {
const dex = this.dex;
const ability = dex.moves.get(set.ability);
if (!ability.exists) {
return this.validateSet(set, teamHas);
}
if (ability.category !== "Status") {
return [`${ability.name} is not a status move and cannot be used as a trademark.`];
}
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 = 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();
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: -1e3,
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 6] Pure Hackmons",
desc: `Anything that can be hacked in-game and is usable in local battles is allowed.`,
mod: "gen6",
searchShow: false,
ruleset: ["-Nonexistent", "Team Preview", "HP Percentage Mod", "Cancel Mod", "Endless Battle Clause", "EV limit = 510"]
},
// National Dex
///////////////////////////////////////////////////////////////////
{
section: "National Dex"
},
{
name: "[Gen 9] National Dex",
mod: "gen9",
ruleset: ["Standard NatDex", "OHKO Clause", "Evasion Clause", "Species Clause", "Sleep Clause Mod", "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", "OHKO Clause", "Evasion Clause", "Species Clause", "Dynamax Clause", "Sleep Clause Mod"],
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",
"OHKO Clause",
"Evasion Clause",
"DryPass Clause",
"Sleep Clause Mod",
"Forme Clause",
"Z-Move Clause",
"Terastal 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",
"Berserk Gene",
"King's Rock",
"Quick Claw",
"Razor Fang",
"Acupressure",
"Last Respects",
"Baton Pass + Contrary",
"Baton Pass + Rapid Spin"
],
unbanlist: [
"Alcremie-Base",
"Ambipom",
"Araquanid-Base",
"Arbok",
"Arctozolt",
"Bewear",
"Breloom",
"Cacturne",
"Carnivine",
"Dewgong",
"Emolga",
"Glalie-Base",
"Golduck",
"Hitmonchan",
"Kecleon",
"Maractus",
"Musharna",
"Pangoro",
"Parasect",
"Persian-Alola",
"Pincurchin",
"Pinsir-Base",
"Rapidash-Galar",
"Regigigas",
"Scrafty",
"Sigilyph",
"Spinda",
"Tauros-Base",
"Togedemaru-Base",
"Uxie",
"Weezing-Base",
"Whiscash",
"Zangoose",
"Zweilous",
"Zygarde-10%"
],
// Stupid hardcode
onValidateSet(set, format, setHas, teamHas) {
if (set.item) {
const item = this.dex.items.get(set.item);
if (item.megaEvolves && !(this.ruleTable.has(`+item:${item.id}`) || this.ruleTable.has(`+pokemontag:mega`))) {
return [`Mega Evolution 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", "OHKO Clause", "Evasion Moves Clause", "Evasion Items Clause", "Species Clause", "Sleep Clause Mod", "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 RU",
mod: "gen9",
// searchShow: false,
ruleset: ["[Gen 9] National Dex UU"],
banlist: ["ND UU", "ND RUBL", "Slowbro-Base + Slowbronite"]
},
{
name: "[Gen 9] National Dex LC",
mod: "gen9",
searchShow: false,
ruleset: ["Standard NatDex", "Little Cup", "Species Clause", "OHKO Clause", "Evasion Clause", "Sleep Clause Mod"],
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",
"Vulpix-Alola",
"Woobat",
"Yanma",
"Zigzagoon-Base",
"Chlorophyll",
"Moody",
"Eevium Z",
"King's Rock",
"Quick Claw",
"Razor Fang",
"Assist",
"Baton Pass",
"Dragon Rage",
"Sonic Boom",
"Sticky Web"
]
},
{
name: "[Gen 9] National Dex Monotype",
mod: "gen9",
ruleset: ["Standard NatDex", "Same Type Clause", "Terastal Clause", "Species Clause", "OHKO Clause", "Evasion Clause", "Sleep Clause Mod"],
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",
"Acupressure",
"Baton Pass",
"Last Respects",
"Shed Tail"
]
},
{
name: "[Gen 9] National Dex Doubles",
mod: "gen9",
gameType: "doubles",
ruleset: ["Standard NatDex", "OHKO Clause", "Evasion Moves Clause", "Evasion Abilities Clause", "Species Clause", "Gravity Sleep Clause"],
banlist: [
"Annihilape",
"Arceus",
"Calyrex-Ice",
"Calyrex-Shadow",
"Dialga",
"Dialga-Origin",
"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",
"Eevium Z",
"Assist",
"Coaching",
"Dark Void",
"Swagger"
]
},
{
name: "[Gen 9] National Dex Doubles Ubers",
mod: "gen9",
gameType: "doubles",
searchShow: false,
ruleset: ["Standard NatDex", "OHKO Clause", "Evasion Moves Clause", "Species Clause"],
banlist: ["Shedinja", "Assist"]
},
{
name: "[Gen 9] National Dex Ubers UU",
mod: "gen9",
searchShow: false,
ruleset: ["[Gen 9] National Dex Ubers"],
banlist: [
"Arceus-Normal",
"Arceus-Dark",
"Arceus-Ground",
"Calyrex-Ice",
"Chien-Pao",
"Deoxys-Attack",
"Deoxys-Speed",
"Ditto",
"Dondozo",
"Eternatus",
"Giratina-Origin",
"Groudon-Primal",
"Ho-Oh",
"Kyogre-Primal",
"Lunala",
"Marshadow",
"Melmetal",
"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",
"Flutter Mane",
"Groudon",
"Kyogre",
"Kyurem-Black",
"Rayquaza",
"Shaymin-Sky",
"Zacian",
"Zekrom",
"Power Construct",
"Light Clay",
"Ultranecrozium Z",
"Last Respects"
]
},
{
name: "[Gen 9] National Dex AG",
mod: "gen9",
searchShow: false,
ruleset: ["Standard NatDex"]
},
{
name: "[Gen 9] National Dex AAA",
desc: `Pokémon have access to almost any ability.`,
mod: "gen9",
searchShow: false,
ruleset: ["Standard NatDex", "!Obtainable Abilities", "OHKO Clause", "Evasion Clause", "Species Clause", "Ability Clause = 2", "Sleep Moves Clause", "Terastal Clause"],
banlist: [
"Alakazam-Mega",
"Annihilape",
"Arceus",
"Archeops",
"Baxcalibur",
"Blacephalon",
"Blastoise-Mega",
"Blaziken-Mega",
"Calyrex-Ice",
"Calyrex-Shadow",
"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",
"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",
"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: ["-Nonexistent", "Standard NatDex", "Forme Clause", "Sleep Moves Clause", "Ability Clause = 2", "OHKO Clause", "Evasion Moves Clause", "Dynamax Clause", "CFZ Clause", "Terastal Clause", "!Obtainable"],
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",
"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",
"Last Respects",
"Octolock",
"Rage Fist",
"Revival Blessing",
"Shed Tail",
"Shell Smash",
"Comatose + Sleep Talk",
"Imprison + Transform"
],
restricted: ["Arceus"],
onValidateTeam(team, format) {
const restrictedPokemonCount = new this.dex.Multiset();
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 STABmons",
mod: "gen9",
searchShow: false,
ruleset: ["Standard NatDex", "OHKO Clause", "Evasion Clause", "Species Clause", "STABmons Move Legality", "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: [
"Acupressure",
"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 Monotype",
mod: "gen8",
searchShow: false,
ruleset: ["Standard NatDex", "Same Type Clause", "Species Clause", "OHKO Clause", "Evasion Moves Clause", "Evasion Items Clause", "Dynamax Clause", "Sleep Clause Mod"],
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"
]
},
// Randomized Format Spotlight
///////////////////////////////////////////////////////////////////
{
section: "Randomized Format Spotlight",
column: 3
},
{
name: "[Gen 7] Random Battle (Apex Abilities)",
desc: `[Gen 7] Random Battle, but every Pokémon has their usual ability overriden by a powerful ability chosen from a restricted pool.`,
mod: "gen7apex",
team: "random",
ruleset: ["[Gen 7] Random Battle"],
onBegin() {
const POWERFUL_ABILITIES = [
"Adaptability",
"Aftermath",
"Analytic",
"Arena Trap",
"Beast Boost",
"Berserk",
"Comatose",
"Competitive",
"Compound Eyes",
"Contrary",
"Cursed Body",
"Defiant",
"Desolate Land",
"Download",
"Drizzle",
"Drought",
"Dry Skin",
"Effect Spore",
"Filter",
"Flame Body",
"Flash Fire",
"Fluffy",
"Fur Coat",
"Gooey",
"Grassy Surge",
"Heatproof",
"Huge Power",
"Hustle",
"Illusion",
"Imposter",
"Innards Out",
"Intimidate",
"Iron Barbs",
"Levitate",
"Lightning Rod",
"Magic Bounce",
"Magic Guard",
"Marvel Scale",
"Mold Breaker",
"Moody",
"Motor Drive",
"Moxie",
"Multiscale",
"Natural Cure",
"Neuroforce",
"Parental Bond",
"Poison Point",
"Poison Touch",
"Prankster",
"Primordial Sea",
"Prism Armor",
"Protean",
"Pure Power",
"Regenerator",
"Rough Skin",
"Sand Stream",
"Sap Sipper",
"Serene Grace",
"Shadow Shield",
"Shadow Tag",
"Shed Skin",
"Sheer Force",
"Shield Dust",
"Simple",
"Snow Warning",
"Solid Rock",
"Soul-Heart",
"Speed Boost",
"Stakeout",
"Stamina",
"Static",
"Storm Drain",
"Sturdy",
"Tangling Hair",
"Technician",
"Teravolt",
"Thick Fat",
"Tinted Lens",
"Tough Claws",
"Trace",
"Triage",
"Turboblaze",
"Unaware",
"Volt Absorb",
"Water Absorb",
"Water Bubble",
"Wonder Guard"
];
let buf = `Every Pokémon's ability is randomly selected from the following pool:
`;
buf += `Click to expand
`;
buf += POWERFUL_ABILITIES.sort().join(", ");
buf += "