pokemon-showdown/data/formats.js
2013-04-30 23:34:34 -06:00

966 lines
27 KiB
JavaScript

exports.BattleFormats = {
// Singles
///////////////////////////////////////////////////////////////////
randombattle: {
name: "Random Battle",
section: "Singles",
effectType: 'Format',
team: 'random',
canUseRandomTeam: true,
searchDefault: true,
rated: true,
challengeShow: true,
searchShow: true,
ruleset: ['PotD', 'Pokemon', 'Sleep Clause']
},
unratedrandombattle: {
name: "Unrated Random Battle",
section: "Singles",
effectType: 'Format',
team: 'random',
canUseRandomTeam: true,
searchShow: true,
ruleset: ['Random Battle']
},
challengecup: {
name: "Challenge Cup",
section: "Singles",
effectType: 'Format',
team: 'randomCC',
canUseRandomTeam: true,
rated: true,
challengeShow: true,
searchShow: true,
ruleset: ['Pokemon']
},
challengecup1vs1: {
name: "Challenge Cup 1-vs-1",
section: "Singles",
effectType: 'Format',
team: 'randomCC',
canUseRandomTeam: true,
rated: true,
challengeShow: true,
searchShow: true,
ruleset: ['Pokemon', 'Team Preview 1v1'],
onBegin: function() {
this.debug('Cutting down to 1');
this.p1.pokemon = this.p1.pokemon.slice(0, 1);
this.p1.pokemonLeft = this.p1.pokemon.length;
this.p2.pokemon = this.p2.pokemon.slice(0, 1);
this.p2.pokemonLeft = this.p2.pokemon.length;
}
},
ou: {
name: "OU",
section: "Singles",
effectType: 'Format',
challengeDefault: true,
rated: true,
challengeShow: true,
searchShow: true,
isTeambuilderFormat: true,
ruleset: ['Pokemon', 'Standard', 'Evasion Abilities Clause', 'Team Preview'],
banlist: ['Uber', 'Drizzle ++ Swift Swim', 'Soul Dew']
},
cap: {
name: "CAP",
section: "Singles",
effectType: 'Format',
rated: true,
challengeShow: true,
// searchShow: true,
isTeambuilderFormat: true,
ruleset: ['CAP Pokemon', 'Standard', 'Evasion Abilities Clause', 'Team Preview'],
banlist: ['Uber', 'Drizzle ++ Swift Swim', 'Soul Dew']
},
capmalacondaplaytest: {
name: "CAP Malaconda Playtest",
section: "Singles",
effectType: 'Format',
rated: true,
challengeShow: true,
searchShow: true,
isTeambuilderFormat: true,
ruleset: ['CAP Pokemon', 'Standard', 'Evasion Abilities Clause', 'Team Preview'],
banlist: ['G4CAP', 'Tomohawk', 'Necturna', 'Mollux', 'Aurumoth', 'ShadowStrike', 'Paleo Wave', 'Drizzle ++ Swift Swim', 'Soul Dew', 'Arceus-Bug', 'Arceus-Dark', 'Arceus-Dragon', 'Arceus-Electric', 'Arceus-Fighting', 'Arceus-Fire', 'Arceus-Flying', 'Arceus-Ghost', 'Arceus-Grass', 'Arceus-Ground', 'Arceus-Ice', 'Arceus', 'Arceus-Poison', 'Arceus-Psychic', 'Arceus-Rock', 'Arceus-Steel', 'Arceus-Water', 'Blaziken', 'Darkrai', 'Deoxys', 'Deoxys-Attack', 'Deoxys-Speed', 'Dialga', 'Excadrill', 'Genesect', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kyogre', 'Lugia', 'Manaphy', 'Mewtwo', 'Palkia', 'Rayquaza', 'Reshiram', 'Shaymin-Sky', 'Thundurus', 'Tornadus-Therian', 'Zekrom', 'Kyurem-White']
},
ubers: {
name: "Ubers",
section: "Singles",
effectType: 'Format',
rated: true,
challengeShow: true,
// searchShow: true,
isTeambuilderFormat: true,
ruleset: ['Pokemon', 'Team Preview', 'Standard Ubers'],
banlist: []
},
uberssuspecttest: {
name: "Ubers (suspect test)",
section: "Singles",
effectType: 'Format',
rated: true,
challengeShow: true,
searchShow: true,
isTeambuilderFormat: true,
ruleset: ['Pokemon', 'Team Preview', 'Sleep Clause', 'Species Clause', 'OHKO Clause'],
banlist: ['Unreleased', 'Illegal']
},
uu: {
name: "UU",
section: "Singles",
effectType: 'Format',
rated: true,
challengeShow: true,
searchShow: true,
isTeambuilderFormat: true,
ruleset: ['OU'],
banlist: ['OU', 'BL', 'Drought', 'Sand Stream']
},
ru: {
name: "RU",
section: "Singles",
effectType: 'Format',
rated: true,
challengeShow: true,
searchShow: true,
isTeambuilderFormat: true,
ruleset: ['UU'],
banlist: ['UU', 'BL2', 'Shell Smash + Baton Pass']
},
nu: {
name: "NU",
section: "Singles",
effectType: 'Format',
rated: true,
challengeShow: true,
searchShow: true,
isTeambuilderFormat: true,
ruleset: ['RU'],
banlist: ['RU','BL3']
},
lc: {
name: "LC",
section: "Singles",
effectType: 'Format',
maxLevel: 5,
rated: true,
challengeShow: true,
searchShow: true,
isTeambuilderFormat: true,
ruleset: ['Pokemon', 'Standard', 'Team Preview', 'Little Cup'],
banlist: ['Sonicboom', 'Dragon Rage', 'Berry Juice', 'Carvanha', 'Meditite', 'Gligar', 'Scyther', 'Sneasel', 'Tangela', 'Vulpix', 'Yanma', 'Soul Dew']
},
customgame: {
name: "Custom Game",
section: "Singles",
effectType: 'Format',
challengeShow: true,
canUseRandomTeam: true,
debug: true,
maxLevel: 1000,
// no restrictions, for serious
ruleset: ['Team Preview']
},
customgamenoteampreview: {
name: "Custom Game (no Team Preview)",
section: "Singles",
effectType: 'Format',
challengeShow: true,
canUseRandomTeam: true,
debug: true,
maxLevel: 1000,
// no restrictions, for serious
ruleset: []
},
// Doubles
///////////////////////////////////////////////////////////////////
doublesvgc2013: {
name: "Doubles VGC 2013",
section: 'Doubles',
effectType: 'Format',
gameType: 'doubles',
rated: true,
challengeShow: true,
searchShow: true,
onBegin: function() {
this.debug('cutting down to 4');
this.p1.pokemon = this.p1.pokemon.slice(0,4);
this.p1.pokemonLeft = this.p1.pokemon.length;
this.p2.pokemon = this.p2.pokemon.slice(0,4);
this.p2.pokemonLeft = this.p2.pokemon.length;
},
maxForcedLevel: 50,
// no restrictions, for serious
ruleset: ['Pokemon', 'Team Preview VGC', 'Species Clause', 'Item Clause'],
banlist: ['Unreleased', 'Illegal', 'Sky Drop', 'Dark Void', 'Soul Dew',
'Mewtwo',
'Mew',
'Lugia',
'Ho-Oh',
'Celebi',
'Kyogre',
'Groudon',
'Rayquaza',
'Jirachi',
'Deoxys', 'Deoxys-Attack', 'Deoxys-Speed', 'Deoxys-Defense',
'Chatot',
'Dialga',
'Palkia',
'Giratina', 'Giratina-Origin',
'Phione',
'Manaphy',
'Darkrai',
'Shaymin', 'Shaymin-Sky',
'Arceus', 'Arceus-Bug', 'Arceus-Dark', 'Arceus-Dragon', 'Arceus-Electric', 'Arceus-Fighting', 'Arceus-Fire', 'Arceus-Flying', 'Arceus-Ghost', 'Arceus-Grass', 'Arceus-Ground', 'Arceus-Ice', 'Arceus', 'Arceus-Poison', 'Arceus-Psychic', 'Arceus-Rock', 'Arceus-Steel', 'Arceus-Water',
'Victini',
'Reshiram',
'Zekrom',
'Kyurem', 'Kyurem-Black', 'Kyurem-White',
'Keldeo', 'Keldeo-Resolute',
'Meloetta',
'Genesect'
]
},
smogondoubles: {
name: "Smogon Doubles",
section: 'Doubles',
effectType: 'Format',
gameType: 'doubles',
challengeShow: true,
searchShow: true,
rated: true,
// no restrictions, for serious
ruleset: ['Pokemon', 'Team Preview', 'Sleep Clause', 'Species Clause', 'OHKO Clause', 'Moody Clause', 'Evasion Moves Clause', 'Evasion Abilities Clause'],
banlist: ['Unreleased', 'Illegal', 'Sky Drop', 'Dark Void', 'Soul Dew',
'Mewtwo',
'Lugia',
'Ho-Oh',
'Kyogre',
'Groudon',
'Rayquaza',
'Dialga',
'Palkia',
'Giratina', 'Giratina-Origin',
'Arceus', 'Arceus-Bug', 'Arceus-Dark', 'Arceus-Dragon', 'Arceus-Electric', 'Arceus-Fighting', 'Arceus-Fire', 'Arceus-Flying', 'Arceus-Ghost', 'Arceus-Grass', 'Arceus-Ground', 'Arceus-Ice', 'Arceus', 'Arceus-Poison', 'Arceus-Psychic', 'Arceus-Rock', 'Arceus-Steel', 'Arceus-Water',
'Reshiram',
'Zekrom',
'Kyurem-White'
]
},
doublesrandombattledev: {
name: "Doubles Random Battle (dev)",
section: 'Doubles',
effectType: 'Format',
gameType: 'doubles',
team: 'random',
canUseRandomTeam: true,
rated: true,
challengeShow: true,
debug: true,
ruleset: ['PotD', 'Pokemon']
},
doubleschallengecup: {
name: "Doubles Challenge Cup",
section: 'Doubles',
effectType: 'Format',
gameType: 'doubles',
team: 'randomCC',
canUseRandomTeam: true,
rated: true,
challengeShow: true,
debug: true,
ruleset: ['Pokemon']
},
doublescustomgame: {
name: "Doubles Custom Game",
section: 'Doubles',
effectType: 'Format',
gameType: 'doubles',
challengeShow: true,
canUseRandomTeam: true,
debug: true,
maxLevel: 1000,
// no restrictions, for serious
ruleset: ['Team Preview']
},
// Other Metagames
///////////////////////////////////////////////////////////////////
pu: {
name: "PU",
section: "OM of the Month",
effectType: 'Format',
rated: true,
challengeShow: true,
searchShow: true,
isTeambuilderFormat: true,
ruleset: ['NU'],
banlist: ["Charizard", "Wartortle", "Kadabra", "Golem", "Haunter", "Exeggutor", "Weezing", "Kangaskhan", "Pinsir", "Lapras", "Ampharos", "Misdreavus", "Piloswine", "Miltank", "Ludicolo", "Swellow", "Gardevoir", "Ninjask", "Torkoal", "Cacturne", "Altaria", "Armaldo", "Gorebyss", "Regirock", "Regice", "Bastiodon", "Floatzel", "Drifblim", "Skuntank", "Lickilicky", "Probopass", "Rotom-Fan", "Samurott", "Musharna", "Gurdurr", "Sawk", "Carracosta", "Garbodor", "Sawsbuck", "Alomomola", "Golurk", "Braviary", "Articuno", "Electabuzz", "Electrode", "Marowak", "Liepard", "Tangela", "Eelektross", "Ditto", "Seismitoad", "Zangoose", "Roselia", "Zebstrika", "Serperior", "Metang", "Tauros", "Torterra", "Cradily"]
},
seasonalmaymayhem: {
name: "[Seasonal] May Mayhem",
section: "OM of the Month",
team: 'randomSeasonalMM',
canUseRandomTeam: true,
effectType: 'Format',
rated: true,
challengeShow: true,
searchShow: true,
onBegin: function() {
// Shameless plug
var date = Date();
date = date.split(' ');
if (parseInt(date[2]) === 12) {
this.add('-message', 'Wish a HAPPY BIRTHDAY to Treecko32!!');
}
if (parseInt(date[2]) === 16) {
this.add('-message', 'Wish a HAPPY BIRTHDAY to Joim!!');
}
this.add('-message', 'Wish a HAPPY BIRTHDAY to Birkal!!');
},
onSwitchIn: function(pokemon) {
var msg = '';
switch (pokemon.name) {
case 'Celebi':
msg = 'Do or Do not. There is no try.';
break;
case 'Clefairy':
msg = 'You have your moments. Not many of them, but you do have them.';
break;
case 'Piloswine':
msg = 'Gggggaaaaaaarrrrr. Arrrrhhhn.';
break;
case 'Deoxys':
msg = '*hhhh* I am your father. *hhhh*';
break;
case 'Clefable':
msg = 'I did shoot first.';
break;
case 'Jirachi':
msg = 'May the force be with you.';
break;
default:
var dice = this.random(100);
if (dice < 25) msg = 'Never gonna give you up, never gonna let you down';
break;
}
if (msg !== '') this.add('-message', msg);
}
},
hackmons: {
name: "Hackmons",
section: "Other Metagames",
effectType: 'Format',
rated: true,
challengeShow: true,
searchShow: true,
isTeambuilderFormat: true,
ruleset: ['Pokemon'],
banlist: []
},
balancedhackmons: {
name: "Balanced Hackmons",
section: "Other Metagames",
effectType: 'Format',
rated: true,
challengeShow: true,
searchShow: true,
isTeambuilderFormat: true,
ruleset: ['Pokemon', 'OHKO Clause'],
banlist: ['Wonder Guard', 'Pure Power', 'Huge Power', 'Shadow Tag', 'Arena Trap']
},
gennextou: {
name: "Gen-NEXT OU",
section: "Other Metagames",
mod: 'gennext',
effectType: 'Format',
challengeShow: true,
ruleset: ['Pokemon', 'Standard NEXT', 'Team Preview'],
banlist: ['Uber']
},
oumonotype: {
name: "OU Monotype",
section: "Other Metagames",
effectType: 'Format',
challengeShow: true,
isTeambuilderFormat: true,
ruleset: ['Pokemon', 'Standard', 'Same Type Clause', 'Evasion Abilities Clause', 'Team Preview'],
banlist: ['Uber', 'Drizzle ++ Swift Swim', 'Soul Dew']
},
glitchmons: {
name: "Glitchmons",
section: "Other Metagames",
effectType: 'Format',
rated: true,
challengeShow: true,
searchShow: true,
isTeambuilderFormat: true,
ruleset: ['Pokemon', 'Team Preview'],
banlist: ['Illegal', 'Unreleased'],
mimicGlitch: true
},
lcubers: {
name: "LC Ubers",
section: "Other Metagames",
effectType: 'Format',
maxLevel: 5,
challengeShow: true,
ruleset: ['Pokemon', 'Standard', 'Team Preview', 'Little Cup'],
banlist: ['Sonicboom', 'Dragon Rage', 'Berry Juice', 'Soul Dew']
},
lcuu: {
name: "LC UU",
section: "Other Metagames",
effectType: 'Format',
maxLevel: 5,
challengeShow: true,
ruleset: ['LC'],
banlist: ['Abra', 'Aipom', 'Archen', 'Axew', 'Bronzor', 'Chinchou', 'Clamperl', 'Cottonee', 'Cranidos', 'Croagunk', 'Diglett', 'Drifloon', 'Drilbur', 'Dwebble', 'Ferroseed', 'Foongus', 'Frillish', 'Gastly', 'Hippopotas', 'Houndour', 'Koffing', 'Larvesta', 'Lileep', 'Machop', 'Magnemite', 'Mienfoo', 'Misdreavus', 'Munchlax', 'Murkrow', 'Pawniard', 'Ponyta', 'Porygon', 'Riolu', 'Sandshrew', 'Scraggy', 'Shellder', 'Shroomish', 'Slowpoke', 'Snover', 'Staryu', 'Tentacool', 'Timburr', 'Tirtouga']
},
dwubers: {
name: "DW Ubers",
section: "Other Metagames",
effectType: 'Format',
challengeShow: true,
isTeambuilderFormat: true,
isDWtier: true,
ruleset: ['Pokemon', 'Standard DW', 'Team Preview'],
banlist: []
},
dwou: {
name: "DW OU",
section: "Other Metagames",
effectType: 'Format',
challengeShow: true,
isTeambuilderFormat: true,
ruleset: ['Pokemon', 'Standard DW', 'Team Preview'],
banlist: ['Drizzle ++ Swift Swim', 'Soul Dew', 'Arceus', 'Arceus-Bug', 'Arceus-Dark', 'Arceus-Dragon', 'Arceus-Electric', 'Arceus-Fighting', 'Arceus-Fire', 'Arceus-Flying', 'Arceus-Ghost', 'Arceus-Grass', 'Arceus-Ground', 'Arceus-Ice', 'Arceus-Poison', 'Arceus-Psychic', 'Arceus-Rock', 'Arceus-Steel', 'Arceus-Water', 'Blaziken', 'Deoxys', 'Deoxys-Attack', 'Dialga', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Mewtwo', 'Palkia', 'Rayquaza', 'Reshiram', 'Shaymin-Sky', 'Zekrom']
},
dwuu: {
name: "DW UU",
section: "Other Metagames",
effectType: 'Format',
challengeShow: true,
ruleset: ['DW OU'],
banlist: ['Chandelure', 'Genesect', 'Tyranitar', 'Dragonite', 'Breloom', 'Ferrothorn', 'Politoed', 'Gliscor', 'Ninetales', 'Scizor', 'Excadrill', 'Keldeo', 'Infernape', 'Venusaur', 'Heatran', 'Rotom-Wash', 'Garchomp', 'Serperior', 'Gengar', 'Volcarona', 'Forretress', 'Conkeldurr', 'Espeon', 'Cloyster', 'Skarmory', 'Starmie', 'Salamence', 'Gyarados', 'Zapdos', 'Jirachi', 'Latios', 'Tentacruel', 'Haxorus', 'Landorus', 'Mamoswine', 'Charizard', 'Lucario', 'Jellicent', 'Blissey', 'Terrakion', 'Heracross', 'Metagross', 'Ditto', 'Hydreigon', 'Thundurus', 'Alakazam', 'Deoxys-Speed', 'Latias', 'Gastrodon', 'Togekiss', 'Donphan', 'Bronzong', 'Manaphy']
},
tiershift: {
name: "Tier Shift",
section: 'Other Metagames',
mod: 'tiershift',
effectType: 'Format',
rated: true,
challengeShow: true,
searchShow: true,
isTeambuilderFormat: true,
ruleset: ['Pokemon', 'Standard', 'Evasion Abilities Clause', 'Team Preview'],
banlist: ['Uber', 'Drizzle ++ Swift Swim', 'Soul Dew']
},
// Past Generations
///////////////////////////////////////////////////////////////////
gen4oubeta: {
name: "[Gen 4] OU (beta)",
section: "Past Generations",
mod: 'gen4',
effectType: 'Format',
challengeDefault: true,
rated: true,
challengeShow: true,
searchShow: true,
isTeambuilderFormat: true,
ruleset: ['Pokemon', 'Standard'],
banlist: ['Uber']
},
gen4hackmons: {
name: "[Gen 4] Hackmons",
section: "Past Generations",
mod: 'gen4',
effectType: 'Format',
challengeShow: true,
ruleset: ['Pokemon'],
banlist: []
},
gen4customgame: {
name: "[Gen 4] Custom Game",
section: "Past Generations",
mod: 'gen4',
effectType: 'Format',
challengeShow: true,
canUseRandomTeam: true,
debug: true,
ruleset: []
},
gen3hackmons: {
name: "[Gen 3] Hackmons",
section: "Past Generations",
mod: 'gen3',
effectType: 'Format',
challengeShow: true,
ruleset: ['Pokemon'],
banlist: []
},
gen3customgame: {
name: "[Gen 3] Custom Game",
section: "Past Generations",
mod: 'gen3',
effectType: 'Format',
challengeShow: true,
ruleset: []
},
gen1oubeta: {
name: "[Gen 1] OU (beta)",
section: "Past Generations",
mod: 'gen1',
effectType: 'Format',
challengeDefault: true,
rated: true,
challengeShow: true,
searchShow: true,
isTeambuilderFormat: true,
ruleset: ['Pokemon', 'Standard'],
banlist: ['Uber', 'Wrap', 'Fire Spin', 'Clamp', 'Bind']
},
gen1customgame: {
name: "[Gen 1] Custom Game",
section: "Past Generations",
mod: 'gen1',
effectType: 'Format',
challengeShow: true,
debug: true,
ruleset: ['Pokemon']
},
standardnext: {
effectType: 'Banlist',
ruleset: ['Sleep Clause', 'Species Clause', 'OHKO Clause'],
banlist: ['Unreleased', 'Illegal', 'Double Team'],
validateSet: function(set) {
// limit one of each move in Standard
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;
}
},
// Rulesets
///////////////////////////////////////////////////////////////////
standard: {
effectType: 'Banlist',
ruleset: ['Sleep Clause', 'Species Clause', 'OHKO Clause', 'Moody Clause', 'Evasion Moves Clause'],
banlist: ['Unreleased', 'Illegal'],
validateSet: function(set) {
// limit one of each move in Standard
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;
}
},
standardubers: {
effectType: 'Banlist',
ruleset: ['Sleep Clause', 'Species Clause', 'Moody Clause', 'OHKO Clause'],
banlist: ['Unreleased', 'Illegal'],
validateSet: function(set) {
// limit one of each move in Standard
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;
}
},
standarddw: {
effectType: 'Banlist',
ruleset: ['Sleep Clause', 'Species Clause', 'OHKO Clause', 'Evasion Moves Clause'],
banlist: ['Illegal', 'Moody'],
validateSet: function(set) {
// limit one of each move in Standard
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;
}
},
pokemon: {
effectType: 'Banlist',
validateSet: function(set, format) {
var item = this.getItem(set.item);
var template = this.getTemplate(set.species);
var problems = [];
if (set.species === set.name) delete set.name;
if (template.num == 493) { // Arceus
if (set.ability === 'Multitype' && item.onPlate) {
set.species = 'Arceus-'+item.onPlate;
} else {
set.species = 'Arceus';
}
}
if (template.num == 487) { // Giratina
if (item.id === 'griseousorb') {
set.species = 'Giratina-Origin';
if (format.banlistTable && format.banlistTable['illegal']) set.ability = 'Levitate';
} else {
set.species = 'Giratina';
if (format.banlistTable && format.banlistTable['illegal']) set.ability = 'Pressure';
}
}
if (template.num == 555) { // Darmanitan
set.species = 'Darmanitan';
}
if (template.num == 648) { // Meloetta
set.species = 'Meloetta';
}
if (template.num == 351) { // Castform
set.species = 'Castform';
}
if (template.num == 421) { // Cherrim
set.species = 'Cherrim';
}
if (template.num == 647) { // Keldeo
if (set.species === 'Keldeo-Resolution' && set.moves.indexOf('Secret Sword') < 0) {
set.species = 'Keldeo';
}
}
if (template.gen > this.gen) {
problems.push(set.species+' does not exist in gen '+this.gen+'.');
} else if (template.isNonstandard) {
problems.push(set.species+' is not a real Pokemon.');
}
if (set.ability) {
var ability = this.getAbility(set.ability);
if (ability.gen > this.gen) {
problems.push(ability.name+' does not exist in gen '+this.gen+'.');
} else if (ability.isNonstandard) {
problems.push(ability.name+' is not a real ability.');
}
}
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 (move.isNonstandard) {
problems.push(move.name+' is not a real move.');
}
}
if (item) {
if (item.gen > this.gen) {
problems.push(item.name+' does not exist in gen '+this.gen+'.');
} else if (item.isNonstandard) {
problems.push(item.name + ' is not a real item.');
}
}
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.');
}
return problems;
}
},
cappokemon: {
effectType: 'Rule',
validateSet: function(set, format) {
// don't return
this.getEffect('Pokemon').validateSet.call(this, set, format);
}
},
legal: {
effectType: 'Banlist',
banlist: ['Crobat+BraveBird+Hypnosis']
},
potd: {
effectType: 'Rule',
onPotD: '',
onStart: function() {
if (this.effect.onPotD) {
this.add('rule', 'Pokemon of the Day: '+this.effect.onPotD);
}
}
},
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(\-[a-zA-Z\?]+)?/, 'Arceus-*'));
}
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(\-[a-zA-Z\?]+)?/, 'Arceus-*'));
}
},
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(\-[a-zA-Z\?]+)?/, 'Arceus-*'));
}
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(\-[a-zA-Z\?]+)?/, 'Arceus-*'));
}
},
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(\-[a-zA-Z\?]+)?/, 'Arceus-*'));
}
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(\-[a-zA-Z\?]+)?/, 'Arceus-*'));
}
},
onTeamPreview: function() {
this.makeRequest('teampreview');
}
},
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 Pokemon');
},
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 pokemon 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;
}
}
},
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');
}
},
moodyclause: {
effectType: 'Banlist',
name: 'Moody Clause',
banlist: ['Moody'],
onStart: function() {
this.add('rule', 'Moody Clause: Moody is banned');
}
},
sleepclause: {
effectType: 'Rule',
onStart: function() {
this.add('rule', 'Sleep Clause: 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 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: Pokemon 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."];
}
}
};