mirror of
https://github.com/smogon/pokemon-showdown.git
synced 2026-05-14 08:20:43 -05:00
1131 lines
32 KiB
JavaScript
1131 lines
32 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 Mod', 'HP Percentage Mod']
|
|
},
|
|
unratedrandombattle: {
|
|
name: "Unrated Random Battle",
|
|
section: "Singles",
|
|
|
|
effectType: 'Format',
|
|
team: 'random',
|
|
canUseRandomTeam: true,
|
|
searchShow: true,
|
|
ruleset: ['Random Battle']
|
|
},
|
|
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']
|
|
},
|
|
/**
|
|
oucurrent: {
|
|
name: "OU (current)",
|
|
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']
|
|
},
|
|
oususpecttest: {
|
|
name: "OU (suspect test)",
|
|
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', 'Landorus']
|
|
},*/
|
|
// ounostealthrock: {
|
|
// name: "OU (no Stealth Rock)",
|
|
// 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', 'Stealth Rock']
|
|
// },
|
|
ubers: {
|
|
name: "Ubers",
|
|
section: "Singles",
|
|
|
|
effectType: 'Format',
|
|
rated: true,
|
|
challengeShow: true,
|
|
searchShow: true,
|
|
isTeambuilderFormat: true,
|
|
ruleset: ['Pokemon', 'Team Preview', 'Standard Ubers'],
|
|
banlist: []
|
|
},
|
|
uu: {
|
|
name: "UU",
|
|
section: "Singles",
|
|
|
|
effectType: 'Format',
|
|
rated: true,
|
|
challengeShow: true,
|
|
searchShow: true,
|
|
isTeambuilderFormat: true,
|
|
ruleset: ['OU'],
|
|
banlist: ['OU', 'BL', 'Drought', 'Sand Stream']
|
|
},
|
|
uususpecttest: {
|
|
name: "UU (suspect test)",
|
|
section: "Singles",
|
|
|
|
effectType: 'Format',
|
|
rated: true,
|
|
challengeShow: true,
|
|
searchShow: true,
|
|
isTeambuilderFormat: true,
|
|
ruleset: ['OU'],
|
|
banlist: ['OU', 'BL', 'Drought', 'Sand Stream', 'Froslass']
|
|
},
|
|
ru: {
|
|
name: "RU",
|
|
section: "Singles",
|
|
|
|
effectType: 'Format',
|
|
rated: true,
|
|
challengeShow: true,
|
|
//searchShow: true,
|
|
isTeambuilderFormat: true,
|
|
ruleset: ['UU'],
|
|
banlist: ['UU', 'BL2', 'Shell Smash + Baton Pass']
|
|
},
|
|
rususpecttest: {
|
|
name: "RU (suspect test)",
|
|
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']
|
|
},
|
|
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']
|
|
},
|
|
customgame: {
|
|
name: "Custom Game",
|
|
section: "Singles",
|
|
|
|
effectType: 'Format',
|
|
challengeShow: true,
|
|
canUseRandomTeam: true,
|
|
debug: true,
|
|
maxLevel: 1000,
|
|
defaultLevel: 100,
|
|
// no restrictions, for serious (other than team preview)
|
|
ruleset: ['Team Preview']
|
|
},
|
|
customgamenoteampreview: {
|
|
name: "Custom Game (no Team Preview)",
|
|
section: "Singles",
|
|
|
|
effectType: 'Format',
|
|
challengeShow: true,
|
|
canUseRandomTeam: true,
|
|
debug: true,
|
|
maxLevel: 1000,
|
|
defaultLevel: 100,
|
|
// no restrictions, for serious
|
|
ruleset: []
|
|
},
|
|
gbusingles: {
|
|
name: "GBU Singles",
|
|
section: "Singles",
|
|
|
|
effectType: 'Format',
|
|
challengeShow: true,
|
|
rated: true,
|
|
searchShow: true,
|
|
validateSet: function(set) {
|
|
if (!set.level || set.level >= 50) set.forcedLevel = 50;
|
|
return [];
|
|
},
|
|
onBegin: function() {
|
|
this.debug('cutting down to 3');
|
|
this.p1.pokemon = this.p1.pokemon.slice(0,3);
|
|
this.p1.pokemonLeft = this.p1.pokemon.length;
|
|
this.p2.pokemon = this.p2.pokemon.slice(0,3);
|
|
this.p2.pokemonLeft = this.p2.pokemon.length;
|
|
},
|
|
ruleset: ['Pokemon', 'Species Clause', 'Item Clause', 'Team Preview GBU'],
|
|
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-Poison',
|
|
'Arceus-Psychic', 'Arceus-Rock', 'Arceus-Steel', 'Arceus-Water',
|
|
'Victini', 'Reshiram', 'Zekrom', 'Kyurem', 'Kyurem-Black', 'Kyurem-White',
|
|
'Keldeo', 'Keldeo-Resolute', 'Meloetta', 'Genesect'
|
|
]
|
|
},
|
|
globalshowdown: {
|
|
name: "Global Showdown",
|
|
section: "Singles",
|
|
|
|
effectType: 'Format',
|
|
challengeShow: true,
|
|
rated: true,
|
|
searchShow: true,
|
|
validateSet: function(set) {
|
|
if (!set.level || set.level >= 50) set.forcedLevel = 50;
|
|
return [];
|
|
},
|
|
onBegin: function() {
|
|
this.debug('cutting down to 3');
|
|
this.p1.pokemon = this.p1.pokemon.slice(0,3);
|
|
this.p1.pokemonLeft = this.p1.pokemon.length;
|
|
this.p2.pokemon = this.p2.pokemon.slice(0,3);
|
|
this.p2.pokemonLeft = this.p2.pokemon.length;
|
|
},
|
|
ruleset: ['Pokemon', 'Species Clause', 'Item Clause', 'Team Preview GBU'],
|
|
banlist: ['Unreleased', 'Illegal', 'Sky Drop', 'Dark Void', 'Soul Dew', 'Chatot']
|
|
},
|
|
|
|
// 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,
|
|
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,
|
|
ruleset: ['Pokemon', 'Team Preview', 'Sleep Clause Mod', 'Species Clause', 'OHKO Clause', 'Moody Clause', 'Evasion Moves Clause', 'Evasion Abilities Clause', 'HP Percentage Mod'],
|
|
banlist: ['Unreleased', 'Illegal', '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', 'HP Percentage Mod']
|
|
},
|
|
doubleschallengecup: {
|
|
name: "Doubles Challenge Cup",
|
|
section: 'Doubles',
|
|
|
|
effectType: 'Format',
|
|
gameType: 'doubles',
|
|
team: 'randomCC',
|
|
canUseRandomTeam: true,
|
|
rated: true,
|
|
challengeShow: true,
|
|
debug: true,
|
|
ruleset: ['Pokemon', 'HP Percentage Mod']
|
|
},
|
|
doublescustomgame: {
|
|
name: "Doubles Custom Game",
|
|
section: 'Doubles',
|
|
|
|
effectType: 'Format',
|
|
gameType: 'doubles',
|
|
challengeShow: true,
|
|
canUseRandomTeam: true,
|
|
debug: true,
|
|
maxLevel: 1000,
|
|
defaultLevel: 100,
|
|
// no restrictions, for serious (other than team preview)
|
|
ruleset: ['Team Preview']
|
|
},
|
|
|
|
// Other Metagames
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
stabmons: {
|
|
name: "STABmons",
|
|
section: "OM of the Month",
|
|
|
|
effectType: 'Format',
|
|
rated: true,
|
|
challengeShow: true,
|
|
searchShow: true,
|
|
isTeambuilderFormat: true,
|
|
ruleset: ['Pokemon', 'Standard', 'Evasion Abilities Clause', 'Team Preview'],
|
|
banlist: ['Drizzle ++ Swift Swim', 'Soul Dew', 'Soul Dew',
|
|
'Mewtwo', 'Lugia', 'Ho-Oh', 'Blaziken', 'Kyogre', 'Groudon', 'Rayquaza', 'Deoxys', 'Deoxys-Attack', 'Dialga', 'Palkia', 'Giratina', 'Giratina-Origin', 'Manaphy', '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-Poison', 'Arceus-Psychic', 'Arceus-Rock', 'Arceus-Steel', 'Arceus-Water',
|
|
'Reshiram', 'Zekrom', 'Kyurem-White', 'Genesect'
|
|
]
|
|
},
|
|
seasonalaverageaugust: {
|
|
effectType: 'Format',
|
|
name: "[Seasonal] Average August",
|
|
section: "OM of the Month",
|
|
team: 'randomSeasonalAA',
|
|
canUseRandomTeam: true,
|
|
rated: true,
|
|
challengeShow: true,
|
|
searchShow: true,
|
|
gameType: 'doubles',
|
|
ruleset: ['HP Percentage Mod', 'Sleep Clause Mod'],
|
|
onBegin: function() {
|
|
// What does player 1 lead with?
|
|
var p1Where = 'boat';
|
|
var p2Where = 'boat';
|
|
if (this.p1.pokemon[0].name === 'Kyogre') p1Where = 'pirates';
|
|
if (this.p2.pokemon[0].name === 'Kyogre') p2Where = 'pirates';
|
|
var shipNames = [
|
|
'Zarelrules', 'Joimawesome', 'Treeckonoob', 'MJailBait', 'mikelpuns', 'TTTtttttt', 'Frazzle Dazzle',
|
|
'TIbot', 'CDXCIV', 'Srs Bsns Trts', 'Leemz', 'Eggymad', 'Snoffles', 'bmelted', 'Poopes', 'Hugonedugen',
|
|
'Il Haunter', 'chaospwns', 'WaterBro', 'niggie', 'DOOM', 'qhore', 'Jizzmine', 'Aldarown'
|
|
].randomize();
|
|
var whereAreThey = (p1Where === 'boat' && p2Where === 'boat')? 'You both were aboard the fantastic ship S. S. ' + shipNames[0] :
|
|
((p1Where === 'pirates' && p2Where === 'pirates')? 'You are two pirate gangs on a summer sea storm about to raze the ship S. S. ' + shipNames[0] :
|
|
((p1Where === 'pirates')? this.p1.name : this.p2.name) + ' leads a pirate boat to raze the ship S. S. ' + shipNames[0]
|
|
+ ' where ' + ((p1Where === 'pirates')? this.p2.name : this.p1.name)) + ' is enjoying a sea travel,';
|
|
|
|
this.add('-message',
|
|
'Alas, poor trainers! ' + whereAreThey + " when a sudden summer Hurricane made a Wailord hit your transport, and now it's sinking! "
|
|
+ "There are not enough life boats for everyone nor trainers ain't sharing their Water-type friends, "
|
|
+ "so you'll have to fight to access a life boat! Good luck! You have to be fast to not to be hit by the Hurricane!"
|
|
);
|
|
},
|
|
onSwitchIn: function(pokemon) {
|
|
if (pokemon.battle.turn > 0) {
|
|
var result = true;
|
|
for (var i=0; i<pokemon.battle.sides.length; i++) {
|
|
for (var j=0; j<pokemon.battle.sides[i].active.length; j++) {
|
|
if (pokemon.battle.sides[i].active[j] && !pokemon.battle.sides[i].active[j].volatiles['perishsong']) {
|
|
result = false;
|
|
}
|
|
if (pokemon.battle.sides[i].active[j] && pokemon.battle.sides[i].active[j].ability !== 'soundproof') {
|
|
pokemon.battle.sides[i].active[j].addVolatile('perishsong');
|
|
} else {
|
|
this.add('-immune', pokemon.battle.sides[i].active[j], '[msg]');
|
|
this.add('-end', pokemon.battle.sides[i].active[j], 'Perish Song');
|
|
}
|
|
}
|
|
}
|
|
if (result) return false;
|
|
this.add('-fieldactivate', 'move: Perish Song');
|
|
}
|
|
}
|
|
},
|
|
challengecup: {
|
|
name: "Challenge Cup",
|
|
section: "Other Metagames",
|
|
|
|
effectType: 'Format',
|
|
team: 'randomCC',
|
|
canUseRandomTeam: true,
|
|
rated: true,
|
|
challengeShow: true,
|
|
searchShow: true,
|
|
ruleset: ['Pokemon', 'HP Percentage Mod']
|
|
},
|
|
challengecup1vs1: {
|
|
name: "Challenge Cup 1-vs-1",
|
|
section: "Other Metagames",
|
|
|
|
effectType: 'Format',
|
|
team: 'randomCC',
|
|
canUseRandomTeam: true,
|
|
rated: true,
|
|
challengeShow: true,
|
|
searchShow: true,
|
|
ruleset: ['Pokemon', 'Team Preview 1v1', 'HP Percentage Mod'],
|
|
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;
|
|
}
|
|
},
|
|
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',
|
|
rated: true,
|
|
challengeShow: true,
|
|
searchShow: 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,
|
|
isTeambuilderFormat: true,
|
|
ruleset: ['Pokemon', 'Team Preview', 'HP Percentage Mod'],
|
|
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']
|
|
},
|
|
dreamworld: {
|
|
name: "Dream World",
|
|
section: "Other Metagames",
|
|
|
|
effectType: 'Format',
|
|
challengeShow: true,
|
|
isTeambuilderFormat: true,
|
|
ruleset: ['Pokemon', 'Standard DW', 'Team Preview'],
|
|
banlist: []
|
|
},
|
|
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']
|
|
},
|
|
"1v1": {
|
|
name: "1v1",
|
|
section: 'Other Metagames',
|
|
|
|
effectType: 'Format',
|
|
rated: true,
|
|
challengeShow: true,
|
|
searchShow: true,
|
|
onBegin: function() {
|
|
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;
|
|
},
|
|
ruleset: ['Pokemon', 'Standard'],
|
|
banlist: ['Unreleased', 'Illegal', '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', 'Arceus-Poison', 'Arceus-Psychic', 'Arceus-Rock', 'Arceus-Steel', 'Arceus-Water',
|
|
'Blaziken',
|
|
'Darkrai',
|
|
'Deoxys', 'Deoxys-Attack',
|
|
'Dialga',
|
|
'Giratina', 'Giratina-Origin',
|
|
'Groudon',
|
|
'Ho-Oh',
|
|
'Kyogre',
|
|
'Kyurem-White',
|
|
'Lugia',
|
|
'Mewtwo',
|
|
'Palkia',
|
|
'Rayquaza',
|
|
'Reshiram',
|
|
'Shaymin-Sky',
|
|
'Zekrom',
|
|
'Memento', 'Explosion', 'Perish Song', 'Destiny Bond', 'Healing Wish', 'Selfdestruct', 'Lunar Dance', 'Final Gambit',
|
|
'Focus Sash'
|
|
]
|
|
},
|
|
pu: {
|
|
name: "PU",
|
|
section: "Other Metagames",
|
|
|
|
effectType: 'Format',
|
|
challengeShow: 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", "Electabuzz", "Electrode", "Liepard", "Tangela", "Eelektross", "Ditto", "Seismitoad", "Zangoose", "Roselia", "Serperior", "Metang", "Tauros", "Cradily", "Primeape", "Scolipede", "Jynx", "Basculin", "Gigalith", "Camerupt", "Golbat"]
|
|
},
|
|
|
|
// 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']
|
|
},
|
|
gen4uubeta: {
|
|
name: "[Gen 4] UU (beta)",
|
|
section: "Past Generations",
|
|
|
|
mod: 'gen4',
|
|
effectType: 'Format',
|
|
challengeDefault: true,
|
|
rated: true,
|
|
challengeShow: true,
|
|
searchShow: true,
|
|
isTeambuilderFormat: true,
|
|
ruleset: ['Pokemon', 'Standard'],
|
|
banlist: ['Uber', 'OU', 'BL']
|
|
},
|
|
gen4hackmons: {
|
|
name: "[Gen 4] Hackmons",
|
|
section: "Past Generations",
|
|
|
|
mod: 'gen4',
|
|
effectType: 'Format',
|
|
challengeShow: true,
|
|
ruleset: ['Pokemon', 'HP Percentage Mod'],
|
|
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', 'HP Percentage Mod'],
|
|
banlist: []
|
|
},
|
|
gen3customgame: {
|
|
name: "[Gen 3] Custom Game",
|
|
section: "Past Generations",
|
|
|
|
mod: 'gen3',
|
|
effectType: 'Format',
|
|
challengeShow: true,
|
|
ruleset: []
|
|
},
|
|
gen2oubeta: {
|
|
name: "[Gen 2] OU (beta)",
|
|
section: "Past Generations",
|
|
|
|
mod: 'gen2',
|
|
effectType: 'Format',
|
|
challengeDefault: true,
|
|
rated: true,
|
|
challengeShow: true,
|
|
searchShow: true,
|
|
isTeambuilderFormat: true,
|
|
debug: true,
|
|
ruleset: ['Pokemon', 'Standard'],
|
|
banlist: ['Uber']
|
|
},
|
|
gen2customgame: {
|
|
name: "[Gen 2] Custom Game",
|
|
section: "Past Generations",
|
|
|
|
mod: 'gen2',
|
|
effectType: 'Format',
|
|
challengeShow: true,
|
|
debug: true,
|
|
ruleset: ['Pokemon']
|
|
},
|
|
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']
|
|
},
|
|
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 Mod', 'Species Clause', 'OHKO Clause', 'HP Percentage Mod'],
|
|
banlist: ['Unreleased', 'Illegal', 'Soul Dew']
|
|
},
|
|
|
|
// Rulesets
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
standard: {
|
|
effectType: 'Banlist',
|
|
ruleset: ['Sleep Clause Mod', 'Species Clause', 'OHKO Clause', 'Moody Clause', 'Evasion Moves Clause', 'HP Percentage Mod'],
|
|
banlist: ['Unreleased', 'Illegal']
|
|
},
|
|
standardubers: {
|
|
effectType: 'Banlist',
|
|
ruleset: ['Sleep Clause Mod', 'Species Clause', 'Moody Clause', 'OHKO Clause', 'HP Percentage Mod'],
|
|
banlist: ['Unreleased', 'Illegal']
|
|
},
|
|
standarddw: {
|
|
effectType: 'Banlist',
|
|
ruleset: ['Sleep Clause Mod', 'Species Clause', 'OHKO Clause', 'Evasion Moves Clause', 'HP Percentage Mod'],
|
|
banlist: ['Illegal', 'Moody']
|
|
},
|
|
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.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.');
|
|
}
|
|
|
|
// ----------- 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.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
|
|
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.species === 'Keldeo-Resolution' && set.moves.indexOf('Secret Sword') < 0) {
|
|
set.species = 'Keldeo';
|
|
}
|
|
}
|
|
if (template.num == 648) { // Meloetta
|
|
set.species = 'Meloetta';
|
|
}
|
|
return problems;
|
|
}
|
|
},
|
|
cappokemon: {
|
|
effectType: 'Rule',
|
|
validateSet: function(set, format) {
|
|
// don't return
|
|
this.getEffect('Pokemon').validateSet.call(this, set, format);
|
|
|
|
// 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;
|
|
}
|
|
},
|
|
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');
|
|
}
|
|
},
|
|
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(\-[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', 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 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');
|
|
}
|
|
},
|
|
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: 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."];
|
|
}
|
|
}
|
|
};
|