mirror of
https://github.com/smogon/pokemon-showdown.git
synced 2026-05-07 23:52:22 -05:00
I used a hack to make the multiple declaration errors go away, so all that remained in jsHint were actual errors, which I've now mostly fixed. All this linting ended up uncovering one actual bug: Uproar's message not showing. It's a very minor bug in a move no one uses, so I'm going to fold it into this commit.
518 lines
22 KiB
JavaScript
518 lines
22 KiB
JavaScript
// Note: These are the rules that formats use
|
|
// The list of formats is stored in config/formats.js
|
|
|
|
exports.BattleFormats = {
|
|
|
|
// Rulesets
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
standard: {
|
|
effectType: 'Banlist',
|
|
ruleset: ['Sleep Clause Mod', 'Species Clause', 'OHKO Clause', 'Moody Clause', 'Evasion Moves Clause', 'Endless Battle Clause', 'HP Percentage Mod'],
|
|
banlist: ['Unreleased', 'Illegal', 'Huntail + Shell Smash + Sucker Punch', 'Leavanny + Knock Off + Sticky Web', 'Sylveon + Hyper Voice + Heal Bell + Wish + Baton Pass']
|
|
},
|
|
standardnext: {
|
|
effectType: 'Banlist',
|
|
ruleset: ['Sleep Clause Mod', 'Species Clause', 'OHKO Clause', 'HP Percentage Mod'],
|
|
banlist: ['Illegal', 'Soul Dew', 'Huntail + Shell Smash + Sucker Punch', 'Leavanny + Knock Off + Sticky Web', 'Sylveon + Hyper Voice + Heal Bell + Wish + Baton Pass']
|
|
},
|
|
standardubers: {
|
|
effectType: 'Banlist',
|
|
ruleset: ['Sleep Clause Mod', 'Species Clause', 'Moody Clause', 'OHKO Clause', 'Endless Battle Clause', 'HP Percentage Mod'],
|
|
banlist: ['Unreleased', 'Illegal', 'Huntail + Shell Smash + Sucker Punch', 'Leavanny + Knock Off + Sticky Web', 'Sylveon + Hyper Voice + Heal Bell + Wish + Baton Pass']
|
|
},
|
|
standardgbu: {
|
|
effectType: 'Banlist',
|
|
ruleset: ['Species Clause', 'Item Clause'],
|
|
banlist: ['Unreleased', 'Illegal', 'Soul Dew', 'Huntail + Shell Smash + Sucker Punch', 'Leavanny + Knock Off + Sticky Web', 'Sylveon + Hyper Voice + Heal Bell + Wish + Baton Pass',
|
|
'Mewtwo',
|
|
'Mew',
|
|
'Lugia',
|
|
'Ho-Oh',
|
|
'Celebi',
|
|
'Kyogre',
|
|
'Groudon',
|
|
'Rayquaza',
|
|
'Jirachi',
|
|
'Deoxys', 'Deoxys-Attack', 'Deoxys-Defense', 'Deoxys-Speed',
|
|
'Dialga',
|
|
'Palkia',
|
|
'Giratina', 'Giratina-Origin',
|
|
'Phione',
|
|
'Manaphy',
|
|
'Darkrai',
|
|
'Shaymin', 'Shaymin-Sky',
|
|
'Arceus',
|
|
'Victini',
|
|
'Reshiram',
|
|
'Zekrom',
|
|
'Kyurem', 'Kyurem-Black', 'Kyurem-White',
|
|
'Keldeo',
|
|
'Meloetta',
|
|
'Genesect',
|
|
'Xerneas',
|
|
'Yveltal',
|
|
'Zygarde',
|
|
'Diancie'
|
|
]
|
|
},
|
|
standarddoubles: {
|
|
effectType: 'Banlist',
|
|
ruleset: ['Species Clause', 'OHKO Clause', 'Moody Clause', 'Evasion Abilities Clause', 'Evasion Moves Clause', 'Endless Battle Clause', 'HP Percentage Mod'],
|
|
banlist: ['Unreleased', 'Illegal', 'Huntail + Shell Smash + Sucker Punch', 'Leavanny + Knock Off + Sticky Web', 'Sylveon + Hyper Voice + Heal Bell + Wish + Baton Pass']
|
|
},
|
|
pokemon: {
|
|
effectType: 'Banlist',
|
|
validateSet: function (set, format, isNonstandard) {
|
|
var item = this.getItem(set.item);
|
|
var template = this.getTemplate(set.species);
|
|
var problems = [];
|
|
|
|
if (set.species === set.name) delete set.name;
|
|
if (template.gen > this.gen) {
|
|
problems.push(set.species + ' does not exist in gen ' + this.gen + '.');
|
|
}
|
|
var ability = {};
|
|
if (set.ability) {
|
|
ability = this.getAbility(set.ability);
|
|
if (ability.gen > this.gen) {
|
|
problems.push(ability.name + ' does not exist in gen ' + this.gen + '.');
|
|
}
|
|
}
|
|
if (set.moves) {
|
|
for (var i = 0; i < set.moves.length; i++) {
|
|
var move = this.getMove(set.moves[i]);
|
|
if (move.gen > this.gen) {
|
|
problems.push(move.name + ' does not exist in gen ' + this.gen + '.');
|
|
} else if (!isNonstandard && move.isNonstandard) {
|
|
problems.push(move.name + ' is not a real move.');
|
|
}
|
|
}
|
|
}
|
|
if (item.gen > this.gen) {
|
|
problems.push(item.name + ' does not exist in gen ' + this.gen + '.');
|
|
}
|
|
if (set.moves && set.moves.length > 4) {
|
|
problems.push((set.name || set.species) + ' has more than four moves.');
|
|
}
|
|
if (set.level && set.level > 100) {
|
|
problems.push((set.name || set.species) + ' is higher than level 100.');
|
|
}
|
|
|
|
if (!isNonstandard) {
|
|
if (template.isNonstandard) {
|
|
problems.push(set.species + ' is not a real Pokemon.');
|
|
}
|
|
if (ability.isNonstandard) {
|
|
problems.push(ability.name + ' is not a real ability.');
|
|
}
|
|
if (item.isNonstandard) {
|
|
problems.push(item.name + ' is not a real item.');
|
|
}
|
|
}
|
|
|
|
// ----------- legality line ------------------------------------------
|
|
if (!format.banlistTable || !format.banlistTable['illegal']) return problems;
|
|
// everything after this line only happens if we're doing legality enforcement
|
|
|
|
// limit one of each move
|
|
var moves = [];
|
|
if (set.moves) {
|
|
var hasMove = {};
|
|
for (var i = 0; i < set.moves.length; i++) {
|
|
var move = this.getMove(set.moves[i]);
|
|
var moveid = move.id;
|
|
if (hasMove[moveid]) continue;
|
|
hasMove[moveid] = true;
|
|
moves.push(set.moves[i]);
|
|
}
|
|
}
|
|
set.moves = moves;
|
|
|
|
if (template.requiredItem) {
|
|
if (template.isMega) {
|
|
// Mega evolutions evolve in-battle
|
|
set.species = template.baseSpecies;
|
|
var baseAbilities = Tools.getTemplate(set.species).abilities;
|
|
var niceAbility = false;
|
|
for (var i in baseAbilities) {
|
|
if (baseAbilities[i] === set.ability) {
|
|
niceAbility = true;
|
|
break;
|
|
}
|
|
}
|
|
if (!niceAbility) set.ability = baseAbilities['0'];
|
|
}
|
|
if (item.name !== template.requiredItem) {
|
|
problems.push((set.name || set.species) + ' needs to hold ' + template.requiredItem + '.');
|
|
}
|
|
}
|
|
if (template.num === 351) { // Castform
|
|
set.species = 'Castform';
|
|
}
|
|
if (template.num === 421) { // Cherrim
|
|
set.species = 'Cherrim';
|
|
}
|
|
if (template.num === 493) { // Arceus
|
|
if (set.ability === 'Multitype' && item.onPlate) {
|
|
set.species = 'Arceus-' + item.onPlate;
|
|
} else {
|
|
set.species = 'Arceus';
|
|
}
|
|
}
|
|
if (template.num === 555) { // Darmanitan
|
|
if (set.species === 'Darmanitan-Zen' && ability.id !== 'zenmode') {
|
|
problems.push('Darmanitan-Zen transforms in-battle with Zen Mode.');
|
|
}
|
|
set.species = 'Darmanitan';
|
|
}
|
|
if (template.num === 487) { // Giratina
|
|
if (item.id === 'griseousorb') {
|
|
set.species = 'Giratina-Origin';
|
|
set.ability = 'Levitate';
|
|
} else {
|
|
set.species = 'Giratina';
|
|
set.ability = 'Pressure';
|
|
}
|
|
}
|
|
if (template.num === 647) { // Keldeo
|
|
if (set.moves.indexOf('secretsword') < 0) {
|
|
set.species = 'Keldeo';
|
|
}
|
|
}
|
|
if (template.num === 648) { // Meloetta
|
|
if (set.species === 'Meloetta-Pirouette' && set.moves.indexOf('relicsong') < 0) {
|
|
problems.push('Meloetta-Pirouette transforms in-battle with Relic Song.');
|
|
}
|
|
set.species = 'Meloetta';
|
|
}
|
|
if (template.num === 649) { // Genesect
|
|
switch (item.id) {
|
|
case 'burndrive':
|
|
set.species = 'Genesect-Burn';
|
|
break;
|
|
case 'chilldrive':
|
|
set.species = 'Genesect-Chill';
|
|
break;
|
|
case 'dousedrive':
|
|
set.species = 'Genesect-Douse';
|
|
break;
|
|
case 'shockdrive':
|
|
set.species = 'Genesect-Shock';
|
|
break;
|
|
default:
|
|
set.species = 'Genesect';
|
|
}
|
|
}
|
|
if (template.num === 681) { // Aegislash
|
|
set.species = 'Aegislash';
|
|
}
|
|
return problems;
|
|
}
|
|
},
|
|
cappokemon: {
|
|
effectType: 'Rule',
|
|
validateSet: function (set, format) {
|
|
return this.getEffect('Pokemon').validateSet.call(this, set, format, true);
|
|
}
|
|
},
|
|
kalospokedex: {
|
|
effectType: 'Rule',
|
|
validateSet: function (set) {
|
|
var validKalosDex = {
|
|
"Abomasnow":1,"Abomasnow-Mega":1,"Abra":1,"Absol":1,"Absol-Mega":1,"Accelgor":1,"Aegislash":1,"Aegislash-Blade":1,"Aerodactyl":1,"Aerodactyl-Mega":1,"Aggron":1,"Aggron-Mega":1,"Alakazam":1,"Alakazam-Mega":1,"Alomomola":1,"Altaria":1,"Amaura":1,"Amoonguss":1,"Ampharos":1,"Ampharos-Mega":1,"Arbok":1,"Ariados":1,"Aromatisse":1,"Aron":1,"Articuno":1,"Audino":1,"Aurorus":1,"Avalugg":1,"Axew":1,"Azumarill":1,"Azurill":1,"Bagon":1,"Banette":1,"Banette-Mega":1,"Barbaracle":1,"Barboach":1,"Basculin":1,"Basculin-Blue-Striped":1,"Beartic":1,"Beedrill":1,"Bellossom":1,"Bellsprout":1,"Bergmite":1,"Bibarel":1,"Bidoof":1,"Binacle":1,"Bisharp":1,"Blastoise":1,"Blastoise-Mega":1,"Boldore":1,"Bonsly":1,"Braixen":1,"Budew":1,"Buizel":1,"Bulbasaur":1,"Bunnelby":1,"Burmy":1,"Butterfree":1,"Carbink":1,"Carnivine":1,"Carvanha":1,"Caterpie":1,"Chandelure":1,"Charizard":1,"Charizard-Mega-X":1,"Charizard-Mega-Y":1,"Charmander":1,"Charmeleon":1,"Chatot":1,"Chesnaught":1,"Chespin":1,"Chimecho":1,"Chinchou":1,"Chingling":1,"Clamperl":1,"Clauncher":1,"Clawitzer":1,"Cloyster":1,"Combee":1,"Conkeldurr":1,"Corphish":1,"Corsola":1,"Crawdaunt":1,"Croagunk":1,"Crobat":1,"Crustle":1,"Cryogonal":1,"Cubchoo":1,"Cubone":1,"Dedenne":1,"Deino":1,"Delcatty":1,"Delibird":1,"Delphox":1,"Diggersby":1,"Diglett":1,"Ditto":1,"Dodrio":1,"Doduo":1,"Doublade":1,"Dragalge":1,"Dragonair":1,"Dragonite":1,"Drapion":1,"Dratini":1,"Drifblim":1,"Drifloon":1,"Druddigon":1,"Ducklett":1,"Dugtrio":1,"Dunsparce":1,"Duosion":1,"Durant":1,"Dwebble":1,"Eevee":1,"Ekans":1,"Electrike":1,"Electrode":1,"Emolga":1,"Escavalier":1,"Espeon":1,"Espurr":1,"Exeggcute":1,"Exeggutor":1,"Exploud":1,"Farfetch'd":1,"Fearow":1,"Fennekin":1,"Ferroseed":1,"Ferrothorn":1,"Flaaffy":1,"Flabebe":1,"Flareon":1,"Fletchinder":1,"Fletchling":1,"Floatzel":1,"Floette":1,"Florges":1,"Flygon":1,"Foongus":1,"Fraxure":1,"Froakie":1,"Frogadier":1,"Furfrou":1,"Furret":1,"Gabite":1,"Gallade":1,"Garbodor":1,"Garchomp":1,"Garchomp-Mega":1,"Gardevoir":1,"Gardevoir-Mega":1,"Gastly":1,"Gengar":1,"Gengar-Mega":1,"Geodude":1,"Gible":1,"Gigalith":1,"Glaceon":1,"Gligar":1,"Gliscor":1,"Gloom":1,"Gogoat":1,"Golbat":1,"Goldeen":1,"Golduck":1,"Golem":1,"Golett":1,"Golurk":1,"Goodra":1,"Goomy":1,"Gorebyss":1,"Gothita":1,"Gothitelle":1,"Gothorita":1,"Gourgeist-Small":1,"Gourgeist":1,"Gourgeist-Large":1,"Gourgeist-Super":1,"Granbull":1,"Graveler":1,"Greninja":1,"Grumpig":1,"Gulpin":1,"Gurdurr":1,"Gyarados":1,"Gyarados-Mega":1,"Hariyama":1,"Haunter":1,"Hawlucha":1,"Haxorus":1,"Heatmor":1,"Heliolisk":1,"Helioptile":1,"Heracross":1,"Heracross-Mega":1,"Hippopotas":1,"Hippowdon":1,"Honchkrow":1,"Honedge":1,"Hoothoot":1,"Hoppip":1,"Horsea":1,"Houndoom":1,"Houndoom-Mega":1,"Houndour":1,"Huntail":1,"Hydreigon":1,"Igglybuff":1,"Illumise":1,"Inkay":1,"Ivysaur":1,"Jigglypuff":1,"Jolteon":1,"Jumpluff":1,"Jynx":1,"Kadabra":1,"Kakuna":1,"Kangaskhan":1,"Kangaskhan-Mega":1,"Karrablast":1,"Kecleon":1,"Kingdra":1,"Kirlia":1,"Klefki":1,"Krokorok":1,"Krookodile":1,"Lairon":1,"Lampent":1,"Lanturn":1,"Lapras":1,"Larvitar":1,"Leafeon":1,"Ledian":1,"Ledyba":1,"Lickilicky":1,"Lickitung":1,"Liepard":1,"Linoone":1,"Litleo":1,"Litwick":1,"Lombre":1,"Lotad":1,"Loudred":1,"Lucario":1,"Lucario-Mega":1,"Ludicolo":1,"Lunatone":1,"Luvdisc":1,"Machamp":1,"Machoke":1,"Machop":1,"Magcargo":1,"Magikarp":1,"Magnemite":1,"Magneton":1,"Magnezone":1,"Makuhita":1,"Malamar":1,"Mamoswine":1,"Manectric":1,"Manectric-Mega":1,"Mantine":1,"Mantyke":1,"Mareep":1,"Marill":1,"Marowak":1,"Masquerain":1,"Mawile":1,"Mawile-Mega":1,"Medicham":1,"Medicham-Mega":1,"Meditite":1,"Meowstic":1,"Meowstic-F":1,"Metapod":1,"Mewtwo":1,"Mewtwo-Mega-X":1,"Mewtwo-Mega-Y":1,"Mienfoo":1,"Mienshao":1,"Mightyena":1,"Miltank":1,"Mime Jr.":1,"Minun":1,"Moltres":1,"Mothim":1,"Mr. Mime":1,"Munchlax":1,"Murkrow":1,"Nidoking":1,"Nidoqueen":1,"Nidoran-M":1,"Nidoran-F":1,"Nidorina":1,"Nidorino":1,"Nincada":1,"Ninjask":1,"Noctowl":1,"Noibat":1,"Noivern":1,"Nosepass":1,"Octillery":1,"Oddish":1,"Onix":1,"Pachirisu":1,"Pancham":1,"Pangoro":1,"Panpour":1,"Pansage":1,"Pansear":1,"Patrat":1,"Pawniard":1,"Pelipper":1,"Phantump":1,"Pichu":1,"Pidgeot":1,"Pidgeotto":1,"Pidgey":1,"Pikachu":1,"Piloswine":1,"Pinsir":1,"Pinsir-Mega":1,"Plusle":1,"Politoed":1,"Poliwag":1,"Poliwhirl":1,"Poliwrath":1,"Poochyena":1,"Probopass":1,"Psyduck":1,"Pumpkaboo-Small":1,"Pumpkaboo":1,"Pumpkaboo-Large":1,"Pumpkaboo-Super":1,"Pupitar":1,"Purrloin":1,"Pyroar":1,"Quagsire":1,"Quilladin":1,"Qwilfish":1,"Raichu":1,"Ralts":1,"Relicanth":1,"Remoraid":1,"Reuniclus":1,"Rhydon":1,"Rhyhorn":1,"Rhyperior":1,"Riolu":1,"Roggenrola":1,"Roselia":1,"Roserade":1,"Rotom":1,"Rotom-Heat":1,"Rotom-Wash":1,"Rotom-Frost":1,"Rotom-Fan":1,"Rotom-Mow":1,"Sableye":1,"Salamence":1,"Sandile":1,"Sandshrew":1,"Sandslash":1,"Sawk":1,"Scatterbug":1,"Scizor":1,"Scizor-Mega":1,"Scolipede":1,"Scrafty":1,"Scraggy":1,"Scyther":1,"Seadra":1,"Seaking":1,"Sentret":1,"Seviper":1,"Sharpedo":1,"Shedinja":1,"Shelgon":1,"Shellder":1,"Shelmet":1,"Shuckle":1,"Shuppet":1,"Sigilyph":1,"Simipour":1,"Simisage":1,"Simisear":1,"Skarmory":1,"Skiddo":1,"Skiploom":1,"Skitty":1,"Skorupi":1,"Skrelp":1,"Skuntank":1,"Sliggoo":1,"Slowbro":1,"Slowking":1,"Slowpoke":1,"Slugma":1,"Slurpuff":1,"Smeargle":1,"Smoochum":1,"Sneasel":1,"Snorlax":1,"Snover":1,"Snubbull":1,"Solosis":1,"Solrock":1,"Spearow":1,"Spewpa":1,"Spinarak":1,"Spinda":1,"Spoink":1,"Spritzee":1,"Squirtle":1,"Staraptor":1,"Staravia":1,"Starly":1,"Starmie":1,"Staryu":1,"Steelix":1,"Stunfisk":1,"Stunky":1,"Sudowoodo":1,"Surskit":1,"Swablu":1,"Swalot":1,"Swanna":1,"Swellow":1,"Swinub":1,"Swirlix":1,"Swoobat":1,"Sylveon":1,"Taillow":1,"Talonflame":1,"Tauros":1,"Teddiursa":1,"Tentacool":1,"Tentacruel":1,"Throh":1,"Timburr":1,"Torkoal":1,"Toxicroak":1,"Trapinch":1,"Trevenant":1,"Trubbish":1,"Tyranitar":1,"Tyranitar-Mega":1,"Tyrantrum":1,"Tyrunt":1,"Umbreon":1,"Ursaring":1,"Vanillish":1,"Vanillite":1,"Vanilluxe":1,"Vaporeon":1,"Venipede":1,"Venusaur":1,"Venusaur-Mega":1,"Vespiquen":1,"Vibrava":1,"Victreebel":1,"Vileplume":1,"Vivillon":1,"Volbeat":1,"Voltorb":1,"Wailmer":1,"Wailord":1,"Wartortle":1,"Watchog":1,"Weavile":1,"Weedle":1,"Weepinbell":1,"Whirlipede":1,"Whiscash":1,"Whismur":1,"Wigglytuff":1,"Wingull":1,"Wobbuffet":1,"Woobat":1,"Wooper":1,"Wormadam":1,"Wormadam-Sandy":1,"Wormadam-Trash":1,"Wynaut":1,"Xerneas":1,"Yanma":1,"Yanmega":1,"Yveltal":1,"Zangoose":1,"Zapdos":1,"Zigzagoon":1,"Zoroark":1,"Zorua":1,"Zubat":1,"Zweilous":1,"Zygarde":1
|
|
};
|
|
if (!(set.species in validKalosDex)) {
|
|
return [set.species + " is not in the Kalos Pokedex."];
|
|
}
|
|
}
|
|
},
|
|
potd: {
|
|
effectType: 'Rule',
|
|
onStart: function () {
|
|
if (Config.potd) {
|
|
this.add('rule', "Pokemon of the Day: " + this.getTemplate(Config.potd).name);
|
|
}
|
|
}
|
|
},
|
|
teampreviewvgc: {
|
|
onStartPriority: -10,
|
|
onStart: function () {
|
|
this.add('clearpoke');
|
|
for (var i = 0; i < this.sides[0].pokemon.length; i++) {
|
|
this.add('poke', this.sides[0].pokemon[i].side.id, this.sides[0].pokemon[i].details.replace(/(Arceus|Gourgeist|Genesect|Pumpkaboo)(-[a-zA-Z?]+)?/g, '$1-*'));
|
|
}
|
|
for (var i = 0; i < this.sides[1].pokemon.length; i++) {
|
|
this.add('poke', this.sides[1].pokemon[i].side.id, this.sides[1].pokemon[i].details.replace(/(Arceus|Gourgeist|Genesect|Pumpkaboo)(-[a-zA-Z?]+)?/g, '$1-*'));
|
|
}
|
|
},
|
|
onTeamPreview: function () {
|
|
this.makeRequest('teampreview', 4);
|
|
}
|
|
},
|
|
teampreview1v1: {
|
|
onStartPriority: -10,
|
|
onStart: function () {
|
|
this.add('clearpoke');
|
|
for (var i = 0; i < this.sides[0].pokemon.length; i++) {
|
|
this.add('poke', this.sides[0].pokemon[i].side.id, this.sides[0].pokemon[i].details.replace(/(Arceus|Gourgeist|Genesect|Pumpkaboo)(-[a-zA-Z?]+)?/g, '$1-*'));
|
|
}
|
|
for (var i = 0; i < this.sides[1].pokemon.length; i++) {
|
|
this.add('poke', this.sides[1].pokemon[i].side.id, this.sides[1].pokemon[i].details.replace(/(Arceus|Gourgeist|Genesect|Pumpkaboo)(-[a-zA-Z?]+)?/g, '$1-*'));
|
|
}
|
|
},
|
|
onTeamPreview: function () {
|
|
this.makeRequest('teampreview', 1);
|
|
}
|
|
},
|
|
teampreview: {
|
|
onStartPriority: -10,
|
|
onStart: function () {
|
|
this.add('clearpoke');
|
|
for (var i = 0; i < this.sides[0].pokemon.length; i++) {
|
|
this.add('poke', this.sides[0].pokemon[i].side.id, this.sides[0].pokemon[i].details.replace(/(Arceus|Gourgeist|Genesect|Pumpkaboo)(-[a-zA-Z?]+)?/g, '$1-*'));
|
|
}
|
|
for (var i = 0; i < this.sides[1].pokemon.length; i++) {
|
|
this.add('poke', this.sides[1].pokemon[i].side.id, this.sides[1].pokemon[i].details.replace(/(Arceus|Gourgeist|Genesect|Pumpkaboo)(-[a-zA-Z?]+)?/g, '$1-*'));
|
|
}
|
|
},
|
|
onTeamPreview: function () {
|
|
this.makeRequest('teampreview');
|
|
}
|
|
},
|
|
teampreviewgbu: {
|
|
onStartPriority: -10,
|
|
onStart: function () {
|
|
this.add('clearpoke');
|
|
for (var i = 0; i < this.sides[0].pokemon.length; i++) {
|
|
this.add('poke', this.sides[0].pokemon[i].side.id, this.sides[0].pokemon[i].details.replace(/(Arceus|Gourgeist|Genesect|Pumpkaboo)(-[a-zA-Z?]+)?/g, '$1-*'));
|
|
}
|
|
for (var i = 0; i < this.sides[1].pokemon.length; i++) {
|
|
this.add('poke', this.sides[1].pokemon[i].side.id, this.sides[1].pokemon[i].details.replace(/(Arceus|Gourgeist|Genesect|Pumpkaboo)(-[a-zA-Z?]+)?/g, '$1-*'));
|
|
}
|
|
},
|
|
onTeamPreview: function () {
|
|
this.makeRequest('teampreview', 3);
|
|
}
|
|
},
|
|
littlecup: {
|
|
effectType: 'Rule',
|
|
validateSet: function (set) {
|
|
var template = this.getTemplate(set.species || set.name);
|
|
if (template.prevo) {
|
|
return [set.species + " isn't the first in its evolution family."];
|
|
}
|
|
if (!template.nfe) {
|
|
return [set.species + " doesn't have an evolution family."];
|
|
}
|
|
}
|
|
},
|
|
speciesclause: {
|
|
effectType: 'Rule',
|
|
onStart: function () {
|
|
this.add('rule', 'Species Clause: Limit one of each Pokémon');
|
|
},
|
|
validateTeam: function (team, format) {
|
|
var speciesTable = {};
|
|
for (var i = 0; i < team.length; i++) {
|
|
var template = this.getTemplate(team[i].species);
|
|
if (speciesTable[template.num]) {
|
|
return ["You are limited to one of each Pokémon by Species Clause.", "(You have more than one " + template.name + ")"];
|
|
}
|
|
speciesTable[template.num] = true;
|
|
}
|
|
}
|
|
},
|
|
itemclause: {
|
|
effectType: 'Rule',
|
|
onStart: function () {
|
|
this.add('rule', 'Item Clause: Limit one of each item');
|
|
},
|
|
validateTeam: function (team, format) {
|
|
var itemTable = {};
|
|
for (var i = 0; i < team.length; i++) {
|
|
var item = toId(team[i].item);
|
|
if (!item) continue;
|
|
if (itemTable[item]) {
|
|
return ["You are limited to one of each item by Item Clause.", "(You have more than one " + this.getItem(item).name + ")"];
|
|
}
|
|
itemTable[item] = true;
|
|
}
|
|
}
|
|
},
|
|
abilityclause: {
|
|
effectType: 'Rule',
|
|
onStart: function () {
|
|
this.add('rule', 'Ability Clause: Limit two of each ability');
|
|
},
|
|
validateTeam: function (team, format) {
|
|
var abilityTable = {};
|
|
for (var i = 0; i < team.length; i++) {
|
|
var ability = toId(team[i].ability);
|
|
if (!ability) continue;
|
|
if (ability in abilityTable) {
|
|
if (abilityTable[ability] >= 2) {
|
|
return ["You are limited to two of each ability by the Ability Clause.", "(You have more than two " + this.getAbility(ability).name + ")"];
|
|
}
|
|
abilityTable[ability]++;
|
|
} else {
|
|
abilityTable[ability] = 1;
|
|
}
|
|
}
|
|
}
|
|
},
|
|
ohkoclause: {
|
|
effectType: 'Rule',
|
|
onStart: function () {
|
|
this.add('rule', 'OHKO Clause: OHKO moves are banned');
|
|
},
|
|
validateSet: function (set) {
|
|
var problems = [];
|
|
if (set.moves) {
|
|
for (var i in set.moves) {
|
|
var move = this.getMove(set.moves[i]);
|
|
if (move.ohko) problems.push(move.name + ' is banned by OHKO Clause.');
|
|
}
|
|
}
|
|
return problems;
|
|
}
|
|
},
|
|
evasionabilitiesclause: {
|
|
effectType: 'Banlist',
|
|
name: 'Evasion Abilities Clause',
|
|
banlist: ['Sand Veil', 'Snow Cloak'],
|
|
onStart: function () {
|
|
this.add('rule', 'Evasion Abilities Clause: Evasion abilities are banned');
|
|
}
|
|
},
|
|
evasionmovesclause: {
|
|
effectType: 'Banlist',
|
|
name: 'Evasion Moves Clause',
|
|
banlist: ['Minimize', 'Double Team'],
|
|
onStart: function () {
|
|
this.add('rule', 'Evasion Moves Clause: Evasion moves are banned');
|
|
}
|
|
},
|
|
endlessbattleclause: {
|
|
effectType: 'Banlist',
|
|
name: 'Endless Battle Clause',
|
|
banlist: ['Leppa Berry + Recycle', 'Harvest + Leppa Berry', 'Shadow Tag + Leppa Berry + Trick'],
|
|
onStart: function () {
|
|
this.add('rule', 'Endless Battle Clause: Forcing endless battles is banned');
|
|
}
|
|
},
|
|
moodyclause: {
|
|
effectType: 'Banlist',
|
|
name: 'Moody Clause',
|
|
banlist: ['Moody'],
|
|
onStart: function () {
|
|
this.add('rule', 'Moody Clause: Moody is banned');
|
|
}
|
|
},
|
|
swaggerclause: {
|
|
effectType: 'Banlist',
|
|
name: 'Swagger Clause',
|
|
banlist: ['Swagger'],
|
|
onStart: function () {
|
|
this.add('rule', 'Swagger Clause: Swagger is banned');
|
|
}
|
|
},
|
|
batonpassclause: {
|
|
effectType: 'Banlist',
|
|
name: 'Baton Pass Clause',
|
|
onStart: function () {
|
|
this.add('rule', 'Baton Pass Clause: Limit one Pokémon knowing Baton Pass');
|
|
},
|
|
validateTeam: function (team, format) {
|
|
var problems = [];
|
|
var BPcount = 0;
|
|
for (var i = 0; i < team.length; i++) {
|
|
if (team[i].moves.indexOf('Baton Pass') > -1) BPcount++;
|
|
if (BPcount > 1) {
|
|
problems.push("You are limited to one Pokémon with the move Baton Pass by the Baton Pass Clause.");
|
|
break;
|
|
}
|
|
}
|
|
return problems;
|
|
}
|
|
},
|
|
hppercentagemod: {
|
|
effectType: 'Rule',
|
|
name: 'HP Percentage Mod',
|
|
onStart: function () {
|
|
this.add('rule', 'HP Percentage Mod: HP is reported as percentages');
|
|
this.reportPercentages = true;
|
|
}
|
|
},
|
|
sleepclausemod: {
|
|
effectType: 'Rule',
|
|
onStart: function () {
|
|
this.add('rule', 'Sleep Clause Mod: Limit one foe put to sleep');
|
|
},
|
|
onSetStatus: function (status, target, source) {
|
|
if (source && source.side === target.side) {
|
|
return;
|
|
}
|
|
if (status.id === 'slp') {
|
|
for (var i = 0; i < target.side.pokemon.length; i++) {
|
|
var pokemon = target.side.pokemon[i];
|
|
if (pokemon.status === 'slp') {
|
|
if (!pokemon.statusData.source ||
|
|
pokemon.statusData.source.side !== pokemon.side) {
|
|
this.add('-message', 'Sleep Clause Mod activated.');
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
freezeclause: {
|
|
effectType: 'Rule',
|
|
onStart: function () {
|
|
this.add('rule', 'Freeze Clause: Limit one foe frozen');
|
|
},
|
|
onSetStatus: function (status, target, source) {
|
|
if (source && source.side === target.side) {
|
|
return;
|
|
}
|
|
if (status.id === 'frz') {
|
|
for (var i = 0; i < target.side.pokemon.length; i++) {
|
|
var pokemon = target.side.pokemon[i];
|
|
if (pokemon.status === 'frz') {
|
|
this.add('-message', 'Freeze Clause activated.');
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
sametypeclause: {
|
|
effectType: 'Rule',
|
|
onStart: function () {
|
|
this.add('rule', 'Same Type Clause: Pokémon in a team must share a type');
|
|
},
|
|
validateTeam: function (team, format) {
|
|
var typeTable = {};
|
|
for (var i = 0; i < team.length; i++) {
|
|
var template = this.getTemplate(team[i].species);
|
|
if (!template.types) continue;
|
|
|
|
// first type
|
|
var type = template.types[0];
|
|
typeTable[type] = (typeTable[type] || 0) + 1;
|
|
|
|
// second type
|
|
type = template.types[1];
|
|
if (type) typeTable[type] = (typeTable[type] || 0) + 1;
|
|
}
|
|
for (var type in typeTable) {
|
|
if (typeTable[type] >= team.length) {
|
|
return;
|
|
}
|
|
}
|
|
return ["Your team must share a type."];
|
|
}
|
|
}
|
|
};
|