From 40a843f83700dc415ac45a857a68f97cb59673d6 Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Sat, 1 Jun 2024 08:52:32 -0600 Subject: [PATCH 001/139] ZU: Ban Emboar --- data/formats-data.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/formats-data.ts b/data/formats-data.ts index 3870cc56b392..cff8fa9244a8 100644 --- a/data/formats-data.ts +++ b/data/formats-data.ts @@ -2898,7 +2898,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { tier: "NFE", }, emboar: { - tier: "ZU", + tier: "ZUBL", doublesTier: "(DUU)", natDexTier: "RU", }, From e22d5e357a0269f2c289e98b9d03272137d1fa42 Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Sat, 1 Jun 2024 08:54:23 -0600 Subject: [PATCH 002/139] Add June 2024 tier shifts --- data/formats-data.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/formats-data.ts b/data/formats-data.ts index cff8fa9244a8..f76263eb8315 100644 --- a/data/formats-data.ts +++ b/data/formats-data.ts @@ -1731,7 +1731,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { swampertmega: { isNonstandard: "Past", tier: "Illegal", - natDexTier: "UU", + natDexTier: "RU", }, poochyena: { tier: "LC", @@ -3046,7 +3046,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { }, excadrill: { tier: "UU", - doublesTier: "DUU", + doublesTier: "(DUU)", natDexTier: "UU", }, audino: { From 106f35d6d602e2843aceeb59d8978fb67df1d1be Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Sat, 1 Jun 2024 10:30:18 -0600 Subject: [PATCH 003/139] Update June rotational ladders --- config/formats.ts | 733 ++++++++++++++++++++++--------------------- data/formats-data.ts | 14 +- 2 files changed, 385 insertions(+), 362 deletions(-) diff --git a/config/formats.ts b/config/formats.ts index e5e71644fe84..4c77a4aa2fa7 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -621,247 +621,56 @@ export const Formats: FormatList = [ column: 2, }, { - 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.`, + 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.`, threads: [ - `• Cross Evolution`, + `• Fervent Impersonation`, ], 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', + 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-Base', '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-Base', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', ], - restricted: ['Espathra', 'Frosmoth', 'Gallade', 'Lilligant-Hisui', 'Lunala', 'Solgaleo'], - onValidateTeam(team) { - const nums = 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\u00e9mon must have different nicknames.`, - `(You have more than one Pok\u00e9mon named after a form of '${species.name}')`, - ]; - } - if (species.exists && species.name !== set.species) nums.add(species.num); - } - if (!nums.size) { - return [ - `${this.format.name} works using nicknames; your team has 0 nicknamed Pok\u00e9mon.`, - `(If this was intentional, add a nickname to one Pok\u00e9mon that isn't the name of a Pok\u00e9mon species.)`, - ]; - } - }, - checkCanLearn(move, species, lsetData, set) { - // @ts-ignore - if (!set.sp?.exists || !set.crossSpecies?.exists) { - return this.checkCanLearn(move, species, lsetData, set); - } - // @ts-ignore - const problem = this.checkCanLearn(move, set.sp); - if (!problem) return null; - // @ts-ignore - 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; - } - - // @ts-ignore - set.sp = species; - // @ts-ignore - 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; // chat - if (effect && ['imposter', 'transform'].includes(effect.id)) return; - if (target.set.name === target.set.species) return; - const crossSpecies = this.dex.species.get(target.set.name); - if (!crossSpecies.exists) return; - if (species.battleOnly || !species.nfe) return; - const crossIsUnreleased = (crossSpecies.tier === "Unreleased" && crossSpecies.isNonstandard === "Unobtainable" && - !this.ruleTable.has('+unobtainable')); - if (crossSpecies.battleOnly || crossIsUnreleased || !crossSpecies.prevo) return; - const crossPrevoSpecies = this.dex.species.get(crossSpecies.prevo); - if (!crossPrevoSpecies.prevo !== !species.prevo) return; - - const mixedSpecies = this.dex.deepClone(species); - mixedSpecies.weightkg = - Math.max(0.1, +(species.weightkg + crossSpecies.weightkg - crossPrevoSpecies.weightkg)).toFixed(1); - mixedSpecies.nfe = false; - mixedSpecies.evos = []; - mixedSpecies.eggGroups = crossSpecies.eggGroups; - mixedSpecies.abilities = crossSpecies.abilities; - mixedSpecies.bst = 0; - let i: StatID; - for (i in species.baseStats) { - const statChange = crossSpecies.baseStats[i] - crossPrevoSpecies.baseStats[i]; - mixedSpecies.baseStats[i] = this.clampIntRange(species.baseStats[i] + statChange, 1, 255); - mixedSpecies.bst += mixedSpecies.baseStats[i]; - } - if (crossSpecies.types[0] !== crossPrevoSpecies.types[0]) mixedSpecies.types[0] = crossSpecies.types[0]; - if (crossSpecies.types[1] !== crossPrevoSpecies.types[1]) { - mixedSpecies.types[1] = crossSpecies.types[1] || crossSpecies.types[0]; - } - if (mixedSpecies.types[0] === mixedSpecies.types[1]) mixedSpecies.types = [mixedSpecies.types[0]]; - - return mixedSpecies; - }, - onBegin() { - for (const pokemon of this.getAllPokemon()) { - pokemon.baseSpecies = pokemon.species; - } - }, + // 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] Type Split", - desc: `The Physical/Special split is reverted; All non-Status moves are Physical or Special depending on their type, no exceptions.`, + name: "[Gen 9] 350 Cup", + desc: `Pokemon with a BST of 350 or lower have their stats doubled.`, threads: [ - `Physical types: `, - `Special types: `, - `Dependent on the user's higher attacking stat:
Type Split`, + `• 350 Cup`, ], mod: 'gen9', - // searchShow: false, - ruleset: ['Standard OMs', 'Sleep Moves Clause', 'Evasion Abilities Clause'], - banlist: [ - 'Annihilape', 'Arceus', 'Archaludon', 'Calyrex-Shadow', 'Chi-Yu', 'Darkrai', 'Deoxys-Base', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', 'Espathra', - 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Iron Bundle', 'Koraidon', 'Kyogre', 'Kyurem-White', 'Landorus-Base', - 'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Regieleki', - 'Reshiram', 'Shaymin-Sky', 'Sneasler', 'Solgaleo', 'Terapagos', 'Volcarona', 'Zacian-Crowned', 'Zamazenta-Crowned', 'Arena Trap', 'Moody', 'Shadow Tag', - 'Bright Powder', 'Damp Rock', 'King\'s Rock', 'Razor Fang', 'Baton Pass', 'Last Respects', 'Shed Tail', - ], - onModifyMovePriority: -1000, - onModifyMove(move, pokemon, target) { - if (move.category === 'Status') return; - const specialTypes = ['Dark', 'Dragon', 'Electric', 'Fairy', 'Fire', 'Grass', 'Ice', 'Psychic', 'Water']; - if (specialTypes.includes(move.type)) { - move.category = 'Special'; - } else if (move.type === 'Stellar') { - move.category = pokemon.getStat('atk', false, true) > pokemon.getStat('spa', false, true) ? 'Physical' : 'Special'; - } else { - move.category = 'Physical'; - } - }, + 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] Partners in Crime", - desc: `Doubles-based metagame where both active ally Pokémon share abilities and moves.`, + 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.`, threads: [ - `• Partners in Crime`, + `• Godly Gift`, + `• Godly Gift Resources`, ], - mod: 'partnersincrime', - gameType: 'doubles', - ruleset: ['Standard Doubles'], + mod: 'gen9', + ruleset: ['Standard OMs', 'Sleep Moves Clause', 'Godly Gift Mod'], 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', - 'Bright Powder', 'King\'s Rock', 'Razor Fang', 'Ally Switch', 'Dragon Cheer', 'Last Respects', 'Revival Blessing', 'Swagger', + 'Blissey', 'Calyrex-Shadow', 'Chansey', 'Deoxys-Attack', 'Koraidon', 'Miraidon', 'Arena Trap', '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: [ + 'Annihilape', 'Arceus', 'Calyrex-Ice', 'Chi-Yu', 'Crawdaunt', 'Deoxys-Base', 'Deoxys-Speed', 'Dialga', 'Dialga-Origin', 'Dragapult', 'Espathra', 'Eternatus', + 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Gliscor', 'Groudon', 'Hawlucha', 'Ho-Oh', 'Iron Bundle', 'Kingambit', 'Kyogre', 'Kyurem', 'Kyurem-Black', + 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Ogerpon-Hearthflame', 'Palafin', 'Palkia', 'Palkia-Origin', + 'Rayquaza', 'Regieleki', 'Reshiram', 'Shaymin-Sky', 'Smeargle', 'Solgaleo', 'Terapagos', 'Toxapex', 'Ursaluna', 'Ursaluna-Bloodmoon', 'Volcarona', 'Zacian', + 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', ], - onBegin() { - for (const pokemon of this.getAllPokemon()) { - pokemon.m.trackPP = 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' as ID)) { - ngas = true; - break; - } - } - const BAD_ABILITIES = ['trace', 'imposter', 'neutralizinggas', 'illusion', 'wanderingspirit']; - const ally = pokemon.side.active.find(mon => mon && mon !== pokemon && !mon.fainted); - if (ally && ally.ability !== pokemon.ability) { - if (!pokemon.m.innate && !BAD_ABILITIES.includes(this.toID(ally.ability))) { - pokemon.m.innate = 'ability:' + ally.ability; - if (!ngas || ally.getAbility().flags['cantsuppress'] || pokemon.hasItem('Ability Shield')) { - pokemon.volatiles[pokemon.m.innate] = {id: pokemon.m.innate, target: pokemon}; - pokemon.m.startVolatile = true; - } - } - 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] = {id: ally.m.innate, target: ally}; - ally.m.startVolatile = true; - } - } - } - }, - // Starting innate abilities in scripts#actions - 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 && 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 && ally.m.innate) { - ally.removeVolatile(ally.m.innate); - delete ally.m.innate; - } - }, }, // Other Metagames @@ -914,28 +723,6 @@ export const Formats: FormatList = [ '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.`, - threads: [ - `• Godly Gift`, - `• Godly Gift Resources`, - ], - - mod: 'gen9', - ruleset: ['Standard OMs', 'Sleep Moves Clause', 'Godly Gift Mod'], - banlist: [ - 'Blissey', 'Calyrex-Shadow', 'Chansey', 'Deoxys-Attack', 'Koraidon', 'Miraidon', 'Arena Trap', '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: [ - 'Annihilape', 'Arceus', 'Calyrex-Ice', 'Chi-Yu', 'Crawdaunt', 'Deoxys-Base', 'Deoxys-Speed', 'Dialga', 'Dialga-Origin', 'Dragapult', 'Espathra', 'Eternatus', - 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Gliscor', 'Groudon', 'Hawlucha', 'Ho-Oh', 'Iron Bundle', 'Kingambit', 'Kyogre', 'Kyurem', 'Kyurem-Black', - 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Ogerpon-Hearthflame', 'Palafin', 'Palkia', 'Palkia-Origin', - 'Rayquaza', 'Regieleki', 'Reshiram', 'Shaymin-Sky', 'Smeargle', 'Solgaleo', 'Terapagos', 'Toxapex', 'Ursaluna', 'Ursaluna-Bloodmoon', 'Volcarona', 'Zacian', - 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', - ], - }, { name: "[Gen 9] Inheritance", desc: `Pokémon may use the ability and moves of another, as long as they forfeit their own learnset.`, @@ -1203,6 +990,80 @@ export const Formats: FormatList = [ } }, }, + { + name: "[Gen 9] Partners in Crime", + desc: `Doubles-based metagame where both active ally Pokémon share abilities and moves.`, + threads: [ + `• Partners in Crime`, + ], + + mod: 'partnersincrime', + gameType: 'doubles', + ruleset: ['Standard Doubles'], + 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', + 'Bright Powder', 'King\'s Rock', 'Razor Fang', 'Ally Switch', 'Dragon Cheer', 'Last Respects', 'Revival Blessing', 'Swagger', + ], + onBegin() { + for (const pokemon of this.getAllPokemon()) { + pokemon.m.trackPP = new Map(); + } + }, + onBeforeSwitchIn(pokemon) { + pokemon.m.curMoves = this.dex.deepClone(pokemon.moves); + let ngas = false; + for (const poke of this.getAllActive()) { + if (this.toID(poke.ability) === ('neutralizinggas' as ID)) { + ngas = true; + break; + } + } + const BAD_ABILITIES = ['trace', 'imposter', 'neutralizinggas', 'illusion', 'wanderingspirit']; + const ally = pokemon.side.active.find(mon => mon && mon !== pokemon && !mon.fainted); + if (ally && ally.ability !== pokemon.ability) { + if (!pokemon.m.innate && !BAD_ABILITIES.includes(this.toID(ally.ability))) { + pokemon.m.innate = 'ability:' + ally.ability; + if (!ngas || ally.getAbility().flags['cantsuppress'] || pokemon.hasItem('Ability Shield')) { + pokemon.volatiles[pokemon.m.innate] = {id: pokemon.m.innate, target: pokemon}; + pokemon.m.startVolatile = true; + } + } + 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] = {id: ally.m.innate, target: ally}; + ally.m.startVolatile = true; + } + } + } + }, + // Starting innate abilities in scripts#actions + 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 && 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 && ally.m.innate) { + ally.removeVolatile(ally.m.innate); + delete ally.m.innate; + } + }, + }, { name: "[Gen 9] Shared Power", desc: `Once a Pokémon switches in, its ability is shared with the rest of the team.`, @@ -1319,57 +1180,175 @@ export const Formats: FormatList = [ `• Camomons`, ], - 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-Base', 'Deoxys-Attack', 'Deoxys-Speed', 'Dialga', - 'Dialga-Origin', 'Dragonite', 'Drednaw', 'Enamorus-Base', 'Espathra', 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', - 'Iron Bundle', 'Kommo-o', 'Koraidon', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', '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] Convergence", - desc: `Allows all Pokémon that have identical types to share moves and abilities.`, - threads: [ - `• Convergence`, - ], + 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-Base', 'Deoxys-Attack', 'Deoxys-Speed', 'Dialga', + 'Dialga-Origin', 'Dragonite', 'Drednaw', 'Enamorus-Base', 'Espathra', 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', + 'Iron Bundle', 'Kommo-o', 'Koraidon', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', '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] Convergence", + desc: `Allows all Pokémon that have identical types to share moves and abilities.`, + threads: [ + `• Convergence`, + ], + + 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-Base', '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-Base', 'Lilligant-Hisui', 'Lugia', 'Lunala', 'Magearna', 'Manaphy', 'Mewtwo', 'Miraidon', + 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Ogerpon-Hearthflame', 'Palafin', 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Regieleki', 'Regigigas', + 'Reshiram', 'Shaymin-Sky', 'Solgaleo', 'Slaking', 'Smeargle', 'Spectrier', 'Urshifu-Base', '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', 'Heat Rock', 'King\'s Rock', 'Light Clay', 'Razor Fang', 'Baton Pass', '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.`, + threads: [ + `• Cross Evolution`, + ], + + mod: 'gen9', + searchShow: false, + ruleset: ['Standard OMs', 'Sleep Moves Clause', 'Terastal Clause'], + banlist: [ + 'Basculin-White-Striped', 'Duraludon', 'Kyogre', 'Miraidon', 'Scyther', 'Sneasel', 'Sneasel-Hisui', 'Ursaring', 'Arena Trap', + 'Huge Power', 'Pure Power', 'Shadow Tag', 'Moody', 'King\'s Rock', 'Razor Fang', 'Baton Pass', 'Shed Tail', + ], + restricted: ['Espathra', 'Frosmoth', 'Gallade', 'Lilligant-Hisui', 'Lunala', 'Solgaleo'], + onValidateTeam(team) { + const nums = new Set(); + for (const set of team) { + const name = set.name; + const species = this.dex.species.get(name); + if (nums.has(species.num)) { + return [ + `Your Pok\u00e9mon must have different nicknames.`, + `(You have more than one Pok\u00e9mon named after a form of '${species.name}')`, + ]; + } + if (species.exists && species.name !== set.species) nums.add(species.num); + } + if (!nums.size) { + return [ + `${this.format.name} works using nicknames; your team has 0 nicknamed Pok\u00e9mon.`, + `(If this was intentional, add a nickname to one Pok\u00e9mon that isn't the name of a Pok\u00e9mon species.)`, + ]; + } + }, + checkCanLearn(move, species, lsetData, set) { + // @ts-ignore + if (!set.sp?.exists || !set.crossSpecies?.exists) { + return this.checkCanLearn(move, species, lsetData, set); + } + // @ts-ignore + const problem = this.checkCanLearn(move, set.sp); + if (!problem) return null; + // @ts-ignore + 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; + } + + // @ts-ignore + set.sp = species; + // @ts-ignore + 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; // chat + if (effect && ['imposter', 'transform'].includes(effect.id)) return; + if (target.set.name === target.set.species) return; + const crossSpecies = this.dex.species.get(target.set.name); + if (!crossSpecies.exists) return; + if (species.battleOnly || !species.nfe) return; + const crossIsUnreleased = (crossSpecies.tier === "Unreleased" && crossSpecies.isNonstandard === "Unobtainable" && + !this.ruleTable.has('+unobtainable')); + if (crossSpecies.battleOnly || crossIsUnreleased || !crossSpecies.prevo) return; + const crossPrevoSpecies = this.dex.species.get(crossSpecies.prevo); + if (!crossPrevoSpecies.prevo !== !species.prevo) return; - 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-Base', '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-Base', 'Lilligant-Hisui', 'Lugia', 'Lunala', 'Magearna', 'Manaphy', 'Mewtwo', 'Miraidon', - 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Ogerpon-Hearthflame', 'Palafin', 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Regieleki', 'Regigigas', - 'Reshiram', 'Shaymin-Sky', 'Solgaleo', 'Slaking', 'Smeargle', 'Spectrier', 'Urshifu-Base', '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', 'Heat Rock', 'King\'s Rock', 'Light Clay', 'Razor Fang', 'Baton Pass', 'Extreme Speed', 'Last Respects', 'Population Bomb', - 'Quiver Dance', 'Rage Fist', 'Shed Tail', 'Shell Smash', 'Spore', 'Transform', - ], - }, - { - 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.`, - threads: [ - `• Fervent Impersonation`, - ], + const mixedSpecies = this.dex.deepClone(species); + mixedSpecies.weightkg = + Math.max(0.1, +(species.weightkg + crossSpecies.weightkg - crossPrevoSpecies.weightkg)).toFixed(1); + mixedSpecies.nfe = false; + mixedSpecies.evos = []; + mixedSpecies.eggGroups = crossSpecies.eggGroups; + mixedSpecies.abilities = crossSpecies.abilities; + mixedSpecies.bst = 0; + let i: StatID; + for (i in species.baseStats) { + const statChange = crossSpecies.baseStats[i] - crossPrevoSpecies.baseStats[i]; + mixedSpecies.baseStats[i] = this.clampIntRange(species.baseStats[i] + statChange, 1, 255); + mixedSpecies.bst += mixedSpecies.baseStats[i]; + } + if (crossSpecies.types[0] !== crossPrevoSpecies.types[0]) mixedSpecies.types[0] = crossSpecies.types[0]; + if (crossSpecies.types[1] !== crossPrevoSpecies.types[1]) { + mixedSpecies.types[1] = crossSpecies.types[1] || crossSpecies.types[0]; + } + if (mixedSpecies.types[0] === mixedSpecies.types[1]) mixedSpecies.types = [mixedSpecies.types[0]]; - 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-Base', '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-Base', '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 + return mixedSpecies; + }, + onBegin() { + for (const pokemon of this.getAllPokemon()) { + pokemon.baseSpecies = pokemon.species; + } + }, }, { name: "[Gen 9] Foresighters", @@ -2225,6 +2204,38 @@ export const Formats: FormatList = [ return problems.length ? problems : null; }, }, + { + 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.`, + threads: [ + `Physical types: `, + `Special types: `, + `Dependent on the user's higher attacking stat:
Type Split`, + ], + + mod: 'gen9', + searchShow: false, + ruleset: ['Standard OMs', 'Sleep Moves Clause', 'Evasion Abilities Clause'], + banlist: [ + 'Annihilape', 'Arceus', 'Archaludon', 'Calyrex-Shadow', 'Chi-Yu', 'Darkrai', 'Deoxys-Base', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', 'Espathra', + 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Iron Bundle', 'Koraidon', 'Kyogre', 'Kyurem-White', 'Landorus-Base', + 'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Regieleki', + 'Reshiram', 'Shaymin-Sky', 'Sneasler', 'Solgaleo', 'Terapagos', 'Volcarona', 'Zacian-Crowned', 'Zamazenta-Crowned', 'Arena Trap', 'Moody', 'Shadow Tag', + 'Bright Powder', 'Damp Rock', 'King\'s Rock', 'Razor Fang', 'Baton Pass', 'Last Respects', 'Shed Tail', + ], + onModifyMovePriority: -1000, + onModifyMove(move, pokemon, target) { + if (move.category === 'Status') return; + const specialTypes = ['Dark', 'Dragon', 'Electric', 'Fairy', 'Fire', 'Grass', 'Ice', 'Psychic', 'Water']; + if (specialTypes.includes(move.type)) { + move.category = 'Special'; + } else if (move.type === 'Stellar') { + move.category = pokemon.getStat('atk', false, true) > pokemon.getStat('spa', false, true) ? 'Physical' : 'Special'; + } else { + move.category = 'Physical'; + } + }, + }, { name: "[Gen 6] Pure Hackmons", desc: `Anything that can be hacked in-game and is usable in local battles is allowed.`, @@ -2258,6 +2269,25 @@ export const Formats: FormatList = [ 'Quick Claw', 'Razor Fang', 'Assist', 'Baton Pass', 'Last Respects', 'Shed Tail', ], }, + { + name: "[Gen 8] National Dex", + threads: [ + `• SS National Dex Metagame Discussion`, + `• SS National Dex Sample Teams`, + `• SS National Dex Viability Rankings`, + ], + + 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 Ubers", threads: [ @@ -2294,6 +2324,21 @@ export const Formats: FormatList = [ ruleset: ['[Gen 9] National Dex UU'], banlist: ['ND UU', 'ND RUBL', 'Slowbro-Base + Slowbronite', 'Heat Rock'], }, + { + name: "[Gen 9] National Dex LC", + threads: [ + `• National Dex Little Cup`, + ], + + mod: 'gen9', + ruleset: ['Standard NatDex', 'Little Cup', 'Species Clause', 'OHKO Clause', 'Evasion Clause', 'Sleep Clause Mod', 'Max Level = 5'], + 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", threads: [ @@ -2340,6 +2385,7 @@ export const Formats: FormatList = [ ], mod: 'gen9', + searchShow: false, ruleset: ['[Gen 9] National Dex Ubers'], banlist: [ 'Arceus-Base', 'Arceus-Dark', 'Arceus-Ground', 'Calyrex-Ice', 'Deoxys-Attack', 'Deoxys-Speed', 'Ditto', 'Eternatus', 'Giratina-Origin', 'Glimmora', @@ -2394,18 +2440,6 @@ export const Formats: FormatList = [ } }, }, - { - name: "[Gen 8] National Dex", - threads: [ - `• SS National Dex Metagame Discussion`, - `• SS National Dex Sample Teams`, - `• SS National Dex Viability Rankings`, - ], - - 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'], - }, { name: "[Gen 8] National Dex UU", threads: [ @@ -3084,41 +3118,44 @@ export const Formats: FormatList = [ column: 4, }, { - name: "[Gen 6] UU", + name: "[Gen 7] UU", threads: [ - `• ORAS UU Banlist`, - `• ORAS UU Viability Rankings`, + `• USM UU Sample Teams`, + `• USM UU Viability Rankings`, ], - mod: 'gen6', + mod: 'gen7', // searchShow: false, - ruleset: ['[Gen 6] OU'], - banlist: ['OU', 'UUBL', 'Drizzle', 'Drought'], + ruleset: ['[Gen 7] OU'], + banlist: ['OU', 'UUBL', 'Drizzle', 'Drought', 'Kommonium Z', 'Mewnium Z'], }, { - name: "[Gen 3] UUBL", + name: "[Gen 4] LC", threads: [ - `• ADV UUBL Metagame Discussion`, + `• DPP LC Guide`, + `• DPP LC Viability Rankings`, ], - mod: 'gen3', - ruleset: ['Standard', 'One Boost Passer Clause'], + mod: 'gen4', + // searchShow: false, + ruleset: ['Standard', 'Little Cup', 'Sleep Moves Clause'], banlist: [ - 'Uber', 'OU', 'Smeargle + Baton Pass', 'Smeargle + Ingrain', 'Soundproof', 'Assist', - 'Baton Pass + Block', 'Baton Pass + Mean Look', 'Baton Pass + Spider Web', 'Swagger', + 'Meditite', 'Misdreavus', 'Murkrow', 'Scyther', 'Sneasel', 'Tangela', 'Yanma', + 'Berry Juice', 'Deep Sea Tooth', 'Dragon Rage', 'Sonic Boom', 'Swagger', ], }, { - name: "[Gen 7] RU", + name: "[Gen 8] NU", threads: [ - `• USM RU Resources`, + `• NU Metagame Discussion`, + `• NU Sample Teams`, + `• NU Viability Rankings`, ], - mod: 'gen7', + mod: 'gen8', // searchShow: false, - ruleset: ['[Gen 7] UU'], - banlist: ['UU', 'RUBL', 'Mimikyu', 'Aurora Veil'], - unbanlist: ['Drought'], + ruleset: ['[Gen 8] RU'], + banlist: ['RU', 'NUBL', 'Drizzle', 'Drought', 'Slush Rush'], }, // Past Gens OU @@ -3352,19 +3389,6 @@ export const Formats: FormatList = [ ruleset: ['[Gen 8] UU'], banlist: ['UU', 'RUBL'], }, - { - name: "[Gen 8] NU", - threads: [ - `• NU Metagame Discussion`, - `• NU Sample Teams`, - `• NU Viability Rankings`, - ], - - mod: 'gen8', - searchShow: false, - ruleset: ['[Gen 8] RU'], - banlist: ['RU', 'NUBL', 'Drizzle', 'Drought', 'Slush Rush'], - }, { name: "[Gen 8] PU", threads: [ @@ -3625,16 +3649,16 @@ export const Formats: FormatList = [ banlist: ['Baton Pass'], }, { - name: "[Gen 7] UU", + name: "[Gen 7] RU", threads: [ - `• USM UU Sample Teams`, - `• USM UU Viability Rankings`, + `• USM RU Resources`, ], mod: 'gen7', searchShow: false, - ruleset: ['[Gen 7] OU'], - banlist: ['OU', 'UUBL', 'Drizzle', 'Drought', 'Kommonium Z', 'Mewnium Z'], + ruleset: ['[Gen 7] UU'], + banlist: ['UU', 'RUBL', 'Mimikyu', 'Aurora Veil'], + unbanlist: ['Drought'], }, { name: "[Gen 7] NU", @@ -3926,6 +3950,18 @@ export const Formats: FormatList = [ searchShow: false, ruleset: ['Standard', 'Swagger Clause', 'Mega Rayquaza Clause'], }, + { + name: "[Gen 6] UU", + threads: [ + `• ORAS UU Banlist`, + `• ORAS UU Viability Rankings`, + ], + + mod: 'gen6', + searchShow: false, + ruleset: ['[Gen 6] OU'], + banlist: ['OU', 'UUBL', 'Drizzle', 'Drought'], + }, { name: "[Gen 6] RU", threads: [ @@ -4458,21 +4494,6 @@ export const Formats: FormatList = [ 'Vileplume', ], }, - { - name: "[Gen 4] LC", - threads: [ - `• DPP LC Guide`, - `• DPP LC Viability Rankings`, - ], - - mod: 'gen4', - searchShow: false, - ruleset: ['Standard', 'Little Cup', 'Sleep Moves Clause'], - banlist: [ - 'Meditite', 'Misdreavus', 'Murkrow', 'Scyther', 'Sneasel', 'Tangela', 'Yanma', - 'Berry Juice', 'Deep Sea Tooth', 'Dragon Rage', 'Sonic Boom', 'Swagger', - ], - }, { name: "[Gen 4] Anything Goes", diff --git a/data/formats-data.ts b/data/formats-data.ts index f76263eb8315..fb36708c2de9 100644 --- a/data/formats-data.ts +++ b/data/formats-data.ts @@ -320,6 +320,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { }, vulpix: { tier: "NFE", + natDexTier: "LC", }, vulpixalola: { tier: "NFE", @@ -862,7 +863,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { tangela: { isNonstandard: "Past", tier: "Illegal", - natDexTier: "LC", + natDexTier: "NFE", }, tangrowth: { isNonstandard: "Past", @@ -1561,7 +1562,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { corsolagalar: { isNonstandard: "Past", tier: "Illegal", - natDexTier: "LC", + natDexTier: "NFE", }, cursola: { isNonstandard: "Past", @@ -1744,7 +1745,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { zigzagoon: { isNonstandard: "Past", tier: "Illegal", - natDexTier: "LC", + natDexTier: "NFE", }, zigzagoongalar: { isNonstandard: "Past", @@ -2315,7 +2316,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { clamperl: { isNonstandard: "Past", tier: "Illegal", - natDexTier: "LC", + natDexTier: "NFE", }, huntail: { isNonstandard: "Past", @@ -2617,6 +2618,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { }, drifloon: { tier: "LC", + natDexTier: "NFE", }, drifblim: { tier: "ZU", @@ -3034,7 +3036,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { woobat: { isNonstandard: "Past", tier: "Illegal", - natDexTier: "LC", + natDexTier: "NFE", }, swoobat: { isNonstandard: "Past", @@ -3845,7 +3847,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { swirlix: { isNonstandard: "Past", tier: "Illegal", - natDexTier: "LC", + natDexTier: "NFE", }, slurpuff: { isNonstandard: "Past", From f483e996153976b8fa102653ebf46ce3c641542d Mon Sep 17 00:00:00 2001 From: adrivrie Date: Sat, 1 Jun 2024 18:31:23 +0200 Subject: [PATCH 004/139] Add Baby Random Battle (#10319) * initial commit for babyrands * add to format list, wherever for now * small fixes * first hopefully complete version of sets * life orb fix * many many more fixes * first version that seems fairly bug-free * set updates * lots and lots more changes * small set changes and ev/iv optimization for life orb recoil * cosmetic forme list changed to babyrands version * move files * rename files * some formatting and commenting and such * minor set changes * attempt at renaming? * rename format mod * this works, but is not pretty * finally works now; also moved to spotlight formats * /randbats support * /rwr support * reduce line length * add test * change setup incompatibility * Apply suggestions from code review * camelCased --------- Co-authored-by: Kris Johnson <11083252+KrisXV@users.noreply.github.com> --- config/formats.ts | 7 + data/random-battles/gen9baby/sets.json | 2982 +++++++++++++++++ data/random-battles/gen9baby/teams.ts | 861 +++++ server/chat-plugins/randombattles/index.ts | 11 +- server/chat-plugins/randombattles/winrates.ts | 15 +- sim/teams.ts | 2 + test/random-battles/gen9.js | 54 + 7 files changed, 3928 insertions(+), 4 deletions(-) create mode 100644 data/random-battles/gen9baby/sets.json create mode 100644 data/random-battles/gen9baby/teams.ts diff --git a/config/formats.ts b/config/formats.ts index 4c77a4aa2fa7..ecd0d8f087c5 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -2490,6 +2490,13 @@ export const Formats: FormatList = [ this.add(`raw|
Chimera Rands is a 1v1 format where you combine your 6 Pokemon into one "Chimera." The order you select during team preview is important! In sequence, your picks determine your Chimera's Type, Item, Ability, Stats, Moves 1 & 2, then finally Moves 3 & 4.
`); }, }, + { + name: "[Gen 9] Baby Random Battle", + + mod: 'gen9', + team: 'randomBaby', + ruleset: ['Obtainable', 'Species Clause', 'HP Percentage Mod', 'Cancel Mod', 'Sleep Clause Mod', 'Illusion Level Mod'], + }, { name: "[Gen 9] Random Roulette", desc: `Random Battles in a random generation! [Gen 1] Random Battle - [Gen 9] Random Battle.`, diff --git a/data/random-battles/gen9baby/sets.json b/data/random-battles/gen9baby/sets.json new file mode 100644 index 000000000000..6300130d066a --- /dev/null +++ b/data/random-battles/gen9baby/sets.json @@ -0,0 +1,2982 @@ +{ + "aipom": { + "level": 5, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["Brick Break", "Double-Edge", "Fake Out", "Fire Punch", "Gunk Shot", "Knock Off", "U-turn"], + "teraTypes": ["Dark", "Normal"] + } + ] + }, + "applin": { + "level": 9, + "sets": [ + { + "role": "Tera Blast user", + "movepool": ["Pounce", "Recycle", "Sucker Punch", "Tera Blast"], + "teraTypes": ["Dragon", "Grass"] + }, + { + "role": "Bulky Attacker", + "movepool": ["Defense Curl", "Pounce", "Recycle", "Rollout"], + "teraTypes": ["Rock"] + } + ] + }, + "arrokuda": { + "level": 8, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["Close Combat", "Crunch", "Flip Turn", "Psychic Fangs", "Waterfall"], + "teraTypes": ["Fighting"] + } + ] + }, + "axew": { + "level": 6, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Dragon Claw", "Dragon Dance", "Iron Head", "Outrage", "Stomping Tantrum"], + "teraTypes": ["Ground", "Steel"] + } + ] + }, + "azurill": { + "level": 7, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Aqua Jet", "Belly Drum", "Facade", "Substitute"], + "teraTypes": ["Water"] + } + ] + }, + "bagon": { + "level": 6, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Dragon Claw", "Dragon Dance", "Fire Fang", "Iron Head", "Outrage"], + "teraTypes": ["Fire", "Steel"] + } + ] + }, + "barboach": { + "level": 7, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Dragon Dance", "Earthquake", "Stone Edge", "Waterfall"], + "teraTypes": ["Ground", "Steel"] + } + ] + }, + "basculinwhitestriped": { + "level": 5, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Flip Turn", "Hydro Pump", "Ice Beam", "Wave Crash"], + "teraTypes": ["Water"] + }, + { + "role": "Wallbreaker", + "movepool": ["Aqua Jet", "Flip Turn", "Ice Beam", "Wave Crash"], + "teraTypes": ["Water"] + } + ] + }, + "bellsprout": { + "level": 7, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Poison Jab", "Power Whip", "Sucker Punch", "Swords Dance"], + "teraTypes": ["Dark", "Grass"] + }, + { + "role": "Bulky Attacker", + "movepool": ["Knock Off", "Power Whip", "Sleep Powder", "Sludge Bomb", "Strength Sap", "Sucker Punch"], + "teraTypes": ["Dark", "Steel"] + }, + { + "role": "Setup Sweeper", + "movepool": ["Sludge Bomb", "Solar Beam", "Sunny Day", "Weather Ball"], + "teraTypes": ["Fire"] + } + ] + }, + "bergmite": { + "level": 8, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Curse", "Icicle Spear", "Rapid Spin", "Recover", "Stone Edge"], + "teraTypes": ["Steel", "Water"] + } + ] + }, + "blitzle": { + "level": 7, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["Body Slam", "Double-Edge", "Flame Charge", "Supercell Slam", "Thunder Wave", "Trailblaze", "Volt Switch"], + "teraTypes": ["Electric", "Fire", "Grass", "Normal"] + } + ] + }, + "bonsly": { + "level": 7, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Earthquake", "Rock Blast", "Spikes", "Stealth Rock", "Stone Edge", "Sucker Punch"], + "teraTypes": ["Dragon", "Fairy"] + } + ] + }, + "bounsweet": { + "level": 9, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Dazzling Gleam", "Giga Drain", "Rapid Spin", "Synthesis", "Zen Headbutt"], + "teraTypes": ["Steel", "Water"] + } + ] + }, + "bramblin": { + "level": 6, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Poltergeist", "Power Whip", "Rapid Spin", "Spikes", "Strength Sap"], + "teraTypes": ["Fairy", "Steel", "Water"] + } + ] + }, + "bronzor": { + "level": 7, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Earthquake", "Flash Cannon", "Hypnosis", "Psychic", "Stealth Rock"], + "teraTypes": ["Electric", "Water"] + }, + { + "role": "Bulky Setup", + "movepool": ["Calm Mind", "Flash Cannon", "Psychic", "Shadow Ball"], + "teraTypes": ["Electric", "Water"] + } + ] + }, + "buizel": { + "level": 6, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["Crunch", "Flip Turn", "Ice Spinner", "Wave Crash"], + "teraTypes": ["Ice", "Water"] + }, + { + "role": "Bulky Setup", + "movepool": ["Bulk Up", "Crunch", "Ice Spinner", "Wave Crash"], + "teraTypes": ["Ice", "Water"] + } + ] + }, + "bulbasaur": { + "level": 6, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Giga Drain", "Knock Off", "Power Whip", "Sleep Powder", "Sludge Bomb", "Synthesis"], + "teraTypes": ["Dark", "Water"] + }, + { + "role": "Setup Sweeper", + "movepool": ["Power Whip", "Sludge Bomb", "Sunny Day", "Weather Ball"], + "teraTypes": ["Fire"] + } + ] + }, + "cacnea": { + "level": 6, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Drain Punch", "Giga Drain", "Leaf Storm", "Poison Jab", "Spikes", "Sucker Punch", "Toxic Spikes"], + "teraTypes": ["Poison", "Steel"] + }, + { + "role": "Bulky Setup", + "movepool": ["Bullet Seed", "Drain Punch", "Sucker Punch", "Swords Dance", "Thunder Punch"], + "teraTypes": ["Dark", "Electric", "Fighting", "Grass"] + } + ] + }, + "capsakid": { + "level": 7, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["Crunch", "Giga Drain", "Growth", "Leaf Storm", "Stomping Tantrum"], + "teraTypes": ["Dark", "Ground"] + } + ] + }, + "cetoddle": { + "level": 7, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["Earthquake", "Ice Shard", "Icicle Crash", "Knock Off", "Liquidation", "Play Rough", "Yawn"], + "teraTypes": ["Fairy", "Water"] + }, + { + "role": "Bulky Setup", + "movepool": ["Belly Drum", "Earthquake", "Ice Shard", "Icicle Spear"], + "teraTypes": ["Ground", "Ice"] + } + ] + }, + "charcadet": { + "level": 8, + "sets": [ + { + "role": "Fast Support", + "movepool": ["Clear Smog", "Flame Charge", "Lava Plume", "Will-O-Wisp"], + "teraTypes": ["Dragon", "Fire"] + } + ] + }, + "charmander": { + "level": 7, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["Flamethrower", "Focus Blast", "Sunny Day", "Weather Ball"], + "teraTypes": ["Fire"] + }, + { + "role": "Setup Sweeper", + "movepool": ["Brick Break", "Dragon Dance", "Flare Blitz", "Outrage", "Thunder Punch"], + "teraTypes": ["Dragon", "Electric", "Fighting"] + } + ] + }, + "chespin": { + "level": 7, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Drain Punch", "Rock Slide", "Spikes", "Synthesis", "Wood Hammer"], + "teraTypes": ["Poison", "Steel"] + } + ] + }, + "chewtle": { + "level": 7, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Crunch", "Ice Fang", "Liquidation", "Shell Smash"], + "teraTypes": ["Dark", "Ice", "Steel"] + } + ] + }, + "chikorita": { + "level": 7, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Body Slam", "Bullet Seed", "Double-Edge", "Swords Dance", "Synthesis"], + "teraTypes": ["Grass", "Normal", "Steel"] + } + ] + }, + "chimchar": { + "level": 7, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Bulk Up", "Flare Blitz", "Knock Off", "Slack Off"], + "teraTypes": ["Dark", "Dragon"] + }, + { + "role": "Fast Attacker", + "movepool": ["Flare Blitz", "Gunk Shot", "Knock Off", "Swords Dance", "Thunder Punch", "U-turn"], + "teraTypes": ["Dark", "Electric", "Fire", "Poison"] + }, + { + "role": "Bulky Attacker", + "movepool": ["Encore", "Flamethrower", "Knock Off", "Slack Off", "Stealth Rock", "U-turn", "Will-O-Wisp"], + "teraTypes": ["Dragon", "Fairy"] + } + ] + }, + "chinchou": { + "level": 7, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Discharge", "Ice Beam", "Scald", "Thunder Wave", "Volt Switch"], + "teraTypes": ["Flying", "Water"] + }, + { + "role": "Fast Support", + "movepool": ["Discharge", "Flip Turn", "Scald", "Volt Switch"], + "teraTypes": ["Flying"] + } + ] + }, + "chingling": { + "level": 7, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Knock Off", "Psychic", "Recover", "Thunder Wave"], + "teraTypes": ["Fairy", "Steel"] + }, + { + "role": "Bulky Setup", + "movepool": ["Calm Mind", "Dazzling Gleam", "Psychic", "Recover"], + "teraTypes": ["Fairy", "Steel"] + } + ] + }, + "clauncher": { + "level": 7, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Aura Sphere", "Dark Pulse", "Dragon Pulse", "Flip Turn", "Ice Beam", "Water Pulse"], + "teraTypes": ["Dark", "Dragon", "Fighting", "Water"] + }, + { + "role": "Bulky Attacker", + "movepool": ["Aura Sphere", "Dark Pulse", "Dragon Pulse", "Flip Turn", "Ice Beam", "Water Pulse"], + "teraTypes": ["Dark", "Dragon", "Fighting", "Water"] + } + ] + }, + "cleffa": { + "level": 9, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Calm Mind", "Draining Kiss", "Fire Blast", "Psyshock"], + "teraTypes": ["Fire"] + }, + { + "role": "Bulky Support", + "movepool": ["Alluring Voice", "Draining Kiss", "Encore", "Protect", "Thunder Wave", "Wish"], + "teraTypes": ["Poison", "Steel"] + } + ] + }, + "corphish": { + "level": 6, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Aqua Jet", "Brick Break", "Crabhammer", "Dragon Dance", "Knock Off", "X-Scissor"], + "teraTypes": ["Water"] + } + ] + }, + "cottonee": { + "level": 7, + "sets": [ + { + "role": "Fast Support", + "movepool": ["Dazzling Gleam", "Encore", "Giga Drain", "Stun Spore", "Taunt"], + "teraTypes": ["Poison", "Steel"] + } + ] + }, + "crabrawler": { + "level": 6, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Bulk Up", "Drain Punch", "Earthquake", "Gunk Shot", "Ice Punch", "Knock Off", "Thunder Punch"], + "teraTypes": ["Dark", "Ground", "Poison"] + } + ] + }, + "cranidos": { + "level": 6, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Earthquake", "Fire Punch", "Head Smash", "Rock Slide", "Zen Headbutt"], + "teraTypes": ["Psychic", "Rock"] + }, + { + "role": "Wallbreaker", + "movepool": ["Earthquake", "Fire Punch", "Rock Slide", "Swords Dance", "Zen Headbutt"], + "teraTypes": ["Ground", "Rock"] + } + ] + }, + "croagunk": { + "level": 7, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Bulk Up", "Drain Punch", "Earthquake", "Gunk Shot", "Knock Off", "Sucker Punch"], + "teraTypes": ["Dark", "Fighting", "Ground"] + }, + { + "role": "Fast Attacker", + "movepool": ["Close Combat", "Earthquake", "Gunk Shot", "Knock Off", "Swords Dance"], + "teraTypes": ["Dark"] + } + ] + }, + "cubchoo": { + "level": 7, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Blizzard", "Liquidation", "Play Rough", "Snowscape", "Surf"], + "teraTypes": ["Ice", "Water"] + } + ] + }, + "cufant": { + "level": 7, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Earthquake", "Iron Head", "Play Rough", "Rock Slide", "Stealth Rock", "Superpower"], + "teraTypes": ["Fairy"] + } + ] + }, + "cutiefly": { + "level": 5, + "sets": [ + { + "role": "Fast Support", + "movepool": ["Bug Buzz", "Moonblast", "Sticky Web", "Stun Spore", "U-turn"], + "teraTypes": ["Ghost"] + }, + { + "role": "Tera Blast user", + "movepool": ["Bug Buzz", "Moonblast", "Quiver Dance", "Tera Blast"], + "teraTypes": ["Ground"] + } + ] + }, + "cyndaquil": { + "level": 7, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Eruption", "Extrasensory", "Fire Blast", "Play Rough"], + "teraTypes": ["Fire"] + } + ] + }, + "deerling": { + "level": 6, + "sets": [ + { + "role": "Fast Support", + "movepool": ["Bullet Seed", "Headbutt", "Synthesis", "Thunder Wave"], + "teraTypes": ["Normal"] + } + ] + }, + "deino": { + "level": 7, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Belch", "Crunch", "Outrage", "Thunder Wave", "Work Up"], + "teraTypes": ["Poison"] + } + ] + }, + "dewpider": { + "level": 7, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Giga Drain", "Ice Beam", "Leech Life", "Liquidation", "Sticky Web", "Surf"], + "teraTypes": ["Water"] + } + ] + }, + "diglett": { + "level": 6, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["Earthquake", "Stealth Rock", "Stone Edge", "Sucker Punch", "Swords Dance", "Throat Chop"], + "teraTypes": ["Fairy", "Ground", "Rock"] + }, + { + "role": "Tera Blast user", + "movepool": ["Earthquake", "Stone Edge", "Tera Blast", "Throat Chop"], + "teraTypes": ["Fairy", "Grass"] + } + ] + }, + "diglettalola": { + "level": 6, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["Earthquake", "Iron Head", "Stealth Rock", "Stone Edge", "Swords Dance"], + "teraTypes": ["Ground", "Rock", "Steel"] + } + ] + }, + "doduo": { + "level": 6, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Body Slam", "Brave Bird", "Double-Edge", "Knock Off", "Swords Dance"], + "teraTypes": ["Dark", "Flying", "Normal"] + } + ] + }, + "dratini": { + "level": 7, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Dragon Dance", "Extreme Speed", "Iron Head", "Outrage", "Rest"], + "teraTypes": ["Steel"] + } + ] + }, + "drifloon": { + "level": 7, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Defog", "Knock Off", "Pain Split", "Shadow Ball", "Thunder Wave", "Will-O-Wisp"], + "teraTypes": ["Fairy"] + }, + { + "role": "Fast Support", + "movepool": ["Acrobatics", "Defog", "Knock Off", "Pain Split", "Shadow Ball", "Thunder Wave", "Will-O-Wisp"], + "teraTypes": ["Fairy", "Flying"] + } + ] + }, + "drilbur": { + "level": 6, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Earthquake", "Poison Jab", "Rapid Spin", "Rock Slide", "Swords Dance"], + "teraTypes": ["Ground", "Poison", "Rock"] + } + ] + }, + "drowzee": { + "level": 7, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Drain Punch", "Encore", "Knock Off", "Psychic", "Thunder Wave"], + "teraTypes": ["Dark", "Fighting"] + }, + { + "role": "Bulky Setup", + "movepool": ["Calm Mind", "Draining Kiss", "Encore", "Knock Off", "Psychic", "Thunder Wave"], + "teraTypes": ["Fairy"] + } + ] + }, + "ducklett": { + "level": 7, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Aqua Jet", "Brave Bird", "Defog", "Roost", "Surf"], + "teraTypes": ["Ground"] + } + ] + }, + "dunsparce": { + "level": 5, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Body Slam", "Coil", "Earthquake", "Roost"], + "teraTypes": ["Ground", "Poison"] + }, + { + "role": "Bulky Support", + "movepool": ["Earthquake", "Glare", "Headbutt", "Roost"], + "teraTypes": ["Ghost", "Ground"] + }, + { + "role": "Bulky Setup", + "movepool": ["Calm Mind", "Earth Power", "Hyper Voice", "Roost", "Shadow Ball"], + "teraTypes": ["Fairy", "Ghost"] + } + ] + }, + "duraludon": { + "level": 5, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Body Press", "Draco Meteor", "Dragon Pulse", "Flash Cannon", "Iron Defense"], + "teraTypes": ["Fairy", "Fighting"] + }, + { + "role": "Wallbreaker", + "movepool": ["Body Press", "Draco Meteor", "Flash Cannon", "Focus Energy", "Thunderbolt"], + "teraTypes": ["Electric", "Fighting"] + }, + { + "role": "Bulky Attacker", + "movepool": ["Body Press", "Draco Meteor", "Dragon Pulse", "Flash Cannon", "Stealth Rock", "Thunder Wave"], + "teraTypes": ["Fighting"] + } + ] + }, + "duskull": { + "level": 8, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Leech Life", "Pain Split", "Poltergeist", "Shadow Sneak", "Will-O-Wisp"], + "teraTypes": ["Fairy", "Steel", "Water"] + } + ] + }, + "eevee": { + "level": 7, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Body Slam", "Double-Edge", "Protect", "Shadow Ball", "Wish"], + "teraTypes": ["Ghost", "Normal"] + }, + { + "role": "Tera Blast user", + "movepool": ["Calm Mind", "Protect", "Tera Blast", "Wish"], + "teraTypes": ["Ghost"] + } + ] + }, + "ekans": { + "level": 6, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Earthquake", "Glare", "Gunk Shot", "Knock Off", "Toxic Spikes"], + "teraTypes": ["Dark", "Ground"] + }, + { + "role": "Bulky Setup", + "movepool": ["Coil", "Earthquake", "Gunk Shot", "Trailblaze"], + "teraTypes": ["Dark", "Ground"] + } + ] + }, + "elekid": { + "level": 6, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["Cross Chop", "Ice Punch", "Knock Off", "Psychic", "Supercell Slam", "Taunt", "Volt Switch"], + "teraTypes": ["Dark", "Electric", "Fighting", "Ice"] + } + ] + }, + "espurr": { + "level": 6, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Dark Pulse", "Nasty Plot", "Psychic", "Thunderbolt"], + "teraTypes": ["Dark", "Electric", "Psychic"] + }, + { + "role": "Fast Support", + "movepool": ["Dark Pulse", "Nasty Plot", "Psychic", "Thunder Wave", "Thunderbolt", "Trick"], + "teraTypes": ["Dark", "Electric", "Psychic"] + } + ] + }, + "exeggcute": { + "level": 7, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Giga Drain", "Moonlight", "Psychic", "Sleep Powder", "Stun Spore"], + "teraTypes": ["Dark", "Poison"] + } + ] + }, + "feebas": { + "level": 8, + "sets": [ + { + "role": "Fast Support", + "movepool": ["Double-Edge", "Haze", "Hypnosis", "Ice Beam", "Waterfall"], + "teraTypes": ["Ice", "Normal"] + } + ] + }, + "fennekin": { + "level": 6, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Calm Mind", "Encore", "Flamethrower", "Psychic", "Will-O-Wisp"], + "teraTypes": ["Dragon", "Fairy"] + } + ] + }, + "fidough": { + "level": 7, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Play Rough", "Protect", "Stomping Tantrum", "Wish"], + "teraTypes": ["Ground", "Steel"] + } + ] + }, + "finizen": { + "level": 7, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["Agility", "Boomburst", "Encore", "Ice Beam", "Surf"], + "teraTypes": ["Normal"] + } + ] + }, + "finneon": { + "level": 7, + "sets": [ + { + "role": "Fast Support", + "movepool": ["Alluring Voice", "Ice Beam", "Surf", "Thief", "U-turn"], + "teraTypes": ["Fairy", "Water"] + } + ] + }, + "flabebe": { + "level": 7, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Calm Mind", "Moonblast", "Psychic", "Synthesis"], + "teraTypes": ["Poison", "Steel"] + }, + { + "role": "Tera Blast user", + "movepool": ["Calm Mind", "Moonblast", "Synthesis", "Tera Blast"], + "teraTypes": ["Ground"] + } + ] + }, + "fletchling": { + "level": 6, + "sets": [ + { + "role": "Tera Blast user", + "movepool": ["Acrobatics", "Flare Blitz", "Swords Dance", "Tera Blast"], + "teraTypes": ["Ground"] + }, + { + "role": "Bulky Support", + "movepool": ["Air Slash", "Defog", "Double-Edge", "Heat Wave", "Roost", "Taunt", "U-turn"], + "teraTypes": ["Steel"] + } + ] + }, + "flittle": { + "level": 5, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Calm Mind", "Protect", "Stored Power", "Substitute"], + "teraTypes": ["Fairy"] + }, + { + "role": "Tera Blast user", + "movepool": ["Calm Mind", "Protect", "Stored Power", "Substitute", "Tera Blast"], + "teraTypes": ["Fairy", "Fighting"] + } + ] + }, + "fomantis": { + "level": 7, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Defog", "Leaf Storm", "Superpower", "Synthesis"], + "teraTypes": ["Fighting", "Steel"] + } + ] + }, + "foongus": { + "level": 7, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Foul Play", "Giga Drain", "Leaf Storm", "Sludge Bomb", "Spore", "Stun Spore"], + "teraTypes": ["Steel", "Water"] + }, + { + "role": "Bulky Attacker", + "movepool": ["Giga Drain", "Sludge Bomb", "Spore", "Synthesis"], + "teraTypes": ["Steel", "Water"] + } + ] + }, + "frigibax": { + "level": 6, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Crunch", "Icicle Spear", "Outrage", "Swords Dance"], + "teraTypes": ["Dragon", "Fairy", "Ice"] + } + ] + }, + "froakie": { + "level": 6, + "sets": [ + { + "role": "Fast Support", + "movepool": ["Ice Beam", "Spikes", "Surf", "Toxic Spikes", "U-turn"], + "teraTypes": ["Ice", "Water"] + } + ] + }, + "fuecoco": { + "level": 7, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Encore", "Flamethrower", "Roar", "Slack Off", "Stomping Tantrum", "Will-O-Wisp"], + "teraTypes": ["Dragon", "Fairy"] + } + ] + }, + "gastly": { + "level": 6, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Dazzling Gleam", "Nasty Plot", "Shadow Ball", "Sludge Bomb", "Trick"], + "teraTypes": ["Fairy", "Ghost", "Poison"] + }, + { + "role": "Wallbreaker", + "movepool": ["Dazzling Gleam", "Nasty Plot", "Shadow Ball", "Sludge Bomb", "Thunderbolt", "Will-O-Wisp"], + "teraTypes": ["Electric", "Fairy", "Ghost", "Poison"] + } + ] + }, + "geodude": { + "level": 7, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Earthquake", "Explosion", "Rock Blast", "Rock Polish", "Stealth Rock", "Stone Edge"], + "teraTypes": ["Grass"] + } + ] + }, + "geodudealola": { + "level": 7, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Double-Edge", "Earthquake", "Explosion", "Rock Blast", "Rock Polish", "Stealth Rock", "Stone Edge", "Thunder Wave", "Volt Switch"], + "teraTypes": ["Grass", "Ground"] + } + ] + }, + "gible": { + "level": 7, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Earthquake", "Iron Head", "Scale Shot", "Swords Dance"], + "teraTypes": ["Dragon", "Ground", "Steel"] + }, + { + "role": "Fast Attacker", + "movepool": ["Dragon Claw", "Earthquake", "Iron Head", "Outrage", "Stealth Rock", "Stone Edge"], + "teraTypes": ["Stellar"] + } + ] + }, + "gimmighoul": { + "level": 7, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Nasty Plot", "Power Gem", "Shadow Ball", "Substitute"], + "teraTypes": ["Fairy"] + }, + { + "role": "Tera Blast user", + "movepool": ["Nasty Plot", "Power Gem", "Shadow Ball", "Substitute", "Tera Blast"], + "teraTypes": ["Fairy", "Fighting"] + } + ] + }, + "gimmighoulroaming": { + "level": 6, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Nasty Plot", "Power Gem", "Shadow Ball", "Substitute"], + "teraTypes": ["Fairy", "Ghost"] + }, + { + "role": "Tera Blast user", + "movepool": ["Nasty Plot", "Shadow Ball", "Substitute", "Tera Blast"], + "teraTypes": ["Fairy", "Fighting"] + } + ] + }, + "girafarig": { + "level": 5, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Dazzling Gleam", "Nasty Plot", "Psychic", "Psyshock", "Shadow Ball", "Thunderbolt"], + "teraTypes": ["Electric", "Fairy", "Ghost"] + }, + { + "role": "Bulky Setup", + "movepool": ["Hyper Voice", "Nasty Plot", "Psychic", "Psyshock", "Thunderbolt"], + "teraTypes": ["Normal"] + } + ] + }, + "gligar": { + "level": 5, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Dual Wingbeat", "Earthquake", "Knock Off", "Swords Dance"], + "teraTypes": ["Steel", "Water"] + }, + { + "role": "Fast Support", + "movepool": ["Earthquake", "Knock Off", "Spikes", "Stealth Rock", "Toxic Spikes", "U-turn"], + "teraTypes": ["Steel", "Water"] + } + ] + }, + "glimmet": { + "level": 6, + "sets": [ + { + "role": "Fast Support", + "movepool": ["Dazzling Gleam", "Power Gem", "Sludge Wave", "Spikes", "Stealth Rock"], + "teraTypes": ["Grass"] + } + ] + }, + "golett": { + "level": 7, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Dynamic Punch", "Earthquake", "Poltergeist", "Stealth Rock", "Stone Edge"], + "teraTypes": ["Fighting"] + } + ] + }, + "goomy": { + "level": 7, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Dragon Pulse", "Rest", "Sleep Talk", "Sludge Bomb", "Thunderbolt"], + "teraTypes": ["Electric", "Poison", "Water"] + } + ] + }, + "gothita": { + "level": 7, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Dark Pulse", "Nasty Plot", "Psychic", "Thunderbolt", "Trick"], + "teraTypes": ["Dark", "Electric", "Fairy"] + } + ] + }, + "greavard": { + "level": 7, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Pain Split", "Play Rough", "Poltergeist", "Roar", "Shadow Sneak", "Yawn"], + "teraTypes": ["Fairy"] + } + ] + }, + "grimer": { + "level": 6, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Curse", "Drain Punch", "Gunk Shot", "Poison Jab", "Shadow Sneak"], + "teraTypes": ["Fighting"] + } + ] + }, + "grimeralola": { + "level": 6, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Curse", "Drain Punch", "Gunk Shot", "Knock Off", "Poison Jab"], + "teraTypes": ["Dark", "Fighting"] + } + ] + }, + "grookey": { + "level": 6, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Drain Punch", "Grassy Glide", "Knock Off", "Swords Dance", "Wood Hammer"], + "teraTypes": ["Dark", "Fighting", "Grass"] + }, + { + "role": "Wallbreaker", + "movepool": ["Drain Punch", "Grassy Glide", "Knock Off", "U-turn", "Wood Hammer"], + "teraTypes": ["Grass"] + } + ] + }, + "growlithe": { + "level": 7, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Close Combat", "Flare Blitz", "Morning Sun", "Roar", "Wild Charge", "Will-O-Wisp"], + "teraTypes": ["Dragon", "Fairy", "Fighting"] + } + ] + }, + "growlithehisui": { + "level": 6, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Close Combat", "Flare Blitz", "Head Smash", "Morning Sun", "Stealth Rock", "Wild Charge", "Will-O-Wisp"], + "teraTypes": ["Dragon", "Fairy"] + }, + { + "role": "Fast Attacker", + "movepool": ["Close Combat", "Flare Blitz", "Head Smash", "Wild Charge"], + "teraTypes": ["Fighting", "Fire", "Rock"] + } + ] + }, + "grubbin": { + "level": 7, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Lunge", "Sticky Web", "Thunder Wave", "Volt Switch", "Wild Charge"], + "teraTypes": ["Electric"] + } + ] + }, + "gulpin": { + "level": 8, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Encore", "Fire Punch", "Giga Drain", "Pain Split", "Sludge Bomb", "Thunder Wave", "Toxic", "Toxic Spikes"], + "teraTypes": ["Dark", "Grass"] + }, + { + "role": "Setup Sweeper", + "movepool": ["Bullet Seed", "Fire Punch", "Gunk Shot", "Swords Dance"], + "teraTypes": ["Fire", "Grass", "Poison"] + } + ] + }, + "happiny": { + "level": 9, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Hyper Voice", "Rest", "Shadow Ball", "Thunder Wave"], + "teraTypes": ["Ghost"] + }, + { + "role": "Bulky Support", + "movepool": ["Heal Bell", "Hyper Voice", "Rest", "Thunder Wave"], + "teraTypes": ["Ghost"] + } + ] + }, + "hatenna": { + "level": 7, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Dazzling Gleam", "Mystical Fire", "Nuzzle", "Psychic"], + "teraTypes": ["Electric", "Fairy"] + }, + { + "role": "Bulky Setup", + "movepool": ["Calm Mind", "Dazzling Gleam", "Draining Kiss", "Mystical Fire", "Psychic"], + "teraTypes": ["Fairy", "Steel"] + } + ] + }, + "hippopotas": { + "level": 7, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Earthquake", "Slack Off", "Stealth Rock", "Stone Edge", "Whirlwind", "Yawn"], + "teraTypes": ["Dragon", "Rock", "Steel"] + }, + { + "role": "Bulky Setup", + "movepool": ["Curse", "Earthquake", "Slack Off", "Stone Edge"], + "teraTypes": ["Dragon", "Rock", "Steel"] + } + ] + }, + "hoothoot": { + "level": 7, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Calm Mind", "Defog", "Hurricane", "Hyper Voice", "Nasty Plot", "Roost"], + "teraTypes": ["Fairy", "Steel"] + } + ] + }, + "hoppip": { + "level": 8, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Acrobatics", "Encore", "Sleep Powder", "Strength Sap", "Stun Spore", "U-turn"], + "teraTypes": ["Steel"] + } + ] + }, + "horsea": { + "level": 7, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["Dragon Pulse", "Flip Turn", "Ice Beam", "Rain Dance", "Surf"], + "teraTypes": ["Water"] + } + ] + }, + "houndour": { + "level": 7, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Dark Pulse", "Flamethrower", "Nasty Plot", "Sludge Bomb", "Sucker Punch"], + "teraTypes": ["Dark", "Fire", "Poison"] + } + ] + }, + "igglybuff": { + "level": 9, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Alluring Voice", "Encore", "Flamethrower", "Protect", "Thunder Wave", "Wish"], + "teraTypes": ["Poison", "Steel"] + }, + { + "role": "Bulky Attacker", + "movepool": ["Body Slam", "Draining Kiss", "Protect", "Wish"], + "teraTypes": ["Poison", "Steel"] + } + ] + }, + "impidimp": { + "level": 7, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Burning Jealousy", "Dark Pulse", "Draining Kiss", "Nasty Plot", "Thunder Wave"], + "teraTypes": ["Dark", "Fairy", "Fire"] + }, + { + "role": "Fast Support", + "movepool": ["Dazzling Gleam", "Light Screen", "Parting Shot", "Reflect", "Taunt", "Thunder Wave"], + "teraTypes": ["Poison", "Steel"] + }, + { + "role": "Bulky Support", + "movepool": ["Dark Pulse", "Dazzling Gleam", "Parting Shot", "Sucker Punch", "Taunt", "Thunder Wave"], + "teraTypes": ["Poison", "Steel"] + } + ] + }, + "inkay": { + "level": 6, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Hypnosis", "Knock Off", "Psycho Cut", "Rest", "Sleep Talk", "Superpower"], + "teraTypes": ["Fighting", "Steel"] + }, + { + "role": "Fast Attacker", + "movepool": ["Knock Off", "Psycho Cut", "Superpower", "Trick", "Trick Room"], + "teraTypes": ["Fighting", "Steel"] + } + ] + }, + "jangmoo": { + "level": 6, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Dragon Dance", "Earthquake", "Iron Head", "Outrage"], + "teraTypes": ["Ground", "Steel"] + } + ] + }, + "joltik": { + "level": 7, + "sets": [ + { + "role": "Fast Support", + "movepool": ["Bug Buzz", "Giga Drain", "Leech Life", "Lunge", "Thunder", "Thunder Wave", "Volt Switch"], + "teraTypes": ["Electric"] + } + ] + }, + "koffing": { + "level": 7, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Flamethrower", "Pain Split", "Sludge Bomb", "Toxic Spikes", "Will-O-Wisp"], + "teraTypes": ["Steel"] + } + ] + }, + "kubfu": { + "level": 6, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Close Combat", "Ice Punch", "Iron Head", "Swords Dance"], + "teraTypes": ["Fighting", "Steel"] + }, + { + "role": "Fast Attacker", + "movepool": ["Close Combat", "Ice Punch", "Iron Head", "Swords Dance", "U-turn"], + "teraTypes": ["Fighting", "Steel"] + } + ] + }, + "larvesta": { + "level": 6, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Flare Blitz", "Leech Life", "Morning Sun", "U-turn", "Wild Charge", "Will-O-Wisp"], + "teraTypes": ["Steel", "Water"] + } + ] + }, + "larvitar": { + "level": 6, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Dragon Dance", "Earthquake", "Facade", "Rock Blast", "Stone Edge"], + "teraTypes": ["Normal"] + } + ] + }, + "lechonk": { + "level": 7, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Body Slam", "Bulldoze", "Curse", "Play Rough"], + "teraTypes": ["Fairy", "Ground"] + }, + { + "role": "Bulky Attacker", + "movepool": ["Body Slam", "Bullet Seed", "Double-Edge", "Play Rough", "Thief", "Yawn"], + "teraTypes": ["Fairy", "Grass"] + } + ] + }, + "litleo": { + "level": 7, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Flamethrower", "Hyper Voice", "Will-O-Wisp", "Work Up"], + "teraTypes": ["Fire", "Normal"] + }, + { + "role": "Setup Sweeper", + "movepool": ["Flamethrower", "Hyper Voice", "Solar Beam", "Sunny Day"], + "teraTypes": ["Fire", "Grass", "Normal"] + } + ] + }, + "litten": { + "level": 6, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Bulk Up", "Flare Blitz", "Leech Life", "Trailblaze"], + "teraTypes": ["Bug", "Dragon", "Fire"] + }, + { + "role": "Bulky Attacker", + "movepool": ["Leech Life", "Overheat", "Parting Shot", "Will-O-Wisp"], + "teraTypes": ["Dragon", "Fairy"] + } + ] + }, + "litwick": { + "level": 7, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Calm Mind", "Energy Ball", "Flamethrower", "Pain Split", "Shadow Ball", "Will-O-Wisp"], + "teraTypes": ["Fairy", "Ghost", "Grass"] + }, + { + "role": "Bulky Attacker", + "movepool": ["Flamethrower", "Hex", "Pain Split", "Will-O-Wisp"], + "teraTypes": ["Fairy", "Grass"] + } + ] + }, + "lotad": { + "level": 8, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Giga Drain", "Ice Beam", "Surf", "Synthesis"], + "teraTypes": ["Steel", "Water"] + }, + { + "role": "Setup Sweeper", + "movepool": ["Giga Drain", "Ice Beam", "Rain Dance", "Surf"], + "teraTypes": ["Grass", "Water"] + } + ] + }, + "magby": { + "level": 6, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Belly Drum", "Cross Chop", "Mach Punch", "Temper Flare", "Thunder Punch"], + "teraTypes": ["Fighting"] + }, + { + "role": "Fast Attacker", + "movepool": ["Cross Chop", "Fire Blast", "Flare Blitz", "Thunder Punch", "Will-O-Wisp"], + "teraTypes": ["Electric", "Fire", "Grass"] + }, + { + "role": "Wallbreaker", + "movepool": ["Cross Chop", "Flare Blitz", "Overheat", "Thunder Punch"], + "teraTypes": ["Electric", "Fighting", "Fire"] + } + ] + }, + "magnemite": { + "level": 6, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Flash Cannon", "Thunder Wave", "Thunderbolt", "Volt Switch"], + "teraTypes": ["Flying"] + } + ] + }, + "makuhita": { + "level": 7, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Bulk Up", "Bullet Punch", "Drain Punch", "Earthquake", "Heavy Slam", "Stone Edge"], + "teraTypes": ["Ground", "Steel"] + } + ] + }, + "mankey": { + "level": 6, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["Close Combat", "Earthquake", "Gunk Shot", "Stone Edge", "Throat Chop", "U-turn"], + "teraTypes": ["Dark", "Fighting", "Ground", "Poison", "Rock"] + }, + { + "role": "Bulky Setup", + "movepool": ["Bulk Up", "Drain Punch", "Earthquake", "Stone Edge", "Throat Chop"], + "teraTypes": ["Fighting", "Ground", "Rock"] + }, + { + "role": "Fast Attacker", + "movepool": ["Bulk Up", "Close Combat", "Earthquake", "Gunk Shot", "Stone Edge", "Throat Chop", "U-turn"], + "teraTypes": ["Dark", "Fighting", "Ground", "Poison", "Rock"] + } + ] + }, + "mareanie": { + "level": 6, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Gunk Shot", "Liquidation", "Poison Jab", "Recover", "Toxic Spikes"], + "teraTypes": ["Fairy", "Flying", "Grass", "Steel"] + } + ] + }, + "mareep": { + "level": 8, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Dazzling Gleam", "Thunder Wave", "Thunderbolt", "Volt Switch"], + "teraTypes": ["Fairy"] + } + ] + }, + "maschiff": { + "level": 7, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Crunch", "Hone Claws", "Play Rough", "Trailblaze"], + "teraTypes": ["Fairy"] + } + ] + }, + "meditite": { + "level": 5, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Bulk Up", "Drain Punch", "Trailblaze", "Zen Headbutt"], + "teraTypes": ["Fighting", "Psychic", "Steel"] + }, + { + "role": "Fast Attacker", + "movepool": ["Close Combat", "Ice Punch", "Poison Jab", "Zen Headbutt"], + "teraTypes": ["Fighting", "Poison", "Psychic"] + } + ] + }, + "meowth": { + "level": 6, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["Fake Out", "Fury Swipes", "Knock Off", "Play Rough", "Thunder Wave", "U-turn"], + "teraTypes": ["Normal"] + } + ] + }, + "meowthalola": { + "level": 6, + "sets": [ + { + "role": "Fast Support", + "movepool": ["Gunk Shot", "Knock Off", "Parting Shot", "Play Rough", "Thunder Wave"], + "teraTypes": ["Fairy", "Poison"] + }, + { + "role": "Setup Sweeper", + "movepool": ["Dark Pulse", "Hypnosis", "Nasty Plot", "Power Gem", "Thunderbolt"], + "teraTypes": ["Dark", "Electric"] + } + ] + }, + "meowthgalar": { + "level": 7, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Iron Head", "Knock Off", "Swords Dance", "Trailblaze"], + "teraTypes": ["Fairy", "Steel"] + }, + { + "role": "Bulky Support", + "movepool": ["Iron Head", "Knock Off", "Play Rough", "Stealth Rock", "Thunder Wave", "U-turn"], + "teraTypes": ["Fairy", "Water"] + } + ] + }, + "mienfoo": { + "level": 6, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Close Combat", "Knock Off", "Poison Jab", "Stone Edge", "Swords Dance"], + "teraTypes": ["Dark", "Fighting", "Poison"] + }, + { + "role": "Fast Support", + "movepool": ["Close Combat", "Fake Out", "Knock Off", "U-turn"], + "teraTypes": ["Dark", "Steel"] + }, + { + "role": "Fast Attacker", + "movepool": ["Close Combat", "Knock Off", "Poison Jab", "Stone Edge", "Swords Dance", "U-turn"], + "teraTypes": ["Dark", "Fighting", "Poison"] + } + ] + }, + "milcery": { + "level": 8, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Acid Armor", "Draining Kiss", "Recover", "Stored Power"], + "teraTypes": ["Fairy", "Steel"] + } + ] + }, + "minccino": { + "level": 6, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Bullet Seed", "Knock Off", "Tail Slap", "Tidy Up", "Triple Axel"], + "teraTypes": ["Grass", "Ice", "Normal"] + } + ] + }, + "misdreavus": { + "level": 5, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Calm Mind", "Draining Kiss", "Shadow Ball", "Will-O-Wisp"], + "teraTypes": ["Fairy"] + }, + { + "role": "Wallbreaker", + "movepool": ["Dazzling Gleam", "Nasty Plot", "Shadow Ball", "Thunderbolt", "Trick", "Will-O-Wisp"], + "teraTypes": ["Electric", "Fairy", "Ghost"] + } + ] + }, + "mudbray": { + "level": 6, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Close Combat", "Earthquake", "Heavy Slam", "Stealth Rock", "Stone Edge"], + "teraTypes": ["Fighting", "Ground", "Steel"] + } + ] + }, + "mudkip": { + "level": 7, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Body Slam", "Ice Beam", "Liquidation", "Rest", "Roar", "Sleep Talk", "Sludge Wave", "Yawn"], + "teraTypes": ["Poison", "Steel"] + } + ] + }, + "munchlax": { + "level": 6, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Body Slam", "Crunch", "Curse", "Earthquake", "Rest", "Sleep Talk"], + "teraTypes": ["Fairy", "Ghost", "Ground"] + } + ] + }, + "murkrow": { + "level": 5, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Dark Pulse", "Heat Wave", "Hurricane", "Nasty Plot", "Sucker Punch"], + "teraTypes": ["Dark", "Fairy", "Flying", "Steel"] + }, + { + "role": "Fast Support", + "movepool": ["Brave Bird", "Sucker Punch", "Thunder Wave", "U-turn"], + "teraTypes": ["Fairy", "Steel"] + } + ] + }, + "nacli": { + "level": 8, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Curse", "Earthquake", "Recover", "Stealth Rock", "Stone Edge"], + "teraTypes": ["Dragon", "Fairy", "Ghost"] + } + ] + }, + "noibat": { + "level": 8, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Air Slash", "Defog", "Draco Meteor", "Heat Wave", "Hurricane", "Roost", "U-turn"], + "teraTypes": ["Fairy", "Steel"] + } + ] + }, + "nosepass": { + "level": 6, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Body Press", "Iron Defense", "Pain Split", "Power Gem", "Thunder Wave"], + "teraTypes": ["Fighting"] + } + ] + }, + "numel": { + "level": 7, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Earthquake", "Fire Blast", "Growth", "Trailblaze"], + "teraTypes": ["Grass", "Ground"] + } + ] + }, + "nymble": { + "level": 6, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["First Impression", "Leech Life", "Sucker Punch", "U-turn"], + "teraTypes": ["Bug"] + } + ] + }, + "oddish": { + "level": 6, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Giga Drain", "Sleep Powder", "Sludge Bomb", "Strength Sap", "Stun Spore"], + "teraTypes": ["Steel", "Water"] + } + ] + }, + "oshawott": { + "level": 7, + "sets": [ + { + "role": "Fast Support", + "movepool": ["Aqua Jet", "Encore", "Flip Turn", "Ice Beam", "Knock Off", "Sacred Sword", "Surf", "X-Scissor"], + "teraTypes": ["Dark", "Fighting", "Water"] + }, + { + "role": "Setup Sweeper", + "movepool": ["Aqua Jet", "Knock Off", "Liquidation", "Sacred Sword", "Swords Dance"], + "teraTypes": ["Dark", "Fighting", "Water"] + } + ] + }, + "pawmi": { + "level": 8, + "sets": [ + { + "role": "Fast Support", + "movepool": ["Discharge", "Encore", "Nuzzle", "Play Rough", "Super Fang", "Volt Switch"], + "teraTypes": ["Electric", "Fairy", "Grass"] + } + ] + }, + "pawniard": { + "level": 6, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Iron Head", "Night Slash", "Sucker Punch", "Swords Dance"], + "teraTypes": ["Dark", "Fairy", "Steel"] + } + ] + }, + "petilil": { + "level": 7, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Encore", "Giga Drain", "Leaf Storm", "Pollen Puff", "Sleep Powder", "Stun Spore", "Synthesis"], + "teraTypes": ["Poison", "Steel", "Water"] + } + ] + }, + "phanpy": { + "level": 7, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Earthquake", "Gunk Shot", "Ice Shard", "Knock Off", "Stealth Rock", "Stone Edge"], + "teraTypes": ["Dark", "Ground", "Poison"] + } + ] + }, + "phantump": { + "level": 7, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Horn Leech", "Poltergeist", "Rest", "Will-O-Wisp"], + "teraTypes": ["Fairy", "Water"] + }, + { + "role": "Bulky Attacker", + "movepool": ["Horn Leech", "Poltergeist", "Protect", "Will-O-Wisp"], + "teraTypes": ["Fairy", "Water"] + } + ] + }, + "pichu": { + "level": 8, + "sets": [ + { + "role": "Fast Support", + "movepool": ["Encore", "Nuzzle", "Play Rough", "Surf", "Volt Switch", "Volt Tackle"], + "teraTypes": ["Water"] + }, + { + "role": "Tera Blast user", + "movepool": ["Encore", "Nasty Plot", "Surf", "Tera Blast", "Thunderbolt"], + "teraTypes": ["Ice"] + } + ] + }, + "pikipek": { + "level": 6, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Acrobatics", "Bullet Seed", "Flame Charge", "Knock Off", "Swords Dance"], + "teraTypes": ["Flying", "Grass", "Steel"] + }, + { + "role": "Fast Attacker", + "movepool": ["Brave Bird", "Bullet Seed", "Knock Off", "Roost", "Swords Dance", "U-turn"], + "teraTypes": ["Flying", "Grass", "Steel"] + } + ] + }, + "pineco": { + "level": 7, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Lunge", "Rapid Spin", "Rock Blast", "Spikes", "Stealth Rock", "Toxic Spikes"], + "teraTypes": ["Ghost"] + } + ] + }, + "piplup": { + "level": 7, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Flip Turn", "Haze", "Ice Beam", "Roost", "Surf", "Yawn"], + "teraTypes": ["Fairy", "Steel"] + } + ] + }, + "poliwag": { + "level": 7, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Belly Drum", "Body Slam", "Encore", "Hypnosis", "Waterfall"], + "teraTypes": ["Ground", "Normal", "Water"] + }, + { + "role": "Tera Blast user", + "movepool": ["Belly Drum", "Body Slam", "Tera Blast", "Waterfall"], + "teraTypes": ["Fire", "Ground"] + } + ] + }, + "poltchageist": { + "level": 7, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Calm Mind", "Giga Drain", "Scald", "Shadow Ball", "Stun Spore"], + "teraTypes": ["Fairy", "Steel", "Water"] + } + ] + }, + "poochyena": { + "level": 8, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Crunch", "Play Rough", "Poison Fang", "Sucker Punch", "Super Fang", "Taunt", "Yawn"], + "teraTypes": ["Fairy", "Poison"] + } + ] + }, + "popplio": { + "level": 7, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Encore", "Flip Turn", "Moonblast", "Surf", "Triple Axel"], + "teraTypes": ["Fairy", "Ice", "Steel", "Water"] + } + ] + }, + "porygon": { + "level": 6, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Discharge", "Ice Beam", "Recover", "Tri Attack"], + "teraTypes": ["Electric", "Ghost", "Poison"] + }, + { + "role": "Tera Blast user", + "movepool": ["Agility", "Recover", "Shadow Ball", "Tera Blast"], + "teraTypes": ["Fairy", "Fighting"] + } + ] + }, + "psyduck": { + "level": 7, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Encore", "Flip Turn", "Ice Beam", "Knock Off", "Surf", "Yawn"], + "teraTypes": ["Dark", "Fairy", "Steel"] + }, + { + "role": "Bulky Setup", + "movepool": ["Ice Beam", "Nasty Plot", "Surf", "Trailblaze"], + "teraTypes": ["Steel", "Water"] + } + ] + }, + "quaxly": { + "level": 6, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Brave Bird", "Encore", "Liquidation", "Rapid Spin", "Roost"], + "teraTypes": ["Flying", "Steel"] + } + ] + }, + "qwilfishhisui": { + "level": 5, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Crunch", "Gunk Shot", "Liquidation", "Swords Dance"], + "teraTypes": ["Dark", "Poison", "Water"] + }, + { + "role": "Bulky Attacker", + "movepool": ["Crunch", "Gunk Shot", "Spikes", "Taunt", "Toxic Spikes"], + "teraTypes": ["Dark", "Poison"] + } + ] + }, + "ralts": { + "level": 8, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Draining Kiss", "Knock Off", "Psychic", "Thunder Wave", "Will-O-Wisp"], + "teraTypes": ["Steel"] + }, + { + "role": "Bulky Setup", + "movepool": ["Calm Mind", "Draining Kiss", "Mystical Fire", "Psychic"], + "teraTypes": ["Fairy", "Steel"] + } + ] + }, + "rellor": { + "level": 8, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Cosmic Power", "Gunk Shot", "Leech Life", "Recover"], + "teraTypes": ["Poison", "Steel"] + } + ] + }, + "rhyhorn": { + "level": 6, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Earthquake", "Megahorn", "Rock Blast", "Rock Polish", "Stealth Rock", "Stone Edge", "Swords Dance"], + "teraTypes": ["Dragon", "Fairy", "Flying", "Grass", "Water"] + } + ] + }, + "riolu": { + "level": 6, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Close Combat", "Crunch", "Earthquake", "Ice Punch", "Swords Dance"], + "teraTypes": ["Dark", "Fighting", "Ground"] + } + ] + }, + "rockruff": { + "level": 7, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Play Rough", "Stealth Rock", "Stomping Tantrum", "Stone Edge", "Sucker Punch", "Swords Dance"], + "teraTypes": ["Fairy", "Ground", "Rock"] + } + ] + }, + "rolycoly": { + "level": 8, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Power Gem", "Rapid Spin", "Spikes", "Stealth Rock", "Temper Flare", "Will-O-Wisp"], + "teraTypes": ["Ghost", "Steel"] + } + ] + }, + "rookiedee": { + "level": 8, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Brave Bird", "Defog", "Roost", "Taunt", "U-turn"], + "teraTypes": ["Steel"] + } + ] + }, + "rowlet": { + "level": 7, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Brave Bird", "Leaf Blade", "Roost", "Swords Dance"], + "teraTypes": ["Steel", "Water"] + }, + { + "role": "Bulky Support", + "movepool": ["Brave Bird", "Defog", "Giga Drain", "Knock Off", "Roost"], + "teraTypes": ["Steel", "Water"] + } + ] + }, + "rufflet": { + "level": 5, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Brave Bird", "Bulk Up", "Close Combat", "Hone Claws", "Roost"], + "teraTypes": ["Fighting"] + } + ] + }, + "salandit": { + "level": 6, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Dragon Pulse", "Flamethrower", "Nasty Plot", "Sludge Bomb"], + "teraTypes": ["Dragon", "Fire", "Poison"] + }, + { + "role": "Fast Support", + "movepool": ["Flamethrower", "Knock Off", "Sludge Bomb", "Thunder Wave", "Toxic Spikes", "Will-O-Wisp"], + "teraTypes": ["Flying", "Water"] + } + ] + }, + "sandile": { + "level": 7, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Crunch", "Earthquake", "Fire Fang", "Stealth Rock", "Stone Edge"], + "teraTypes": ["Dark", "Ground"] + } + ] + }, + "sandshrew": { + "level": 6, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Earthquake", "Knock Off", "Rapid Spin", "Spikes", "Stone Edge", "Swords Dance"], + "teraTypes": ["Dragon", "Steel", "Water"] + } + ] + }, + "sandshrewalola": { + "level": 6, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Earthquake", "Ice Shard", "Rapid Spin", "Swords Dance", "Triple Axel"], + "teraTypes": ["Ground"] + }, + { + "role": "Bulky Support", + "movepool": ["Earthquake", "Iron Head", "Knock Off", "Rapid Spin", "Stealth Rock", "Triple Axel"], + "teraTypes": ["Flying", "Water"] + } + ] + }, + "sandygast": { + "level": 7, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Earth Power", "Giga Drain", "Shadow Ball", "Shore Up", "Sludge Bomb", "Stealth Rock"], + "teraTypes": ["Fairy", "Poison", "Water"] + } + ] + }, + "scorbunny": { + "level": 6, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["Flare Blitz", "Gunk Shot", "High Jump Kick", "Sucker Punch", "U-turn"], + "teraTypes": ["Fighting", "Fire"] + }, + { + "role": "Fast Attacker", + "movepool": ["Flare Blitz", "Gunk Shot", "High Jump Kick", "U-turn"], + "teraTypes": ["Fighting", "Fire", "Poison"] + } + ] + }, + "scraggy": { + "level": 6, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Bulk Up", "Drain Punch", "Knock Off", "Rest"], + "teraTypes": ["Poison"] + }, + { + "role": "Setup Sweeper", + "movepool": ["Close Combat", "Dragon Dance", "Knock Off", "Poison Jab"], + "teraTypes": ["Poison"] + } + ] + }, + "scyther": { + "level": 5, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Close Combat", "Dual Wingbeat", "Pounce", "Swords Dance", "U-turn"], + "teraTypes": ["Fighting"] + } + ] + }, + "seedot": { + "level": 8, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Bullet Seed", "Defog", "Foul Play", "Sucker Punch", "Synthesis"], + "teraTypes": ["Steel", "Water"] + } + ] + }, + "seel": { + "level": 7, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Encore", "Flip Turn", "Haze", "Icicle Spear", "Surf", "Thief"], + "teraTypes": ["Poison", "Steel", "Water"] + }, + { + "role": "Fast Support", + "movepool": ["Aqua Jet", "Fake Out", "Icicle Spear", "Surf"], + "teraTypes": ["Poison", "Steel", "Water"] + } + ] + }, + "sentret": { + "level": 8, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Body Slam", "Brick Break", "Double-Edge", "Knock Off", "Tidy Up"], + "teraTypes": ["Ghost", "Normal"] + } + ] + }, + "sewaddle": { + "level": 7, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Electroweb", "Giga Drain", "Lunge", "Sticky Web", "Synthesis"], + "teraTypes": ["Ghost"] + } + ] + }, + "shellder": { + "level": 7, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Icicle Spear", "Liquidation", "Rock Blast", "Shell Smash"], + "teraTypes": ["Ice", "Rock", "Steel", "Water"] + } + ] + }, + "shellos": { + "level": 7, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Clear Smog", "Ice Beam", "Recover", "Stealth Rock", "Surf", "Yawn"], + "teraTypes": ["Poison", "Steel"] + } + ] + }, + "shieldon": { + "level": 7, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Earth Power", "Flash Cannon", "Ice Beam", "Rock Blast", "Stealth Rock"], + "teraTypes": ["Fairy", "Flying", "Ground"] + } + ] + }, + "shinx": { + "level": 7, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Crunch", "Ice Fang", "Play Rough", "Roar", "Thunder Wave", "Volt Switch", "Wild Charge"], + "teraTypes": ["Fairy"] + }, + { + "role": "Setup Sweeper", + "movepool": ["Crunch", "Facade", "Play Rough", "Trailblaze", "Wild Charge"], + "teraTypes": ["Normal"] + } + ] + }, + "shroodle": { + "level": 7, + "sets": [ + { + "role": "Fast Support", + "movepool": ["Encore", "Gunk Shot", "Knock Off", "Parting Shot"], + "teraTypes": ["Dark"] + }, + { + "role": "Setup Sweeper", + "movepool": ["Double-Edge", "Gunk Shot", "Knock Off", "Swords Dance"], + "teraTypes": ["Dark", "Normal", "Poison"] + } + ] + }, + "shroomish": { + "level": 8, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Drain Punch", "Giga Drain", "Sludge Bomb", "Spore", "Stun Spore"], + "teraTypes": ["Poison", "Steel", "Water"] + } + ] + }, + "shuppet": { + "level": 7, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Dazzling Gleam", "Gunk Shot", "Pain Split", "Poltergeist", "Shadow Sneak", "Thunder Wave", "Trick", "Will-O-Wisp"], + "teraTypes": ["Fairy"] + }, + { + "role": "Bulky Setup", + "movepool": ["Dazzling Gleam", "Nasty Plot", "Shadow Ball", "Thunderbolt", "Will-O-Wisp"], + "teraTypes": ["Electric", "Fairy"] + } + ] + }, + "silicobra": { + "level": 7, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Coil", "Earthquake", "Glare", "Rest", "Rock Blast", "Stealth Rock", "Stone Edge"], + "teraTypes": ["Dragon", "Steel"] + } + ] + }, + "sinistea": { + "level": 6, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Giga Drain", "Shadow Ball", "Shell Smash", "Stored Power", "Will-O-Wisp"], + "teraTypes": ["Fairy", "Psychic"] + }, + { + "role": "Tera Blast user", + "movepool": ["Giga Drain", "Shadow Ball", "Shell Smash", "Tera Blast", "Will-O-Wisp"], + "teraTypes": ["Fighting"] + } + ] + }, + "skiddo": { + "level": 7, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Bulk Up", "Horn Leech", "Milk Drink", "Rock Slide", "Stomping Tantrum"], + "teraTypes": ["Ground", "Water"] + } + ] + }, + "skrelp": { + "level": 6, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Flip Turn", "Gunk Shot", "Hydro Pump", "Sludge Bomb", "Toxic Spikes"], + "teraTypes": ["Poison", "Water"] + } + ] + }, + "skwovet": { + "level": 8, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Belly Drum", "Body Slam", "Crunch", "Trailblaze"], + "teraTypes": ["Ghost"] + } + ] + }, + "slakoth": { + "level": 9, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["Body Slam", "Gunk Shot", "Hammer Arm", "Ice Punch", "Play Rough", "Slack Off", "Throat Chop"], + "teraTypes": ["Fairy", "Fighting", "Normal"] + } + ] + }, + "slowpoke": { + "level": 7, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Curse", "Earthquake", "Fire Blast", "Liquidation", "Slack Off", "Thunder Wave", "Zen Headbutt"], + "teraTypes": ["Fairy", "Poison"] + } + ] + }, + "slowpokegalar": { + "level": 7, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Curse", "Earthquake", "Slack Off", "Thunder Wave", "Zen Headbutt"], + "teraTypes": ["Fairy", "Ground"] + } + ] + }, + "smoliv": { + "level": 7, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Earth Power", "Giga Drain", "Protect", "Strength Sap"], + "teraTypes": ["Steel", "Water"] + }, + { + "role": "Tera Blast user", + "movepool": ["Earth Power", "Giga Drain", "Leaf Storm", "Strength Sap", "Tera Blast"], + "teraTypes": ["Fairy", "Poison"] + } + ] + }, + "slugma": { + "level": 7, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Earth Power", "Lava Plume", "Recover", "Stealth Rock", "Will-O-Wisp", "Yawn"], + "teraTypes": ["Dragon", "Grass"] + } + ] + }, + "sneasel": { + "level": 5, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Brick Break", "Ice Shard", "Knock Off", "Swords Dance", "Triple Axel"], + "teraTypes": ["Dark", "Fighting", "Ice"] + } + ] + }, + "sneaselhisui": { + "level": 5, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Close Combat", "Gunk Shot", "Lash Out", "Swords Dance", "Toxic Spikes"], + "teraTypes": ["Dark", "Fighting", "Poison"] + } + ] + }, + "snivy": { + "level": 6, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Glare", "Knock Off", "Leaf Storm", "Substitute", "Synthesis"], + "teraTypes": ["Grass", "Poison", "Water"] + }, + { + "role": "Tera Blast user", + "movepool": ["Glare", "Knock Off", "Leaf Storm", "Substitute", "Synthesis", "Tera Blast"], + "teraTypes": ["Stellar"] + } + ] + }, + "snom": { + "level": 8, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Bug Buzz", "Icy Wind", "Rest", "Sleep Talk"], + "teraTypes": ["Steel", "Water"] + } + ] + }, + "snorunt": { + "level": 8, + "sets": [ + { + "role": "Fast Support", + "movepool": ["Crunch", "Ice Shard", "Icicle Spear", "Spikes"], + "teraTypes": ["Steel", "Water"] + } + ] + }, + "snover": { + "level": 7, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Bullet Seed", "Ice Shard", "Icicle Spear", "Swords Dance"], + "teraTypes": ["Grass", "Ice", "Water"] + }, + { + "role": "Bulky Support", + "movepool": ["Blizzard", "Bullet Seed", "Giga Drain", "Ice Shard", "Trailblaze"], + "teraTypes": ["Ice", "Water"] + } + ] + }, + "snubble": { + "level": 7, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Earthquake", "Encore", "Play Rough", "Thunder Wave"], + "teraTypes": ["Ground"] + }, + { + "role": "Bulky Setup", + "movepool": ["Bulk Up", "Earthquake", "Play Rough", "Trailblaze"], + "teraTypes": ["Ground"] + } + ] + }, + "sobble": { + "level": 7, + "sets": [ + { + "role": "Fast Support", + "movepool": ["Haze", "Hydro Pump", "Light Screen", "Reflect", "Surf", "U-turn"], + "teraTypes": ["Water"] + } + ] + }, + "solosis": { + "level": 6, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Calm Mind", "Psychic", "Recover", "Shadow Ball", "Thunder Wave"], + "teraTypes": ["Fairy", "Steel"] + } + ] + }, + "spinarak": { + "level": 7, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Knock Off", "Megahorn", "Poison Jab", "Sticky Web", "Sucker Punch", "Toxic Spikes"], + "teraTypes": ["Dark", "Steel"] + } + ] + }, + "spoink": { + "level": 7, + "sets": [ + { + "role": "Fast Support", + "movepool": ["Calm Mind", "Dazzling Gleam", "Psychic", "Shadow Ball", "Thunder Wave", "Trick"], + "teraTypes": ["Fairy", "Ghost", "Psychic"] + } + ] + }, + "sprigatito": { + "level": 7, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["Bullet Seed", "Play Rough", "Shadow Claw", "Sucker Punch", "U-turn"], + "teraTypes": ["Fairy", "Grass"] + } + ] + }, + "squirtle": { + "level": 6, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Flip Turn", "Ice Beam", "Surf", "Water Spout"], + "teraTypes": ["Water"] + }, + { + "role": "Bulky Support", + "movepool": ["Flip Turn", "Ice Beam", "Rapid Spin", "Surf", "Yawn"], + "teraTypes": ["Poison", "Steel"] + }, + { + "role": "Bulky Setup", + "movepool": ["Body Slam", "Ice Beam", "Shell Smash", "Surf"], + "teraTypes": ["Ice", "Normal", "Water"] + } + ] + }, + "stantler": { + "level": 5, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Double-Edge", "Earthquake", "Hypnosis", "Megahorn", "Shadow Ball", "Thunder Wave", "Trick"], + "teraTypes": ["Bug", "Ghost", "Ground"] + }, + { + "role": "Tera Blast user", + "movepool": ["Calm Mind", "Earth Power", "Shadow Ball", "Tera Blast", "Thunderbolt"], + "teraTypes": ["Fairy"] + } + ] + }, + "starly": { + "level": 7, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Brave Bird", "Double-Edge", "Heat Wave", "U-turn"], + "teraTypes": ["Flying", "Normal"] + } + ] + }, + "stunky": { + "level": 7, + "sets": [ + { + "role": "Fast Support", + "movepool": ["Fire Blast", "Gunk Shot", "Knock Off", "Sucker Punch", "Taunt", "Toxic Spikes"], + "teraTypes": ["Dark", "Poison"] + } + ] + }, + "sunkern": { + "level": 8, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["Earth Power", "Solar Beam", "Sunny Day", "Weather Ball"], + "teraTypes": ["Fire"] + } + ] + }, + "surskit": { + "level": 6, + "sets": [ + { + "role": "Fast Support", + "movepool": ["Bug Buzz", "Giga Drain", "Hydro Pump", "Ice Beam", "Sticky Web"], + "teraTypes": ["Ground", "Steel", "Water"] + } + ] + }, + "swablu": { + "level": 7, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Body Slam", "Brave Bird", "Defog", "Haze", "Heat Wave", "Roost"], + "teraTypes": ["Steel"] + } + ] + }, + "swinub": { + "level": 8, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Earthquake", "Freeze-Dry", "Ice Shard", "Icicle Spear", "Stealth Rock"], + "teraTypes": ["Ground", "Water"] + }, + { + "role": "Wallbreaker", + "movepool": ["Earthquake", "Freeze-Dry", "Ice Shard", "Icicle Spear", "Stealth Rock"], + "teraTypes": ["Ground", "Ice"] + } + ] + }, + "tadbulb": { + "level": 8, + "sets": [ + { + "role": "Fast Support", + "movepool": ["Acid Spray", "Discharge", "Muddy Water", "Thunder Wave", "Volt Switch"], + "teraTypes": ["Water"] + }, + { + "role": "Setup Sweeper", + "movepool": ["Rain Dance", "Thunder", "Volt Switch", "Weather Ball"], + "teraTypes": ["Water"] + } + ] + }, + "tandemaus": { + "level": 7, + "sets": [ + { + "role": "Fast Support", + "movepool": ["Crunch", "Double-Edge", "Encore", "Low Sweep", "Play Rough", "Thief", "Thunder Wave", "U-turn"], + "teraTypes": ["Ghost"] + } + ] + }, + "tarountula": { + "level": 8, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Circle Throw", "Knock Off", "Leech Life", "Spikes", "Sticky Web", "Toxic Spikes"], + "teraTypes": ["Ghost"] + } + ] + }, + "teddiursa": { + "level": 6, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Crunch", "Earthquake", "Facade", "Swords Dance"], + "teraTypes": ["Normal"] + } + ] + }, + "tentacool": { + "level": 6, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Flip Turn", "Ice Beam", "Knock Off", "Rapid Spin", "Sludge Bomb", "Surf", "Toxic Spikes"], + "teraTypes": ["Grass"] + } + ] + }, + "tepig": { + "level": 7, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Flare Blitz", "Head Smash", "Superpower", "Wild Charge"], + "teraTypes": ["Electric", "Fighting", "Fire", "Rock"] + } + ] + }, + "timburr": { + "level": 7, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Bulk Up", "Defog", "Drain Punch", "Knock Off", "Stone Edge"], + "teraTypes": ["Dark", "Steel"] + } + ] + }, + "tinkatink": { + "level": 7, + "sets": [ + { + "role": "Fast Support", + "movepool": ["Encore", "Knock Off", "Play Rough", "Stealth Rock", "Thunder Wave"], + "teraTypes": ["Fairy", "Water"] + } + ] + }, + "toedscool": { + "level": 6, + "sets": [ + { + "role": "Fast Support", + "movepool": ["Earth Power", "Giga Drain", "Knock Off", "Leaf Storm", "Rapid Spin", "Spikes", "Spore", "Toxic Spikes"], + "teraTypes": ["Water"] + } + ] + }, + "torchic": { + "level": 6, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Flare Blitz", "Protect", "Rock Slide", "Swords Dance"], + "teraTypes": ["Dragon", "Fire", "Rock"] + }, + { + "role": "Tera Blast user", + "movepool": ["Focus Energy", "Overheat", "Protect", "Tera Blast"], + "teraTypes": ["Fighting", "Ground"] + } + ] + }, + "totodile": { + "level": 6, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Dragon Dance", "Ice Punch", "Liquidation", "Trailblaze"], + "teraTypes": ["Grass", "Water"] + } + ] + }, + "trapinch": { + "level": 6, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Earthquake", "First Impression", "Stone Edge", "Superpower"], + "teraTypes": ["Bug", "Fighting"] + } + ] + }, + "treecko": { + "level": 6, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["Drain Punch", "Giga Drain", "Leaf Storm", "Rock Slide", "Synthesis", "Thunder Punch"], + "teraTypes": ["Electric", "Fighting", "Grass. Rock"] + }, + { + "role": "Setup Sweeper", + "movepool": ["Acrobatics", "Bullet Seed", "Drain Punch", "Swords Dance"], + "teraTypes": ["Flying"] + } + ] + }, + "turtwig": { + "level": 6, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Body Slam", "Bullet Seed", "Crunch", "Earth Power", "Shell Smash"], + "teraTypes": ["Grass", "Ground"] + } + ] + }, + "tynamo": { + "level": 8, + "sets": [ + { + "role": "Tera Blast user", + "movepool": ["Knock Off", "Spark", "Tera Blast", "Thunder Wave"], + "teraTypes": ["Ground", "Ice"] + }, + { + "role": "Fast Support", + "movepool": ["Charge Beam", "Knock Off", "Spark", "Thunder Wave"], + "teraTypes": ["Electric", "Steel"] + } + ] + }, + "tyrogue": { + "level": 9, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Bulk Up", "High Jump Kick", "Rapid Spin", "Rock Slide"], + "teraTypes": ["Fighting", "Rock"] + } + ] + }, + "varoom": { + "level": 6, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Gunk Shot", "Iron Head", "Parting Shot", "Taunt", "Toxic Spikes"], + "teraTypes": ["Poison", "Steel", "Water"] + } + ] + }, + "venonat": { + "level": 7, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Leech Life", "Morning Sun", "Sleep Powder", "Stun Spore", "Toxic Spikes"], + "teraTypes": ["Steel", "Water"] + } + ] + }, + "voltorb": { + "level": 7, + "sets": [ + { + "role": "Fast Support", + "movepool": ["Explosion", "Foul Play", "Thief", "Thunder Wave", "Thunderbolt", "Volt Switch"], + "teraTypes": ["Dark", "Electric"] + }, + { + "role": "Tera Blast user", + "movepool": ["Tera Blast", "Thunder Wave", "Thunderbolt", "Volt Switch"], + "teraTypes": ["Ice"] + } + ] + }, + "voltorbhisui": { + "level": 7, + "sets": [ + { + "role": "Fast Support", + "movepool": ["Giga Drain", "Leaf Storm", "Taunt", "Thief", "Thunder Wave", "Thunderbolt", "Volt Switch"], + "teraTypes": ["Electric", "Grass"] + } + ] + }, + "vullaby": { + "level": 6, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Brave Bird", "Defog", "Knock Off", "Roost", "U-turn"], + "teraTypes": ["Steel"] + } + ] + }, + "vulpix": { + "level": 6, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Encore", "Energy Ball", "Extrasensory", "Fire Blast", "Healing Wish", "Hypnosis", "Nasty Plot", "Will-O-Wisp"], + "teraTypes": ["Grass"] + }, + { + "role": "Tera Blast user", + "movepool": ["Energy Ball", "Fire Blast", "Nasty Plot", "Tera Blast"], + "teraTypes": ["Rock"] + } + ] + }, + "vulpixalola": { + "level": 6, + "sets": [ + { + "role": "Fast Support", + "movepool": ["Aurora Veil", "Blizzard", "Freeze-Dry", "Moonblast"], + "teraTypes": ["Steel", "Water"] + }, + { + "role": "Setup Sweeper", + "movepool": ["Aurora Veil", "Blizzard", "Moonblast", "Nasty Plot"], + "teraTypes": ["Steel", "Water"] + }, + { + "role": "Tera Blast user", + "movepool": ["Blizzard", "Moonblast", "Nasty Plot", "Tera Blast"], + "teraTypes": ["Ground"] + } + ] + }, + "wattrel": { + "level": 7, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Hurricane", "Roost", "Thunder Wave", "Thunderbolt", "U-turn"], + "teraTypes": ["Electric", "Steel"] + } + ] + }, + "wiglett": { + "level": 7, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["Aqua Jet", "Ice Beam", "Liquidation", "Stomping Tantrum", "Throat Chop"], + "teraTypes": ["Dark", "Ground", "Water"] + }, + { + "role": "Fast Support", + "movepool": ["Liquidation", "Pain Split", "Substitute", "Throat Chop"], + "teraTypes": ["Poison", "Steel"] + } + ] + }, + "wingull": { + "level": 7, + "sets": [ + { + "role": "Fast Support", + "movepool": ["Hurricane", "Knock Off", "Roost", "Surf"], + "teraTypes": ["Ground"] + } + ] + }, + "wooper": { + "level": 7, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Curse", "Earthquake", "Liquidation", "Recover", "Spikes", "Stealth Rock"], + "teraTypes": ["Poison", "Steel"] + } + ] + }, + "wooperpaldea": { + "level": 7, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Curse", "Earthquake", "Gunk Shot", "Poison Jab", "Recover"], + "teraTypes": ["Flying", "Steel"] + }, + { + "role": "Bulky Support", + "movepool": ["Earthquake", "Gunk Shot", "Poison Jab", "Recover", "Spikes", "Stealth Rock", "Toxic Spikes"], + "teraTypes": ["Flying", "Steel"] + } + ] + }, + "yanma": { + "level": 5, + "sets": [ + { + "role": "Fast Support", + "movepool": ["Air Slash", "Bug Buzz", "Giga Drain", "Hypnosis", "Protect", "U-turn"], + "teraTypes": ["Bug", "Flying", "Grass"] + }, + { + "role": "Tera Blast user", + "movepool": ["Double-Edge", "Leech Life", "Protect", "Swords Dance", "Tera Blast"], + "teraTypes": ["Ground"] + } + ] + }, + "yungoos": { + "level": 7, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Crunch", "Double-Edge", "Stomping Tantrum", "U-turn", "Yawn"], + "teraTypes": ["Ground", "Normal"] + } + ] + }, + "zorua": { + "level": 7, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Burning Jealousy", "Knock Off", "Sludge Bomb", "Trick", "U-turn"], + "teraTypes": ["Dark", "Poison"] + }, + { + "role": "Setup Sweeper", + "movepool": ["Burning Jealousy", "Dark Pulse", "Nasty Plot", "Sludge Bomb"], + "teraTypes": ["Dark", "Poison"] + } + ] + }, + "zoruahisui": { + "level": 6, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Bitter Malice", "Burning Jealousy", "Knock Off", "Trick", "U-turn", "Will-O-Wisp"], + "teraTypes": ["Fairy", "Ghost"] + }, + { + "role": "Tera Blast user", + "movepool": ["Bitter Malice", "Burning Jealousy", "Nasty Plot", "Tera Blast", "Will-O-Wisp"], + "teraTypes": ["Fairy"] + } + ] + } +} diff --git a/data/random-battles/gen9baby/teams.ts b/data/random-battles/gen9baby/teams.ts new file mode 100644 index 000000000000..96c634f48c6c --- /dev/null +++ b/data/random-battles/gen9baby/teams.ts @@ -0,0 +1,861 @@ +import {PRNG, PRNGSeed} from "../../../sim/prng"; +import {RandomTeams, MoveCounter} from "../gen9/teams"; +import {Utils} from '../../../lib'; + +// First, some lists of moves that can be used for rules throughout set generation. Taken from regular gen9. + +// Moves that drop stats: +const CONTRARY_MOVES = [ + 'armorcannon', 'closecombat', 'leafstorm', 'makeitrain', 'overheat', 'spinout', 'superpower', 'vcreate', +]; + +// Hazard-setting moves +const HAZARDS = [ + 'spikes', 'stealthrock', 'stickyweb', 'toxicspikes', +]; + +// Moves that switch the user out +const PIVOT_MOVES = [ + 'chillyreception', 'flipturn', 'partingshot', 'shedtail', 'teleport', 'uturn', 'voltswitch', +]; + +// Moves that boost Attack: +const PHYSICAL_SETUP = [ + 'bellydrum', 'bulkup', 'coil', 'curse', 'dragondance', 'honeclaws', 'howl', 'meditate', 'poweruppunch', 'swordsdance', 'tidyup', 'victorydance', +]; + +// Moves that restore HP: +const RECOVERY_MOVES = [ + 'healorder', 'milkdrink', 'moonlight', 'morningsun', 'recover', 'roost', 'shoreup', 'slackoff', 'softboiled', 'strengthsap', 'synthesis', +]; + +// Setup (stat-boosting) moves +const SETUP = [ + 'acidarmor', 'agility', 'autotomize', 'bellydrum', 'bulkup', 'calmmind', 'clangoroussoul', 'coil', 'cosmicpower', 'curse', + 'dragondance', 'flamecharge', 'growth', 'honeclaws', 'howl', 'irondefense', 'meditate', 'nastyplot', 'noretreat', 'poweruppunch', + 'quiverdance', 'raindance', 'rockpolish', 'shellsmash', 'shiftgear', 'snowscape', 'sunnyday', 'swordsdance', 'tailglow', 'tidyup', + 'trailblaze', 'workup', 'victorydance', +]; + +// Some moves that only boost Speed: +const SPEED_SETUP = [ + 'agility', 'autotomize', 'flamecharge', 'rockpolish', 'trailblaze', +]; + +// Moves that would want to generate together +const MOVE_PAIRS = [ + ['lightscreen', 'reflect'], + ['sleeptalk', 'rest'], + ['protect', 'wish'], +]; + +export class RandomBabyTeams extends RandomTeams { + constructor(format: Format | string, prng: PRNG | PRNGSeed | null) { + super(format, prng); + + // Overwrite enforcementcheckers where needed here + this.moveEnforcementCheckers['Bug'] = (movePool, moves, abilities, types, counter) => ( + movePool.includes('megahorn') || movePool.includes('xscissor') || + (!counter.get('Bug') && (types.includes('Electric') || types.includes('Water'))) + ); + } + + + cullMovePool( + types: string[], + moves: Set, + abilities: Set, + counter: MoveCounter, + movePool: string[], + teamDetails: RandomTeamsTypes.TeamDetails, + species: Species, + isLead: boolean, + isDoubles: boolean, + teraType: string, + role: RandomTeamsTypes.Role, + ): void { + if (moves.size + movePool.length <= this.maxMoveCount) return; + // If we have two unfilled moves and only one unpaired move, cull the unpaired move. + if (moves.size === this.maxMoveCount - 2) { + const unpairedMoves = [...movePool]; + for (const pair of MOVE_PAIRS) { + if (movePool.includes(pair[0]) && movePool.includes(pair[1])) { + this.fastPop(unpairedMoves, unpairedMoves.indexOf(pair[0])); + this.fastPop(unpairedMoves, unpairedMoves.indexOf(pair[1])); + } + } + if (unpairedMoves.length === 1) { + this.fastPop(movePool, movePool.indexOf(unpairedMoves[0])); + } + } + + // These moves are paired, and shouldn't appear if there isn't room for both. + if (moves.size === this.maxMoveCount - 1) { + for (const pair of MOVE_PAIRS) { + if (movePool.includes(pair[0]) && movePool.includes(pair[1])) { + this.fastPop(movePool, movePool.indexOf(pair[0])); + this.fastPop(movePool, movePool.indexOf(pair[1])); + } + } + } + + // Create list of all status moves to be used later + const statusMoves = this.dex.moves.all() + .filter(move => move.category === 'Status') + .map(move => move.id); + + // Team-based move culls + if (teamDetails.screens && movePool.length >= this.maxMoveCount + 2) { + if (movePool.includes('reflect')) this.fastPop(movePool, movePool.indexOf('reflect')); + if (movePool.includes('lightscreen')) this.fastPop(movePool, movePool.indexOf('lightscreen')); + if (moves.size + movePool.length <= this.maxMoveCount) return; + } + if (teamDetails.stickyWeb) { + if (movePool.includes('stickyweb')) this.fastPop(movePool, movePool.indexOf('stickyweb')); + if (moves.size + movePool.length <= this.maxMoveCount) return; + } + if (teamDetails.stealthRock) { + if (movePool.includes('stealthrock')) this.fastPop(movePool, movePool.indexOf('stealthrock')); + if (moves.size + movePool.length <= this.maxMoveCount) return; + } + if (teamDetails.defog || teamDetails.rapidSpin) { + if (movePool.includes('defog')) this.fastPop(movePool, movePool.indexOf('defog')); + if (movePool.includes('rapidspin')) this.fastPop(movePool, movePool.indexOf('rapidspin')); + if (moves.size + movePool.length <= this.maxMoveCount) return; + } + if (teamDetails.toxicSpikes) { + if (movePool.includes('toxicspikes')) this.fastPop(movePool, movePool.indexOf('toxicspikes')); + if (moves.size + movePool.length <= this.maxMoveCount) return; + } + if (teamDetails.spikes && teamDetails.spikes >= 2) { + if (movePool.includes('spikes')) this.fastPop(movePool, movePool.indexOf('spikes')); + if (moves.size + movePool.length <= this.maxMoveCount) return; + } + + // General incompatibilities + const incompatiblePairs = [ + // These moves don't mesh well with other aspects of the set + [SETUP, 'defog'], + [SETUP, PIVOT_MOVES], + [SETUP, HAZARDS], + [PHYSICAL_SETUP, PHYSICAL_SETUP], + [statusMoves, ['healingwish', 'trick', 'destinybond']], + + // These moves are redundant with each other + [ + ['alluringvoice', 'dazlinggleam', 'drainingkiss', 'moonblast'], + ['alluringvoice', 'dazlinggleam', 'drainingkiss', 'moonblast'], + ], + [['bulletseed', 'gigadrain', 'leafstorm', 'seedbomb'], ['bulletseed', 'gigadrain', 'leafstorm', 'seedbomb']], + [['thunderwave', 'toxic', 'willowisp'], ['thunderwave', 'toxic', 'willowisp']], + ['roar', 'yawn'], + ['dragonclaw', 'outrage'], + ['dracometeor', 'dragonpulse'], + ['toxic', 'toxicspikes'], + ['rockblast', 'stoneedge'], + ['bodyslam', 'doubleedge'], + ['gunkshot', 'poisonjab'], + ['liquidation', 'surf'], + ]; + + for (const pair of incompatiblePairs) this.incompatibleMoves(moves, movePool, pair[0], pair[1]); + } + + // Generate random moveset for a given species, role, tera type. + randomMoveset( + types: string[], + abilities: Set, + teamDetails: RandomTeamsTypes.TeamDetails, + species: Species, + isLead: boolean, + isDoubles: boolean, + movePool: string[], + teraType: string, + role: RandomTeamsTypes.Role, + ): Set { + const moves = new Set(); + let counter = this.queryMoves(moves, species, teraType, abilities); + this.cullMovePool(types, moves, abilities, counter, movePool, teamDetails, species, isLead, isDoubles, teraType, role); + + // If there are only four moves, add all moves and return early + if (movePool.length <= this.maxMoveCount) { + for (const moveid of movePool) { + moves.add(moveid); + } + return moves; + } + + // Helper function for (STAB-)move enforcement later on + const runEnforcementChecker = (checkerName: string) => { + if (!this.moveEnforcementCheckers[checkerName]) return false; + return this.moveEnforcementCheckers[checkerName]( + movePool, moves, abilities, types, counter, species, teamDetails, isLead, isDoubles, teraType, role + ); + }; + + if (role === 'Tera Blast user') { + counter = this.addMove('terablast', moves, types, abilities, teamDetails, species, isLead, isDoubles, + movePool, teraType, role); + } + + // Add required move (e.g. Relic Song for Meloetta-P) + if (species.requiredMove) { + const move = this.dex.moves.get(species.requiredMove).id; + counter = this.addMove(move, moves, types, abilities, teamDetails, species, isLead, isDoubles, + movePool, teraType, role); + } + + // Add other moves you really want to have, e.g. STAB, recovery, setup. + + // Enforce Facade if Guts is a possible ability + if (movePool.includes('facade') && abilities.has('Guts')) { + counter = this.addMove('facade', moves, types, abilities, teamDetails, species, isLead, isDoubles, + movePool, teraType, role); + } + + // Enforce Sticky Web + if (movePool.includes('stickyweb')) { + counter = this.addMove('stickyweb', moves, types, abilities, teamDetails, species, isLead, isDoubles, + movePool, teraType, role); + } + + // Enforce hazard removal on Bulky Support if the team doesn't already have it + if (role === 'Bulky Support' && !teamDetails.defog && !teamDetails.rapidSpin) { + if (movePool.includes('rapidspin')) { + counter = this.addMove('rapidspin', moves, types, abilities, teamDetails, species, isLead, isDoubles, + movePool, teraType, role); + } + if (movePool.includes('defog')) { + counter = this.addMove('defog', moves, types, abilities, teamDetails, species, isLead, isDoubles, + movePool, teraType, role); + } + } + + // Enforce Knock Off on pure Normal- and Fighting-types + if (types.length === 1 && (types.includes('Normal') || types.includes('Fighting'))) { + if (movePool.includes('knockoff')) { + counter = this.addMove('knockoff', moves, types, abilities, teamDetails, species, isLead, isDoubles, + movePool, teraType, role); + } + } + + // Enforce STAB priority + if (role === 'Wallbreaker') { + const priorityMoves = []; + for (const moveid of movePool) { + const move = this.dex.moves.get(moveid); + const moveType = this.getMoveType(move, species, abilities, teraType); + if ( + types.includes(moveType) && (move.priority > 0 || (moveid === 'grassyglide' && abilities.has('Grassy Surge'))) && + (move.basePower || move.basePowerCallback) + ) { + priorityMoves.push(moveid); + } + } + if (priorityMoves.length) { + const moveid = this.sample(priorityMoves); + counter = this.addMove(moveid, moves, types, abilities, teamDetails, species, isLead, isDoubles, + movePool, teraType, role); + } + } + + // Enforce STAB + for (const type of types) { + // Check if a STAB move of that type should be required + const stabMoves = []; + for (const moveid of movePool) { + const move = this.dex.moves.get(moveid); + const moveType = this.getMoveType(move, species, abilities, teraType); + if (!this.noStab.includes(moveid) && (move.basePower || move.basePowerCallback) && type === moveType) { + stabMoves.push(moveid); + } + } + while (runEnforcementChecker(type)) { + if (!stabMoves.length) break; + const moveid = this.sampleNoReplace(stabMoves); + counter = this.addMove(moveid, moves, types, abilities, teamDetails, species, isLead, isDoubles, + movePool, teraType, role); + } + } + + // Enforce Tera STAB + if (!counter.get('stabtera') && role !== 'Bulky Support') { + const stabMoves = []; + for (const moveid of movePool) { + const move = this.dex.moves.get(moveid); + const moveType = this.getMoveType(move, species, abilities, teraType); + if (!this.noStab.includes(moveid) && (move.basePower || move.basePowerCallback) && teraType === moveType) { + stabMoves.push(moveid); + } + } + if (stabMoves.length) { + const moveid = this.sample(stabMoves); + counter = this.addMove(moveid, moves, types, abilities, teamDetails, species, isLead, isDoubles, + movePool, teraType, role); + } + } + + // If no STAB move was added, add a STAB move + if (!counter.get('stab')) { + const stabMoves = []; + for (const moveid of movePool) { + const move = this.dex.moves.get(moveid); + const moveType = this.getMoveType(move, species, abilities, teraType); + if (!this.noStab.includes(moveid) && (move.basePower || move.basePowerCallback) && types.includes(moveType)) { + stabMoves.push(moveid); + } + } + if (stabMoves.length) { + const moveid = this.sample(stabMoves); + counter = this.addMove(moveid, moves, types, abilities, teamDetails, species, isLead, isDoubles, + movePool, teraType, role); + } + } + + // Enforce contrary moves + if (abilities.has('Contrary')) { + const contraryMoves = movePool.filter(moveid => CONTRARY_MOVES.includes(moveid)); + for (const moveid of contraryMoves) { + counter = this.addMove(moveid, moves, types, abilities, teamDetails, species, isLead, isDoubles, + movePool, teraType, role); + } + } + + // Enforce recovery + if (['Bulky Support', 'Bulky Attacker', 'Bulky Setup'].includes(role)) { + const recoveryMoves = movePool.filter(moveid => RECOVERY_MOVES.includes(moveid)); + if (recoveryMoves.length) { + const moveid = this.sample(recoveryMoves); + counter = this.addMove(moveid, moves, types, abilities, teamDetails, species, isLead, isDoubles, + movePool, teraType, role); + } + } + + // Enforce setup + if (role.includes('Setup') || role === 'Tera Blast user') { + // First, try to add a non-Speed setup move + const nonSpeedSetupMoves = movePool.filter(moveid => SETUP.includes(moveid) && !SPEED_SETUP.includes(moveid)); + if (nonSpeedSetupMoves.length) { + const moveid = this.sample(nonSpeedSetupMoves); + counter = this.addMove(moveid, moves, types, abilities, teamDetails, species, isLead, isDoubles, + movePool, teraType, role); + } else { + // No non-Speed setup moves, so add any (Speed) setup move + const setupMoves = movePool.filter(moveid => SETUP.includes(moveid)); + if (setupMoves.length) { + const moveid = this.sample(setupMoves); + counter = this.addMove(moveid, moves, types, abilities, teamDetails, species, isLead, isDoubles, + movePool, teraType, role); + } + } + } + + // Enforce a move not on the noSTAB list + if (!counter.damagingMoves.size) { + // Choose an attacking move + const attackingMoves = []; + for (const moveid of movePool) { + const move = this.dex.moves.get(moveid); + if (!this.noStab.includes(moveid) && (move.category !== 'Status')) attackingMoves.push(moveid); + } + if (attackingMoves.length) { + const moveid = this.sample(attackingMoves); + counter = this.addMove(moveid, moves, types, abilities, teamDetails, species, isLead, isDoubles, + movePool, teraType, role); + } + } + + // Enforce coverage move + if (!['Fast Support', 'Bulky Support'].includes(role) || species.id === 'magnemite') { + if (counter.damagingMoves.size === 1) { + // Find the type of the current attacking move + const currentAttackType = counter.damagingMoves.values().next().value.type; + // Choose an attacking move that is of different type to the current single attack + const coverageMoves = []; + for (const moveid of movePool) { + const move = this.dex.moves.get(moveid); + const moveType = this.getMoveType(move, species, abilities, teraType); + if (!this.noStab.includes(moveid) && (move.basePower || move.basePowerCallback)) { + if (currentAttackType !== moveType) coverageMoves.push(moveid); + } + } + if (coverageMoves.length) { + const moveid = this.sample(coverageMoves); + counter = this.addMove(moveid, moves, types, abilities, teamDetails, species, isLead, isDoubles, + movePool, teraType, role); + } + } + } + + // Add (moves.size < this.maxMoveCount) as a condition if moves is getting larger than 4 moves. + // If you want moves to be favored but not required, add something like && this.randomChance(1, 2) to your condition. + + // Choose remaining moves randomly from movepool and add them to moves list: + while (moves.size < this.maxMoveCount && movePool.length) { + if (moves.size + movePool.length <= this.maxMoveCount) { + for (const moveid of movePool) { + moves.add(moveid); + } + break; + } + const moveid = this.sample(movePool); + counter = this.addMove(moveid, moves, types, abilities, teamDetails, species, isLead, isDoubles, + movePool, teraType, role); + for (const pair of MOVE_PAIRS) { + if (moveid === pair[0] && movePool.includes(pair[1])) { + counter = this.addMove(pair[1], moves, types, abilities, teamDetails, species, isLead, isDoubles, + movePool, teraType, role); + } + if (moveid === pair[1] && movePool.includes(pair[0])) { + counter = this.addMove(pair[0], moves, types, abilities, teamDetails, species, isLead, isDoubles, + movePool, teraType, role); + } + } + } + return moves; + } + + getAbility( + types: string[], + moves: Set, + abilities: Set, + counter: MoveCounter, + teamDetails: RandomTeamsTypes.TeamDetails, + species: Species, + isLead: boolean, + isDoubles: boolean, + teraType: string, + role: RandomTeamsTypes.Role, + ): string { + const abilityData = Array.from(abilities).map(a => this.dex.abilities.get(a)); + Utils.sortBy(abilityData, abil => -abil.rating); + + if (abilityData.length <= 1) return abilityData[0].name; + + // Hard-code abilities here + // Culling method is inherited, but it makes some format-specific assumptions + // so it requires some adjusting here + if (species.id === 'applin') return 'Ripen'; + if (species.id === 'blitzle') return 'Sap Sipper'; + if (species.id === 'chinchou') return 'Volt Absorb'; + if (species.id === 'deerling') return 'Serene Grace'; + if (species.id === 'geodudealola') return 'Galvanize'; + if (species.id === 'gligar') return 'Immunity'; + if (species.id === 'rellor') return 'Shed Skin'; + if (species.id === 'riolu') return 'Inner Focus'; + if (species.id === 'shroomish') return 'Effect Spore'; + if (species.id === 'silicobra') return 'Shed Skin'; + if (species.id === 'timburr') return 'Guts'; + if (species.id === 'tyrogue') return 'Guts'; + + // Random abilities + if (species.id === 'litwick') return this.randomChance(1, 2) ? 'Flame Body' : 'Flash Fire'; + if (species.id === 'solosis') return this.randomChance(4, 5) ? 'Magic Guard' : 'Regenerator'; + if (species.id === 'tinkatink') return this.randomChance(1, 2) ? 'Mold Breaker' : 'Pickpocket'; + + // Abilities based on something else + if (species.id === 'cetoddle' && role === 'Wallbreaker') return 'Sheer Force'; + if (species.id === 'cranidos' && moves.has('trailblaze')) return 'Mold Breaker'; + if (species.id === 'murkrow' && role === 'Setup Sweeper') return 'Super Luck'; + + // Non-pokemon-specific ability rules + if (abilities.has('Harvest') && role === 'Bulky Attacker') return 'Harvest'; + if (abilities.has('Guts') && moves.has('facade')) return 'Guts'; + if (abilities.has('Quick Feet') && moves.has('facade')) return 'Quick Feet'; + if (abilities.has('Shed Skin') && moves.has('rest') && !moves.has('sleeptalk')) return 'Shed Skin'; + if (abilities.has('Slush Rush') && moves.has('snowscape')) return 'Slush Rush'; + if (abilities.has('Unburden') && moves.has('acrobatics')) return 'Unburden'; + if (moves.has('sunnyday') && abilities.has('Solar Power') && !abilities.has('Chlorophyll')) return 'Solar Power'; + + let abilityAllowed: Ability[] = []; + // Obtain a list of abilities that are allowed (not culled and rating>=1) + for (const ability of abilityData) { + if (ability.rating >= 1 && !this.shouldCullAbility( + ability.name, types, moves, abilities, counter, teamDetails, species, isLead, isDoubles, teraType, role + )) { + abilityAllowed.push(ability); + } + } + + if (!abilityAllowed.length) { + // Pickup is much better in babyrands, so if everything is culled favor it + if (abilities.has('Pickup')) return 'Pickup'; + // If all abilities are rejected, re-allow all abilities + for (const ability of abilityData) { + if (ability.rating > 0) abilityAllowed.push(ability); + } + if (!abilityAllowed.length) abilityAllowed = abilityData; + } + + if (abilityAllowed.length === 1) return abilityAllowed[0].name; + // Sort abilities by rating with an element of randomness + // All three abilities can be chosen + if (abilityAllowed[2] && abilityAllowed[0].rating - 0.5 <= abilityAllowed[2].rating) { + if (abilityAllowed[1].rating <= abilityAllowed[2].rating) { + if (this.randomChance(1, 2)) [abilityAllowed[1], abilityAllowed[2]] = [abilityAllowed[2], abilityAllowed[1]]; + } else { + if (this.randomChance(1, 3)) [abilityAllowed[1], abilityAllowed[2]] = [abilityAllowed[2], abilityAllowed[1]]; + } + if (abilityAllowed[0].rating <= abilityAllowed[1].rating) { + if (this.randomChance(2, 3)) [abilityAllowed[0], abilityAllowed[1]] = [abilityAllowed[1], abilityAllowed[0]]; + } else { + if (this.randomChance(1, 2)) [abilityAllowed[0], abilityAllowed[1]] = [abilityAllowed[1], abilityAllowed[0]]; + } + } else { + // Third ability cannot be chosen + if (abilityAllowed[0].rating <= abilityAllowed[1].rating) { + if (this.randomChance(1, 2)) [abilityAllowed[0], abilityAllowed[1]] = [abilityAllowed[1], abilityAllowed[0]]; + } else if (abilityAllowed[0].rating - 0.5 <= abilityAllowed[1].rating) { + if (this.randomChance(1, 3)) [abilityAllowed[0], abilityAllowed[1]] = [abilityAllowed[1], abilityAllowed[0]]; + } + } + + // After sorting, choose the first ability + return abilityAllowed[0].name; + } + + getPriorityItem( + ability: string, + types: string[], + moves: Set, + counter: MoveCounter, + teamDetails: RandomTeamsTypes.TeamDetails, + species: Species, + isLead: boolean, + isDoubles: boolean, + teraType: string, + role: RandomTeamsTypes.Role, + ) { + if (species.requiredItems) { + return this.sample(species.requiredItems); + } + + if (species.id === 'minccino') return 'Loaded Dice'; + if (species.id === 'nymble') return 'Silver Powder'; + + if (moves.has('focusenergy')) return 'Scope Lens'; + if (moves.has('thief')) return ''; + if (moves.has('trick')) return 'Choice Scarf'; + + if (moves.has('acrobatics')) return ability === 'Unburden' ? 'Oran Berry' : ''; + if (moves.has('auroraveil') || moves.has('lightscreen') && moves.has('reflect')) return 'Light Clay'; + if (moves.has('rest') && moves.has('sleeptalk')) return 'Eviolite'; + + if (ability === 'Guts' && moves.has('facade')) return 'Flame Orb'; + if (ability === 'Quick Feet') return 'Toxic Orb'; + + if (this.dex.getEffectiveness('Rock', species) >= 2) return 'Heavy-Duty Boots'; + if ( + ['Harvest', 'Ripen', 'Unburden'].includes(ability) || + moves.has('belch') || moves.has('bellydrum') + ) return 'Oran Berry'; + } + + getItem( + ability: string, + types: string[], + moves: Set, + counter: MoveCounter, + teamDetails: RandomTeamsTypes.TeamDetails, + species: Species, + isLead: boolean, + teraType: string, + role: RandomTeamsTypes.Role, + ): string { + if (role === 'Fast Attacker' && (!counter.get('Status') || (counter.get('Status') === 1 && moves.has('destinybond')))) { + return 'Choice Scarf'; + } + if (['Setup Sweeper', 'Wallbreaker'].includes(role)) { + return 'Life Orb'; + } + return 'Eviolite'; + } + + getLevel( + species: Species, + ): number { + if (this.adjustLevel) return this.adjustLevel; + // This should frankly always work, but 10 is the default level in case something bad happens + return this.randomSets[species.id]?.level || 10; + } + + getForme(species: Species): string { + if (typeof species.battleOnly === 'string') { + // Only change the forme. The species has custom moves, and may have different typing and requirements. + return species.battleOnly; + } + if (species.cosmeticFormes) return this.sample([species.name].concat(species.cosmeticFormes)); + + // Consolidate mostly-cosmetic formes, at least for the purposes of Random Battles + if (['Poltchageist', 'Sinistea'].includes(species.baseSpecies)) { + return this.sample([species.name].concat(species.otherFormes!)); + } + return species.name; + } + + randomSet( + s: string | Species, + teamDetails: RandomTeamsTypes.TeamDetails = {}, + isLead = false, + isDoubles = false + ): RandomTeamsTypes.RandomSet { + const species = this.dex.species.get(s); + const forme = this.getForme(species); + const sets = this.randomSets[species.id]["sets"]; + const possibleSets = []; + + const ruleTable = this.dex.formats.getRuleTable(this.format); + + for (const set of sets) { + // Prevent Tera Blast user if the team already has one, or if Terastallizion is prevented. + if ((teamDetails.teraBlast || ruleTable.has('terastalclause')) && set.role === 'Tera Blast user') { + continue; + } + possibleSets.push(set); + } + const set = this.sampleIfArray(possibleSets); + const role = set.role; + const movePool: string[] = []; + for (const movename of set.movepool) { + movePool.push(this.dex.moves.get(movename).id); + } + const teraTypes = set.teraTypes; + let teraType = this.sampleIfArray(teraTypes); + + let ability = ''; + let item = undefined; + + const evs = {hp: 85, atk: 85, def: 85, spa: 85, spd: 85, spe: 85}; + const ivs = {hp: 31, atk: 31, def: 31, spa: 31, spd: 31, spe: 31}; + + const types = species.types; + const abilities = new Set(Object.values(species.abilities)); + if (species.unreleasedHidden) abilities.delete(species.abilities.H); + + // Get moves + const moves = this.randomMoveset(types, abilities, teamDetails, species, isLead, isDoubles, movePool, teraType!, role); + const counter = this.queryMoves(moves, species, teraType!, abilities); + + // Get ability + ability = this.getAbility(types, moves, abilities, counter, teamDetails, species, isLead, isDoubles, teraType!, role); + + // Get items + // First, the priority items + item = this.getPriorityItem(ability, types, moves, counter, teamDetails, species, isLead, isDoubles, teraType!, role); + if (item === undefined) { + item = this.getItem(ability, types, moves, counter, teamDetails, species, isLead, teraType!, role); + } + + // Get level + const level = this.getLevel(species); + + // Prepare optimal HP for Life Orb mons with HP close to the X9 threshold + if (item === "Life Orb") { + let hp = Math.floor(Math.floor(2 * species.baseStats.hp + ivs.hp + Math.floor(evs.hp / 4) + 100) * level / 100 + 10); + const minimumHP = Math.floor(Math.floor(2 * species.baseStats.hp + 100) * level / 100 + 10); + const targetHP = Math.floor(hp / 10) * 10 - 1; + + // Don't subtract more than 3, that's not worth it + if (hp - targetHP <= 3 && minimumHP <= targetHP) { + // If setting evs to 0 is sufficient, decrement evs, otherwise decrement ivs with evs set to 0 + if (Math.floor(Math.floor(2 * species.baseStats.hp + ivs.hp + 100) * level / 100 + 10) >= targetHP) { + evs.hp = 0; + hp = Math.floor(Math.floor(2 * species.baseStats.hp + ivs.hp + Math.floor(evs.hp / 4) + 100) * level / 100 + 10); + while (hp > targetHP) { + ivs.hp -= 1; + hp = Math.floor(Math.floor(2 * species.baseStats.hp + ivs.hp + Math.floor(evs.hp / 4) + 100) * level / 100 + 10); + } + } else { + while (hp > targetHP) { + evs.hp -= 4; + hp = Math.floor(Math.floor(2 * species.baseStats.hp + ivs.hp + Math.floor(evs.hp / 4) + 100) * level / 100 + 10); + } + } + } + } + + // Minimize confusion damage + const noAttackStatMoves = [...moves].every(m => { + const move = this.dex.moves.get(m); + if (move.damageCallback || move.damage) return true; + if (move.id === 'shellsidearm') return false; + if (move.id === 'terablast' && species.baseStats.atk > species.baseStats.spa) return false; + return move.category !== 'Physical' || move.id === 'bodypress' || move.id === 'foulplay'; + }); + + if (noAttackStatMoves) { + evs.atk = 0; + ivs.atk = 0; + } + + if (moves.has('gyroball') || moves.has('trickroom')) { + evs.spe = 0; + ivs.spe = 0; + } + + // Enforce Tera Type after all set generation is done to prevent infinite generation + if (this.forceTeraType) teraType = this.forceTeraType; + + // shuffle moves to add more randomness to camomons + const shuffledMoves = Array.from(moves); + this.prng.shuffle(shuffledMoves); + return { + name: species.baseSpecies, + species: forme, + gender: species.gender, + shiny: this.randomChance(1, 1024), + level, + moves: shuffledMoves, + ability, + evs, + ivs, + item, + teraType, + role, + }; + } + + randomSets: {[species: string]: RandomTeamsTypes.RandomSpeciesData} = require('./sets.json'); + + randomBabyTeam() { + this.enforceNoDirectCustomBanlistChanges(); + + const seed = this.prng.seed; + const ruleTable = this.dex.formats.getRuleTable(this.format); + const pokemon: RandomTeamsTypes.RandomSet[] = []; + + // For Monotype + const isMonotype = !!this.forceMonotype || ruleTable.has('sametypeclause'); + const typePool = this.dex.types.names().filter(name => name !== "Stellar"); + const type = this.forceMonotype || this.sample(typePool); + + const baseFormes = new Set(); + + const typeCount = new Utils.Multiset(); + const typeComboCount = new Utils.Multiset(); + const typeWeaknesses = new Utils.Multiset(); + const typeDoubleWeaknesses = new Utils.Multiset(); + const teamDetails: RandomTeamsTypes.TeamDetails = {}; + + const pokemonList = Object.keys(this.randomSets); + const [pokemonPool, baseSpeciesPool] = this.getPokemonPool(type, pokemon, isMonotype, pokemonList); + + while (baseSpeciesPool.length && pokemon.length < this.maxTeamSize) { + const baseSpecies = this.sampleNoReplace(baseSpeciesPool); + const species = this.dex.species.get(this.sample(pokemonPool[baseSpecies])); + if (!species.exists) continue; + + // Limit to one of each species (Species Clause) + if (baseFormes.has(species.baseSpecies)) continue; + + // Illusion shouldn't be on the last slot + if (species.baseSpecies === 'Zorua' && pokemon.length >= (this.maxTeamSize - 1)) continue; + + const types = species.types; + const typeCombo = types.slice().sort().join(); + const weakToFreezeDry = ( + this.dex.getEffectiveness('Ice', species) > 0 || + (this.dex.getEffectiveness('Ice', species) > -2 && types.includes('Water')) + ); + // Dynamically scale limits for different team sizes. The default and minimum value is 1. + const limitFactor = Math.round(this.maxTeamSize / 6) || 1; + + if (!isMonotype && !this.forceMonotype) { + let skip = false; + + // Limit two of any type + for (const typeName of types) { + if ((typeCount.get(typeName) || 0) >= 2 * limitFactor) { + skip = true; + break; + } + } + if (skip) continue; + + // Limit three weak to any type, and one double weak to any type + for (const typeName of this.dex.types.names()) { + // it's weak to the type + if (this.dex.getEffectiveness(typeName, species) > 0) { + if ((typeWeaknesses.get(typeName) || 0) >= 3 * limitFactor) { + skip = true; + break; + } + } + if (this.dex.getEffectiveness(typeName, species) > 1) { + if ((typeDoubleWeaknesses.get(typeName) || 0) >= 1 * limitFactor) { + skip = true; + break; + } + } + } + if (skip) continue; + + // Limit four weak to Freeze-Dry + if (weakToFreezeDry) { + if ((typeWeaknesses.get('Freeze-Dry') || 0) >= 4 * limitFactor) continue; + } + } + + // Limit three of any type combination in Monotype + if (!this.forceMonotype && isMonotype && ((typeComboCount.get(typeCombo) || 0) >= 3 * limitFactor)) continue; + + const set: RandomTeamsTypes.RandomSet = this.randomSet(species, teamDetails, false, false); + pokemon.push(set); + + + // Don't bother tracking details for the last Pokemon + if (pokemon.length === this.maxTeamSize) break; + + // Now that our Pokemon has passed all checks, we can increment our counters + baseFormes.add(species.baseSpecies); + + // Increment type counters + for (const typeName of types) { + typeCount.add(typeName); + } + typeComboCount.add(typeCombo); + + // Increment weakness counter + for (const typeName of this.dex.types.names()) { + // it's weak to the type + if (this.dex.getEffectiveness(typeName, species) > 0) { + typeWeaknesses.add(typeName); + } + if (this.dex.getEffectiveness(typeName, species) > 1) { + typeDoubleWeaknesses.add(typeName); + } + } + if (weakToFreezeDry) typeWeaknesses.add('Freeze-Dry'); + + // Track what the team has + if (set.ability === 'Drizzle' || set.moves.includes('raindance')) teamDetails.rain = 1; + if (set.ability === 'Drought' || set.moves.includes('sunnyday')) teamDetails.sun = 1; + if (set.ability === 'Sand Stream') teamDetails.sand = 1; + if (set.ability === 'Snow Warning' || set.moves.includes('snowscape') || set.moves.includes('chillyreception')) { + teamDetails.snow = 1; + } + if (set.moves.includes('spikes')) { + teamDetails.spikes = (teamDetails.spikes || 0) + 1; + } + if (set.moves.includes('stealthrock')) teamDetails.stealthRock = 1; + if (set.moves.includes('stickyweb')) teamDetails.stickyWeb = 1; + if (set.moves.includes('toxicspikes') || set.ability === 'Toxic Debris') teamDetails.toxicSpikes = 1; + if (set.moves.includes('defog')) teamDetails.defog = 1; + if (set.moves.includes('rapidspin') || set.moves.includes('mortalspin')) teamDetails.rapidSpin = 1; + if (set.moves.includes('auroraveil') || (set.moves.includes('reflect') && set.moves.includes('lightscreen'))) { + teamDetails.screens = 1; + } + if (set.role === 'Tera Blast user') { + teamDetails.teraBlast = 1; + } + } + // large teams sometimes cannot be built, and monotype is also at user's own risk + if (pokemon.length < this.maxTeamSize && pokemon.length < 12 && !isMonotype) { + throw new Error(`Could not build a random team for ${this.format} (seed=${seed})`); + } + + return pokemon; + } +} + +export default RandomBabyTeams; diff --git a/server/chat-plugins/randombattles/index.ts b/server/chat-plugins/randombattles/index.ts index 5d86f13f24e2..6372ad77c38d 100644 --- a/server/chat-plugins/randombattles/index.ts +++ b/server/chat-plugins/randombattles/index.ts @@ -155,8 +155,9 @@ function getSets(species: string | Species, format: string | Format = 'gen9rando format = Dex.formats.get(format); species = dex.species.get(species); const isDoubles = format.gameType === 'doubles'; + const isBaby = format.team === 'randomBaby'; const setsFile = JSON.parse( - FS(`data/random-battles/${format.mod}/${isDoubles ? `doubles-` : ``}sets.json`) + FS(`data/random-battles/${format.mod}${isBaby ? 'baby' : ''}/${isDoubles ? 'doubles-' : ''}sets.json`) .readIfExistsSync() || '{}' ); const data = setsFile[species.id]; @@ -414,16 +415,20 @@ export const commands: Chat.ChatCommands = { randbats: 'randombattles', randomdoublesbattle: 'randombattles', randdubs: 'randombattles', + babyrandombattle: 'randombattles', + babyrands: 'randombattles', // randombattlenodmax: 'randombattles', // randsnodmax: 'randombattles', randombattles(target, room, user, connection, cmd) { if (!this.runBroadcast()) return; const battle = room?.battle; let isDoubles = cmd === 'randomdoublesbattle' || cmd === 'randdubs'; + let isBaby = cmd === 'babyrandombattle' || cmd === 'babyrands'; let isNoDMax = cmd.includes('nodmax'); if (battle) { if (battle.format.includes('nodmax')) isNoDMax = true; if (battle.format.includes('doubles') || battle.gameType === 'freeforall') isDoubles = true; + if (battle.format.includes('baby')) isBaby = true; } const args = target.split(','); @@ -445,9 +450,11 @@ export const commands: Chat.ChatCommands = { } const species = dex.species.get(searchResults[0].name); const extraFormatModifier = isLetsGo ? 'letsgo' : (dex.currentMod === 'gen8bdsp' ? 'bdsp' : ''); + const babyModifier = isBaby ? 'baby' : ''; const doublesModifier = isDoubles ? 'doubles' : ''; const noDMaxModifier = isNoDMax ? 'nodmax' : ''; - const format = dex.formats.get(`gen${dex.gen}${extraFormatModifier}random${doublesModifier}battle${noDMaxModifier}`); + const formatName = `gen${dex.gen}${extraFormatModifier}${babyModifier}random${doublesModifier}battle${noDMaxModifier}`; + const format = dex.formats.get(formatName); const movesets = []; let setCount = 0; diff --git a/server/chat-plugins/randombattles/winrates.ts b/server/chat-plugins/randombattles/winrates.ts index 4e3ba6cf1466..b2a9ac8a307a 100644 --- a/server/chat-plugins/randombattles/winrates.ts +++ b/server/chat-plugins/randombattles/winrates.ts @@ -46,6 +46,7 @@ function getDefaultStats() { // so i'm not spending the time to add commands to toggle this gen9randombattle: {mons: {}}, gen9randomdoublesbattle: {mons: {}}, + gen9babyrandombattle: {mons: {}}, gen9superstaffbrosultimate: {mons: {}}, gen8randombattle: {mons: {}}, gen7randombattle: {mons: {}}, @@ -135,6 +136,16 @@ function getSpeciesName(set: PokemonSet, format: Format) { return item.megaStone; } else if (species === "Rayquaza" && moves.includes('Dragon Ascent') && !item.zMove && megaRayquazaPossible) { return "Rayquaza-Mega"; + } else if (species === "Poltchageist-Artisan") { // Babymons from here on out + return "Poltchageist"; + } else if (species === "Shellos-East") { + return "Shellos"; + } else if (species === "Sinistea-Antique") { + return "Sinistea"; + } else if (species.startsWith("Deerling-")) { + return "Deerling"; + } else if (species.startsWith("Flabe\u0301be\u0301-")) { + return "Flabe\u0301be\u0301"; } else { return species; } @@ -168,8 +179,8 @@ async function collectStats(battle: RoomBattle, winner: ID, players: ID[]) { eloFloor = 1150; } else if (format.mod !== `gen${Dex.gen}`) { eloFloor = 1300; - } else if (format.gameType === 'doubles') { - // may need to be raised again if doubles ladder takes off + } else if (format.gameType === 'doubles' || format.team === 'randomBaby') { + // may need to be raised again if either ladder takes off eloFloor = 1300; } if (!formatData || (format.mod !== 'gen9ssb' && battle.rated < eloFloor) || !winner) return; diff --git a/sim/teams.ts b/sim/teams.ts index 56e5d59fdfa6..323c7879e788 100644 --- a/sim/teams.ts +++ b/sim/teams.ts @@ -622,6 +622,8 @@ export const Teams = new class Teams { TeamGenerator = require(Dex.forFormat(format).dataDir + '/cg-teams').default; } else if (toID(format).includes('gen9superstaffbrosultimate')) { TeamGenerator = require(`../data/mods/gen9ssb/random-teams`).default; + } else if (toID(format).includes('gen9babyrandombattle')) { + TeamGenerator = require(`../data/random-battles/gen9baby/teams`).default; } else { TeamGenerator = require(`../data/random-battles/${format.mod}/teams`).default; } diff --git a/test/random-battles/gen9.js b/test/random-battles/gen9.js index daf5f9467d99..e4241b184ba6 100644 --- a/test/random-battles/gen9.js +++ b/test/random-battles/gen9.js @@ -66,6 +66,60 @@ describe('[Gen 9] Random Battle (slow)', () => { }); }); +describe('[Gen 9] Baby Random Battle (slow)', () => { + const options = {format: 'gen9babyrandombattle'}; + const setsJSON = require(`../../dist/data/random-battles/gen9baby/sets.json`); + const dex = Dex.forFormat(options.format); + + it('all Pokemon should have 4 moves', function () { + // This test takes more than 2000ms + testTeam({...options, rounds: 100}, team => { + for (const pokemon of team) assert(pokemon.moves.length === 4); + }); + }); + + it('all moves on all sets should be obtainable', function () { + const generator = Teams.getGenerator(options.format); + const rounds = 100; + for (const pokemon of Object.keys(setsJSON)) { + const species = dex.species.get(pokemon); + const sets = setsJSON[pokemon]["sets"]; + const types = species.types; + const abilities = new Set(Object.values(species.abilities)); + if (species.unreleasedHidden) abilities.delete(species.abilities.H); + for (const set of sets) { + const role = set.role; + const moves = new Set(set.movepool.map(m => dex.moves.get(m).id)); + const teraTypes = set.teraTypes; + let teamDetails = {}; + // Go through all possible teamDetails combinations, if necessary + for (let j = 0; j < rounds; j++) { + // Generate a moveset as the lead, teamDetails is always empty for this + const teraType = teraTypes[j % teraTypes.length]; + const movePool = set.movepool.map(m => dex.moves.get(m).id); + const moveSet = generator.randomMoveset(types, abilities, {}, species, true, false, movePool, teraType, role); + for (const move of moveSet) moves.delete(move); + if (!moves.size) break; + // Generate a moveset for each combination of relevant teamDetails + for (let i = 0; i < 8; i++) { + const defog = i % 2; + const stealthRock = Math.floor(i / 2) % 2; + const stickyWeb = Math.floor(i / 4) % 2; + teamDetails = {defog, stealthRock, stickyWeb}; + // randomMoveset() deletes moves from the movepool, so recreate it every time + const movePool = set.movepool.map(m => dex.moves.get(m).id); + const moveSet = generator.randomMoveset(types, abilities, teamDetails, species, false, false, movePool, teraType, role); + for (const move of moveSet) moves.delete(move); + if (!moves.size) break; + } + if (!moves.size) break; + } + assert.false(moves.size, `The following moves on ${species.name} are unused: ${[...moves].join(', ')}`); + } + } + }); +}); + describe('[Gen 9] Monotype Random Battle (slow)', () => { const options = {format: 'gen9monotyperandombattle'}; From 2ea3ea047b013e08338fff7350045c0652e62b1b Mon Sep 17 00:00:00 2001 From: livid washed <115855253+livid-washed@users.noreply.github.com> Date: Sun, 2 Jun 2024 02:31:34 +1000 Subject: [PATCH 005/139] Gen 6 Battle Factory: optimize Probopass set (#10327) --- data/random-battles/gen6/factory-sets.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/random-battles/gen6/factory-sets.json b/data/random-battles/gen6/factory-sets.json index ad8e741a1f5e..12918022ce0f 100644 --- a/data/random-battles/gen6/factory-sets.json +++ b/data/random-battles/gen6/factory-sets.json @@ -9487,7 +9487,7 @@ "item": "Leftovers", "ability": "Sturdy", "evs": {"hp": 252, "atk": 0, "def": 4, "spa": 0, "spd": 252, "spe": 0}, - "nature": "Modest", + "nature": "Calm", "moves": [["Stealth Rock"], ["Flash Cannon"], ["Volt Switch"], ["Earth Power", "Toxic", "Thunder Wave"]] } ] @@ -10316,4 +10316,4 @@ ] } } -} \ No newline at end of file +} From e055d629b33bfc4f1e7e5c79f3aeb47f18ada00f Mon Sep 17 00:00:00 2001 From: ACakeWearingAHat <45981036+ACakeWearingAHat@users.noreply.github.com> Date: Sat, 1 Jun 2024 11:32:40 -0500 Subject: [PATCH 006/139] Randomized format set updates (#10326) * Randomized format set updates * more * stuff * steekl * Alphabetically sort Wormadam * fix some things * fix tests * Gen 4 Spinda * Fix gen 7 test * Might as well adjust the other gens tests * taxel hitmontop * Gen 6-7 Psychic Hoopa * Gen 5 Keldeo: HP ice instead of icy wind * tests thing * Remove fire punch deos gen 6 --------- Co-authored-by: Kelvin Liu <115855253+livid-washed@users.noreply.github.com> --- data/random-battles/gen3/sets.json | 4 + data/random-battles/gen4/sets.json | 18 +- data/random-battles/gen5/sets.json | 33 ++-- data/random-battles/gen6/sets.json | 39 ++--- data/random-battles/gen6/teams.ts | 6 +- data/random-battles/gen7/sets.json | 51 +++--- data/random-battles/gen7/teams.ts | 12 +- data/random-battles/gen8/data.json | 6 +- data/random-battles/gen9/doubles-sets.json | 10 +- data/random-battles/gen9/sets.json | 192 +++++++++++++-------- data/random-battles/gen9/teams.ts | 31 ++-- test/random-battles/gen2.js | 4 +- test/random-battles/gen3.js | 4 +- test/random-battles/gen4.js | 6 +- test/random-battles/gen5.js | 6 +- test/random-battles/gen6.js | 6 +- test/random-battles/gen7.js | 7 +- 17 files changed, 240 insertions(+), 195 deletions(-) diff --git a/data/random-battles/gen3/sets.json b/data/random-battles/gen3/sets.json index db1e9ae3b45d..3b8b0b3ced0d 100644 --- a/data/random-battles/gen3/sets.json +++ b/data/random-battles/gen3/sets.json @@ -2050,6 +2050,10 @@ { "role": "Generalist", "movepool": ["batonpass", "bodyslam", "healbell", "protect", "wish"] + }, + { + "role": "Setup Sweeper", + "movepool": ["batonpass", "calmmind", "icebeam", "thunderbolt"] } ] }, diff --git a/data/random-battles/gen4/sets.json b/data/random-battles/gen4/sets.json index f8109dabc2e0..4707e69d717d 100644 --- a/data/random-battles/gen4/sets.json +++ b/data/random-battles/gen4/sets.json @@ -81,9 +81,13 @@ "fearow": { "level": 86, "sets": [ + { + "role": "Fast Attacker", + "movepool": ["doubleedge", "drillpeck", "quickattack", "return", "uturn"] + }, { "role": "Wallbreaker", - "movepool": ["doubleedge", "drillpeck", "pursuit", "quickattack", "return", "uturn"] + "movepool": ["doubleedge", "drillpeck", "pursuit", "return", "uturn"] } ] }, @@ -1680,11 +1684,15 @@ "sets": [ { "role": "Bulky Support", - "movepool": ["healbell", "protect", "return", "thunderwave", "wish"] + "movepool": ["doubleedge", "protect", "thunderwave", "toxic", "wish"] }, { "role": "Fast Support", "movepool": ["doubleedge", "fakeout", "healbell", "suckerpunch", "thunderwave", "toxic"] + }, + { + "role": "Bulky Setup", + "movepool": ["batonpass", "calmmind", "icebeam", "thunderbolt"] } ] }, @@ -1866,7 +1874,7 @@ "sets": [ { "role": "Staller", - "movepool": ["bodyslam", "encore", "shadowball", "teeterdance", "toxic"] + "movepool": ["encore", "protect", "seismictoss", "shadowball", "substitute", "toxic"] }, { "role": "Bulky Support", @@ -3170,10 +3178,6 @@ "giratina": { "level": 69, "sets": [ - { - "role": "Fast Support", - "movepool": ["dragonpulse", "rest", "roar", "sleeptalk", "willowisp"] - }, { "role": "Bulky Setup", "movepool": ["calmmind", "dragonpulse", "rest", "sleeptalk"] diff --git a/data/random-battles/gen5/sets.json b/data/random-battles/gen5/sets.json index 0c4410d7463b..1455d4c0d3d4 100644 --- a/data/random-battles/gen5/sets.json +++ b/data/random-battles/gen5/sets.json @@ -92,8 +92,7 @@ "sets": [ { "role": "Wallbreaker", - "movepool": ["doubleedge", "drillpeck", "drillrun", "pursuit", "quickattack", "return", "uturn"], - "preferredTypes": ["Normal"] + "movepool": ["doubleedge", "drillpeck", "drillrun", "return", "uturn"] }, { "role": "Fast Attacker", @@ -641,15 +640,10 @@ "pinsir": { "level": 87, "sets": [ - { - "role": "Bulky Attacker", - "movepool": ["closecombat", "earthquake", "stealthrock", "stoneedge", "xscissor"], - "preferredTypes": ["Rock"] - }, { "role": "Fast Attacker", - "movepool": ["closecombat", "earthquake", "quickattack", "stoneedge", "swordsdance", "xscissor"], - "preferredTypes": ["Ground"] + "movepool": ["closecombat", "earthquake", "stealthrock", "stoneedge", "swordsdance", "xscissor"], + "preferredTypes": ["Rock"] } ] }, @@ -912,7 +906,8 @@ "sets": [ { "role": "Bulky Support", - "movepool": ["airslash", "heatwave", "hypervoice", "roost", "toxic", "whirlwind"] + "movepool": ["airslash", "heatwave", "hypervoice", "roost", "toxic", "whirlwind"], + "preferredTypes": ["Normal"] } ] }, @@ -2297,7 +2292,7 @@ "movepool": ["icebeam", "surf", "thunder", "waterspout"] }, { - "role": "Bulky Support", + "role": "Bulky Setup", "movepool": ["calmmind", "icebeam", "rest", "sleeptalk", "surf", "thunder"] } ] @@ -2787,6 +2782,10 @@ { "role": "Staller", "movepool": ["icebeam", "protect", "scald", "toxic", "uturn"] + }, + { + "role": "Bulky Attacker", + "movepool": ["hiddenpowergrass", "icebeam", "scald", "toxic"] } ] }, @@ -3536,7 +3535,7 @@ "sets": [ { "role": "Setup Sweeper", - "movepool": ["focusblast", "hiddenpowergrass", "hydropump", "icebeam", "nastyplot", "substitute"], + "movepool": ["grassknot", "hydropump", "icebeam", "nastyplot", "substitute"], "preferredTypes": ["Ice"] } ] @@ -4158,7 +4157,7 @@ "level": 79, "sets": [ { - "role": "Fast Attacker", + "role": "Setup Sweeper", "movepool": ["honeclaws", "ironhead", "rockslide", "superpower", "xscissor"], "preferredTypes": ["Fighting"] } @@ -4344,12 +4343,16 @@ "level": 77, "sets": [ { - "role": "Fast Attacker", - "movepool": ["calmmind", "hiddenpowerelectric", "hiddenpowerflying", "hydropump", "icywind", "scald", "secretsword"] + "role": "Setup Sweeper", + "movepool": ["calmmind", "hiddenpowerelectric", "hiddenpowerflying", "hiddenpowerice", "hydropump", "scald", "secretsword"] }, { "role": "Bulky Setup", "movepool": ["calmmind", "scald", "secretsword", "substitute"] + }, + { + "role": "Fast Attacker", + "movepool": ["focusblast", "hydropump", "scald", "secretsword"] } ] }, diff --git a/data/random-battles/gen6/sets.json b/data/random-battles/gen6/sets.json index 16c98b35d6d0..f2b6dccaf1a5 100644 --- a/data/random-battles/gen6/sets.json +++ b/data/random-battles/gen6/sets.json @@ -134,8 +134,7 @@ "sets": [ { "role": "Wallbreaker", - "movepool": ["doubleedge", "drillpeck", "drillrun", "pursuit", "return", "uturn"], - "preferredTypes": ["Normal"] + "movepool": ["doubleedge", "drillpeck", "drillrun", "return", "uturn"] } ] }, @@ -1006,7 +1005,8 @@ "sets": [ { "role": "Bulky Support", - "movepool": ["airslash", "defog", "hypervoice", "roost", "toxic", "whirlwind"] + "movepool": ["airslash", "defog", "hypervoice", "roost", "toxic"], + "preferredTypes": ["Normal"] } ] }, @@ -1472,11 +1472,6 @@ { "role": "Bulky Support", "movepool": ["earthquake", "knockoff", "rapidspin", "stealthrock", "stoneedge", "toxic"] - }, - { - "role": "Bulky Attacker", - "movepool": ["earthquake", "gunkshot", "iceshard", "knockoff", "rapidspin", "stoneedge"], - "preferredTypes": ["Dark"] } ] }, @@ -2372,7 +2367,7 @@ "sets": [ { "role": "Staller", - "movepool": ["healbell", "knockoff", "psychic", "recover", "taunt", "toxic"] + "movepool": ["healbell", "knockoff", "psychic", "recover", "toxic"] }, { "role": "Bulky Setup", @@ -2694,7 +2689,7 @@ "sets": [ { "role": "Wallbreaker", - "movepool": ["extremespeed", "firepunch", "icebeam", "knockoff", "psychoboost", "stealthrock", "superpower"], + "movepool": ["extremespeed", "icebeam", "knockoff", "psychoboost", "stealthrock", "superpower"], "preferredTypes": ["Fighting"] } ] @@ -2704,7 +2699,7 @@ "sets": [ { "role": "Wallbreaker", - "movepool": ["extremespeed", "firepunch", "icebeam", "knockoff", "psychoboost", "superpower"], + "movepool": ["extremespeed", "icebeam", "knockoff", "psychoboost", "superpower"], "preferredTypes": ["Fighting"] } ] @@ -2865,7 +2860,7 @@ "sets": [ { "role": "Staller", - "movepool": ["earthquake", "protect", "stealthrock", "suckerpunch", "toxic"] + "movepool": ["earthquake", "infestation", "protect", "stealthrock", "toxic"] } ] }, @@ -2874,7 +2869,7 @@ "sets": [ { "role": "Staller", - "movepool": ["flashcannon", "protect", "stealthrock", "suckerpunch", "toxic"] + "movepool": ["flashcannon", "infestation", "protect", "stealthrock", "toxic"] } ] }, @@ -3304,10 +3299,6 @@ "leafeon": { "level": 88, "sets": [ - { - "role": "Bulky Attacker", - "movepool": ["healbell", "knockoff", "leafblade", "synthesis", "toxic"] - }, { "role": "Setup Sweeper", "movepool": ["doubleedge", "knockoff", "leafblade", "swordsdance", "synthesis", "xscissor"], @@ -3952,7 +3943,7 @@ "sets": [ { "role": "Setup Sweeper", - "movepool": ["focusblast", "hydropump", "icebeam", "nastyplot", "substitute"], + "movepool": ["grassknot", "hydropump", "icebeam", "nastyplot", "substitute"], "preferredTypes": ["Ice"] } ] @@ -4601,7 +4592,7 @@ "level": 79, "sets": [ { - "role": "Fast Attacker", + "role": "Setup Sweeper", "movepool": ["honeclaws", "ironhead", "rockslide", "superpower", "xscissor"], "preferredTypes": ["Fighting"] } @@ -4796,12 +4787,16 @@ "level": 79, "sets": [ { - "role": "Fast Attacker", + "role": "Setup Sweeper", "movepool": ["calmmind", "hiddenpowerelectric", "hiddenpowerflying", "hydropump", "icywind", "scald", "secretsword"] }, { "role": "Bulky Setup", "movepool": ["calmmind", "hydropump", "scald", "secretsword", "substitute"] + }, + { + "role": "Fast Attacker", + "movepool": ["focusblast", "hydropump", "scald", "secretsword"] } ] }, @@ -5236,7 +5231,7 @@ "sets": [ { "role": "Bulky Support", - "movepool": ["avalanche", "earthquake", "rapidspin", "recover", "roar", "toxic"] + "movepool": ["avalanche", "curse", "earthquake", "rapidspin", "recover"] } ] }, @@ -5300,7 +5295,7 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["focusblast", "nastyplot", "psyshock", "shadowball", "trick"] + "movepool": ["focusblast", "nastyplot", "psychic", "psyshock", "shadowball", "trick"] } ] }, diff --git a/data/random-battles/gen6/teams.ts b/data/random-battles/gen6/teams.ts index 756a671cf25e..f0470f103834 100644 --- a/data/random-battles/gen6/teams.ts +++ b/data/random-battles/gen6/teams.ts @@ -29,8 +29,8 @@ const SETUP = [ // Moves that shouldn't be the only STAB moves: const NO_STAB = [ 'aquajet', 'bulletpunch', 'clearsmog', 'dragontail', 'eruption', 'explosion', 'fakeout', 'flamecharge', - 'futuresight', 'iceshard', 'icywind', 'incinerate', 'machpunch', 'nuzzle', 'pluck', 'poweruppunch', 'pursuit', - 'quickattack', 'rapidspin', 'reversal', 'selfdestruct', 'shadowsneak', 'skyattack', 'skydrop', 'snarl', + 'futuresight', 'iceshard', 'icywind', 'incinerate', 'infestation', 'machpunch', 'nuzzle', 'pluck', 'poweruppunch', + 'pursuit', 'quickattack', 'rapidspin', 'reversal', 'selfdestruct', 'shadowsneak', 'skyattack', 'skydrop', 'snarl', 'suckerpunch', 'uturn', 'watershuriken', 'vacuumwave', 'voltswitch', 'waterspout', ]; // Hazard-setting moves @@ -276,7 +276,7 @@ export class RandomGen6Teams extends RandomGen7Teams { if (moves.size + movePool.length <= this.maxMoveCount) return; } if (species.baseSpecies === 'Wormadam' && role === 'Staller') { - if (movePool.includes('suckerpunch')) this.fastPop(movePool, movePool.indexOf('suckerpunch')); + if (movePool.includes('infestation')) this.fastPop(movePool, movePool.indexOf('infestation')); if (moves.size + movePool.length <= this.maxMoveCount) return; } } diff --git a/data/random-battles/gen7/sets.json b/data/random-battles/gen7/sets.json index 1ef990360541..21f87addc055 100644 --- a/data/random-battles/gen7/sets.json +++ b/data/random-battles/gen7/sets.json @@ -162,8 +162,7 @@ "sets": [ { "role": "Wallbreaker", - "movepool": ["doubleedge", "drillpeck", "drillrun", "pursuit", "return", "uturn"], - "preferredTypes": ["Normal"] + "movepool": ["doubleedge", "drillpeck", "drillrun", "return", "uturn"] }, { "role": "Setup Sweeper", @@ -1197,7 +1196,7 @@ "sets": [ { "role": "Bulky Support", - "movepool": ["defog", "hurricane", "hypervoice", "roost", "toxic", "whirlwind"] + "movepool": ["defog", "hurricane", "hypervoice", "roost", "toxic"] } ] }, @@ -1411,8 +1410,11 @@ "sets": [ { "role": "Setup Sweeper", - "movepool": ["dazzlinggleam", "hypervoice", "nastyplot", "psychic", "psyshock", "substitute", "thunderbolt"], - "preferredTypes": ["Psychic"] + "movepool": ["dazzlinggleam", "nastyplot", "psychic", "psyshock", "substitute", "thunderbolt"] + }, + { + "role": "Fast Attacker", + "movepool": ["hypervoice", "nastyplot", "psyshock", "thunderbolt"] } ] }, @@ -1659,11 +1661,6 @@ { "role": "Bulky Support", "movepool": ["earthquake", "knockoff", "rapidspin", "stealthrock", "stoneedge", "toxic"] - }, - { - "role": "Bulky Attacker", - "movepool": ["earthquake", "gunkshot", "iceshard", "knockoff", "rapidspin", "stoneedge"], - "preferredTypes": ["Dark"] } ] }, @@ -2574,7 +2571,7 @@ "sets": [ { "role": "Staller", - "movepool": ["defog", "healbell", "knockoff", "psychic", "recover", "taunt", "toxic"] + "movepool": ["defog", "healbell", "knockoff", "psychic", "recover", "toxic"] }, { "role": "Bulky Setup", @@ -3084,7 +3081,7 @@ "sets": [ { "role": "Setup Sweeper", - "movepool": ["bugbuzz", "gigadrain", "hiddenpowerground", "hiddenpowerrock", "leafstorm", "quiverdance"] + "movepool": ["bugbuzz", "energyball", "gigadrain", "hiddenpowerground", "hiddenpowerrock", "quiverdance"] } ] }, @@ -3093,7 +3090,7 @@ "sets": [ { "role": "Staller", - "movepool": ["earthquake", "protect", "stealthrock", "suckerpunch", "toxic"] + "movepool": ["earthquake", "infestation", "protect", "stealthrock", "toxic"] } ] }, @@ -3102,7 +3099,7 @@ "sets": [ { "role": "Staller", - "movepool": ["flashcannon", "protect", "stealthrock", "suckerpunch", "toxic"] + "movepool": ["flashcannon", "infestation", "protect", "stealthrock", "toxic"] } ] }, @@ -3552,10 +3549,6 @@ "leafeon": { "level": 88, "sets": [ - { - "role": "Bulky Attacker", - "movepool": ["healbell", "knockoff", "leafblade", "synthesis", "toxic"] - }, { "role": "Setup Sweeper", "movepool": ["doubleedge", "knockoff", "leafblade", "swordsdance", "synthesis", "xscissor"], @@ -4245,7 +4238,7 @@ "sets": [ { "role": "Setup Sweeper", - "movepool": ["focusblast", "hydropump", "icebeam", "nastyplot", "substitute"], + "movepool": ["grassknot", "hydropump", "icebeam", "nastyplot", "substitute"], "preferredTypes": ["Ice"] } ] @@ -4918,7 +4911,7 @@ "level": 81, "sets": [ { - "role": "Fast Attacker", + "role": "Setup Sweeper", "movepool": ["honeclaws", "ironhead", "rockslide", "superpower", "xscissor"], "preferredTypes": ["Fighting"] } @@ -5152,12 +5145,16 @@ "level": 80, "sets": [ { - "role": "Fast Attacker", + "role": "Setup Sweeper", "movepool": ["calmmind", "hiddenpowerelectric", "hiddenpowerflying", "hydropump", "icywind", "scald", "secretsword"] }, { "role": "Bulky Setup", "movepool": ["calmmind", "hydropump", "scald", "secretsword", "substitute"] + }, + { + "role": "Fast Attacker", + "movepool": ["focusblast", "hydropump", "scald", "secretsword"] } ] }, @@ -5279,8 +5276,7 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["darkpulse", "fireblast", "hypervoice", "solarbeam", "sunnyday", "willowisp"], - "preferredTypes": ["Normal"] + "movepool": ["darkpulse", "fireblast", "hypervoice", "solarbeam", "sunnyday", "willowisp"] }, { "role": "Z-Move user", @@ -5456,8 +5452,7 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["darkpulse", "glare", "hypervoice", "surf", "thunderbolt", "voltswitch"], - "preferredTypes": ["Normal"] + "movepool": ["darkpulse", "glare", "hypervoice", "surf", "thunderbolt", "voltswitch"] }, { "role": "Setup Sweeper", @@ -5613,7 +5608,7 @@ "sets": [ { "role": "Bulky Support", - "movepool": ["avalanche", "earthquake", "rapidspin", "recover", "roar", "toxic"] + "movepool": ["avalanche", "curse", "earthquake", "rapidspin", "recover"] } ] }, @@ -5702,7 +5697,7 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["focusblast", "nastyplot", "psyshock", "shadowball", "trick"] + "movepool": ["focusblast", "nastyplot", "psychic", "psyshock", "shadowball", "trick"] } ] }, @@ -6352,7 +6347,7 @@ }, { "role": "Bulky Attacker", - "movepool": ["defog", "dracometeor", "fireblast", "glare", "hypervoice", "roost"] + "movepool": ["dracometeor", "fireblast", "glare", "hypervoice", "roost"] } ] }, diff --git a/data/random-battles/gen7/teams.ts b/data/random-battles/gen7/teams.ts index b222f50c02bd..3ef8c21d743b 100644 --- a/data/random-battles/gen7/teams.ts +++ b/data/random-battles/gen7/teams.ts @@ -62,9 +62,9 @@ const SETUP = [ // Moves that shouldn't be the only STAB moves: const NO_STAB = [ 'accelerock', 'aquajet', 'bulletpunch', 'clearsmog', 'dragontail', 'eruption', 'explosion', - 'fakeout', 'firstimpression', 'flamecharge', 'futuresight', 'iceshard', 'icywind', 'incinerate', 'machpunch', 'nuzzle', - 'pluck', 'poweruppunch', 'pursuit', 'quickattack', 'rapidspin', 'reversal', 'selfdestruct', 'shadowsneak', 'skyattack', - 'skydrop', 'snarl', 'suckerpunch', 'uturn', 'watershuriken', 'vacuumwave', 'voltswitch', 'waterspout', + 'fakeout', 'firstimpression', 'flamecharge', 'futuresight', 'iceshard', 'icywind', 'incinerate', 'infestation', 'machpunch', + 'nuzzle', 'pluck', 'poweruppunch', 'pursuit', 'quickattack', 'rapidspin', 'reversal', 'selfdestruct', 'shadowsneak', + 'skyattack', 'skydrop', 'snarl', 'suckerpunch', 'uturn', 'watershuriken', 'vacuumwave', 'voltswitch', 'waterspout', ]; // Hazard-setting moves const HAZARDS = [ @@ -131,7 +131,7 @@ export class RandomGen7Teams extends RandomGen8Teams { !counter.get('Ice') || (!moves.has('blizzard') && movePool.includes('freezedry')) || abilities.has('Refrigerate') && (movePool.includes('return') || movePool.includes('hypervoice')) ), - Normal: movePool => movePool.includes('boomburst'), + Normal: movePool => (movePool.includes('boomburst') || movePool.includes('hypervoice')), Poison: (movePool, moves, abilities, types, counter) => !counter.get('Poison'), Psychic: (movePool, moves, abilities, types, counter) => ( !counter.get('Psychic') && ( @@ -343,7 +343,7 @@ export class RandomGen7Teams extends RandomGen8Teams { [['fierydance', 'firelash', 'lavaplume'], ['fireblast', 'magmastorm']], [['flamethrower', 'flareblitz'], ['fireblast', 'overheat']], ['hornleech', 'woodhammer'], - [['gigadrain', 'leafstorm'], ['leafstorm', 'petaldance', 'powerwhip']], + [['gigadrain', 'leafstorm'], ['energyball', 'leafstorm', 'petaldance', 'powerwhip']], ['wildcharge', 'thunderbolt'], ['gunkshot', 'poisonjab'], [['drainpunch', 'focusblast'], ['closecombat', 'highjumpkick', 'superpower']], @@ -395,7 +395,7 @@ export class RandomGen7Teams extends RandomGen8Teams { if (moves.size + movePool.length <= this.maxMoveCount) return; } if (species.baseSpecies === 'Wormadam' && role === 'Staller') { - if (movePool.includes('suckerpunch')) this.fastPop(movePool, movePool.indexOf('suckerpunch')); + if (movePool.includes('infestation')) this.fastPop(movePool, movePool.indexOf('infestation')); if (moves.size + movePool.length <= this.maxMoveCount) return; } } diff --git a/data/random-battles/gen8/data.json b/data/random-battles/gen8/data.json index a7002196a1c1..c3ab34d4fb8a 100644 --- a/data/random-battles/gen8/data.json +++ b/data/random-battles/gen8/data.json @@ -215,7 +215,7 @@ }, "cloyster": { "level": 80, - "moves": ["explosion", "hydropump", "iciclespear", "rockblast", "shellsmash"], + "moves": ["hydropump", "iciclespear", "rockblast", "shellsmash"], "doublesLevel": 84, "doublesMoves": ["hydropump", "iciclespear", "protect", "rockblast", "shellsmash"], "noDynamaxMoves": ["hydropump", "iciclespear", "rockblast", "shellsmash"] @@ -880,7 +880,7 @@ }, "glalie": { "level": 94, - "moves": ["earthquake", "explosion", "freezedry", "spikes", "superfang", "taunt"], + "moves": ["earthquake", "freezedry", "spikes", "superfang", "taunt"], "doublesLevel": 94, "doublesMoves": ["disable", "foulplay", "freezedry", "helpinghand", "icywind", "protect"] }, @@ -1588,7 +1588,7 @@ }, "mandibuzz": { "level": 82, - "moves": ["bravebird", "defog", "foulplay", "roost", "toxic"], + "moves": ["bravebird", "defog", "foulplay", "roost", "toxic", "uturn"], "doublesLevel": 88, "doublesMoves": ["foulplay", "roost", "snarl", "tailwind", "taunt"] }, diff --git a/data/random-battles/gen9/doubles-sets.json b/data/random-battles/gen9/doubles-sets.json index e1c5f692e28f..a9ef801d8a59 100644 --- a/data/random-battles/gen9/doubles-sets.json +++ b/data/random-battles/gen9/doubles-sets.json @@ -325,7 +325,7 @@ { "role": "Doubles Wallbreaker", "movepool": ["Fire Punch", "High Horsepower", "Rock Slide", "Stone Edge"], - "teraTypes": ["Fire", "Grass"] + "teraTypes": ["Grass"] } ] }, @@ -1019,7 +1019,7 @@ "sets": [ { "role": "Doubles Bulky Attacker", - "movepool": ["Helping Hand", "High Horsepower", "Icy Wind", "Liquidation", "Stealth Rock", "Yawn"], + "movepool": ["Helping Hand", "High Horsepower", "Icy Wind", "Liquidation", "Recover", "Yawn"], "teraTypes": ["Fire", "Poison", "Steel"] } ] @@ -1704,7 +1704,7 @@ "sets": [ { "role": "Doubles Bulky Attacker", - "movepool": ["Helping Hand", "High Horsepower", "Icy Wind", "Muddy Water", "Stealth Rock"], + "movepool": ["Helping Hand", "High Horsepower", "Icy Wind", "Muddy Water", "Protect"], "teraTypes": ["Fire", "Steel"] } ] @@ -1954,7 +1954,7 @@ "sets": [ { "role": "Doubles Support", - "movepool": ["Icy Wind", "Knock Off", "Night Shade", "Teleport", "Thunder Wave"], + "movepool": ["Icy Wind", "Knock Off", "Night Shade", "Spikes", "Thunder Wave"], "teraTypes": ["Fairy", "Steel"] } ] @@ -2935,7 +2935,7 @@ { "role": "Tera Blast user", "movepool": ["Glare", "Leaf Storm", "Protect", "Tera Blast"], - "teraTypes": ["Stellar"] + "teraTypes": ["Fire", "Rock"] } ] }, diff --git a/data/random-battles/gen9/sets.json b/data/random-battles/gen9/sets.json index 04c9cb871b2f..f42accde8200 100644 --- a/data/random-battles/gen9/sets.json +++ b/data/random-battles/gen9/sets.json @@ -26,11 +26,6 @@ "role": "Setup Sweeper", "movepool": ["Dragon Dance", "Earthquake", "Flare Blitz", "Outrage", "Swords Dance"], "teraTypes": ["Dragon", "Ground"] - }, - { - "role": "Fast Attacker", - "movepool": ["Air Slash", "Fire Blast", "Solar Beam", "Sunny Day"], - "teraTypes": ["Fire", "Grass"] } ] }, @@ -138,9 +133,9 @@ "teraTypes": ["Poison", "Steel"] }, { - "role": "Setup Sweeper", + "role": "Bulky Setup", "movepool": ["Calm Mind", "Fire Blast", "Moonblast", "Moonlight"], - "teraTypes": ["Fire"] + "teraTypes": ["Fire", "Steel"] } ] }, @@ -199,7 +194,7 @@ "sets": [ { "role": "Setup Sweeper", - "movepool": ["Bug Buzz", "Quiver Dance", "Sleep Powder", "Sludge Wave", "Substitute"], + "movepool": ["Bug Buzz", "Quiver Dance", "Sleep Powder", "Sludge Wave"], "teraTypes": ["Bug", "Poison", "Steel", "Water"] } ] @@ -251,6 +246,11 @@ "role": "Fast Bulky Setup", "movepool": ["Dark Pulse", "Hypnosis", "Nasty Plot", "Power Gem", "Thunderbolt"], "teraTypes": ["Dark", "Electric"] + }, + { + "role": "Tera Blast user", + "movepool": ["Dark Pulse", "Nasty Plot", "Tera Blast", "Thunderbolt"], + "teraTypes": ["Fairy", "Poison"] } ] }, @@ -826,6 +826,11 @@ "role": "Fast Bulky Setup", "movepool": ["Calm Mind", "Freezing Glare", "Hurricane", "Recover"], "teraTypes": ["Steel"] + }, + { + "role": "Fast Support", + "movepool": ["Future Sight", "Hurricane", "Recover", "U-turn"], + "teraTypes": ["Steel"] } ] }, @@ -914,8 +919,8 @@ }, { "role": "Fast Bulky Setup", - "movepool": ["Alluring Voice", "Aura Sphere", "Dark Pulse", "Earth Power", "Fire Blast", "Hydro Pump", "Nasty Plot", "Psychic", "Psyshock"], - "teraTypes": ["Dark", "Fairy", "Fighting", "Fire", "Ground", "Psychic", "Water"] + "movepool": ["Aura Sphere", "Bug Buzz", "Dark Pulse", "Earth Power", "Fire Blast", "Hydro Pump", "Nasty Plot", "Psychic", "Psyshock"], + "teraTypes": ["Dark", "Fighting", "Fire", "Ground", "Psychic", "Water"] } ] }, @@ -963,8 +968,8 @@ "level": 80, "sets": [ { - "role": "Bulky Setup", - "movepool": ["Aqua Jet", "Crunch", "Ice Punch", "Liquidation", "Swords Dance"], + "role": "Fast Bulky Setup", + "movepool": ["Crunch", "Dragon Dance", "Ice Punch", "Liquidation"], "teraTypes": ["Dark", "Dragon", "Steel", "Water"] }, { @@ -1076,6 +1081,11 @@ "role": "Bulky Attacker", "movepool": ["Earthquake", "Head Smash", "Stealth Rock", "Sucker Punch", "Wood Hammer"], "teraTypes": ["Grass", "Rock"] + }, + { + "role": "Setup Sweeper", + "movepool": ["Earthquake", "Head Smash", "Rock Polish", "Wood Hammer"], + "teraTypes": ["Grass", "Rock"] } ] }, @@ -1132,14 +1142,9 @@ "clodsire": { "level": 81, "sets": [ - { - "role": "Bulky Setup", - "movepool": ["Curse", "Earthquake", "Gunk Shot", "Recover"], - "teraTypes": ["Flying", "Steel"] - }, { "role": "Bulky Support", - "movepool": ["Earthquake", "Gunk Shot", "Poison Jab", "Recover", "Stealth Rock", "Toxic", "Toxic Spikes"], + "movepool": ["Curse", "Earthquake", "Gunk Shot", "Poison Jab", "Recover", "Stealth Rock", "Toxic", "Toxic Spikes"], "teraTypes": ["Flying", "Steel"] } ] @@ -1268,9 +1273,14 @@ "level": 86, "sets": [ { - "role": "Fast Support", + "role": "Bulky Support", "movepool": ["Destiny Bond", "Gunk Shot", "Spikes", "Taunt", "Thunder Wave", "Toxic Spikes", "Waterfall"], "teraTypes": ["Dark", "Grass"] + }, + { + "role": "Fast Support", + "movepool": ["Flip Turn", "Gunk Shot", "Pain Split", "Thunder Wave", "Toxic", "Toxic Spikes"], + "teraTypes": ["Dark", "Grass"] } ] }, @@ -1459,7 +1469,7 @@ "sets": [ { "role": "Bulky Support", - "movepool": ["Close Combat", "Earthquake", "Rapid Spin", "Stone Edge", "Sucker Punch"], + "movepool": ["Close Combat", "Earthquake", "Rapid Spin", "Sucker Punch", "Triple Axel"], "teraTypes": ["Steel"] }, { @@ -1626,6 +1636,11 @@ "role": "Wallbreaker", "movepool": ["Crunch", "Play Rough", "Poison Fang", "Sucker Punch", "Taunt", "Throat Chop"], "teraTypes": ["Fairy", "Poison"] + }, + { + "role": "AV Pivot", + "movepool": ["Crunch", "Play Rough", "Poison Fang", "Sucker Punch", "Super Fang", "Throat Chop"], + "teraTypes": ["Fairy", "Poison"] } ] }, @@ -2463,9 +2478,14 @@ "level": 86, "sets": [ { - "role": "Wallbreaker", + "role": "Fast Attacker", "movepool": ["Brave Bird", "Heat Wave", "Sucker Punch", "U-turn"], "teraTypes": ["Dark", "Flying"] + }, + { + "role": "Wallbreaker", + "movepool": ["Brave Bird", "Heat Wave", "Lash Out", "Sucker Punch", "Thunder Wave"], + "teraTypes": ["Dark", "Flying"] } ] }, @@ -2608,9 +2628,19 @@ "level": 85, "sets": [ { - "role": "Bulky Support", - "movepool": ["Body Press", "Flash Cannon", "Mirror Coat", "Thunderbolt", "Volt Switch"], - "teraTypes": ["Electric", "Flying", "Water"] + "role": "Fast Attacker", + "movepool": ["Body Press", "Flash Cannon", "Thunderbolt", "Volt Switch"], + "teraTypes": ["Electric", "Fighting", "Flying", "Water"] + }, + { + "role": "AV Pivot", + "movepool": ["Flash Cannon", "Mirror Coat", "Thunderbolt", "Volt Switch"], + "teraTypes": ["Flying", "Water"] + }, + { + "role": "Bulky Setup", + "movepool": ["Body Press", "Flash Cannon", "Iron Defense", "Thunderbolt"], + "teraTypes": ["Fighting"] } ] }, @@ -2729,7 +2759,7 @@ }, { "role": "Fast Attacker", - "movepool": ["Ice Beam", "Nasty Plot", "Shadow Ball", "Thunderbolt", "Tri Attack"], + "movepool": ["Ice Beam", "Nasty Plot", "Shadow Ball", "Thunderbolt", "Tri Attack", "Trick"], "teraTypes": ["Electric", "Ghost"] } ] @@ -2864,8 +2894,8 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["Dazzling Gleam", "Energy Ball", "Healing Wish", "Ice Beam", "Nasty Plot", "Psychic", "Thunderbolt", "U-turn"], - "teraTypes": ["Electric", "Fairy", "Psychic"] + "movepool": ["Dazzling Gleam", "Healing Wish", "Ice Beam", "Nasty Plot", "Psychic", "Shadow Ball", "Thunderbolt", "U-turn"], + "teraTypes": ["Electric", "Fairy"] }, { "role": "Bulky Support", @@ -2899,8 +2929,13 @@ "sets": [ { "role": "Bulky Attacker", - "movepool": ["Draco Meteor", "Fire Blast", "Heavy Slam", "Stealth Rock", "Thunder Wave", "Thunderbolt"], - "teraTypes": ["Dragon", "Fire", "Flying", "Steel"] + "movepool": ["Draco Meteor", "Fire Blast", "Heavy Slam", "Stealth Rock", "Thunder Wave"], + "teraTypes": ["Dragon", "Flying", "Steel"] + }, + { + "role": "AV Pivot", + "movepool": ["Draco Meteor", "Dragon Tail", "Fire Blast", "Heavy Slam"], + "teraTypes": ["Dragon", "Flying", "Steel"] } ] }, @@ -2909,13 +2944,13 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["Draco Meteor", "Fire Blast", "Flash Cannon", "Stealth Rock", "Thunder Wave"], - "teraTypes": ["Dragon", "Fire", "Steel"] + "movepool": ["Draco Meteor", "Fire Blast", "Flash Cannon", "Heavy Slam", "Stealth Rock", "Thunder Wave"], + "teraTypes": ["Dragon", "Fire", "Flying", "Steel"] }, { "role": "Bulky Attacker", - "movepool": ["Draco Meteor", "Fire Blast", "Heavy Slam", "Stealth Rock", "Thunder Wave"], - "teraTypes": ["Dragon", "Fire", "Steel"] + "movepool": ["Draco Meteor", "Dragon Tail", "Fire Blast", "Flash Cannon", "Heavy Slam", "Stealth Rock"], + "teraTypes": ["Dragon", "Fire", "Flying", "Steel"] } ] }, @@ -2949,7 +2984,7 @@ "sets": [ { "role": "Bulky Support", - "movepool": ["Earth Power", "Flash Cannon", "Lava Plume", "Magma Storm", "Stealth Rock"], + "movepool": ["Earth Power", "Flash Cannon", "Heavy Slam", "Lava Plume", "Magma Storm", "Stealth Rock"], "teraTypes": ["Flying", "Grass", "Steel"] } ] @@ -2975,17 +3010,17 @@ { "role": "Fast Support", "movepool": ["Dragon Tail", "Rest", "Shadow Ball", "Sleep Talk", "Will-O-Wisp"], - "teraTypes": ["Fairy", "Ghost"] + "teraTypes": ["Fairy"] }, { "role": "Bulky Setup", "movepool": ["Calm Mind", "Dragon Pulse", "Rest", "Sleep Talk"], - "teraTypes": ["Dragon", "Fairy"] + "teraTypes": ["Fairy"] }, { "role": "Bulky Support", "movepool": ["Defog", "Dragon Tail", "Rest", "Shadow Ball", "Will-O-Wisp"], - "teraTypes": ["Fairy", "Ghost"] + "teraTypes": ["Fairy"] } ] }, @@ -2994,7 +3029,7 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["Defog", "Draco Meteor", "Dragon Tail", "Earthquake", "Poltergeist", "Shadow Sneak", "Will-O-Wisp"], + "movepool": ["Defog", "Draco Meteor", "Dragon Tail", "Poltergeist", "Shadow Sneak", "Will-O-Wisp"], "teraTypes": ["Dragon", "Fairy", "Ghost", "Steel"] } ] @@ -3153,9 +3188,14 @@ "level": 69, "sets": [ { - "role": "Bulky Setup", + "role": "Fast Bulky Setup", "movepool": ["Body Press", "Cosmic Power", "Recover", "Stored Power"], "teraTypes": ["Steel"] + }, + { + "role": "Bulky Setup", + "movepool": ["Body Press", "Iron Defense", "Recover", "Shadow Ball"], + "teraTypes": ["Steel"] } ] }, @@ -3319,8 +3359,8 @@ "sets": [ { "role": "Tera Blast user", - "movepool": ["Glare", "Knock Off", "Leaf Storm", "Leech Seed", "Substitute", "Synthesis", "Tera Blast"], - "teraTypes": ["Stellar"] + "movepool": ["Glare", "Leaf Storm", "Leech Seed", "Substitute", "Synthesis", "Tera Blast"], + "teraTypes": ["Fire", "Rock"] }, { "role": "Fast Attacker", @@ -3368,9 +3408,14 @@ "level": 77, "sets": [ { - "role": "Fast Attacker", - "movepool": ["Ceaseless Edge", "Flip Turn", "Razor Shell", "Sacred Sword", "Sucker Punch", "Swords Dance"], - "teraTypes": ["Dark", "Water"] + "role": "Setup Sweeper", + "movepool": ["Ceaseless Edge", "Razor Shell", "Sucker Punch", "Swords Dance"], + "teraTypes": ["Dark", "Poison", "Water"] + }, + { + "role": "Wallbreaker", + "movepool": ["Aqua Jet", "Ceaseless Edge", "Flip Turn", "Razor Shell"], + "teraTypes": ["Dark", "Poison", "Water"] } ] }, @@ -3546,11 +3591,6 @@ "role": "Wallbreaker", "movepool": ["Bitter Malice", "Flamethrower", "Focus Blast", "Hyper Voice", "Nasty Plot", "Trick", "U-turn"], "teraTypes": ["Fighting", "Normal"] - }, - { - "role": "Fast Attacker", - "movepool": ["Focus Blast", "Hyper Voice", "Poltergeist", "Will-O-Wisp"], - "teraTypes": ["Fighting", "Normal"] } ] }, @@ -3755,7 +3795,7 @@ { "role": "Fast Bulky Setup", "movepool": ["Brave Bird", "Bulk Up", "Close Combat", "Roost"], - "teraTypes": ["Fighting", "Flying"] + "teraTypes": ["Fighting", "Steel"] } ] }, @@ -3779,12 +3819,12 @@ "sets": [ { "role": "Bulky Support", - "movepool": ["Defog", "Foul Play", "Knock Off", "Roost", "Toxic", "U-turn"], + "movepool": ["Defog", "Foul Play", "Roost", "Toxic", "U-turn"], "teraTypes": ["Steel"] }, { "role": "Bulky Attacker", - "movepool": ["Brave Bird", "Defog", "Knock Off", "Roost", "Toxic"], + "movepool": ["Brave Bird", "Defog", "Foul Play", "Knock Off", "Roost", "Toxic"], "teraTypes": ["Steel"] } ] @@ -3924,7 +3964,7 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["Blue Flare", "Draco Meteor", "Earth Power", "Roar", "Will-O-Wisp"], + "movepool": ["Blue Flare", "Draco Meteor", "Dragon Tail", "Earth Power", "Will-O-Wisp"], "teraTypes": ["Fire", "Ground"] }, { @@ -4189,8 +4229,8 @@ "sets": [ { "role": "Bulky Attacker", - "movepool": ["Draco Meteor", "Flip Turn", "Focus Blast", "Hydro Pump", "Sludge Wave", "Toxic", "Toxic Spikes"], - "teraTypes": ["Water"] + "movepool": ["Draco Meteor", "Flip Turn", "Focus Blast", "Sludge Wave", "Toxic", "Toxic Spikes"], + "teraTypes": ["Fighting"] } ] }, @@ -4265,7 +4305,7 @@ { "role": "AV Pivot", "movepool": ["Draco Meteor", "Dragon Tail", "Earthquake", "Fire Blast", "Heavy Slam", "Hydro Pump", "Knock Off", "Thunderbolt"], - "teraTypes": ["Electric", "Fire", "Ground", "Water"] + "teraTypes": ["Dragon", "Flying", "Ground", "Water"] } ] }, @@ -5104,7 +5144,7 @@ "sets": [ { "role": "Tera Blast user", - "movepool": ["Bug Buzz", "Giga Drain", "Hurricane", "Ice Beam", "Quiver Dance", "Tera Blast"], + "movepool": ["Bug Buzz", "Giga Drain", "Ice Beam", "Quiver Dance", "Tera Blast"], "teraTypes": ["Ground"] }, { @@ -5453,9 +5493,9 @@ "level": 79, "sets": [ { - "role": "Tera Blast user", - "movepool": ["Moonblast", "Play Rough", "Superpower", "Tera Blast"], - "teraTypes": ["Stellar"] + "role": "Setup Sweeper", + "movepool": ["Play Rough", "Substitute", "Superpower", "Taunt", "Zen Headbutt"], + "teraTypes": ["Fighting"] }, { "role": "Fast Bulky Setup", @@ -5604,8 +5644,8 @@ "sets": [ { "role": "Bulky Attacker", - "movepool": ["Dazzling Gleam", "Earth Power", "Energy Ball", "Hyper Voice", "Strength Sap"], - "teraTypes": ["Fairy", "Grass", "Ground"] + "movepool": ["Earth Power", "Energy Ball", "Hyper Voice", "Strength Sap"], + "teraTypes": ["Grass", "Ground", "Poison"] }, { "role": "Bulky Support", @@ -5908,9 +5948,9 @@ "teraTypes": ["Electric", "Fighting"] }, { - "role": "Bulky Support", - "movepool": ["Body Press", "Iron Head", "Rest", "Shed Tail", "Spikes", "Stealth Rock"], - "teraTypes": ["Electric", "Ghost", "Poison"] + "role": "Bulky Attacker", + "movepool": ["Body Press", "Heavy Slam", "Rest", "Shed Tail", "Spikes", "Stealth Rock"], + "teraTypes": ["Electric", "Fighting", "Ghost", "Poison"] } ] }, @@ -5921,6 +5961,11 @@ "role": "Fast Support", "movepool": ["Earth Power", "Mortal Spin", "Power Gem", "Sludge Wave", "Spikes", "Stealth Rock"], "teraTypes": ["Ground"] + }, + { + "role": "Setup Sweeper", + "movepool": ["Earth Power", "Energy Ball", "Meteor Beam", "Sludge Wave"], + "teraTypes": ["Grass"] } ] }, @@ -6035,7 +6080,7 @@ { "role": "Bulky Attacker", "movepool": ["Boomburst", "Calm Mind", "Earth Power", "Roost"], - "teraTypes": ["Ghost"] + "teraTypes": ["Fairy", "Ghost"] }, { "role": "Bulky Setup", @@ -6293,13 +6338,13 @@ "level": 77, "sets": [ { - "role": "Fast Attacker", - "movepool": ["Focus Blast", "Make It Rain", "Nasty Plot", "Recover", "Shadow Ball", "Trick"], - "teraTypes": ["Ghost", "Steel"] + "role": "Bulky Attacker", + "movepool": ["Focus Blast", "Make It Rain", "Nasty Plot", "Shadow Ball", "Trick"], + "teraTypes": ["Fighting", "Ghost", "Steel"] }, { - "role": "Bulky Attacker", - "movepool": ["Make It Rain", "Recover", "Shadow Ball", "Thunder Wave"], + "role": "Bulky Support", + "movepool": ["Make It Rain", "Nasty Plot", "Recover", "Shadow Ball", "Thunder Wave"], "teraTypes": ["Dark", "Steel", "Water"] } ] @@ -6601,11 +6646,6 @@ "role": "Bulky Attacker", "movepool": ["Calm Mind", "Focus Blast", "Psyshock", "Tachyon Cutter", "Volt Switch"], "teraTypes": ["Fighting", "Steel"] - }, - { - "role": "AV Pivot", - "movepool": ["Focus Blast", "Future Sight", "Psychic Noise", "Psyshock", "Tachyon Cutter", "Volt Switch"], - "teraTypes": ["Steel"] } ] }, diff --git a/data/random-battles/gen9/teams.ts b/data/random-battles/gen9/teams.ts index 460f5d360031..ecd02a9ec00e 100644 --- a/data/random-battles/gen9/teams.ts +++ b/data/random-battles/gen9/teams.ts @@ -117,7 +117,7 @@ const MOVE_PAIRS = [ /** Pokemon who always want priority STAB, and are fine with it as its only STAB move of that type */ const PRIORITY_POKEMON = [ - 'breloom', 'brutebonnet', 'honchkrow', 'mimikyu', 'ragingbolt', 'scizor', + 'breloom', 'brutebonnet', 'cacturne', 'honchkrow', 'mimikyu', 'ragingbolt', 'scizor', ]; /** Pokemon who should never be in the lead slot */ @@ -129,7 +129,7 @@ const DOUBLES_NO_LEAD_POKEMON = [ ]; const DEFENSIVE_TERA_BLAST_USERS = [ - 'alcremie', 'bellossom', 'comfey', 'florges', + 'alcremie', 'bellossom', 'comfey', 'fezandipiti', 'florges', ]; function sereneGraceBenefits(move: Move) { @@ -182,7 +182,14 @@ export class RandomTeams { movePool.includes('megahorn') || movePool.includes('xscissor') || (!counter.get('Bug') && types.includes('Electric')) ), - Dark: (movePool, moves, abilities, types, counter) => !counter.get('Dark'), + Dark: ( + movePool, moves, abilities, types, counter, species, teamDetails, isLead, isDoubles, teraType, role + ) => { + if ( + counter.get('Dark') < 2 && PRIORITY_POKEMON.includes(species.id) && role === 'Wallbreaker' + ) return true; + return !counter.get('Dark'); + }, Dragon: (movePool, moves, abilities, types, counter) => !counter.get('Dragon'), Electric: (movePool, moves, abilities, types, counter) => !counter.get('Electric'), Fairy: (movePool, moves, abilities, types, counter) => !counter.get('Fairy'), @@ -553,6 +560,7 @@ export class RandomTeams { ['closecombat', 'drainpunch'], ['bugbite', 'pounce'], [['dragonpulse', 'spacialrend'], 'dracometeor'], + ['heavyslam', 'flashcannon'], ['alluringvoice', 'dazzlinggleam'], // These status moves are redundant with each other @@ -567,8 +575,6 @@ export class RandomTeams { ['switcheroo', 'fakeout'], // Beartic ['snowscape', 'swordsdance'], - // Magnezone - ['bodypress', 'mirrorcoat'], // Amoonguss, though this can work well as a general rule later ['toxic', 'clearsmog'], // Chansey and Blissey @@ -1044,7 +1050,6 @@ export class RandomTeams { case 'Intimidate': if (abilities.has('Hustle')) return true; if (abilities.has('Sheer Force') && !!counter.get('sheerforce')) return true; - if (species.id === 'hitmontop' && moves.has('tripleaxel')) return true; return (abilities.has('Stakeout')); case 'Iron Fist': return !counter.ironFist || moves.has('dynamicpunch'); @@ -1057,7 +1062,8 @@ export class RandomTeams { case 'Mold Breaker': return (['Sharpness', 'Sheer Force', 'Unburden'].some(m => abilities.has(m))); case 'Moxie': - return (!counter.get('Physical') || moves.has('stealthrock')); + // AV Pivot part is currently only for Mightyena) + return (!counter.get('Physical') || moves.has('stealthrock') || role === 'AV Pivot'); case 'Natural Cure': return species.id === 'pawmot'; case 'Neutralizing Gas': @@ -1112,8 +1118,6 @@ export class RandomTeams { const hbraviaryCase = (species.id === 'braviaryhisui' && (role === 'Setup Sweeper' || role === 'Doubles Wallbreaker')); const yanmegaCase = (species.id === 'yanmega' && moves.has('protect')); return (yanmegaCase || hbraviaryCase || species.id === 'illumise'); - case 'Unaware': - return (species.id === 'clefable' && role !== 'Bulky Support'); case 'Unburden': return (abilities.has('Prankster') || !counter.get('setup') || species.id === 'sceptile'); case 'Vital Spirit': @@ -1176,6 +1180,7 @@ export class RandomTeams { // singles if (!isDoubles) { if (species.id === 'hypno') return 'Insomnia'; + if (species.id === 'hitmontop') return (role === 'Bulky Setup') ? 'Technician' : 'Intimidate'; if (species.id === 'staraptor') return 'Reckless'; if (species.id === 'arcaninehisui') return 'Rock Head'; if (['raikou', 'suicune', 'vespiquen'].includes(species.id)) return 'Pressure'; @@ -1317,8 +1322,7 @@ export class RandomTeams { ) return 'Weakness Policy'; if (['dragonenergy', 'lastrespects', 'waterspout'].some(m => moves.has(m))) return 'Choice Scarf'; if ( - ability === 'Imposter' || - (species.id === 'magnezone' && moves.has('bodypress') && !isDoubles) + ability === 'Imposter' || (species.id === 'magnezone' && role === 'Fast Attacker') ) return 'Choice Scarf'; if (species.id === 'rampardos' && (role === 'Fast Attacker' || isDoubles)) return 'Choice Scarf'; if (species.id === 'palkia' && counter.get('Special') < 4) return 'Lustrous Orb'; @@ -1350,7 +1354,7 @@ export class RandomTeams { if ((ability === 'Guts' || moves.has('facade')) && !moves.has('sleeptalk')) { return (types.includes('Fire') || ability === 'Toxic Boost') ? 'Toxic Orb' : 'Flame Orb'; } - if (species.id === 'reuniclus' || (ability === 'Sheer Force' && counter.get('sheerforce'))) return 'Life Orb'; + if (ability === 'Magic Guard' || (ability === 'Sheer Force' && counter.get('sheerforce'))) return 'Life Orb'; if (ability === 'Anger Shell') return this.sample(['Rindo Berry', 'Passho Berry', 'Scope Lens', 'Sitrus Berry']); if (moves.has('dragondance') && isDoubles) return 'Clear Amulet'; if (counter.get('skilllink') && ability !== 'Skill Link' && species.id !== 'breloom') return 'Loaded Dice'; @@ -1427,6 +1431,7 @@ export class RandomTeams { species.id === 'eternatus' || species.id === 'regigigas' ) return 'Leftovers'; if (species.id === 'sylveon') return 'Pixie Plate'; + if (ability === 'Intimidate' && this.dex.getEffectiveness('Rock', species) >= 1) return 'Heavy-Duty Boots'; if ( (offensiveRole || (role === 'Tera Blast user' && (species.baseStats.spe >= 80 || moves.has('trickroom')))) && (!moves.has('fakeout') || species.id === 'ambipom') && !moves.has('incinerate') && @@ -1518,7 +1523,7 @@ export class RandomTeams { (species.baseStats.hp + species.baseStats.def) > 200 && this.randomChance(1, 2) ) ) return 'Rocky Helmet'; - if (moves.has('outrage') && this.randomChance(1, 2)) return 'Lum Berry'; + if (moves.has('outrage')) return 'Lum Berry'; if (moves.has('protect') && ability !== 'Speed Boost') return 'Leftovers'; if ( role === 'Fast Support' && isLead && diff --git a/test/random-battles/gen2.js b/test/random-battles/gen2.js index dbf1547ae643..e52a895a460f 100644 --- a/test/random-battles/gen2.js +++ b/test/random-battles/gen2.js @@ -66,7 +66,7 @@ describe('[Gen 2] Random Battle (slow)', () => { if (species.unreleasedHidden) abilities.delete(species.abilities.H); for (const set of sets) { const role = set.role; - const moves = new Set(set.movepool.map(m => dex.moves.get(m).id)); + const moves = new Set(Array.from(set.movepool)); const preferredTypes = set.preferredTypes; let teamDetails = {}; // Go through all possible teamDetails combinations, if necessary @@ -78,7 +78,7 @@ describe('[Gen 2] Random Battle (slow)', () => { const spikes = Math.floor(i / 2) % 2; teamDetails = {rapidSpin, spikes}; // randomMoveset() deletes moves from the movepool, so recreate it every time - const movePool = set.movepool.map(m => dex.moves.get(m).id); + const movePool = Array.from(set.movepool); const moveSet = generator.randomMoveset(types, abilities, teamDetails, species, false, movePool, preferredType, role); for (const move of moveSet) moves.delete(move); if (!moves.size) break; diff --git a/test/random-battles/gen3.js b/test/random-battles/gen3.js index a49354915f3c..9d5709340cd5 100644 --- a/test/random-battles/gen3.js +++ b/test/random-battles/gen3.js @@ -67,14 +67,14 @@ describe('[Gen 3] Random Battle (slow)', () => { if (species.unreleasedHidden) abilities.delete(species.abilities.H); for (const set of sets) { const role = set.role; - const moves = new Set(set.movepool.map(m => dex.moves.get(m).id)); + const moves = new Set(Array.from(set.movepool)); const preferredTypes = set.preferredTypes; // Go through all possible teamDetails combinations, if necessary for (let j = 0; j < rounds; j++) { // Generate a moveset // randomMoveset() deletes moves from the movepool, so recreate it every time const preferredType = preferredTypes ? preferredTypes.join() : ''; - const movePool = set.movepool.map(m => dex.moves.get(m).id); + const movePool = Array.from(set.movepool); const moveSet = generator.randomMoveset(types, abilities, {}, species, false, movePool, preferredType, role); for (const move of moveSet) moves.delete(move); if (!moves.size) break; diff --git a/test/random-battles/gen4.js b/test/random-battles/gen4.js index 1612f07033ea..3cdbd444bc13 100644 --- a/test/random-battles/gen4.js +++ b/test/random-battles/gen4.js @@ -67,14 +67,14 @@ describe('[Gen 4] Random Battle (slow)', () => { if (species.unreleasedHidden) abilities.delete(species.abilities.H); for (const set of sets) { const role = set.role; - const moves = new Set(set.movepool.map(m => dex.moves.get(m).id)); + const moves = new Set(Array.from(set.movepool)); const preferredTypes = set.preferredTypes; let teamDetails = {}; // Go through all possible teamDetails combinations, if necessary for (let j = 0; j < rounds; j++) { // Generate a moveset as the lead, teamDetails is always empty for this const preferredType = preferredTypes ? preferredTypes[j % preferredTypes.length] : ''; - const movePool = set.movepool.map(m => dex.moves.get(m).id); + const movePool = Array.from(set.movepool); const moveSet = generator.randomMoveset(types, abilities, {}, species, true, movePool, preferredType, role); for (const move of moveSet) moves.delete(move); if (!moves.size) break; @@ -84,7 +84,7 @@ describe('[Gen 4] Random Battle (slow)', () => { const stealthRock = Math.floor(i / 2) % 2; teamDetails = {rapidSpin, stealthRock}; // randomMoveset() deletes moves from the movepool, so recreate it every time - const movePool = set.movepool.map(m => dex.moves.get(m).id); + const movePool = Array.from(set.movepool); const moveSet = generator.randomMoveset(types, abilities, teamDetails, species, false, movePool, preferredType, role); for (const move of moveSet) moves.delete(move); if (!moves.size) break; diff --git a/test/random-battles/gen5.js b/test/random-battles/gen5.js index 75d6b32fcc61..1e13d531bf2f 100644 --- a/test/random-battles/gen5.js +++ b/test/random-battles/gen5.js @@ -67,14 +67,14 @@ describe('[Gen 5] Random Battle (slow)', () => { if (species.unreleasedHidden) abilities.delete(species.abilities.H); for (const set of sets) { const role = set.role; - const moves = new Set(set.movepool.map(m => dex.moves.get(m).id)); + const moves = new Set(Array.from(set.movepool)); const preferredTypes = set.preferredTypes; let teamDetails = {}; // Go through all possible teamDetails combinations, if necessary for (let j = 0; j < rounds; j++) { // Generate a moveset as the lead, teamDetails is always empty for this const preferredType = preferredTypes ? preferredTypes[j % preferredTypes.length] : ''; - const movePool = set.movepool.map(m => dex.moves.get(m).id); + const movePool = Array.from(set.movepool); const moveSet = generator.randomMoveset(types, abilities, {}, species, true, movePool, preferredType, role); for (const move of moveSet) moves.delete(move); if (!moves.size) break; @@ -84,7 +84,7 @@ describe('[Gen 5] Random Battle (slow)', () => { const stealthRock = Math.floor(i / 2) % 2; teamDetails = {rapidSpin, stealthRock}; // randomMoveset() deletes moves from the movepool, so recreate it every time - const movePool = set.movepool.map(m => dex.moves.get(m).id); + const movePool = Array.from(set.movepool); const moveSet = generator.randomMoveset(types, abilities, teamDetails, species, false, movePool, preferredType, role); for (const move of moveSet) moves.delete(move); if (!moves.size) break; diff --git a/test/random-battles/gen6.js b/test/random-battles/gen6.js index 2560355163be..66b0e8f74aab 100644 --- a/test/random-battles/gen6.js +++ b/test/random-battles/gen6.js @@ -67,14 +67,14 @@ describe('[Gen 6] Random Battle (slow)', () => { if (species.unreleasedHidden) abilities.delete(species.abilities.H); for (const set of sets) { const role = set.role; - const moves = new Set(set.movepool.map(m => dex.moves.get(m).id)); + const moves = new Set(Array.from(set.movepool)); const preferredTypes = set.preferredTypes; let teamDetails = {}; // Go through all possible teamDetails combinations, if necessary for (let j = 0; j < rounds; j++) { // Generate a moveset as the lead, teamDetails is always empty for this const preferredType = preferredTypes ? preferredTypes[j % preferredTypes.length] : ''; - const movePool = set.movepool.map(m => dex.moves.get(m).id); + const movePool = Array.from(set.movepool); const moveSet = generator.randomMoveset(types, abilities, {}, species, true, movePool, preferredType, role); for (const move of moveSet) moves.delete(move); if (!moves.size) break; @@ -85,7 +85,7 @@ describe('[Gen 6] Random Battle (slow)', () => { const stickyWeb = Math.floor(i / 4) % 2; teamDetails = {defog, stealthRock, stickyWeb}; // randomMoveset() deletes moves from the movepool, so recreate it every time - const movePool = set.movepool.map(m => dex.moves.get(m).id); + const movePool = Array.from(set.movepool); const moveSet = generator.randomMoveset(types, abilities, teamDetails, species, false, movePool, preferredType, role); for (const move of moveSet) moves.delete(move); if (!moves.size) break; diff --git a/test/random-battles/gen7.js b/test/random-battles/gen7.js index eef3342028b3..5e14129487de 100644 --- a/test/random-battles/gen7.js +++ b/test/random-battles/gen7.js @@ -67,14 +67,14 @@ describe('[Gen 7] Random Battle (slow)', () => { if (species.unreleasedHidden) abilities.delete(species.abilities.H); for (const set of sets) { const role = set.role; - const moves = new Set(set.movepool.map(m => dex.moves.get(m).id)); + const moves = new Set(Array.from(set.movepool)); const preferredTypes = set.preferredTypes; let teamDetails = {}; // Go through all possible teamDetails combinations, if necessary for (let j = 0; j < rounds; j++) { // Generate a moveset as the lead, teamDetails is always empty for this const preferredType = preferredTypes ? preferredTypes[j % preferredTypes.length] : ''; - const movePool = set.movepool.map(m => dex.moves.get(m).id); + const movePool = Array.from(set.movepool); const moveSet = generator.randomMoveset(types, abilities, {}, species, true, movePool, preferredType, role); for (const move of moveSet) moves.delete(move); if (!moves.size) break; @@ -85,14 +85,13 @@ describe('[Gen 7] Random Battle (slow)', () => { const stickyWeb = Math.floor(i / 4) % 2; teamDetails = {defog, stealthRock, stickyWeb}; // randomMoveset() deletes moves from the movepool, so recreate it every time - const movePool = set.movepool.map(m => dex.moves.get(m).id); + const movePool = Array.from(set.movepool); const moveSet = generator.randomMoveset(types, abilities, teamDetails, species, false, movePool, preferredType, role); for (const move of moveSet) moves.delete(move); if (!moves.size) break; } if (!moves.size) break; } - if (moves.size) console.log(moves, species); assert(!moves.size, species); } } From 7c8d37c5aaa9eff7a3b20281576ec05e776aaf74 Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Sat, 1 Jun 2024 10:35:40 -0600 Subject: [PATCH 007/139] Fix error --- config/formats.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/formats.ts b/config/formats.ts index ecd0d8f087c5..dda1e61cd529 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -2331,7 +2331,7 @@ export const Formats: FormatList = [ ], mod: 'gen9', - ruleset: ['Standard NatDex', 'Little Cup', 'Species Clause', 'OHKO Clause', 'Evasion Clause', 'Sleep Clause Mod', 'Max Level = 5'], + 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', From 8b433efe6bb03c3ebd9a7c05175de7d6001ee6dc Mon Sep 17 00:00:00 2001 From: adrivrie Date: Sat, 1 Jun 2024 19:55:03 +0200 Subject: [PATCH 008/139] Baby Random Battle: quick bugfix (#10328) --- data/random-battles/gen9baby/sets.json | 2 +- data/random-battles/gen9baby/teams.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/data/random-battles/gen9baby/sets.json b/data/random-battles/gen9baby/sets.json index 6300130d066a..c2ea67917bcc 100644 --- a/data/random-battles/gen9baby/sets.json +++ b/data/random-battles/gen9baby/sets.json @@ -2730,7 +2730,7 @@ { "role": "Wallbreaker", "movepool": ["Drain Punch", "Giga Drain", "Leaf Storm", "Rock Slide", "Synthesis", "Thunder Punch"], - "teraTypes": ["Electric", "Fighting", "Grass. Rock"] + "teraTypes": ["Electric", "Fighting", "Grass", "Rock"] }, { "role": "Setup Sweeper", diff --git a/data/random-battles/gen9baby/teams.ts b/data/random-battles/gen9baby/teams.ts index 96c634f48c6c..e2b1690a4fa9 100644 --- a/data/random-battles/gen9baby/teams.ts +++ b/data/random-battles/gen9baby/teams.ts @@ -140,6 +140,7 @@ export class RandomBabyTeams extends RandomTeams { [SETUP, HAZARDS], [PHYSICAL_SETUP, PHYSICAL_SETUP], [statusMoves, ['healingwish', 'trick', 'destinybond']], + ['curse', 'rapidspin'], // These moves are redundant with each other [ From 22d72eb6845ba670880aa3afc201630b066a7f85 Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Sat, 1 Jun 2024 13:32:47 -0600 Subject: [PATCH 009/139] Move Zamazenta to ND Ubers --- data/formats-data.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/formats-data.ts b/data/formats-data.ts index fb36708c2de9..18f1c0664409 100644 --- a/data/formats-data.ts +++ b/data/formats-data.ts @@ -5041,7 +5041,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { zamazenta: { tier: "OU", doublesTier: "DUber", - natDexTier: "OU", + natDexTier: "Uber", }, zamazentacrowned: { tier: "Uber", From d7748a53afa70a2bd436e736ed9c9fc01d4bb293 Mon Sep 17 00:00:00 2001 From: Leonard Craft III Date: Sat, 1 Jun 2024 14:37:15 -0500 Subject: [PATCH 010/139] Reveal Greninja-Ash in Team Preview (#10322) --- data/mods/gen4/rulesets.ts | 5 +++-- data/mods/gen5/rulesets.ts | 5 +++-- data/mods/gen7/rulesets.ts | 5 +++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/data/mods/gen4/rulesets.ts b/data/mods/gen4/rulesets.ts index 4095e0628697..e19dedb65e09 100644 --- a/data/mods/gen4/rulesets.ts +++ b/data/mods/gen4/rulesets.ts @@ -13,8 +13,9 @@ export const Rulesets: {[k: string]: ModdedFormatData} = { this.add('clearpoke'); for (const pokemon of this.getAllPokemon()) { const details = pokemon.details.replace(', shiny', '') - .replace(/(Arceus|Genesect|Greninja|Gourgeist|Pumpkaboo|Xerneas|Silvally|Urshifu|Dudunsparce)(-[a-zA-Z?-]+)?/g, '$1-*') - .replace(/(Zacian|Zamazenta)(?!-Crowned)/g, '$1-*'); // Hacked-in Crowned formes will be revealed + .replace(/(Arceus|Genesect|Gourgeist|Pumpkaboo|Xerneas|Silvally|Urshifu|Dudunsparce)(-[a-zA-Z?-]+)?/g, '$1-*') + .replace(/(Zacian|Zamazenta)(?!-Crowned)/g, '$1-*') // Hacked-in Crowned formes will be revealed + .replace(/(Greninja)(?!-Ash)/g, '$1-*'); // Hacked-in Greninja-Ash will be revealed this.add('poke', pokemon.side.id, details, pokemon.item ? 'item' : ''); } this.makeRequest('teampreview'); diff --git a/data/mods/gen5/rulesets.ts b/data/mods/gen5/rulesets.ts index 818c368a608d..54d18aae405a 100644 --- a/data/mods/gen5/rulesets.ts +++ b/data/mods/gen5/rulesets.ts @@ -19,8 +19,9 @@ export const Rulesets: {[k: string]: ModdedFormatData} = { this.add('clearpoke'); for (const pokemon of this.getAllPokemon()) { const details = pokemon.details.replace(', shiny', '') - .replace(/(Arceus|Genesect|Greninja|Gourgeist|Pumpkaboo|Xerneas|Silvally|Urshifu|Dudunsparce)(-[a-zA-Z?-]+)?/g, '$1-*') - .replace(/(Zacian|Zamazenta)(?!-Crowned)/g, '$1-*'); // Hacked-in Crowned formes will be revealed + .replace(/(Arceus|Genesect|Gourgeist|Pumpkaboo|Xerneas|Silvally|Urshifu|Dudunsparce)(-[a-zA-Z?-]+)?/g, '$1-*') + .replace(/(Zacian|Zamazenta)(?!-Crowned)/g, '$1-*') // Hacked-in Crowned formes will be revealed + .replace(/(Greninja)(?!-Ash)/g, '$1-*'); // Hacked-in Greninja-Ash will be revealed const item = pokemon.item.includes('mail') ? 'mail' : pokemon.item ? 'item' : ''; this.add('poke', pokemon.side.id, details, item); } diff --git a/data/mods/gen7/rulesets.ts b/data/mods/gen7/rulesets.ts index a823f0d178e9..7bda3473e876 100644 --- a/data/mods/gen7/rulesets.ts +++ b/data/mods/gen7/rulesets.ts @@ -36,8 +36,9 @@ export const Rulesets: {[k: string]: ModdedFormatData} = { this.add('clearpoke'); for (const pokemon of this.getAllPokemon()) { const details = pokemon.details.replace(', shiny', '') - .replace(/(Arceus|Genesect|Greninja|Gourgeist|Pumpkaboo|Xerneas|Silvally|Urshifu|Dudunsparce)(-[a-zA-Z?-]+)?/g, '$1-*') - .replace(/(Zacian|Zamazenta)(?!-Crowned)/g, '$1-*'); // Hacked-in Crowned formes will be revealed + .replace(/(Arceus|Genesect|Gourgeist|Pumpkaboo|Xerneas|Silvally|Urshifu|Dudunsparce)(-[a-zA-Z?-]+)?/g, '$1-*') + .replace(/(Zacian|Zamazenta)(?!-Crowned)/g, '$1-*') // Hacked-in Crowned formes will be revealed + .replace(/(Greninja)(?!-Ash)/g, '$1-*'); // Hacked-in Greninja-Ash will be revealed this.add('poke', pokemon.side.id, details, pokemon.item ? 'item' : ''); } this.makeRequest('teampreview'); From 57bcd1a750e15231820d24bd123b26e5eb754440 Mon Sep 17 00:00:00 2001 From: Leonard Craft III Date: Sat, 1 Jun 2024 14:37:47 -0500 Subject: [PATCH 011/139] Fix interaction of As One and Transform (#10325) --- data/abilities.ts | 12 ++++++++++++ test/sim/abilities/asone.js | 29 +++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 test/sim/abilities/asone.js diff --git a/data/abilities.ts b/data/abilities.ts index 22a93e26b12e..31a263acfc42 100644 --- a/data/abilities.ts +++ b/data/abilities.ts @@ -260,6 +260,12 @@ export const Abilities: {[abilityid: string]: AbilityData} = { this.add('-ability', pokemon, 'Unnerve'); this.effectState.unnerved = true; }, + onStart(pokemon) { + if (this.effectState.unnerved) return; + this.add('-ability', pokemon, 'As One'); + this.add('-ability', pokemon, 'Unnerve'); + this.effectState.unnerved = true; + }, onEnd() { this.effectState.unnerved = false; }, @@ -282,6 +288,12 @@ export const Abilities: {[abilityid: string]: AbilityData} = { this.add('-ability', pokemon, 'Unnerve'); this.effectState.unnerved = true; }, + onStart(pokemon) { + if (this.effectState.unnerved) return; + this.add('-ability', pokemon, 'As One'); + this.add('-ability', pokemon, 'Unnerve'); + this.effectState.unnerved = true; + }, onEnd() { this.effectState.unnerved = false; }, diff --git a/test/sim/abilities/asone.js b/test/sim/abilities/asone.js new file mode 100644 index 000000000000..80d0084e85fb --- /dev/null +++ b/test/sim/abilities/asone.js @@ -0,0 +1,29 @@ +'use strict'; + +const assert = require('./../../assert'); +const common = require('./../../common'); + +let battle; + +describe(`As One`, function () { + afterEach(function () { + battle.destroy(); + }); + + it(`should work if the user is Transformed`, function () { + battle = common.createBattle([[ + {species: 'ditto', ability: 'imposter', moves: ['transform']}, + ], [ + {species: 'calyrexshadow', ability: 'asonespectrier', item: 'cheriberry', moves: ['glare', 'sleeptalk', 'astralbarrage']}, + {species: 'wynaut', moves: ['sleeptalk']}, + ]]); + + const ditto = battle.p1.active[0]; + const calyrex = battle.p2.active[0]; + battle.makeChoices('move glare', 'move sleeptalk'); + assert.equal(calyrex.status, 'par', `Calyrex should not have eaten its Berry, being affected by Ditto-Calyrex's Unnerve`); + + battle.makeChoices('move astralbarrage', 'move sleeptalk'); + assert.statStage(ditto, 'spa', 1); + }); +}); From 1f3b2e40d34e1439a11fc169065144e58c48d4ba Mon Sep 17 00:00:00 2001 From: LegoFigure11 <24732684+LegoFigure11@users.noreply.github.com> Date: Sun, 2 Jun 2024 06:13:14 +1000 Subject: [PATCH 012/139] Add Gen 9 BSS Factory (#10180) * Add Gen 9 BSS Factory Co-Authored-By: NO-VED <16705080+no-ved@users.noreply.github.com> * Split and tweak sets per Cake & Livid's review * Put sets with moves that aren't rolled on one line Apologies in advance to my linter * Last of Cake's changes * Fix missing curly That's what I get for copy pasting * Address livid's review * Address Livid's review * Show Gen 9 BSSF in search * Address Kris' review * Move Gen 9 BSS Factory to Rands Spotlight per ACakeWearingAHat * Update config/formats.ts --------- Co-authored-by: NO-VED <16705080+no-ved@users.noreply.github.com> Co-authored-by: Kris Johnson <11083252+KrisXV@users.noreply.github.com> --- config/formats.ts | 11 + data/aliases.ts | 3 +- .../random-battles/gen9/bss-factory-sets.json | 5634 +++++++++++++++++ data/random-battles/gen9/teams.ts | 312 + sim/global-types.ts | 4 + 5 files changed, 5963 insertions(+), 1 deletion(-) create mode 100644 data/random-battles/gen9/bss-factory-sets.json diff --git a/config/formats.ts b/config/formats.ts index dda1e61cd529..7464f1253daa 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -2490,6 +2490,17 @@ export const Formats: FormatList = [ this.add(`raw|
Chimera Rands is a 1v1 format where you combine your 6 Pokemon into one "Chimera." The order you select during team preview is important! In sequence, your picks determine your Chimera's Type, Item, Ability, Stats, Moves 1 & 2, then finally Moves 3 & 4.
`); }, }, + { + name: "[Gen 9] BSS Factory", + desc: `Randomized 3v3 Singles featuring Pokémon and movesets popular in Battle Stadium Singles.`, + threads: [ + `• Information and Suggestions Thread`, + ], + + mod: 'gen9', + team: 'randomBSSFactory', + ruleset: ['Flat Rules', 'VGC Timer'], + }, { name: "[Gen 9] Baby Random Battle", diff --git a/data/aliases.ts b/data/aliases.ts index 083913c30fca..d2f3e7512bcd 100644 --- a/data/aliases.ts +++ b/data/aliases.ts @@ -63,7 +63,7 @@ export const Aliases: {[alias: string]: string} = { hc: "[Gen 9] Hackmons Cup", monorandom: "[Gen 8] Monotype Random Battle", bf: "[Gen 7] Battle Factory", - bssf: "[Gen 8] BSS Factory", + bssf: "[Gen 9] BSS Factory", ssb: "[Gen 9] Super Staff Bros Ultimate", ssbu: "[Gen 9] Super Staff Bros Ultimate", lgrandom: "[Gen 7] Let's Go Random Battle", @@ -72,6 +72,7 @@ export const Aliases: {[alias: string]: string} = { gen7ag: "[Gen 7] Anything Goes", gen7bss: "[Gen 7] Battle Spot Singles", gen7bssf: "[Gen 7] BSS Factory", + gen8bssf: "[Gen 8] BSS Factory", lgpeou: "[Gen 7 Let's Go] OU", lgou: "[Gen 7 Let's Go] Let's Go OU", lgdou: "[Gen 7 Let's Go] Doubles OU", diff --git a/data/random-battles/gen9/bss-factory-sets.json b/data/random-battles/gen9/bss-factory-sets.json new file mode 100644 index 000000000000..4a40a0be0ced --- /dev/null +++ b/data/random-battles/gen9/bss-factory-sets.json @@ -0,0 +1,5634 @@ +{ + "chienpao": { + "weight": 10, + "sets": [ + { + "species": "chienpao", + "weight": 35, + "moves": [ + ["iciclecrash"], + ["suckerpunch"], + ["sacredsword"], + ["sheercold", "crunch"] + ], + "item": ["focussash"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["ghost"], + "ability": "swordofruin" + }, + { + "species": "chienpao", + "weight": 15, + "moves": [["iciclecrash"], ["suckerpunch"], ["sacredsword"], ["terablast"]], + "item": ["focussash"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["electric"], + "wantsTera": true, + "ability": "swordofruin" + }, + { + "species": "chienpao", + "weight": 5, + "moves": [ + ["terablast"], + ["sheercold", "sacredsword"], + ["iciclecrash"], + ["suckerpunch"] + ], + "item": ["assaultvest"], + "nature": "adamant", + "evs": [140, 236, 4, 0, 12, 116], + "teraType": ["fairy", "electric", "grass"], + "wantsTera": true, + "ability": "swordofruin" + }, + { + "species": "chienpao", + "weight": 5, + "moves": [ + ["iciclecrash", "icespinner"], + ["terablast"], + ["crunch"], + ["sacredsword"] + ], + "item": ["choicescarf"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["electric", "grass", "fairy"], + "wantsTera": true, + "ability": "swordofruin" + }, + { + "species": "chienpao", + "weight": 10, + "moves": [ + ["iciclecrash", "icespinner"], + ["crunch", "throatchop"], + ["suckerpunch", "iceshard"], + ["sacredsword"] + ], + "item": ["choiceband"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["dark"], + "ability": "swordofruin" + }, + { + "species": "chienpao", + "weight": 10, + "moves": [ + ["iciclecrash", "icespinner"], + ["terablast"], + ["suckerpunch", "iceshard"], + ["sacredsword"] + ], + "item": ["choiceband"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["electric", "fairy", "grass"], + "wantsTera": true, + "ability": "swordofruin" + }, + { + "species": "chienpao", + "weight": 5, + "moves": [ + ["iciclecrash"], + ["recover"], + ["suckerpunch", "iceshard"], + ["sacredsword"] + ], + "item": ["rockyhelmet"], + "nature": "jolly", + "evs": [252, 68, 180, 0, 4, 4], + "teraType": ["fairy", "poison"], + "wantsTera": true, + "ability": "swordofruin" + }, + { + "species": "chienpao", + "weight": 15, + "moves": [ + ["swordsdance"], + ["iciclecrash"], + ["terablast"], + ["iceshard", "suckerpunch"] + ], + "item": ["lumberry"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["electric"], + "wantsTera": true, + "ability": "swordofruin" + } + ] + }, + "dragonite": { + "weight": 10, + "sets": [ + { + "species": "dragonite", + "weight": 40, + "moves": [ + ["extremespeed"], + ["earthquake"], + ["encore", "dragondance"], + ["roost"] + ], + "item": ["rockyhelmet", "leftovers", "heavydutyboots"], + "nature": "adamant", + "evs": [196, 204, 4, 0, 4, 100], + "teraType": ["normal"], + "wantsTera": true, + "ability": "multiscale" + }, + { + "species": "dragonite", + "weight": 10, + "moves": [["terablast"], ["earthquake"], ["dragondance"], ["roost"]], + "item": ["rockyhelmet", "leftovers", "lumberry", "heavydutyboots"], + "nature": "adamant", + "evs": [196, 204, 4, 0, 4, 100], + "teraType": ["flying", "fire", "fairy"], + "wantsTera": true, + "ability": "multiscale" + }, + { + "species": "dragonite", + "weight": 5, + "moves": [["outrage"], ["extremespeed"], ["earthquake"], ["ironhead"]], + "item": ["choiceband"], + "nature": "adamant", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["normal", "steel"], + "wantsTera": true, + "ability": "multiscale" + }, + { + "species": "dragonite", + "weight": 15, + "moves": [["outrage"], ["extremespeed"], ["earthquake"], ["terablast"]], + "item": ["choiceband"], + "nature": "adamant", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["flying"], + "wantsTera": true, + "ability": "multiscale" + }, + { + "species": "dragonite", + "weight": 5, + "moves": [ + ["airslash"], + ["substitute", "encore"], + ["thunderwave"], + ["roost"] + ], + "item": ["rockyhelmet"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "bold", + "evs": [244, 0, 148, 0, 0, 116], + "teraType": ["water", "poison", "fairy"], + "wantsTera": true, + "ability": "multiscale" + }, + { + "species": "dragonite", + "weight": 20, + "moves": [ + ["scaleshot"], + ["ironhead"], + ["earthquake", "lowkick"], + ["dragondance"] + ], + "item": ["loadeddice"], + "nature": "jolly", + "evs": [4, 252, 0, 0, 0, 252], + "teraType": ["steel"], + "wantsTera": true, + "ability": "multiscale" + }, + { + "species": "dragonite", + "weight": 5, + "moves": [ + ["firespin"], + ["earthquake", "thunderwave"], + ["roost"], + ["encore"] + ], + "item": ["leftovers"], + "nature": "careful", + "evs": [244, 12, 0, 0, 252, 0], + "teraType": ["poison", "steel", "fairy"], + "wantsTera": true, + "ability": "multiscale" + } + ] + }, + "fluttermane": { + "weight": 10, + "sets": [ + { + "species": "fluttermane", + "weight": 20, + "moves": [ + ["moonblast"], + ["shadowball", "calmmind"], + ["charm"], + ["painsplit"] + ], + "item": ["boosterenergy"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "timid", + "evs": [252, 0, 252, 4, 0, 0], + "teraType": ["fairy", "water"], + "ability": "protosynthesis" + }, + { + "species": "fluttermane", + "weight": 5, + "moves": [["drainingkiss"], ["shadowball"], ["charm"], ["calmmind"]], + "item": ["boosterenergy"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "timid", + "evs": [252, 0, 252, 4, 0, 0], + "teraType": ["fairy", "water"], + "ability": "protosynthesis" + }, + { + "species": "fluttermane", + "weight": 15, + "moves": [ + ["moonblast"], + ["shadowball"], + ["substitute", "painsplit", "mysticalfire"], + ["calmmind"] + ], + "item": ["boosterenergy"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "timid", + "evs": [4, 0, 132, 116, 4, 252], + "teraType": ["fairy", "water"], + "ability": "protosynthesis" + }, + { + "species": "fluttermane", + "weight": 5, + "moves": [ + ["moonblast"], + ["shadowball", "substitute"], + ["terablast"], + ["calmmind"] + ], + "item": ["boosterenergy"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "timid", + "evs": [4, 0, 132, 116, 4, 252], + "teraType": ["water", "ground"], + "wantsTera": true, + "ability": "protosynthesis" + }, + { + "species": "fluttermane", + "weight": 10, + "moves": [ + ["moonblast"], + ["hex"], + ["painsplit", "taunt"], + ["thunderwave"] + ], + "item": ["boosterenergy"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "bold", + "evs": [228, 0, 252, 0, 0, 28], + "teraType": ["water"], + "ability": "protosynthesis" + }, + { + "species": "fluttermane", + "weight": 5, + "moves": [ + ["moonblast"], + ["shadowball"], + ["thunderbolt", "powergem", "hypervoice"], + ["perishsong"] + ], + "item": ["choicescarf"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "modest", + "evs": [20, 0, 44, 204, 4, 236], + "teraType": ["fairy"], + "ability": "protosynthesis" + }, + { + "species": "fluttermane", + "weight": 25, + "moves": [ + ["moonblast"], + ["shadowball"], + ["thunderbolt", "psyshock", "powergem", "mysticalfire", "hypervoice"], + ["perishsong"] + ], + "item": ["choicespecs"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "timid", + "evs": [0, 0, 0, 252, 4, 252], + "teraType": ["fairy"], + "ability": "protosynthesis" + }, + { + "species": "fluttermane", + "weight": 10, + "moves": [ + ["moonblast"], + ["shadowball", "hex"], + ["thunderwave"], + ["taunt"] + ], + "item": ["focussash"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "timid", + "evs": [0, 0, 0, 252, 4, 252], + "teraType": ["normal"], + "ability": "protosynthesis" + }, + { + "species": "fluttermane", + "weight": 5, + "moves": [ + ["moonblast"], + ["shadowball"], + ["psyshock"], + ["mysticalfire", "energyball"] + ], + "item": ["assaultvest"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "modest", + "evs": [164, 0, 28, 196, 4, 116], + "teraType": ["fire", "grass"], + "ability": "protosynthesis" + } + ] + }, + "urshifurapidstrike": { + "weight": 10, + "sets": [ + { + "species": "urshifurapidstrike", + "weight": 40, + "moves": [ + ["surgingstrikes"], + ["closecombat", "drainpunch"], + ["aquajet", "substitute"], + ["swordsdance"] + ], + "item": ["punchingglove"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["water", "poison", "grass"], + "wantsTera": true, + "ability": "unseenfist" + }, + { + "species": "urshifurapidstrike", + "weight": 25, + "moves": [["surgingstrikes"], ["closecombat"], ["uturn"], ["icepunch"]], + "item": ["choicescarf"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["water"], + "ability": "unseenfist" + }, + { + "species": "urshifurapidstrike", + "weight": 15, + "moves": [["surgingstrikes"], ["closecombat"], ["uturn"], ["aquajet"]], + "item": ["choiceband"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["water", "poison", "grass"], + "ability": "unseenfist" + }, + { + "species": "urshifurapidstrike", + "weight": 20, + "moves": [ + ["surgingstrikes"], + ["closecombat"], + ["aquajet"], + ["counter", "icepunch"] + ], + "item": ["focussash"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["water", "ghost"], + "ability": "unseenfist" + } + ] + }, + "ogerponhearthflame": { + "weight": 10, + "sets": [ + { + "species": "ogerponhearthflame", + "weight": 40, + "moves": [ + ["ivycudgel"], + ["playrough", "knockoff"], + ["swordsdance", "encore"], + ["hornleech", "trailblaze"] + ], + "gender": "f", + "item": ["hearthflamemask"], + "nature": "jolly", + "evs": [4, 252, 0, 0, 0, 252], + "teraType": ["fire"], + "ability": "moldbreaker" + }, + { + "species": "ogerponhearthflame", + "weight": 40, + "moves": [ + ["ivycudgel"], + ["hornleech"], + ["swordsdance"], + ["substitute", "playrough", "trailblaze"] + ], + "gender": "f", + "item": ["hearthflamemask"], + "nature": "jolly", + "evs": [156, 36, 4, 0, 60, 252], + "teraType": ["fire"], + "ability": "moldbreaker" + }, + { + "species": "ogerponhearthflame", + "weight": 20, + "moves": [ + ["ivycudgel"], + ["substitute"], + ["leechseed"], + ["hornleech", "playrough", "encore"] + ], + "item": ["hearthflamemask"], + "nature": "jolly", + "evs": [156, 36, 4, 0, 60, 252], + "teraType": ["fire"], + "ability": "moldbreaker" + } + ] + }, + "ursalunabloodmoon": { + "weight": 10, + "sets": [ + { + "species": "ursalunabloodmoon", + "weight": 15, + "moves": [["bloodmoon"], ["earthpower"], ["vacuumwave"], ["bodypress"]], + "item": ["rockyhelmet"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "bold", + "evs": [116, 0, 236, 4, 116, 36], + "teraType": ["poison", "fairy"], + "ability": "mindseye" + }, + { + "species": "ursalunabloodmoon", + "weight": 25, + "moves": [ + ["hypervoice", "bloodmoon"], + ["moonlight"], + ["calmmind"], + ["yawn"] + ], + "item": ["covertcloak", "leftovers"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "modest", + "evs": [100, 0, 4, 236, 12, 156], + "teraType": ["poison", "fairy"], + "ability": "mindseye" + }, + { + "species": "ursalunabloodmoon", + "weight": 60, + "moves": [["bloodmoon"], ["vacuumwave"], ["earthpower"], ["hypervoice"]], + "item": ["assaultvest"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "modest", + "evs": [4, 0, 0, 252, 252, 0], + "teraType": ["fairy", "normal"], + "ability": "mindseye" + } + ] + }, + "ironbundle": { + "weight": 9, + "sets": [ + { + "species": "ironbundle", + "weight": 10, + "moves": [["flipturn"], ["freezedry"], ["hydropump"], ["encore"]], + "item": ["focussash"], + "nature": "timid", + "evs": [0, 0, 0, 252, 4, 252], + "teraType": ["ghost"], + "ability": "quarkdrive" + }, + { + "species": "ironbundle", + "weight": 70, + "moves": [["substitute"], ["encore"], ["hydropump"], ["freezedry"]], + "item": ["boosterenergy"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "timid", + "evs": [0, 0, 0, 252, 4, 252], + "teraType": ["ghost", "water", "steel"], + "ability": "quarkdrive" + }, + { + "species": "ironbundle", + "weight": 10, + "moves": [["icebeam"], ["hydropump"], ["freezedry"], ["terablast"]], + "item": ["choicespecs"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "timid", + "evs": [0, 0, 0, 252, 4, 252], + "teraType": ["fairy"], + "ability": "quarkdrive" + }, + { + "species": "ironbundle", + "weight": 10, + "moves": [["icebeam"], ["hydropump"], ["freezedry"], ["flipturn"]], + "item": ["choicespecs"], + "nature": "timid", + "evs": [0, 0, 0, 252, 4, 252], + "teraType": ["water"], + "ability": "quarkdrive" + } + ] + }, + "urshifu": { + "weight": 9, + "sets": [ + { + "species": "urshifu", + "weight": 55, + "moves": [ + ["swordsdance"], + ["wickedblow"], + ["closecombat", "drainpunch"], + ["suckerpunch"] + ], + "item": ["focussash"], + "nature": "jolly", + "evs": [0, 252, 4, 0, 0, 252], + "teraType": ["dark", "ghost"], + "ability": "unseenfist" + }, + { + "species": "urshifu", + "weight": 25, + "moves": [ + ["swordsdance"], + ["wickedblow"], + ["closecombat", "drainpunch"], + ["suckerpunch"] + ], + "item": ["blackglasses"], + "nature": "jolly", + "evs": [0, 252, 4, 0, 0, 252], + "teraType": ["dark", "poison", "ghost"], + "ability": "unseenfist" + }, + { + "species": "urshifu", + "weight": 5, + "moves": [ + ["counter"], + ["wickedblow"], + ["closecombat", "drainpunch"], + ["suckerpunch"] + ], + "item": ["focussash"], + "nature": "jolly", + "evs": [0, 252, 4, 0, 0, 252], + "teraType": ["dark", "ghost"], + "ability": "unseenfist" + }, + { + "species": "urshifu", + "weight": 5, + "moves": [ + ["wickedblow"], + ["closecombat", "drainpunch"], + ["suckerpunch"], + ["uturn"] + ], + "item": ["choiceband"], + "nature": "jolly", + "evs": [0, 252, 4, 0, 0, 252], + "teraType": ["dark", "poison", "ghost"], + "ability": "unseenfist" + }, + { + "species": "urshifu", + "weight": 5, + "moves": [ + ["wickedblow"], + ["closecombat", "drainpunch"], + ["suckerpunch"], + ["ironhead"] + ], + "item": ["choiceband"], + "nature": "jolly", + "evs": [0, 252, 4, 0, 0, 252], + "teraType": ["steel"], + "wantsTera": true, + "ability": "unseenfist" + }, + { + "species": "urshifu", + "weight": 5, + "moves": [["wickedblow"], ["closecombat"], ["suckerpunch"], ["uturn"]], + "item": ["choicescarf"], + "nature": "jolly", + "evs": [0, 252, 4, 0, 0, 252], + "teraType": ["dark"], + "ability": "unseenfist" + } + ] + }, + "tinglu": { + "weight": 9, + "sets": [ + { + "species": "tinglu", + "weight": 65, + "moves": [ + ["stealthrock"], + ["ruination"], + ["earthquake", "heavyslam"], + ["whirlwind"] + ], + "item": ["sitrusberry"], + "nature": "impish", + "evs": [244, 20, 116, 0, 124, 4], + "teraType": ["water", "fairy", "poison"], + "ability": "vesselofruin" + }, + { + "species": "tinglu", + "weight": 15, + "moves": [ + ["stealthrock"], + ["spikes"], + ["earthquake", "heavyslam"], + ["whirlwind"] + ], + "item": ["sitrusberry"], + "nature": "impish", + "evs": [244, 20, 116, 0, 124, 4], + "teraType": ["water", "fairy", "poison"], + "ability": "vesselofruin" + }, + { + "species": "tinglu", + "weight": 5, + "moves": [ + ["earthquake"], + ["heavyslam"], + ["fissure", "stoneedge"], + ["ruination"] + ], + "item": ["assaultvest"], + "nature": "adamant", + "evs": [4, 252, 4, 0, 108, 140], + "teraType": ["steel"], + "ability": "vesselofruin" + }, + { + "species": "tinglu", + "weight": 5, + "moves": [["earthquake"], ["heavyslam"], ["terablast"], ["ruination"]], + "item": ["assaultvest"], + "nature": "adamant", + "evs": [4, 252, 4, 0, 108, 140], + "teraType": ["electric", "fairy"], + "wantsTera": true, + "ability": "vesselofruin" + }, + { + "species": "tinglu", + "weight": 10, + "moves": [["earthquake"], ["heavyslam"], ["rocktomb"], ["ruination"]], + "item": ["sitrusberry"], + "nature": "impish", + "evs": [244, 76, 116, 0, 68, 4], + "teraType": ["steel"], + "ability": "vesselofruin" + } + ] + }, + "gholdengo": { + "weight": 9, + "sets": [ + { + "species": "gholdengo", + "weight": 25, + "moves": [ + ["makeitrain"], + ["shadowball"], + ["thunderbolt", "recover", "focusblast"], + ["trick"] + ], + "item": ["choicespecs"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "timid", + "evs": [0, 0, 0, 252, 4, 252], + "teraType": ["steel", "flying", "water"], + "ability": "goodasgold" + }, + { + "species": "gholdengo", + "weight": 30, + "moves": [ + ["makeitrain"], + ["shadowball"], + ["thunderbolt", "recover", "focusblast"], + ["trick"] + ], + "item": ["choicescarf"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "timid", + "evs": [0, 0, 0, 252, 4, 252], + "teraType": ["steel", "water", "flying", "normal"], + "ability": "goodasgold" + }, + { + "species": "gholdengo", + "weight": 15, + "moves": [ + ["makeitrain", "focusblast"], + ["hex"], + ["thunderwave"], + ["recover"] + ], + "item": ["rockyhelmet"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "bold", + "evs": [252, 0, 252, 4, 0, 0], + "teraType": ["water", "flying"], + "ability": "goodasgold" + }, + { + "species": "gholdengo", + "weight": 20, + "moves": [["makeitrain"], ["shadowball"], ["nastyplot"], ["recover"]], + "item": ["covertcloak"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "modest", + "evs": [164, 0, 156, 36, 4, 148], + "teraType": ["flying"], + "ability": "goodasgold" + }, + { + "species": "gholdengo", + "weight": 5, + "moves": [["terablast"], ["shadowball"], ["nastyplot"], ["recover"]], + "item": ["covertcloak"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "modest", + "evs": [164, 0, 156, 36, 4, 148], + "teraType": ["water", "fighting"], + "wantsTera": true, + "ability": "goodasgold" + }, + { + "species": "gholdengo", + "weight": 5, + "moves": [ + ["makeitrain"], + ["shadowball"], + ["nastyplot"], + ["recover", "substitute", "psyshock"] + ], + "item": ["airballoon"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "timid", + "evs": [0, 0, 0, 252, 4, 252], + "teraType": ["flying"], + "ability": "goodasgold" + } + ] + }, + "chiyu": { + "weight": 9, + "sets": [ + { + "species": "chiyu", + "weight": 20, + "moves": [["overheat"], ["darkpulse"], ["terablast"], ["flamethrower"]], + "item": ["choicescarf"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "modest", + "evs": [116, 0, 84, 156, 4, 148], + "teraType": ["fairy", "grass"], + "wantsTera": true, + "ability": "beadsofruin" + }, + { + "species": "chiyu", + "weight": 35, + "moves": [["overheat"], ["lavaplume"], ["darkpulse"], ["psychic"]], + "item": ["choicescarf"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "modest", + "evs": [0, 0, 0, 252, 4, 252], + "teraType": ["ghost", "fire"], + "ability": "beadsofruin" + }, + { + "species": "chiyu", + "weight": 10, + "moves": [ + ["ruination", "flamecharge"], + ["overheat"], + ["darkpulse"], + ["terablast"] + ], + "item": ["assaultvest"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "calm", + "evs": [252, 0, 4, 76, 156, 20], + "teraType": ["water", "fairy", "grass", "ghost"], + "wantsTera": true, + "ability": "beadsofruin" + }, + { + "species": "chiyu", + "weight": 5, + "moves": [["lavaplume"], ["ruination"], ["taunt"], ["darkpulse"]], + "item": ["focussash"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "timid", + "evs": [0, 0, 0, 252, 4, 252], + "teraType": ["ghost"], + "ability": "beadsofruin" + }, + { + "species": "chiyu", + "weight": 20, + "moves": [["overheat"], ["flamethrower"], ["darkpulse"], ["psychic"]], + "item": ["choicespecs"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "timid", + "evs": [0, 0, 0, 252, 4, 252], + "teraType": ["fire"], + "ability": "beadsofruin" + }, + { + "species": "chiyu", + "weight": 10, + "moves": [["overheat"], ["flamethrower"], ["darkpulse"], ["terablast"]], + "item": ["choicespecs"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "timid", + "evs": [0, 0, 0, 252, 4, 252], + "teraType": ["fairy", "ghost", "water"], + "wantsTera": true, + "ability": "beadsofruin" + } + ] + }, + "garganacl": { + "weight": 9, + "sets": [ + { + "species": "garganacl", + "weight": 45, + "moves": [ + ["saltcure"], + ["protect"], + ["recover"], + ["substitute", "fissure", "stealthrock"] + ], + "item": ["leftovers"], + "nature": "impish", + "evs": [252, 4, 252, 0, 0, 0], + "teraType": ["fairy", "water", "poison"], + "wantsTera": true, + "ability": "purifyingsalt" + }, + { + "species": "garganacl", + "weight": 20, + "moves": [ + ["saltcure"], + ["recover"], + ["curse"], + ["substitute", "protect", "earthquake"] + ], + "item": ["leftovers"], + "nature": "careful", + "evs": [252, 4, 0, 0, 252, 0], + "teraType": ["ghost"], + "wantsTera": true, + "ability": "purifyingsalt" + }, + { + "species": "garganacl", + "weight": 35, + "moves": [["saltcure"], ["recover"], ["irondefense"], ["bodypress"]], + "item": ["leftovers"], + "nature": "careful", + "evs": [252, 0, 4, 0, 252, 0], + "teraType": ["fairy", "water", "poison"], + "wantsTera": true, + "ability": "purifyingsalt" + } + ] + }, + "garchomp": { + "weight": 8, + "sets": [ + { + "species": "garchomp", + "weight": 45, + "moves": [ + ["scaleshot"], + ["earthquake"], + ["ironhead", "substitute"], + ["swordsdance"] + ], + "item": ["loadeddice"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["steel"], + "wantsTera": true, + "ability": "roughskin" + }, + { + "species": "garchomp", + "weight": 25, + "moves": [["stealthrock"], ["spikes"], ["earthquake"], ["dragontail"]], + "item": ["sitrusberry"], + "nature": "impish", + "evs": [180, 4, 36, 0, 172, 116], + "teraType": ["steel"], + "wantsTera": true, + "ability": "roughskin" + }, + { + "species": "garchomp", + "weight": 10, + "moves": [ + ["outrage", "scaleshot"], + ["earthquake"], + ["rocktomb"], + ["ironhead"] + ], + "item": ["choiceband", "choicescarf"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["steel"], + "wantsTera": true, + "ability": "roughskin" + }, + { + "species": "garchomp", + "weight": 5, + "moves": [["earthquake"], ["ironhead"], ["scaleshot"], ["dragontail"]], + "item": ["assaultvest"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["steel"], + "ability": "roughskin" + }, + { + "species": "garchomp", + "weight": 10, + "moves": [ + ["outrage", "scaleshot"], + ["earthquake"], + ["rocktomb"], + ["terablast"] + ], + "item": ["choiceband", "choicescarf"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["fairy", "fire"], + "wantsTera": true, + "ability": "roughskin" + }, + { + "species": "garchomp", + "weight": 5, + "moves": [["earthquake"], ["terablast"], ["scaleshot"], ["dragontail"]], + "item": ["assaultvest"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["fairy"], + "wantsTera": true, + "ability": "roughskin" + } + ] + }, + "landorustherian": { + "weight": 8, + "sets": [ + { + "species": "landorustherian", + "weight": 30, + "moves": [ + ["stealthrock"], + ["earthquake"], + ["rocktomb", "taunt"], + ["uturn"] + ], + "item": ["sitrusberry", "rockyhelmet", "leftovers"], + "nature": "impish", + "evs": [252, 0, 252, 0, 4, 0], + "teraType": ["water", "steel", "fairy"], + "ability": "intimidate" + }, + { + "species": "landorustherian", + "weight": 45, + "moves": [ + ["earthquake"], + ["uturn"], + ["terablast"], + ["stoneedge", "rocktomb"] + ], + "item": ["choicescarf"], + "nature": "jolly", + "evs": [0, 252, 4, 0, 0, 252], + "teraType": ["flying"], + "wantsTera": true, + "ability": "intimidate" + }, + { + "species": "landorustherian", + "weight": 15, + "moves": [ + ["earthquake"], + ["uturn"], + ["terablast"], + ["stoneedge", "rocktomb"] + ], + "item": ["choicescarf", "choiceband"], + "nature": "jolly", + "evs": [0, 252, 4, 0, 0, 252], + "teraType": ["flying", "fairy"], + "wantsTera": true, + "ability": "intimidate" + }, + { + "species": "landorustherian", + "weight": 5, + "moves": [ + ["earthquake"], + ["uturn"], + ["terablast", "fissure"], + ["rocktomb", "smackdown"] + ], + "item": ["assaultvest"], + "nature": "adamant", + "evs": [252, 4, 0, 0, 252, 0], + "teraType": ["steel"], + "wantsTera": true, + "ability": "intimidate" + }, + { + "species": "landorustherian", + "weight": 5, + "moves": [["earthquake"], ["rocktomb"], ["uturn"], ["terablast"]], + "item": ["assaultvest"], + "nature": "adamant", + "evs": [252, 252, 4, 0, 0, 0], + "teraType": ["flying", "water"], + "wantsTera": true, + "ability": "intimidate" + } + ] + }, + "scizor": { + "weight": 8, + "sets": [ + { + "species": "scizor", + "weight": 15, + "moves": [ + ["swordsdance"], + ["bulletpunch"], + ["closecombat"], + ["knockoff", "uturn", "terablast"] + ], + "item": ["sitrusberry"], + "nature": "adamant", + "evs": [252, 28, 204, 0, 20, 4], + "teraType": ["water"], + "wantsTera": true, + "ability": "technician" + }, + { + "species": "scizor", + "weight": 20, + "moves": [ + ["swordsdance"], + ["bulletpunch"], + ["uturn", "closecombat"], + ["knockoff"] + ], + "item": ["sitrusberry"], + "nature": "adamant", + "evs": [252, 28, 204, 0, 20, 4], + "teraType": ["steel", "flying"], + "wantsTera": true, + "ability": "technician" + }, + { + "species": "scizor", + "weight": 50, + "moves": [["bulletpunch"], ["uturn"], ["knockoff"], ["closecombat"]], + "item": ["choiceband", "assaultvest"], + "nature": "adamant", + "evs": [236, 244, 20, 0, 4, 4], + "teraType": ["steel", "water"], + "wantsTera": true, + "ability": "technician" + }, + { + "species": "scizor", + "weight": 15, + "moves": [ + ["bulletpunch"], + ["uturn"], + ["knockoff", "terablast"], + ["closecombat"] + ], + "item": ["assaultvest"], + "nature": "adamant", + "evs": [236, 244, 20, 0, 4, 4], + "teraType": ["water"], + "wantsTera": true, + "ability": "technician" + } + ] + }, + "toxapex": { + "weight": 8, + "sets": [ + { + "species": "toxapex", + "weight": 40, + "moves": [ + ["toxic"], + ["toxicspikes", "banefulbunker"], + ["recover"], + ["haze"] + ], + "item": ["blacksludge", "mentalherb"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "bold", + "evs": [252, 0, 252, 0, 4, 0], + "teraType": ["poison"], + "ability": "regenerator" + }, + { + "species": "toxapex", + "weight": 60, + "moves": [["toxic"], ["liquidation"], ["recover"], ["haze"]], + "item": ["rockyhelmet", "leftovers"], + "nature": "impish", + "evs": [252, 0, 252, 0, 4, 0], + "teraType": ["fairy", "poison"], + "ability": "regenerator" + } + ] + }, + "roaringmoon": { + "weight": 8, + "sets": [ + { + "species": "roaringmoon", + "weight": 40, + "moves": [ + ["dragondance"], + ["acrobatics"], + ["earthquake", "roost", "taunt"], + ["knockoff"] + ], + "item": ["boosterenergy"], + "nature": "jolly", + "evs": [0, 220, 36, 0, 0, 252], + "teraType": ["flying"], + "wantsTera": true, + "ability": "protosynthesis" + }, + { + "species": "roaringmoon", + "weight": 10, + "moves": [ + ["dragondance"], + ["ironhead"], + ["earthquake", "roost", "taunt"], + ["knockoff"] + ], + "item": ["boosterenergy"], + "nature": "jolly", + "evs": [0, 220, 36, 0, 0, 252], + "teraType": ["steel"], + "wantsTera": true, + "ability": "protosynthesis" + }, + { + "species": "roaringmoon", + "weight": 5, + "moves": [["jawlock"], ["roost"], ["taunt"], ["dragondance"]], + "item": ["leftovers", "shedshell"], + "nature": "impish", + "evs": [244, 4, 196, 0, 36, 28], + "teraType": ["poison", "fairy"], + "wantsTera": true, + "ability": "protosynthesis" + }, + { + "species": "roaringmoon", + "weight": 10, + "moves": [ + ["knockoff"], + ["uturn"], + ["earthquake", "scaleshot"], + ["terablast"] + ], + "item": ["choicescarf", "choiceband"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["fairy", "fire"], + "wantsTera": true, + "ability": "protosynthesis" + }, + { + "species": "roaringmoon", + "weight": 25, + "moves": [ + ["knockoff"], + ["uturn", "earthquake"], + ["ironhead"], + ["outrage"] + ], + "item": ["choiceband"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["steel", "dark"], + "wantsTera": true, + "ability": "protosynthesis" + }, + { + "species": "roaringmoon", + "weight": 10, + "moves": [["dragondance"], ["knockoff"], ["earthquake"], ["scaleshot"]], + "item": ["loadeddice"], + "nature": "jolly", + "evs": [4, 252, 0, 0, 0, 252], + "teraType": ["steel"], + "wantsTera": true, + "ability": "protosynthesis" + } + ] + }, + "dragapult": { + "weight": 8, + "sets": [ + { + "species": "dragapult", + "weight": 30, + "moves": [ + ["dragondarts"], + ["uturn"], + ["suckerpunch"], + ["phantomforce"] + ], + "item": ["choiceband"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["dragon", "steel"], + "ability": "infiltrator" + }, + { + "species": "dragapult", + "weight": 5, + "moves": [["dragondarts"], ["uturn"], ["suckerpunch"], ["terablast"]], + "item": ["choiceband", "choicescarf"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["ghost", "fire", "steel", "fairy"], + "wantsTera": true, + "ability": "infiltrator" + }, + { + "species": "dragapult", + "weight": 15, + "moves": [ + ["reflect"], + ["lightscreen"], + ["curse"], + ["shadowball", "willowisp"] + ], + "item": ["lightclay"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "timid", + "evs": [244, 0, 12, 0, 0, 252], + "teraType": ["ghost", "normal"], + "ability": "cursedbody" + }, + { + "species": "dragapult", + "weight": 10, + "moves": [ + ["dragondarts"], + ["terablast", "batonpass"], + ["substitute"], + ["dragondance"] + ], + "item": ["lifeorb"], + "nature": "jolly", + "evs": [0, 252, 4, 0, 0, 252], + "teraType": ["fire"], + "wantsTera": true, + "ability": "clearbody" + }, + { + "species": "dragapult", + "weight": 25, + "moves": [ + ["dracometeor"], + ["hex", "shadowball"], + ["willowisp"], + ["thunderwave"] + ], + "item": ["focussash"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "timid", + "evs": [0, 0, 4, 252, 0, 252], + "teraType": ["ghost", "normal"], + "ability": "cursedbody" + }, + { + "species": "dragapult", + "weight": 15, + "moves": [ + ["shadowball"], + ["dracometeor"], + ["thunderbolt"], + ["flamethrower", "uturn"] + ], + "item": ["choicespecs", "choicescarf"], + "nature": "timid", + "evs": [0, 0, 0, 252, 4, 252], + "teraType": ["ghost", "fire", "electric", "fighting"], + "ability": "infiltrator" + } + ] + }, + "baxcalibur": { + "weight": 8, + "sets": [ + { + "species": "baxcalibur", + "weight": 5, + "moves": [ + ["glaiverush", "scaleshot"], + ["earthquake"], + ["iceshard"], + ["swordsdance", "iciclespear"] + ], + "item": ["lifeorb", "focussash"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["dragon", "ghost"], + "wantsTera": true, + "ability": "thermalexchange" + }, + { + "species": "baxcalibur", + "weight": 75, + "moves": [ + ["scaleshot", "iceshard"], + ["iciclespear"], + ["earthquake"], + ["swordsdance", "dragondance"] + ], + "item": ["loadeddice"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["ice", "ground", "ghost"], + "wantsTera": true, + "ability": "thermalexchange" + }, + { + "species": "baxcalibur", + "weight": 10, + "moves": [ + ["iciclecrash", "iciclespear"], + ["iceshard"], + ["glaiverush"], + ["earthquake"] + ], + "item": ["assaultvest"], + "nature": "adamant", + "evs": [252, 252, 0, 0, 4, 0], + "teraType": ["ground"], + "wantsTera": true, + "ability": "thermalexchange" + }, + { + "species": "baxcalibur", + "weight": 5, + "moves": [["iciclespear"], ["iceshard"], ["terablast"], ["earthquake"]], + "item": ["assaultvest"], + "nature": "adamant", + "evs": [252, 252, 0, 0, 4, 0], + "teraType": ["fairy", "electric", "fire"], + "wantsTera": true, + "ability": "thermalexchange" + }, + { + "species": "baxcalibur", + "weight": 5, + "moves": [ + ["glaiverush", "scaleshot"], + ["earthquake"], + ["iceshard"], + ["iciclespear"] + ], + "item": ["choiceband"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["dragon", "ice"], + "wantsTera": true, + "ability": "thermalexchange" + } + ] + }, + "ninetalesalola": { + "weight": 8, + "sets": [ + { + "species": "ninetalesalola", + "weight": 80, + "moves": [ + ["auroraveil"], + ["moonblast"], + ["encore"], + ["blizzard", "freezedry"] + ], + "item": ["lightclay"], + "nature": "timid", + "evs": [4, 0, 0, 252, 0, 252], + "teraType": ["ice", "water", "fire"], + "ability": "snowwarning" + }, + { + "species": "ninetalesalola", + "weight": 10, + "moves": [["auroraveil"], ["moonblast"], ["encore"], ["disable"]], + "item": ["lightclay", "rockyhelmet"], + "nature": "timid", + "evs": [4, 0, 0, 252, 0, 252], + "teraType": ["water", "fire"], + "ability": "snowwarning" + }, + { + "species": "ninetalesalola", + "weight": 20, + "moves": [["auroraveil"], ["moonblast"], ["encore"], ["terablast"]], + "item": ["lightclay"], + "nature": "timid", + "evs": [4, 0, 0, 252, 0, 252], + "teraType": ["water", "fire"], + "wantsTera": true, + "ability": "snowwarning" + } + ] + }, + "ogerponcornerstone": { + "weight": 8, + "sets": [ + { + "species": "ogerponcornerstone", + "weight": 100, + "moves": [ + ["ivycudgel"], + ["hornleech"], + ["knockoff", "encore"], + ["quickattack", "swordsdance", "rocktomb"] + ], + "gender": "f", + "item": ["cornerstonemask"], + "nature": "jolly", + "evs": [4, 252, 0, 0, 0, 252], + "teraType": ["rock"], + "ability": "sturdy" + } + ] + }, + "ogerponwellspring": { + "weight": 8, + "sets": [ + { + "species": "ogerponwellspring", + "weight": 60, + "moves": [ + ["ivycudgel"], + ["hornleech", "leechseed"], + ["encore", "substitute"], + ["synthesis"] + ], + "gender": "f", + "item": ["wellspringmask"], + "nature": "careful", + "evs": [252, 4, 4, 0, 188, 60], + "teraType": ["water"], + "ability": "waterabsorb" + }, + { + "species": "ogerponwellspring", + "weight": 40, + "moves": [ + ["ivycudgel"], + ["hornleech"], + ["knockoff", "playrough"], + ["leechseed", "swordsdance"] + ], + "gender": "f", + "item": ["wellspringmask"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["water"], + "ability": "waterabsorb" + } + ] + }, + "glimmora": { + "weight": 8, + "sets": [ + { + "species": "glimmora", + "weight": 30, + "moves": [["powergem"], ["energyball"], ["stealthrock"], ["endure"]], + "item": ["redcard"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "calm", + "evs": [252, 0, 0, 0, 124, 132], + "teraType": ["grass"], + "ability": "toxicdebris" + }, + { + "species": "glimmora", + "weight": 30, + "moves": [ + ["stealthrock"], + ["powergem", "sludgewave", "energyball"], + ["mudshot", "earthpower"], + ["mortalspin"] + ], + "item": ["focussash"], + "nature": "timid", + "evs": [4, 0, 0, 252, 0, 252], + "teraType": ["flying", "grass"], + "ability": "toxicdebris" + }, + { + "species": "glimmora", + "weight": 5, + "moves": [ + ["mortalspin"], + ["toxicspikes", "stealthrock"], + ["mudshot"], + ["powergem", "sludgebomb"] + ], + "item": ["airballoon", "leftovers"], + "nature": "bold", + "evs": [244, 0, 76, 0, 188, 0], + "teraType": ["flying", "grass"], + "ability": "toxicdebris" + }, + { + "species": "glimmora", + "weight": 20, + "moves": [ + ["sludgewave", "mortalspin"], + ["earthpower"], + ["energyball"], + ["dazzlinggleam", "powergem"] + ], + "item": ["assaultvest"], + "nature": "modest", + "evs": [252, 0, 0, 252, 4, 0], + "teraType": ["grass", "ground", "fairy"], + "ability": "toxicdebris" + }, + { + "species": "glimmora", + "weight": 15, + "moves": [ + ["sludgewave"], + ["earthpower"], + ["energyball"], + ["dazzlinggleam", "powergem"] + ], + "item": ["choicescarf"], + "nature": "timid", + "evs": [0, 0, 0, 252, 4, 252], + "teraType": ["grass", "ground", "fairy"], + "ability": "toxicdebris" + } + ] + }, + "annihilape": { + "weight": 7, + "sets": [ + { + "species": "annihilape", + "weight": 35, + "moves": [ + ["drainpunch"], + ["ragefist"], + ["bulkup"], + ["taunt", "encore"] + ], + "item": ["leftovers", "sitrusberry"], + "nature": "jolly", + "evs": [252, 0, 4, 0, 0, 252], + "teraType": ["fire", "steel", "poison"], + "ability": "vitalspirit" + }, + { + "species": "annihilape", + "weight": 25, + "moves": [ + ["stealthrock"], + ["ragefist"], + ["drainpunch"], + ["taunt", "finalgambit", "rocktomb"] + ], + "item": ["sitrusberry"], + "nature": "impish", + "evs": [244, 0, 244, 0, 0, 20], + "teraType": ["steel", "fire", "normal"], + "ability": "vitalspirit" + }, + { + "species": "annihilape", + "weight": 25, + "moves": [ + ["stealthrock"], + ["ragefist"], + ["drainpunch", "closecombat"], + ["taunt", "finalgambit", "rocktomb"] + ], + "item": ["focussash", "roseliberry"], + "nature": "jolly", + "evs": [252, 4, 0, 0, 0, 252], + "teraType": ["steel", "fire", "normal"], + "ability": "vitalspirit" + }, + { + "species": "annihilape", + "weight": 15, + "moves": [ + ["uturn"], + ["closecombat"], + ["shadowclaw", "ragefist"], + ["finalgambit"] + ], + "item": ["choicescarf"], + "nature": "jolly", + "evs": [252, 4, 0, 0, 0, 252], + "teraType": ["ghost", "normal"], + "ability": "defiant" + } + ] + }, + "heatran": { + "weight": 7, + "sets": [ + { + "species": "heatran", + "weight": 35, + "moves": [ + ["magmastorm"], + ["taunt"], + ["protect"], + ["substitute", "earthpower", "terablast"] + ], + "item": ["leftovers"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "calm", + "evs": [252, 0, 4, 0, 252, 0], + "teraType": ["grass"], + "wantsTera": true, + "ability": "flashfire" + }, + { + "species": "heatran", + "weight": 40, + "moves": [["magmastorm"], ["earthpower"], ["flashcannon"], ["terablast"]], + "item": ["assaultvest"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "modest", + "evs": [252, 0, 4, 252, 0, 0], + "teraType": ["grass", "fairy"], + "wantsTera": true, + "ability": "flashfire" + }, + { + "species": "heatran", + "weight": 25, + "moves": [ + ["magmastorm"], + ["flashcannon"], + ["terablast", "stealthrock"], + ["willowisp"] + ], + "item": ["sitrusberry", "rockyhelmet"], + "nature": "bold", + "evs": [252, 0, 252, 4, 0, 0], + "teraType": ["fairy", "grass"], + "wantsTera": true, + "ability": "flamebody" + } + ] + }, + "breloom": { + "weight": 7, + "sets": [ + { + "species": "breloom", + "weight": 80, + "moves": [ + ["bulletseed"], + ["machpunch"], + ["bulldoze", "rocktomb"], + ["spore"] + ], + "item": ["focussash"], + "nature": "adamant", + "evs": [4, 252, 0, 0, 0, 252], + "teraType": ["grass", "fighting", "ground"], + "ability": "technician" + }, + { + "species": "breloom", + "weight": 10, + "moves": [ + ["bulletseed"], + ["machpunch"], + ["terablast"], + ["spore", "swordsdance"] + ], + "item": ["loadeddice"], + "nature": "adamant", + "evs": [4, 252, 0, 0, 0, 252], + "teraType": ["fire"], + "wantsTera": true, + "ability": "technician" + }, + { + "species": "breloom", + "weight": 10, + "moves": [ + ["substitute"], + ["leechseed", "toxic"], + ["spore"], + ["protect"] + ], + "item": ["toxicorb"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "bold", + "evs": [204, 0, 252, 0, 48, 4], + "teraType": ["steel", "fire"], + "wantsTera": true, + "ability": "poisonheal" + } + ] + }, + "cresselia": { + "weight": 7, + "sets": [ + { + "species": "cresselia", + "weight": 60, + "moves": [["storedpower"], ["moonblast"], ["calmmind"], ["moonlight"]], + "item": ["covertcloak", "leftovers"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "bold", + "evs": [252, 0, 116, 0, 0, 140], + "teraType": ["electric", "poison"], + "wantsTera": true, + "ability": "levitate" + }, + { + "species": "cresselia", + "weight": 40, + "moves": [ + ["icebeam", "moonblast"], + ["thunderwave", "trickroom"], + ["moonlight"], + ["lunardance"] + ], + "item": ["rockyhelmet", "mentalherb"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "bold", + "evs": [252, 0, 252, 4, 0, 0], + "teraType": ["steel"], + "ability": "levitate" + } + ] + }, + "dondozo": { + "weight": 7, + "sets": [ + { + "species": "dondozo", + "weight": 60, + "moves": [ + ["fissure"], + ["wavecrash", "heavyslam"], + ["protect", "rest"], + ["yawn"] + ], + "item": ["leftovers"], + "nature": "impish", + "evs": [244, 0, 148, 0, 116, 0], + "teraType": ["grass", "fairy", "steel"], + "ability": "unaware" + }, + { + "species": "dondozo", + "weight": 20, + "moves": [ + ["fissure"], + ["wavecrash", "bodypress"], + ["protect", "rest"], + ["yawn"] + ], + "item": ["leftovers"], + "nature": "impish", + "evs": [244, 0, 252, 0, 12, 0], + "teraType": ["grass", "fairy", "steel"], + "ability": "unaware" + }, + { + "species": "dondozo", + "weight": 10, + "moves": [ + ["bodypress", "earthquake", "fissure", "avalanche"], + ["wavecrash"], + ["rest"], + ["yawn", "sleeptalk"] + ], + "item": ["rockyhelmet"], + "nature": "impish", + "evs": [244, 0, 252, 0, 12, 0], + "teraType": ["grass", "fairy", "steel"], + "ability": "unaware" + }, + { + "species": "dondozo", + "weight": 5, + "moves": [ + ["wavecrash"], + ["avalanche"], + ["bodypress", "heavyslam", "earthquake"], + ["fissure"] + ], + "item": ["assaultvest"], + "nature": "careful", + "evs": [44, 212, 0, 0, 252, 0], + "teraType": ["grass", "fairy", "steel", "ground"], + "ability": "unaware" + }, + { + "species": "dondozo", + "weight": 5, + "moves": [["curse"], ["rest"], ["wavecrash"], ["fissure"]], + "item": ["chestoberry"], + "nature": "careful", + "evs": [252, 0, 4, 0, 252, 0], + "teraType": ["grass", "fairy", "steel"], + "ability": "unaware" + } + ] + }, + "hippowdon": { + "weight": 7, + "sets": [ + { + "species": "hippowdon", + "weight": 100, + "moves": [ + ["stealthrock"], + ["yawn"], + ["earthquake"], + ["whirlwind", "slackoff"] + ], + "item": ["sitrusberry", "leftovers"], + "nature": "careful", + "evs": [252, 0, 4, 0, 252, 0], + "teraType": ["steel", "water"], + "ability": "sandstream" + } + ] + }, + "mimikyu": { + "weight": 7, + "sets": [ + { + "species": "mimikyu", + "weight": 25, + "moves": [["playrough"], ["shadowsneak"], ["curse"], ["painsplit"]], + "item": ["lifeorb"], + "nature": "jolly", + "evs": [4, 156, 92, 0, 4, 252], + "teraType": ["ghost", "fairy"], + "ability": "disguise" + }, + { + "species": "mimikyu", + "weight": 15, + "moves": [["playrough"], ["shadowsneak"], ["curse"], ["trickroom"]], + "gender": "f", + "item": ["lifeorb"], + "nature": "adamant", + "evs": [36, 236, 180, 0, 4, 52], + "teraType": ["fairy", "ghost"], + "ability": "disguise" + }, + { + "species": "mimikyu", + "weight": 25, + "moves": [ + ["playrough"], + ["shadowsneak"], + ["drainpunch", "shadowclaw"], + ["swordsdance"] + ], + "item": ["lifeorb"], + "nature": "jolly", + "evs": [4, 156, 92, 0, 4, 252], + "teraType": ["ghost", "fairy"], + "ability": "disguise" + }, + { + "species": "mimikyu", + "weight": 15, + "moves": [["playrough"], ["shadowclaw"], ["willowisp"], ["trick"]], + "item": ["choicescarf"], + "nature": "jolly", + "evs": [4, 252, 0, 0, 0, 252], + "teraType": ["fairy", "ghost"], + "ability": "disguise" + }, + { + "species": "mimikyu", + "weight": 5, + "moves": [ + ["playrough"], + ["shadowsneak"], + ["shadowclaw", "painsplit"], + ["curse"] + ], + "item": ["covertcloak"], + "nature": "jolly", + "evs": [36, 220, 0, 0, 0, 252], + "teraType": ["ghost", "fairy"], + "ability": "disguise" + }, + { + "species": "mimikyu", + "weight": 5, + "moves": [["playrough"], ["shadowsneak"], ["woodhammer"], ["curse"]], + "item": ["lifeorb"], + "nature": "jolly", + "evs": [4, 156, 92, 0, 4, 252], + "teraType": ["grass"], + "ability": "disguise" + }, + { + "species": "mimikyu", + "weight": 5, + "moves": [["playrough"], ["curse"], ["trickroom"], ["shadowsneak"]], + "gender": "f", + "item": ["covertcloak"], + "nature": "adamant", + "evs": [36, 236, 180, 0, 4, 52], + "teraType": ["fairy", "ghost"], + "ability": "disguise" + }, + { + "species": "mimikyu", + "weight": 5, + "moves": [ + ["shadowclaw", "shadowsneak"], + ["substitute"], + ["curse"], + ["painsplit"] + ], + "item": ["figyberry"], + "nature": "jolly", + "evs": [4, 0, 252, 0, 0, 252], + "teraType": ["ghost"], + "ability": "disguise" + } + ] + }, + "rotomwash": { + "weight": 7, + "sets": [ + { + "species": "rotomwash", + "weight": 35, + "moves": [["hydropump"], ["voltswitch"], ["trick"], ["willowisp"]], + "item": ["choicescarf"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "timid", + "evs": [0, 0, 0, 252, 4, 252], + "teraType": ["steel", "ghost"], + "ability": "levitate" + }, + { + "species": "rotomwash", + "weight": 15, + "moves": [["hydropump"], ["thunderbolt"], ["voltswitch"], ["trick"]], + "item": ["choicespecs"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "timid", + "evs": [0, 0, 0, 252, 4, 252], + "teraType": ["electric"], + "ability": "levitate" + }, + { + "species": "rotomwash", + "weight": 45, + "moves": [["hydropump"], ["voltswitch"], ["foulplay"], ["willowisp"]], + "item": ["rockyhelmet", "sitrusberry"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "bold", + "evs": [252, 0, 252, 4, 0, 0], + "teraType": ["steel", "ghost", "fairy"], + "ability": "levitate" + }, + { + "species": "rotomwash", + "weight": 5, + "moves": [ + ["discharge", "thunderbolt"], + ["terablast"], + ["nastyplot"], + ["substitute"] + ], + "item": ["leftovers"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "timid", + "evs": [252, 0, 0, 4, 0, 252], + "teraType": ["steel"], + "wantsTera": true, + "ability": "levitate" + } + ] + }, + "basculegion": { + "weight": 7, + "sets": [ + { + "species": "basculegion", + "weight": 20, + "moves": [ + ["lastrespects"], + ["wavecrash"], + ["aquajet", "sleeptalk"], + ["flipturn"] + ], + "gender": "m", + "item": ["choicescarf"], + "nature": "adamant", + "evs": [0, 252, 0, 4, 0, 252], + "teraType": ["fairy", "normal", "fighting", "water", "ghost"], + "ability": "adaptability" + }, + { + "species": "basculegion", + "weight": 10, + "moves": [["lastrespects"], ["wavecrash"], ["flipturn"], ["terablast"]], + "gender": "m", + "item": ["choicescarf"], + "nature": "adamant", + "evs": [0, 252, 0, 4, 0, 252], + "teraType": ["fairy", "fighting"], + "wantsTera": true, + "ability": "adaptability" + }, + { + "species": "basculegion", + "weight": 40, + "moves": [ + ["wavecrash"], + ["aquajet"], + ["agility", "endeavor"], + ["lastrespects"] + ], + "gender": "m", + "item": ["focussash"], + "nature": "adamant", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["normal", "ghost", "water"], + "ability": "adaptability" + }, + { + "species": "basculegion", + "weight": 20, + "moves": [ + ["wavecrash"], + ["aquajet"], + ["agility", "terablast"], + ["lastrespects"] + ], + "gender": "m", + "item": ["focussash"], + "nature": "adamant", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["fairy"], + "wantsTera": true, + "ability": "adaptability" + }, + { + "species": "basculegion", + "weight": 5, + "moves": [["wavecrash"], ["aquajet"], ["substitute"], ["lastrespects"]], + "gender": "m", + "item": ["brightpowder"], + "nature": "adamant", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["normal", "ghost", "water"], + "ability": "adaptability" + }, + { + "species": "basculegion", + "weight": 5, + "moves": [ + ["wavecrash"], + ["aquajet"], + ["flipturn", "liquidation", "substitute"], + ["lastrespects"] + ], + "gender": "m", + "item": ["lifeorb"], + "nature": "adamant", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["water"], + "ability": "swiftswim" + } + ] + }, + "corviknight": { + "weight": 6, + "sets": [ + { + "species": "corviknight", + "weight": 50, + "moves": [ + ["uturn"], + ["roost"], + ["bodypress", "ironhead"], + ["taunt", "bravebird"] + ], + "item": ["rockyhelmet", "leftovers"], + "nature": "impish", + "evs": [252, 0, 252, 0, 4, 0], + "teraType": ["dragon", "fighting", "water"], + "ability": "mirrorarmor" + }, + { + "species": "corviknight", + "weight": 40, + "moves": [ + ["irondefense"], + ["bodypress"], + ["roost"], + ["taunt", "ironhead", "uturn"] + ], + "item": ["rockyhelmet", "sitrusberry", "safetygoggles", "covertcloak"], + "nature": "impish", + "evs": [252, 0, 252, 0, 4, 0], + "teraType": ["fighting", "water", "dragon"], + "ability": "mirrorarmor" + }, + { + "species": "corviknight", + "weight": 10, + "moves": [["bulkup"], ["taunt"], ["roost"], ["ironhead", "bravebird"]], + "item": ["rockyhelmet", "sitrusberry", "safetygoggles", "covertcloak"], + "nature": "impish", + "evs": [252, 0, 252, 0, 4, 0], + "teraType": ["water", "dragon"], + "ability": "mirrorarmor" + } + ] + }, + "zapdos": { + "weight": 6, + "sets": [ + { + "species": "zapdos", + "weight": 75, + "moves": [["voltswitch"], ["roost"], ["hurricane"], ["discharge"]], + "item": ["rockyhelmet", "heavydutyboots", "sitrusberry"], + "nature": "bold", + "ivs": [31, 0, 31, 31, 31, 31], + "evs": [252, 0, 252, 0, 4, 0], + "teraType": ["water", "steel"], + "ability": "static" + }, + { + "species": "zapdos", + "weight": 10, + "moves": [["voltswitch"], ["roost"], ["hurricane"], ["terablast"]], + "item": ["rockyhelmet", "heavydutyboots", "sitrusberry"], + "nature": "bold", + "ivs": [31, 0, 31, 31, 31, 31], + "evs": [252, 0, 252, 0, 4, 0], + "teraType": ["ice"], + "wantsTera": true, + "ability": "static" + }, + { + "species": "zapdos", + "weight": 10, + "moves": [["thunderbolt"], ["hurricane"], ["voltswitch"], ["terablast"]], + "item": ["choicescarf"], + "nature": "timid", + "ivs": [31, 0, 31, 31, 31, 31], + "evs": [0, 0, 4, 252, 0, 252], + "teraType": ["ice", "fairy"], + "wantsTera": true, + "ability": "static" + }, + { + "species": "zapdos", + "weight": 5, + "moves": [["thunderbolt"], ["hurricane"], ["voltswitch"], ["heatwave"]], + "item": ["choicescarf", "choicespecs"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "timid", + "evs": [0, 0, 4, 252, 0, 252], + "teraType": ["electric"], + "ability": "static" + } + ] + }, + "ursaluna": { + "weight": 6, + "sets": [ + { + "species": "ursaluna", + "weight": 85, + "moves": [["facade"], ["earthquake"], ["trailblaze"], ["swordsdance"]], + "item": ["flameorb"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["normal", "water", "grass"], + "ability": "guts" + }, + { + "species": "ursaluna", + "weight": 15, + "moves": [["earthquake"], ["avalanche"], ["yawn"], ["protect"]], + "item": ["leftovers"], + "nature": "impish", + "evs": [156, 0, 252, 0, 100, 0], + "teraType": ["water", "fairy"], + "ability": "bulletproof" + } + ] + }, + "goodrahisui": { + "weight": 6, + "sets": [ + { + "species": "goodrahisui", + "weight": 60, + "moves": [ + ["flashcannon", "heavyslam"], + ["dracometeor", "icebeam"], + ["acidspray", "thunderbolt", "flamethrower"], + ["earthquake"] + ], + "item": ["assaultvest"], + "nature": "quiet", + "evs": [252, 0, 0, 252, 4, 0], + "teraType": ["flying", "fairy", "water"], + "ability": "sapsipper" + }, + { + "species": "goodrahisui", + "weight": 40, + "moves": [ + ["acidarmor"], + ["bodypress"], + ["heavyslam"], + ["protect", "dracometeor", "icebeam"] + ], + "item": ["leftovers"], + "nature": "careful", + "evs": [252, 0, 4, 0, 252, 0], + "teraType": ["flying", "fairy"], + "ability": "shellarmor" + } + ] + }, + "magnezone": { + "weight": 6, + "sets": [ + { + "species": "magnezone", + "weight": 70, + "moves": [["thunderbolt"], ["flashcannon"], ["voltswitch"], ["terablast"]], + "item": ["assaultvest"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "modest", + "evs": [252, 0, 0, 4, 252, 0], + "teraType": ["fairy", "water"], + "wantsTera": true, + "ability": "analytic" + }, + { + "species": "magnezone", + "weight": 20, + "moves": [["thunderbolt"], ["flashcannon"], ["voltswitch"], ["terablast"]], + "item": ["choicespecs"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "modest", + "evs": [252, 0, 0, 4, 252, 0], + "teraType": ["fairy", "water"], + "wantsTera": true, + "ability": "sturdy" + }, + { + "species": "magnezone", + "weight": 10, + "moves": [ + ["thunderbolt"], + ["flashcannon", "steelbeam"], + ["voltswitch"], + ["mirrorcoat"] + ], + "item": ["custapberry"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "modest", + "evs": [252, 0, 0, 4, 252, 0], + "teraType": ["flying", "water"], + "wantsTera": true, + "ability": "sturdy" + } + ] + }, + "ogerpon": { + "weight": 6, + "sets": [ + { + "species": "ogerpon", + "weight": 100, + "moves": [ + ["ivycudgel"], + ["uturn"], + ["playrough"], + ["knockoff", "stompingtantrum"] + ], + "item": ["choiceband", "focussash"], + "nature": "jolly", + "evs": [0, 252, 4, 0, 0, 252], + "teraType": ["grass"], + "ability": "defiant" + } + ] + }, + "gliscor": { + "weight": 6, + "sets": [ + { + "species": "gliscor", + "weight": 100, + "moves": [["substitute"], ["toxic"], ["protect"], ["earthquake"]], + "item": ["toxicorb"], + "nature": "impish", + "evs": [244, 0, 108, 0, 0, 156], + "teraType": ["water"], + "wantsTera": true, + "ability": "poisonheal" + } + ] + }, + "ironmoth": { + "weight": 6, + "sets": [ + { + "species": "ironmoth", + "weight": 20, + "moves": [ + ["fierydance"], + ["sludgewave"], + ["energyball"], + ["dazzlinggleam", "overheat", "psychic"] + ], + "item": ["boosterenergy", "choicespecs", "assaultvest"], + "nature": "timid", + "evs": [4, 0, 0, 252, 0, 252], + "teraType": ["grass", "water", "fire", "fairy"], + "ability": "quarkdrive" + }, + { + "species": "ironmoth", + "weight": 20, + "moves": [ + ["fierydance"], + ["sludgewave"], + ["energyball"], + ["dazzlinggleam", "overheat", "psychic", "terablast"] + ], + "item": ["boosterenergy", "choicespecs", "assaultvest"], + "nature": "timid", + "evs": [4, 0, 0, 252, 0, 252], + "teraType": ["water", "fairy"], + "wantsTera": true, + "ability": "quarkdrive" + }, + { + "species": "ironmoth", + "weight": 20, + "moves": [ + ["toxicspikes"], + ["fierydance"], + ["morningsun"], + ["whirlwind", "sludgewave", "terablast"] + ], + "item": ["boosterenergy", "covertcloak", "passhoberry", "sitrusberry"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "timid", + "evs": [244, 0, 52, 4, 12, 196], + "teraType": ["water", "grass", "fairy"], + "ability": "quarkdrive" + }, + { + "species": "ironmoth", + "weight": 20, + "moves": [["toxicspikes"], ["fierydance"], ["morningsun"], ["whirlwind"]], + "item": ["blacksludge", "heavydutyboots"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "calm", + "evs": [196, 0, 0, 0, 132, 180], + "teraType": ["poison", "grass"], + "ability": "quarkdrive" + }, + { + "species": "ironmoth", + "weight": 10, + "moves": [ + ["fierydance"], + ["sludgewave", "acidspray"], + ["energyball", "psychic"], + ["dazzlinggleam", "terablast"] + ], + "item": ["boosterenergy"], + "nature": "timid", + "evs": [0, 0, 124, 132, 0, 252], + "teraType": ["water"], + "wantsTera": true, + "ability": "quarkdrive" + }, + { + "species": "ironmoth", + "weight": 10, + "moves": [ + ["fierydance"], + ["sludgewave", "acidspray"], + ["energyball"], + ["dazzlinggleam", "psychic"] + ], + "item": ["boosterenergy"], + "nature": "timid", + "evs": [0, 0, 124, 132, 0, 252], + "teraType": ["grass", "fire", "poison"], + "ability": "quarkdrive" + } + ] + }, + "rillaboom": { + "weight": 6, + "sets": [ + { + "species": "rillaboom", + "weight": 50, + "moves": [ + ["grassyglide"], + ["knockoff"], + ["drumbeating", "woodhammer"], + ["terablast"] + ], + "item": ["assaultvest", "choiceband"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["rock"], + "wantsTera": true, + "ability": "grassysurge" + }, + { + "species": "rillaboom", + "weight": 20, + "moves": [ + ["grassyglide"], + ["knockoff"], + ["drumbeating", "woodhammer"], + ["uturn", "highhorsepower"] + ], + "item": ["assaultvest"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["grass", "poison"], + "ability": "grassysurge" + }, + { + "species": "rillaboom", + "weight": 10, + "moves": [ + ["grassyglide"], + ["knockoff"], + ["drumbeating", "woodhammer"], + ["uturn", "highhorsepower"] + ], + "item": ["choiceband"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["grass"], + "ability": "grassysurge" + }, + { + "species": "rillaboom", + "weight": 20, + "moves": [["grassyglide"], ["highhorsepower"], ["terablast"], ["swordsdance"]], + "item": ["grassyseed"], + "nature": "adamant", + "evs": [252, 252, 4, 0, 0, 0], + "teraType": ["rock", "fairy"], + "wantsTera": true, + "ability": "grassysurge" + } + ] + }, + "sneasler": { + "weight": 5, + "sets": [ + { + "species": "sneasler", + "weight": 30, + "moves": [["direclaw"], ["closecombat"], ["fakeout"], ["toxicspikes"]], + "gender": "f", + "item": [ + "focussash", + "airballoon", + "sitrusberry", + "redcard", + "normalgem" + ], + "nature": "adamant", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["fighting", "flying"], + "ability": "unburden" + }, + { + "species": "sneasler", + "weight": 10, + "moves": [["direclaw"], ["closecombat"], ["fakeout"], ["toxicspikes"]], + "gender": "f", + "item": ["focussash", "airballoon", "sitrusberry"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["fighting", "flying"], + "ability": "poisontouch" + }, + { + "species": "sneasler", + "weight": 55, + "moves": [["direclaw"], ["closecombat"], ["shadowclaw"], ["toxicspikes"]], + "gender": "f", + "item": ["focussash", "airballoon", "sitrusberry", "redcard"], + "nature": "adamant", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["ghost"], + "ability": "unburden" + }, + { + "species": "sneasler", + "weight": 5, + "moves": [ + ["direclaw"], + ["closecombat"], + ["swordsdance"], + ["acrobatics", "shadowclaw"] + ], + "item": ["grassyseed"], + "nature": "adamant", + "evs": [92, 252, 4, 0, 4, 156], + "teraType": ["flying", "ghost"], + "ability": "unburden" + } + ] + }, + "clodsire": { + "weight": 5, + "sets": [ + { + "species": "clodsire", + "weight": 50, + "moves": [ + ["earthquake"], + ["toxic", "yawn"], + ["stealthrock", "haze", "counter"], + ["recover"] + ], + "item": ["sitrusberry", "leftovers"], + "nature": "impish", + "evs": [156, 0, 252, 0, 100, 0], + "teraType": ["water", "fire", "electric", "dark"], + "ability": "waterabsorb" + }, + { + "species": "clodsire", + "weight": 50, + "moves": [ + ["earthquake"], + ["toxic", "yawn"], + ["stealthrock", "haze", "counter"], + ["recover"] + ], + "item": ["sitrusberry", "leftovers"], + "nature": "impish", + "evs": [156, 0, 252, 0, 100, 0], + "teraType": ["water", "fire", "electric", "dark"], + "ability": "unaware" + } + ] + }, + "meowscarada": { + "weight": 5, + "sets": [ + { + "species": "meowscarada", + "weight": 25, + "moves": [ + ["flowertrick"], + ["knockoff"], + ["uturn", "trick"], + ["playrough", "suckerpunch", "lowkick"] + ], + "item": ["choicescarf"], + "nature": "jolly", + "evs": [4, 252, 0, 0, 0, 252], + "teraType": ["grass", "dark"], + "ability": "protean" + }, + { + "species": "meowscarada", + "weight": 10, + "moves": [ + ["flowertrick"], + ["knockoff"], + ["uturn", "trick"], + ["terablast"] + ], + "item": ["choicescarf"], + "nature": "jolly", + "evs": [4, 252, 0, 0, 0, 252], + "teraType": ["rock", "ghost"], + "wantsTera": true, + "ability": "protean" + }, + { + "species": "meowscarada", + "weight": 30, + "moves": [ + ["flowertrick"], + ["knockoff"], + ["suckerpunch", "taunt"], + ["toxicspikes"] + ], + "item": ["focussash"], + "nature": "jolly", + "evs": [0, 252, 4, 0, 0, 252], + "teraType": ["grass"], + "ability": "overgrow" + }, + { + "species": "meowscarada", + "weight": 20, + "moves": [ + ["flowertrick"], + ["knockoff"], + ["terablast"], + ["suckerpunch", "toxicspikes"] + ], + "item": ["focussash"], + "nature": "jolly", + "evs": [0, 252, 4, 0, 0, 252], + "teraType": ["rock", "ghost"], + "wantsTera": true, + "ability": "overgrow" + }, + { + "species": "meowscarada", + "weight": 10, + "moves": [ + ["flowertrick"], + ["knockoff"], + ["uturn", "trick"], + ["suckerpunch"] + ], + "item": ["choiceband"], + "nature": "jolly", + "evs": [4, 252, 0, 0, 0, 252], + "teraType": ["grass"], + "ability": "protean" + }, + { + "species": "meowscarada", + "weight": 5, + "moves": [ + ["flowertrick"], + ["knockoff"], + ["uturn", "trick", "suckerpunch"], + ["terablast"] + ], + "item": ["choiceband"], + "nature": "jolly", + "evs": [4, 252, 0, 0, 0, 252], + "teraType": ["rock", "ghost"], + "wantsTera": true, + "ability": "protean" + } + ] + }, + "azumarill": { + "weight": 5, + "sets": [ + { + "species": "azumarill", + "weight": 45, + "moves": [["aquajet"], ["playrough"], ["liquidation"], ["superpower"]], + "item": ["assaultvest"], + "nature": "adamant", + "evs": [252, 252, 0, 0, 4, 0], + "teraType": ["water", "fairy"], + "ability": "hugepower" + }, + { + "species": "azumarill", + "weight": 10, + "moves": [["aquajet"], ["playrough"], ["liquidation"], ["terablast"]], + "item": ["assaultvest", "choiceband"], + "nature": "adamant", + "evs": [252, 252, 0, 0, 4, 0], + "teraType": ["fire", "electric", "fairy", "grass"], + "wantsTera": true, + "ability": "hugepower" + }, + { + "species": "azumarill", + "weight": 25, + "moves": [ + ["bellydrum"], + ["aquajet"], + ["playrough"], + ["liquidation", "encore"] + ], + "item": ["sitrusberry"], + "nature": "adamant", + "evs": [244, 252, 12, 0, 0, 0], + "teraType": ["water"], + "ability": "hugepower" + }, + { + "species": "azumarill", + "weight": 10, + "moves": [["bellydrum"], ["aquajet"], ["playrough"], ["bulldoze"]], + "item": ["sitrusberry"], + "nature": "adamant", + "evs": [244, 252, 12, 0, 0, 0], + "teraType": ["steel"], + "ability": "hugepower" + }, + { + "species": "azumarill", + "weight": 5, + "moves": [["bellydrum"], ["aquajet"], ["playrough"], ["terablast"]], + "item": ["sitrusberry"], + "nature": "adamant", + "evs": [244, 252, 12, 0, 0, 0], + "teraType": ["fire"], + "wantsTera": true, + "ability": "hugepower" + }, + { + "species": "azumarill", + "weight": 5, + "moves": [ + ["substitute"], + ["encore"], + ["playrough"], + ["aquajet", "liquidation"] + ], + "item": ["leftovers"], + "nature": "adamant", + "evs": [252, 252, 4, 0, 0, 0], + "teraType": ["water"], + "ability": "hugepower" + } + ] + }, + "ironvaliant": { + "weight": 5, + "sets": [ + { + "species": "ironvaliant", + "weight": 35, + "moves": [ + ["spiritbreak"], + ["reflect", "encore"], + ["closecombat"], + ["destinybond", "knockoff"] + ], + "item": ["boosterenergy"], + "nature": "jolly", + "evs": [92, 204, 4, 0, 4, 204], + "teraType": ["steel", "ghost"], + "ability": "quarkdrive" + }, + { + "species": "ironvaliant", + "weight": 25, + "moves": [ + ["moonblast"], + ["encore", "shadowball", "shadowsneak"], + ["closecombat", "aurasphere", "shadowball"], + ["destinybond"] + ], + "item": ["focussash", "boosterenergy"], + "nature": "naive", + "evs": [0, 4, 0, 252, 0, 252], + "teraType": ["ghost", "fairy", "steel"], + "ability": "quarkdrive" + }, + { + "species": "ironvaliant", + "weight": 20, + "moves": [ + ["moonblast"], + ["closecombat"], + ["encore", "shadowball"], + ["psyshock", "psychic", "shadowball", "thunderbolt"] + ], + "item": ["lifeorb", "boosterenergy"], + "nature": "naive", + "evs": [0, 4, 0, 252, 0, 252], + "teraType": ["ghost", "fairy", "steel", "electric"], + "ability": "quarkdrive" + }, + { + "species": "ironvaliant", + "weight": 20, + "moves": [ + ["swordsdance"], + ["closecombat", "encore"], + ["spiritbreak"], + ["shadowsneak", "knockoff"] + ], + "item": ["focussash", "boosterenergy"], + "nature": "jolly", + "evs": [0, 252, 4, 0, 0, 252], + "teraType": ["ghost", "steel", "fairy"], + "ability": "quarkdrive" + } + ] + }, + "kingambit": { + "weight": 5, + "sets": [ + { + "species": "kingambit", + "weight": 25, + "moves": [["kowtowcleave"], ["suckerpunch"], ["ironhead"], ["guillotine"]], + "item": ["assaultvest"], + "nature": "adamant", + "evs": [252, 252, 0, 0, 4, 0], + "teraType": ["dark", "flying"], + "ability": "defiant" + }, + { + "species": "kingambit", + "weight": 20, + "moves": [["kowtowcleave"], ["suckerpunch"], ["ironhead"], ["guillotine"]], + "item": ["assaultvest"], + "nature": "adamant", + "evs": [252, 252, 0, 0, 4, 0], + "teraType": ["dark", "flying"], + "ability": "supremeoverlord" + }, + { + "species": "kingambit", + "weight": 10, + "moves": [ + ["kowtowcleave"], + ["suckerpunch", "guillotine"], + ["ironhead"], + ["terablast"] + ], + "item": ["assaultvest"], + "nature": "adamant", + "evs": [252, 252, 0, 0, 4, 0], + "teraType": ["fairy"], + "wantsTera": true, + "ability": "defiant" + }, + { + "species": "kingambit", + "weight": 10, + "moves": [ + ["kowtowcleave"], + ["suckerpunch", "guillotine"], + ["ironhead"], + ["terablast"] + ], + "item": ["assaultvest"], + "nature": "adamant", + "evs": [252, 252, 0, 0, 4, 0], + "teraType": ["fairy"], + "wantsTera": true, + "ability": "supremeoverlord" + }, + { + "species": "kingambit", + "weight": 15, + "moves": [["kowtowcleave"], ["suckerpunch"], ["ironhead"], ["swordsdance"]], + "item": ["blackglasses", "sitrusberry"], + "nature": "adamant", + "evs": [252, 252, 0, 0, 4, 0], + "teraType": ["dark", "flying"], + "ability": "supremeoverlord" + }, + { + "species": "kingambit", + "weight": 10, + "moves": [["kowtowcleave"], ["suckerpunch"], ["ironhead"], ["swordsdance"]], + "item": ["blackglasses", "sitrusberry"], + "nature": "adamant", + "evs": [252, 252, 0, 0, 4, 0], + "teraType": ["dark", "flying"], + "ability": "defiant" + }, + { + "species": "kingambit", + "weight": 5, + "moves": [ + ["stealthrock"], + ["kowtowcleave"], + ["ironhead", "guillotine"], + ["suckerpunch", "thunderwave"] + ], + "item": "focussash", + "nature": "adamant", + "evs": [252, 252, 0, 0, 4, 0], + "teraType": ["flying", "fairy", "dark"], + "ability": ["defiant", "supremeoverlord"] + }, + { + "species": "kingambit", + "weight": 5, + "moves": [ + ["stealthrock"], + ["kowtowcleave"], + ["ironhead", "guillotine"], + ["suckerpunch", "thunderwave"] + ], + "item": "sitrusberry", + "nature": "adamant", + "evs": [244, 252, 0, 0, 12, 0], + "teraType": ["flying", "fairy", "dark"], + "ability": ["defiant", "supremeoverlord"] + } + ] + }, + "volcarona": { + "weight": 5, + "sets": [ + { + "species": "volcarona", + "weight": 55, + "moves": [ + ["quiverdance"], + ["fierydance"], + ["morningsun"], + ["gigadrain", "willowisp", "substitute"] + ], + "item": ["heavydutyboots", "sitrusberry"], + "nature": "timid", + "evs": [244, 0, 204, 12, 4, 44], + "teraType": ["fairy", "grass"], + "wantsTera": true, + "ability": "flamebody" + }, + { + "species": "volcarona", + "weight": 25, + "moves": [ + ["quiverdance"], + ["fierydance"], + ["morningsun"], + ["terablast"] + ], + "item": ["heavydutyboots", "sitrusberry"], + "nature": "timid", + "evs": [244, 0, 204, 12, 4, 44], + "teraType": ["water"], + "wantsTera": true, + "ability": "flamebody" + }, + { + "species": "volcarona", + "weight": 20, + "moves": [ + ["quiverdance"], + ["fierydance"], + ["gigadrain", "bugbuzz", "psychic"], + ["terablast"] + ], + "item": ["heavydutyboots", "lumberry", "sitrusberry"], + "nature": "timid", + "evs": [0, 0, 0, 252, 4, 252], + "teraType": ["water", "rock"], + "wantsTera": true, + "ability": "flamebody" + } + ] + }, + "wochien": { + "weight": 5, + "sets": [ + { + "species": "wochien", + "weight": 90, + "moves": [ + ["leechseed"], + ["protect"], + ["foulplay", "knockoff", "darkpulse"], + ["substitute", "ruination", "gigadrain", "taunt"] + ], + "item": ["leftovers"], + "nature": "bold", + "evs": [252, 0, 252, 0, 4, 0], + "teraType": ["poison", "fairy", "water", "fire"], + "wantsTera": true, + "ability": "tabletsofruin" + }, + { + "species": "wochien", + "weight": 10, + "moves": [ + ["leechseed"], + ["protect"], + ["terablast"], + ["substitute", "ruination", "gigadrain", "taunt"] + ], + "item": ["leftovers"], + "nature": "bold", + "evs": [252, 0, 252, 0, 4, 0], + "teraType": ["fire"], + "wantsTera": true, + "ability": "tabletsofruin" + } + ] + }, + "empoleon": { + "weight": 5, + "sets": [ + { + "species": "empoleon", + "weight": 100, + "moves": [ + ["stealthrock"], + ["yawn", "roar"], + ["flashcannon", "icebeam"], + ["flipturn", "surf", "roost"] + ], + "item": ["leftovers", "sitrusberry", "airballoon"], + "nature": "calm", + "evs": [252, 0, 4, 0, 252, 0], + "teraType": ["flying", "fairy", "grass"], + "ability": "competitive" + } + ] + }, + "kommoo": { + "weight": 5, + "sets": [ + { + "species": "kommoo", + "weight": 50, + "moves": [ + ["clangoroussoul"], + ["clangingscales"], + ["aurasphere", "vacuumwave"], + ["flashcannon"] + ], + "item": ["throatspray"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "timid", + "evs": [0, 0, 0, 252, 4, 252], + "teraType": ["steel"], + "wantsTera": true, + "ability": "bulletproof" + }, + { + "species": "kommoo", + "weight": 50, + "moves": [ + ["clangoroussoul"], + ["drainpunch"], + ["ironhead"], + ["earthquake", "substitute"] + ], + "item": ["sitrusberry", "leftovers"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["steel"], + "wantsTera": true, + "ability": "bulletproof" + } + ] + }, + "sinistcha": { + "weight": 5, + "sets": [ + { + "species": "sinistcha", + "weight": 100, + "moves": [ + ["strengthsap"], + ["matchagotcha"], + ["shadowball", "hex"], + ["scald", "calmmind"] + ], + "item": ["leftovers", "rockyhelmet", "covertcloak"], + "nature": "bold", + "ivs": [31, 0, 31, 31, 31, 31], + "evs": [252, 0, 252, 0, 4, 0], + "teraType": ["water", "fairy", "normal"], + "wantsTera": true, + "ability": "heatproof" + } + ] + }, + "vikavolt": { + "weight": 5, + "sets": [ + { + "species": "vikavolt", + "weight": 100, + "moves": [ + ["voltswitch", "thunderbolt", "discharge", "thunderwave"], + ["bugbuzz"], + ["stickyweb"], + ["guillotine"] + ], + "item": ["sitrusberry"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "modest", + "evs": [244, 0, 212, 0, 52, 0], + "teraType": ["steel"], + "ability": "levitate" + } + ] + }, + "skeledirge": { + "weight": 5, + "sets": [ + { + "species": "skeledirge", + "weight": 30, + "moves": [ + ["torchsong"], + ["slackoff"], + ["willowisp", "yawn"], + ["shadowball", "hex", "earthpower", "terablast"] + ], + "item": ["leftovers", "sitrusberry", "covertcloak", "heavydutyboots"], + "nature": "bold", + "evs": [252, 0, 252, 0, 4, 0], + "teraType": ["fairy", "water"], + "wantsTera": true, + "ability": "unaware" + }, + { + "species": "skeledirge", + "weight": 60, + "moves": [ + ["torchsong"], + ["slackoff"], + ["willowisp", "yawn"], + ["shadowball", "hex", "earthpower"] + ], + "item": ["leftovers", "sitrusberry", "covertcloak", "heavydutyboots"], + "nature": "bold", + "evs": [252, 0, 252, 0, 4, 0], + "teraType": ["normal", "fairy"], + "ability": "unaware" + }, + { + "species": "skeledirge", + "weight": 5, + "moves": [ + ["sing"], + ["torchsong"], + ["slackoff"], + ["shadowball", "earthpower", "terablast"] + ], + "item": ["blunderpolicy"], + "nature": "modest", + "evs": [204, 0, 4, 132, 4, 164], + "teraType": ["fairy", "water"], + "wantsTera": true, + "ability": "unaware" + }, + { + "species": "skeledirge", + "weight": 5, + "moves": [ + ["sing"], + ["torchsong"], + ["slackoff"], + ["shadowball", "earthpower"] + ], + "item": ["blunderpolicy"], + "nature": "modest", + "evs": [204, 0, 4, 132, 4, 164], + "teraType": ["fire"], + "ability": "unaware" + } + ] + }, + "blissey": { + "weight": 4, + "sets": [ + { + "species": "blissey", + "weight": 10, + "moves": [["softboiled"], ["flamethrower"], ["icebeam"], ["thunderbolt"]], + "item": ["expertbelt"], + "nature": "bold", + "evs": [4, 0, 252, 252, 0, 0], + "teraType": ["dark", "fire"], + "ability": "naturalcure" + }, + { + "species": "blissey", + "weight": 40, + "moves": [ + ["calmmind"], + ["softboiled"], + ["shadowball"], + ["stealthrock", "terablast", "flamethrower"] + ], + "item": ["leftovers"], + "nature": "calm", + "evs": [4, 0, 252, 0, 252, 0], + "teraType": ["dark", "ghost", "fire"], + "wantsTera": true, + "ability": "naturalcure" + }, + { + "species": "blissey", + "weight": 50, + "moves": [ + ["calmmind"], + ["softboiled"], + ["shadowball", "flamethrower"], + ["fling"] + ], + "item": ["flameorb", "poisonbarb", "lightball"], + "nature": "calm", + "evs": [4, 0, 252, 0, 252, 0], + "teraType": ["dark", "fire"], + "ability": "naturalcure" + } + ] + }, + "ceruledge": { + "weight": 4, + "sets": [ + { + "species": "ceruledge", + "weight": 25, + "moves": [ + ["bitterblade"], + ["bulkup"], + ["taunt"], + ["shadowsneak", "terablast", "flamecharge", "willowisp"] + ], + "item": ["leftovers"], + "nature": "impish", + "evs": [252, 4, 252, 0, 0, 0], + "teraType": ["fairy", "grass"], + "ability": "flashfire" + }, + { + "species": "ceruledge", + "weight": 65, + "moves": [ + ["bitterblade"], + ["closecombat", "shadowclaw"], + ["shadowsneak"], + ["swordsdance", "destinybond"] + ], + "item": ["focussash"], + "nature": "adamant", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["fire", "normal", "fighting"], + "ability": "weakarmor" + }, + { + "species": "ceruledge", + "weight": 10, + "moves": [["bitterblade"], ["flareblitz"], ["shadowsneak"], ["terablast"]], + "item": ["choiceband"], + "nature": "adamant", + "evs": [100, 252, 156, 0, 0, 0], + "teraType": ["fairy"], + "wantsTera": true, + "ability": "weakarmor" + } + ] + }, + "chansey": { + "weight": 4, + "sets": [ + { + "species": "chansey", + "weight": 100, + "moves": [ + ["seismictoss"], + ["shadowball", "stealthrock", "thunderwave"], + ["calmmind"], + ["softboiled"] + ], + "item": ["eviolite"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "bold", + "evs": [12, 0, 252, 0, 244, 0], + "teraType": ["dark", "ghost"], + "ability": "naturalcure" + } + ] + }, + "espathra": { + "weight": 4, + "sets": [ + { + "species": "espathra", + "weight": 35, + "moves": [ + ["calmmind"], + ["storedpower"], + ["terablast"], + ["protect", "substitute", "roost"] + ], + "item": ["leftovers", "lumberry"], + "nature": "bold", + "evs": [244, 0, 252, 0, 0, 12], + "teraType": ["fighting", "fire"], + "wantsTera": true, + "ability": "speedboost" + }, + { + "species": "espathra", + "weight": 20, + "moves": [ + ["calmmind"], + ["storedpower"], + ["dazzlinggleam"], + ["protect", "substitute", "roost"] + ], + "item": ["leftovers", "lumberry"], + "nature": "bold", + "evs": [244, 0, 252, 0, 0, 12], + "teraType": ["fairy", "water"], + "ability": "speedboost" + }, + { + "species": "espathra", + "weight": 30, + "moves": [ + ["luminacrash"], + ["batonpass"], + ["protect", "reflect", "dazzlinggleam"], + ["calmmind", "substitute"] + ], + "item": ["focussash", "sitrusberry", "leftovers"], + "nature": "timid", + "evs": [252, 0, 4, 0, 0, 252], + "teraType": ["normal", "ghost", "water"], + "ability": "speedboost" + }, + { + "species": "espathra", + "weight": 10, + "moves": [ + ["luminacrash"], + ["energyball"], + ["shadowball"], + ["hypnosis", "batonpass"] + ], + "item": ["focussash"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "timid", + "evs": [0, 0, 0, 252, 4, 252], + "teraType": ["normal", "ghost", "grass"], + "ability": "speedboost" + }, + { + "species": "espathra", + "weight": 5, + "moves": [ + ["lightscreen"], + ["reflect"], + ["luminacrash", "protect"], + ["batonpass"] + ], + "item": ["lightclay"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "timid", + "evs": [252, 0, 0, 4, 0, 252], + "teraType": ["fairy"], + "ability": "speedboost" + } + ] + }, + "grimmsnarl": { + "weight": 4, + "sets": [ + { + "species": "grimmsnarl", + "weight": 90, + "moves": [ + ["reflect"], + ["lightscreen"], + ["taunt", "thunderwave"], + ["spiritbreak", "partingshot"] + ], + "item": ["lightclay"], + "nature": "careful", + "evs": [248, 0, 8, 0, 252, 0], + "teraType": ["steel", "poison"], + "ability": "prankster" + }, + { + "species": "grimmsnarl", + "weight": 10, + "moves": [ + ["spiritbreak", "playrough"], + ["crunch", "suckerpunch"], + ["lowkick", "hammerarm", "taunt"], + ["thunderwave"] + ], + "gender": "m", + "item": ["focussash"], + "nature": "adamant", + "evs": [0, 252, 4, 0, 0, 252], + "teraType": ["ghost", "fairy", "dark"], + "ability": "prankster" + } + ] + }, + "ironhands": { + "weight": 4, + "sets": [ + { + "species": "ironhands", + "weight": 70, + "moves": [ + ["drainpunch"], + ["thunderpunch", "wildcharge"], + ["earthquake", "icepunch", "heavyslam"], + ["voltswitch", "fakeout"] + ], + "item": ["assaultvest"], + "nature": "adamant", + "evs": [0, 252, 0, 0, 204, 52], + "teraType": ["ground", "grass", "water", "fairy"], + "ability": "quarkdrive" + }, + { + "species": "ironhands", + "weight": 30, + "moves": [["drainpunch"], ["thunderpunch"], ["substitute"], ["swordsdance"]], + "item": ["leftovers", "punchingglove"], + "nature": "impish", + "evs": [92, 12, 172, 0, 212, 20], + "teraType": ["fairy", "water", "grass"], + "ability": "quarkdrive" + } + ] + }, + "hydreigon": { + "weight": 4, + "sets": [ + { + "species": "hydreigon", + "weight": 45, + "moves": [ + ["darkpulse"], + ["dracometeor"], + ["flashcannon"], + ["flamethrower", "fireblast", "uturn"] + ], + "item": ["choicespecs", "choicescarf"], + "nature": "timid", + "evs": [0, 0, 0, 252, 4, 252], + "teraType": ["steel"], + "wantsTera": true, + "ability": "levitate" + }, + { + "species": "hydreigon", + "weight": 25, + "moves": [ + ["darkpulse"], + ["dracometeor"], + ["flashcannon", "uturn"], + ["flamethrower", "fireblast"] + ], + "item": ["choicespecs"], + "nature": "timid", + "evs": [0, 0, 0, 252, 4, 252], + "teraType": ["poison", "fire"], + "wantsTera": true, + "ability": "levitate" + }, + { + "species": "hydreigon", + "weight": 10, + "moves": [ + ["stealthrock"], + ["darkpulse"], + ["taunt"], + ["thunderwave", "dracometeor", "flashcannon"] + ], + "item": ["focussash"], + "nature": "timid", + "evs": [0, 0, 0, 252, 4, 252], + "teraType": ["steel", "poison"], + "wantsTera": true, + "ability": "levitate" + }, + { + "species": "hydreigon", + "weight": 20, + "moves": [ + ["darkpulse"], + ["flashcannon"], + ["nastyplot"], + ["substitute", "taunt", "flamethrower", "dracometeor", "earthpower"] + ], + "item": ["leftovers", "lifeorb"], + "nature": "timid", + "evs": [0, 0, 0, 252, 4, 252], + "teraType": ["steel"], + "wantsTera": true, + "ability": "levitate" + } + ] + }, + "kleavor": { + "weight": 4, + "sets": [ + { + "species": "kleavor", + "weight": 55, + "moves": [ + ["stoneaxe"], + ["nightslash"], + ["feint", "trailblaze"], + ["xscissor", "closecombat", "uturn"] + ], + "item": ["focussash"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["grass", "water", "bug"], + "ability": "sharpness" + }, + { + "species": "kleavor", + "weight": 10, + "moves": [ + ["stoneaxe"], + ["nightslash"], + ["feint", "trailblaze"], + ["xscissor", "closecombat", "uturn"] + ], + "item": ["assaultvest"], + "nature": "adamant", + "evs": [140, 52, 4, 0, 244, 68], + "teraType": ["grass", "water", "bug"], + "ability": "sharpness" + }, + { + "species": "kleavor", + "weight": 35, + "moves": [ + ["stoneaxe"], + ["uturn"], + ["nightslash"], + ["xscissor", "closecombat"] + ], + "item": ["choicescarf"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["bug", "grass"], + "ability": "sharpness" + } + ] + }, + "screamtail": { + "weight": 4, + "sets": [ + { + "species": "screamtail", + "weight": 80, + "moves": [ + ["stealthrock"], + ["thunderwave", "trickroom"], + ["encore", "perishsong", "roar"], + ["mistyexplosion"] + ], + "item": ["mentalherb", "boosterenergy", "sitrusberry"], + "nature": "calm", + "evs": [180, 0, 0, 0, 156, 172], + "teraType": ["normal"], + "ability": "protosynthesis" + }, + { + "species": "screamtail", + "weight": 10, + "moves": [ + ["reflect"], + ["lightscreen"], + ["encore"], + ["perishsong", "dazzlinggleam", "stealthrock", "mistyexplosion"] + ], + "item": ["lightclay", "mentalherb"], + "nature": "timid", + "evs": [252, 0, 0, 0, 4, 252], + "teraType": ["normal"], + "ability": "protosynthesis" + }, + { + "species": "screamtail", + "weight": 5, + "moves": [ + ["batonpass"], + ["bulkup", "calmmind"], + ["encore"], + ["dazzlinggleam", "substitute", "playrough"] + ], + "item": ["mentalherb", "sitrusberry"], + "nature": "careful", + "evs": [220, 0, 220, 0, 68, 0], + "teraType": ["normal"], + "ability": "protosynthesis" + }, + { + "species": "screamtail", + "weight": 5, + "moves": [ + ["batonpass"], + ["bulkup", "calmmind"], + ["sing"], + ["playrough", "substitute"] + ], + "item": ["blunderpolicy"], + "nature": "careful", + "evs": [220, 0, 220, 0, 68, 0], + "teraType": ["normal"], + "ability": "protosynthesis" + } + ] + }, + "milotic": { + "weight": 4, + "sets": [ + { + "species": "milotic", + "weight": 67, + "moves": [ + ["scald"], + ["recover"], + ["mirrorcoat", "haze"], + ["drainingkiss", "icebeam"] + ], + "item": ["flameorb"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "bold", + "evs": [252, 0, 252, 0, 4, 0], + "teraType": ["fairy", "fire"], + "ability": "marvelscale" + }, + { + "species": "milotic", + "weight": 33, + "moves": [["scald"], ["recover"], ["mirrorcoat", "haze"], ["flipturn"]], + "item": ["flameorb"], + "nature": "bold", + "evs": [252, 0, 252, 0, 4, 0], + "teraType": ["fairy", "fire"], + "ability": "marvelscale" + } + ] + }, + "okidogi": { + "weight": 4, + "sets": [ + { + "species": "okidogi", + "weight": 40, + "moves": [ + ["bulkup"], + ["drainpunch"], + ["knockoff"], + ["icepunch", "poisonjab", "taunt", "substitute"] + ], + "item": ["leftovers", "blacksludge", "rockyhelmet"], + "nature": "adamant", + "evs": [252, 156, 0, 0, 0, 100], + "teraType": ["water", "poison", "flying"], + "ability": "toxicchain" + }, + { + "species": "okidogi", + "weight": 35, + "moves": [ + ["bulkup"], + ["drainpunch"], + ["knockoff"], + ["icepunch", "poisonjab", "taunt", "substitute"] + ], + "item": ["leftovers", "blacksludge", "rockyhelmet"], + "nature": "adamant", + "evs": [252, 156, 0, 0, 0, 100], + "teraType": ["water", "poison", "flying"], + "ability": "guarddog" + }, + { + "species": "okidogi", + "weight": 15, + "moves": [ + ["drainpunch"], + ["knockoff"], + ["poisonjab", "poisonfang"], + ["icepunch"] + ], + "item": ["assaultvest"], + "nature": "adamant", + "evs": [252, 252, 0, 0, 4, 0], + "teraType": ["poison", "water", "flying"], + "ability": "guarddog" + }, + { + "species": "okidogi", + "weight": 10, + "moves": [ + ["drainpunch"], + ["knockoff"], + ["poisonjab", "poisonfang"], + ["icepunch"] + ], + "item": ["assaultvest"], + "nature": "adamant", + "evs": [252, 252, 0, 0, 4, 0], + "teraType": ["poison", "water", "flying"], + "ability": "toxicchain" + } + ] + }, + "arcaninehisui": { + "weight": 4, + "sets": [ + { + "species": "arcaninehisui", + "weight": 45, + "moves": [ + ["headsmash"], + ["flareblitz"], + ["extremespeed"], + ["terablast", "stealthrock"] + ], + "item": ["focussash"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["grass"], + "wantsTera": true, + "ability": "rockhead" + }, + { + "species": "arcaninehisui", + "weight": 50, + "moves": [ + ["headsmash"], + ["flareblitz"], + ["extremespeed"], + ["stealthrock", "wildcharge", "flamecharge"] + ], + "item": ["focussash", "choiceband"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["rock", "normal"], + "wantsTera": true, + "ability": "rockhead" + }, + { + "species": "arcaninehisui", + "weight": 5, + "moves": [["rockblast"], ["flareblitz"], ["extremespeed"], ["terablast"]], + "item": ["loadeddice"], + "nature": "adamant", + "evs": [212, 252, 4, 0, 4, 36], + "teraType": ["fairy"], + "wantsTera": true, + "ability": "intimidate" + } + ] + }, + "snorlax": { + "weight": 4, + "sets": [ + { + "species": "snorlax", + "weight": 60, + "moves": [ + ["heavyslam"], + ["fissure", "earthquake"], + ["bodyslam", "protect"], + ["yawn"] + ], + "item": ["leftovers"], + "nature": "careful", + "evs": [252, 0, 92, 0, 164, 0], + "teraType": ["fairy", "ghost"], + "ability": "thickfat" + }, + { + "species": "snorlax", + "weight": 20, + "moves": [ + ["heavyslam"], + ["heatcrash", "earthquake"], + ["doubleedge", "bodyslam"], + ["fissure"] + ], + "item": ["assaultvest"], + "nature": "adamant", + "evs": [0, 252, 252, 0, 4, 0], + "teraType": ["steel", "ghost"], + "ability": "thickfat" + }, + { + "species": "snorlax", + "weight": 20, + "moves": [ + ["heavyslam"], + ["heatcrash", "earthquake"], + ["doubleedge", "bodyslam"], + ["fissure", "terablast"] + ], + "item": ["assaultvest"], + "nature": "adamant", + "evs": [0, 252, 252, 0, 4, 0], + "teraType": ["fairy"], + "ability": "thickfat" + } + ] + }, + "alomomola": { + "weight": 4, + "sets": [ + { + "species": "alomomola", + "weight": 100, + "moves": [["scald"], ["flipturn"], ["mirrorcoat"], ["icywind"]], + "item": ["assaultvest"], + "nature": "sassy", + "evs": [4, 0, 252, 0, 252, 0], + "teraType": ["poison"], + "ability": "regenerator" + } + ] + }, + "umbreon": { + "weight": 4, + "sets": [ + { + "species": "umbreon", + "weight": 100, + "moves": [["foulplay"], ["protect"], ["wish"], ["yawn"]], + "item": ["leftovers"], + "nature": "bold", + "evs": [252, 0, 252, 0, 4, 0], + "teraType": ["fairy", "poison"], + "ability": "innerfocus" + } + ] + }, + "cloyster": { + "weight": 3, + "sets": [ + { + "species": "cloyster", + "weight": 60, + "moves": [ + ["shellsmash"], + ["iciclespear"], + ["iceshard", "drillrun", "terablast"], + ["rockblast"] + ], + "item": ["focussash", "kingsrock"], + "nature": "adamant", + "evs": [0, 252, 4, 0, 0, 252], + "teraType": ["ghost"], + "ability": "skilllink" + }, + { + "species": "cloyster", + "weight": 15, + "moves": [["shellsmash"], ["iciclespear"], ["terablast"], ["rockblast"]], + "item": ["focussash", "lifeorb", "lumberry"], + "nature": "adamant", + "evs": [0, 252, 4, 0, 0, 252], + "teraType": ["electric"], + "wantsTera": true, + "ability": "skilllink" + }, + { + "species": "cloyster", + "weight": 25, + "moves": [ + ["shellsmash"], + ["iciclespear"], + ["iceshard", "drillrun"], + ["rockblast"] + ], + "item": ["focussash"], + "nature": "adamant", + "evs": [0, 252, 4, 0, 0, 252], + "teraType": ["ice"], + "ability": "skilllink" + } + ] + }, + "tinkaton": { + "weight": 3, + "sets": [ + { + "species": "tinkaton", + "weight": 100, + "moves": [ + ["gigatonhammer", "knockoff"], + ["encore"], + ["stealthrock"], + ["thunderwave"] + ], + "item": ["airballoon"], + "nature": "careful", + "evs": [244, 4, 164, 0, 20, 76], + "teraType": ["water", "flying", "ground"], + "ability": "moldbreaker" + } + ] + }, + "fezandipiti": { + "weight": 3, + "sets": [ + { + "species": "fezandipiti", + "weight": 50, + "moves": [ + ["calmmind", "heatwave", "charm", "taunt", "tailwind"], + ["moonblast"], + ["roost"], + ["uturn"] + ], + "item": ["leftovers", "covertcloak", "sitrusberry"], + "nature": "bold", + "evs": [252, 0, 220, 0, 0, 36], + "teraType": ["water", "flying"], + "ability": "toxicchain" + }, + { + "species": "fezandipiti", + "weight": 50, + "moves": [ + ["roost"], + ["toxic", "taunt"], + ["uturn"], + ["playrough", "charm"] + ], + "item": ["leftovers"], + "nature": "careful", + "evs": [252, 0, 0, 0, 220, 36], + "teraType": ["water", "flying"], + "ability": "toxicchain" + } + ] + }, + "pelipper": { + "weight": 3, + "sets": [ + { + "species": "pelipper", + "weight": 70, + "moves": [ + ["uturn"], + ["hydropump", "surf"], + ["icebeam"], + ["hurricane", "roost"] + ], + "item": ["damprock"], + "nature": "quiet", + "ivs": [31, 31, 31, 31, 31, 0], + "evs": [252, 0, 4, 252, 0, 0], + "teraType": ["steel", "ground", "grass"], + "ability": "drizzle" + }, + { + "species": "pelipper", + "weight": 30, + "moves": [ + ["uturn"], + ["hydropump", "surf"], + ["icebeam"], + ["hurricane"] + ], + "item": ["damprock", "choicespecs"], + "nature": "modest", + "evs": [0, 0, 0, 252, 4, 252], + "teraType": ["steel", "ground", "grass", "water", "flying"], + "ability": "drizzle" + } + ] + }, + "rotomheat": { + "weight": 3, + "sets": [ + { + "species": "rotomheat", + "weight": 20, + "moves": [["voltswitch"], ["overheat"], ["trick"], ["thunderbolt"]], + "item": ["choicescarf", "choicespecs"], + "nature": "timid", + "evs": [0, 0, 0, 252, 4, 252], + "teraType": ["electric"], + "ability": "levitate" + }, + { + "species": "rotomheat", + "weight": 20, + "moves": [["voltswitch"], ["overheat"], ["trick"], ["terablast"]], + "item": ["choicescarf", "choicespecs"], + "nature": "timid", + "evs": [0, 0, 0, 252, 4, 252], + "teraType": ["fairy"], + "wantsTera": true, + "ability": "levitate" + }, + { + "species": "rotomheat", + "weight": 60, + "moves": [ + ["voltswitch"], + ["foulplay"], + ["overheat"], + ["willowisp", "thunderwave"] + ], + "item": ["sitrusberry", "rockyhelmet"], + "nature": "bold", + "evs": [252, 0, 252, 0, 4, 0], + "teraType": ["steel", "fairy", "ghost"], + "ability": "levitate" + } + ] + }, + "taurospaldeablaze": { + "weight": 3, + "sets": [ + { + "species": "taurospaldeablaze", + "weight": 50, + "moves": [ + ["ragingbull"], + ["bodypress"], + ["willowisp"], + ["rocktomb", "earthquake", "bulkup"] + ], + "item": ["sitrusberry", "rockyhelmet"], + "nature": "impish", + "evs": [252, 0, 252, 0, 4, 0], + "teraType": ["fairy"], + "ability": "intimidate" + }, + { + "species": "taurospaldeablaze", + "weight": 50, + "moves": [ + ["closecombat"], + ["ragingbull", "flareblitz"], + ["flamecharge", "rocktomb"], + ["earthquake", "terablast", "bulkup"] + ], + "item": ["ejectpack"], + "nature": "jolly", + "evs": [4, 252, 0, 0, 0, 252], + "teraType": ["grass", "fairy"], + "wantsTera": true, + "ability": "intimidate" + } + ] + }, + "torkoal": { + "weight": 3, + "sets": [ + { + "species": "torkoal", + "weight": 100, + "moves": [ + ["overheat"], + ["yawn"], + ["stealthrock"], + ["solarbeam", "fissure", "bodypress", "clearsmog"] + ], + "item": ["ejectpack"], + "nature": "bold", + "evs": [252, 0, 252, 0, 4, 0], + "teraType": ["grass", "fire"], + "ability": "drought" + } + ] + }, + "amoonguss": { + "weight": 3, + "sets": [ + { + "species": "amoonguss", + "weight": 45, + "moves": [ + ["spore"], + ["leafstorm"], + ["foulplay"], + ["sludgebomb", "clearsmog"] + ], + "item": ["ejectpack"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "bold", + "evs": [252, 0, 156, 0, 100, 0], + "teraType": ["water"], + "ability": "regenerator" + }, + { + "species": "amoonguss", + "weight": 35, + "moves": [ + ["spore"], + ["sludgebomb", "clearsmog", "gigadrain"], + ["stompingtantrum", "foulplay"], + ["synthesis"] + ], + "item": ["rockyhelmet", "leftovers"], + "nature": "relaxed", + "evs": [252, 0, 156, 0, 100, 0], + "teraType": ["water", "fairy"], + "ability": "regenerator" + }, + { + "species": "amoonguss", + "weight": 20, + "moves": [ + ["spore"], + ["sludgebomb", "clearsmog", "gigadrain"], + ["stompingtantrum", "foulplay"], + ["synthesis"] + ], + "item": ["blacksludge"], + "nature": "relaxed", + "evs": [252, 0, 156, 0, 100, 0], + "teraType": ["poison"], + "ability": "regenerator" + } + ] + }, + "greattusk": { + "weight": 3, + "sets": [ + { + "species": "greattusk", + "weight": 45, + "moves": [ + ["closecombat"], + ["earthquake", "headlongrush"], + ["icespinner"], + ["rapidspin", "knockoff", "stealthrock"] + ], + "item": ["boosterenergy", "focussash"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["steel", "water", "ground"], + "ability": "protosynthesis" + }, + { + "species": "greattusk", + "weight": 15, + "moves": [ + ["closecombat"], + ["earthquake", "headlongrush"], + ["icespinner"], + ["rapidspin", "knockoff"] + ], + "item": ["assaultvest"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["steel", "water", "ground"], + "ability": "protosynthesis" + }, + { + "species": "greattusk", + "weight": 25, + "moves": [ + ["bulkup"], + ["earthquake"], + ["icespinner"], + ["taunt", "substitute"] + ], + "item": ["leftovers", "boosterenergy"], + "nature": "jolly", + "evs": [4, 0, 0, 0, 252, 252], + "teraType": ["water", "steel"], + "ability": "protosynthesis" + }, + { + "species": "greattusk", + "weight": 15, + "moves": [ + ["closecombat"], + ["headlongrush", "earthquake"], + ["icespinner"], + ["knockoff"] + ], + "item": ["choicescarf", "choiceband"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["ground", "fighting", "steel"], + "ability": "protosynthesis" + } + ] + }, + "thundurustherian": { + "weight": 3, + "sets": [ + { + "species": "thundurustherian", + "weight": 45, + "moves": [ + ["voltswitch"], + ["thunderbolt"], + ["terablast"], + ["grassknot", "focusblast", "sludgebomb"] + ], + "item": ["choicescarf"], + "nature": "timid", + "ivs": [31, 0, 31, 31, 31, 31], + "evs": [4, 0, 0, 252, 0, 252], + "teraType": ["flying", "ice"], + "wantsTera": true, + "ability": "voltabsorb" + }, + { + "species": "thundurustherian", + "weight": 45, + "moves": [ + ["voltswitch"], + ["thunderbolt"], + ["terablast"], + ["grassknot", "focusblast", "sludgebomb"] + ], + "item": ["choicespecs", "assaultvest"], + "nature": "timid", + "ivs": [31, 0, 31, 31, 31, 31], + "evs": [4, 0, 0, 252, 0, 252], + "teraType": ["flying", "ice", "water"], + "wantsTera": true, + "ability": "voltabsorb" + }, + { + "species": "thundurustherian", + "weight": 10, + "moves": [ + ["nastyplot"], + ["thunderbolt"], + ["grassknot", "substitute"], + ["terablast"] + ], + "item": ["lifeorb", "sitrusberry"], + "nature": "timid", + "ivs": [31, 0, 31, 31, 31, 31], + "evs": [0, 0, 4, 252, 0, 252], + "teraType": ["flying", "ice", "water"], + "wantsTera": true, + "ability": "voltabsorb" + } + ] + }, + "arcanine": { + "weight": 3, + "sets": [ + { + "species": "arcanine", + "weight": 50, + "moves": [["flareblitz"], ["morningsun"], ["willowisp"], ["extremespeed"]], + "item": ["heavydutyboots", "rockyhelmet", "leftovers"], + "nature": "impish", + "evs": [236, 0, 212, 0, 0, 60], + "teraType": ["normal"], + "ability": "intimidate" + }, + { + "species": "arcanine", + "weight": 50, + "moves": [ + ["flareblitz", "roar"], + ["morningsun"], + ["willowisp"], + ["extremespeed", "snarl", "bulldoze"] + ], + "item": ["heavydutyboots", "rockyhelmet", "leftovers"], + "nature": "impish", + "evs": [236, 0, 212, 0, 0, 60], + "teraType": ["fairy", "grass"], + "ability": "intimidate" + } + ] + }, + "gyarados": { + "weight": 3, + "sets": [ + { + "species": "gyarados", + "weight": 100, + "moves": [ + ["taunt"], + ["waterfall", "ironhead"], + ["earthquake", "icefang"], + ["thunderwave"] + ], + "item": ["rockyhelmet"], + "nature": "impish", + "evs": [228, 4, 220, 0, 4, 52], + "teraType": ["steel", "ground"], + "ability": "intimidate" + } + ] + }, + "pawmot": { + "weight": 3, + "sets": [ + { + "species": "pawmot", + "weight": 33, + "moves": [ + ["doubleshock"], + ["closecombat"], + ["machpunch", "nuzzle", "icepunch"], + ["revivalblessing", "encore"] + ], + "item": ["focussash"], + "nature": "jolly", + "evs": [4, 252, 0, 0, 0, 252], + "teraType": ["electric"], + "ability": "ironfist" + }, + { + "species": "pawmot", + "weight": 33, + "moves": [ + ["doubleshock"], + ["closecombat"], + ["machpunch", "nuzzle", "icepunch"], + ["revivalblessing", "encore"] + ], + "item": ["focussash"], + "nature": "jolly", + "evs": [4, 252, 0, 0, 0, 252], + "teraType": ["electric"], + "ability": "voltabsorb" + }, + { + "species": "pawmot", + "weight": 33, + "moves": [ + ["doubleshock"], + ["closecombat"], + ["machpunch", "nuzzle", "icepunch"], + ["revivalblessing", "encore"] + ], + "item": ["focussash"], + "nature": "jolly", + "evs": [4, 252, 0, 0, 0, 252], + "teraType": ["electric"], + "ability": "naturalcure" + } + ] + }, + "zoroarkhisui": { + "weight": 3, + "sets": [ + { + "species": "zoroarkhisui", + "weight": 60, + "moves": [ + ["bittermalice"], + ["willowisp"], + ["shadowsneak"], + ["curse", "terablast"] + ], + "item": ["focussash"], + "nature": "timid", + "evs": [0, 0, 4, 252, 0, 252], + "teraType": ["fairy", "fighting", "ghost"], + "wantsTera": true, + "ability": "illusion" + }, + { + "species": "zoroarkhisui", + "weight": 40, + "moves": [["bittermalice"], ["curse"], ["willowisp"], ["trick"]], + "item": ["choicescarf"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "timid", + "evs": [252, 0, 0, 4, 0, 252], + "teraType": ["ghost", "fairy"], + "ability": "illusion" + } + ] + }, + "drifblim": { + "weight": 2, + "sets": [ + { + "species": "drifblim", + "weight": 95, + "moves": [ + ["minimize"], + ["substitute"], + ["batonpass"], + ["strengthsap", "willowisp", "airslash", "stockpile", "shadowball"] + ], + "item": ["sitrusberry", "keeberry"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "timid", + "evs": [0, 0, 164, 0, 92, 252], + "teraType": ["water", "normal", "dark"], + "ability": "unburden" + }, + { + "species": "drifblim", + "weight": 5, + "moves": [ + ["minimize"], + ["substitute"], + ["batonpass"], + ["strengthsap", "willowisp", "airslash", "stockpile", "shadowball"] + ], + "item": ["grassyseed"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "timid", + "evs": [0, 0, 164, 0, 92, 252], + "teraType": ["water", "normal", "dark"], + "ability": "unburden" + } + ] + }, + "hatterene": { + "weight": 2, + "sets": [ + { + "species": "hatterene", + "weight": 30, + "moves": [ + ["drainingkiss"], + ["psyshock"], + ["calmmind"], + ["batonpass", "mysticalfire", "trickroom"] + ], + "item": ["wikiberry", "sitrusberry"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "bold", + "evs": [244, 0, 252, 12, 0, 0], + "teraType": ["water", "normal", "fire"], + "ability": "magicbounce" + }, + { + "species": "hatterene", + "weight": 35, + "moves": [ + ["drainingkiss", "dazzlinggleam"], + ["psyshock"], + ["calmmind", "healingwish"], + ["trickroom"] + ], + "item": ["wikiberry", "sitrusberry"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "bold", + "evs": [244, 0, 252, 12, 0, 0], + "teraType": ["water", "normal"], + "ability": "magicbounce" + }, + { + "species": "hatterene", + "weight": 35, + "moves": [ + ["dazzlinggleam"], + ["psyshock"], + ["calmmind", "healingwish"], + ["trickroom"] + ], + "item": ["focussash"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "quiet", + "evs": [252, 0, 4, 252, 0, 0], + "teraType": ["water", "normal", "fairy"], + "ability": "magicbounce" + } + ] + }, + "orthworm": { + "weight": 2, + "sets": [ + { + "species": "orthworm", + "weight": 60, + "moves": [ + ["irondefense"], + ["bodypress"], + ["ironhead", "stealthrock"], + ["shedtail"] + ], + "item": ["sitrusberry", "rockyhelmet"], + "nature": "impish", + "evs": [252, 0, 252, 0, 4, 0], + "teraType": ["poison", "ghost", "fairy"], + "ability": "eartheater" + }, + { + "species": "orthworm", + "weight": 40, + "moves": [ + ["irondefense"], + ["bodypress"], + ["ironhead", "stealthrock"], + ["rest"] + ], + "item": ["chestoberry", "rockyhelmet"], + "nature": "impish", + "evs": [252, 0, 252, 0, 4, 0], + "teraType": ["poison", "ghost", "fairy"], + "ability": "eartheater" + } + ] + }, + "sandyshocks": { + "weight": 2, + "sets": [ + { + "species": "sandyshocks", + "weight": 10, + "moves": [ + ["stealthrock"], + ["thunderbolt"], + ["earthpower"], + ["thunderwave", "mirrorcoat"] + ], + "item": ["focussash"], + "nature": "timid", + "evs": [4, 0, 0, 252, 0, 252], + "teraType": ["ground", "electric"], + "ability": "protosynthesis" + }, + { + "species": "sandyshocks", + "weight": 10, + "moves": [ + ["stealthrock", "mirrorcoat"], + ["thunderbolt"], + ["earthpower"], + ["terablast"] + ], + "item": ["focussash"], + "nature": "timid", + "evs": [4, 0, 0, 252, 0, 252], + "teraType": ["ice"], + "wantsTera": true, + "ability": "protosynthesis" + }, + { + "species": "sandyshocks", + "weight": 60, + "moves": [ + ["thunderbolt"], + ["earthpower"], + ["terablast"], + ["stealthrock", "flashcannon"] + ], + "item": ["boosterenergy"], + "nature": "timid", + "evs": [52, 0, 0, 204, 0, 252], + "teraType": ["ice", "fairy"], + "wantsTera": true, + "ability": "protosynthesis" + }, + { + "species": "sandyshocks", + "weight": 10, + "moves": [ + ["thunderbolt"], + ["voltswitch"], + ["earthpower"], + ["terablast"] + ], + "item": ["choicescarf"], + "nature": "timid", + "evs": [4, 0, 0, 252, 0, 252], + "teraType": ["ice", "fairy"], + "wantsTera": true, + "ability": "protosynthesis" + }, + { + "species": "sandyshocks", + "weight": 10, + "moves": [ + ["thunderbolt", "mirrorcoat"], + ["voltswitch"], + ["earthpower"], + ["terablast"] + ], + "item": ["assaultvest"], + "nature": "timid", + "evs": [4, 0, 0, 252, 0, 252], + "teraType": ["ice", "fairy"], + "wantsTera": true, + "ability": "protosynthesis" + } + ] + }, + "greninja": { + "weight": 2, + "sets": [ + { + "species": "greninja", + "weight": 50, + "moves": [ + ["icebeam"], + ["grassknot", "darkpulse"], + ["watershuriken"], + ["counter", "toxicspikes"] + ], + "item": ["focussash"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "timid", + "evs": [0, 0, 0, 252, 4, 252], + "teraType": ["water", "ghost"], + "ability": "protean" + }, + { + "species": "greninja", + "weight": 50, + "moves": [ + ["icebeam"], + ["grassknot", "darkpulse"], + ["watershuriken"], + ["counter", "toxicspikes"] + ], + "item": ["focussash"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "timid", + "evs": [0, 0, 0, 252, 4, 252], + "teraType": ["water", "ghost"], + "ability": "torrent" + } + ] + }, + "palafin": { + "weight": 2, + "sets": [ + { + "species": "palafin", + "weight": 40, + "moves": [ + ["jetpunch"], + ["wavecrash"], + ["flipturn"], + ["icepunch", "closecombat", "drainpunch"] + ], + "item": ["choiceband"], + "nature": "jolly", + "evs": [4, 252, 0, 0, 0, 252], + "teraType": ["water"], + "ability": "zerotohero" + }, + { + "species": "palafin", + "weight": 30, + "moves": [ + ["jetpunch"], + ["wavecrash"], + ["flipturn"], + ["drainpunch", "closecombat"] + ], + "item": ["assaultvest", "choicescarf", "mysticwater"], + "nature": "jolly", + "evs": [4, 252, 0, 0, 0, 252], + "teraType": ["water", "fighting"], + "ability": "zerotohero" + }, + { + "species": "palafin", + "weight": 20, + "moves": [ + ["bulkup"], + ["jetpunch"], + ["drainpunch"], + ["substitute", "taunt"] + ], + "item": ["leftovers", "punchingglove"], + "nature": "jolly", + "evs": [252, 0, 4, 0, 0, 252], + "teraType": ["fighting", "water"], + "ability": "zerotohero" + }, + { + "species": "palafin", + "weight": 10, + "moves": [ + ["bulkup"], + ["jetpunch"], + ["terablast"], + ["substitute", "taunt"] + ], + "item": ["leftovers"], + "nature": "jolly", + "evs": [252, 0, 4, 0, 0, 252], + "teraType": ["fairy"], + "wantsTera": true, + "ability": "zerotohero" + } + ] + }, + "regieleki": { + "weight": 2, + "sets": [ + { + "species": "regieleki", + "weight": 25, + "moves": [ + ["thunderbolt"], + ["terablast"], + ["extremespeed"], + ["wildcharge", "voltswitch", "thunderwave"] + ], + "item": ["lifeorb", "focussash"], + "nature": "hasty", + "evs": [0, 4, 0, 252, 0, 252], + "teraType": ["ice"], + "wantsTera": true, + "ability": "transistor" + }, + { + "species": "regieleki", + "weight": 20, + "moves": [ + ["thunderbolt"], + ["voltswitch"], + ["extremespeed"], + ["wildcharge"] + ], + "item": ["lifeorb"], + "nature": "hasty", + "evs": [0, 4, 0, 252, 0, 252], + "teraType": ["electric"], + "ability": "transistor" + }, + { + "species": "regieleki", + "weight": 25, + "moves": [ + ["thunderbolt"], + ["terablast"], + ["voltswitch"], + ["extremespeed", "thundercage"] + ], + "item": ["choicespecs"], + "nature": "timid", + "evs": [4, 0, 0, 252, 0, 252], + "teraType": ["ice"], + "wantsTera": true, + "ability": "transistor" + }, + { + "species": "regieleki", + "weight": 15, + "moves": [ + ["thundercage", "thunderbolt"], + ["reflect"], + ["lightscreen"], + ["terablast"] + ], + "item": ["lightclay"], + "nature": "timid", + "evs": [252, 0, 0, 4, 0, 252], + "teraType": ["ice"], + "wantsTera": true, + "ability": "transistor" + }, + { + "species": "regieleki", + "weight": 15, + "moves": [ + ["thundercage", "thunderbolt"], + ["reflect"], + ["lightscreen"], + ["explosion", "thunderwave"] + ], + "item": ["lightclay"], + "nature": "timid", + "evs": [252, 0, 0, 4, 0, 252], + "teraType": ["ghost", "normal"], + "ability": "transistor" + } + ] + }, + "avalugg": { + "weight": 2, + "sets": [ + { + "species": "avalugg", + "weight": 100, + "moves": [ + ["irondefense"], + ["bodypress"], + ["recover"], + ["iciclecrash", "avalanche"] + ], + "item": ["heavydutyboots", "rockyhelmet"], + "nature": "impish", + "evs": [252, 0, 252, 0, 4, 0], + "teraType": ["fighting"], + "wantsTera": true, + "ability": "sturdy" + } + ] + }, + "landorus": { + "weight": 2, + "sets": [ + { + "species": "landorus", + "weight": 45, + "moves": [ + ["earthpower"], + ["sludgebomb"], + ["focusblast", "psychic"], + ["substitute", "nastyplot"] + ], + "item": ["lifeorb"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "timid", + "evs": [0, 0, 0, 252, 4, 252], + "teraType": ["water", "poison", "steel"], + "wantsTera": true, + "ability": "sheerforce" + }, + { + "species": "landorus", + "weight": 55, + "moves": [ + ["earthpower"], + ["sludgebomb"], + ["focusblast", "substitute", "nastyplot"], + ["terablast"] + ], + "item": ["lifeorb"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "timid", + "evs": [0, 0, 0, 252, 4, 252], + "teraType": ["ice", "flying"], + "wantsTera": true, + "ability": "sheerforce" + } + ] + }, + "quaquaval": { + "weight": 2, + "sets": [ + { + "species": "quaquaval", + "weight": 65, + "moves": [ + ["aquastep"], + ["closecombat"], + ["aquajet"], + ["icespinner", "encore", "swordsdance"] + ], + "item": ["focussash", "mysticwater"], + "nature": "jolly", + "evs": [4, 252, 0, 0, 0, 252], + "teraType": ["water", "steel"], + "ability": "moxie" + }, + { + "species": "quaquaval", + "weight": 10, + "moves": [["aquastep"], ["closecombat"], ["aquajet"], ["terablast"]], + "item": ["focussash", "mysticwater"], + "nature": "jolly", + "evs": [4, 252, 0, 0, 0, 252], + "teraType": ["electric", "steel"], + "wantsTera": true, + "ability": "moxie" + }, + { + "species": "quaquaval", + "weight": 25, + "moves": [ + ["aquastep"], + ["roost"], + ["bulkup"], + ["taunt", "encore", "substitute"] + ], + "item": ["leftovers", "rockyhelmet", "covertcloak"], + "nature": "jolly", + "evs": [252, 0, 0, 0, 156, 100], + "teraType": ["steel"], + "ability": "moxie" + } + ] + }, + "articuno": { + "weight": 1, + "sets": [ + { + "species": "articuno", + "weight": 100, + "moves": [ + ["substitute"], + ["protect", "freezedry"], + ["roost"], + ["sheercold"] + ], + "item": ["leftovers"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "bold", + "evs": [220, 0, 228, 0, 0, 60], + "teraType": ["steel", "ghost"], + "ability": "pressure" + } + ] + }, + "haxorus": { + "weight": 1, + "sets": [ + { + "species": "haxorus", + "weight": 65, + "moves": [["dragondance"], ["ironhead"], ["outrage"], ["earthquake"]], + "item": ["lumberry", "focussash", "lifeorb"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["steel"], + "wantsTera": true, + "ability": "moldbreaker" + }, + { + "species": "haxorus", + "weight": 10, + "moves": [["dragondance"], ["terablast"], ["outrage"], ["earthquake"]], + "item": ["lumberry", "focussash", "lifeorb"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["electric"], + "wantsTera": true, + "ability": "moldbreaker" + }, + { + "species": "haxorus", + "weight": 25, + "moves": [ + ["scaleshot"], + ["ironhead"], + ["earthquake"], + ["dragondance", "swordsdance"] + ], + "item": ["loadeddice"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["steel"], + "wantsTera": true, + "ability": "moldbreaker" + } + ] + }, + "lucario": { + "weight": 1, + "sets": [ + { + "species": "lucario", + "weight": 80, + "moves": [ + ["extremespeed"], + ["closecombat"], + ["bulletpunch"], + ["swordsdance", "counter", "earthquake"] + ], + "item": ["focussash", "lifeorb"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["normal", "steel"], + "ability": "innerfocus" + }, + { + "species": "lucario", + "weight": 20, + "moves": [["vacuumwave"], ["aurasphere"], ["steelbeam"], ["darkpulse"]], + "item": ["lifeorb", "focussash"], + "nature": "timid", + "evs": [0, 0, 0, 252, 4, 252], + "teraType": ["steel", "fighting", "dark"], + "ability": "innerfocus" + } + ] + }, + "mesprit": { + "weight": 1, + "sets": [ + { + "species": "mesprit", + "weight": 100, + "moves": [["dazzlinggleam"], ["trickroom"], ["healingwish"], ["encore"]], + "item": ["sitrusberry"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "bold", + "evs": [252, 0, 252, 4, 0, 0], + "teraType": ["fairy"], + "ability": "levitate" + } + ] + }, + "moltresgalar": { + "weight": 1, + "sets": [ + { + "species": "moltresgalar", + "weight": 100, + "moves": [ + ["fierywrath"], + ["airslash", "hurricane"], + ["nastyplot"], + ["agility"] + ], + "item": ["sitrusberry", "weaknesspolicy"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "timid", + "evs": [0, 0, 0, 252, 4, 252], + "teraType": ["dark", "steel", "flying"], + "ability": "berserk" + } + ] + }, + "sableye": { + "weight": 1, + "sets": [ + { + "species": "sableye", + "weight": 30, + "moves": [ + ["knockoff", "foulplay"], + ["encore"], + ["metalburst", "disable"], + ["willowisp", "thunderwave"] + ], + "item": ["focussash"], + "nature": "adamant", + "evs": [252, 252, 0, 0, 4, 0], + "teraType": ["steel", "poison"], + "ability": "prankster" + }, + { + "species": "sableye", + "weight": 30, + "moves": [["substitute"], ["encore"], ["disable"], ["nightshade"]], + "item": ["leftovers"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "bold", + "evs": [252, 0, 252, 0, 4, 0], + "teraType": ["steel", "poison"], + "ability": "prankster" + }, + { + "species": "sableye", + "weight": 20, + "moves": [ + ["reflect"], + ["lightscreen"], + ["willowisp", "taunt", "encore"], + ["foulplay"] + ], + "item": ["lightclay"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "bold", + "evs": [252, 0, 252, 0, 4, 0], + "teraType": ["steel", "poison"], + "ability": "prankster" + }, + { + "species": "sableye", + "weight": 20, + "moves": [ + ["reflect"], + ["lightscreen"], + ["willowisp", "taunt", "encore"], + ["knockoff"] + ], + "item": ["lightclay"], + "nature": "impish", + "evs": [252, 0, 252, 0, 4, 0], + "teraType": ["steel", "poison"], + "ability": "prankster" + } + ] + }, + "uxie": { + "weight": 1, + "sets": [ + { + "species": "uxie", + "weight": 100, + "moves": [["uturn"], ["yawn"], ["encore"], ["stealthrock"]], + "item": ["sitrusberry"], + "nature": "impish", + "evs": [244, 0, 252, 0, 12, 0], + "teraType": ["fairy"], + "ability": "levitate" + } + ] + }, + "brutebonnet": { + "weight": 1, + "sets": [ + { + "species": "brutebonnet", + "weight": 85, + "moves": [ + ["spore"], + ["trailblaze"], + ["crunch", "terablast"], + ["substitute"] + ], + "item": ["leftovers"], + "nature": "jolly", + "evs": [52, 204, 0, 0, 0, 252], + "teraType": ["water", "fire"], + "wantsTera": true, + "ability": "protosynthesis" + }, + { + "species": "brutebonnet", + "weight": 15, + "moves": [ + ["spore"], + ["suckerpunch"], + ["bulletseed"], + ["terablast", "substitute"] + ], + "item": ["loadeddice"], + "nature": "adamant", + "evs": [252, 252, 0, 0, 4, 0], + "teraType": ["water", "fire"], + "wantsTera": true, + "ability": "protosynthesis" + } + ] + }, + "samurotthisui": { + "weight": 1, + "sets": [ + { + "species": "samurotthisui", + "weight": 70, + "moves": [ + ["ceaselessedge"], + ["razorshell", "aquacutter"], + ["suckerpunch", "aquajet"], + ["encore", "sacredsword"] + ], + "item": ["focussash"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["water", "dark", "ghost"], + "ability": "sharpness" + }, + { + "species": "samurotthisui", + "weight": 15, + "moves": [ + ["ceaselessedge"], + ["razorshell", "aquacutter"], + ["suckerpunch", "aquajet"], + ["sacredsword"] + ], + "item": ["assaultvest"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["water"], + "ability": "sharpness" + }, + { + "species": "samurotthisui", + "weight": 15, + "moves": [ + ["ceaselessedge"], + ["razorshell", "aquacutter"], + ["suckerpunch", "aquajet"], + ["terablast"] + ], + "item": ["assaultvest"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["fairy"], + "ability": "sharpness" + } + ] + }, + "slowkinggalar": { + "weight": 1, + "sets": [ + { + "species": "slowkinggalar", + "weight": 60, + "moves": [ + ["flamethrower"], + ["grassknot"], + ["psychic", "eeriespell"], + ["sludgebomb"] + ], + "item": ["assaultvest"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "modest", + "evs": [252, 0, 0, 252, 4, 0], + "teraType": ["poison", "normal"], + "ability": "regenerator" + }, + { + "species": "slowkinggalar", + "weight": 40, + "moves": [ + ["eeriespell", "sludgebomb"], + ["toxic", "yawn"], + ["trickroom", "slackoff"], + ["chillyreception"] + ], + "item": ["blacksludge"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "relaxed", + "evs": [244, 0, 252, 0, 12, 0], + "teraType": ["poison"], + "ability": "regenerator" + } + ] + }, + "basculegionf": { + "weight": 1, + "sets": [ + { + "species": "basculegionf", + "weight": 70, + "moves": [ + ["shadowball"], + ["aquajet"], + ["surf", "hydropump"], + ["endeavor"] + ], + "gender": "f", + "item": ["focussash"], + "nature": "rash", + "evs": [0, 4, 0, 252, 0, 252], + "teraType": ["water"], + "ability": "adaptability" + }, + { + "species": "basculegionf", + "weight": 30, + "moves": [ + ["shadowball"], + ["aquajet"], + ["surf", "hydropump"], + ["endeavor", "terablast"] + ], + "gender": "f", + "item": ["focussash"], + "nature": "rash", + "evs": [0, 4, 0, 252, 0, 252], + "teraType": ["fairy"], + "wantsTera": true, + "ability": "adaptability" + } + ] + }, + "irontreads": { + "weight": 1, + "sets": [ + { + "species": "irontreads", + "weight": 15, + "moves": [ + ["earthquake"], + ["ironhead", "heavyslam"], + ["rapidspin", "icespinner", "voltswitch"], + ["knockoff"] + ], + "item": ["assaultvest"], + "nature": "jolly", + "evs": [252, 4, 0, 0, 252, 0], + "teraType": ["grass", "water", "fairy", "flying"], + "ability": "quarkdrive" + }, + { + "species": "irontreads", + "weight": 60, + "moves": [ + ["earthquake", "endeavor"], + ["ironhead"], + ["stealthrock", "rapidspin", "substitute"], + ["knockoff", "icespinner"] + ], + "item": ["boosterenergy"], + "nature": "jolly", + "evs": [4, 252, 0, 0, 0, 252], + "teraType": ["grass", "water", "fairy", "ground"], + "ability": "quarkdrive" + }, + { + "species": "irontreads", + "weight": 25, + "moves": [ + ["earthquake", "endeavor"], + ["ironhead"], + ["stealthrock", "rapidspin", "substitute"], + ["terablast"] + ], + "item": ["boosterenergy"], + "nature": "jolly", + "evs": [4, 252, 0, 0, 0, 252], + "teraType": ["grass", "water", "fairy"], + "wantsTera": true, + "ability": "quarkdrive" + } + ] + }, + "overqwil": { + "weight": 1, + "sets": [ + { + "species": "overqwil", + "weight": 60, + "moves": [ + ["crunch"], + ["barbbarrage", "toxic"], + ["minimize"], + ["substitute"] + ], + "item": ["leftovers"], + "nature": "jolly", + "evs": [252, 0, 0, 0, 4, 252], + "teraType": ["water", "dark"], + "ability": "poisonpoint" + }, + { + "species": "overqwil", + "weight": 40, + "moves": [ + ["crunch"], + ["barbbarrage", "toxic"], + ["minimize"], + ["substitute"] + ], + "item": ["blacksludge"], + "nature": "jolly", + "evs": [252, 0, 0, 0, 4, 252], + "teraType": ["poison"], + "ability": "poisonpoint" + } + ] + }, + "spectrier": { + "weight": 1, + "sets": [ + { + "species": "spectrier", + "weight": 100, + "moves": [["shadowball"], ["drainingkiss"], ["willowisp"], ["calmmind"]], + "item": ["leftovers", "sitrusberry"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "timid", + "evs": [252, 0, 0, 4, 0, 252], + "teraType": ["fairy"], + "wantsTera": true, + "ability": "grimneigh" + } + ] + }, + "maushold": { + "weight": 1, + "sets": [ + { + "species": "maushold", + "weight": 100, + "moves": [ + ["populationbomb"], + ["bite", "mudshot"], + ["encore"], + ["thunderwave", "tidyup"] + ], + "item": ["widelens", "kingsrock"], + "nature": "jolly", + "evs": [0, 252, 0, 0, 4, 252], + "teraType": ["normal", "ghost", "poison"], + "ability": "technician" + } + ] + }, + "polteageist": { + "weight": 1, + "sets": [ + { + "species": "polteageist", + "weight": 100, + "moves": [["shellsmash"], ["strengthsap"], ["storedpower"], ["terablast"]], + "item": ["whiteherb", "focussash"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "bold", + "evs": [108, 0, 196, 0, 0, 204], + "teraType": ["water", "fighting"], + "wantsTera": true, + "ability": "cursedbody" + } + ] + }, + "taurospaldeaaqua": { + "weight": 1, + "sets": [ + { + "species": "taurospaldeaaqua", + "weight": 100, + "moves": [ + ["wavecrash"], + ["closecombat"], + ["trailblaze", "aquajet"], + ["endeavor"] + ], + "item": ["rockyhelmet"], + "nature": "adamant", + "evs": [252, 4, 108, 0, 4, 140], + "teraType": ["water", "steel"], + "ability": "intimidate" + } + ] + }, + "forretress": { + "weight": 1, + "sets": [ + { + "species": "forretress", + "weight": 50, + "moves": [["bodypress"], ["voltswitch"], ["stealthrock"], ["toxicspikes"]], + "item": ["rockyhelmet"], + "ivs": [31, 0, 31, 31, 31, 0], + "nature": "relaxed", + "evs": [252, 0, 252, 0, 4, 0], + "teraType": ["fighting", "water"], + "ability": "sturdy" + }, + { + "species": "forretress", + "weight": 50, + "moves": [["bodypress"], ["voltswitch"], ["stealthrock"], ["gyroball"]], + "item": ["rockyhelmet"], + "ivs": [31, 31, 31, 31, 31, 0], + "nature": "relaxed", + "evs": [252, 0, 252, 0, 4, 0], + "teraType": ["fighting", "water"], + "ability": "sturdy" + } + ] + }, + "glastrier": { + "weight": 1, + "sets": [ + { + "species": "glastrier", + "weight": 80, + "moves": [ + ["iciclecrash"], + ["heavyslam"], + ["terablast"], + ["closecombat", "highhorsepower"] + ], + "item": ["assaultvest"], + "nature": "adamant", + "evs": [252, 252, 0, 0, 4, 0], + "teraType": ["electric", "water"], + "wantsTera": true, + "ability": "chillingneigh" + }, + { + "species": "glastrier", + "weight": 20, + "moves": [ + ["iciclecrash"], + ["heavyslam"], + ["closecombat"], + ["highhorsepower"] + ], + "item": ["assaultvest"], + "nature": "adamant", + "evs": [252, 252, 0, 0, 4, 0], + "teraType": ["ghost"], + "wantsTera": true, + "ability": "chillingneigh" + } + ] + }, + "gothitelle": { + "weight": 1, + "sets": [ + { + "species": "gothitelle", + "weight": 65, + "moves": [ + ["trick"], + ["calmmind"], + ["rest"], + ["terablast", "storedpower"] + ], + "item": ["choicescarf"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "bold", + "evs": [236, 0, 196, 4, 4, 68], + "teraType": ["flying", "fairy"], + "ability": "shadowtag" + }, + { + "species": "gothitelle", + "weight": 35, + "moves": [ + ["charm"], + ["calmmind"], + ["rest"], + ["terablast", "storedpower"] + ], + "item": ["leftovers", "covertcloak"], + "ivs": [31, 0, 31, 31, 31, 31], + "nature": "bold", + "evs": [236, 0, 196, 4, 4, 68], + "teraType": ["fairy"], + "wantsTera": true, + "ability": "shadowtag" + } + ] + } +} diff --git a/data/random-battles/gen9/teams.ts b/data/random-battles/gen9/teams.ts index ecd02a9ec00e..de1d4c1fc8b2 100644 --- a/data/random-battles/gen9/teams.ts +++ b/data/random-battles/gen9/teams.ts @@ -10,6 +10,7 @@ export interface TeamData { baseFormes: {[k: string]: number}; megaCount?: number; zCount?: number; + wantsTeraCount?: number; has: {[k: string]: number}; forceResult: boolean; weaknesses: {[k: string]: number}; @@ -31,6 +32,18 @@ interface BattleFactorySet { evs?: Partial; ivs?: Partial; } +interface BSSFactorySet { + species: string; + weight: number; + item: string[]; + ability: string; + nature: string; + moves: string[][]; + teraType: string[]; + wantsTera?: boolean; + evs?: number[]; + ivs?: number[]; +} export class MoveCounter extends Utils.Multiset { damagingMoves: Set; ironFist: number; @@ -2472,6 +2485,305 @@ export class RandomTeams { return team; } + + randomBSSFactorySets: AnyObject = require("./bss-factory-sets.json"); + + randomBSSFactorySet( + species: Species, teamData: RandomTeamsTypes.FactoryTeamDetails + ): RandomTeamsTypes.RandomFactorySet | null { + const id = toID(species.name); + const setList = this.randomBSSFactorySets[id].sets; + + const movesMax: {[k: string]: number} = { + batonpass: 1, + stealthrock: 1, + toxicspikes: 1, + trickroom: 1, + auroraveil: 1, + }; + const weatherAbilities = ['drizzle', 'drought', 'snowwarning', 'sandstream']; + const terrainAbilities: {[k: string]: string} = { + electricsurge: "electric", + psychicsurge: "psychic", + grassysurge: "grassy", + seedsower: "grassy", + mistysurge: "misty", + }; + const terrainItemsRequire: {[k: string]: string} = { + electricseed: "electric", + psychicseed: "psychic", + grassyseed: "grassy", + mistyseed: "misty", + }; + + const maxWantsTera = 2; + + // Build a pool of eligible sets, given the team partners + // Also keep track of sets with moves the team requires + const effectivePool: { + set: BSSFactorySet, moveVariants?: number[], itemVariants?: number, abilityVariants?: number, + }[] = []; + + for (const curSet of setList) { + let reject = false; + + // limit to 2 dedicated tera users per team + if (curSet.wantsTera && teamData.wantsTeraCount && teamData.wantsTeraCount >= maxWantsTera) { + continue; + } + + // reject 2+ weather setters + if (teamData.weather && weatherAbilities.includes(curSet.ability)) { + continue; + } + + if (terrainAbilities[curSet.ability]) { + if (!teamData.terrain) teamData.terrain = []; + teamData.terrain.push(terrainAbilities[curSet.ability]); + } + + for (const item of curSet.item) { + if (terrainItemsRequire[item] && !teamData.terrain?.includes(terrainItemsRequire[item])) { + reject = true; // reject any sets with a seed item possible and no terrain setter to activate it + break; + } + } + + const curSetMoveVariants = []; + for (const move of curSet.moves) { + const variantIndex = this.random(move.length); + const moveId = toID(move[variantIndex]); + if (movesMax[moveId] && teamData.has[moveId] >= movesMax[moveId]) { + reject = true; + break; + } + curSetMoveVariants.push(variantIndex); + } + if (reject) continue; + const set = {set: curSet, moveVariants: curSetMoveVariants}; + effectivePool.push(set); + } + + if (!effectivePool.length) { + if (!teamData.forceResult) return null; + for (const curSet of setList) { + effectivePool.push({set: curSet}); + } + } + + // Sets have individual weight, choose one with weighted random selection + + let setData = this.sample(effectivePool); // Init with unweighted random set as fallback + + const total = effectivePool.reduce((a, b) => a + b.set.weight, 0); + const setRand = this.random(total); + + let cur = 0; + for (const set of effectivePool) { + cur += set.set.weight; + if (cur > setRand) { + setData = set; // Bingo! + break; + } + } + + const moves = []; + for (const [i, moveSlot] of setData.set.moves.entries()) { + moves.push(setData.moveVariants ? moveSlot[setData.moveVariants[i]] : this.sample(moveSlot)); + } + + const setDataAbility = this.sampleIfArray(setData.set.ability); + const evs = setData.set.evs; + const ivs = setData.set.ivs; + return { + name: setData.set.species || species.baseSpecies, + species: setData.set.species, + teraType: this.sampleIfArray(setData.set.teraType), + gender: species.gender || (this.randomChance(1, 2) ? "M" : "F"), + item: this.sampleIfArray(setData.set.item) || "", + ability: setDataAbility || "No Ability", + shiny: this.randomChance(1, 1024), + level: 50, + happiness: 255, + evs: { + hp: (evs?.[0] || 0), + atk: (evs?.[1] || 0), + def: (evs?.[2] || 0), + spa: (evs?.[3] || 0), + spd: (evs?.[4] || 0), + spe: (evs?.[5] || 0), + }, + ivs: { + hp: (ivs?.[0] || 31), + atk: (ivs?.[1] || 31), + def: (ivs?.[2] || 31), + spa: (ivs?.[3] || 31), + spd: (ivs?.[4] || 31), + spe: (ivs?.[5] || 31), + }, + nature: setData.set.nature || "Serious", + moves, + wantsTera: setData.set.wantsTera, + }; + } + + + randomBSSFactoryTeam(side: PlayerOptions, depth = 0): RandomTeamsTypes.RandomFactorySet[] { + this.enforceNoDirectCustomBanlistChanges(); + + const forceResult = depth >= 4; + + const pokemon = []; + + const pokemonPool = Object.keys(this.randomBSSFactorySets); + + const teamData: TeamData = { + typeCount: {}, + typeComboCount: {}, + baseFormes: {}, + has: {}, + wantsTeraCount: 0, + forceResult: forceResult, + weaknesses: {}, + resistances: {}, + }; + const weatherAbilitiesSet: {[k: string]: string} = { + drizzle: "raindance", + drought: "sunnyday", + snowwarning: "hail", + sandstream: "sandstorm", + }; + const resistanceAbilities: {[k: string]: string[]} = { + waterabsorb: ["Water"], + flashfire: ["Fire"], + lightningrod: ["Electric"], + voltabsorb: ["Electric"], + thickfat: ["Ice", "Fire"], + levitate: ["Ground"], + }; + const limitFactor = Math.ceil(this.maxTeamSize / 6); + /** + * Weighted random shuffle + * Uses the fact that for two uniform variables x1 and x2, x1^(1/w1) is larger than x2^(1/w2) + * with probability equal to w1/(w1+w2), which is what we want. See e.g. here https://arxiv.org/pdf/1012.0256.pdf, + * original paper is behind a paywall. + */ + const shuffledSpecies = []; + for (const speciesName of pokemonPool) { + const sortObject = { + speciesName, + score: Math.pow(this.prng.next(), 1 / this.randomBSSFactorySets[speciesName].weight), + }; + shuffledSpecies.push(sortObject); + } + shuffledSpecies.sort((a, b) => a.score - b.score); + + while (shuffledSpecies.length && pokemon.length < this.maxTeamSize) { + // repeated popping from weighted shuffle is equivalent to repeated weighted sampling without replacement + const species = this.dex.species.get(shuffledSpecies.pop()!.speciesName); + if (!species.exists) continue; + + if (this.forceMonotype && !species.types.includes(this.forceMonotype)) continue; + + // Limit to one of each species (Species Clause) + if (teamData.baseFormes[species.baseSpecies]) continue; + + // Limit 2 of any type (most of the time) + const types = species.types; + let skip = false; + if (!this.forceMonotype) { + for (const type of types) { + if (teamData.typeCount[type] >= 2 * limitFactor && this.randomChance(4, 5)) { + skip = true; + break; + } + } + } + if (skip) continue; + + const set = this.randomBSSFactorySet(species, teamData); + if (!set) continue; + + // Limit 1 of any type combination + let typeCombo = types.slice().sort().join(); + if (set.ability === "Drought" || set.ability === "Drizzle") { + // Drought and Drizzle don't count towards the type combo limit + typeCombo = set.ability; + } + if (!this.forceMonotype && teamData.typeComboCount[typeCombo] >= limitFactor) continue; + + const itemData = this.dex.items.get(set.item); + if (teamData.has[itemData.id]) continue; // Item Clause + + // Okay, the set passes, add it to our team + pokemon.push(set); + + // Now that our Pokemon has passed all checks, we can update team data: + for (const type of types) { + if (type in teamData.typeCount) { + teamData.typeCount[type]++; + } else { + teamData.typeCount[type] = 1; + } + } + if (typeCombo in teamData.typeComboCount) { + teamData.typeComboCount[typeCombo]++; + } else { + teamData.typeComboCount[typeCombo] = 1; + } + + teamData.baseFormes[species.baseSpecies] = 1; + + teamData.has[itemData.id] = 1; + + if (set.wantsTera) { + if (!teamData.wantsTeraCount) teamData.wantsTeraCount = 0; + teamData.wantsTeraCount++; + } + + const abilityState = this.dex.abilities.get(set.ability); + if (abilityState.id in weatherAbilitiesSet) { + teamData.weather = weatherAbilitiesSet[abilityState.id]; + } + + for (const move of set.moves) { + const moveId = toID(move); + if (moveId in teamData.has) { + teamData.has[moveId]++; + } else { + teamData.has[moveId] = 1; + } + } + + for (const typeName of this.dex.types.names()) { + // Cover any major weakness (3+) with at least one resistance + if (teamData.resistances[typeName] >= 1) continue; + if (resistanceAbilities[abilityState.id]?.includes(typeName) || !this.dex.getImmunity(typeName, types)) { + // Heuristic: assume that Pokémon with these abilities don't have (too) negative typing. + teamData.resistances[typeName] = (teamData.resistances[typeName] || 0) + 1; + if (teamData.resistances[typeName] >= 1) teamData.weaknesses[typeName] = 0; + continue; + } + const typeMod = this.dex.getEffectiveness(typeName, types); + if (typeMod < 0) { + teamData.resistances[typeName] = (teamData.resistances[typeName] || 0) + 1; + if (teamData.resistances[typeName] >= 1) teamData.weaknesses[typeName] = 0; + } else if (typeMod > 0) { + teamData.weaknesses[typeName] = (teamData.weaknesses[typeName] || 0) + 1; + } + } + } + if (!teamData.forceResult && pokemon.length < this.maxTeamSize) return this.randomBSSFactoryTeam(side, ++depth); + + // Quality control we cannot afford for monotype + if (!teamData.forceResult && !this.forceMonotype) { + for (const type in teamData.weaknesses) { + if (teamData.weaknesses[type] >= 3 * limitFactor) return this.randomBSSFactoryTeam(side, ++depth); + } + } + + return pokemon; + } } export default RandomTeams; diff --git a/sim/global-types.ts b/sim/global-types.ts index 39da583bf3ab..6e2503cad5bf 100644 --- a/sim/global-types.ts +++ b/sim/global-types.ts @@ -534,8 +534,10 @@ namespace RandomTeamsTypes { export interface FactoryTeamDetails { megaCount?: number; zCount?: number; + wantsTeraCount?: number; forceResult: boolean; weather?: string; + terrain?: string[]; typeCount: {[k: string]: number}; typeComboCount: {[k: string]: number}; baseFormes: {[k: string]: number}; @@ -577,6 +579,8 @@ namespace RandomTeamsTypes { moves: string[]; dynamaxLevel?: number; gigantamax?: boolean; + wantsTera?: boolean; + teraType?: string; } export interface RandomSetData { role: Role; From 5f22a3a64080c8cf467460feb8ac307bc6581ece Mon Sep 17 00:00:00 2001 From: "Alex \"Mathy" <4866817+MathyFurret@users.noreply.github.com> Date: Sat, 1 Jun 2024 15:13:50 -0500 Subject: [PATCH 013/139] `/bssfactory`: Update to gen 9 (#10246) * `/bssfactory`: Update to gen 9 * Update help text --- server/chat-plugins/randombattles/index.ts | 101 ++++++++++++++------- 1 file changed, 69 insertions(+), 32 deletions(-) diff --git a/server/chat-plugins/randombattles/index.ts b/server/chat-plugins/randombattles/index.ts index 6372ad77c38d..c0983ca5b0ee 100644 --- a/server/chat-plugins/randombattles/index.ts +++ b/server/chat-plugins/randombattles/index.ts @@ -143,6 +143,11 @@ function formatItem(item: Item | string) { } } +function formatType(type: TypeInfo | string) { + type = Dex.types.get(type); + return type.name; +} + /** * Gets the sets for a Pokemon for a format that uses the new schema. * Old formats will use getData() @@ -317,41 +322,73 @@ function battleFactorySets(species: string | Species, tier: string | null, gen = const format = Dex.formats.get(`${gen}bssfactory`); if (!(species.id in statsFile)) return {e: `${species.name} doesn't have any sets in ${format.name}.`}; const setObj = statsFile[species.id]; - buf += `Sets for ${species.name} in ${format.name}:
`; - for (const [i, set] of setObj.sets.entries()) { - buf += `
Set ${i + 1}`; - buf += `
    `; - buf += `
  • ${set.species}${set.gender ? ` (${set.gender})` : ``} @ ${Array.isArray(set.item) ? set.item.map(formatItem).join(" / ") : formatItem(set.item)}
  • `; - buf += `
  • Ability: ${Array.isArray(set.ability) ? set.ability.map(formatAbility).join(" / ") : formatAbility(set.ability)}
  • `; - if (!set.level) buf += `
  • Level: 50
  • `; - if (set.level && set.level < 50) buf += `
  • Level: ${set.level}
  • `; - if (set.shiny) buf += `
  • Shiny: Yes
  • `; - if (set.happiness) buf += `
  • Happiness: ${set.happiness}
  • `; - if (set.evs) { - buf += `
  • EVs: `; - const evs: string[] = []; - let ev: string; - for (ev in set.evs) { - if (set.evs[ev] === 0) continue; - evs.push(`${set.evs[ev]} ${STAT_NAMES[ev]}`); + if (genNum >= 9) { + buf += `Species rarity: ${setObj.weight} (higher is more common, max 10)
    `; + buf += `Sets for ${species.name} in ${format.name}:
    `; + for (const [i, set] of setObj.sets.entries()) { + buf += `
    Set ${i + 1} (${set.weight}%)`; + buf += `
      `; + buf += `
    • ${Dex.forFormat(format).species.get(set.species).name} @ ${set.item.map(formatItem).join(" / ")}
    • `; + buf += `
    • Ability: ${formatAbility(set.ability)}
    • `; + buf += `
    • Level: 50
    • `; + buf += `
    • Tera Type: ${set.teraType.map(formatType).join(' / ')}
    • `; + buf += `
    • EVs: `; + const evs = []; + for (const [j, stat] of Object.values(STAT_NAMES).entries()) { + if (set.evs[j] > 0) evs.push(`${set.evs[j]} ${stat}`); } buf += `${evs.join(" / ")}
    • `; - } - buf += `
    • ${Array.isArray(set.nature) ? set.nature.map(formatNature).join(" / ") : formatNature(set.nature)} Nature
    • `; - if (set.ivs) { - buf += `
    • IVs: `; - const ivs: string[] = []; - let iv: string; - for (iv in set.ivs) { - if (set.ivs[iv] === 31) continue; - ivs.push(`${set.ivs[iv]} ${STAT_NAMES[iv]}`); + buf += `
    • ${formatNature(set.nature)} Nature
    • `; + if (set.ivs) { + buf += `
    • IVs: `; + const ivs = []; + for (const [j, stat] of Object.values(STAT_NAMES).entries()) { + if (set.ivs[j] < 31) ivs.push(`${set.ivs[j]} ${stat}`); + } + buf += `${ivs.join(" / ")}
    • `; } - buf += `${ivs.join(" / ")}`; + for (const moveSlot of set.moves) { + buf += `
    • - ${moveSlot.map(formatMove).join(' / ')}
    • `; + } + buf += `
    `; } - for (const moveid of set.moves) { - buf += `
  • - ${Array.isArray(moveid) ? moveid.map(formatMove).join(" / ") : formatMove(moveid)}
  • `; + } else { + buf += `Sets for ${species.name} in ${format.name}:
    `; + for (const [i, set] of setObj.sets.entries()) { + buf += `
    Set ${i + 1}`; + buf += `
      `; + buf += `
    • ${set.species}${set.gender ? ` (${set.gender})` : ``} @ ${Array.isArray(set.item) ? set.item.map(formatItem).join(" / ") : formatItem(set.item)}
    • `; + buf += `
    • Ability: ${Array.isArray(set.ability) ? set.ability.map(formatAbility).join(" / ") : formatAbility(set.ability)}
    • `; + if (!set.level) buf += `
    • Level: 50
    • `; + if (set.level && set.level < 50) buf += `
    • Level: ${set.level}
    • `; + if (set.shiny) buf += `
    • Shiny: Yes
    • `; + if (set.happiness) buf += `
    • Happiness: ${set.happiness}
    • `; + if (set.evs) { + buf += `
    • EVs: `; + const evs: string[] = []; + let ev: string; + for (ev in set.evs) { + if (set.evs[ev] === 0) continue; + evs.push(`${set.evs[ev]} ${STAT_NAMES[ev]}`); + } + buf += `${evs.join(" / ")}
    • `; + } + buf += `
    • ${Array.isArray(set.nature) ? set.nature.map(formatNature).join(" / ") : formatNature(set.nature)} Nature
    • `; + if (set.ivs) { + buf += `
    • IVs: `; + const ivs: string[] = []; + let iv: string; + for (iv in set.ivs) { + if (set.ivs[iv] === 31) continue; + ivs.push(`${set.ivs[iv]} ${STAT_NAMES[iv]}`); + } + buf += `${ivs.join(" / ")}
    • `; + } + for (const moveid of set.moves) { + buf += `
    • - ${Array.isArray(moveid) ? moveid.map(formatMove).join(" / ") : formatMove(moveid)}
    • `; + } + buf += `
    `; } - buf += `
`; } } return buf; @@ -550,7 +587,7 @@ export const commands: Chat.ChatCommands = { if (!species.exists) { return this.errorReply(`Error: Pok\u00e9mon '${args[0].trim()}' not found.`); } - let mod = 'gen8'; + let mod = 'gen9'; if (args[1] && toID(args[1]) in Dex.dexes && Dex.dexes[toID(args[1])].gen >= 7) mod = toID(args[1]); const bssSets = battleFactorySets(species, null, mod, true); if (!bssSets) return this.parse(`/help battlefactory`); @@ -596,7 +633,7 @@ export const commands: Chat.ChatCommands = { battlefactoryhelp: [ `/battlefactory [pokemon], [tier], [gen] - Displays a Pok\u00e9mon's Battle Factory sets. Supports Gens 6-8. Defaults to Gen 8. If no tier is provided, defaults to OU.`, `- Supported tiers: OU, Ubers, UU, RU, NU, PU, Monotype (Gen 7 only), LC (Gen 7 only)`, - `/bssfactory [pokemon], [gen] - Displays a Pok\u00e9mon's BSS Factory sets. Supports Gen 7-8. Defaults to Gen 8.`, + `/bssfactory [pokemon], [gen] - Displays a Pok\u00e9mon's BSS Factory sets. Supports Gen 7-9. Defaults to Gen 9.`, ], cap1v1(target, room, user) { From 4c279fbcea2dfaf0e5eb32ad16327e6df57e9a5c Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Sat, 1 Jun 2024 17:40:37 -0600 Subject: [PATCH 014/139] BSS Factory: Fix Tera crash --- data/random-battles/gen9/teams.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/data/random-battles/gen9/teams.ts b/data/random-battles/gen9/teams.ts index de1d4c1fc8b2..183ab5e42f8c 100644 --- a/data/random-battles/gen9/teams.ts +++ b/data/random-battles/gen9/teams.ts @@ -2598,7 +2598,8 @@ export class RandomTeams { return { name: setData.set.species || species.baseSpecies, species: setData.set.species, - teraType: this.sampleIfArray(setData.set.teraType), + // Temporary fix + teraType: this.dex.types.get(this.sampleIfArray(setData.set.teraType)).name, gender: species.gender || (this.randomChance(1, 2) ? "M" : "F"), item: this.sampleIfArray(setData.set.item) || "", ability: setDataAbility || "No Ability", From 9f9749dcb1d13e7f462db1da2b0f1b623d0736d4 Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Sun, 2 Jun 2024 00:36:51 -0600 Subject: [PATCH 015/139] BSS Factory: Prettify JSON file --- .../random-battles/gen9/bss-factory-sets.json | 11286 ++++++++-------- data/random-battles/gen9/teams.ts | 31 +- server/chat-plugins/randombattles/index.ts | 22 +- test/random-battles/all-gens.js | 68 + 4 files changed, 5969 insertions(+), 5438 deletions(-) diff --git a/data/random-battles/gen9/bss-factory-sets.json b/data/random-battles/gen9/bss-factory-sets.json index 4a40a0be0ced..c41eab5a64e0 100644 --- a/data/random-battles/gen9/bss-factory-sets.json +++ b/data/random-battles/gen9/bss-factory-sets.json @@ -1,5634 +1,6108 @@ { "chienpao": { - "weight": 10, - "sets": [ - { - "species": "chienpao", - "weight": 35, - "moves": [ - ["iciclecrash"], - ["suckerpunch"], - ["sacredsword"], - ["sheercold", "crunch"] - ], - "item": ["focussash"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["ghost"], - "ability": "swordofruin" - }, - { - "species": "chienpao", - "weight": 15, - "moves": [["iciclecrash"], ["suckerpunch"], ["sacredsword"], ["terablast"]], - "item": ["focussash"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["electric"], - "wantsTera": true, - "ability": "swordofruin" - }, - { - "species": "chienpao", - "weight": 5, - "moves": [ - ["terablast"], - ["sheercold", "sacredsword"], - ["iciclecrash"], - ["suckerpunch"] - ], - "item": ["assaultvest"], - "nature": "adamant", - "evs": [140, 236, 4, 0, 12, 116], - "teraType": ["fairy", "electric", "grass"], - "wantsTera": true, - "ability": "swordofruin" - }, - { - "species": "chienpao", - "weight": 5, - "moves": [ - ["iciclecrash", "icespinner"], - ["terablast"], - ["crunch"], - ["sacredsword"] - ], - "item": ["choicescarf"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["electric", "grass", "fairy"], - "wantsTera": true, - "ability": "swordofruin" - }, - { - "species": "chienpao", - "weight": 10, - "moves": [ - ["iciclecrash", "icespinner"], - ["crunch", "throatchop"], - ["suckerpunch", "iceshard"], - ["sacredsword"] - ], - "item": ["choiceband"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["dark"], - "ability": "swordofruin" - }, - { - "species": "chienpao", - "weight": 10, - "moves": [ - ["iciclecrash", "icespinner"], - ["terablast"], - ["suckerpunch", "iceshard"], - ["sacredsword"] - ], - "item": ["choiceband"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["electric", "fairy", "grass"], - "wantsTera": true, - "ability": "swordofruin" - }, - { - "species": "chienpao", - "weight": 5, - "moves": [ - ["iciclecrash"], - ["recover"], - ["suckerpunch", "iceshard"], - ["sacredsword"] - ], - "item": ["rockyhelmet"], - "nature": "jolly", - "evs": [252, 68, 180, 0, 4, 4], - "teraType": ["fairy", "poison"], - "wantsTera": true, - "ability": "swordofruin" - }, - { - "species": "chienpao", - "weight": 15, - "moves": [ - ["swordsdance"], - ["iciclecrash"], - ["terablast"], - ["iceshard", "suckerpunch"] - ], - "item": ["lumberry"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["electric"], - "wantsTera": true, - "ability": "swordofruin" - } - ] + "weight": 10, + "sets": [ + { + "species": "Chien-Pao", + "weight": 35, + "moves": [ + ["Icicle Crash"], + ["Sucker Punch"], + ["Sacred Sword"], + ["Crunch", "Sheer Cold"] + ], + "item": ["Focus Sash"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Ghost"], + "ability": ["Sword of Ruin"] + }, + { + "species": "Chien-Pao", + "weight": 15, + "moves": [ + ["Icicle Crash"], + ["Sucker Punch"], + ["Sacred Sword"], + ["Tera Blast"] + ], + "item": ["Focus Sash"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Electric"], + "wantsTera": true, + "ability": ["Sword of Ruin"] + }, + { + "species": "Chien-Pao", + "weight": 5, + "moves": [ + ["Tera Blast"], + ["Sacred Sword", "Sheer Cold"], + ["Icicle Crash"], + ["Sucker Punch"] + ], + "item": ["Assault Vest"], + "nature": "Adamant", + "evs": {"hp": 140, "atk": 236, "def": 4, "spd": 12, "spe": 116}, + "teraType": ["Electric", "Fairy", "Grass"], + "wantsTera": true, + "ability": ["Sword of Ruin"] + }, + { + "species": "Chien-Pao", + "weight": 5, + "moves": [ + ["Ice Spinner", "Icicle Crash"], + ["Tera Blast"], + ["Crunch"], + ["Sacred Sword"] + ], + "item": ["Choice Scarf"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Electric", "Fairy", "Grass"], + "wantsTera": true, + "ability": ["Sword of Ruin"] + }, + { + "species": "Chien-Pao", + "weight": 10, + "moves": [ + ["Ice Spinner", "Icicle Crash"], + ["Crunch", "Throat Chop"], + ["Ice Shard", "Sucker Punch"], + ["Sacred Sword"] + ], + "item": ["Choice Band"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Dark"], + "ability": ["Sword of Ruin"] + }, + { + "species": "Chien-Pao", + "weight": 10, + "moves": [ + ["Ice Spinner", "Icicle Crash"], + ["Tera Blast"], + ["Ice Shard", "Sucker Punch"], + ["Sacred Sword"] + ], + "item": ["Choice Band"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Electric", "Fairy", "Grass"], + "wantsTera": true, + "ability": ["Sword of Ruin"] + }, + { + "species": "Chien-Pao", + "weight": 5, + "moves": [ + ["Icicle Crash"], + ["Recover"], + ["Ice Shard", "Sucker Punch"], + ["Sacred Sword"] + ], + "item": ["Rocky Helmet"], + "nature": "Jolly", + "evs": {"hp": 252, "atk": 68, "def": 180, "spd": 4, "spe": 4}, + "teraType": ["Fairy", "Poison"], + "wantsTera": true, + "ability": ["Sword of Ruin"] + }, + { + "species": "Chien-Pao", + "weight": 15, + "moves": [ + ["Swords Dance"], + ["Icicle Crash"], + ["Tera Blast"], + ["Ice Shard", "Sucker Punch"] + ], + "item": ["Lum Berry"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Electric"], + "wantsTera": true, + "ability": ["Sword of Ruin"] + } + ] }, "dragonite": { - "weight": 10, - "sets": [ - { - "species": "dragonite", - "weight": 40, - "moves": [ - ["extremespeed"], - ["earthquake"], - ["encore", "dragondance"], - ["roost"] - ], - "item": ["rockyhelmet", "leftovers", "heavydutyboots"], - "nature": "adamant", - "evs": [196, 204, 4, 0, 4, 100], - "teraType": ["normal"], - "wantsTera": true, - "ability": "multiscale" - }, - { - "species": "dragonite", - "weight": 10, - "moves": [["terablast"], ["earthquake"], ["dragondance"], ["roost"]], - "item": ["rockyhelmet", "leftovers", "lumberry", "heavydutyboots"], - "nature": "adamant", - "evs": [196, 204, 4, 0, 4, 100], - "teraType": ["flying", "fire", "fairy"], - "wantsTera": true, - "ability": "multiscale" - }, - { - "species": "dragonite", - "weight": 5, - "moves": [["outrage"], ["extremespeed"], ["earthquake"], ["ironhead"]], - "item": ["choiceband"], - "nature": "adamant", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["normal", "steel"], - "wantsTera": true, - "ability": "multiscale" - }, - { - "species": "dragonite", - "weight": 15, - "moves": [["outrage"], ["extremespeed"], ["earthquake"], ["terablast"]], - "item": ["choiceband"], - "nature": "adamant", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["flying"], - "wantsTera": true, - "ability": "multiscale" - }, - { - "species": "dragonite", - "weight": 5, - "moves": [ - ["airslash"], - ["substitute", "encore"], - ["thunderwave"], - ["roost"] - ], - "item": ["rockyhelmet"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "bold", - "evs": [244, 0, 148, 0, 0, 116], - "teraType": ["water", "poison", "fairy"], - "wantsTera": true, - "ability": "multiscale" - }, - { - "species": "dragonite", - "weight": 20, - "moves": [ - ["scaleshot"], - ["ironhead"], - ["earthquake", "lowkick"], - ["dragondance"] - ], - "item": ["loadeddice"], - "nature": "jolly", - "evs": [4, 252, 0, 0, 0, 252], - "teraType": ["steel"], - "wantsTera": true, - "ability": "multiscale" - }, - { - "species": "dragonite", - "weight": 5, - "moves": [ - ["firespin"], - ["earthquake", "thunderwave"], - ["roost"], - ["encore"] - ], - "item": ["leftovers"], - "nature": "careful", - "evs": [244, 12, 0, 0, 252, 0], - "teraType": ["poison", "steel", "fairy"], - "wantsTera": true, - "ability": "multiscale" - } - ] + "weight": 10, + "sets": [ + { + "species": "Dragonite", + "weight": 40, + "moves": [ + ["Extreme Speed"], + ["Earthquake"], + ["Dragon Dance", "Encore"], + ["Roost"] + ], + "item": ["Heavy-Duty Boots", "Leftovers", "Rocky Helmet"], + "nature": "Adamant", + "evs": {"hp": 196, "atk": 204, "def": 4, "spd": 4, "spe": 100}, + "teraType": ["Normal"], + "wantsTera": true, + "ability": ["Multiscale"] + }, + { + "species": "Dragonite", + "weight": 10, + "moves": [ + ["Tera Blast"], + ["Earthquake"], + ["Dragon Dance"], + ["Roost"] + ], + "item": ["Heavy-Duty Boots", "Leftovers", "Lum Berry", "Rocky Helmet"], + "nature": "Adamant", + "evs": {"hp": 196, "atk": 204, "def": 4, "spd": 4, "spe": 100}, + "teraType": ["Fairy", "Fire", "Flying"], + "wantsTera": true, + "ability": ["Multiscale"] + }, + { + "species": "Dragonite", + "weight": 5, + "moves": [ + ["Outrage"], + ["Extreme Speed"], + ["Earthquake"], + ["Iron Head"] + ], + "item": ["Choice Band"], + "nature": "Adamant", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Normal", "Steel"], + "wantsTera": true, + "ability": ["Multiscale"] + }, + { + "species": "Dragonite", + "weight": 15, + "moves": [ + ["Outrage"], + ["Extreme Speed"], + ["Earthquake"], + ["Tera Blast"] + ], + "item": ["Choice Band"], + "nature": "Adamant", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Flying"], + "wantsTera": true, + "ability": ["Multiscale"] + }, + { + "species": "Dragonite", + "weight": 5, + "moves": [ + ["Air Slash"], + ["Encore", "Substitute"], + ["Thunder Wave"], + ["Roost"] + ], + "item": ["Rocky Helmet"], + "nature": "Bold", + "evs": {"hp": 244, "def": 148, "spe": 116}, + "ivs": {"atk": 0}, + "teraType": ["Fairy", "Poison", "Water"], + "wantsTera": true, + "ability": ["Multiscale"] + }, + { + "species": "Dragonite", + "weight": 20, + "moves": [ + ["Scale Shot"], + ["Iron Head"], + ["Earthquake", "Low Kick"], + ["Dragon Dance"] + ], + "item": ["Loaded Dice"], + "nature": "Jolly", + "evs": {"hp": 4, "atk": 252, "spe": 252}, + "teraType": ["Steel"], + "wantsTera": true, + "ability": ["Multiscale"] + }, + { + "species": "Dragonite", + "weight": 5, + "moves": [ + ["Fire Spin"], + ["Earthquake", "Thunder Wave"], + ["Roost"], + ["Encore"] + ], + "item": ["Leftovers"], + "nature": "Careful", + "evs": {"hp": 244, "atk": 12, "spd": 252}, + "teraType": ["Fairy", "Poison", "Steel"], + "wantsTera": true, + "ability": ["Multiscale"] + } + ] }, "fluttermane": { - "weight": 10, - "sets": [ - { - "species": "fluttermane", - "weight": 20, - "moves": [ - ["moonblast"], - ["shadowball", "calmmind"], - ["charm"], - ["painsplit"] - ], - "item": ["boosterenergy"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "timid", - "evs": [252, 0, 252, 4, 0, 0], - "teraType": ["fairy", "water"], - "ability": "protosynthesis" - }, - { - "species": "fluttermane", - "weight": 5, - "moves": [["drainingkiss"], ["shadowball"], ["charm"], ["calmmind"]], - "item": ["boosterenergy"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "timid", - "evs": [252, 0, 252, 4, 0, 0], - "teraType": ["fairy", "water"], - "ability": "protosynthesis" - }, - { - "species": "fluttermane", - "weight": 15, - "moves": [ - ["moonblast"], - ["shadowball"], - ["substitute", "painsplit", "mysticalfire"], - ["calmmind"] - ], - "item": ["boosterenergy"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "timid", - "evs": [4, 0, 132, 116, 4, 252], - "teraType": ["fairy", "water"], - "ability": "protosynthesis" - }, - { - "species": "fluttermane", - "weight": 5, - "moves": [ - ["moonblast"], - ["shadowball", "substitute"], - ["terablast"], - ["calmmind"] - ], - "item": ["boosterenergy"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "timid", - "evs": [4, 0, 132, 116, 4, 252], - "teraType": ["water", "ground"], - "wantsTera": true, - "ability": "protosynthesis" - }, - { - "species": "fluttermane", - "weight": 10, - "moves": [ - ["moonblast"], - ["hex"], - ["painsplit", "taunt"], - ["thunderwave"] - ], - "item": ["boosterenergy"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "bold", - "evs": [228, 0, 252, 0, 0, 28], - "teraType": ["water"], - "ability": "protosynthesis" - }, - { - "species": "fluttermane", - "weight": 5, - "moves": [ - ["moonblast"], - ["shadowball"], - ["thunderbolt", "powergem", "hypervoice"], - ["perishsong"] - ], - "item": ["choicescarf"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "modest", - "evs": [20, 0, 44, 204, 4, 236], - "teraType": ["fairy"], - "ability": "protosynthesis" - }, - { - "species": "fluttermane", - "weight": 25, - "moves": [ - ["moonblast"], - ["shadowball"], - ["thunderbolt", "psyshock", "powergem", "mysticalfire", "hypervoice"], - ["perishsong"] - ], - "item": ["choicespecs"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "timid", - "evs": [0, 0, 0, 252, 4, 252], - "teraType": ["fairy"], - "ability": "protosynthesis" - }, - { - "species": "fluttermane", - "weight": 10, - "moves": [ - ["moonblast"], - ["shadowball", "hex"], - ["thunderwave"], - ["taunt"] - ], - "item": ["focussash"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "timid", - "evs": [0, 0, 0, 252, 4, 252], - "teraType": ["normal"], - "ability": "protosynthesis" - }, - { - "species": "fluttermane", - "weight": 5, - "moves": [ - ["moonblast"], - ["shadowball"], - ["psyshock"], - ["mysticalfire", "energyball"] - ], - "item": ["assaultvest"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "modest", - "evs": [164, 0, 28, 196, 4, 116], - "teraType": ["fire", "grass"], - "ability": "protosynthesis" - } - ] + "weight": 10, + "sets": [ + { + "species": "Flutter Mane", + "weight": 20, + "moves": [ + ["Moonblast"], + ["Calm Mind", "Shadow Ball"], + ["Charm"], + ["Pain Split"] + ], + "item": ["Booster Energy"], + "nature": "Timid", + "evs": {"hp": 252, "def": 252, "spa": 4}, + "ivs": {"atk": 0}, + "teraType": ["Fairy", "Water"], + "ability": ["Protosynthesis"] + }, + { + "species": "Flutter Mane", + "weight": 5, + "moves": [ + ["Draining Kiss"], + ["Shadow Ball"], + ["Charm"], + ["Calm Mind"] + ], + "item": ["Booster Energy"], + "nature": "Timid", + "evs": {"hp": 252, "def": 252, "spa": 4}, + "ivs": {"atk": 0}, + "teraType": ["Fairy", "Water"], + "ability": ["Protosynthesis"] + }, + { + "species": "Flutter Mane", + "weight": 15, + "moves": [ + ["Moonblast"], + ["Shadow Ball"], + ["Mystical Fire", "Pain Split", "Substitute"], + ["Calm Mind"] + ], + "item": ["Booster Energy"], + "nature": "Timid", + "evs": {"hp": 4, "def": 132, "spa": 116, "spd": 4, "spe": 252}, + "ivs": {"atk": 0}, + "teraType": ["Fairy", "Water"], + "ability": ["Protosynthesis"] + }, + { + "species": "Flutter Mane", + "weight": 5, + "moves": [ + ["Moonblast"], + ["Shadow Ball", "Substitute"], + ["Tera Blast"], + ["Calm Mind"] + ], + "item": ["Booster Energy"], + "nature": "Timid", + "evs": {"hp": 4, "def": 132, "spa": 116, "spd": 4, "spe": 252}, + "ivs": {"atk": 0}, + "teraType": ["Ground", "Water"], + "wantsTera": true, + "ability": ["Protosynthesis"] + }, + { + "species": "Flutter Mane", + "weight": 10, + "moves": [ + ["Moonblast"], + ["Hex"], + ["Pain Split", "Taunt"], + ["Thunder Wave"] + ], + "item": ["Booster Energy"], + "nature": "Bold", + "evs": {"hp": 228, "def": 252, "spe": 28}, + "ivs": {"atk": 0}, + "teraType": ["Water"], + "ability": ["Protosynthesis"] + }, + { + "species": "Flutter Mane", + "weight": 5, + "moves": [ + ["Moonblast"], + ["Shadow Ball"], + ["Hyper Voice", "Power Gem", "Thunderbolt"], + ["Perish Song"] + ], + "item": ["Choice Scarf"], + "nature": "Modest", + "evs": {"hp": 20, "def": 44, "spa": 204, "spd": 4, "spe": 236}, + "ivs": {"atk": 0}, + "teraType": ["Fairy"], + "ability": ["Protosynthesis"] + }, + { + "species": "Flutter Mane", + "weight": 25, + "moves": [ + ["Moonblast"], + ["Shadow Ball"], + ["Hyper Voice", "Mystical Fire", "Power Gem", "Psyshock", "Thunderbolt"], + ["Perish Song"] + ], + "item": ["Choice Specs"], + "nature": "Timid", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "ivs": {"atk": 0}, + "teraType": ["Fairy"], + "ability": ["Protosynthesis"] + }, + { + "species": "Flutter Mane", + "weight": 10, + "moves": [ + ["Moonblast"], + ["Hex", "Shadow Ball"], + ["Thunder Wave"], + ["Taunt"] + ], + "item": ["Focus Sash"], + "nature": "Timid", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "ivs": {"atk": 0}, + "teraType": ["Normal"], + "ability": ["Protosynthesis"] + }, + { + "species": "Flutter Mane", + "weight": 5, + "moves": [ + ["Moonblast"], + ["Shadow Ball"], + ["Psyshock"], + ["Energy Ball", "Mystical Fire"] + ], + "item": ["Assault Vest"], + "nature": "Modest", + "evs": {"hp": 164, "def": 28, "spa": 196, "spd": 4, "spe": 116}, + "ivs": {"atk": 0}, + "teraType": ["Fire", "Grass"], + "ability": ["Protosynthesis"] + } + ] }, "urshifurapidstrike": { - "weight": 10, - "sets": [ - { - "species": "urshifurapidstrike", - "weight": 40, - "moves": [ - ["surgingstrikes"], - ["closecombat", "drainpunch"], - ["aquajet", "substitute"], - ["swordsdance"] - ], - "item": ["punchingglove"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["water", "poison", "grass"], - "wantsTera": true, - "ability": "unseenfist" - }, - { - "species": "urshifurapidstrike", - "weight": 25, - "moves": [["surgingstrikes"], ["closecombat"], ["uturn"], ["icepunch"]], - "item": ["choicescarf"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["water"], - "ability": "unseenfist" - }, - { - "species": "urshifurapidstrike", - "weight": 15, - "moves": [["surgingstrikes"], ["closecombat"], ["uturn"], ["aquajet"]], - "item": ["choiceband"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["water", "poison", "grass"], - "ability": "unseenfist" - }, - { - "species": "urshifurapidstrike", - "weight": 20, - "moves": [ - ["surgingstrikes"], - ["closecombat"], - ["aquajet"], - ["counter", "icepunch"] - ], - "item": ["focussash"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["water", "ghost"], - "ability": "unseenfist" - } - ] + "weight": 10, + "sets": [ + { + "species": "Urshifu-Rapid-Strike", + "weight": 40, + "moves": [ + ["Surging Strikes"], + ["Close Combat", "Drain Punch"], + ["Aqua Jet", "Substitute"], + ["Swords Dance"] + ], + "item": ["Punching Glove"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Grass", "Poison", "Water"], + "wantsTera": true, + "ability": ["Unseen Fist"] + }, + { + "species": "Urshifu-Rapid-Strike", + "weight": 25, + "moves": [ + ["Surging Strikes"], + ["Close Combat"], + ["U-turn"], + ["Ice Punch"] + ], + "item": ["Choice Scarf"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Water"], + "ability": ["Unseen Fist"] + }, + { + "species": "Urshifu-Rapid-Strike", + "weight": 15, + "moves": [ + ["Surging Strikes"], + ["Close Combat"], + ["U-turn"], + ["Aqua Jet"] + ], + "item": ["Choice Band"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Grass", "Poison", "Water"], + "ability": ["Unseen Fist"] + }, + { + "species": "Urshifu-Rapid-Strike", + "weight": 20, + "moves": [ + ["Surging Strikes"], + ["Close Combat"], + ["Aqua Jet"], + ["Counter", "Ice Punch"] + ], + "item": ["Focus Sash"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Ghost", "Water"], + "ability": ["Unseen Fist"] + } + ] }, "ogerponhearthflame": { - "weight": 10, - "sets": [ - { - "species": "ogerponhearthflame", - "weight": 40, - "moves": [ - ["ivycudgel"], - ["playrough", "knockoff"], - ["swordsdance", "encore"], - ["hornleech", "trailblaze"] - ], - "gender": "f", - "item": ["hearthflamemask"], - "nature": "jolly", - "evs": [4, 252, 0, 0, 0, 252], - "teraType": ["fire"], - "ability": "moldbreaker" - }, - { - "species": "ogerponhearthflame", - "weight": 40, - "moves": [ - ["ivycudgel"], - ["hornleech"], - ["swordsdance"], - ["substitute", "playrough", "trailblaze"] - ], - "gender": "f", - "item": ["hearthflamemask"], - "nature": "jolly", - "evs": [156, 36, 4, 0, 60, 252], - "teraType": ["fire"], - "ability": "moldbreaker" - }, - { - "species": "ogerponhearthflame", - "weight": 20, - "moves": [ - ["ivycudgel"], - ["substitute"], - ["leechseed"], - ["hornleech", "playrough", "encore"] - ], - "item": ["hearthflamemask"], - "nature": "jolly", - "evs": [156, 36, 4, 0, 60, 252], - "teraType": ["fire"], - "ability": "moldbreaker" - } - ] + "weight": 10, + "sets": [ + { + "species": "Ogerpon-Hearthflame", + "weight": 40, + "moves": [ + ["Ivy Cudgel"], + ["Knock Off", "Play Rough"], + ["Encore", "Swords Dance"], + ["Horn Leech", "Trailblaze"] + ], + "gender": "F", + "item": ["Hearthflame Mask"], + "nature": "Jolly", + "evs": {"hp": 4, "atk": 252, "spe": 252}, + "teraType": ["Fire"], + "ability": ["Mold Breaker"] + }, + { + "species": "Ogerpon-Hearthflame", + "weight": 40, + "moves": [ + ["Ivy Cudgel"], + ["Horn Leech"], + ["Swords Dance"], + ["Play Rough", "Substitute", "Trailblaze"] + ], + "gender": "F", + "item": ["Hearthflame Mask"], + "nature": "Jolly", + "evs": {"hp": 156, "atk": 36, "def": 4, "spd": 60, "spe": 252}, + "teraType": ["Fire"], + "ability": ["Mold Breaker"] + }, + { + "species": "Ogerpon-Hearthflame", + "weight": 20, + "moves": [ + ["Ivy Cudgel"], + ["Substitute"], + ["Leech Seed"], + ["Encore", "Horn Leech", "Play Rough"] + ], + "item": ["Hearthflame Mask"], + "nature": "Jolly", + "evs": {"hp": 156, "atk": 36, "def": 4, "spd": 60, "spe": 252}, + "teraType": ["Fire"], + "ability": ["Mold Breaker"] + } + ] }, "ursalunabloodmoon": { - "weight": 10, - "sets": [ - { - "species": "ursalunabloodmoon", - "weight": 15, - "moves": [["bloodmoon"], ["earthpower"], ["vacuumwave"], ["bodypress"]], - "item": ["rockyhelmet"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "bold", - "evs": [116, 0, 236, 4, 116, 36], - "teraType": ["poison", "fairy"], - "ability": "mindseye" - }, - { - "species": "ursalunabloodmoon", - "weight": 25, - "moves": [ - ["hypervoice", "bloodmoon"], - ["moonlight"], - ["calmmind"], - ["yawn"] - ], - "item": ["covertcloak", "leftovers"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "modest", - "evs": [100, 0, 4, 236, 12, 156], - "teraType": ["poison", "fairy"], - "ability": "mindseye" - }, - { - "species": "ursalunabloodmoon", - "weight": 60, - "moves": [["bloodmoon"], ["vacuumwave"], ["earthpower"], ["hypervoice"]], - "item": ["assaultvest"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "modest", - "evs": [4, 0, 0, 252, 252, 0], - "teraType": ["fairy", "normal"], - "ability": "mindseye" - } - ] + "weight": 10, + "sets": [ + { + "species": "Ursaluna-Bloodmoon", + "weight": 15, + "moves": [ + ["Blood Moon"], + ["Earth Power"], + ["Vacuum Wave"], + ["Body Press"] + ], + "item": ["Rocky Helmet"], + "nature": "Bold", + "evs": {"hp": 116, "def": 236, "spa": 4, "spd": 116, "spe": 36}, + "ivs": {"atk": 0}, + "teraType": ["Fairy", "Poison"], + "ability": ["Mind's Eye"] + }, + { + "species": "Ursaluna-Bloodmoon", + "weight": 25, + "moves": [ + ["Blood Moon", "Hyper Voice"], + ["Moonlight"], + ["Calm Mind"], + ["Yawn"] + ], + "item": ["Covert Cloak", "Leftovers"], + "nature": "Modest", + "evs": {"hp": 100, "def": 4, "spa": 236, "spd": 12, "spe": 156}, + "ivs": {"atk": 0}, + "teraType": ["Fairy", "Poison"], + "ability": ["Mind's Eye"] + }, + { + "species": "Ursaluna-Bloodmoon", + "weight": 60, + "moves": [ + ["Blood Moon"], + ["Vacuum Wave"], + ["Earth Power"], + ["Hyper Voice"] + ], + "item": ["Assault Vest"], + "nature": "Modest", + "evs": {"hp": 4, "spa": 252, "spd": 252}, + "ivs": {"atk": 0}, + "teraType": ["Fairy", "Normal"], + "ability": ["Mind's Eye"] + } + ] }, "ironbundle": { - "weight": 9, - "sets": [ - { - "species": "ironbundle", - "weight": 10, - "moves": [["flipturn"], ["freezedry"], ["hydropump"], ["encore"]], - "item": ["focussash"], - "nature": "timid", - "evs": [0, 0, 0, 252, 4, 252], - "teraType": ["ghost"], - "ability": "quarkdrive" - }, - { - "species": "ironbundle", - "weight": 70, - "moves": [["substitute"], ["encore"], ["hydropump"], ["freezedry"]], - "item": ["boosterenergy"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "timid", - "evs": [0, 0, 0, 252, 4, 252], - "teraType": ["ghost", "water", "steel"], - "ability": "quarkdrive" - }, - { - "species": "ironbundle", - "weight": 10, - "moves": [["icebeam"], ["hydropump"], ["freezedry"], ["terablast"]], - "item": ["choicespecs"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "timid", - "evs": [0, 0, 0, 252, 4, 252], - "teraType": ["fairy"], - "ability": "quarkdrive" - }, - { - "species": "ironbundle", - "weight": 10, - "moves": [["icebeam"], ["hydropump"], ["freezedry"], ["flipturn"]], - "item": ["choicespecs"], - "nature": "timid", - "evs": [0, 0, 0, 252, 4, 252], - "teraType": ["water"], - "ability": "quarkdrive" - } - ] + "weight": 9, + "sets": [ + { + "species": "Iron Bundle", + "weight": 10, + "moves": [ + ["Flip Turn"], + ["Freeze-Dry"], + ["Hydro Pump"], + ["Encore"] + ], + "item": ["Focus Sash"], + "nature": "Timid", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "teraType": ["Ghost"], + "ability": ["Quark Drive"] + }, + { + "species": "Iron Bundle", + "weight": 70, + "moves": [ + ["Substitute"], + ["Encore"], + ["Hydro Pump"], + ["Freeze-Dry"] + ], + "item": ["Booster Energy"], + "nature": "Timid", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "ivs": {"atk": 0}, + "teraType": ["Ghost", "Steel", "Water"], + "ability": ["Quark Drive"] + }, + { + "species": "Iron Bundle", + "weight": 10, + "moves": [ + ["Ice Beam"], + ["Hydro Pump"], + ["Freeze-Dry"], + ["Tera Blast"] + ], + "item": ["Choice Specs"], + "nature": "Timid", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "ivs": {"atk": 0}, + "teraType": ["Fairy"], + "ability": ["Quark Drive"] + }, + { + "species": "Iron Bundle", + "weight": 10, + "moves": [ + ["Ice Beam"], + ["Hydro Pump"], + ["Freeze-Dry"], + ["Flip Turn"] + ], + "item": ["Choice Specs"], + "nature": "Timid", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "teraType": ["Water"], + "ability": ["Quark Drive"] + } + ] }, "urshifu": { - "weight": 9, - "sets": [ - { - "species": "urshifu", - "weight": 55, - "moves": [ - ["swordsdance"], - ["wickedblow"], - ["closecombat", "drainpunch"], - ["suckerpunch"] - ], - "item": ["focussash"], - "nature": "jolly", - "evs": [0, 252, 4, 0, 0, 252], - "teraType": ["dark", "ghost"], - "ability": "unseenfist" - }, - { - "species": "urshifu", - "weight": 25, - "moves": [ - ["swordsdance"], - ["wickedblow"], - ["closecombat", "drainpunch"], - ["suckerpunch"] - ], - "item": ["blackglasses"], - "nature": "jolly", - "evs": [0, 252, 4, 0, 0, 252], - "teraType": ["dark", "poison", "ghost"], - "ability": "unseenfist" - }, - { - "species": "urshifu", - "weight": 5, - "moves": [ - ["counter"], - ["wickedblow"], - ["closecombat", "drainpunch"], - ["suckerpunch"] - ], - "item": ["focussash"], - "nature": "jolly", - "evs": [0, 252, 4, 0, 0, 252], - "teraType": ["dark", "ghost"], - "ability": "unseenfist" - }, - { - "species": "urshifu", - "weight": 5, - "moves": [ - ["wickedblow"], - ["closecombat", "drainpunch"], - ["suckerpunch"], - ["uturn"] - ], - "item": ["choiceband"], - "nature": "jolly", - "evs": [0, 252, 4, 0, 0, 252], - "teraType": ["dark", "poison", "ghost"], - "ability": "unseenfist" - }, - { - "species": "urshifu", - "weight": 5, - "moves": [ - ["wickedblow"], - ["closecombat", "drainpunch"], - ["suckerpunch"], - ["ironhead"] - ], - "item": ["choiceband"], - "nature": "jolly", - "evs": [0, 252, 4, 0, 0, 252], - "teraType": ["steel"], - "wantsTera": true, - "ability": "unseenfist" - }, - { - "species": "urshifu", - "weight": 5, - "moves": [["wickedblow"], ["closecombat"], ["suckerpunch"], ["uturn"]], - "item": ["choicescarf"], - "nature": "jolly", - "evs": [0, 252, 4, 0, 0, 252], - "teraType": ["dark"], - "ability": "unseenfist" - } - ] + "weight": 9, + "sets": [ + { + "species": "Urshifu", + "weight": 55, + "moves": [ + ["Swords Dance"], + ["Wicked Blow"], + ["Close Combat", "Drain Punch"], + ["Sucker Punch"] + ], + "item": ["Focus Sash"], + "nature": "Jolly", + "evs": {"atk": 252, "def": 4, "spe": 252}, + "teraType": ["Dark", "Ghost"], + "ability": ["Unseen Fist"] + }, + { + "species": "Urshifu", + "weight": 25, + "moves": [ + ["Swords Dance"], + ["Wicked Blow"], + ["Close Combat", "Drain Punch"], + ["Sucker Punch"] + ], + "item": ["Black Glasses"], + "nature": "Jolly", + "evs": {"atk": 252, "def": 4, "spe": 252}, + "teraType": ["Dark", "Ghost", "Poison"], + "ability": ["Unseen Fist"] + }, + { + "species": "Urshifu", + "weight": 5, + "moves": [ + ["Counter"], + ["Wicked Blow"], + ["Close Combat", "Drain Punch"], + ["Sucker Punch"] + ], + "item": ["Focus Sash"], + "nature": "Jolly", + "evs": {"atk": 252, "def": 4, "spe": 252}, + "teraType": ["Dark", "Ghost"], + "ability": ["Unseen Fist"] + }, + { + "species": "Urshifu", + "weight": 5, + "moves": [ + ["Wicked Blow"], + ["Close Combat", "Drain Punch"], + ["Sucker Punch"], + ["U-turn"] + ], + "item": ["Choice Band"], + "nature": "Jolly", + "evs": {"atk": 252, "def": 4, "spe": 252}, + "teraType": ["Dark", "Ghost", "Poison"], + "ability": ["Unseen Fist"] + }, + { + "species": "Urshifu", + "weight": 5, + "moves": [ + ["Wicked Blow"], + ["Close Combat", "Drain Punch"], + ["Sucker Punch"], + ["Iron Head"] + ], + "item": ["Choice Band"], + "nature": "Jolly", + "evs": {"atk": 252, "def": 4, "spe": 252}, + "teraType": ["Steel"], + "wantsTera": true, + "ability": ["Unseen Fist"] + }, + { + "species": "Urshifu", + "weight": 5, + "moves": [ + ["Wicked Blow"], + ["Close Combat"], + ["Sucker Punch"], + ["U-turn"] + ], + "item": ["Choice Scarf"], + "nature": "Jolly", + "evs": {"atk": 252, "def": 4, "spe": 252}, + "teraType": ["Dark"], + "ability": ["Unseen Fist"] + } + ] }, "tinglu": { - "weight": 9, - "sets": [ - { - "species": "tinglu", - "weight": 65, - "moves": [ - ["stealthrock"], - ["ruination"], - ["earthquake", "heavyslam"], - ["whirlwind"] - ], - "item": ["sitrusberry"], - "nature": "impish", - "evs": [244, 20, 116, 0, 124, 4], - "teraType": ["water", "fairy", "poison"], - "ability": "vesselofruin" - }, - { - "species": "tinglu", - "weight": 15, - "moves": [ - ["stealthrock"], - ["spikes"], - ["earthquake", "heavyslam"], - ["whirlwind"] - ], - "item": ["sitrusberry"], - "nature": "impish", - "evs": [244, 20, 116, 0, 124, 4], - "teraType": ["water", "fairy", "poison"], - "ability": "vesselofruin" - }, - { - "species": "tinglu", - "weight": 5, - "moves": [ - ["earthquake"], - ["heavyslam"], - ["fissure", "stoneedge"], - ["ruination"] - ], - "item": ["assaultvest"], - "nature": "adamant", - "evs": [4, 252, 4, 0, 108, 140], - "teraType": ["steel"], - "ability": "vesselofruin" - }, - { - "species": "tinglu", - "weight": 5, - "moves": [["earthquake"], ["heavyslam"], ["terablast"], ["ruination"]], - "item": ["assaultvest"], - "nature": "adamant", - "evs": [4, 252, 4, 0, 108, 140], - "teraType": ["electric", "fairy"], - "wantsTera": true, - "ability": "vesselofruin" - }, - { - "species": "tinglu", - "weight": 10, - "moves": [["earthquake"], ["heavyslam"], ["rocktomb"], ["ruination"]], - "item": ["sitrusberry"], - "nature": "impish", - "evs": [244, 76, 116, 0, 68, 4], - "teraType": ["steel"], - "ability": "vesselofruin" - } - ] + "weight": 9, + "sets": [ + { + "species": "Ting-Lu", + "weight": 65, + "moves": [ + ["Stealth Rock"], + ["Ruination"], + ["Earthquake", "Heavy Slam"], + ["Whirlwind"] + ], + "item": ["Sitrus Berry"], + "nature": "Impish", + "evs": {"hp": 244, "atk": 20, "def": 116, "spd": 124, "spe": 4}, + "teraType": ["Fairy", "Poison", "Water"], + "ability": ["Vessel of Ruin"] + }, + { + "species": "Ting-Lu", + "weight": 15, + "moves": [ + ["Stealth Rock"], + ["Spikes"], + ["Earthquake", "Heavy Slam"], + ["Whirlwind"] + ], + "item": ["Sitrus Berry"], + "nature": "Impish", + "evs": {"hp": 244, "atk": 20, "def": 116, "spd": 124, "spe": 4}, + "teraType": ["Fairy", "Poison", "Water"], + "ability": ["Vessel of Ruin"] + }, + { + "species": "Ting-Lu", + "weight": 5, + "moves": [ + ["Earthquake"], + ["Heavy Slam"], + ["Fissure", "Stone Edge"], + ["Ruination"] + ], + "item": ["Assault Vest"], + "nature": "Adamant", + "evs": {"hp": 4, "atk": 252, "def": 4, "spd": 108, "spe": 140}, + "teraType": ["Steel"], + "ability": ["Vessel of Ruin"] + }, + { + "species": "Ting-Lu", + "weight": 5, + "moves": [ + ["Earthquake"], + ["Heavy Slam"], + ["Tera Blast"], + ["Ruination"] + ], + "item": ["Assault Vest"], + "nature": "Adamant", + "evs": {"hp": 4, "atk": 252, "def": 4, "spd": 108, "spe": 140}, + "teraType": ["Electric", "Fairy"], + "wantsTera": true, + "ability": ["Vessel of Ruin"] + }, + { + "species": "Ting-Lu", + "weight": 10, + "moves": [ + ["Earthquake"], + ["Heavy Slam"], + ["Rock Tomb"], + ["Ruination"] + ], + "item": ["Sitrus Berry"], + "nature": "Impish", + "evs": {"hp": 244, "atk": 76, "def": 116, "spd": 68, "spe": 4}, + "teraType": ["Steel"], + "ability": ["Vessel of Ruin"] + } + ] }, "gholdengo": { - "weight": 9, - "sets": [ - { - "species": "gholdengo", - "weight": 25, - "moves": [ - ["makeitrain"], - ["shadowball"], - ["thunderbolt", "recover", "focusblast"], - ["trick"] - ], - "item": ["choicespecs"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "timid", - "evs": [0, 0, 0, 252, 4, 252], - "teraType": ["steel", "flying", "water"], - "ability": "goodasgold" - }, - { - "species": "gholdengo", - "weight": 30, - "moves": [ - ["makeitrain"], - ["shadowball"], - ["thunderbolt", "recover", "focusblast"], - ["trick"] - ], - "item": ["choicescarf"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "timid", - "evs": [0, 0, 0, 252, 4, 252], - "teraType": ["steel", "water", "flying", "normal"], - "ability": "goodasgold" - }, - { - "species": "gholdengo", - "weight": 15, - "moves": [ - ["makeitrain", "focusblast"], - ["hex"], - ["thunderwave"], - ["recover"] - ], - "item": ["rockyhelmet"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "bold", - "evs": [252, 0, 252, 4, 0, 0], - "teraType": ["water", "flying"], - "ability": "goodasgold" - }, - { - "species": "gholdengo", - "weight": 20, - "moves": [["makeitrain"], ["shadowball"], ["nastyplot"], ["recover"]], - "item": ["covertcloak"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "modest", - "evs": [164, 0, 156, 36, 4, 148], - "teraType": ["flying"], - "ability": "goodasgold" - }, - { - "species": "gholdengo", - "weight": 5, - "moves": [["terablast"], ["shadowball"], ["nastyplot"], ["recover"]], - "item": ["covertcloak"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "modest", - "evs": [164, 0, 156, 36, 4, 148], - "teraType": ["water", "fighting"], - "wantsTera": true, - "ability": "goodasgold" - }, - { - "species": "gholdengo", - "weight": 5, - "moves": [ - ["makeitrain"], - ["shadowball"], - ["nastyplot"], - ["recover", "substitute", "psyshock"] - ], - "item": ["airballoon"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "timid", - "evs": [0, 0, 0, 252, 4, 252], - "teraType": ["flying"], - "ability": "goodasgold" - } - ] + "weight": 9, + "sets": [ + { + "species": "Gholdengo", + "weight": 25, + "moves": [ + ["Make It Rain"], + ["Shadow Ball"], + ["Focus Blast", "Recover", "Thunderbolt"], + ["Trick"] + ], + "item": ["Choice Specs"], + "nature": "Timid", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "ivs": {"atk": 0}, + "teraType": ["Flying", "Steel", "Water"], + "ability": ["Good as Gold"] + }, + { + "species": "Gholdengo", + "weight": 30, + "moves": [ + ["Make It Rain"], + ["Shadow Ball"], + ["Focus Blast", "Recover", "Thunderbolt"], + ["Trick"] + ], + "item": ["Choice Scarf"], + "nature": "Timid", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "ivs": {"atk": 0}, + "teraType": ["Flying", "Normal", "Steel", "Water"], + "ability": ["Good as Gold"] + }, + { + "species": "Gholdengo", + "weight": 15, + "moves": [ + ["Focus Blast", "Make It Rain"], + ["Hex"], + ["Thunder Wave"], + ["Recover"] + ], + "item": ["Rocky Helmet"], + "nature": "Bold", + "evs": {"hp": 252, "def": 252, "spa": 4}, + "ivs": {"atk": 0}, + "teraType": ["Flying", "Water"], + "ability": ["Good as Gold"] + }, + { + "species": "Gholdengo", + "weight": 20, + "moves": [ + ["Make It Rain"], + ["Shadow Ball"], + ["Nasty Plot"], + ["Recover"] + ], + "item": ["Covert Cloak"], + "nature": "Modest", + "evs": {"hp": 164, "def": 156, "spa": 36, "spd": 4, "spe": 148}, + "ivs": {"atk": 0}, + "teraType": ["Flying"], + "ability": ["Good as Gold"] + }, + { + "species": "Gholdengo", + "weight": 5, + "moves": [ + ["Tera Blast"], + ["Shadow Ball"], + ["Nasty Plot"], + ["Recover"] + ], + "item": ["Covert Cloak"], + "nature": "Modest", + "evs": {"hp": 164, "def": 156, "spa": 36, "spd": 4, "spe": 148}, + "ivs": {"atk": 0}, + "teraType": ["Fighting", "Water"], + "wantsTera": true, + "ability": ["Good as Gold"] + }, + { + "species": "Gholdengo", + "weight": 5, + "moves": [ + ["Make It Rain"], + ["Shadow Ball"], + ["Nasty Plot"], + ["Psyshock", "Recover", "Substitute"] + ], + "item": ["Air Balloon"], + "nature": "Timid", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "ivs": {"atk": 0}, + "teraType": ["Flying"], + "ability": ["Good as Gold"] + } + ] }, "chiyu": { - "weight": 9, - "sets": [ - { - "species": "chiyu", - "weight": 20, - "moves": [["overheat"], ["darkpulse"], ["terablast"], ["flamethrower"]], - "item": ["choicescarf"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "modest", - "evs": [116, 0, 84, 156, 4, 148], - "teraType": ["fairy", "grass"], - "wantsTera": true, - "ability": "beadsofruin" - }, - { - "species": "chiyu", - "weight": 35, - "moves": [["overheat"], ["lavaplume"], ["darkpulse"], ["psychic"]], - "item": ["choicescarf"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "modest", - "evs": [0, 0, 0, 252, 4, 252], - "teraType": ["ghost", "fire"], - "ability": "beadsofruin" - }, - { - "species": "chiyu", - "weight": 10, - "moves": [ - ["ruination", "flamecharge"], - ["overheat"], - ["darkpulse"], - ["terablast"] - ], - "item": ["assaultvest"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "calm", - "evs": [252, 0, 4, 76, 156, 20], - "teraType": ["water", "fairy", "grass", "ghost"], - "wantsTera": true, - "ability": "beadsofruin" - }, - { - "species": "chiyu", - "weight": 5, - "moves": [["lavaplume"], ["ruination"], ["taunt"], ["darkpulse"]], - "item": ["focussash"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "timid", - "evs": [0, 0, 0, 252, 4, 252], - "teraType": ["ghost"], - "ability": "beadsofruin" - }, - { - "species": "chiyu", - "weight": 20, - "moves": [["overheat"], ["flamethrower"], ["darkpulse"], ["psychic"]], - "item": ["choicespecs"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "timid", - "evs": [0, 0, 0, 252, 4, 252], - "teraType": ["fire"], - "ability": "beadsofruin" - }, - { - "species": "chiyu", - "weight": 10, - "moves": [["overheat"], ["flamethrower"], ["darkpulse"], ["terablast"]], - "item": ["choicespecs"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "timid", - "evs": [0, 0, 0, 252, 4, 252], - "teraType": ["fairy", "ghost", "water"], - "wantsTera": true, - "ability": "beadsofruin" - } - ] + "weight": 9, + "sets": [ + { + "species": "Chi-Yu", + "weight": 20, + "moves": [ + ["Overheat"], + ["Dark Pulse"], + ["Tera Blast"], + ["Flamethrower"] + ], + "item": ["Choice Scarf"], + "nature": "Modest", + "evs": {"hp": 116, "def": 84, "spa": 156, "spd": 4, "spe": 148}, + "ivs": {"atk": 0}, + "teraType": ["Fairy", "Grass"], + "wantsTera": true, + "ability": ["Beads of Ruin"] + }, + { + "species": "Chi-Yu", + "weight": 35, + "moves": [ + ["Overheat"], + ["Lava Plume"], + ["Dark Pulse"], + ["Psychic"] + ], + "item": ["Choice Scarf"], + "nature": "Modest", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "ivs": {"atk": 0}, + "teraType": ["Fire", "Ghost"], + "ability": ["Beads of Ruin"] + }, + { + "species": "Chi-Yu", + "weight": 10, + "moves": [ + ["Flame Charge", "Ruination"], + ["Overheat"], + ["Dark Pulse"], + ["Tera Blast"] + ], + "item": ["Assault Vest"], + "nature": "Calm", + "evs": {"hp": 252, "def": 4, "spa": 76, "spd": 156, "spe": 20}, + "ivs": {"atk": 0}, + "teraType": ["Fairy", "Ghost", "Grass", "Water"], + "wantsTera": true, + "ability": ["Beads of Ruin"] + }, + { + "species": "Chi-Yu", + "weight": 5, + "moves": [ + ["Lava Plume"], + ["Ruination"], + ["Taunt"], + ["Dark Pulse"] + ], + "item": ["Focus Sash"], + "nature": "Timid", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "ivs": {"atk": 0}, + "teraType": ["Ghost"], + "ability": ["Beads of Ruin"] + }, + { + "species": "Chi-Yu", + "weight": 20, + "moves": [ + ["Overheat"], + ["Flamethrower"], + ["Dark Pulse"], + ["Psychic"] + ], + "item": ["Choice Specs"], + "nature": "Timid", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "ivs": {"atk": 0}, + "teraType": ["Fire"], + "ability": ["Beads of Ruin"] + }, + { + "species": "Chi-Yu", + "weight": 10, + "moves": [ + ["Overheat"], + ["Flamethrower"], + ["Dark Pulse"], + ["Tera Blast"] + ], + "item": ["Choice Specs"], + "nature": "Timid", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "ivs": {"atk": 0}, + "teraType": ["Fairy", "Ghost", "Water"], + "wantsTera": true, + "ability": ["Beads of Ruin"] + } + ] }, "garganacl": { - "weight": 9, - "sets": [ - { - "species": "garganacl", - "weight": 45, - "moves": [ - ["saltcure"], - ["protect"], - ["recover"], - ["substitute", "fissure", "stealthrock"] - ], - "item": ["leftovers"], - "nature": "impish", - "evs": [252, 4, 252, 0, 0, 0], - "teraType": ["fairy", "water", "poison"], - "wantsTera": true, - "ability": "purifyingsalt" - }, - { - "species": "garganacl", - "weight": 20, - "moves": [ - ["saltcure"], - ["recover"], - ["curse"], - ["substitute", "protect", "earthquake"] - ], - "item": ["leftovers"], - "nature": "careful", - "evs": [252, 4, 0, 0, 252, 0], - "teraType": ["ghost"], - "wantsTera": true, - "ability": "purifyingsalt" - }, - { - "species": "garganacl", - "weight": 35, - "moves": [["saltcure"], ["recover"], ["irondefense"], ["bodypress"]], - "item": ["leftovers"], - "nature": "careful", - "evs": [252, 0, 4, 0, 252, 0], - "teraType": ["fairy", "water", "poison"], - "wantsTera": true, - "ability": "purifyingsalt" - } - ] + "weight": 9, + "sets": [ + { + "species": "Garganacl", + "weight": 45, + "moves": [ + ["Salt Cure"], + ["Protect"], + ["Recover"], + ["Fissure", "Stealth Rock", "Substitute"] + ], + "item": ["Leftovers"], + "nature": "Impish", + "evs": {"hp": 252, "atk": 4, "def": 252}, + "teraType": ["Fairy", "Poison", "Water"], + "wantsTera": true, + "ability": ["Purifying Salt"] + }, + { + "species": "Garganacl", + "weight": 20, + "moves": [ + ["Salt Cure"], + ["Recover"], + ["Curse"], + ["Earthquake", "Protect", "Substitute"] + ], + "item": ["Leftovers"], + "nature": "Careful", + "evs": {"hp": 252, "atk": 4, "spd": 252}, + "teraType": ["Ghost"], + "wantsTera": true, + "ability": ["Purifying Salt"] + }, + { + "species": "Garganacl", + "weight": 35, + "moves": [ + ["Salt Cure"], + ["Recover"], + ["Iron Defense"], + ["Body Press"] + ], + "item": ["Leftovers"], + "nature": "Careful", + "evs": {"hp": 252, "def": 4, "spd": 252}, + "teraType": ["Fairy", "Poison", "Water"], + "wantsTera": true, + "ability": ["Purifying Salt"] + } + ] }, "garchomp": { - "weight": 8, - "sets": [ - { - "species": "garchomp", - "weight": 45, - "moves": [ - ["scaleshot"], - ["earthquake"], - ["ironhead", "substitute"], - ["swordsdance"] - ], - "item": ["loadeddice"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["steel"], - "wantsTera": true, - "ability": "roughskin" - }, - { - "species": "garchomp", - "weight": 25, - "moves": [["stealthrock"], ["spikes"], ["earthquake"], ["dragontail"]], - "item": ["sitrusberry"], - "nature": "impish", - "evs": [180, 4, 36, 0, 172, 116], - "teraType": ["steel"], - "wantsTera": true, - "ability": "roughskin" - }, - { - "species": "garchomp", - "weight": 10, - "moves": [ - ["outrage", "scaleshot"], - ["earthquake"], - ["rocktomb"], - ["ironhead"] - ], - "item": ["choiceband", "choicescarf"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["steel"], - "wantsTera": true, - "ability": "roughskin" - }, - { - "species": "garchomp", - "weight": 5, - "moves": [["earthquake"], ["ironhead"], ["scaleshot"], ["dragontail"]], - "item": ["assaultvest"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["steel"], - "ability": "roughskin" - }, - { - "species": "garchomp", - "weight": 10, - "moves": [ - ["outrage", "scaleshot"], - ["earthquake"], - ["rocktomb"], - ["terablast"] - ], - "item": ["choiceband", "choicescarf"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["fairy", "fire"], - "wantsTera": true, - "ability": "roughskin" - }, - { - "species": "garchomp", - "weight": 5, - "moves": [["earthquake"], ["terablast"], ["scaleshot"], ["dragontail"]], - "item": ["assaultvest"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["fairy"], - "wantsTera": true, - "ability": "roughskin" - } - ] + "weight": 8, + "sets": [ + { + "species": "Garchomp", + "weight": 45, + "moves": [ + ["Scale Shot"], + ["Earthquake"], + ["Iron Head", "Substitute"], + ["Swords Dance"] + ], + "item": ["Loaded Dice"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Steel"], + "wantsTera": true, + "ability": ["Rough Skin"] + }, + { + "species": "Garchomp", + "weight": 25, + "moves": [ + ["Stealth Rock"], + ["Spikes"], + ["Earthquake"], + ["Dragon Tail"] + ], + "item": ["Sitrus Berry"], + "nature": "Impish", + "evs": {"hp": 180, "atk": 4, "def": 36, "spd": 172, "spe": 116}, + "teraType": ["Steel"], + "wantsTera": true, + "ability": ["Rough Skin"] + }, + { + "species": "Garchomp", + "weight": 10, + "moves": [ + ["Outrage", "Scale Shot"], + ["Earthquake"], + ["Rock Tomb"], + ["Iron Head"] + ], + "item": ["Choice Band", "Choice Scarf"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Steel"], + "wantsTera": true, + "ability": ["Rough Skin"] + }, + { + "species": "Garchomp", + "weight": 5, + "moves": [ + ["Earthquake"], + ["Iron Head"], + ["Scale Shot"], + ["Dragon Tail"] + ], + "item": ["Assault Vest"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Steel"], + "ability": ["Rough Skin"] + }, + { + "species": "Garchomp", + "weight": 10, + "moves": [ + ["Outrage", "Scale Shot"], + ["Earthquake"], + ["Rock Tomb"], + ["Tera Blast"] + ], + "item": ["Choice Band", "Choice Scarf"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Fairy", "Fire"], + "wantsTera": true, + "ability": ["Rough Skin"] + }, + { + "species": "Garchomp", + "weight": 5, + "moves": [ + ["Earthquake"], + ["Tera Blast"], + ["Scale Shot"], + ["Dragon Tail"] + ], + "item": ["Assault Vest"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Fairy"], + "wantsTera": true, + "ability": ["Rough Skin"] + } + ] }, "landorustherian": { - "weight": 8, - "sets": [ - { - "species": "landorustherian", - "weight": 30, - "moves": [ - ["stealthrock"], - ["earthquake"], - ["rocktomb", "taunt"], - ["uturn"] - ], - "item": ["sitrusberry", "rockyhelmet", "leftovers"], - "nature": "impish", - "evs": [252, 0, 252, 0, 4, 0], - "teraType": ["water", "steel", "fairy"], - "ability": "intimidate" - }, - { - "species": "landorustherian", - "weight": 45, - "moves": [ - ["earthquake"], - ["uturn"], - ["terablast"], - ["stoneedge", "rocktomb"] - ], - "item": ["choicescarf"], - "nature": "jolly", - "evs": [0, 252, 4, 0, 0, 252], - "teraType": ["flying"], - "wantsTera": true, - "ability": "intimidate" - }, - { - "species": "landorustherian", - "weight": 15, - "moves": [ - ["earthquake"], - ["uturn"], - ["terablast"], - ["stoneedge", "rocktomb"] - ], - "item": ["choicescarf", "choiceband"], - "nature": "jolly", - "evs": [0, 252, 4, 0, 0, 252], - "teraType": ["flying", "fairy"], - "wantsTera": true, - "ability": "intimidate" - }, - { - "species": "landorustherian", - "weight": 5, - "moves": [ - ["earthquake"], - ["uturn"], - ["terablast", "fissure"], - ["rocktomb", "smackdown"] - ], - "item": ["assaultvest"], - "nature": "adamant", - "evs": [252, 4, 0, 0, 252, 0], - "teraType": ["steel"], - "wantsTera": true, - "ability": "intimidate" - }, - { - "species": "landorustherian", - "weight": 5, - "moves": [["earthquake"], ["rocktomb"], ["uturn"], ["terablast"]], - "item": ["assaultvest"], - "nature": "adamant", - "evs": [252, 252, 4, 0, 0, 0], - "teraType": ["flying", "water"], - "wantsTera": true, - "ability": "intimidate" - } - ] + "weight": 8, + "sets": [ + { + "species": "Landorus-Therian", + "weight": 30, + "moves": [ + ["Stealth Rock"], + ["Earthquake"], + ["Rock Tomb", "Taunt"], + ["U-turn"] + ], + "item": ["Leftovers", "Rocky Helmet", "Sitrus Berry"], + "nature": "Impish", + "evs": {"hp": 252, "def": 252, "spd": 4}, + "teraType": ["Fairy", "Steel", "Water"], + "ability": ["Intimidate"] + }, + { + "species": "Landorus-Therian", + "weight": 45, + "moves": [ + ["Earthquake"], + ["U-turn"], + ["Tera Blast"], + ["Rock Tomb", "Stone Edge"] + ], + "item": ["Choice Scarf"], + "nature": "Jolly", + "evs": {"atk": 252, "def": 4, "spe": 252}, + "teraType": ["Flying"], + "wantsTera": true, + "ability": ["Intimidate"] + }, + { + "species": "Landorus-Therian", + "weight": 15, + "moves": [ + ["Earthquake"], + ["U-turn"], + ["Tera Blast"], + ["Rock Tomb", "Stone Edge"] + ], + "item": ["Choice Band", "Choice Scarf"], + "nature": "Jolly", + "evs": {"atk": 252, "def": 4, "spe": 252}, + "teraType": ["Fairy", "Flying"], + "wantsTera": true, + "ability": ["Intimidate"] + }, + { + "species": "Landorus-Therian", + "weight": 5, + "moves": [ + ["Earthquake"], + ["U-turn"], + ["Fissure", "Tera Blast"], + ["Rock Tomb", "Smack Down"] + ], + "item": ["Assault Vest"], + "nature": "Adamant", + "evs": {"hp": 252, "atk": 4, "spd": 252}, + "teraType": ["Steel"], + "wantsTera": true, + "ability": ["Intimidate"] + }, + { + "species": "Landorus-Therian", + "weight": 5, + "moves": [ + ["Earthquake"], + ["Rock Tomb"], + ["U-turn"], + ["Tera Blast"] + ], + "item": ["Assault Vest"], + "nature": "Adamant", + "evs": {"hp": 252, "atk": 252, "def": 4}, + "teraType": ["Flying", "Water"], + "wantsTera": true, + "ability": ["Intimidate"] + } + ] }, "scizor": { - "weight": 8, - "sets": [ - { - "species": "scizor", - "weight": 15, - "moves": [ - ["swordsdance"], - ["bulletpunch"], - ["closecombat"], - ["knockoff", "uturn", "terablast"] - ], - "item": ["sitrusberry"], - "nature": "adamant", - "evs": [252, 28, 204, 0, 20, 4], - "teraType": ["water"], - "wantsTera": true, - "ability": "technician" - }, - { - "species": "scizor", - "weight": 20, - "moves": [ - ["swordsdance"], - ["bulletpunch"], - ["uturn", "closecombat"], - ["knockoff"] - ], - "item": ["sitrusberry"], - "nature": "adamant", - "evs": [252, 28, 204, 0, 20, 4], - "teraType": ["steel", "flying"], - "wantsTera": true, - "ability": "technician" - }, - { - "species": "scizor", - "weight": 50, - "moves": [["bulletpunch"], ["uturn"], ["knockoff"], ["closecombat"]], - "item": ["choiceband", "assaultvest"], - "nature": "adamant", - "evs": [236, 244, 20, 0, 4, 4], - "teraType": ["steel", "water"], - "wantsTera": true, - "ability": "technician" - }, - { - "species": "scizor", - "weight": 15, - "moves": [ - ["bulletpunch"], - ["uturn"], - ["knockoff", "terablast"], - ["closecombat"] - ], - "item": ["assaultvest"], - "nature": "adamant", - "evs": [236, 244, 20, 0, 4, 4], - "teraType": ["water"], - "wantsTera": true, - "ability": "technician" - } - ] + "weight": 8, + "sets": [ + { + "species": "Scizor", + "weight": 15, + "moves": [ + ["Swords Dance"], + ["Bullet Punch"], + ["Close Combat"], + ["Knock Off", "Tera Blast", "U-turn"] + ], + "item": ["Sitrus Berry"], + "nature": "Adamant", + "evs": {"hp": 252, "atk": 28, "def": 204, "spd": 20, "spe": 4}, + "teraType": ["Water"], + "wantsTera": true, + "ability": ["Technician"] + }, + { + "species": "Scizor", + "weight": 20, + "moves": [ + ["Swords Dance"], + ["Bullet Punch"], + ["Close Combat", "U-turn"], + ["Knock Off"] + ], + "item": ["Sitrus Berry"], + "nature": "Adamant", + "evs": {"hp": 252, "atk": 28, "def": 204, "spd": 20, "spe": 4}, + "teraType": ["Flying", "Steel"], + "wantsTera": true, + "ability": ["Technician"] + }, + { + "species": "Scizor", + "weight": 50, + "moves": [ + ["Bullet Punch"], + ["U-turn"], + ["Knock Off"], + ["Close Combat"] + ], + "item": ["Assault Vest", "Choice Band"], + "nature": "Adamant", + "evs": {"hp": 236, "atk": 244, "def": 20, "spd": 4, "spe": 4}, + "teraType": ["Steel", "Water"], + "wantsTera": true, + "ability": ["Technician"] + }, + { + "species": "Scizor", + "weight": 15, + "moves": [ + ["Bullet Punch"], + ["U-turn"], + ["Knock Off", "Tera Blast"], + ["Close Combat"] + ], + "item": ["Assault Vest"], + "nature": "Adamant", + "evs": {"hp": 236, "atk": 244, "def": 20, "spd": 4, "spe": 4}, + "teraType": ["Water"], + "wantsTera": true, + "ability": ["Technician"] + } + ] }, "toxapex": { - "weight": 8, - "sets": [ - { - "species": "toxapex", - "weight": 40, - "moves": [ - ["toxic"], - ["toxicspikes", "banefulbunker"], - ["recover"], - ["haze"] - ], - "item": ["blacksludge", "mentalherb"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "bold", - "evs": [252, 0, 252, 0, 4, 0], - "teraType": ["poison"], - "ability": "regenerator" - }, - { - "species": "toxapex", - "weight": 60, - "moves": [["toxic"], ["liquidation"], ["recover"], ["haze"]], - "item": ["rockyhelmet", "leftovers"], - "nature": "impish", - "evs": [252, 0, 252, 0, 4, 0], - "teraType": ["fairy", "poison"], - "ability": "regenerator" - } - ] + "weight": 8, + "sets": [ + { + "species": "Toxapex", + "weight": 40, + "moves": [ + ["Toxic"], + ["Baneful Bunker", "Toxic Spikes"], + ["Recover"], + ["Haze"] + ], + "item": ["Black Sludge", "Mental Herb"], + "nature": "Bold", + "evs": {"hp": 252, "def": 252, "spd": 4}, + "ivs": {"atk": 0}, + "teraType": ["Poison"], + "ability": ["Regenerator"] + }, + { + "species": "Toxapex", + "weight": 60, + "moves": [ + ["Toxic"], + ["Liquidation"], + ["Recover"], + ["Haze"] + ], + "item": ["Leftovers", "Rocky Helmet"], + "nature": "Impish", + "evs": {"hp": 252, "def": 252, "spd": 4}, + "teraType": ["Fairy", "Poison"], + "ability": ["Regenerator"] + } + ] }, "roaringmoon": { - "weight": 8, - "sets": [ - { - "species": "roaringmoon", - "weight": 40, - "moves": [ - ["dragondance"], - ["acrobatics"], - ["earthquake", "roost", "taunt"], - ["knockoff"] - ], - "item": ["boosterenergy"], - "nature": "jolly", - "evs": [0, 220, 36, 0, 0, 252], - "teraType": ["flying"], - "wantsTera": true, - "ability": "protosynthesis" - }, - { - "species": "roaringmoon", - "weight": 10, - "moves": [ - ["dragondance"], - ["ironhead"], - ["earthquake", "roost", "taunt"], - ["knockoff"] - ], - "item": ["boosterenergy"], - "nature": "jolly", - "evs": [0, 220, 36, 0, 0, 252], - "teraType": ["steel"], - "wantsTera": true, - "ability": "protosynthesis" - }, - { - "species": "roaringmoon", - "weight": 5, - "moves": [["jawlock"], ["roost"], ["taunt"], ["dragondance"]], - "item": ["leftovers", "shedshell"], - "nature": "impish", - "evs": [244, 4, 196, 0, 36, 28], - "teraType": ["poison", "fairy"], - "wantsTera": true, - "ability": "protosynthesis" - }, - { - "species": "roaringmoon", - "weight": 10, - "moves": [ - ["knockoff"], - ["uturn"], - ["earthquake", "scaleshot"], - ["terablast"] - ], - "item": ["choicescarf", "choiceband"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["fairy", "fire"], - "wantsTera": true, - "ability": "protosynthesis" - }, - { - "species": "roaringmoon", - "weight": 25, - "moves": [ - ["knockoff"], - ["uturn", "earthquake"], - ["ironhead"], - ["outrage"] - ], - "item": ["choiceband"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["steel", "dark"], - "wantsTera": true, - "ability": "protosynthesis" - }, - { - "species": "roaringmoon", - "weight": 10, - "moves": [["dragondance"], ["knockoff"], ["earthquake"], ["scaleshot"]], - "item": ["loadeddice"], - "nature": "jolly", - "evs": [4, 252, 0, 0, 0, 252], - "teraType": ["steel"], - "wantsTera": true, - "ability": "protosynthesis" - } - ] + "weight": 8, + "sets": [ + { + "species": "Roaring Moon", + "weight": 40, + "moves": [ + ["Dragon Dance"], + ["Acrobatics"], + ["Earthquake", "Roost", "Taunt"], + ["Knock Off"] + ], + "item": ["Booster Energy"], + "nature": "Jolly", + "evs": {"atk": 220, "def": 36, "spe": 252}, + "teraType": ["Flying"], + "wantsTera": true, + "ability": ["Protosynthesis"] + }, + { + "species": "Roaring Moon", + "weight": 10, + "moves": [ + ["Dragon Dance"], + ["Iron Head"], + ["Earthquake", "Roost", "Taunt"], + ["Knock Off"] + ], + "item": ["Booster Energy"], + "nature": "Jolly", + "evs": {"atk": 220, "def": 36, "spe": 252}, + "teraType": ["Steel"], + "wantsTera": true, + "ability": ["Protosynthesis"] + }, + { + "species": "Roaring Moon", + "weight": 5, + "moves": [ + ["Jaw Lock"], + ["Roost"], + ["Taunt"], + ["Dragon Dance"] + ], + "item": ["Leftovers", "Shed Shell"], + "nature": "Impish", + "evs": {"hp": 244, "atk": 4, "def": 196, "spd": 36, "spe": 28}, + "teraType": ["Fairy", "Poison"], + "wantsTera": true, + "ability": ["Protosynthesis"] + }, + { + "species": "Roaring Moon", + "weight": 10, + "moves": [ + ["Knock Off"], + ["U-turn"], + ["Earthquake", "Scale Shot"], + ["Tera Blast"] + ], + "item": ["Choice Band", "Choice Scarf"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Fairy", "Fire"], + "wantsTera": true, + "ability": ["Protosynthesis"] + }, + { + "species": "Roaring Moon", + "weight": 25, + "moves": [ + ["Knock Off"], + ["Earthquake", "U-turn"], + ["Iron Head"], + ["Outrage"] + ], + "item": ["Choice Band"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Dark", "Steel"], + "wantsTera": true, + "ability": ["Protosynthesis"] + }, + { + "species": "Roaring Moon", + "weight": 10, + "moves": [ + ["Dragon Dance"], + ["Knock Off"], + ["Earthquake"], + ["Scale Shot"] + ], + "item": ["Loaded Dice"], + "nature": "Jolly", + "evs": {"hp": 4, "atk": 252, "spe": 252}, + "teraType": ["Steel"], + "wantsTera": true, + "ability": ["Protosynthesis"] + } + ] }, "dragapult": { - "weight": 8, - "sets": [ - { - "species": "dragapult", - "weight": 30, - "moves": [ - ["dragondarts"], - ["uturn"], - ["suckerpunch"], - ["phantomforce"] - ], - "item": ["choiceband"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["dragon", "steel"], - "ability": "infiltrator" - }, - { - "species": "dragapult", - "weight": 5, - "moves": [["dragondarts"], ["uturn"], ["suckerpunch"], ["terablast"]], - "item": ["choiceband", "choicescarf"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["ghost", "fire", "steel", "fairy"], - "wantsTera": true, - "ability": "infiltrator" - }, - { - "species": "dragapult", - "weight": 15, - "moves": [ - ["reflect"], - ["lightscreen"], - ["curse"], - ["shadowball", "willowisp"] - ], - "item": ["lightclay"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "timid", - "evs": [244, 0, 12, 0, 0, 252], - "teraType": ["ghost", "normal"], - "ability": "cursedbody" - }, - { - "species": "dragapult", - "weight": 10, - "moves": [ - ["dragondarts"], - ["terablast", "batonpass"], - ["substitute"], - ["dragondance"] - ], - "item": ["lifeorb"], - "nature": "jolly", - "evs": [0, 252, 4, 0, 0, 252], - "teraType": ["fire"], - "wantsTera": true, - "ability": "clearbody" - }, - { - "species": "dragapult", - "weight": 25, - "moves": [ - ["dracometeor"], - ["hex", "shadowball"], - ["willowisp"], - ["thunderwave"] - ], - "item": ["focussash"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "timid", - "evs": [0, 0, 4, 252, 0, 252], - "teraType": ["ghost", "normal"], - "ability": "cursedbody" - }, - { - "species": "dragapult", - "weight": 15, - "moves": [ - ["shadowball"], - ["dracometeor"], - ["thunderbolt"], - ["flamethrower", "uturn"] - ], - "item": ["choicespecs", "choicescarf"], - "nature": "timid", - "evs": [0, 0, 0, 252, 4, 252], - "teraType": ["ghost", "fire", "electric", "fighting"], - "ability": "infiltrator" - } - ] + "weight": 8, + "sets": [ + { + "species": "Dragapult", + "weight": 30, + "moves": [ + ["Dragon Darts"], + ["U-turn"], + ["Sucker Punch"], + ["Phantom Force"] + ], + "item": ["Choice Band"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Dragon", "Steel"], + "ability": ["Infiltrator"] + }, + { + "species": "Dragapult", + "weight": 5, + "moves": [ + ["Dragon Darts"], + ["U-turn"], + ["Sucker Punch"], + ["Tera Blast"] + ], + "item": ["Choice Band", "Choice Scarf"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Fairy", "Fire", "Ghost", "Steel"], + "wantsTera": true, + "ability": ["Infiltrator"] + }, + { + "species": "Dragapult", + "weight": 15, + "moves": [ + ["Reflect"], + ["Light Screen"], + ["Curse"], + ["Shadow Ball", "Will-O-Wisp"] + ], + "item": ["Light Clay"], + "nature": "Timid", + "evs": {"hp": 244, "def": 12, "spe": 252}, + "ivs": {"atk": 0}, + "teraType": ["Ghost", "Normal"], + "ability": ["Cursed Body"] + }, + { + "species": "Dragapult", + "weight": 10, + "moves": [ + ["Dragon Darts"], + ["Baton Pass", "Tera Blast"], + ["Substitute"], + ["Dragon Dance"] + ], + "item": ["Life Orb"], + "nature": "Jolly", + "evs": {"atk": 252, "def": 4, "spe": 252}, + "teraType": ["Fire"], + "wantsTera": true, + "ability": ["Clear Body"] + }, + { + "species": "Dragapult", + "weight": 25, + "moves": [ + ["Draco Meteor"], + ["Hex", "Shadow Ball"], + ["Will-O-Wisp"], + ["Thunder Wave"] + ], + "item": ["Focus Sash"], + "nature": "Timid", + "evs": {"def": 4, "spa": 252, "spe": 252}, + "ivs": {"atk": 0}, + "teraType": ["Ghost", "Normal"], + "ability": ["Cursed Body"] + }, + { + "species": "Dragapult", + "weight": 15, + "moves": [ + ["Shadow Ball"], + ["Draco Meteor"], + ["Thunderbolt"], + ["Flamethrower", "U-turn"] + ], + "item": ["Choice Scarf", "Choice Specs"], + "nature": "Timid", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "teraType": ["Electric", "Fighting", "Fire", "Ghost"], + "ability": ["Infiltrator"] + } + ] }, "baxcalibur": { - "weight": 8, - "sets": [ - { - "species": "baxcalibur", - "weight": 5, - "moves": [ - ["glaiverush", "scaleshot"], - ["earthquake"], - ["iceshard"], - ["swordsdance", "iciclespear"] - ], - "item": ["lifeorb", "focussash"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["dragon", "ghost"], - "wantsTera": true, - "ability": "thermalexchange" - }, - { - "species": "baxcalibur", - "weight": 75, - "moves": [ - ["scaleshot", "iceshard"], - ["iciclespear"], - ["earthquake"], - ["swordsdance", "dragondance"] - ], - "item": ["loadeddice"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["ice", "ground", "ghost"], - "wantsTera": true, - "ability": "thermalexchange" - }, - { - "species": "baxcalibur", - "weight": 10, - "moves": [ - ["iciclecrash", "iciclespear"], - ["iceshard"], - ["glaiverush"], - ["earthquake"] - ], - "item": ["assaultvest"], - "nature": "adamant", - "evs": [252, 252, 0, 0, 4, 0], - "teraType": ["ground"], - "wantsTera": true, - "ability": "thermalexchange" - }, - { - "species": "baxcalibur", - "weight": 5, - "moves": [["iciclespear"], ["iceshard"], ["terablast"], ["earthquake"]], - "item": ["assaultvest"], - "nature": "adamant", - "evs": [252, 252, 0, 0, 4, 0], - "teraType": ["fairy", "electric", "fire"], - "wantsTera": true, - "ability": "thermalexchange" - }, - { - "species": "baxcalibur", - "weight": 5, - "moves": [ - ["glaiverush", "scaleshot"], - ["earthquake"], - ["iceshard"], - ["iciclespear"] - ], - "item": ["choiceband"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["dragon", "ice"], - "wantsTera": true, - "ability": "thermalexchange" - } - ] + "weight": 8, + "sets": [ + { + "species": "Baxcalibur", + "weight": 5, + "moves": [ + ["Glaive Rush", "Scale Shot"], + ["Earthquake"], + ["Ice Shard"], + ["Icicle Spear", "Swords Dance"] + ], + "item": ["Focus Sash", "Life Orb"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Dragon", "Ghost"], + "wantsTera": true, + "ability": ["Thermal Exchange"] + }, + { + "species": "Baxcalibur", + "weight": 75, + "moves": [ + ["Ice Shard", "Scale Shot"], + ["Icicle Spear"], + ["Earthquake"], + ["Dragon Dance", "Swords Dance"] + ], + "item": ["Loaded Dice"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Ghost", "Ground", "Ice"], + "wantsTera": true, + "ability": ["Thermal Exchange"] + }, + { + "species": "Baxcalibur", + "weight": 10, + "moves": [ + ["Icicle Crash", "Icicle Spear"], + ["Ice Shard"], + ["Glaive Rush"], + ["Earthquake"] + ], + "item": ["Assault Vest"], + "nature": "Adamant", + "evs": {"hp": 252, "atk": 252, "spd": 4}, + "teraType": ["Ground"], + "wantsTera": true, + "ability": ["Thermal Exchange"] + }, + { + "species": "Baxcalibur", + "weight": 5, + "moves": [ + ["Icicle Spear"], + ["Ice Shard"], + ["Tera Blast"], + ["Earthquake"] + ], + "item": ["Assault Vest"], + "nature": "Adamant", + "evs": {"hp": 252, "atk": 252, "spd": 4}, + "teraType": ["Electric", "Fairy", "Fire"], + "wantsTera": true, + "ability": ["Thermal Exchange"] + }, + { + "species": "Baxcalibur", + "weight": 5, + "moves": [ + ["Glaive Rush", "Scale Shot"], + ["Earthquake"], + ["Ice Shard"], + ["Icicle Spear"] + ], + "item": ["Choice Band"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Dragon", "Ice"], + "wantsTera": true, + "ability": ["Thermal Exchange"] + } + ] }, "ninetalesalola": { - "weight": 8, - "sets": [ - { - "species": "ninetalesalola", - "weight": 80, - "moves": [ - ["auroraveil"], - ["moonblast"], - ["encore"], - ["blizzard", "freezedry"] - ], - "item": ["lightclay"], - "nature": "timid", - "evs": [4, 0, 0, 252, 0, 252], - "teraType": ["ice", "water", "fire"], - "ability": "snowwarning" - }, - { - "species": "ninetalesalola", - "weight": 10, - "moves": [["auroraveil"], ["moonblast"], ["encore"], ["disable"]], - "item": ["lightclay", "rockyhelmet"], - "nature": "timid", - "evs": [4, 0, 0, 252, 0, 252], - "teraType": ["water", "fire"], - "ability": "snowwarning" - }, - { - "species": "ninetalesalola", - "weight": 20, - "moves": [["auroraveil"], ["moonblast"], ["encore"], ["terablast"]], - "item": ["lightclay"], - "nature": "timid", - "evs": [4, 0, 0, 252, 0, 252], - "teraType": ["water", "fire"], - "wantsTera": true, - "ability": "snowwarning" - } - ] + "weight": 8, + "sets": [ + { + "species": "Ninetales-Alola", + "weight": 80, + "moves": [ + ["Aurora Veil"], + ["Moonblast"], + ["Encore"], + ["Blizzard", "Freeze-Dry"] + ], + "item": ["Light Clay"], + "nature": "Timid", + "evs": {"hp": 4, "spa": 252, "spe": 252}, + "teraType": ["Fire", "Ice", "Water"], + "ability": ["Snow Warning"] + }, + { + "species": "Ninetales-Alola", + "weight": 10, + "moves": [ + ["Aurora Veil"], + ["Moonblast"], + ["Encore"], + ["Disable"] + ], + "item": ["Light Clay", "Rocky Helmet"], + "nature": "Timid", + "evs": {"hp": 4, "spa": 252, "spe": 252}, + "teraType": ["Fire", "Water"], + "ability": ["Snow Warning"] + }, + { + "species": "Ninetales-Alola", + "weight": 10, + "moves": [ + ["Aurora Veil"], + ["Moonblast"], + ["Encore"], + ["Tera Blast"] + ], + "item": ["Light Clay"], + "nature": "Timid", + "evs": {"hp": 4, "spa": 252, "spe": 252}, + "teraType": ["Fire", "Water"], + "wantsTera": true, + "ability": ["Snow Warning"] + } + ] }, "ogerponcornerstone": { - "weight": 8, - "sets": [ - { - "species": "ogerponcornerstone", - "weight": 100, - "moves": [ - ["ivycudgel"], - ["hornleech"], - ["knockoff", "encore"], - ["quickattack", "swordsdance", "rocktomb"] - ], - "gender": "f", - "item": ["cornerstonemask"], - "nature": "jolly", - "evs": [4, 252, 0, 0, 0, 252], - "teraType": ["rock"], - "ability": "sturdy" - } - ] + "weight": 8, + "sets": [ + { + "species": "Ogerpon-Cornerstone", + "weight": 100, + "moves": [ + ["Ivy Cudgel"], + ["Horn Leech"], + ["Encore", "Knock Off"], + ["Quick Attack", "Rock Tomb", "Swords Dance"] + ], + "gender": "F", + "item": ["Cornerstone Mask"], + "nature": "Jolly", + "evs": {"hp": 4, "atk": 252, "spe": 252}, + "teraType": ["Rock"], + "ability": ["Sturdy"] + } + ] }, "ogerponwellspring": { - "weight": 8, - "sets": [ - { - "species": "ogerponwellspring", - "weight": 60, - "moves": [ - ["ivycudgel"], - ["hornleech", "leechseed"], - ["encore", "substitute"], - ["synthesis"] - ], - "gender": "f", - "item": ["wellspringmask"], - "nature": "careful", - "evs": [252, 4, 4, 0, 188, 60], - "teraType": ["water"], - "ability": "waterabsorb" - }, - { - "species": "ogerponwellspring", - "weight": 40, - "moves": [ - ["ivycudgel"], - ["hornleech"], - ["knockoff", "playrough"], - ["leechseed", "swordsdance"] - ], - "gender": "f", - "item": ["wellspringmask"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["water"], - "ability": "waterabsorb" - } - ] + "weight": 8, + "sets": [ + { + "species": "Ogerpon-Wellspring", + "weight": 60, + "moves": [ + ["Ivy Cudgel"], + ["Horn Leech", "Leech Seed"], + ["Encore", "Substitute"], + ["Synthesis"] + ], + "gender": "F", + "item": ["Wellspring Mask"], + "nature": "Careful", + "evs": {"hp": 252, "atk": 4, "def": 4, "spd": 188, "spe": 60}, + "teraType": ["Water"], + "ability": ["Water Absorb"] + }, + { + "species": "Ogerpon-Wellspring", + "weight": 40, + "moves": [ + ["Ivy Cudgel"], + ["Horn Leech"], + ["Knock Off", "Play Rough"], + ["Leech Seed", "Swords Dance"] + ], + "gender": "F", + "item": ["Wellspring Mask"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Water"], + "ability": ["Water Absorb"] + } + ] }, "glimmora": { - "weight": 8, - "sets": [ - { - "species": "glimmora", - "weight": 30, - "moves": [["powergem"], ["energyball"], ["stealthrock"], ["endure"]], - "item": ["redcard"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "calm", - "evs": [252, 0, 0, 0, 124, 132], - "teraType": ["grass"], - "ability": "toxicdebris" - }, - { - "species": "glimmora", - "weight": 30, - "moves": [ - ["stealthrock"], - ["powergem", "sludgewave", "energyball"], - ["mudshot", "earthpower"], - ["mortalspin"] - ], - "item": ["focussash"], - "nature": "timid", - "evs": [4, 0, 0, 252, 0, 252], - "teraType": ["flying", "grass"], - "ability": "toxicdebris" - }, - { - "species": "glimmora", - "weight": 5, - "moves": [ - ["mortalspin"], - ["toxicspikes", "stealthrock"], - ["mudshot"], - ["powergem", "sludgebomb"] - ], - "item": ["airballoon", "leftovers"], - "nature": "bold", - "evs": [244, 0, 76, 0, 188, 0], - "teraType": ["flying", "grass"], - "ability": "toxicdebris" - }, - { - "species": "glimmora", - "weight": 20, - "moves": [ - ["sludgewave", "mortalspin"], - ["earthpower"], - ["energyball"], - ["dazzlinggleam", "powergem"] - ], - "item": ["assaultvest"], - "nature": "modest", - "evs": [252, 0, 0, 252, 4, 0], - "teraType": ["grass", "ground", "fairy"], - "ability": "toxicdebris" - }, - { - "species": "glimmora", - "weight": 15, - "moves": [ - ["sludgewave"], - ["earthpower"], - ["energyball"], - ["dazzlinggleam", "powergem"] - ], - "item": ["choicescarf"], - "nature": "timid", - "evs": [0, 0, 0, 252, 4, 252], - "teraType": ["grass", "ground", "fairy"], - "ability": "toxicdebris" - } - ] + "weight": 8, + "sets": [ + { + "species": "Glimmora", + "weight": 30, + "moves": [ + ["Power Gem"], + ["Energy Ball"], + ["Stealth Rock"], + ["Endure"] + ], + "item": ["Red Card"], + "nature": "Calm", + "evs": {"hp": 252, "spd": 124, "spe": 132}, + "ivs": {"atk": 0}, + "teraType": ["Grass"], + "ability": ["Toxic Debris"] + }, + { + "species": "Glimmora", + "weight": 30, + "moves": [ + ["Stealth Rock"], + ["Energy Ball", "Power Gem", "Sludge Wave"], + ["Earth Power", "Mud Shot"], + ["Mortal Spin"] + ], + "item": ["Focus Sash"], + "nature": "Timid", + "evs": {"hp": 4, "spa": 252, "spe": 252}, + "teraType": ["Flying", "Grass"], + "ability": ["Toxic Debris"] + }, + { + "species": "Glimmora", + "weight": 5, + "moves": [ + ["Mortal Spin"], + ["Stealth Rock", "Toxic Spikes"], + ["Mud Shot"], + ["Power Gem", "Sludge Bomb"] + ], + "item": ["Air Balloon", "Leftovers"], + "nature": "Bold", + "evs": {"hp": 244, "def": 76, "spd": 188}, + "teraType": ["Flying", "Grass"], + "ability": ["Toxic Debris"] + }, + { + "species": "Glimmora", + "weight": 20, + "moves": [ + ["Mortal Spin", "Sludge Wave"], + ["Earth Power"], + ["Energy Ball"], + ["Dazzling Gleam", "Power Gem"] + ], + "item": ["Assault Vest"], + "nature": "Modest", + "evs": {"hp": 252, "spa": 252, "spd": 4}, + "teraType": ["Fairy", "Grass", "Ground"], + "ability": ["Toxic Debris"] + }, + { + "species": "Glimmora", + "weight": 15, + "moves": [ + ["Sludge Wave"], + ["Earth Power"], + ["Energy Ball"], + ["Dazzling Gleam", "Power Gem"] + ], + "item": ["Choice Scarf"], + "nature": "Timid", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "teraType": ["Fairy", "Grass", "Ground"], + "ability": ["Toxic Debris"] + } + ] }, "annihilape": { - "weight": 7, - "sets": [ - { - "species": "annihilape", - "weight": 35, - "moves": [ - ["drainpunch"], - ["ragefist"], - ["bulkup"], - ["taunt", "encore"] - ], - "item": ["leftovers", "sitrusberry"], - "nature": "jolly", - "evs": [252, 0, 4, 0, 0, 252], - "teraType": ["fire", "steel", "poison"], - "ability": "vitalspirit" - }, - { - "species": "annihilape", - "weight": 25, - "moves": [ - ["stealthrock"], - ["ragefist"], - ["drainpunch"], - ["taunt", "finalgambit", "rocktomb"] - ], - "item": ["sitrusberry"], - "nature": "impish", - "evs": [244, 0, 244, 0, 0, 20], - "teraType": ["steel", "fire", "normal"], - "ability": "vitalspirit" - }, - { - "species": "annihilape", - "weight": 25, - "moves": [ - ["stealthrock"], - ["ragefist"], - ["drainpunch", "closecombat"], - ["taunt", "finalgambit", "rocktomb"] - ], - "item": ["focussash", "roseliberry"], - "nature": "jolly", - "evs": [252, 4, 0, 0, 0, 252], - "teraType": ["steel", "fire", "normal"], - "ability": "vitalspirit" - }, - { - "species": "annihilape", - "weight": 15, - "moves": [ - ["uturn"], - ["closecombat"], - ["shadowclaw", "ragefist"], - ["finalgambit"] - ], - "item": ["choicescarf"], - "nature": "jolly", - "evs": [252, 4, 0, 0, 0, 252], - "teraType": ["ghost", "normal"], - "ability": "defiant" - } - ] + "weight": 7, + "sets": [ + { + "species": "Annihilape", + "weight": 35, + "moves": [ + ["Drain Punch"], + ["Rage Fist"], + ["Bulk Up"], + ["Encore", "Taunt"] + ], + "item": ["Leftovers", "Sitrus Berry"], + "nature": "Jolly", + "evs": {"hp": 252, "def": 4, "spe": 252}, + "teraType": ["Fire", "Poison", "Steel"], + "ability": ["Vital Spirit"] + }, + { + "species": "Annihilape", + "weight": 25, + "moves": [ + ["Stealth Rock"], + ["Rage Fist"], + ["Drain Punch"], + ["Final Gambit", "Rock Tomb", "Taunt"] + ], + "item": ["Sitrus Berry"], + "nature": "Impish", + "evs": {"hp": 244, "def": 244, "spe": 20}, + "teraType": ["Fire", "Normal", "Steel"], + "ability": ["Vital Spirit"] + }, + { + "species": "Annihilape", + "weight": 25, + "moves": [ + ["Stealth Rock"], + ["Rage Fist"], + ["Close Combat", "Drain Punch"], + ["Final Gambit", "Rock Tomb", "Taunt"] + ], + "item": ["Focus Sash", "Roseli Berry"], + "nature": "Jolly", + "evs": {"hp": 252, "atk": 4, "spe": 252}, + "teraType": ["Fire", "Normal", "Steel"], + "ability": ["Vital Spirit"] + }, + { + "species": "Annihilape", + "weight": 15, + "moves": [ + ["U-turn"], + ["Close Combat"], + ["Rage Fist", "Shadow Claw"], + ["Final Gambit"] + ], + "item": ["Choice Scarf"], + "nature": "Jolly", + "evs": {"hp": 252, "atk": 4, "spe": 252}, + "teraType": ["Ghost", "Normal"], + "ability": ["Defiant"] + } + ] }, "heatran": { - "weight": 7, - "sets": [ - { - "species": "heatran", - "weight": 35, - "moves": [ - ["magmastorm"], - ["taunt"], - ["protect"], - ["substitute", "earthpower", "terablast"] - ], - "item": ["leftovers"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "calm", - "evs": [252, 0, 4, 0, 252, 0], - "teraType": ["grass"], - "wantsTera": true, - "ability": "flashfire" - }, - { - "species": "heatran", - "weight": 40, - "moves": [["magmastorm"], ["earthpower"], ["flashcannon"], ["terablast"]], - "item": ["assaultvest"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "modest", - "evs": [252, 0, 4, 252, 0, 0], - "teraType": ["grass", "fairy"], - "wantsTera": true, - "ability": "flashfire" - }, - { - "species": "heatran", - "weight": 25, - "moves": [ - ["magmastorm"], - ["flashcannon"], - ["terablast", "stealthrock"], - ["willowisp"] - ], - "item": ["sitrusberry", "rockyhelmet"], - "nature": "bold", - "evs": [252, 0, 252, 4, 0, 0], - "teraType": ["fairy", "grass"], - "wantsTera": true, - "ability": "flamebody" - } - ] + "weight": 7, + "sets": [ + { + "species": "Heatran", + "weight": 35, + "moves": [ + ["Magma Storm"], + ["Taunt"], + ["Protect"], + ["Earth Power", "Substitute", "Tera Blast"] + ], + "item": ["Leftovers"], + "nature": "Calm", + "evs": {"hp": 252, "def": 4, "spd": 252}, + "ivs": {"atk": 0}, + "teraType": ["Grass"], + "wantsTera": true, + "ability": ["Flash Fire"] + }, + { + "species": "Heatran", + "weight": 40, + "moves": [ + ["Magma Storm"], + ["Earth Power"], + ["Flash Cannon"], + ["Tera Blast"] + ], + "item": ["Assault Vest"], + "nature": "Modest", + "evs": {"hp": 252, "def": 4, "spa": 252}, + "ivs": {"atk": 0}, + "teraType": ["Fairy", "Grass"], + "wantsTera": true, + "ability": ["Flash Fire"] + }, + { + "species": "Heatran", + "weight": 25, + "moves": [ + ["Magma Storm"], + ["Flash Cannon"], + ["Stealth Rock", "Tera Blast"], + ["Will-O-Wisp"] + ], + "item": ["Rocky Helmet", "Sitrus Berry"], + "nature": "Bold", + "evs": {"hp": 252, "def": 252, "spa": 4}, + "teraType": ["Fairy", "Grass"], + "wantsTera": true, + "ability": ["Flame Body"] + } + ] }, "breloom": { - "weight": 7, - "sets": [ - { - "species": "breloom", - "weight": 80, - "moves": [ - ["bulletseed"], - ["machpunch"], - ["bulldoze", "rocktomb"], - ["spore"] - ], - "item": ["focussash"], - "nature": "adamant", - "evs": [4, 252, 0, 0, 0, 252], - "teraType": ["grass", "fighting", "ground"], - "ability": "technician" - }, - { - "species": "breloom", - "weight": 10, - "moves": [ - ["bulletseed"], - ["machpunch"], - ["terablast"], - ["spore", "swordsdance"] - ], - "item": ["loadeddice"], - "nature": "adamant", - "evs": [4, 252, 0, 0, 0, 252], - "teraType": ["fire"], - "wantsTera": true, - "ability": "technician" - }, - { - "species": "breloom", - "weight": 10, - "moves": [ - ["substitute"], - ["leechseed", "toxic"], - ["spore"], - ["protect"] - ], - "item": ["toxicorb"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "bold", - "evs": [204, 0, 252, 0, 48, 4], - "teraType": ["steel", "fire"], - "wantsTera": true, - "ability": "poisonheal" - } - ] + "weight": 7, + "sets": [ + { + "species": "Breloom", + "weight": 80, + "moves": [ + ["Bullet Seed"], + ["Mach Punch"], + ["Bulldoze", "Rock Tomb"], + ["Spore"] + ], + "item": ["Focus Sash"], + "nature": "Adamant", + "evs": {"hp": 4, "atk": 252, "spe": 252}, + "teraType": ["Fighting", "Grass", "Ground"], + "ability": ["Technician"] + }, + { + "species": "Breloom", + "weight": 10, + "moves": [ + ["Bullet Seed"], + ["Mach Punch"], + ["Tera Blast"], + ["Spore", "Swords Dance"] + ], + "item": ["Loaded Dice"], + "nature": "Adamant", + "evs": {"hp": 4, "atk": 252, "spe": 252}, + "teraType": ["Fire"], + "wantsTera": true, + "ability": ["Technician"] + }, + { + "species": "Breloom", + "weight": 10, + "moves": [ + ["Substitute"], + ["Leech Seed", "Toxic"], + ["Spore"], + ["Protect"] + ], + "item": ["Toxic Orb"], + "nature": "Bold", + "evs": {"hp": 204, "def": 252, "spd": 48, "spe": 4}, + "ivs": {"atk": 0}, + "teraType": ["Fire", "Steel"], + "wantsTera": true, + "ability": ["Poison Heal"] + } + ] }, "cresselia": { - "weight": 7, - "sets": [ - { - "species": "cresselia", - "weight": 60, - "moves": [["storedpower"], ["moonblast"], ["calmmind"], ["moonlight"]], - "item": ["covertcloak", "leftovers"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "bold", - "evs": [252, 0, 116, 0, 0, 140], - "teraType": ["electric", "poison"], - "wantsTera": true, - "ability": "levitate" - }, - { - "species": "cresselia", - "weight": 40, - "moves": [ - ["icebeam", "moonblast"], - ["thunderwave", "trickroom"], - ["moonlight"], - ["lunardance"] - ], - "item": ["rockyhelmet", "mentalherb"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "bold", - "evs": [252, 0, 252, 4, 0, 0], - "teraType": ["steel"], - "ability": "levitate" - } - ] + "weight": 7, + "sets": [ + { + "species": "Cresselia", + "weight": 60, + "moves": [ + ["Stored Power"], + ["Moonblast"], + ["Calm Mind"], + ["Moonlight"] + ], + "item": ["Covert Cloak", "Leftovers"], + "nature": "Bold", + "evs": {"hp": 252, "def": 116, "spe": 140}, + "ivs": {"atk": 0}, + "teraType": ["Electric", "Poison"], + "wantsTera": true, + "ability": ["Levitate"] + }, + { + "species": "Cresselia", + "weight": 40, + "moves": [ + ["Ice Beam", "Moonblast"], + ["Thunder Wave", "Trick Room"], + ["Moonlight"], + ["Lunar Dance"] + ], + "item": ["Mental Herb", "Rocky Helmet"], + "nature": "Bold", + "evs": {"hp": 252, "def": 252, "spa": 4}, + "ivs": {"atk": 0}, + "teraType": ["Steel"], + "ability": ["Levitate"] + } + ] }, "dondozo": { - "weight": 7, - "sets": [ - { - "species": "dondozo", - "weight": 60, - "moves": [ - ["fissure"], - ["wavecrash", "heavyslam"], - ["protect", "rest"], - ["yawn"] - ], - "item": ["leftovers"], - "nature": "impish", - "evs": [244, 0, 148, 0, 116, 0], - "teraType": ["grass", "fairy", "steel"], - "ability": "unaware" - }, - { - "species": "dondozo", - "weight": 20, - "moves": [ - ["fissure"], - ["wavecrash", "bodypress"], - ["protect", "rest"], - ["yawn"] - ], - "item": ["leftovers"], - "nature": "impish", - "evs": [244, 0, 252, 0, 12, 0], - "teraType": ["grass", "fairy", "steel"], - "ability": "unaware" - }, - { - "species": "dondozo", - "weight": 10, - "moves": [ - ["bodypress", "earthquake", "fissure", "avalanche"], - ["wavecrash"], - ["rest"], - ["yawn", "sleeptalk"] - ], - "item": ["rockyhelmet"], - "nature": "impish", - "evs": [244, 0, 252, 0, 12, 0], - "teraType": ["grass", "fairy", "steel"], - "ability": "unaware" - }, - { - "species": "dondozo", - "weight": 5, - "moves": [ - ["wavecrash"], - ["avalanche"], - ["bodypress", "heavyslam", "earthquake"], - ["fissure"] - ], - "item": ["assaultvest"], - "nature": "careful", - "evs": [44, 212, 0, 0, 252, 0], - "teraType": ["grass", "fairy", "steel", "ground"], - "ability": "unaware" - }, - { - "species": "dondozo", - "weight": 5, - "moves": [["curse"], ["rest"], ["wavecrash"], ["fissure"]], - "item": ["chestoberry"], - "nature": "careful", - "evs": [252, 0, 4, 0, 252, 0], - "teraType": ["grass", "fairy", "steel"], - "ability": "unaware" - } - ] + "weight": 7, + "sets": [ + { + "species": "Dondozo", + "weight": 60, + "moves": [ + ["Fissure"], + ["Heavy Slam", "Wave Crash"], + ["Protect", "Rest"], + ["Yawn"] + ], + "item": ["Leftovers"], + "nature": "Impish", + "evs": {"hp": 244, "def": 148, "spd": 116}, + "teraType": ["Fairy", "Grass", "Steel"], + "ability": ["Unaware"] + }, + { + "species": "Dondozo", + "weight": 20, + "moves": [ + ["Fissure"], + ["Body Press", "Wave Crash"], + ["Protect", "Rest"], + ["Yawn"] + ], + "item": ["Leftovers"], + "nature": "Impish", + "evs": {"hp": 244, "def": 252, "spd": 12}, + "teraType": ["Fairy", "Grass", "Steel"], + "ability": ["Unaware"] + }, + { + "species": "Dondozo", + "weight": 10, + "moves": [ + ["Avalanche", "Body Press", "Earthquake", "Fissure"], + ["Wave Crash"], + ["Rest"], + ["Sleep Talk", "Yawn"] + ], + "item": ["Rocky Helmet"], + "nature": "Impish", + "evs": {"hp": 244, "def": 252, "spd": 12}, + "teraType": ["Fairy", "Grass", "Steel"], + "ability": ["Unaware"] + }, + { + "species": "Dondozo", + "weight": 5, + "moves": [ + ["Wave Crash"], + ["Avalanche"], + ["Body Press", "Earthquake", "Heavy Slam"], + ["Fissure"] + ], + "item": ["Assault Vest"], + "nature": "Careful", + "evs": {"hp": 44, "atk": 212, "spd": 252}, + "teraType": ["Fairy", "Grass", "Ground", "Steel"], + "ability": ["Unaware"] + }, + { + "species": "Dondozo", + "weight": 5, + "moves": [ + ["Curse"], + ["Rest"], + ["Wave Crash"], + ["Fissure"] + ], + "item": ["Chesto Berry"], + "nature": "Careful", + "evs": {"hp": 252, "def": 4, "spd": 252}, + "teraType": ["Fairy", "Grass", "Steel"], + "ability": ["Unaware"] + } + ] }, "hippowdon": { - "weight": 7, - "sets": [ - { - "species": "hippowdon", - "weight": 100, - "moves": [ - ["stealthrock"], - ["yawn"], - ["earthquake"], - ["whirlwind", "slackoff"] - ], - "item": ["sitrusberry", "leftovers"], - "nature": "careful", - "evs": [252, 0, 4, 0, 252, 0], - "teraType": ["steel", "water"], - "ability": "sandstream" - } - ] + "weight": 7, + "sets": [ + { + "species": "Hippowdon", + "weight": 100, + "moves": [ + ["Stealth Rock"], + ["Yawn"], + ["Earthquake"], + ["Slack Off", "Whirlwind"] + ], + "item": ["Leftovers", "Sitrus Berry"], + "nature": "Careful", + "evs": {"hp": 252, "def": 4, "spd": 252}, + "teraType": ["Steel", "Water"], + "ability": ["Sand Stream"] + } + ] }, "mimikyu": { - "weight": 7, - "sets": [ - { - "species": "mimikyu", - "weight": 25, - "moves": [["playrough"], ["shadowsneak"], ["curse"], ["painsplit"]], - "item": ["lifeorb"], - "nature": "jolly", - "evs": [4, 156, 92, 0, 4, 252], - "teraType": ["ghost", "fairy"], - "ability": "disguise" - }, - { - "species": "mimikyu", - "weight": 15, - "moves": [["playrough"], ["shadowsneak"], ["curse"], ["trickroom"]], - "gender": "f", - "item": ["lifeorb"], - "nature": "adamant", - "evs": [36, 236, 180, 0, 4, 52], - "teraType": ["fairy", "ghost"], - "ability": "disguise" - }, - { - "species": "mimikyu", - "weight": 25, - "moves": [ - ["playrough"], - ["shadowsneak"], - ["drainpunch", "shadowclaw"], - ["swordsdance"] - ], - "item": ["lifeorb"], - "nature": "jolly", - "evs": [4, 156, 92, 0, 4, 252], - "teraType": ["ghost", "fairy"], - "ability": "disguise" - }, - { - "species": "mimikyu", - "weight": 15, - "moves": [["playrough"], ["shadowclaw"], ["willowisp"], ["trick"]], - "item": ["choicescarf"], - "nature": "jolly", - "evs": [4, 252, 0, 0, 0, 252], - "teraType": ["fairy", "ghost"], - "ability": "disguise" - }, - { - "species": "mimikyu", - "weight": 5, - "moves": [ - ["playrough"], - ["shadowsneak"], - ["shadowclaw", "painsplit"], - ["curse"] - ], - "item": ["covertcloak"], - "nature": "jolly", - "evs": [36, 220, 0, 0, 0, 252], - "teraType": ["ghost", "fairy"], - "ability": "disguise" - }, - { - "species": "mimikyu", - "weight": 5, - "moves": [["playrough"], ["shadowsneak"], ["woodhammer"], ["curse"]], - "item": ["lifeorb"], - "nature": "jolly", - "evs": [4, 156, 92, 0, 4, 252], - "teraType": ["grass"], - "ability": "disguise" - }, - { - "species": "mimikyu", - "weight": 5, - "moves": [["playrough"], ["curse"], ["trickroom"], ["shadowsneak"]], - "gender": "f", - "item": ["covertcloak"], - "nature": "adamant", - "evs": [36, 236, 180, 0, 4, 52], - "teraType": ["fairy", "ghost"], - "ability": "disguise" - }, - { - "species": "mimikyu", - "weight": 5, - "moves": [ - ["shadowclaw", "shadowsneak"], - ["substitute"], - ["curse"], - ["painsplit"] - ], - "item": ["figyberry"], - "nature": "jolly", - "evs": [4, 0, 252, 0, 0, 252], - "teraType": ["ghost"], - "ability": "disguise" - } - ] + "weight": 7, + "sets": [ + { + "species": "Mimikyu", + "weight": 25, + "moves": [ + ["Play Rough"], + ["Shadow Sneak"], + ["Curse"], + ["Pain Split"] + ], + "item": ["Life Orb"], + "nature": "Jolly", + "evs": {"hp": 4, "atk": 156, "def": 92, "spd": 4, "spe": 252}, + "teraType": ["Fairy", "Ghost"], + "ability": ["Disguise"] + }, + { + "species": "Mimikyu", + "weight": 15, + "moves": [ + ["Play Rough"], + ["Shadow Sneak"], + ["Curse"], + ["Trick Room"] + ], + "gender": "F", + "item": ["Life Orb"], + "nature": "Adamant", + "evs": {"hp": 36, "atk": 236, "def": 180, "spd": 4, "spe": 52}, + "teraType": ["Fairy", "Ghost"], + "ability": ["Disguise"] + }, + { + "species": "Mimikyu", + "weight": 25, + "moves": [ + ["Play Rough"], + ["Shadow Sneak"], + ["Drain Punch", "Shadow Claw"], + ["Swords Dance"] + ], + "item": ["Life Orb"], + "nature": "Jolly", + "evs": {"hp": 4, "atk": 156, "def": 92, "spd": 4, "spe": 252}, + "teraType": ["Fairy", "Ghost"], + "ability": ["Disguise"] + }, + { + "species": "Mimikyu", + "weight": 15, + "moves": [ + ["Play Rough"], + ["Shadow Claw"], + ["Will-O-Wisp"], + ["Trick"] + ], + "item": ["Choice Scarf"], + "nature": "Jolly", + "evs": {"hp": 4, "atk": 252, "spe": 252}, + "teraType": ["Fairy", "Ghost"], + "ability": ["Disguise"] + }, + { + "species": "Mimikyu", + "weight": 5, + "moves": [ + ["Play Rough"], + ["Shadow Sneak"], + ["Pain Split", "Shadow Claw"], + ["Curse"] + ], + "item": ["Covert Cloak"], + "nature": "Jolly", + "evs": {"hp": 36, "atk": 220, "spe": 252}, + "teraType": ["Fairy", "Ghost"], + "ability": ["Disguise"] + }, + { + "species": "Mimikyu", + "weight": 5, + "moves": [ + ["Play Rough"], + ["Shadow Sneak"], + ["Wood Hammer"], + ["Curse"] + ], + "item": ["Life Orb"], + "nature": "Jolly", + "evs": {"hp": 4, "atk": 156, "def": 92, "spd": 4, "spe": 252}, + "teraType": ["Grass"], + "ability": ["Disguise"] + }, + { + "species": "Mimikyu", + "weight": 5, + "moves": [ + ["Play Rough"], + ["Curse"], + ["Trick Room"], + ["Shadow Sneak"] + ], + "gender": "F", + "item": ["Covert Cloak"], + "nature": "Adamant", + "evs": {"hp": 36, "atk": 236, "def": 180, "spd": 4, "spe": 52}, + "teraType": ["Fairy", "Ghost"], + "ability": ["Disguise"] + }, + { + "species": "Mimikyu", + "weight": 5, + "moves": [ + ["Shadow Claw", "Shadow Sneak"], + ["Substitute"], + ["Curse"], + ["Pain Split"] + ], + "item": ["Figy Berry"], + "nature": "Jolly", + "evs": {"hp": 4, "def": 252, "spe": 252}, + "teraType": ["Ghost"], + "ability": ["Disguise"] + } + ] }, "rotomwash": { - "weight": 7, - "sets": [ - { - "species": "rotomwash", - "weight": 35, - "moves": [["hydropump"], ["voltswitch"], ["trick"], ["willowisp"]], - "item": ["choicescarf"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "timid", - "evs": [0, 0, 0, 252, 4, 252], - "teraType": ["steel", "ghost"], - "ability": "levitate" - }, - { - "species": "rotomwash", - "weight": 15, - "moves": [["hydropump"], ["thunderbolt"], ["voltswitch"], ["trick"]], - "item": ["choicespecs"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "timid", - "evs": [0, 0, 0, 252, 4, 252], - "teraType": ["electric"], - "ability": "levitate" - }, - { - "species": "rotomwash", - "weight": 45, - "moves": [["hydropump"], ["voltswitch"], ["foulplay"], ["willowisp"]], - "item": ["rockyhelmet", "sitrusberry"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "bold", - "evs": [252, 0, 252, 4, 0, 0], - "teraType": ["steel", "ghost", "fairy"], - "ability": "levitate" - }, - { - "species": "rotomwash", - "weight": 5, - "moves": [ - ["discharge", "thunderbolt"], - ["terablast"], - ["nastyplot"], - ["substitute"] - ], - "item": ["leftovers"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "timid", - "evs": [252, 0, 0, 4, 0, 252], - "teraType": ["steel"], - "wantsTera": true, - "ability": "levitate" - } - ] + "weight": 7, + "sets": [ + { + "species": "Rotom-Wash", + "weight": 35, + "moves": [ + ["Hydro Pump"], + ["Volt Switch"], + ["Trick"], + ["Will-O-Wisp"] + ], + "item": ["Choice Scarf"], + "nature": "Timid", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "ivs": {"atk": 0}, + "teraType": ["Ghost", "Steel"], + "ability": ["Levitate"] + }, + { + "species": "Rotom-Wash", + "weight": 15, + "moves": [ + ["Hydro Pump"], + ["Thunderbolt"], + ["Volt Switch"], + ["Trick"] + ], + "item": ["Choice Specs"], + "nature": "Timid", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "ivs": {"atk": 0}, + "teraType": ["Electric"], + "ability": ["Levitate"] + }, + { + "species": "Rotom-Wash", + "weight": 45, + "moves": [ + ["Hydro Pump"], + ["Volt Switch"], + ["Foul Play"], + ["Will-O-Wisp"] + ], + "item": ["Rocky Helmet", "Sitrus Berry"], + "nature": "Bold", + "evs": {"hp": 252, "def": 252, "spa": 4}, + "ivs": {"atk": 0}, + "teraType": ["Fairy", "Ghost", "Steel"], + "ability": ["Levitate"] + }, + { + "species": "Rotom-Wash", + "weight": 5, + "moves": [ + ["Discharge", "Thunderbolt"], + ["Tera Blast"], + ["Nasty Plot"], + ["Substitute"] + ], + "item": ["Leftovers"], + "nature": "Timid", + "evs": {"hp": 252, "spa": 4, "spe": 252}, + "ivs": {"atk": 0}, + "teraType": ["Steel"], + "wantsTera": true, + "ability": ["Levitate"] + } + ] }, "basculegion": { - "weight": 7, - "sets": [ - { - "species": "basculegion", - "weight": 20, - "moves": [ - ["lastrespects"], - ["wavecrash"], - ["aquajet", "sleeptalk"], - ["flipturn"] - ], - "gender": "m", - "item": ["choicescarf"], - "nature": "adamant", - "evs": [0, 252, 0, 4, 0, 252], - "teraType": ["fairy", "normal", "fighting", "water", "ghost"], - "ability": "adaptability" - }, - { - "species": "basculegion", - "weight": 10, - "moves": [["lastrespects"], ["wavecrash"], ["flipturn"], ["terablast"]], - "gender": "m", - "item": ["choicescarf"], - "nature": "adamant", - "evs": [0, 252, 0, 4, 0, 252], - "teraType": ["fairy", "fighting"], - "wantsTera": true, - "ability": "adaptability" - }, - { - "species": "basculegion", - "weight": 40, - "moves": [ - ["wavecrash"], - ["aquajet"], - ["agility", "endeavor"], - ["lastrespects"] - ], - "gender": "m", - "item": ["focussash"], - "nature": "adamant", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["normal", "ghost", "water"], - "ability": "adaptability" - }, - { - "species": "basculegion", - "weight": 20, - "moves": [ - ["wavecrash"], - ["aquajet"], - ["agility", "terablast"], - ["lastrespects"] - ], - "gender": "m", - "item": ["focussash"], - "nature": "adamant", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["fairy"], - "wantsTera": true, - "ability": "adaptability" - }, - { - "species": "basculegion", - "weight": 5, - "moves": [["wavecrash"], ["aquajet"], ["substitute"], ["lastrespects"]], - "gender": "m", - "item": ["brightpowder"], - "nature": "adamant", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["normal", "ghost", "water"], - "ability": "adaptability" - }, - { - "species": "basculegion", - "weight": 5, - "moves": [ - ["wavecrash"], - ["aquajet"], - ["flipturn", "liquidation", "substitute"], - ["lastrespects"] - ], - "gender": "m", - "item": ["lifeorb"], - "nature": "adamant", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["water"], - "ability": "swiftswim" - } - ] + "weight": 7, + "sets": [ + { + "species": "Basculegion", + "weight": 20, + "moves": [ + ["Last Respects"], + ["Wave Crash"], + ["Aqua Jet", "Sleep Talk"], + ["Flip Turn"] + ], + "gender": "M", + "item": ["Choice Scarf"], + "nature": "Adamant", + "evs": {"atk": 252, "spa": 4, "spe": 252}, + "teraType": ["Fairy", "Fighting", "Ghost", "Normal", "Water"], + "ability": ["Adaptability"] + }, + { + "species": "Basculegion", + "weight": 10, + "moves": [ + ["Last Respects"], + ["Wave Crash"], + ["Flip Turn"], + ["Tera Blast"] + ], + "gender": "M", + "item": ["Choice Scarf"], + "nature": "Adamant", + "evs": {"atk": 252, "spa": 4, "spe": 252}, + "teraType": ["Fairy", "Fighting"], + "wantsTera": true, + "ability": ["Adaptability"] + }, + { + "species": "Basculegion", + "weight": 40, + "moves": [ + ["Wave Crash"], + ["Aqua Jet"], + ["Agility", "Endeavor"], + ["Last Respects"] + ], + "gender": "M", + "item": ["Focus Sash"], + "nature": "Adamant", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Ghost", "Normal", "Water"], + "ability": ["Adaptability"] + }, + { + "species": "Basculegion", + "weight": 20, + "moves": [ + ["Wave Crash"], + ["Aqua Jet"], + ["Agility", "Tera Blast"], + ["Last Respects"] + ], + "gender": "M", + "item": ["Focus Sash"], + "nature": "Adamant", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Fairy"], + "wantsTera": true, + "ability": ["Adaptability"] + }, + { + "species": "Basculegion", + "weight": 5, + "moves": [ + ["Wave Crash"], + ["Aqua Jet"], + ["Substitute"], + ["Last Respects"] + ], + "gender": "M", + "item": ["Bright Powder"], + "nature": "Adamant", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Ghost", "Normal", "Water"], + "ability": ["Adaptability"] + }, + { + "species": "Basculegion", + "weight": 5, + "moves": [ + ["Wave Crash"], + ["Aqua Jet"], + ["Flip Turn", "Liquidation", "Substitute"], + ["Last Respects"] + ], + "gender": "M", + "item": ["Life Orb"], + "nature": "Adamant", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Water"], + "ability": ["Swift Swim"] + } + ] }, "corviknight": { - "weight": 6, - "sets": [ - { - "species": "corviknight", - "weight": 50, - "moves": [ - ["uturn"], - ["roost"], - ["bodypress", "ironhead"], - ["taunt", "bravebird"] - ], - "item": ["rockyhelmet", "leftovers"], - "nature": "impish", - "evs": [252, 0, 252, 0, 4, 0], - "teraType": ["dragon", "fighting", "water"], - "ability": "mirrorarmor" - }, - { - "species": "corviknight", - "weight": 40, - "moves": [ - ["irondefense"], - ["bodypress"], - ["roost"], - ["taunt", "ironhead", "uturn"] - ], - "item": ["rockyhelmet", "sitrusberry", "safetygoggles", "covertcloak"], - "nature": "impish", - "evs": [252, 0, 252, 0, 4, 0], - "teraType": ["fighting", "water", "dragon"], - "ability": "mirrorarmor" - }, - { - "species": "corviknight", - "weight": 10, - "moves": [["bulkup"], ["taunt"], ["roost"], ["ironhead", "bravebird"]], - "item": ["rockyhelmet", "sitrusberry", "safetygoggles", "covertcloak"], - "nature": "impish", - "evs": [252, 0, 252, 0, 4, 0], - "teraType": ["water", "dragon"], - "ability": "mirrorarmor" - } - ] + "weight": 6, + "sets": [ + { + "species": "Corviknight", + "weight": 50, + "moves": [ + ["U-turn"], + ["Roost"], + ["Body Press", "Iron Head"], + ["Brave Bird", "Taunt"] + ], + "item": ["Leftovers", "Rocky Helmet"], + "nature": "Impish", + "evs": {"hp": 252, "def": 252, "spd": 4}, + "teraType": ["Dragon", "Fighting", "Water"], + "ability": ["Mirror Armor"] + }, + { + "species": "Corviknight", + "weight": 40, + "moves": [ + ["Iron Defense"], + ["Body Press"], + ["Roost"], + ["Iron Head", "Taunt", "U-turn"] + ], + "item": ["Covert Cloak", "Rocky Helmet", "Safety Goggles", "Sitrus Berry"], + "nature": "Impish", + "evs": {"hp": 252, "def": 252, "spd": 4}, + "teraType": ["Dragon", "Fighting", "Water"], + "ability": ["Mirror Armor"] + }, + { + "species": "Corviknight", + "weight": 10, + "moves": [ + ["Bulk Up"], + ["Taunt"], + ["Roost"], + ["Brave Bird", "Iron Head"] + ], + "item": ["Covert Cloak", "Rocky Helmet", "Safety Goggles", "Sitrus Berry"], + "nature": "Impish", + "evs": {"hp": 252, "def": 252, "spd": 4}, + "teraType": ["Dragon", "Water"], + "ability": ["Mirror Armor"] + } + ] }, "zapdos": { - "weight": 6, - "sets": [ - { - "species": "zapdos", - "weight": 75, - "moves": [["voltswitch"], ["roost"], ["hurricane"], ["discharge"]], - "item": ["rockyhelmet", "heavydutyboots", "sitrusberry"], - "nature": "bold", - "ivs": [31, 0, 31, 31, 31, 31], - "evs": [252, 0, 252, 0, 4, 0], - "teraType": ["water", "steel"], - "ability": "static" - }, - { - "species": "zapdos", - "weight": 10, - "moves": [["voltswitch"], ["roost"], ["hurricane"], ["terablast"]], - "item": ["rockyhelmet", "heavydutyboots", "sitrusberry"], - "nature": "bold", - "ivs": [31, 0, 31, 31, 31, 31], - "evs": [252, 0, 252, 0, 4, 0], - "teraType": ["ice"], - "wantsTera": true, - "ability": "static" - }, - { - "species": "zapdos", - "weight": 10, - "moves": [["thunderbolt"], ["hurricane"], ["voltswitch"], ["terablast"]], - "item": ["choicescarf"], - "nature": "timid", - "ivs": [31, 0, 31, 31, 31, 31], - "evs": [0, 0, 4, 252, 0, 252], - "teraType": ["ice", "fairy"], - "wantsTera": true, - "ability": "static" - }, - { - "species": "zapdos", - "weight": 5, - "moves": [["thunderbolt"], ["hurricane"], ["voltswitch"], ["heatwave"]], - "item": ["choicescarf", "choicespecs"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "timid", - "evs": [0, 0, 4, 252, 0, 252], - "teraType": ["electric"], - "ability": "static" - } - ] + "weight": 6, + "sets": [ + { + "species": "Zapdos", + "weight": 75, + "moves": [ + ["Volt Switch"], + ["Roost"], + ["Hurricane"], + ["Discharge"] + ], + "item": ["Heavy-Duty Boots", "Rocky Helmet", "Sitrus Berry"], + "nature": "Bold", + "evs": {"hp": 252, "def": 252, "spd": 4}, + "ivs": {"atk": 0}, + "teraType": ["Steel", "Water"], + "ability": ["Static"] + }, + { + "species": "Zapdos", + "weight": 10, + "moves": [ + ["Volt Switch"], + ["Roost"], + ["Hurricane"], + ["Tera Blast"] + ], + "item": ["Heavy-Duty Boots", "Rocky Helmet", "Sitrus Berry"], + "nature": "Bold", + "evs": {"hp": 252, "def": 252, "spd": 4}, + "ivs": {"atk": 0}, + "teraType": ["Ice"], + "wantsTera": true, + "ability": ["Static"] + }, + { + "species": "Zapdos", + "weight": 10, + "moves": [ + ["Thunderbolt"], + ["Hurricane"], + ["Volt Switch"], + ["Tera Blast"] + ], + "item": ["Choice Scarf"], + "nature": "Timid", + "evs": {"def": 4, "spa": 252, "spe": 252}, + "ivs": {"atk": 0}, + "teraType": ["Fairy", "Ice"], + "wantsTera": true, + "ability": ["Static"] + }, + { + "species": "Zapdos", + "weight": 5, + "moves": [ + ["Thunderbolt"], + ["Hurricane"], + ["Volt Switch"], + ["Heat Wave"] + ], + "item": ["Choice Scarf", "Choice Specs"], + "nature": "Timid", + "evs": {"def": 4, "spa": 252, "spe": 252}, + "ivs": {"atk": 0}, + "teraType": ["Electric"], + "ability": ["Static"] + } + ] }, "ursaluna": { - "weight": 6, - "sets": [ - { - "species": "ursaluna", - "weight": 85, - "moves": [["facade"], ["earthquake"], ["trailblaze"], ["swordsdance"]], - "item": ["flameorb"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["normal", "water", "grass"], - "ability": "guts" - }, - { - "species": "ursaluna", - "weight": 15, - "moves": [["earthquake"], ["avalanche"], ["yawn"], ["protect"]], - "item": ["leftovers"], - "nature": "impish", - "evs": [156, 0, 252, 0, 100, 0], - "teraType": ["water", "fairy"], - "ability": "bulletproof" - } - ] + "weight": 6, + "sets": [ + { + "species": "Ursaluna", + "weight": 85, + "moves": [ + ["Facade"], + ["Earthquake"], + ["Trailblaze"], + ["Swords Dance"] + ], + "item": ["Flame Orb"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Grass", "Normal", "Water"], + "ability": ["Guts"] + }, + { + "species": "Ursaluna", + "weight": 15, + "moves": [ + ["Earthquake"], + ["Avalanche"], + ["Yawn"], + ["Protect"] + ], + "item": ["Leftovers"], + "nature": "Impish", + "evs": {"hp": 156, "def": 252, "spd": 100}, + "teraType": ["Fairy", "Water"], + "ability": ["Bulletproof"] + } + ] }, "goodrahisui": { - "weight": 6, - "sets": [ - { - "species": "goodrahisui", - "weight": 60, - "moves": [ - ["flashcannon", "heavyslam"], - ["dracometeor", "icebeam"], - ["acidspray", "thunderbolt", "flamethrower"], - ["earthquake"] - ], - "item": ["assaultvest"], - "nature": "quiet", - "evs": [252, 0, 0, 252, 4, 0], - "teraType": ["flying", "fairy", "water"], - "ability": "sapsipper" - }, - { - "species": "goodrahisui", - "weight": 40, - "moves": [ - ["acidarmor"], - ["bodypress"], - ["heavyslam"], - ["protect", "dracometeor", "icebeam"] - ], - "item": ["leftovers"], - "nature": "careful", - "evs": [252, 0, 4, 0, 252, 0], - "teraType": ["flying", "fairy"], - "ability": "shellarmor" - } - ] + "weight": 6, + "sets": [ + { + "species": "Goodra-Hisui", + "weight": 60, + "moves": [ + ["Flash Cannon", "Heavy Slam"], + ["Draco Meteor", "Ice Beam"], + ["Acid Spray", "Flamethrower", "Thunderbolt"], + ["Earthquake"] + ], + "item": ["Assault Vest"], + "nature": "Quiet", + "evs": {"hp": 252, "spa": 252, "spd": 4}, + "teraType": ["Fairy", "Flying", "Water"], + "ability": ["Sap Sipper"] + }, + { + "species": "Goodra-Hisui", + "weight": 40, + "moves": [ + ["Acid Armor"], + ["Body Press"], + ["Heavy Slam"], + ["Draco Meteor", "Ice Beam", "Protect"] + ], + "item": ["Leftovers"], + "nature": "Careful", + "evs": {"hp": 252, "def": 4, "spd": 252}, + "teraType": ["Fairy", "Flying"], + "ability": ["Shell Armor"] + } + ] }, "magnezone": { - "weight": 6, - "sets": [ - { - "species": "magnezone", - "weight": 70, - "moves": [["thunderbolt"], ["flashcannon"], ["voltswitch"], ["terablast"]], - "item": ["assaultvest"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "modest", - "evs": [252, 0, 0, 4, 252, 0], - "teraType": ["fairy", "water"], - "wantsTera": true, - "ability": "analytic" - }, - { - "species": "magnezone", - "weight": 20, - "moves": [["thunderbolt"], ["flashcannon"], ["voltswitch"], ["terablast"]], - "item": ["choicespecs"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "modest", - "evs": [252, 0, 0, 4, 252, 0], - "teraType": ["fairy", "water"], - "wantsTera": true, - "ability": "sturdy" - }, - { - "species": "magnezone", - "weight": 10, - "moves": [ - ["thunderbolt"], - ["flashcannon", "steelbeam"], - ["voltswitch"], - ["mirrorcoat"] - ], - "item": ["custapberry"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "modest", - "evs": [252, 0, 0, 4, 252, 0], - "teraType": ["flying", "water"], - "wantsTera": true, - "ability": "sturdy" - } - ] + "weight": 6, + "sets": [ + { + "species": "Magnezone", + "weight": 70, + "moves": [ + ["Thunderbolt"], + ["Flash Cannon"], + ["Volt Switch"], + ["Tera Blast"] + ], + "item": ["Assault Vest"], + "nature": "Modest", + "evs": {"hp": 252, "spa": 4, "spd": 252}, + "ivs": {"atk": 0}, + "teraType": ["Fairy", "Water"], + "wantsTera": true, + "ability": ["Analytic"] + }, + { + "species": "Magnezone", + "weight": 20, + "moves": [ + ["Thunderbolt"], + ["Flash Cannon"], + ["Volt Switch"], + ["Tera Blast"] + ], + "item": ["Choice Specs"], + "nature": "Modest", + "evs": {"hp": 252, "spa": 4, "spd": 252}, + "ivs": {"atk": 0}, + "teraType": ["Fairy", "Water"], + "wantsTera": true, + "ability": ["Sturdy"] + }, + { + "species": "Magnezone", + "weight": 10, + "moves": [ + ["Thunderbolt"], + ["Flash Cannon", "Steel Beam"], + ["Volt Switch"], + ["Mirror Coat"] + ], + "item": ["Custap Berry"], + "nature": "Modest", + "evs": {"hp": 252, "spa": 4, "spd": 252}, + "ivs": {"atk": 0}, + "teraType": ["Flying", "Water"], + "wantsTera": true, + "ability": ["Sturdy"] + } + ] }, "ogerpon": { - "weight": 6, - "sets": [ - { - "species": "ogerpon", - "weight": 100, - "moves": [ - ["ivycudgel"], - ["uturn"], - ["playrough"], - ["knockoff", "stompingtantrum"] - ], - "item": ["choiceband", "focussash"], - "nature": "jolly", - "evs": [0, 252, 4, 0, 0, 252], - "teraType": ["grass"], - "ability": "defiant" - } - ] + "weight": 6, + "sets": [ + { + "species": "Ogerpon", + "weight": 100, + "moves": [ + ["Ivy Cudgel"], + ["U-turn"], + ["Play Rough"], + ["Knock Off", "Stomping Tantrum"] + ], + "item": ["Choice Band", "Focus Sash"], + "nature": "Jolly", + "evs": {"atk": 252, "def": 4, "spe": 252}, + "teraType": ["Grass"], + "ability": ["Defiant"] + } + ] }, "gliscor": { - "weight": 6, - "sets": [ - { - "species": "gliscor", - "weight": 100, - "moves": [["substitute"], ["toxic"], ["protect"], ["earthquake"]], - "item": ["toxicorb"], - "nature": "impish", - "evs": [244, 0, 108, 0, 0, 156], - "teraType": ["water"], - "wantsTera": true, - "ability": "poisonheal" - } - ] + "weight": 6, + "sets": [ + { + "species": "Gliscor", + "weight": 100, + "moves": [ + ["Substitute"], + ["Toxic"], + ["Protect"], + ["Earthquake"] + ], + "item": ["Toxic Orb"], + "nature": "Impish", + "evs": {"hp": 244, "def": 108, "spe": 156}, + "teraType": ["Water"], + "wantsTera": true, + "ability": ["Poison Heal"] + } + ] }, "ironmoth": { - "weight": 6, - "sets": [ - { - "species": "ironmoth", - "weight": 20, - "moves": [ - ["fierydance"], - ["sludgewave"], - ["energyball"], - ["dazzlinggleam", "overheat", "psychic"] - ], - "item": ["boosterenergy", "choicespecs", "assaultvest"], - "nature": "timid", - "evs": [4, 0, 0, 252, 0, 252], - "teraType": ["grass", "water", "fire", "fairy"], - "ability": "quarkdrive" - }, - { - "species": "ironmoth", - "weight": 20, - "moves": [ - ["fierydance"], - ["sludgewave"], - ["energyball"], - ["dazzlinggleam", "overheat", "psychic", "terablast"] - ], - "item": ["boosterenergy", "choicespecs", "assaultvest"], - "nature": "timid", - "evs": [4, 0, 0, 252, 0, 252], - "teraType": ["water", "fairy"], - "wantsTera": true, - "ability": "quarkdrive" - }, - { - "species": "ironmoth", - "weight": 20, - "moves": [ - ["toxicspikes"], - ["fierydance"], - ["morningsun"], - ["whirlwind", "sludgewave", "terablast"] - ], - "item": ["boosterenergy", "covertcloak", "passhoberry", "sitrusberry"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "timid", - "evs": [244, 0, 52, 4, 12, 196], - "teraType": ["water", "grass", "fairy"], - "ability": "quarkdrive" - }, - { - "species": "ironmoth", - "weight": 20, - "moves": [["toxicspikes"], ["fierydance"], ["morningsun"], ["whirlwind"]], - "item": ["blacksludge", "heavydutyboots"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "calm", - "evs": [196, 0, 0, 0, 132, 180], - "teraType": ["poison", "grass"], - "ability": "quarkdrive" - }, - { - "species": "ironmoth", - "weight": 10, - "moves": [ - ["fierydance"], - ["sludgewave", "acidspray"], - ["energyball", "psychic"], - ["dazzlinggleam", "terablast"] - ], - "item": ["boosterenergy"], - "nature": "timid", - "evs": [0, 0, 124, 132, 0, 252], - "teraType": ["water"], - "wantsTera": true, - "ability": "quarkdrive" - }, - { - "species": "ironmoth", - "weight": 10, - "moves": [ - ["fierydance"], - ["sludgewave", "acidspray"], - ["energyball"], - ["dazzlinggleam", "psychic"] - ], - "item": ["boosterenergy"], - "nature": "timid", - "evs": [0, 0, 124, 132, 0, 252], - "teraType": ["grass", "fire", "poison"], - "ability": "quarkdrive" - } - ] + "weight": 6, + "sets": [ + { + "species": "Iron Moth", + "weight": 20, + "moves": [ + ["Fiery Dance"], + ["Sludge Wave"], + ["Energy Ball"], + ["Dazzling Gleam", "Overheat", "Psychic"] + ], + "item": ["Assault Vest", "Booster Energy", "Choice Specs"], + "nature": "Timid", + "evs": {"hp": 4, "spa": 252, "spe": 252}, + "teraType": ["Fairy", "Fire", "Grass", "Water"], + "ability": ["Quark Drive"] + }, + { + "species": "Iron Moth", + "weight": 20, + "moves": [ + ["Fiery Dance"], + ["Sludge Wave"], + ["Energy Ball"], + ["Dazzling Gleam", "Overheat", "Psychic", "Tera Blast"] + ], + "item": ["Assault Vest", "Booster Energy", "Choice Specs"], + "nature": "Timid", + "evs": {"hp": 4, "spa": 252, "spe": 252}, + "teraType": ["Fairy", "Water"], + "wantsTera": true, + "ability": ["Quark Drive"] + }, + { + "species": "Iron Moth", + "weight": 20, + "moves": [ + ["Toxic Spikes"], + ["Fiery Dance"], + ["Morning Sun"], + ["Sludge Wave", "Tera Blast", "Whirlwind"] + ], + "item": ["Booster Energy", "Covert Cloak", "Passho Berry", "Sitrus Berry"], + "nature": "Timid", + "evs": {"hp": 244, "def": 52, "spa": 4, "spd": 12, "spe": 196}, + "ivs": {"atk": 0}, + "teraType": ["Fairy", "Grass", "Water"], + "ability": ["Quark Drive"] + }, + { + "species": "Iron Moth", + "weight": 20, + "moves": [ + ["Toxic Spikes"], + ["Fiery Dance"], + ["Morning Sun"], + ["Whirlwind"] + ], + "item": ["Black Sludge", "Heavy-Duty Boots"], + "nature": "Calm", + "evs": {"hp": 196, "spd": 132, "spe": 180}, + "ivs": {"atk": 0}, + "teraType": ["Grass", "Poison"], + "ability": ["Quark Drive"] + }, + { + "species": "Iron Moth", + "weight": 10, + "moves": [ + ["Fiery Dance"], + ["Acid Spray", "Sludge Wave"], + ["Energy Ball", "Psychic"], + ["Dazzling Gleam", "Tera Blast"] + ], + "item": ["Booster Energy"], + "nature": "Timid", + "evs": {"def": 124, "spa": 132, "spe": 252}, + "teraType": ["Water"], + "wantsTera": true, + "ability": ["Quark Drive"] + }, + { + "species": "Iron Moth", + "weight": 10, + "moves": [ + ["Fiery Dance"], + ["Acid Spray", "Sludge Wave"], + ["Energy Ball"], + ["Dazzling Gleam", "Psychic"] + ], + "item": ["Booster Energy"], + "nature": "Timid", + "evs": {"def": 124, "spa": 132, "spe": 252}, + "teraType": ["Fire", "Grass", "Poison"], + "ability": ["Quark Drive"] + } + ] }, "rillaboom": { - "weight": 6, - "sets": [ - { - "species": "rillaboom", - "weight": 50, - "moves": [ - ["grassyglide"], - ["knockoff"], - ["drumbeating", "woodhammer"], - ["terablast"] - ], - "item": ["assaultvest", "choiceband"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["rock"], - "wantsTera": true, - "ability": "grassysurge" - }, - { - "species": "rillaboom", - "weight": 20, - "moves": [ - ["grassyglide"], - ["knockoff"], - ["drumbeating", "woodhammer"], - ["uturn", "highhorsepower"] - ], - "item": ["assaultvest"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["grass", "poison"], - "ability": "grassysurge" - }, - { - "species": "rillaboom", - "weight": 10, - "moves": [ - ["grassyglide"], - ["knockoff"], - ["drumbeating", "woodhammer"], - ["uturn", "highhorsepower"] - ], - "item": ["choiceband"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["grass"], - "ability": "grassysurge" - }, - { - "species": "rillaboom", - "weight": 20, - "moves": [["grassyglide"], ["highhorsepower"], ["terablast"], ["swordsdance"]], - "item": ["grassyseed"], - "nature": "adamant", - "evs": [252, 252, 4, 0, 0, 0], - "teraType": ["rock", "fairy"], - "wantsTera": true, - "ability": "grassysurge" - } - ] + "weight": 6, + "sets": [ + { + "species": "Rillaboom", + "weight": 50, + "moves": [ + ["Grassy Glide"], + ["Knock Off"], + ["Drum Beating", "Wood Hammer"], + ["Tera Blast"] + ], + "item": ["Assault Vest", "Choice Band"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Rock"], + "wantsTera": true, + "ability": ["Grassy Surge"] + }, + { + "species": "Rillaboom", + "weight": 20, + "moves": [ + ["Grassy Glide"], + ["Knock Off"], + ["Drum Beating", "Wood Hammer"], + ["High Horsepower", "U-turn"] + ], + "item": ["Assault Vest"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Grass", "Poison"], + "ability": ["Grassy Surge"] + }, + { + "species": "Rillaboom", + "weight": 10, + "moves": [ + ["Grassy Glide"], + ["Knock Off"], + ["Drum Beating", "Wood Hammer"], + ["High Horsepower", "U-turn"] + ], + "item": ["Choice Band"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Grass"], + "ability": ["Grassy Surge"] + }, + { + "species": "Rillaboom", + "weight": 20, + "moves": [ + ["Grassy Glide"], + ["High Horsepower"], + ["Tera Blast"], + ["Swords Dance"] + ], + "item": ["Grassy Seed"], + "nature": "Adamant", + "evs": {"hp": 252, "atk": 252, "def": 4}, + "teraType": ["Fairy", "Rock"], + "wantsTera": true, + "ability": ["Grassy Surge"] + } + ] }, "sneasler": { - "weight": 5, - "sets": [ - { - "species": "sneasler", - "weight": 30, - "moves": [["direclaw"], ["closecombat"], ["fakeout"], ["toxicspikes"]], - "gender": "f", - "item": [ - "focussash", - "airballoon", - "sitrusberry", - "redcard", - "normalgem" - ], - "nature": "adamant", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["fighting", "flying"], - "ability": "unburden" - }, - { - "species": "sneasler", - "weight": 10, - "moves": [["direclaw"], ["closecombat"], ["fakeout"], ["toxicspikes"]], - "gender": "f", - "item": ["focussash", "airballoon", "sitrusberry"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["fighting", "flying"], - "ability": "poisontouch" - }, - { - "species": "sneasler", - "weight": 55, - "moves": [["direclaw"], ["closecombat"], ["shadowclaw"], ["toxicspikes"]], - "gender": "f", - "item": ["focussash", "airballoon", "sitrusberry", "redcard"], - "nature": "adamant", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["ghost"], - "ability": "unburden" - }, - { - "species": "sneasler", - "weight": 5, - "moves": [ - ["direclaw"], - ["closecombat"], - ["swordsdance"], - ["acrobatics", "shadowclaw"] - ], - "item": ["grassyseed"], - "nature": "adamant", - "evs": [92, 252, 4, 0, 4, 156], - "teraType": ["flying", "ghost"], - "ability": "unburden" - } - ] + "weight": 5, + "sets": [ + { + "species": "Sneasler", + "weight": 30, + "moves": [ + ["Dire Claw"], + ["Close Combat"], + ["Fake Out"], + ["Toxic Spikes"] + ], + "gender": "F", + "item": ["Air Balloon", "Focus Sash", "Normal Gem", "Red Card", "Sitrus Berry"], + "nature": "Adamant", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Fighting", "Flying"], + "ability": ["Unburden"] + }, + { + "species": "Sneasler", + "weight": 10, + "moves": [ + ["Dire Claw"], + ["Close Combat"], + ["Fake Out"], + ["Toxic Spikes"] + ], + "gender": "F", + "item": ["Air Balloon", "Focus Sash", "Sitrus Berry"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Fighting", "Flying"], + "ability": ["Poison Touch"] + }, + { + "species": "Sneasler", + "weight": 55, + "moves": [ + ["Dire Claw"], + ["Close Combat"], + ["Shadow Claw"], + ["Toxic Spikes"] + ], + "gender": "F", + "item": ["Air Balloon", "Focus Sash", "Red Card", "Sitrus Berry"], + "nature": "Adamant", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Ghost"], + "ability": ["Unburden"] + }, + { + "species": "Sneasler", + "weight": 5, + "moves": [ + ["Dire Claw"], + ["Close Combat"], + ["Swords Dance"], + ["Acrobatics", "Shadow Claw"] + ], + "item": ["Grassy Seed"], + "nature": "Adamant", + "evs": {"hp": 92, "atk": 252, "def": 4, "spd": 4, "spe": 156}, + "teraType": ["Flying", "Ghost"], + "ability": ["Unburden"] + } + ] }, "clodsire": { - "weight": 5, - "sets": [ - { - "species": "clodsire", - "weight": 50, - "moves": [ - ["earthquake"], - ["toxic", "yawn"], - ["stealthrock", "haze", "counter"], - ["recover"] - ], - "item": ["sitrusberry", "leftovers"], - "nature": "impish", - "evs": [156, 0, 252, 0, 100, 0], - "teraType": ["water", "fire", "electric", "dark"], - "ability": "waterabsorb" - }, - { - "species": "clodsire", - "weight": 50, - "moves": [ - ["earthquake"], - ["toxic", "yawn"], - ["stealthrock", "haze", "counter"], - ["recover"] - ], - "item": ["sitrusberry", "leftovers"], - "nature": "impish", - "evs": [156, 0, 252, 0, 100, 0], - "teraType": ["water", "fire", "electric", "dark"], - "ability": "unaware" - } - ] + "weight": 5, + "sets": [ + { + "species": "Clodsire", + "weight": 50, + "moves": [ + ["Earthquake"], + ["Toxic", "Yawn"], + ["Counter", "Haze", "Stealth Rock"], + ["Recover"] + ], + "item": ["Leftovers", "Sitrus Berry"], + "nature": "Impish", + "evs": {"hp": 156, "def": 252, "spd": 100}, + "teraType": ["Dark", "Electric", "Fire", "Water"], + "ability": ["Water Absorb"] + }, + { + "species": "Clodsire", + "weight": 50, + "moves": [ + ["Earthquake"], + ["Toxic", "Yawn"], + ["Counter", "Haze", "Stealth Rock"], + ["Recover"] + ], + "item": ["Leftovers", "Sitrus Berry"], + "nature": "Impish", + "evs": {"hp": 156, "def": 252, "spd": 100}, + "teraType": ["Dark", "Electric", "Fire", "Water"], + "ability": ["Unaware"] + } + ] }, "meowscarada": { - "weight": 5, - "sets": [ - { - "species": "meowscarada", - "weight": 25, - "moves": [ - ["flowertrick"], - ["knockoff"], - ["uturn", "trick"], - ["playrough", "suckerpunch", "lowkick"] - ], - "item": ["choicescarf"], - "nature": "jolly", - "evs": [4, 252, 0, 0, 0, 252], - "teraType": ["grass", "dark"], - "ability": "protean" - }, - { - "species": "meowscarada", - "weight": 10, - "moves": [ - ["flowertrick"], - ["knockoff"], - ["uturn", "trick"], - ["terablast"] - ], - "item": ["choicescarf"], - "nature": "jolly", - "evs": [4, 252, 0, 0, 0, 252], - "teraType": ["rock", "ghost"], - "wantsTera": true, - "ability": "protean" - }, - { - "species": "meowscarada", - "weight": 30, - "moves": [ - ["flowertrick"], - ["knockoff"], - ["suckerpunch", "taunt"], - ["toxicspikes"] - ], - "item": ["focussash"], - "nature": "jolly", - "evs": [0, 252, 4, 0, 0, 252], - "teraType": ["grass"], - "ability": "overgrow" - }, - { - "species": "meowscarada", - "weight": 20, - "moves": [ - ["flowertrick"], - ["knockoff"], - ["terablast"], - ["suckerpunch", "toxicspikes"] - ], - "item": ["focussash"], - "nature": "jolly", - "evs": [0, 252, 4, 0, 0, 252], - "teraType": ["rock", "ghost"], - "wantsTera": true, - "ability": "overgrow" - }, - { - "species": "meowscarada", - "weight": 10, - "moves": [ - ["flowertrick"], - ["knockoff"], - ["uturn", "trick"], - ["suckerpunch"] - ], - "item": ["choiceband"], - "nature": "jolly", - "evs": [4, 252, 0, 0, 0, 252], - "teraType": ["grass"], - "ability": "protean" - }, - { - "species": "meowscarada", - "weight": 5, - "moves": [ - ["flowertrick"], - ["knockoff"], - ["uturn", "trick", "suckerpunch"], - ["terablast"] - ], - "item": ["choiceband"], - "nature": "jolly", - "evs": [4, 252, 0, 0, 0, 252], - "teraType": ["rock", "ghost"], - "wantsTera": true, - "ability": "protean" - } - ] + "weight": 5, + "sets": [ + { + "species": "Meowscarada", + "weight": 25, + "moves": [ + ["Flower Trick"], + ["Knock Off"], + ["Trick", "U-turn"], + ["Low Kick", "Play Rough", "Sucker Punch"] + ], + "item": ["Choice Scarf"], + "nature": "Jolly", + "evs": {"hp": 4, "atk": 252, "spe": 252}, + "teraType": ["Dark", "Grass"], + "ability": ["Protean"] + }, + { + "species": "Meowscarada", + "weight": 10, + "moves": [ + ["Flower Trick"], + ["Knock Off"], + ["Trick", "U-turn"], + ["Tera Blast"] + ], + "item": ["Choice Scarf"], + "nature": "Jolly", + "evs": {"hp": 4, "atk": 252, "spe": 252}, + "teraType": ["Ghost", "Rock"], + "wantsTera": true, + "ability": ["Protean"] + }, + { + "species": "Meowscarada", + "weight": 30, + "moves": [ + ["Flower Trick"], + ["Knock Off"], + ["Sucker Punch", "Taunt"], + ["Toxic Spikes"] + ], + "item": ["Focus Sash"], + "nature": "Jolly", + "evs": {"atk": 252, "def": 4, "spe": 252}, + "teraType": ["Grass"], + "ability": ["Overgrow"] + }, + { + "species": "Meowscarada", + "weight": 20, + "moves": [ + ["Flower Trick"], + ["Knock Off"], + ["Tera Blast"], + ["Sucker Punch", "Toxic Spikes"] + ], + "item": ["Focus Sash"], + "nature": "Jolly", + "evs": {"atk": 252, "def": 4, "spe": 252}, + "teraType": ["Ghost", "Rock"], + "wantsTera": true, + "ability": ["Overgrow"] + }, + { + "species": "Meowscarada", + "weight": 10, + "moves": [ + ["Flower Trick"], + ["Knock Off"], + ["Trick", "U-turn"], + ["Sucker Punch"] + ], + "item": ["Choice Band"], + "nature": "Jolly", + "evs": {"hp": 4, "atk": 252, "spe": 252}, + "teraType": ["Grass"], + "ability": ["Protean"] + }, + { + "species": "Meowscarada", + "weight": 5, + "moves": [ + ["Flower Trick"], + ["Knock Off"], + ["Sucker Punch", "Trick", "U-turn"], + ["Tera Blast"] + ], + "item": ["Choice Band"], + "nature": "Jolly", + "evs": {"hp": 4, "atk": 252, "spe": 252}, + "teraType": ["Ghost", "Rock"], + "wantsTera": true, + "ability": ["Protean"] + } + ] }, "azumarill": { - "weight": 5, - "sets": [ - { - "species": "azumarill", - "weight": 45, - "moves": [["aquajet"], ["playrough"], ["liquidation"], ["superpower"]], - "item": ["assaultvest"], - "nature": "adamant", - "evs": [252, 252, 0, 0, 4, 0], - "teraType": ["water", "fairy"], - "ability": "hugepower" - }, - { - "species": "azumarill", - "weight": 10, - "moves": [["aquajet"], ["playrough"], ["liquidation"], ["terablast"]], - "item": ["assaultvest", "choiceband"], - "nature": "adamant", - "evs": [252, 252, 0, 0, 4, 0], - "teraType": ["fire", "electric", "fairy", "grass"], - "wantsTera": true, - "ability": "hugepower" - }, - { - "species": "azumarill", - "weight": 25, - "moves": [ - ["bellydrum"], - ["aquajet"], - ["playrough"], - ["liquidation", "encore"] - ], - "item": ["sitrusberry"], - "nature": "adamant", - "evs": [244, 252, 12, 0, 0, 0], - "teraType": ["water"], - "ability": "hugepower" - }, - { - "species": "azumarill", - "weight": 10, - "moves": [["bellydrum"], ["aquajet"], ["playrough"], ["bulldoze"]], - "item": ["sitrusberry"], - "nature": "adamant", - "evs": [244, 252, 12, 0, 0, 0], - "teraType": ["steel"], - "ability": "hugepower" - }, - { - "species": "azumarill", - "weight": 5, - "moves": [["bellydrum"], ["aquajet"], ["playrough"], ["terablast"]], - "item": ["sitrusberry"], - "nature": "adamant", - "evs": [244, 252, 12, 0, 0, 0], - "teraType": ["fire"], - "wantsTera": true, - "ability": "hugepower" - }, - { - "species": "azumarill", - "weight": 5, - "moves": [ - ["substitute"], - ["encore"], - ["playrough"], - ["aquajet", "liquidation"] - ], - "item": ["leftovers"], - "nature": "adamant", - "evs": [252, 252, 4, 0, 0, 0], - "teraType": ["water"], - "ability": "hugepower" - } - ] + "weight": 5, + "sets": [ + { + "species": "Azumarill", + "weight": 45, + "moves": [ + ["Aqua Jet"], + ["Play Rough"], + ["Liquidation"], + ["Superpower"] + ], + "item": ["Assault Vest"], + "nature": "Adamant", + "evs": {"hp": 252, "atk": 252, "spd": 4}, + "teraType": ["Fairy", "Water"], + "ability": ["Huge Power"] + }, + { + "species": "Azumarill", + "weight": 10, + "moves": [ + ["Aqua Jet"], + ["Play Rough"], + ["Liquidation"], + ["Tera Blast"] + ], + "item": ["Assault Vest", "Choice Band"], + "nature": "Adamant", + "evs": {"hp": 252, "atk": 252, "spd": 4}, + "teraType": ["Electric", "Fairy", "Fire", "Grass"], + "wantsTera": true, + "ability": ["Huge Power"] + }, + { + "species": "Azumarill", + "weight": 25, + "moves": [ + ["Belly Drum"], + ["Aqua Jet"], + ["Play Rough"], + ["Encore", "Liquidation"] + ], + "item": ["Sitrus Berry"], + "nature": "Adamant", + "evs": {"hp": 244, "atk": 252, "def": 12}, + "teraType": ["Water"], + "ability": ["Huge Power"] + }, + { + "species": "Azumarill", + "weight": 10, + "moves": [ + ["Belly Drum"], + ["Aqua Jet"], + ["Play Rough"], + ["Bulldoze"] + ], + "item": ["Sitrus Berry"], + "nature": "Adamant", + "evs": {"hp": 244, "atk": 252, "def": 12}, + "teraType": ["Steel"], + "ability": ["Huge Power"] + }, + { + "species": "Azumarill", + "weight": 5, + "moves": [ + ["Belly Drum"], + ["Aqua Jet"], + ["Play Rough"], + ["Tera Blast"] + ], + "item": ["Sitrus Berry"], + "nature": "Adamant", + "evs": {"hp": 244, "atk": 252, "def": 12}, + "teraType": ["Fire"], + "wantsTera": true, + "ability": ["Huge Power"] + }, + { + "species": "Azumarill", + "weight": 5, + "moves": [ + ["Substitute"], + ["Encore"], + ["Play Rough"], + ["Aqua Jet", "Liquidation"] + ], + "item": ["Leftovers"], + "nature": "Adamant", + "evs": {"hp": 252, "atk": 252, "def": 4}, + "teraType": ["Water"], + "ability": ["Huge Power"] + } + ] }, "ironvaliant": { - "weight": 5, - "sets": [ - { - "species": "ironvaliant", - "weight": 35, - "moves": [ - ["spiritbreak"], - ["reflect", "encore"], - ["closecombat"], - ["destinybond", "knockoff"] - ], - "item": ["boosterenergy"], - "nature": "jolly", - "evs": [92, 204, 4, 0, 4, 204], - "teraType": ["steel", "ghost"], - "ability": "quarkdrive" - }, - { - "species": "ironvaliant", - "weight": 25, - "moves": [ - ["moonblast"], - ["encore", "shadowball", "shadowsneak"], - ["closecombat", "aurasphere", "shadowball"], - ["destinybond"] - ], - "item": ["focussash", "boosterenergy"], - "nature": "naive", - "evs": [0, 4, 0, 252, 0, 252], - "teraType": ["ghost", "fairy", "steel"], - "ability": "quarkdrive" - }, - { - "species": "ironvaliant", - "weight": 20, - "moves": [ - ["moonblast"], - ["closecombat"], - ["encore", "shadowball"], - ["psyshock", "psychic", "shadowball", "thunderbolt"] - ], - "item": ["lifeorb", "boosterenergy"], - "nature": "naive", - "evs": [0, 4, 0, 252, 0, 252], - "teraType": ["ghost", "fairy", "steel", "electric"], - "ability": "quarkdrive" - }, - { - "species": "ironvaliant", - "weight": 20, - "moves": [ - ["swordsdance"], - ["closecombat", "encore"], - ["spiritbreak"], - ["shadowsneak", "knockoff"] - ], - "item": ["focussash", "boosterenergy"], - "nature": "jolly", - "evs": [0, 252, 4, 0, 0, 252], - "teraType": ["ghost", "steel", "fairy"], - "ability": "quarkdrive" - } - ] + "weight": 5, + "sets": [ + { + "species": "Iron Valiant", + "weight": 35, + "moves": [ + ["Spirit Break"], + ["Encore", "Reflect"], + ["Close Combat"], + ["Destiny Bond", "Knock Off"] + ], + "item": ["Booster Energy"], + "nature": "Jolly", + "evs": {"hp": 92, "atk": 204, "def": 4, "spd": 4, "spe": 204}, + "teraType": ["Ghost", "Steel"], + "ability": ["Quark Drive"] + }, + { + "species": "Iron Valiant", + "weight": 25, + "moves": [ + ["Moonblast"], + ["Encore", "Shadow Ball", "Shadow Sneak"], + ["Aura Sphere", "Close Combat", "Shadow Ball"], + ["Destiny Bond"] + ], + "item": ["Booster Energy", "Focus Sash"], + "nature": "Naive", + "evs": {"atk": 4, "spa": 252, "spe": 252}, + "teraType": ["Fairy", "Ghost", "Steel"], + "ability": ["Quark Drive"] + }, + { + "species": "Iron Valiant", + "weight": 20, + "moves": [ + ["Moonblast"], + ["Close Combat"], + ["Encore", "Shadow Ball"], + ["Psychic", "Psyshock", "Shadow Ball", "Thunderbolt"] + ], + "item": ["Booster Energy", "Life Orb"], + "nature": "Naive", + "evs": {"atk": 4, "spa": 252, "spe": 252}, + "teraType": ["Electric", "Fairy", "Ghost", "Steel"], + "ability": ["Quark Drive"] + }, + { + "species": "Iron Valiant", + "weight": 20, + "moves": [ + ["Swords Dance"], + ["Close Combat", "Encore"], + ["Spirit Break"], + ["Knock Off", "Shadow Sneak"] + ], + "item": ["Booster Energy", "Focus Sash"], + "nature": "Jolly", + "evs": {"atk": 252, "def": 4, "spe": 252}, + "teraType": ["Fairy", "Ghost", "Steel"], + "ability": ["Quark Drive"] + } + ] }, "kingambit": { - "weight": 5, - "sets": [ - { - "species": "kingambit", - "weight": 25, - "moves": [["kowtowcleave"], ["suckerpunch"], ["ironhead"], ["guillotine"]], - "item": ["assaultvest"], - "nature": "adamant", - "evs": [252, 252, 0, 0, 4, 0], - "teraType": ["dark", "flying"], - "ability": "defiant" - }, - { - "species": "kingambit", - "weight": 20, - "moves": [["kowtowcleave"], ["suckerpunch"], ["ironhead"], ["guillotine"]], - "item": ["assaultvest"], - "nature": "adamant", - "evs": [252, 252, 0, 0, 4, 0], - "teraType": ["dark", "flying"], - "ability": "supremeoverlord" - }, - { - "species": "kingambit", - "weight": 10, - "moves": [ - ["kowtowcleave"], - ["suckerpunch", "guillotine"], - ["ironhead"], - ["terablast"] - ], - "item": ["assaultvest"], - "nature": "adamant", - "evs": [252, 252, 0, 0, 4, 0], - "teraType": ["fairy"], - "wantsTera": true, - "ability": "defiant" - }, - { - "species": "kingambit", - "weight": 10, - "moves": [ - ["kowtowcleave"], - ["suckerpunch", "guillotine"], - ["ironhead"], - ["terablast"] - ], - "item": ["assaultvest"], - "nature": "adamant", - "evs": [252, 252, 0, 0, 4, 0], - "teraType": ["fairy"], - "wantsTera": true, - "ability": "supremeoverlord" - }, - { - "species": "kingambit", - "weight": 15, - "moves": [["kowtowcleave"], ["suckerpunch"], ["ironhead"], ["swordsdance"]], - "item": ["blackglasses", "sitrusberry"], - "nature": "adamant", - "evs": [252, 252, 0, 0, 4, 0], - "teraType": ["dark", "flying"], - "ability": "supremeoverlord" - }, - { - "species": "kingambit", - "weight": 10, - "moves": [["kowtowcleave"], ["suckerpunch"], ["ironhead"], ["swordsdance"]], - "item": ["blackglasses", "sitrusberry"], - "nature": "adamant", - "evs": [252, 252, 0, 0, 4, 0], - "teraType": ["dark", "flying"], - "ability": "defiant" - }, - { - "species": "kingambit", - "weight": 5, - "moves": [ - ["stealthrock"], - ["kowtowcleave"], - ["ironhead", "guillotine"], - ["suckerpunch", "thunderwave"] - ], - "item": "focussash", - "nature": "adamant", - "evs": [252, 252, 0, 0, 4, 0], - "teraType": ["flying", "fairy", "dark"], - "ability": ["defiant", "supremeoverlord"] - }, - { - "species": "kingambit", - "weight": 5, - "moves": [ - ["stealthrock"], - ["kowtowcleave"], - ["ironhead", "guillotine"], - ["suckerpunch", "thunderwave"] - ], - "item": "sitrusberry", - "nature": "adamant", - "evs": [244, 252, 0, 0, 12, 0], - "teraType": ["flying", "fairy", "dark"], - "ability": ["defiant", "supremeoverlord"] - } - ] + "weight": 5, + "sets": [ + { + "species": "Kingambit", + "weight": 25, + "moves": [ + ["Kowtow Cleave"], + ["Sucker Punch"], + ["Iron Head"], + ["Guillotine"] + ], + "item": ["Assault Vest"], + "nature": "Adamant", + "evs": {"hp": 252, "atk": 252, "spd": 4}, + "teraType": ["Dark", "Flying"], + "ability": ["Defiant"] + }, + { + "species": "Kingambit", + "weight": 20, + "moves": [ + ["Kowtow Cleave"], + ["Sucker Punch"], + ["Iron Head"], + ["Guillotine"] + ], + "item": ["Assault Vest"], + "nature": "Adamant", + "evs": {"hp": 252, "atk": 252, "spd": 4}, + "teraType": ["Dark", "Flying"], + "ability": ["Supreme Overlord"] + }, + { + "species": "Kingambit", + "weight": 10, + "moves": [ + ["Kowtow Cleave"], + ["Guillotine", "Sucker Punch"], + ["Iron Head"], + ["Tera Blast"] + ], + "item": ["Assault Vest"], + "nature": "Adamant", + "evs": {"hp": 252, "atk": 252, "spd": 4}, + "teraType": ["Fairy"], + "wantsTera": true, + "ability": ["Defiant"] + }, + { + "species": "Kingambit", + "weight": 10, + "moves": [ + ["Kowtow Cleave"], + ["Guillotine", "Sucker Punch"], + ["Iron Head"], + ["Tera Blast"] + ], + "item": ["Assault Vest"], + "nature": "Adamant", + "evs": {"hp": 252, "atk": 252, "spd": 4}, + "teraType": ["Fairy"], + "wantsTera": true, + "ability": ["Supreme Overlord"] + }, + { + "species": "Kingambit", + "weight": 15, + "moves": [ + ["Kowtow Cleave"], + ["Sucker Punch"], + ["Iron Head"], + ["Swords Dance"] + ], + "item": ["Black Glasses", "Sitrus Berry"], + "nature": "Adamant", + "evs": {"hp": 252, "atk": 252, "spd": 4}, + "teraType": ["Dark", "Flying"], + "ability": ["Supreme Overlord"] + }, + { + "species": "Kingambit", + "weight": 10, + "moves": [ + ["Kowtow Cleave"], + ["Sucker Punch"], + ["Iron Head"], + ["Swords Dance"] + ], + "item": ["Black Glasses", "Sitrus Berry"], + "nature": "Adamant", + "evs": {"hp": 252, "atk": 252, "spd": 4}, + "teraType": ["Dark", "Flying"], + "ability": ["Defiant"] + }, + { + "species": "Kingambit", + "weight": 5, + "moves": [ + ["Stealth Rock"], + ["Kowtow Cleave"], + ["Guillotine", "Iron Head"], + ["Sucker Punch", "Thunder Wave"] + ], + "item": ["Focus Sash"], + "nature": "Adamant", + "evs": {"hp": 252, "atk": 252, "spd": 4}, + "teraType": ["Dark", "Fairy", "Flying"], + "ability": ["Defiant", "Supreme Overlord"] + }, + { + "species": "Kingambit", + "weight": 5, + "moves": [ + ["Stealth Rock"], + ["Kowtow Cleave"], + ["Guillotine", "Iron Head"], + ["Sucker Punch", "Thunder Wave"] + ], + "item": ["Sitrus Berry"], + "nature": "Adamant", + "evs": {"hp": 244, "atk": 252, "spd": 12}, + "teraType": ["Dark", "Fairy", "Flying"], + "ability": ["Defiant", "Supreme Overlord"] + } + ] }, "volcarona": { - "weight": 5, - "sets": [ - { - "species": "volcarona", - "weight": 55, - "moves": [ - ["quiverdance"], - ["fierydance"], - ["morningsun"], - ["gigadrain", "willowisp", "substitute"] - ], - "item": ["heavydutyboots", "sitrusberry"], - "nature": "timid", - "evs": [244, 0, 204, 12, 4, 44], - "teraType": ["fairy", "grass"], - "wantsTera": true, - "ability": "flamebody" - }, - { - "species": "volcarona", - "weight": 25, - "moves": [ - ["quiverdance"], - ["fierydance"], - ["morningsun"], - ["terablast"] - ], - "item": ["heavydutyboots", "sitrusberry"], - "nature": "timid", - "evs": [244, 0, 204, 12, 4, 44], - "teraType": ["water"], - "wantsTera": true, - "ability": "flamebody" - }, - { - "species": "volcarona", - "weight": 20, - "moves": [ - ["quiverdance"], - ["fierydance"], - ["gigadrain", "bugbuzz", "psychic"], - ["terablast"] - ], - "item": ["heavydutyboots", "lumberry", "sitrusberry"], - "nature": "timid", - "evs": [0, 0, 0, 252, 4, 252], - "teraType": ["water", "rock"], - "wantsTera": true, - "ability": "flamebody" - } - ] + "weight": 5, + "sets": [ + { + "species": "Volcarona", + "weight": 55, + "moves": [ + ["Quiver Dance"], + ["Fiery Dance"], + ["Morning Sun"], + ["Giga Drain", "Substitute", "Will-O-Wisp"] + ], + "item": ["Heavy-Duty Boots", "Sitrus Berry"], + "nature": "Timid", + "evs": {"hp": 244, "def": 204, "spa": 12, "spd": 4, "spe": 44}, + "teraType": ["Fairy", "Grass"], + "wantsTera": true, + "ability": ["Flame Body"] + }, + { + "species": "Volcarona", + "weight": 25, + "moves": [ + ["Quiver Dance"], + ["Fiery Dance"], + ["Morning Sun"], + ["Tera Blast"] + ], + "item": ["Heavy-Duty Boots", "Sitrus Berry"], + "nature": "Timid", + "evs": {"hp": 244, "def": 204, "spa": 12, "spd": 4, "spe": 44}, + "teraType": ["Water"], + "wantsTera": true, + "ability": ["Flame Body"] + }, + { + "species": "Volcarona", + "weight": 20, + "moves": [ + ["Quiver Dance"], + ["Fiery Dance"], + ["Bug Buzz", "Giga Drain", "Psychic"], + ["Tera Blast"] + ], + "item": ["Heavy-Duty Boots", "Lum Berry", "Sitrus Berry"], + "nature": "Timid", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "teraType": ["Rock", "Water"], + "wantsTera": true, + "ability": ["Flame Body"] + } + ] }, "wochien": { - "weight": 5, - "sets": [ - { - "species": "wochien", - "weight": 90, - "moves": [ - ["leechseed"], - ["protect"], - ["foulplay", "knockoff", "darkpulse"], - ["substitute", "ruination", "gigadrain", "taunt"] - ], - "item": ["leftovers"], - "nature": "bold", - "evs": [252, 0, 252, 0, 4, 0], - "teraType": ["poison", "fairy", "water", "fire"], - "wantsTera": true, - "ability": "tabletsofruin" - }, - { - "species": "wochien", - "weight": 10, - "moves": [ - ["leechseed"], - ["protect"], - ["terablast"], - ["substitute", "ruination", "gigadrain", "taunt"] - ], - "item": ["leftovers"], - "nature": "bold", - "evs": [252, 0, 252, 0, 4, 0], - "teraType": ["fire"], - "wantsTera": true, - "ability": "tabletsofruin" - } - ] + "weight": 5, + "sets": [ + { + "species": "Wo-Chien", + "weight": 90, + "moves": [ + ["Leech Seed"], + ["Protect"], + ["Dark Pulse", "Foul Play", "Knock Off"], + ["Giga Drain", "Ruination", "Substitute", "Taunt"] + ], + "item": ["Leftovers"], + "nature": "Bold", + "evs": {"hp": 252, "def": 252, "spd": 4}, + "teraType": ["Fairy", "Fire", "Poison", "Water"], + "wantsTera": true, + "ability": ["Tablets of Ruin"] + }, + { + "species": "Wo-Chien", + "weight": 10, + "moves": [ + ["Leech Seed"], + ["Protect"], + ["Tera Blast"], + ["Giga Drain", "Ruination", "Substitute", "Taunt"] + ], + "item": ["Leftovers"], + "nature": "Bold", + "evs": {"hp": 252, "def": 252, "spd": 4}, + "teraType": ["Fire"], + "wantsTera": true, + "ability": ["Tablets of Ruin"] + } + ] }, "empoleon": { - "weight": 5, - "sets": [ - { - "species": "empoleon", - "weight": 100, - "moves": [ - ["stealthrock"], - ["yawn", "roar"], - ["flashcannon", "icebeam"], - ["flipturn", "surf", "roost"] - ], - "item": ["leftovers", "sitrusberry", "airballoon"], - "nature": "calm", - "evs": [252, 0, 4, 0, 252, 0], - "teraType": ["flying", "fairy", "grass"], - "ability": "competitive" - } - ] + "weight": 5, + "sets": [ + { + "species": "Empoleon", + "weight": 100, + "moves": [ + ["Stealth Rock"], + ["Roar", "Yawn"], + ["Flash Cannon", "Ice Beam"], + ["Flip Turn", "Roost", "Surf"] + ], + "item": ["Air Balloon", "Leftovers", "Sitrus Berry"], + "nature": "Calm", + "evs": {"hp": 252, "def": 4, "spd": 252}, + "teraType": ["Fairy", "Flying", "Grass"], + "ability": ["Competitive"] + } + ] }, "kommoo": { - "weight": 5, - "sets": [ - { - "species": "kommoo", - "weight": 50, - "moves": [ - ["clangoroussoul"], - ["clangingscales"], - ["aurasphere", "vacuumwave"], - ["flashcannon"] - ], - "item": ["throatspray"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "timid", - "evs": [0, 0, 0, 252, 4, 252], - "teraType": ["steel"], - "wantsTera": true, - "ability": "bulletproof" - }, - { - "species": "kommoo", - "weight": 50, - "moves": [ - ["clangoroussoul"], - ["drainpunch"], - ["ironhead"], - ["earthquake", "substitute"] - ], - "item": ["sitrusberry", "leftovers"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["steel"], - "wantsTera": true, - "ability": "bulletproof" - } - ] + "weight": 5, + "sets": [ + { + "species": "Kommo-o", + "weight": 50, + "moves": [ + ["Clangorous Soul"], + ["Clanging Scales"], + ["Aura Sphere", "Vacuum Wave"], + ["Flash Cannon"] + ], + "item": ["Throat Spray"], + "nature": "Timid", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "ivs": {"atk": 0}, + "teraType": ["Steel"], + "wantsTera": true, + "ability": ["Bulletproof"] + }, + { + "species": "Kommo-o", + "weight": 50, + "moves": [ + ["Clangorous Soul"], + ["Drain Punch"], + ["Iron Head"], + ["Earthquake", "Substitute"] + ], + "item": ["Leftovers", "Sitrus Berry"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Steel"], + "wantsTera": true, + "ability": ["Bulletproof"] + } + ] }, "sinistcha": { - "weight": 5, - "sets": [ - { - "species": "sinistcha", - "weight": 100, - "moves": [ - ["strengthsap"], - ["matchagotcha"], - ["shadowball", "hex"], - ["scald", "calmmind"] - ], - "item": ["leftovers", "rockyhelmet", "covertcloak"], - "nature": "bold", - "ivs": [31, 0, 31, 31, 31, 31], - "evs": [252, 0, 252, 0, 4, 0], - "teraType": ["water", "fairy", "normal"], - "wantsTera": true, - "ability": "heatproof" - } - ] + "weight": 5, + "sets": [ + { + "species": "Sinistcha", + "weight": 100, + "moves": [ + ["Strength Sap"], + ["Matcha Gotcha"], + ["Hex", "Shadow Ball"], + ["Calm Mind", "Scald"] + ], + "item": ["Covert Cloak", "Leftovers", "Rocky Helmet"], + "nature": "Bold", + "evs": {"hp": 252, "def": 252, "spd": 4}, + "ivs": {"atk": 0}, + "teraType": ["Fairy", "Normal", "Water"], + "wantsTera": true, + "ability": ["Heatproof"] + } + ] }, "vikavolt": { - "weight": 5, - "sets": [ - { - "species": "vikavolt", - "weight": 100, - "moves": [ - ["voltswitch", "thunderbolt", "discharge", "thunderwave"], - ["bugbuzz"], - ["stickyweb"], - ["guillotine"] - ], - "item": ["sitrusberry"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "modest", - "evs": [244, 0, 212, 0, 52, 0], - "teraType": ["steel"], - "ability": "levitate" - } - ] + "weight": 5, + "sets": [ + { + "species": "Vikavolt", + "weight": 100, + "moves": [ + ["Discharge", "Thunderbolt", "Thunder Wave", "Volt Switch"], + ["Bug Buzz"], + ["Sticky Web"], + ["Guillotine"] + ], + "item": ["Sitrus Berry"], + "nature": "Modest", + "evs": {"hp": 244, "def": 212, "spd": 52}, + "ivs": {"atk": 0}, + "teraType": ["Steel"], + "ability": ["Levitate"] + } + ] }, "skeledirge": { - "weight": 5, - "sets": [ - { - "species": "skeledirge", - "weight": 30, - "moves": [ - ["torchsong"], - ["slackoff"], - ["willowisp", "yawn"], - ["shadowball", "hex", "earthpower", "terablast"] - ], - "item": ["leftovers", "sitrusberry", "covertcloak", "heavydutyboots"], - "nature": "bold", - "evs": [252, 0, 252, 0, 4, 0], - "teraType": ["fairy", "water"], - "wantsTera": true, - "ability": "unaware" - }, - { - "species": "skeledirge", - "weight": 60, - "moves": [ - ["torchsong"], - ["slackoff"], - ["willowisp", "yawn"], - ["shadowball", "hex", "earthpower"] - ], - "item": ["leftovers", "sitrusberry", "covertcloak", "heavydutyboots"], - "nature": "bold", - "evs": [252, 0, 252, 0, 4, 0], - "teraType": ["normal", "fairy"], - "ability": "unaware" - }, - { - "species": "skeledirge", - "weight": 5, - "moves": [ - ["sing"], - ["torchsong"], - ["slackoff"], - ["shadowball", "earthpower", "terablast"] - ], - "item": ["blunderpolicy"], - "nature": "modest", - "evs": [204, 0, 4, 132, 4, 164], - "teraType": ["fairy", "water"], - "wantsTera": true, - "ability": "unaware" - }, - { - "species": "skeledirge", - "weight": 5, - "moves": [ - ["sing"], - ["torchsong"], - ["slackoff"], - ["shadowball", "earthpower"] - ], - "item": ["blunderpolicy"], - "nature": "modest", - "evs": [204, 0, 4, 132, 4, 164], - "teraType": ["fire"], - "ability": "unaware" - } - ] + "weight": 5, + "sets": [ + { + "species": "Skeledirge", + "weight": 30, + "moves": [ + ["Torch Song"], + ["Slack Off"], + ["Will-O-Wisp", "Yawn"], + ["Earth Power", "Hex", "Shadow Ball", "Tera Blast"] + ], + "item": ["Covert Cloak", "Heavy-Duty Boots", "Leftovers", "Sitrus Berry"], + "nature": "Bold", + "evs": {"hp": 252, "def": 252, "spd": 4}, + "teraType": ["Fairy", "Water"], + "wantsTera": true, + "ability": ["Unaware"] + }, + { + "species": "Skeledirge", + "weight": 60, + "moves": [ + ["Torch Song"], + ["Slack Off"], + ["Will-O-Wisp", "Yawn"], + ["Earth Power", "Hex", "Shadow Ball"] + ], + "item": ["Covert Cloak", "Heavy-Duty Boots", "Leftovers", "Sitrus Berry"], + "nature": "Bold", + "evs": {"hp": 252, "def": 252, "spd": 4}, + "teraType": ["Fairy", "Normal"], + "ability": ["Unaware"] + }, + { + "species": "Skeledirge", + "weight": 5, + "moves": [ + ["Sing"], + ["Torch Song"], + ["Slack Off"], + ["Earth Power", "Shadow Ball", "Tera Blast"] + ], + "item": ["Blunder Policy"], + "nature": "Modest", + "evs": {"hp": 204, "def": 4, "spa": 132, "spd": 4, "spe": 164}, + "teraType": ["Fairy", "Water"], + "wantsTera": true, + "ability": ["Unaware"] + }, + { + "species": "Skeledirge", + "weight": 5, + "moves": [ + ["Sing"], + ["Torch Song"], + ["Slack Off"], + ["Earth Power", "Shadow Ball"] + ], + "item": ["Blunder Policy"], + "nature": "Modest", + "evs": {"hp": 204, "def": 4, "spa": 132, "spd": 4, "spe": 164}, + "teraType": ["Fire"], + "ability": ["Unaware"] + } + ] }, "blissey": { - "weight": 4, - "sets": [ - { - "species": "blissey", - "weight": 10, - "moves": [["softboiled"], ["flamethrower"], ["icebeam"], ["thunderbolt"]], - "item": ["expertbelt"], - "nature": "bold", - "evs": [4, 0, 252, 252, 0, 0], - "teraType": ["dark", "fire"], - "ability": "naturalcure" - }, - { - "species": "blissey", - "weight": 40, - "moves": [ - ["calmmind"], - ["softboiled"], - ["shadowball"], - ["stealthrock", "terablast", "flamethrower"] - ], - "item": ["leftovers"], - "nature": "calm", - "evs": [4, 0, 252, 0, 252, 0], - "teraType": ["dark", "ghost", "fire"], - "wantsTera": true, - "ability": "naturalcure" - }, - { - "species": "blissey", - "weight": 50, - "moves": [ - ["calmmind"], - ["softboiled"], - ["shadowball", "flamethrower"], - ["fling"] - ], - "item": ["flameorb", "poisonbarb", "lightball"], - "nature": "calm", - "evs": [4, 0, 252, 0, 252, 0], - "teraType": ["dark", "fire"], - "ability": "naturalcure" - } - ] + "weight": 4, + "sets": [ + { + "species": "Blissey", + "weight": 10, + "moves": [ + ["Soft-Boiled"], + ["Flamethrower"], + ["Ice Beam"], + ["Thunderbolt"] + ], + "item": ["Expert Belt"], + "nature": "Bold", + "evs": {"hp": 4, "def": 252, "spa": 252}, + "teraType": ["Dark", "Fire"], + "ability": ["Natural Cure"] + }, + { + "species": "Blissey", + "weight": 40, + "moves": [ + ["Calm Mind"], + ["Soft-Boiled"], + ["Shadow Ball"], + ["Flamethrower", "Stealth Rock", "Tera Blast"] + ], + "item": ["Leftovers"], + "nature": "Calm", + "evs": {"hp": 4, "def": 252, "spd": 252}, + "teraType": ["Dark", "Fire", "Ghost"], + "wantsTera": true, + "ability": ["Natural Cure"] + }, + { + "species": "Blissey", + "weight": 50, + "moves": [ + ["Calm Mind"], + ["Soft-Boiled"], + ["Flamethrower", "Shadow Ball"], + ["Fling"] + ], + "item": ["Flame Orb", "Light Ball", "Poison Barb"], + "nature": "Calm", + "evs": {"hp": 4, "def": 252, "spd": 252}, + "teraType": ["Dark", "Fire"], + "ability": ["Natural Cure"] + } + ] }, "ceruledge": { - "weight": 4, - "sets": [ - { - "species": "ceruledge", - "weight": 25, - "moves": [ - ["bitterblade"], - ["bulkup"], - ["taunt"], - ["shadowsneak", "terablast", "flamecharge", "willowisp"] - ], - "item": ["leftovers"], - "nature": "impish", - "evs": [252, 4, 252, 0, 0, 0], - "teraType": ["fairy", "grass"], - "ability": "flashfire" - }, - { - "species": "ceruledge", - "weight": 65, - "moves": [ - ["bitterblade"], - ["closecombat", "shadowclaw"], - ["shadowsneak"], - ["swordsdance", "destinybond"] - ], - "item": ["focussash"], - "nature": "adamant", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["fire", "normal", "fighting"], - "ability": "weakarmor" - }, - { - "species": "ceruledge", - "weight": 10, - "moves": [["bitterblade"], ["flareblitz"], ["shadowsneak"], ["terablast"]], - "item": ["choiceband"], - "nature": "adamant", - "evs": [100, 252, 156, 0, 0, 0], - "teraType": ["fairy"], - "wantsTera": true, - "ability": "weakarmor" - } - ] + "weight": 4, + "sets": [ + { + "species": "Ceruledge", + "weight": 25, + "moves": [ + ["Bitter Blade"], + ["Bulk Up"], + ["Taunt"], + ["Flame Charge", "Shadow Sneak", "Tera Blast", "Will-O-Wisp"] + ], + "item": ["Leftovers"], + "nature": "Impish", + "evs": {"hp": 252, "atk": 4, "def": 252}, + "teraType": ["Fairy", "Grass"], + "ability": ["Flash Fire"] + }, + { + "species": "Ceruledge", + "weight": 65, + "moves": [ + ["Bitter Blade"], + ["Close Combat", "Shadow Claw"], + ["Shadow Sneak"], + ["Destiny Bond", "Swords Dance"] + ], + "item": ["Focus Sash"], + "nature": "Adamant", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Fighting", "Fire", "Normal"], + "ability": ["Weak Armor"] + }, + { + "species": "Ceruledge", + "weight": 10, + "moves": [ + ["Bitter Blade"], + ["Flare Blitz"], + ["Shadow Sneak"], + ["Tera Blast"] + ], + "item": ["Choice Band"], + "nature": "Adamant", + "evs": {"hp": 100, "atk": 252, "def": 156}, + "teraType": ["Fairy"], + "wantsTera": true, + "ability": ["Weak Armor"] + } + ] }, "chansey": { - "weight": 4, - "sets": [ - { - "species": "chansey", - "weight": 100, - "moves": [ - ["seismictoss"], - ["shadowball", "stealthrock", "thunderwave"], - ["calmmind"], - ["softboiled"] - ], - "item": ["eviolite"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "bold", - "evs": [12, 0, 252, 0, 244, 0], - "teraType": ["dark", "ghost"], - "ability": "naturalcure" - } - ] + "weight": 4, + "sets": [ + { + "species": "Chansey", + "weight": 100, + "moves": [ + ["Seismic Toss"], + ["Shadow Ball", "Stealth Rock", "Thunder Wave"], + ["Calm Mind"], + ["Soft-Boiled"] + ], + "item": ["Eviolite"], + "nature": "Bold", + "evs": {"hp": 12, "def": 252, "spd": 244}, + "ivs": {"atk": 0}, + "teraType": ["Dark", "Ghost"], + "ability": ["Natural Cure"] + } + ] }, "espathra": { - "weight": 4, - "sets": [ - { - "species": "espathra", - "weight": 35, - "moves": [ - ["calmmind"], - ["storedpower"], - ["terablast"], - ["protect", "substitute", "roost"] - ], - "item": ["leftovers", "lumberry"], - "nature": "bold", - "evs": [244, 0, 252, 0, 0, 12], - "teraType": ["fighting", "fire"], - "wantsTera": true, - "ability": "speedboost" - }, - { - "species": "espathra", - "weight": 20, - "moves": [ - ["calmmind"], - ["storedpower"], - ["dazzlinggleam"], - ["protect", "substitute", "roost"] - ], - "item": ["leftovers", "lumberry"], - "nature": "bold", - "evs": [244, 0, 252, 0, 0, 12], - "teraType": ["fairy", "water"], - "ability": "speedboost" - }, - { - "species": "espathra", - "weight": 30, - "moves": [ - ["luminacrash"], - ["batonpass"], - ["protect", "reflect", "dazzlinggleam"], - ["calmmind", "substitute"] - ], - "item": ["focussash", "sitrusberry", "leftovers"], - "nature": "timid", - "evs": [252, 0, 4, 0, 0, 252], - "teraType": ["normal", "ghost", "water"], - "ability": "speedboost" - }, - { - "species": "espathra", - "weight": 10, - "moves": [ - ["luminacrash"], - ["energyball"], - ["shadowball"], - ["hypnosis", "batonpass"] - ], - "item": ["focussash"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "timid", - "evs": [0, 0, 0, 252, 4, 252], - "teraType": ["normal", "ghost", "grass"], - "ability": "speedboost" - }, - { - "species": "espathra", - "weight": 5, - "moves": [ - ["lightscreen"], - ["reflect"], - ["luminacrash", "protect"], - ["batonpass"] - ], - "item": ["lightclay"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "timid", - "evs": [252, 0, 0, 4, 0, 252], - "teraType": ["fairy"], - "ability": "speedboost" - } - ] + "weight": 4, + "sets": [ + { + "species": "Espathra", + "weight": 35, + "moves": [ + ["Calm Mind"], + ["Stored Power"], + ["Tera Blast"], + ["Protect", "Roost", "Substitute"] + ], + "item": ["Leftovers", "Lum Berry"], + "nature": "Bold", + "evs": {"hp": 244, "def": 252, "spe": 12}, + "teraType": ["Fighting", "Fire"], + "wantsTera": true, + "ability": ["Speed Boost"] + }, + { + "species": "Espathra", + "weight": 20, + "moves": [ + ["Calm Mind"], + ["Stored Power"], + ["Dazzling Gleam"], + ["Protect", "Roost", "Substitute"] + ], + "item": ["Leftovers", "Lum Berry"], + "nature": "Bold", + "evs": {"hp": 244, "def": 252, "spe": 12}, + "teraType": ["Fairy", "Water"], + "ability": ["Speed Boost"] + }, + { + "species": "Espathra", + "weight": 30, + "moves": [ + ["Lumina Crash"], + ["Baton Pass"], + ["Dazzling Gleam", "Protect", "Reflect"], + ["Calm Mind", "Substitute"] + ], + "item": ["Focus Sash", "Leftovers", "Sitrus Berry"], + "nature": "Timid", + "evs": {"hp": 252, "def": 4, "spe": 252}, + "teraType": ["Ghost", "Normal", "Water"], + "ability": ["Speed Boost"] + }, + { + "species": "Espathra", + "weight": 10, + "moves": [ + ["Lumina Crash"], + ["Energy Ball"], + ["Shadow Ball"], + ["Baton Pass", "Hypnosis"] + ], + "item": ["Focus Sash"], + "nature": "Timid", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "ivs": {"atk": 0}, + "teraType": ["Ghost", "Grass", "Normal"], + "ability": ["Speed Boost"] + }, + { + "species": "Espathra", + "weight": 5, + "moves": [ + ["Light Screen"], + ["Reflect"], + ["Lumina Crash", "Protect"], + ["Baton Pass"] + ], + "item": ["Light Clay"], + "nature": "Timid", + "evs": {"hp": 252, "spa": 4, "spe": 252}, + "ivs": {"atk": 0}, + "teraType": ["Fairy"], + "ability": ["Speed Boost"] + } + ] }, "grimmsnarl": { - "weight": 4, - "sets": [ - { - "species": "grimmsnarl", - "weight": 90, - "moves": [ - ["reflect"], - ["lightscreen"], - ["taunt", "thunderwave"], - ["spiritbreak", "partingshot"] - ], - "item": ["lightclay"], - "nature": "careful", - "evs": [248, 0, 8, 0, 252, 0], - "teraType": ["steel", "poison"], - "ability": "prankster" - }, - { - "species": "grimmsnarl", - "weight": 10, - "moves": [ - ["spiritbreak", "playrough"], - ["crunch", "suckerpunch"], - ["lowkick", "hammerarm", "taunt"], - ["thunderwave"] - ], - "gender": "m", - "item": ["focussash"], - "nature": "adamant", - "evs": [0, 252, 4, 0, 0, 252], - "teraType": ["ghost", "fairy", "dark"], - "ability": "prankster" - } - ] + "weight": 4, + "sets": [ + { + "species": "Grimmsnarl", + "weight": 90, + "moves": [ + ["Reflect"], + ["Light Screen"], + ["Taunt", "Thunder Wave"], + ["Parting Shot", "Spirit Break"] + ], + "item": ["Light Clay"], + "nature": "Careful", + "evs": {"hp": 248, "def": 8, "spd": 252}, + "teraType": ["Poison", "Steel"], + "ability": ["Prankster"] + }, + { + "species": "Grimmsnarl", + "weight": 10, + "moves": [ + ["Play Rough", "Spirit Break"], + ["Crunch", "Sucker Punch"], + ["Hammer Arm", "Low Kick", "Taunt"], + ["Thunder Wave"] + ], + "gender": "M", + "item": ["Focus Sash"], + "nature": "Adamant", + "evs": {"atk": 252, "def": 4, "spe": 252}, + "teraType": ["Dark", "Fairy", "Ghost"], + "ability": ["Prankster"] + } + ] }, "ironhands": { - "weight": 4, - "sets": [ - { - "species": "ironhands", - "weight": 70, - "moves": [ - ["drainpunch"], - ["thunderpunch", "wildcharge"], - ["earthquake", "icepunch", "heavyslam"], - ["voltswitch", "fakeout"] - ], - "item": ["assaultvest"], - "nature": "adamant", - "evs": [0, 252, 0, 0, 204, 52], - "teraType": ["ground", "grass", "water", "fairy"], - "ability": "quarkdrive" - }, - { - "species": "ironhands", - "weight": 30, - "moves": [["drainpunch"], ["thunderpunch"], ["substitute"], ["swordsdance"]], - "item": ["leftovers", "punchingglove"], - "nature": "impish", - "evs": [92, 12, 172, 0, 212, 20], - "teraType": ["fairy", "water", "grass"], - "ability": "quarkdrive" - } - ] + "weight": 4, + "sets": [ + { + "species": "Iron Hands", + "weight": 70, + "moves": [ + ["Drain Punch"], + ["Thunder Punch", "Wild Charge"], + ["Earthquake", "Heavy Slam", "Ice Punch"], + ["Fake Out", "Volt Switch"] + ], + "item": ["Assault Vest"], + "nature": "Adamant", + "evs": {"atk": 252, "spd": 204, "spe": 52}, + "teraType": ["Fairy", "Grass", "Ground", "Water"], + "ability": ["Quark Drive"] + }, + { + "species": "Iron Hands", + "weight": 30, + "moves": [ + ["Drain Punch"], + ["Thunder Punch"], + ["Substitute"], + ["Swords Dance"] + ], + "item": ["Leftovers", "Punching Glove"], + "nature": "Impish", + "evs": {"hp": 92, "atk": 12, "def": 172, "spd": 212, "spe": 20}, + "teraType": ["Fairy", "Grass", "Water"], + "ability": ["Quark Drive"] + } + ] }, "hydreigon": { - "weight": 4, - "sets": [ - { - "species": "hydreigon", - "weight": 45, - "moves": [ - ["darkpulse"], - ["dracometeor"], - ["flashcannon"], - ["flamethrower", "fireblast", "uturn"] - ], - "item": ["choicespecs", "choicescarf"], - "nature": "timid", - "evs": [0, 0, 0, 252, 4, 252], - "teraType": ["steel"], - "wantsTera": true, - "ability": "levitate" - }, - { - "species": "hydreigon", - "weight": 25, - "moves": [ - ["darkpulse"], - ["dracometeor"], - ["flashcannon", "uturn"], - ["flamethrower", "fireblast"] - ], - "item": ["choicespecs"], - "nature": "timid", - "evs": [0, 0, 0, 252, 4, 252], - "teraType": ["poison", "fire"], - "wantsTera": true, - "ability": "levitate" - }, - { - "species": "hydreigon", - "weight": 10, - "moves": [ - ["stealthrock"], - ["darkpulse"], - ["taunt"], - ["thunderwave", "dracometeor", "flashcannon"] - ], - "item": ["focussash"], - "nature": "timid", - "evs": [0, 0, 0, 252, 4, 252], - "teraType": ["steel", "poison"], - "wantsTera": true, - "ability": "levitate" - }, - { - "species": "hydreigon", - "weight": 20, - "moves": [ - ["darkpulse"], - ["flashcannon"], - ["nastyplot"], - ["substitute", "taunt", "flamethrower", "dracometeor", "earthpower"] - ], - "item": ["leftovers", "lifeorb"], - "nature": "timid", - "evs": [0, 0, 0, 252, 4, 252], - "teraType": ["steel"], - "wantsTera": true, - "ability": "levitate" - } - ] + "weight": 4, + "sets": [ + { + "species": "Hydreigon", + "weight": 45, + "moves": [ + ["Dark Pulse"], + ["Draco Meteor"], + ["Flash Cannon"], + ["Fire Blast", "Flamethrower", "U-turn"] + ], + "item": ["Choice Scarf", "Choice Specs"], + "nature": "Timid", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "teraType": ["Steel"], + "wantsTera": true, + "ability": ["Levitate"] + }, + { + "species": "Hydreigon", + "weight": 25, + "moves": [ + ["Dark Pulse"], + ["Draco Meteor"], + ["Flash Cannon", "U-turn"], + ["Fire Blast", "Flamethrower"] + ], + "item": ["Choice Specs"], + "nature": "Timid", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "teraType": ["Fire", "Poison"], + "wantsTera": true, + "ability": ["Levitate"] + }, + { + "species": "Hydreigon", + "weight": 10, + "moves": [ + ["Stealth Rock"], + ["Dark Pulse"], + ["Taunt"], + ["Draco Meteor", "Flash Cannon", "Thunder Wave"] + ], + "item": ["Focus Sash"], + "nature": "Timid", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "teraType": ["Poison", "Steel"], + "wantsTera": true, + "ability": ["Levitate"] + }, + { + "species": "Hydreigon", + "weight": 20, + "moves": [ + ["Dark Pulse"], + ["Flash Cannon"], + ["Nasty Plot"], + ["Draco Meteor", "Earth Power", "Flamethrower", "Substitute", "Taunt"] + ], + "item": ["Leftovers", "Life Orb"], + "nature": "Timid", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "teraType": ["Steel"], + "wantsTera": true, + "ability": ["Levitate"] + } + ] }, "kleavor": { - "weight": 4, - "sets": [ - { - "species": "kleavor", - "weight": 55, - "moves": [ - ["stoneaxe"], - ["nightslash"], - ["feint", "trailblaze"], - ["xscissor", "closecombat", "uturn"] - ], - "item": ["focussash"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["grass", "water", "bug"], - "ability": "sharpness" - }, - { - "species": "kleavor", - "weight": 10, - "moves": [ - ["stoneaxe"], - ["nightslash"], - ["feint", "trailblaze"], - ["xscissor", "closecombat", "uturn"] - ], - "item": ["assaultvest"], - "nature": "adamant", - "evs": [140, 52, 4, 0, 244, 68], - "teraType": ["grass", "water", "bug"], - "ability": "sharpness" - }, - { - "species": "kleavor", - "weight": 35, - "moves": [ - ["stoneaxe"], - ["uturn"], - ["nightslash"], - ["xscissor", "closecombat"] - ], - "item": ["choicescarf"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["bug", "grass"], - "ability": "sharpness" - } - ] + "weight": 4, + "sets": [ + { + "species": "Kleavor", + "weight": 55, + "moves": [ + ["Stone Axe"], + ["Night Slash"], + ["Feint", "Trailblaze"], + ["Close Combat", "U-turn", "X-Scissor"] + ], + "item": ["Focus Sash"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Bug", "Grass", "Water"], + "ability": ["Sharpness"] + }, + { + "species": "Kleavor", + "weight": 10, + "moves": [ + ["Stone Axe"], + ["Night Slash"], + ["Feint", "Trailblaze"], + ["Close Combat", "U-turn", "X-Scissor"] + ], + "item": ["Assault Vest"], + "nature": "Adamant", + "evs": {"hp": 140, "atk": 52, "def": 4, "spd": 244, "spe": 68}, + "teraType": ["Bug", "Grass", "Water"], + "ability": ["Sharpness"] + }, + { + "species": "Kleavor", + "weight": 35, + "moves": [ + ["Stone Axe"], + ["U-turn"], + ["Night Slash"], + ["Close Combat", "X-Scissor"] + ], + "item": ["Choice Scarf"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Bug", "Grass"], + "ability": ["Sharpness"] + } + ] }, "screamtail": { - "weight": 4, - "sets": [ - { - "species": "screamtail", - "weight": 80, - "moves": [ - ["stealthrock"], - ["thunderwave", "trickroom"], - ["encore", "perishsong", "roar"], - ["mistyexplosion"] - ], - "item": ["mentalherb", "boosterenergy", "sitrusberry"], - "nature": "calm", - "evs": [180, 0, 0, 0, 156, 172], - "teraType": ["normal"], - "ability": "protosynthesis" - }, - { - "species": "screamtail", - "weight": 10, - "moves": [ - ["reflect"], - ["lightscreen"], - ["encore"], - ["perishsong", "dazzlinggleam", "stealthrock", "mistyexplosion"] - ], - "item": ["lightclay", "mentalherb"], - "nature": "timid", - "evs": [252, 0, 0, 0, 4, 252], - "teraType": ["normal"], - "ability": "protosynthesis" - }, - { - "species": "screamtail", - "weight": 5, - "moves": [ - ["batonpass"], - ["bulkup", "calmmind"], - ["encore"], - ["dazzlinggleam", "substitute", "playrough"] - ], - "item": ["mentalherb", "sitrusberry"], - "nature": "careful", - "evs": [220, 0, 220, 0, 68, 0], - "teraType": ["normal"], - "ability": "protosynthesis" - }, - { - "species": "screamtail", - "weight": 5, - "moves": [ - ["batonpass"], - ["bulkup", "calmmind"], - ["sing"], - ["playrough", "substitute"] - ], - "item": ["blunderpolicy"], - "nature": "careful", - "evs": [220, 0, 220, 0, 68, 0], - "teraType": ["normal"], - "ability": "protosynthesis" - } - ] + "weight": 4, + "sets": [ + { + "species": "Scream Tail", + "weight": 80, + "moves": [ + ["Stealth Rock"], + ["Thunder Wave", "Trick Room"], + ["Encore", "Perish Song", "Roar"], + ["Misty Explosion"] + ], + "item": ["Booster Energy", "Mental Herb", "Sitrus Berry"], + "nature": "Calm", + "evs": {"hp": 180, "spd": 156, "spe": 172}, + "teraType": ["Normal"], + "ability": ["Protosynthesis"] + }, + { + "species": "Scream Tail", + "weight": 10, + "moves": [ + ["Reflect"], + ["Light Screen"], + ["Encore"], + ["Dazzling Gleam", "Misty Explosion", "Perish Song", "Stealth Rock"] + ], + "item": ["Light Clay", "Mental Herb"], + "nature": "Timid", + "evs": {"hp": 252, "spd": 4, "spe": 252}, + "teraType": ["Normal"], + "ability": ["Protosynthesis"] + }, + { + "species": "Scream Tail", + "weight": 5, + "moves": [ + ["Baton Pass"], + ["Bulk Up", "Calm Mind"], + ["Encore"], + ["Dazzling Gleam", "Play Rough", "Substitute"] + ], + "item": ["Mental Herb", "Sitrus Berry"], + "nature": "Careful", + "evs": {"hp": 220, "def": 220, "spd": 68}, + "teraType": ["Normal"], + "ability": ["Protosynthesis"] + }, + { + "species": "Scream Tail", + "weight": 5, + "moves": [ + ["Baton Pass"], + ["Bulk Up", "Calm Mind"], + ["Sing"], + ["Play Rough", "Substitute"] + ], + "item": ["Blunder Policy"], + "nature": "Careful", + "evs": {"hp": 220, "def": 220, "spd": 68}, + "teraType": ["Normal"], + "ability": ["Protosynthesis"] + } + ] }, "milotic": { - "weight": 4, - "sets": [ - { - "species": "milotic", - "weight": 67, - "moves": [ - ["scald"], - ["recover"], - ["mirrorcoat", "haze"], - ["drainingkiss", "icebeam"] - ], - "item": ["flameorb"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "bold", - "evs": [252, 0, 252, 0, 4, 0], - "teraType": ["fairy", "fire"], - "ability": "marvelscale" - }, - { - "species": "milotic", - "weight": 33, - "moves": [["scald"], ["recover"], ["mirrorcoat", "haze"], ["flipturn"]], - "item": ["flameorb"], - "nature": "bold", - "evs": [252, 0, 252, 0, 4, 0], - "teraType": ["fairy", "fire"], - "ability": "marvelscale" - } - ] + "weight": 4, + "sets": [ + { + "species": "Milotic", + "weight": 67, + "moves": [ + ["Scald"], + ["Recover"], + ["Haze", "Mirror Coat"], + ["Draining Kiss", "Ice Beam"] + ], + "item": ["Flame Orb"], + "nature": "Bold", + "evs": {"hp": 252, "def": 252, "spd": 4}, + "ivs": {"atk": 0}, + "teraType": ["Fairy", "Fire"], + "ability": ["Marvel Scale"] + }, + { + "species": "Milotic", + "weight": 33, + "moves": [ + ["Scald"], + ["Recover"], + ["Haze", "Mirror Coat"], + ["Flip Turn"] + ], + "item": ["Flame Orb"], + "nature": "Bold", + "evs": {"hp": 252, "def": 252, "spd": 4}, + "teraType": ["Fairy", "Fire"], + "ability": ["Marvel Scale"] + } + ] }, "okidogi": { - "weight": 4, - "sets": [ - { - "species": "okidogi", - "weight": 40, - "moves": [ - ["bulkup"], - ["drainpunch"], - ["knockoff"], - ["icepunch", "poisonjab", "taunt", "substitute"] - ], - "item": ["leftovers", "blacksludge", "rockyhelmet"], - "nature": "adamant", - "evs": [252, 156, 0, 0, 0, 100], - "teraType": ["water", "poison", "flying"], - "ability": "toxicchain" - }, - { - "species": "okidogi", - "weight": 35, - "moves": [ - ["bulkup"], - ["drainpunch"], - ["knockoff"], - ["icepunch", "poisonjab", "taunt", "substitute"] - ], - "item": ["leftovers", "blacksludge", "rockyhelmet"], - "nature": "adamant", - "evs": [252, 156, 0, 0, 0, 100], - "teraType": ["water", "poison", "flying"], - "ability": "guarddog" - }, - { - "species": "okidogi", - "weight": 15, - "moves": [ - ["drainpunch"], - ["knockoff"], - ["poisonjab", "poisonfang"], - ["icepunch"] - ], - "item": ["assaultvest"], - "nature": "adamant", - "evs": [252, 252, 0, 0, 4, 0], - "teraType": ["poison", "water", "flying"], - "ability": "guarddog" - }, - { - "species": "okidogi", - "weight": 10, - "moves": [ - ["drainpunch"], - ["knockoff"], - ["poisonjab", "poisonfang"], - ["icepunch"] - ], - "item": ["assaultvest"], - "nature": "adamant", - "evs": [252, 252, 0, 0, 4, 0], - "teraType": ["poison", "water", "flying"], - "ability": "toxicchain" - } - ] + "weight": 4, + "sets": [ + { + "species": "Okidogi", + "weight": 40, + "moves": [ + ["Bulk Up"], + ["Drain Punch"], + ["Knock Off"], + ["Ice Punch", "Poison Jab", "Substitute", "Taunt"] + ], + "item": ["Black Sludge", "Leftovers", "Rocky Helmet"], + "nature": "Adamant", + "evs": {"hp": 252, "atk": 156, "spe": 100}, + "teraType": ["Flying", "Poison", "Water"], + "ability": ["Toxic Chain"] + }, + { + "species": "Okidogi", + "weight": 35, + "moves": [ + ["Bulk Up"], + ["Drain Punch"], + ["Knock Off"], + ["Ice Punch", "Poison Jab", "Substitute", "Taunt"] + ], + "item": ["Black Sludge", "Leftovers", "Rocky Helmet"], + "nature": "Adamant", + "evs": {"hp": 252, "atk": 156, "spe": 100}, + "teraType": ["Flying", "Poison", "Water"], + "ability": ["Guard Dog"] + }, + { + "species": "Okidogi", + "weight": 15, + "moves": [ + ["Drain Punch"], + ["Knock Off"], + ["Poison Fang", "Poison Jab"], + ["Ice Punch"] + ], + "item": ["Assault Vest"], + "nature": "Adamant", + "evs": {"hp": 252, "atk": 252, "spd": 4}, + "teraType": ["Flying", "Poison", "Water"], + "ability": ["Guard Dog"] + }, + { + "species": "Okidogi", + "weight": 10, + "moves": [ + ["Drain Punch"], + ["Knock Off"], + ["Poison Fang", "Poison Jab"], + ["Ice Punch"] + ], + "item": ["Assault Vest"], + "nature": "Adamant", + "evs": {"hp": 252, "atk": 252, "spd": 4}, + "teraType": ["Flying", "Poison", "Water"], + "ability": ["Toxic Chain"] + } + ] }, "arcaninehisui": { - "weight": 4, - "sets": [ - { - "species": "arcaninehisui", - "weight": 45, - "moves": [ - ["headsmash"], - ["flareblitz"], - ["extremespeed"], - ["terablast", "stealthrock"] - ], - "item": ["focussash"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["grass"], - "wantsTera": true, - "ability": "rockhead" - }, - { - "species": "arcaninehisui", - "weight": 50, - "moves": [ - ["headsmash"], - ["flareblitz"], - ["extremespeed"], - ["stealthrock", "wildcharge", "flamecharge"] - ], - "item": ["focussash", "choiceband"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["rock", "normal"], - "wantsTera": true, - "ability": "rockhead" - }, - { - "species": "arcaninehisui", - "weight": 5, - "moves": [["rockblast"], ["flareblitz"], ["extremespeed"], ["terablast"]], - "item": ["loadeddice"], - "nature": "adamant", - "evs": [212, 252, 4, 0, 4, 36], - "teraType": ["fairy"], - "wantsTera": true, - "ability": "intimidate" - } - ] + "weight": 4, + "sets": [ + { + "species": "Arcanine-Hisui", + "weight": 45, + "moves": [ + ["Head Smash"], + ["Flare Blitz"], + ["Extreme Speed"], + ["Stealth Rock", "Tera Blast"] + ], + "item": ["Focus Sash"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Grass"], + "wantsTera": true, + "ability": ["Rock Head"] + }, + { + "species": "Arcanine-Hisui", + "weight": 50, + "moves": [ + ["Head Smash"], + ["Flare Blitz"], + ["Extreme Speed"], + ["Flame Charge", "Stealth Rock", "Wild Charge"] + ], + "item": ["Choice Band", "Focus Sash"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Normal", "Rock"], + "wantsTera": true, + "ability": ["Rock Head"] + }, + { + "species": "Arcanine-Hisui", + "weight": 5, + "moves": [ + ["Rock Blast"], + ["Flare Blitz"], + ["Extreme Speed"], + ["Tera Blast"] + ], + "item": ["Loaded Dice"], + "nature": "Adamant", + "evs": {"hp": 212, "atk": 252, "def": 4, "spd": 4, "spe": 36}, + "teraType": ["Fairy"], + "wantsTera": true, + "ability": ["Intimidate"] + } + ] }, "snorlax": { - "weight": 4, - "sets": [ - { - "species": "snorlax", - "weight": 60, - "moves": [ - ["heavyslam"], - ["fissure", "earthquake"], - ["bodyslam", "protect"], - ["yawn"] - ], - "item": ["leftovers"], - "nature": "careful", - "evs": [252, 0, 92, 0, 164, 0], - "teraType": ["fairy", "ghost"], - "ability": "thickfat" - }, - { - "species": "snorlax", - "weight": 20, - "moves": [ - ["heavyslam"], - ["heatcrash", "earthquake"], - ["doubleedge", "bodyslam"], - ["fissure"] - ], - "item": ["assaultvest"], - "nature": "adamant", - "evs": [0, 252, 252, 0, 4, 0], - "teraType": ["steel", "ghost"], - "ability": "thickfat" - }, - { - "species": "snorlax", - "weight": 20, - "moves": [ - ["heavyslam"], - ["heatcrash", "earthquake"], - ["doubleedge", "bodyslam"], - ["fissure", "terablast"] - ], - "item": ["assaultvest"], - "nature": "adamant", - "evs": [0, 252, 252, 0, 4, 0], - "teraType": ["fairy"], - "ability": "thickfat" - } - ] + "weight": 4, + "sets": [ + { + "species": "Snorlax", + "weight": 60, + "moves": [ + ["Heavy Slam"], + ["Earthquake", "Fissure"], + ["Body Slam", "Protect"], + ["Yawn"] + ], + "item": ["Leftovers"], + "nature": "Careful", + "evs": {"hp": 252, "def": 92, "spd": 164}, + "teraType": ["Fairy", "Ghost"], + "ability": ["Thick Fat"] + }, + { + "species": "Snorlax", + "weight": 20, + "moves": [ + ["Heavy Slam"], + ["Earthquake", "Heat Crash"], + ["Body Slam", "Double-Edge"], + ["Fissure"] + ], + "item": ["Assault Vest"], + "nature": "Adamant", + "evs": {"atk": 252, "def": 252, "spd": 4}, + "teraType": ["Ghost", "Steel"], + "ability": ["Thick Fat"] + }, + { + "species": "Snorlax", + "weight": 20, + "moves": [ + ["Heavy Slam"], + ["Earthquake", "Heat Crash"], + ["Body Slam", "Double-Edge"], + ["Fissure", "Tera Blast"] + ], + "item": ["Assault Vest"], + "nature": "Adamant", + "evs": {"atk": 252, "def": 252, "spd": 4}, + "teraType": ["Fairy"], + "ability": ["Thick Fat"] + } + ] }, "alomomola": { - "weight": 4, - "sets": [ - { - "species": "alomomola", - "weight": 100, - "moves": [["scald"], ["flipturn"], ["mirrorcoat"], ["icywind"]], - "item": ["assaultvest"], - "nature": "sassy", - "evs": [4, 0, 252, 0, 252, 0], - "teraType": ["poison"], - "ability": "regenerator" - } - ] + "weight": 4, + "sets": [ + { + "species": "Alomomola", + "weight": 100, + "moves": [ + ["Scald"], + ["Flip Turn"], + ["Mirror Coat"], + ["Icy Wind"] + ], + "item": ["Assault Vest"], + "nature": "Sassy", + "evs": {"hp": 4, "def": 252, "spd": 252}, + "teraType": ["Poison"], + "ability": ["Regenerator"] + } + ] }, "umbreon": { - "weight": 4, - "sets": [ - { - "species": "umbreon", - "weight": 100, - "moves": [["foulplay"], ["protect"], ["wish"], ["yawn"]], - "item": ["leftovers"], - "nature": "bold", - "evs": [252, 0, 252, 0, 4, 0], - "teraType": ["fairy", "poison"], - "ability": "innerfocus" - } - ] + "weight": 4, + "sets": [ + { + "species": "Umbreon", + "weight": 100, + "moves": [ + ["Foul Play"], + ["Protect"], + ["Wish"], + ["Yawn"] + ], + "item": ["Leftovers"], + "nature": "Bold", + "evs": {"hp": 252, "def": 252, "spd": 4}, + "teraType": ["Fairy", "Poison"], + "ability": ["Inner Focus"] + } + ] }, "cloyster": { - "weight": 3, - "sets": [ - { - "species": "cloyster", - "weight": 60, - "moves": [ - ["shellsmash"], - ["iciclespear"], - ["iceshard", "drillrun", "terablast"], - ["rockblast"] - ], - "item": ["focussash", "kingsrock"], - "nature": "adamant", - "evs": [0, 252, 4, 0, 0, 252], - "teraType": ["ghost"], - "ability": "skilllink" - }, - { - "species": "cloyster", - "weight": 15, - "moves": [["shellsmash"], ["iciclespear"], ["terablast"], ["rockblast"]], - "item": ["focussash", "lifeorb", "lumberry"], - "nature": "adamant", - "evs": [0, 252, 4, 0, 0, 252], - "teraType": ["electric"], - "wantsTera": true, - "ability": "skilllink" - }, - { - "species": "cloyster", - "weight": 25, - "moves": [ - ["shellsmash"], - ["iciclespear"], - ["iceshard", "drillrun"], - ["rockblast"] - ], - "item": ["focussash"], - "nature": "adamant", - "evs": [0, 252, 4, 0, 0, 252], - "teraType": ["ice"], - "ability": "skilllink" - } - ] + "weight": 3, + "sets": [ + { + "species": "Cloyster", + "weight": 60, + "moves": [ + ["Shell Smash"], + ["Icicle Spear"], + ["Drill Run", "Ice Shard", "Tera Blast"], + ["Rock Blast"] + ], + "item": ["Focus Sash", "King's Rock"], + "nature": "Adamant", + "evs": {"atk": 252, "def": 4, "spe": 252}, + "teraType": ["Ghost"], + "ability": ["Skill Link"] + }, + { + "species": "Cloyster", + "weight": 15, + "moves": [ + ["Shell Smash"], + ["Icicle Spear"], + ["Tera Blast"], + ["Rock Blast"] + ], + "item": ["Focus Sash", "Life Orb", "Lum Berry"], + "nature": "Adamant", + "evs": {"atk": 252, "def": 4, "spe": 252}, + "teraType": ["Electric"], + "wantsTera": true, + "ability": ["Skill Link"] + }, + { + "species": "Cloyster", + "weight": 25, + "moves": [ + ["Shell Smash"], + ["Icicle Spear"], + ["Drill Run", "Ice Shard"], + ["Rock Blast"] + ], + "item": ["Focus Sash"], + "nature": "Adamant", + "evs": {"atk": 252, "def": 4, "spe": 252}, + "teraType": ["Ice"], + "ability": ["Skill Link"] + } + ] }, "tinkaton": { - "weight": 3, - "sets": [ - { - "species": "tinkaton", - "weight": 100, - "moves": [ - ["gigatonhammer", "knockoff"], - ["encore"], - ["stealthrock"], - ["thunderwave"] - ], - "item": ["airballoon"], - "nature": "careful", - "evs": [244, 4, 164, 0, 20, 76], - "teraType": ["water", "flying", "ground"], - "ability": "moldbreaker" - } - ] + "weight": 3, + "sets": [ + { + "species": "Tinkaton", + "weight": 100, + "moves": [ + ["Gigaton Hammer", "Knock Off"], + ["Encore"], + ["Stealth Rock"], + ["Thunder Wave"] + ], + "item": ["Air Balloon"], + "nature": "Careful", + "evs": {"hp": 244, "atk": 4, "def": 164, "spd": 20, "spe": 76}, + "teraType": ["Flying", "Ground", "Water"], + "ability": ["Mold Breaker"] + } + ] }, "fezandipiti": { - "weight": 3, - "sets": [ - { - "species": "fezandipiti", - "weight": 50, - "moves": [ - ["calmmind", "heatwave", "charm", "taunt", "tailwind"], - ["moonblast"], - ["roost"], - ["uturn"] - ], - "item": ["leftovers", "covertcloak", "sitrusberry"], - "nature": "bold", - "evs": [252, 0, 220, 0, 0, 36], - "teraType": ["water", "flying"], - "ability": "toxicchain" - }, - { - "species": "fezandipiti", - "weight": 50, - "moves": [ - ["roost"], - ["toxic", "taunt"], - ["uturn"], - ["playrough", "charm"] - ], - "item": ["leftovers"], - "nature": "careful", - "evs": [252, 0, 0, 0, 220, 36], - "teraType": ["water", "flying"], - "ability": "toxicchain" - } - ] + "weight": 3, + "sets": [ + { + "species": "Fezandipiti", + "weight": 50, + "moves": [ + ["Calm Mind", "Charm", "Heat Wave", "Tailwind", "Taunt"], + ["Moonblast"], + ["Roost"], + ["U-turn"] + ], + "item": ["Covert Cloak", "Leftovers", "Sitrus Berry"], + "nature": "Bold", + "evs": {"hp": 252, "def": 220, "spe": 36}, + "teraType": ["Flying", "Water"], + "ability": ["Toxic Chain"] + }, + { + "species": "Fezandipiti", + "weight": 50, + "moves": [ + ["Roost"], + ["Taunt", "Toxic"], + ["U-turn"], + ["Charm", "Play Rough"] + ], + "item": ["Leftovers"], + "nature": "Careful", + "evs": {"hp": 252, "spd": 220, "spe": 36}, + "teraType": ["Flying", "Water"], + "ability": ["Toxic Chain"] + } + ] }, "pelipper": { - "weight": 3, - "sets": [ - { - "species": "pelipper", - "weight": 70, - "moves": [ - ["uturn"], - ["hydropump", "surf"], - ["icebeam"], - ["hurricane", "roost"] - ], - "item": ["damprock"], - "nature": "quiet", - "ivs": [31, 31, 31, 31, 31, 0], - "evs": [252, 0, 4, 252, 0, 0], - "teraType": ["steel", "ground", "grass"], - "ability": "drizzle" - }, - { - "species": "pelipper", - "weight": 30, - "moves": [ - ["uturn"], - ["hydropump", "surf"], - ["icebeam"], - ["hurricane"] - ], - "item": ["damprock", "choicespecs"], - "nature": "modest", - "evs": [0, 0, 0, 252, 4, 252], - "teraType": ["steel", "ground", "grass", "water", "flying"], - "ability": "drizzle" - } - ] + "weight": 3, + "sets": [ + { + "species": "Pelipper", + "weight": 70, + "moves": [ + ["U-turn"], + ["Hydro Pump", "Surf"], + ["Ice Beam"], + ["Hurricane", "Roost"] + ], + "item": ["Damp Rock"], + "nature": "Quiet", + "evs": {"hp": 252, "def": 4, "spa": 252}, + "ivs": {"spe": 0}, + "teraType": ["Grass", "Ground", "Steel"], + "ability": ["Drizzle"] + }, + { + "species": "Pelipper", + "weight": 30, + "moves": [ + ["U-turn"], + ["Hydro Pump", "Surf"], + ["Ice Beam"], + ["Hurricane"] + ], + "item": ["Choice Specs", "Damp Rock"], + "nature": "Modest", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "teraType": ["Flying", "Grass", "Ground", "Steel", "Water"], + "ability": ["Drizzle"] + } + ] }, "rotomheat": { - "weight": 3, - "sets": [ - { - "species": "rotomheat", - "weight": 20, - "moves": [["voltswitch"], ["overheat"], ["trick"], ["thunderbolt"]], - "item": ["choicescarf", "choicespecs"], - "nature": "timid", - "evs": [0, 0, 0, 252, 4, 252], - "teraType": ["electric"], - "ability": "levitate" - }, - { - "species": "rotomheat", - "weight": 20, - "moves": [["voltswitch"], ["overheat"], ["trick"], ["terablast"]], - "item": ["choicescarf", "choicespecs"], - "nature": "timid", - "evs": [0, 0, 0, 252, 4, 252], - "teraType": ["fairy"], - "wantsTera": true, - "ability": "levitate" - }, - { - "species": "rotomheat", - "weight": 60, - "moves": [ - ["voltswitch"], - ["foulplay"], - ["overheat"], - ["willowisp", "thunderwave"] - ], - "item": ["sitrusberry", "rockyhelmet"], - "nature": "bold", - "evs": [252, 0, 252, 0, 4, 0], - "teraType": ["steel", "fairy", "ghost"], - "ability": "levitate" - } - ] + "weight": 3, + "sets": [ + { + "species": "Rotom-Heat", + "weight": 20, + "moves": [ + ["Volt Switch"], + ["Overheat"], + ["Trick"], + ["Thunderbolt"] + ], + "item": ["Choice Scarf", "Choice Specs"], + "nature": "Timid", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "teraType": ["Electric"], + "ability": ["Levitate"] + }, + { + "species": "Rotom-Heat", + "weight": 20, + "moves": [ + ["Volt Switch"], + ["Overheat"], + ["Trick"], + ["Tera Blast"] + ], + "item": ["Choice Scarf", "Choice Specs"], + "nature": "Timid", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "teraType": ["Fairy"], + "wantsTera": true, + "ability": ["Levitate"] + }, + { + "species": "Rotom-Heat", + "weight": 60, + "moves": [ + ["Volt Switch"], + ["Foul Play"], + ["Overheat"], + ["Thunder Wave", "Will-O-Wisp"] + ], + "item": ["Rocky Helmet", "Sitrus Berry"], + "nature": "Bold", + "evs": {"hp": 252, "def": 252, "spd": 4}, + "teraType": ["Fairy", "Ghost", "Steel"], + "ability": ["Levitate"] + } + ] }, "taurospaldeablaze": { - "weight": 3, - "sets": [ - { - "species": "taurospaldeablaze", - "weight": 50, - "moves": [ - ["ragingbull"], - ["bodypress"], - ["willowisp"], - ["rocktomb", "earthquake", "bulkup"] - ], - "item": ["sitrusberry", "rockyhelmet"], - "nature": "impish", - "evs": [252, 0, 252, 0, 4, 0], - "teraType": ["fairy"], - "ability": "intimidate" - }, - { - "species": "taurospaldeablaze", - "weight": 50, - "moves": [ - ["closecombat"], - ["ragingbull", "flareblitz"], - ["flamecharge", "rocktomb"], - ["earthquake", "terablast", "bulkup"] - ], - "item": ["ejectpack"], - "nature": "jolly", - "evs": [4, 252, 0, 0, 0, 252], - "teraType": ["grass", "fairy"], - "wantsTera": true, - "ability": "intimidate" - } - ] + "weight": 3, + "sets": [ + { + "species": "Tauros-Paldea-Blaze", + "weight": 50, + "moves": [ + ["Raging Bull"], + ["Body Press"], + ["Will-O-Wisp"], + ["Bulk Up", "Earthquake", "Rock Tomb"] + ], + "item": ["Rocky Helmet", "Sitrus Berry"], + "nature": "Impish", + "evs": {"hp": 252, "def": 252, "spd": 4}, + "teraType": ["Fairy"], + "ability": ["Intimidate"] + }, + { + "species": "Tauros-Paldea-Blaze", + "weight": 50, + "moves": [ + ["Close Combat"], + ["Flare Blitz", "Raging Bull"], + ["Flame Charge", "Rock Tomb"], + ["Bulk Up", "Earthquake", "Tera Blast"] + ], + "item": ["Eject Pack"], + "nature": "Jolly", + "evs": {"hp": 4, "atk": 252, "spe": 252}, + "teraType": ["Fairy", "Grass"], + "wantsTera": true, + "ability": ["Intimidate"] + } + ] }, "torkoal": { - "weight": 3, - "sets": [ - { - "species": "torkoal", - "weight": 100, - "moves": [ - ["overheat"], - ["yawn"], - ["stealthrock"], - ["solarbeam", "fissure", "bodypress", "clearsmog"] - ], - "item": ["ejectpack"], - "nature": "bold", - "evs": [252, 0, 252, 0, 4, 0], - "teraType": ["grass", "fire"], - "ability": "drought" - } - ] + "weight": 3, + "sets": [ + { + "species": "Torkoal", + "weight": 100, + "moves": [ + ["Overheat"], + ["Yawn"], + ["Stealth Rock"], + ["Body Press", "Clear Smog", "Fissure", "Solar Beam"] + ], + "item": ["Eject Pack"], + "nature": "Bold", + "evs": {"hp": 252, "def": 252, "spd": 4}, + "teraType": ["Fire", "Grass"], + "ability": ["Drought"] + } + ] }, "amoonguss": { - "weight": 3, - "sets": [ - { - "species": "amoonguss", - "weight": 45, - "moves": [ - ["spore"], - ["leafstorm"], - ["foulplay"], - ["sludgebomb", "clearsmog"] - ], - "item": ["ejectpack"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "bold", - "evs": [252, 0, 156, 0, 100, 0], - "teraType": ["water"], - "ability": "regenerator" - }, - { - "species": "amoonguss", - "weight": 35, - "moves": [ - ["spore"], - ["sludgebomb", "clearsmog", "gigadrain"], - ["stompingtantrum", "foulplay"], - ["synthesis"] - ], - "item": ["rockyhelmet", "leftovers"], - "nature": "relaxed", - "evs": [252, 0, 156, 0, 100, 0], - "teraType": ["water", "fairy"], - "ability": "regenerator" - }, - { - "species": "amoonguss", - "weight": 20, - "moves": [ - ["spore"], - ["sludgebomb", "clearsmog", "gigadrain"], - ["stompingtantrum", "foulplay"], - ["synthesis"] - ], - "item": ["blacksludge"], - "nature": "relaxed", - "evs": [252, 0, 156, 0, 100, 0], - "teraType": ["poison"], - "ability": "regenerator" - } - ] + "weight": 3, + "sets": [ + { + "species": "Amoonguss", + "weight": 45, + "moves": [ + ["Spore"], + ["Leaf Storm"], + ["Foul Play"], + ["Clear Smog", "Sludge Bomb"] + ], + "item": ["Eject Pack"], + "nature": "Bold", + "evs": {"hp": 252, "def": 156, "spd": 100}, + "ivs": {"atk": 0}, + "teraType": ["Water"], + "ability": ["Regenerator"] + }, + { + "species": "Amoonguss", + "weight": 35, + "moves": [ + ["Spore"], + ["Clear Smog", "Giga Drain", "Sludge Bomb"], + ["Foul Play", "Stomping Tantrum"], + ["Synthesis"] + ], + "item": ["Leftovers", "Rocky Helmet"], + "nature": "Relaxed", + "evs": {"hp": 252, "def": 156, "spd": 100}, + "teraType": ["Fairy", "Water"], + "ability": ["Regenerator"] + }, + { + "species": "Amoonguss", + "weight": 20, + "moves": [ + ["Spore"], + ["Clear Smog", "Giga Drain", "Sludge Bomb"], + ["Foul Play", "Stomping Tantrum"], + ["Synthesis"] + ], + "item": ["Black Sludge"], + "nature": "Relaxed", + "evs": {"hp": 252, "def": 156, "spd": 100}, + "teraType": ["Poison"], + "ability": ["Regenerator"] + } + ] }, "greattusk": { - "weight": 3, - "sets": [ - { - "species": "greattusk", - "weight": 45, - "moves": [ - ["closecombat"], - ["earthquake", "headlongrush"], - ["icespinner"], - ["rapidspin", "knockoff", "stealthrock"] - ], - "item": ["boosterenergy", "focussash"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["steel", "water", "ground"], - "ability": "protosynthesis" - }, - { - "species": "greattusk", - "weight": 15, - "moves": [ - ["closecombat"], - ["earthquake", "headlongrush"], - ["icespinner"], - ["rapidspin", "knockoff"] - ], - "item": ["assaultvest"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["steel", "water", "ground"], - "ability": "protosynthesis" - }, - { - "species": "greattusk", - "weight": 25, - "moves": [ - ["bulkup"], - ["earthquake"], - ["icespinner"], - ["taunt", "substitute"] - ], - "item": ["leftovers", "boosterenergy"], - "nature": "jolly", - "evs": [4, 0, 0, 0, 252, 252], - "teraType": ["water", "steel"], - "ability": "protosynthesis" - }, - { - "species": "greattusk", - "weight": 15, - "moves": [ - ["closecombat"], - ["headlongrush", "earthquake"], - ["icespinner"], - ["knockoff"] - ], - "item": ["choicescarf", "choiceband"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["ground", "fighting", "steel"], - "ability": "protosynthesis" - } - ] + "weight": 3, + "sets": [ + { + "species": "Great Tusk", + "weight": 45, + "moves": [ + ["Close Combat"], + ["Earthquake", "Headlong Rush"], + ["Ice Spinner"], + ["Knock Off", "Rapid Spin", "Stealth Rock"] + ], + "item": ["Booster Energy", "Focus Sash"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Ground", "Steel", "Water"], + "ability": ["Protosynthesis"] + }, + { + "species": "Great Tusk", + "weight": 15, + "moves": [ + ["Close Combat"], + ["Earthquake", "Headlong Rush"], + ["Ice Spinner"], + ["Knock Off", "Rapid Spin"] + ], + "item": ["Assault Vest"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Ground", "Steel", "Water"], + "ability": ["Protosynthesis"] + }, + { + "species": "Great Tusk", + "weight": 25, + "moves": [ + ["Bulk Up"], + ["Earthquake"], + ["Ice Spinner"], + ["Substitute", "Taunt"] + ], + "item": ["Booster Energy", "Leftovers"], + "nature": "Jolly", + "evs": {"hp": 4, "spd": 252, "spe": 252}, + "teraType": ["Steel", "Water"], + "ability": ["Protosynthesis"] + }, + { + "species": "Great Tusk", + "weight": 15, + "moves": [ + ["Close Combat"], + ["Earthquake", "Headlong Rush"], + ["Ice Spinner"], + ["Knock Off"] + ], + "item": ["Choice Band", "Choice Scarf"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Fighting", "Ground", "Steel"], + "ability": ["Protosynthesis"] + } + ] }, "thundurustherian": { - "weight": 3, - "sets": [ - { - "species": "thundurustherian", - "weight": 45, - "moves": [ - ["voltswitch"], - ["thunderbolt"], - ["terablast"], - ["grassknot", "focusblast", "sludgebomb"] - ], - "item": ["choicescarf"], - "nature": "timid", - "ivs": [31, 0, 31, 31, 31, 31], - "evs": [4, 0, 0, 252, 0, 252], - "teraType": ["flying", "ice"], - "wantsTera": true, - "ability": "voltabsorb" - }, - { - "species": "thundurustherian", - "weight": 45, - "moves": [ - ["voltswitch"], - ["thunderbolt"], - ["terablast"], - ["grassknot", "focusblast", "sludgebomb"] - ], - "item": ["choicespecs", "assaultvest"], - "nature": "timid", - "ivs": [31, 0, 31, 31, 31, 31], - "evs": [4, 0, 0, 252, 0, 252], - "teraType": ["flying", "ice", "water"], - "wantsTera": true, - "ability": "voltabsorb" - }, - { - "species": "thundurustherian", - "weight": 10, - "moves": [ - ["nastyplot"], - ["thunderbolt"], - ["grassknot", "substitute"], - ["terablast"] - ], - "item": ["lifeorb", "sitrusberry"], - "nature": "timid", - "ivs": [31, 0, 31, 31, 31, 31], - "evs": [0, 0, 4, 252, 0, 252], - "teraType": ["flying", "ice", "water"], - "wantsTera": true, - "ability": "voltabsorb" - } - ] + "weight": 3, + "sets": [ + { + "species": "Thundurus-Therian", + "weight": 45, + "moves": [ + ["Volt Switch"], + ["Thunderbolt"], + ["Tera Blast"], + ["Focus Blast", "Grass Knot", "Sludge Bomb"] + ], + "item": ["Choice Scarf"], + "nature": "Timid", + "evs": {"hp": 4, "spa": 252, "spe": 252}, + "ivs": {"atk": 0}, + "teraType": ["Flying", "Ice"], + "wantsTera": true, + "ability": ["Volt Absorb"] + }, + { + "species": "Thundurus-Therian", + "weight": 45, + "moves": [ + ["Volt Switch"], + ["Thunderbolt"], + ["Tera Blast"], + ["Focus Blast", "Grass Knot", "Sludge Bomb"] + ], + "item": ["Assault Vest", "Choice Specs"], + "nature": "Timid", + "evs": {"hp": 4, "spa": 252, "spe": 252}, + "ivs": {"atk": 0}, + "teraType": ["Flying", "Ice", "Water"], + "wantsTera": true, + "ability": ["Volt Absorb"] + }, + { + "species": "Thundurus-Therian", + "weight": 10, + "moves": [ + ["Nasty Plot"], + ["Thunderbolt"], + ["Grass Knot", "Substitute"], + ["Tera Blast"] + ], + "item": ["Life Orb", "Sitrus Berry"], + "nature": "Timid", + "evs": {"def": 4, "spa": 252, "spe": 252}, + "ivs": {"atk": 0}, + "teraType": ["Flying", "Ice", "Water"], + "wantsTera": true, + "ability": ["Volt Absorb"] + } + ] }, "arcanine": { - "weight": 3, - "sets": [ - { - "species": "arcanine", - "weight": 50, - "moves": [["flareblitz"], ["morningsun"], ["willowisp"], ["extremespeed"]], - "item": ["heavydutyboots", "rockyhelmet", "leftovers"], - "nature": "impish", - "evs": [236, 0, 212, 0, 0, 60], - "teraType": ["normal"], - "ability": "intimidate" - }, - { - "species": "arcanine", - "weight": 50, - "moves": [ - ["flareblitz", "roar"], - ["morningsun"], - ["willowisp"], - ["extremespeed", "snarl", "bulldoze"] - ], - "item": ["heavydutyboots", "rockyhelmet", "leftovers"], - "nature": "impish", - "evs": [236, 0, 212, 0, 0, 60], - "teraType": ["fairy", "grass"], - "ability": "intimidate" - } - ] + "weight": 3, + "sets": [ + { + "species": "Arcanine", + "weight": 50, + "moves": [ + ["Flare Blitz"], + ["Morning Sun"], + ["Will-O-Wisp"], + ["Extreme Speed"] + ], + "item": ["Heavy-Duty Boots", "Leftovers", "Rocky Helmet"], + "nature": "Impish", + "evs": {"hp": 236, "def": 212, "spe": 60}, + "teraType": ["Normal"], + "ability": ["Intimidate"] + }, + { + "species": "Arcanine", + "weight": 50, + "moves": [ + ["Flare Blitz", "Roar"], + ["Morning Sun"], + ["Will-O-Wisp"], + ["Bulldoze", "Extreme Speed", "Snarl"] + ], + "item": ["Heavy-Duty Boots", "Leftovers", "Rocky Helmet"], + "nature": "Impish", + "evs": {"hp": 236, "def": 212, "spe": 60}, + "teraType": ["Fairy", "Grass"], + "ability": ["Intimidate"] + } + ] }, "gyarados": { - "weight": 3, - "sets": [ - { - "species": "gyarados", - "weight": 100, - "moves": [ - ["taunt"], - ["waterfall", "ironhead"], - ["earthquake", "icefang"], - ["thunderwave"] - ], - "item": ["rockyhelmet"], - "nature": "impish", - "evs": [228, 4, 220, 0, 4, 52], - "teraType": ["steel", "ground"], - "ability": "intimidate" - } - ] + "weight": 3, + "sets": [ + { + "species": "Gyarados", + "weight": 100, + "moves": [ + ["Taunt"], + ["Iron Head", "Waterfall"], + ["Earthquake", "Ice Fang"], + ["Thunder Wave"] + ], + "item": ["Rocky Helmet"], + "nature": "Impish", + "evs": {"hp": 228, "atk": 4, "def": 220, "spd": 4, "spe": 52}, + "teraType": ["Ground", "Steel"], + "ability": ["Intimidate"] + } + ] }, "pawmot": { - "weight": 3, - "sets": [ - { - "species": "pawmot", - "weight": 33, - "moves": [ - ["doubleshock"], - ["closecombat"], - ["machpunch", "nuzzle", "icepunch"], - ["revivalblessing", "encore"] - ], - "item": ["focussash"], - "nature": "jolly", - "evs": [4, 252, 0, 0, 0, 252], - "teraType": ["electric"], - "ability": "ironfist" - }, - { - "species": "pawmot", - "weight": 33, - "moves": [ - ["doubleshock"], - ["closecombat"], - ["machpunch", "nuzzle", "icepunch"], - ["revivalblessing", "encore"] - ], - "item": ["focussash"], - "nature": "jolly", - "evs": [4, 252, 0, 0, 0, 252], - "teraType": ["electric"], - "ability": "voltabsorb" - }, - { - "species": "pawmot", - "weight": 33, - "moves": [ - ["doubleshock"], - ["closecombat"], - ["machpunch", "nuzzle", "icepunch"], - ["revivalblessing", "encore"] - ], - "item": ["focussash"], - "nature": "jolly", - "evs": [4, 252, 0, 0, 0, 252], - "teraType": ["electric"], - "ability": "naturalcure" - } - ] + "weight": 3, + "sets": [ + { + "species": "Pawmot", + "weight": 33, + "moves": [ + ["Double Shock"], + ["Close Combat"], + ["Ice Punch", "Mach Punch", "Nuzzle"], + ["Encore", "Revival Blessing"] + ], + "item": ["Focus Sash"], + "nature": "Jolly", + "evs": {"hp": 4, "atk": 252, "spe": 252}, + "teraType": ["Electric"], + "ability": ["Iron Fist"] + }, + { + "species": "Pawmot", + "weight": 33, + "moves": [ + ["Double Shock"], + ["Close Combat"], + ["Ice Punch", "Mach Punch", "Nuzzle"], + ["Encore", "Revival Blessing"] + ], + "item": ["Focus Sash"], + "nature": "Jolly", + "evs": {"hp": 4, "atk": 252, "spe": 252}, + "teraType": ["Electric"], + "ability": ["Volt Absorb"] + }, + { + "species": "Pawmot", + "weight": 33, + "moves": [ + ["Double Shock"], + ["Close Combat"], + ["Ice Punch", "Mach Punch", "Nuzzle"], + ["Encore", "Revival Blessing"] + ], + "item": ["Focus Sash"], + "nature": "Jolly", + "evs": {"hp": 4, "atk": 252, "spe": 252}, + "teraType": ["Electric"], + "ability": ["Natural Cure"] + } + ] }, "zoroarkhisui": { - "weight": 3, - "sets": [ - { - "species": "zoroarkhisui", - "weight": 60, - "moves": [ - ["bittermalice"], - ["willowisp"], - ["shadowsneak"], - ["curse", "terablast"] - ], - "item": ["focussash"], - "nature": "timid", - "evs": [0, 0, 4, 252, 0, 252], - "teraType": ["fairy", "fighting", "ghost"], - "wantsTera": true, - "ability": "illusion" - }, - { - "species": "zoroarkhisui", - "weight": 40, - "moves": [["bittermalice"], ["curse"], ["willowisp"], ["trick"]], - "item": ["choicescarf"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "timid", - "evs": [252, 0, 0, 4, 0, 252], - "teraType": ["ghost", "fairy"], - "ability": "illusion" - } - ] + "weight": 3, + "sets": [ + { + "species": "Zoroark-Hisui", + "weight": 60, + "moves": [ + ["Bitter Malice"], + ["Will-O-Wisp"], + ["Shadow Sneak"], + ["Curse", "Tera Blast"] + ], + "item": ["Focus Sash"], + "nature": "Timid", + "evs": {"def": 4, "spa": 252, "spe": 252}, + "teraType": ["Fairy", "Fighting", "Ghost"], + "wantsTera": true, + "ability": ["Illusion"] + }, + { + "species": "Zoroark-Hisui", + "weight": 40, + "moves": [ + ["Bitter Malice"], + ["Curse"], + ["Will-O-Wisp"], + ["Trick"] + ], + "item": ["Choice Scarf"], + "nature": "Timid", + "evs": {"hp": 252, "spa": 4, "spe": 252}, + "ivs": {"atk": 0}, + "teraType": ["Fairy", "Ghost"], + "ability": ["Illusion"] + } + ] }, "drifblim": { - "weight": 2, - "sets": [ - { - "species": "drifblim", - "weight": 95, - "moves": [ - ["minimize"], - ["substitute"], - ["batonpass"], - ["strengthsap", "willowisp", "airslash", "stockpile", "shadowball"] - ], - "item": ["sitrusberry", "keeberry"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "timid", - "evs": [0, 0, 164, 0, 92, 252], - "teraType": ["water", "normal", "dark"], - "ability": "unburden" - }, - { - "species": "drifblim", - "weight": 5, - "moves": [ - ["minimize"], - ["substitute"], - ["batonpass"], - ["strengthsap", "willowisp", "airslash", "stockpile", "shadowball"] - ], - "item": ["grassyseed"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "timid", - "evs": [0, 0, 164, 0, 92, 252], - "teraType": ["water", "normal", "dark"], - "ability": "unburden" - } - ] + "weight": 2, + "sets": [ + { + "species": "Drifblim", + "weight": 95, + "moves": [ + ["Minimize"], + ["Substitute"], + ["Baton Pass"], + ["Air Slash", "Shadow Ball", "Stockpile", "Strength Sap", "Will-O-Wisp"] + ], + "item": ["Kee Berry", "Sitrus Berry"], + "nature": "Timid", + "evs": {"def": 164, "spd": 92, "spe": 252}, + "ivs": {"atk": 0}, + "teraType": ["Dark", "Normal", "Water"], + "ability": ["Unburden"] + }, + { + "species": "Drifblim", + "weight": 5, + "moves": [ + ["Minimize"], + ["Substitute"], + ["Baton Pass"], + ["Air Slash", "Shadow Ball", "Stockpile", "Strength Sap", "Will-O-Wisp"] + ], + "item": ["Grassy Seed"], + "nature": "Timid", + "evs": {"def": 164, "spd": 92, "spe": 252}, + "ivs": {"atk": 0}, + "teraType": ["Dark", "Normal", "Water"], + "ability": ["Unburden"] + } + ] }, "hatterene": { - "weight": 2, - "sets": [ - { - "species": "hatterene", - "weight": 30, - "moves": [ - ["drainingkiss"], - ["psyshock"], - ["calmmind"], - ["batonpass", "mysticalfire", "trickroom"] - ], - "item": ["wikiberry", "sitrusberry"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "bold", - "evs": [244, 0, 252, 12, 0, 0], - "teraType": ["water", "normal", "fire"], - "ability": "magicbounce" - }, - { - "species": "hatterene", - "weight": 35, - "moves": [ - ["drainingkiss", "dazzlinggleam"], - ["psyshock"], - ["calmmind", "healingwish"], - ["trickroom"] - ], - "item": ["wikiberry", "sitrusberry"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "bold", - "evs": [244, 0, 252, 12, 0, 0], - "teraType": ["water", "normal"], - "ability": "magicbounce" - }, - { - "species": "hatterene", - "weight": 35, - "moves": [ - ["dazzlinggleam"], - ["psyshock"], - ["calmmind", "healingwish"], - ["trickroom"] - ], - "item": ["focussash"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "quiet", - "evs": [252, 0, 4, 252, 0, 0], - "teraType": ["water", "normal", "fairy"], - "ability": "magicbounce" - } - ] + "weight": 2, + "sets": [ + { + "species": "Hatterene", + "weight": 30, + "moves": [ + ["Draining Kiss"], + ["Psyshock"], + ["Calm Mind"], + ["Baton Pass", "Mystical Fire", "Trick Room"] + ], + "item": ["Sitrus Berry", "Wiki Berry"], + "nature": "Bold", + "evs": {"hp": 244, "def": 252, "spa": 12}, + "ivs": {"atk": 0}, + "teraType": ["Fire", "Normal", "Water"], + "ability": ["Magic Bounce"] + }, + { + "species": "Hatterene", + "weight": 35, + "moves": [ + ["Dazzling Gleam", "Draining Kiss"], + ["Psyshock"], + ["Calm Mind", "Healing Wish"], + ["Trick Room"] + ], + "item": ["Sitrus Berry", "Wiki Berry"], + "nature": "Bold", + "evs": {"hp": 244, "def": 252, "spa": 12}, + "ivs": {"atk": 0}, + "teraType": ["Normal", "Water"], + "ability": ["Magic Bounce"] + }, + { + "species": "Hatterene", + "weight": 35, + "moves": [ + ["Dazzling Gleam"], + ["Psyshock"], + ["Calm Mind", "Healing Wish"], + ["Trick Room"] + ], + "item": ["Focus Sash"], + "nature": "Quiet", + "evs": {"hp": 252, "def": 4, "spa": 252}, + "ivs": {"atk": 0}, + "teraType": ["Fairy", "Normal", "Water"], + "ability": ["Magic Bounce"] + } + ] }, "orthworm": { - "weight": 2, - "sets": [ - { - "species": "orthworm", - "weight": 60, - "moves": [ - ["irondefense"], - ["bodypress"], - ["ironhead", "stealthrock"], - ["shedtail"] - ], - "item": ["sitrusberry", "rockyhelmet"], - "nature": "impish", - "evs": [252, 0, 252, 0, 4, 0], - "teraType": ["poison", "ghost", "fairy"], - "ability": "eartheater" - }, - { - "species": "orthworm", - "weight": 40, - "moves": [ - ["irondefense"], - ["bodypress"], - ["ironhead", "stealthrock"], - ["rest"] - ], - "item": ["chestoberry", "rockyhelmet"], - "nature": "impish", - "evs": [252, 0, 252, 0, 4, 0], - "teraType": ["poison", "ghost", "fairy"], - "ability": "eartheater" - } - ] + "weight": 2, + "sets": [ + { + "species": "Orthworm", + "weight": 60, + "moves": [ + ["Iron Defense"], + ["Body Press"], + ["Iron Head", "Stealth Rock"], + ["Shed Tail"] + ], + "item": ["Rocky Helmet", "Sitrus Berry"], + "nature": "Impish", + "evs": {"hp": 252, "def": 252, "spd": 4}, + "teraType": ["Fairy", "Ghost", "Poison"], + "ability": ["Earth Eater"] + }, + { + "species": "Orthworm", + "weight": 40, + "moves": [ + ["Iron Defense"], + ["Body Press"], + ["Iron Head", "Stealth Rock"], + ["Rest"] + ], + "item": ["Chesto Berry", "Rocky Helmet"], + "nature": "Impish", + "evs": {"hp": 252, "def": 252, "spd": 4}, + "teraType": ["Fairy", "Ghost", "Poison"], + "ability": ["Earth Eater"] + } + ] }, "sandyshocks": { - "weight": 2, - "sets": [ - { - "species": "sandyshocks", - "weight": 10, - "moves": [ - ["stealthrock"], - ["thunderbolt"], - ["earthpower"], - ["thunderwave", "mirrorcoat"] - ], - "item": ["focussash"], - "nature": "timid", - "evs": [4, 0, 0, 252, 0, 252], - "teraType": ["ground", "electric"], - "ability": "protosynthesis" - }, - { - "species": "sandyshocks", - "weight": 10, - "moves": [ - ["stealthrock", "mirrorcoat"], - ["thunderbolt"], - ["earthpower"], - ["terablast"] - ], - "item": ["focussash"], - "nature": "timid", - "evs": [4, 0, 0, 252, 0, 252], - "teraType": ["ice"], - "wantsTera": true, - "ability": "protosynthesis" - }, - { - "species": "sandyshocks", - "weight": 60, - "moves": [ - ["thunderbolt"], - ["earthpower"], - ["terablast"], - ["stealthrock", "flashcannon"] - ], - "item": ["boosterenergy"], - "nature": "timid", - "evs": [52, 0, 0, 204, 0, 252], - "teraType": ["ice", "fairy"], - "wantsTera": true, - "ability": "protosynthesis" - }, - { - "species": "sandyshocks", - "weight": 10, - "moves": [ - ["thunderbolt"], - ["voltswitch"], - ["earthpower"], - ["terablast"] - ], - "item": ["choicescarf"], - "nature": "timid", - "evs": [4, 0, 0, 252, 0, 252], - "teraType": ["ice", "fairy"], - "wantsTera": true, - "ability": "protosynthesis" - }, - { - "species": "sandyshocks", - "weight": 10, - "moves": [ - ["thunderbolt", "mirrorcoat"], - ["voltswitch"], - ["earthpower"], - ["terablast"] - ], - "item": ["assaultvest"], - "nature": "timid", - "evs": [4, 0, 0, 252, 0, 252], - "teraType": ["ice", "fairy"], - "wantsTera": true, - "ability": "protosynthesis" - } - ] + "weight": 2, + "sets": [ + { + "species": "Sandy Shocks", + "weight": 10, + "moves": [ + ["Stealth Rock"], + ["Thunderbolt"], + ["Earth Power"], + ["Mirror Coat", "Thunder Wave"] + ], + "item": ["Focus Sash"], + "nature": "Timid", + "evs": {"hp": 4, "spa": 252, "spe": 252}, + "teraType": ["Electric", "Ground"], + "ability": ["Protosynthesis"] + }, + { + "species": "Sandy Shocks", + "weight": 10, + "moves": [ + ["Mirror Coat", "Stealth Rock"], + ["Thunderbolt"], + ["Earth Power"], + ["Tera Blast"] + ], + "item": ["Focus Sash"], + "nature": "Timid", + "evs": {"hp": 4, "spa": 252, "spe": 252}, + "teraType": ["Ice"], + "wantsTera": true, + "ability": ["Protosynthesis"] + }, + { + "species": "Sandy Shocks", + "weight": 60, + "moves": [ + ["Thunderbolt"], + ["Earth Power"], + ["Tera Blast"], + ["Flash Cannon", "Stealth Rock"] + ], + "item": ["Booster Energy"], + "nature": "Timid", + "evs": {"hp": 52, "spa": 204, "spe": 252}, + "teraType": ["Fairy", "Ice"], + "wantsTera": true, + "ability": ["Protosynthesis"] + }, + { + "species": "Sandy Shocks", + "weight": 10, + "moves": [ + ["Thunderbolt"], + ["Volt Switch"], + ["Earth Power"], + ["Tera Blast"] + ], + "item": ["Choice Scarf"], + "nature": "Timid", + "evs": {"hp": 4, "spa": 252, "spe": 252}, + "teraType": ["Fairy", "Ice"], + "wantsTera": true, + "ability": ["Protosynthesis"] + }, + { + "species": "Sandy Shocks", + "weight": 10, + "moves": [ + ["Mirror Coat", "Thunderbolt"], + ["Volt Switch"], + ["Earth Power"], + ["Tera Blast"] + ], + "item": ["Assault Vest"], + "nature": "Timid", + "evs": {"hp": 4, "spa": 252, "spe": 252}, + "teraType": ["Fairy", "Ice"], + "wantsTera": true, + "ability": ["Protosynthesis"] + } + ] }, "greninja": { - "weight": 2, - "sets": [ - { - "species": "greninja", - "weight": 50, - "moves": [ - ["icebeam"], - ["grassknot", "darkpulse"], - ["watershuriken"], - ["counter", "toxicspikes"] - ], - "item": ["focussash"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "timid", - "evs": [0, 0, 0, 252, 4, 252], - "teraType": ["water", "ghost"], - "ability": "protean" - }, - { - "species": "greninja", - "weight": 50, - "moves": [ - ["icebeam"], - ["grassknot", "darkpulse"], - ["watershuriken"], - ["counter", "toxicspikes"] - ], - "item": ["focussash"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "timid", - "evs": [0, 0, 0, 252, 4, 252], - "teraType": ["water", "ghost"], - "ability": "torrent" - } - ] + "weight": 2, + "sets": [ + { + "species": "Greninja", + "weight": 50, + "moves": [ + ["Ice Beam"], + ["Dark Pulse", "Grass Knot"], + ["Water Shuriken"], + ["Counter", "Toxic Spikes"] + ], + "item": ["Focus Sash"], + "nature": "Timid", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "ivs": {"atk": 0}, + "teraType": ["Ghost", "Water"], + "ability": ["Protean"] + }, + { + "species": "Greninja", + "weight": 50, + "moves": [ + ["Ice Beam"], + ["Dark Pulse", "Grass Knot"], + ["Water Shuriken"], + ["Counter", "Toxic Spikes"] + ], + "item": ["Focus Sash"], + "nature": "Timid", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "ivs": {"atk": 0}, + "teraType": ["Ghost", "Water"], + "ability": ["Torrent"] + } + ] }, "palafin": { - "weight": 2, - "sets": [ - { - "species": "palafin", - "weight": 40, - "moves": [ - ["jetpunch"], - ["wavecrash"], - ["flipturn"], - ["icepunch", "closecombat", "drainpunch"] - ], - "item": ["choiceband"], - "nature": "jolly", - "evs": [4, 252, 0, 0, 0, 252], - "teraType": ["water"], - "ability": "zerotohero" - }, - { - "species": "palafin", - "weight": 30, - "moves": [ - ["jetpunch"], - ["wavecrash"], - ["flipturn"], - ["drainpunch", "closecombat"] - ], - "item": ["assaultvest", "choicescarf", "mysticwater"], - "nature": "jolly", - "evs": [4, 252, 0, 0, 0, 252], - "teraType": ["water", "fighting"], - "ability": "zerotohero" - }, - { - "species": "palafin", - "weight": 20, - "moves": [ - ["bulkup"], - ["jetpunch"], - ["drainpunch"], - ["substitute", "taunt"] - ], - "item": ["leftovers", "punchingglove"], - "nature": "jolly", - "evs": [252, 0, 4, 0, 0, 252], - "teraType": ["fighting", "water"], - "ability": "zerotohero" - }, - { - "species": "palafin", - "weight": 10, - "moves": [ - ["bulkup"], - ["jetpunch"], - ["terablast"], - ["substitute", "taunt"] - ], - "item": ["leftovers"], - "nature": "jolly", - "evs": [252, 0, 4, 0, 0, 252], - "teraType": ["fairy"], - "wantsTera": true, - "ability": "zerotohero" - } - ] + "weight": 2, + "sets": [ + { + "species": "Palafin", + "weight": 40, + "moves": [ + ["Jet Punch"], + ["Wave Crash"], + ["Flip Turn"], + ["Close Combat", "Drain Punch", "Ice Punch"] + ], + "item": ["Choice Band"], + "nature": "Jolly", + "evs": {"hp": 4, "atk": 252, "spe": 252}, + "teraType": ["Water"], + "ability": ["Zero to Hero"] + }, + { + "species": "Palafin", + "weight": 30, + "moves": [ + ["Jet Punch"], + ["Wave Crash"], + ["Flip Turn"], + ["Close Combat", "Drain Punch"] + ], + "item": ["Assault Vest", "Choice Scarf", "Mystic Water"], + "nature": "Jolly", + "evs": {"hp": 4, "atk": 252, "spe": 252}, + "teraType": ["Fighting", "Water"], + "ability": ["Zero to Hero"] + }, + { + "species": "Palafin", + "weight": 20, + "moves": [ + ["Bulk Up"], + ["Jet Punch"], + ["Drain Punch"], + ["Substitute", "Taunt"] + ], + "item": ["Leftovers", "Punching Glove"], + "nature": "Jolly", + "evs": {"hp": 252, "def": 4, "spe": 252}, + "teraType": ["Fighting", "Water"], + "ability": ["Zero to Hero"] + }, + { + "species": "Palafin", + "weight": 10, + "moves": [ + ["Bulk Up"], + ["Jet Punch"], + ["Tera Blast"], + ["Substitute", "Taunt"] + ], + "item": ["Leftovers"], + "nature": "Jolly", + "evs": {"hp": 252, "def": 4, "spe": 252}, + "teraType": ["Fairy"], + "wantsTera": true, + "ability": ["Zero to Hero"] + } + ] }, "regieleki": { - "weight": 2, - "sets": [ - { - "species": "regieleki", - "weight": 25, - "moves": [ - ["thunderbolt"], - ["terablast"], - ["extremespeed"], - ["wildcharge", "voltswitch", "thunderwave"] - ], - "item": ["lifeorb", "focussash"], - "nature": "hasty", - "evs": [0, 4, 0, 252, 0, 252], - "teraType": ["ice"], - "wantsTera": true, - "ability": "transistor" - }, - { - "species": "regieleki", - "weight": 20, - "moves": [ - ["thunderbolt"], - ["voltswitch"], - ["extremespeed"], - ["wildcharge"] - ], - "item": ["lifeorb"], - "nature": "hasty", - "evs": [0, 4, 0, 252, 0, 252], - "teraType": ["electric"], - "ability": "transistor" - }, - { - "species": "regieleki", - "weight": 25, - "moves": [ - ["thunderbolt"], - ["terablast"], - ["voltswitch"], - ["extremespeed", "thundercage"] - ], - "item": ["choicespecs"], - "nature": "timid", - "evs": [4, 0, 0, 252, 0, 252], - "teraType": ["ice"], - "wantsTera": true, - "ability": "transistor" - }, - { - "species": "regieleki", - "weight": 15, - "moves": [ - ["thundercage", "thunderbolt"], - ["reflect"], - ["lightscreen"], - ["terablast"] - ], - "item": ["lightclay"], - "nature": "timid", - "evs": [252, 0, 0, 4, 0, 252], - "teraType": ["ice"], - "wantsTera": true, - "ability": "transistor" - }, - { - "species": "regieleki", - "weight": 15, - "moves": [ - ["thundercage", "thunderbolt"], - ["reflect"], - ["lightscreen"], - ["explosion", "thunderwave"] - ], - "item": ["lightclay"], - "nature": "timid", - "evs": [252, 0, 0, 4, 0, 252], - "teraType": ["ghost", "normal"], - "ability": "transistor" - } - ] + "weight": 2, + "sets": [ + { + "species": "Regieleki", + "weight": 25, + "moves": [ + ["Thunderbolt"], + ["Tera Blast"], + ["Extreme Speed"], + ["Thunder Wave", "Volt Switch", "Wild Charge"] + ], + "item": ["Focus Sash", "Life Orb"], + "nature": "Hasty", + "evs": {"atk": 4, "spa": 252, "spe": 252}, + "teraType": ["Ice"], + "wantsTera": true, + "ability": ["Transistor"] + }, + { + "species": "Regieleki", + "weight": 20, + "moves": [ + ["Thunderbolt"], + ["Volt Switch"], + ["Extreme Speed"], + ["Wild Charge"] + ], + "item": ["Life Orb"], + "nature": "Hasty", + "evs": {"atk": 4, "spa": 252, "spe": 252}, + "teraType": ["Electric"], + "ability": ["Transistor"] + }, + { + "species": "Regieleki", + "weight": 25, + "moves": [ + ["Thunderbolt"], + ["Tera Blast"], + ["Volt Switch"], + ["Extreme Speed", "Thunder Cage"] + ], + "item": ["Choice Specs"], + "nature": "Timid", + "evs": {"hp": 4, "spa": 252, "spe": 252}, + "teraType": ["Ice"], + "wantsTera": true, + "ability": ["Transistor"] + }, + { + "species": "Regieleki", + "weight": 15, + "moves": [ + ["Thunderbolt", "Thunder Cage"], + ["Reflect"], + ["Light Screen"], + ["Tera Blast"] + ], + "item": ["Light Clay"], + "nature": "Timid", + "evs": {"hp": 252, "spa": 4, "spe": 252}, + "teraType": ["Ice"], + "wantsTera": true, + "ability": ["Transistor"] + }, + { + "species": "Regieleki", + "weight": 15, + "moves": [ + ["Thunderbolt", "Thunder Cage"], + ["Reflect"], + ["Light Screen"], + ["Explosion", "Thunder Wave"] + ], + "item": ["Light Clay"], + "nature": "Timid", + "evs": {"hp": 252, "spa": 4, "spe": 252}, + "teraType": ["Ghost", "Normal"], + "ability": ["Transistor"] + } + ] }, "avalugg": { - "weight": 2, - "sets": [ - { - "species": "avalugg", - "weight": 100, - "moves": [ - ["irondefense"], - ["bodypress"], - ["recover"], - ["iciclecrash", "avalanche"] - ], - "item": ["heavydutyboots", "rockyhelmet"], - "nature": "impish", - "evs": [252, 0, 252, 0, 4, 0], - "teraType": ["fighting"], - "wantsTera": true, - "ability": "sturdy" - } - ] + "weight": 2, + "sets": [ + { + "species": "Avalugg", + "weight": 100, + "moves": [ + ["Iron Defense"], + ["Body Press"], + ["Recover"], + ["Avalanche", "Icicle Crash"] + ], + "item": ["Heavy-Duty Boots", "Rocky Helmet"], + "nature": "Impish", + "evs": {"hp": 252, "def": 252, "spd": 4}, + "teraType": ["Fighting"], + "wantsTera": true, + "ability": ["Sturdy"] + } + ] }, "landorus": { - "weight": 2, - "sets": [ - { - "species": "landorus", - "weight": 45, - "moves": [ - ["earthpower"], - ["sludgebomb"], - ["focusblast", "psychic"], - ["substitute", "nastyplot"] - ], - "item": ["lifeorb"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "timid", - "evs": [0, 0, 0, 252, 4, 252], - "teraType": ["water", "poison", "steel"], - "wantsTera": true, - "ability": "sheerforce" - }, - { - "species": "landorus", - "weight": 55, - "moves": [ - ["earthpower"], - ["sludgebomb"], - ["focusblast", "substitute", "nastyplot"], - ["terablast"] - ], - "item": ["lifeorb"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "timid", - "evs": [0, 0, 0, 252, 4, 252], - "teraType": ["ice", "flying"], - "wantsTera": true, - "ability": "sheerforce" - } - ] + "weight": 2, + "sets": [ + { + "species": "Landorus", + "weight": 45, + "moves": [ + ["Earth Power"], + ["Sludge Bomb"], + ["Focus Blast", "Psychic"], + ["Nasty Plot", "Substitute"] + ], + "item": ["Life Orb"], + "nature": "Timid", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "ivs": {"atk": 0}, + "teraType": ["Poison", "Steel", "Water"], + "wantsTera": true, + "ability": ["Sheer Force"] + }, + { + "species": "Landorus", + "weight": 55, + "moves": [ + ["Earth Power"], + ["Sludge Bomb"], + ["Focus Blast", "Nasty Plot", "Substitute"], + ["Tera Blast"] + ], + "item": ["Life Orb"], + "nature": "Timid", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "ivs": {"atk": 0}, + "teraType": ["Flying", "Ice"], + "wantsTera": true, + "ability": ["Sheer Force"] + } + ] }, "quaquaval": { - "weight": 2, - "sets": [ - { - "species": "quaquaval", - "weight": 65, - "moves": [ - ["aquastep"], - ["closecombat"], - ["aquajet"], - ["icespinner", "encore", "swordsdance"] - ], - "item": ["focussash", "mysticwater"], - "nature": "jolly", - "evs": [4, 252, 0, 0, 0, 252], - "teraType": ["water", "steel"], - "ability": "moxie" - }, - { - "species": "quaquaval", - "weight": 10, - "moves": [["aquastep"], ["closecombat"], ["aquajet"], ["terablast"]], - "item": ["focussash", "mysticwater"], - "nature": "jolly", - "evs": [4, 252, 0, 0, 0, 252], - "teraType": ["electric", "steel"], - "wantsTera": true, - "ability": "moxie" - }, - { - "species": "quaquaval", - "weight": 25, - "moves": [ - ["aquastep"], - ["roost"], - ["bulkup"], - ["taunt", "encore", "substitute"] - ], - "item": ["leftovers", "rockyhelmet", "covertcloak"], - "nature": "jolly", - "evs": [252, 0, 0, 0, 156, 100], - "teraType": ["steel"], - "ability": "moxie" - } - ] + "weight": 2, + "sets": [ + { + "species": "Quaquaval", + "weight": 65, + "moves": [ + ["Aqua Step"], + ["Close Combat"], + ["Aqua Jet"], + ["Encore", "Ice Spinner", "Swords Dance"] + ], + "item": ["Focus Sash", "Mystic Water"], + "nature": "Jolly", + "evs": {"hp": 4, "atk": 252, "spe": 252}, + "teraType": ["Steel", "Water"], + "ability": ["Moxie"] + }, + { + "species": "Quaquaval", + "weight": 10, + "moves": [ + ["Aqua Step"], + ["Close Combat"], + ["Aqua Jet"], + ["Tera Blast"] + ], + "item": ["Focus Sash", "Mystic Water"], + "nature": "Jolly", + "evs": {"hp": 4, "atk": 252, "spe": 252}, + "teraType": ["Electric", "Steel"], + "wantsTera": true, + "ability": ["Moxie"] + }, + { + "species": "Quaquaval", + "weight": 25, + "moves": [ + ["Aqua Step"], + ["Roost"], + ["Bulk Up"], + ["Encore", "Substitute", "Taunt"] + ], + "item": ["Covert Cloak", "Leftovers", "Rocky Helmet"], + "nature": "Jolly", + "evs": {"hp": 252, "spd": 156, "spe": 100}, + "teraType": ["Steel"], + "ability": ["Moxie"] + } + ] }, "articuno": { - "weight": 1, - "sets": [ - { - "species": "articuno", - "weight": 100, - "moves": [ - ["substitute"], - ["protect", "freezedry"], - ["roost"], - ["sheercold"] - ], - "item": ["leftovers"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "bold", - "evs": [220, 0, 228, 0, 0, 60], - "teraType": ["steel", "ghost"], - "ability": "pressure" - } - ] + "weight": 1, + "sets": [ + { + "species": "Articuno", + "weight": 100, + "moves": [ + ["Substitute"], + ["Freeze-Dry", "Protect"], + ["Roost"], + ["Sheer Cold"] + ], + "item": ["Leftovers"], + "nature": "Bold", + "evs": {"hp": 220, "def": 228, "spe": 60}, + "ivs": {"atk": 0}, + "teraType": ["Ghost", "Steel"], + "ability": ["Pressure"] + } + ] }, "haxorus": { - "weight": 1, - "sets": [ - { - "species": "haxorus", - "weight": 65, - "moves": [["dragondance"], ["ironhead"], ["outrage"], ["earthquake"]], - "item": ["lumberry", "focussash", "lifeorb"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["steel"], - "wantsTera": true, - "ability": "moldbreaker" - }, - { - "species": "haxorus", - "weight": 10, - "moves": [["dragondance"], ["terablast"], ["outrage"], ["earthquake"]], - "item": ["lumberry", "focussash", "lifeorb"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["electric"], - "wantsTera": true, - "ability": "moldbreaker" - }, - { - "species": "haxorus", - "weight": 25, - "moves": [ - ["scaleshot"], - ["ironhead"], - ["earthquake"], - ["dragondance", "swordsdance"] - ], - "item": ["loadeddice"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["steel"], - "wantsTera": true, - "ability": "moldbreaker" - } - ] + "weight": 1, + "sets": [ + { + "species": "Haxorus", + "weight": 65, + "moves": [ + ["Dragon Dance"], + ["Iron Head"], + ["Outrage"], + ["Earthquake"] + ], + "item": ["Focus Sash", "Life Orb", "Lum Berry"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Steel"], + "wantsTera": true, + "ability": ["Mold Breaker"] + }, + { + "species": "Haxorus", + "weight": 10, + "moves": [ + ["Dragon Dance"], + ["Tera Blast"], + ["Outrage"], + ["Earthquake"] + ], + "item": ["Focus Sash", "Life Orb", "Lum Berry"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Electric"], + "wantsTera": true, + "ability": ["Mold Breaker"] + }, + { + "species": "Haxorus", + "weight": 25, + "moves": [ + ["Scale Shot"], + ["Iron Head"], + ["Earthquake"], + ["Dragon Dance", "Swords Dance"] + ], + "item": ["Loaded Dice"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Steel"], + "wantsTera": true, + "ability": ["Mold Breaker"] + } + ] }, "lucario": { - "weight": 1, - "sets": [ - { - "species": "lucario", - "weight": 80, - "moves": [ - ["extremespeed"], - ["closecombat"], - ["bulletpunch"], - ["swordsdance", "counter", "earthquake"] - ], - "item": ["focussash", "lifeorb"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["normal", "steel"], - "ability": "innerfocus" - }, - { - "species": "lucario", - "weight": 20, - "moves": [["vacuumwave"], ["aurasphere"], ["steelbeam"], ["darkpulse"]], - "item": ["lifeorb", "focussash"], - "nature": "timid", - "evs": [0, 0, 0, 252, 4, 252], - "teraType": ["steel", "fighting", "dark"], - "ability": "innerfocus" - } - ] + "weight": 1, + "sets": [ + { + "species": "Lucario", + "weight": 80, + "moves": [ + ["Extreme Speed"], + ["Close Combat"], + ["Bullet Punch"], + ["Counter", "Earthquake", "Swords Dance"] + ], + "item": ["Focus Sash", "Life Orb"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Normal", "Steel"], + "ability": ["Inner Focus"] + }, + { + "species": "Lucario", + "weight": 20, + "moves": [ + ["Vacuum Wave"], + ["Aura Sphere"], + ["Steel Beam"], + ["Dark Pulse"] + ], + "item": ["Focus Sash", "Life Orb"], + "nature": "Timid", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "teraType": ["Dark", "Fighting", "Steel"], + "ability": ["Inner Focus"] + } + ] }, "mesprit": { - "weight": 1, - "sets": [ - { - "species": "mesprit", - "weight": 100, - "moves": [["dazzlinggleam"], ["trickroom"], ["healingwish"], ["encore"]], - "item": ["sitrusberry"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "bold", - "evs": [252, 0, 252, 4, 0, 0], - "teraType": ["fairy"], - "ability": "levitate" - } - ] + "weight": 1, + "sets": [ + { + "species": "Mesprit", + "weight": 100, + "moves": [ + ["Dazzling Gleam"], + ["Trick Room"], + ["Healing Wish"], + ["Encore"] + ], + "item": ["Sitrus Berry"], + "nature": "Bold", + "evs": {"hp": 252, "def": 252, "spa": 4}, + "ivs": {"atk": 0}, + "teraType": ["Fairy"], + "ability": ["Levitate"] + } + ] }, "moltresgalar": { - "weight": 1, - "sets": [ - { - "species": "moltresgalar", - "weight": 100, - "moves": [ - ["fierywrath"], - ["airslash", "hurricane"], - ["nastyplot"], - ["agility"] - ], - "item": ["sitrusberry", "weaknesspolicy"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "timid", - "evs": [0, 0, 0, 252, 4, 252], - "teraType": ["dark", "steel", "flying"], - "ability": "berserk" - } - ] + "weight": 1, + "sets": [ + { + "species": "Moltres-Galar", + "weight": 100, + "moves": [ + ["Fiery Wrath"], + ["Air Slash", "Hurricane"], + ["Nasty Plot"], + ["Agility"] + ], + "item": ["Sitrus Berry", "Weakness Policy"], + "nature": "Timid", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "ivs": {"atk": 0}, + "teraType": ["Dark", "Flying", "Steel"], + "ability": ["Berserk"] + } + ] }, "sableye": { - "weight": 1, - "sets": [ - { - "species": "sableye", - "weight": 30, - "moves": [ - ["knockoff", "foulplay"], - ["encore"], - ["metalburst", "disable"], - ["willowisp", "thunderwave"] - ], - "item": ["focussash"], - "nature": "adamant", - "evs": [252, 252, 0, 0, 4, 0], - "teraType": ["steel", "poison"], - "ability": "prankster" - }, - { - "species": "sableye", - "weight": 30, - "moves": [["substitute"], ["encore"], ["disable"], ["nightshade"]], - "item": ["leftovers"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "bold", - "evs": [252, 0, 252, 0, 4, 0], - "teraType": ["steel", "poison"], - "ability": "prankster" - }, - { - "species": "sableye", - "weight": 20, - "moves": [ - ["reflect"], - ["lightscreen"], - ["willowisp", "taunt", "encore"], - ["foulplay"] - ], - "item": ["lightclay"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "bold", - "evs": [252, 0, 252, 0, 4, 0], - "teraType": ["steel", "poison"], - "ability": "prankster" - }, - { - "species": "sableye", - "weight": 20, - "moves": [ - ["reflect"], - ["lightscreen"], - ["willowisp", "taunt", "encore"], - ["knockoff"] - ], - "item": ["lightclay"], - "nature": "impish", - "evs": [252, 0, 252, 0, 4, 0], - "teraType": ["steel", "poison"], - "ability": "prankster" - } - ] + "weight": 1, + "sets": [ + { + "species": "Sableye", + "weight": 30, + "moves": [ + ["Foul Play", "Knock Off"], + ["Encore"], + ["Disable", "Metal Burst"], + ["Thunder Wave", "Will-O-Wisp"] + ], + "item": ["Focus Sash"], + "nature": "Adamant", + "evs": {"hp": 252, "atk": 252, "spd": 4}, + "teraType": ["Poison", "Steel"], + "ability": ["Prankster"] + }, + { + "species": "Sableye", + "weight": 30, + "moves": [ + ["Substitute"], + ["Encore"], + ["Disable"], + ["Night Shade"] + ], + "item": ["Leftovers"], + "nature": "Bold", + "evs": {"hp": 252, "def": 252, "spd": 4}, + "ivs": {"atk": 0}, + "teraType": ["Poison", "Steel"], + "ability": ["Prankster"] + }, + { + "species": "Sableye", + "weight": 20, + "moves": [ + ["Reflect"], + ["Light Screen"], + ["Encore", "Taunt", "Will-O-Wisp"], + ["Foul Play"] + ], + "item": ["Light Clay"], + "nature": "Bold", + "evs": {"hp": 252, "def": 252, "spd": 4}, + "ivs": {"atk": 0}, + "teraType": ["Poison", "Steel"], + "ability": ["Prankster"] + }, + { + "species": "Sableye", + "weight": 20, + "moves": [ + ["Reflect"], + ["Light Screen"], + ["Encore", "Taunt", "Will-O-Wisp"], + ["Knock Off"] + ], + "item": ["Light Clay"], + "nature": "Impish", + "evs": {"hp": 252, "def": 252, "spd": 4}, + "teraType": ["Poison", "Steel"], + "ability": ["Prankster"] + } + ] }, "uxie": { - "weight": 1, - "sets": [ - { - "species": "uxie", - "weight": 100, - "moves": [["uturn"], ["yawn"], ["encore"], ["stealthrock"]], - "item": ["sitrusberry"], - "nature": "impish", - "evs": [244, 0, 252, 0, 12, 0], - "teraType": ["fairy"], - "ability": "levitate" - } - ] + "weight": 1, + "sets": [ + { + "species": "Uxie", + "weight": 100, + "moves": [ + ["U-turn"], + ["Yawn"], + ["Encore"], + ["Stealth Rock"] + ], + "item": ["Sitrus Berry"], + "nature": "Impish", + "evs": {"hp": 244, "def": 252, "spd": 12}, + "teraType": ["Fairy"], + "ability": ["Levitate"] + } + ] }, "brutebonnet": { - "weight": 1, - "sets": [ - { - "species": "brutebonnet", - "weight": 85, - "moves": [ - ["spore"], - ["trailblaze"], - ["crunch", "terablast"], - ["substitute"] - ], - "item": ["leftovers"], - "nature": "jolly", - "evs": [52, 204, 0, 0, 0, 252], - "teraType": ["water", "fire"], - "wantsTera": true, - "ability": "protosynthesis" - }, - { - "species": "brutebonnet", - "weight": 15, - "moves": [ - ["spore"], - ["suckerpunch"], - ["bulletseed"], - ["terablast", "substitute"] - ], - "item": ["loadeddice"], - "nature": "adamant", - "evs": [252, 252, 0, 0, 4, 0], - "teraType": ["water", "fire"], - "wantsTera": true, - "ability": "protosynthesis" - } - ] + "weight": 1, + "sets": [ + { + "species": "Brute Bonnet", + "weight": 85, + "moves": [ + ["Spore"], + ["Trailblaze"], + ["Crunch", "Tera Blast"], + ["Substitute"] + ], + "item": ["Leftovers"], + "nature": "Jolly", + "evs": {"hp": 52, "atk": 204, "spe": 252}, + "teraType": ["Fire", "Water"], + "wantsTera": true, + "ability": ["Protosynthesis"] + }, + { + "species": "Brute Bonnet", + "weight": 15, + "moves": [ + ["Spore"], + ["Sucker Punch"], + ["Bullet Seed"], + ["Substitute", "Tera Blast"] + ], + "item": ["Loaded Dice"], + "nature": "Adamant", + "evs": {"hp": 252, "atk": 252, "spd": 4}, + "teraType": ["Fire", "Water"], + "wantsTera": true, + "ability": ["Protosynthesis"] + } + ] }, "samurotthisui": { - "weight": 1, - "sets": [ - { - "species": "samurotthisui", - "weight": 70, - "moves": [ - ["ceaselessedge"], - ["razorshell", "aquacutter"], - ["suckerpunch", "aquajet"], - ["encore", "sacredsword"] - ], - "item": ["focussash"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["water", "dark", "ghost"], - "ability": "sharpness" - }, - { - "species": "samurotthisui", - "weight": 15, - "moves": [ - ["ceaselessedge"], - ["razorshell", "aquacutter"], - ["suckerpunch", "aquajet"], - ["sacredsword"] - ], - "item": ["assaultvest"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["water"], - "ability": "sharpness" - }, - { - "species": "samurotthisui", - "weight": 15, - "moves": [ - ["ceaselessedge"], - ["razorshell", "aquacutter"], - ["suckerpunch", "aquajet"], - ["terablast"] - ], - "item": ["assaultvest"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["fairy"], - "ability": "sharpness" - } - ] + "weight": 1, + "sets": [ + { + "species": "Samurott-Hisui", + "weight": 70, + "moves": [ + ["Ceaseless Edge"], + ["Aqua Cutter", "Razor Shell"], + ["Aqua Jet", "Sucker Punch"], + ["Encore", "Sacred Sword"] + ], + "item": ["Focus Sash"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Dark", "Ghost", "Water"], + "ability": ["Sharpness"] + }, + { + "species": "Samurott-Hisui", + "weight": 15, + "moves": [ + ["Ceaseless Edge"], + ["Aqua Cutter", "Razor Shell"], + ["Aqua Jet", "Sucker Punch"], + ["Sacred Sword"] + ], + "item": ["Assault Vest"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Water"], + "ability": ["Sharpness"] + }, + { + "species": "Samurott-Hisui", + "weight": 15, + "moves": [ + ["Ceaseless Edge"], + ["Aqua Cutter", "Razor Shell"], + ["Aqua Jet", "Sucker Punch"], + ["Tera Blast"] + ], + "item": ["Assault Vest"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Fairy"], + "ability": ["Sharpness"] + } + ] }, "slowkinggalar": { - "weight": 1, - "sets": [ - { - "species": "slowkinggalar", - "weight": 60, - "moves": [ - ["flamethrower"], - ["grassknot"], - ["psychic", "eeriespell"], - ["sludgebomb"] - ], - "item": ["assaultvest"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "modest", - "evs": [252, 0, 0, 252, 4, 0], - "teraType": ["poison", "normal"], - "ability": "regenerator" - }, - { - "species": "slowkinggalar", - "weight": 40, - "moves": [ - ["eeriespell", "sludgebomb"], - ["toxic", "yawn"], - ["trickroom", "slackoff"], - ["chillyreception"] - ], - "item": ["blacksludge"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "relaxed", - "evs": [244, 0, 252, 0, 12, 0], - "teraType": ["poison"], - "ability": "regenerator" - } - ] + "weight": 1, + "sets": [ + { + "species": "Slowking-Galar", + "weight": 60, + "moves": [ + ["Flamethrower"], + ["Grass Knot"], + ["Eerie Spell", "Psychic"], + ["Sludge Bomb"] + ], + "item": ["Assault Vest"], + "nature": "Modest", + "evs": {"hp": 252, "spa": 252, "spd": 4}, + "ivs": {"atk": 0}, + "teraType": ["Normal", "Poison"], + "ability": ["Regenerator"] + }, + { + "species": "Slowking-Galar", + "weight": 40, + "moves": [ + ["Eerie Spell", "Sludge Bomb"], + ["Toxic", "Yawn"], + ["Slack Off", "Trick Room"], + ["Chilly Reception"] + ], + "item": ["Black Sludge"], + "nature": "Relaxed", + "evs": {"hp": 244, "def": 252, "spd": 12}, + "ivs": {"atk": 0}, + "teraType": ["Poison"], + "ability": ["Regenerator"] + } + ] }, "basculegionf": { - "weight": 1, - "sets": [ - { - "species": "basculegionf", - "weight": 70, - "moves": [ - ["shadowball"], - ["aquajet"], - ["surf", "hydropump"], - ["endeavor"] - ], - "gender": "f", - "item": ["focussash"], - "nature": "rash", - "evs": [0, 4, 0, 252, 0, 252], - "teraType": ["water"], - "ability": "adaptability" - }, - { - "species": "basculegionf", - "weight": 30, - "moves": [ - ["shadowball"], - ["aquajet"], - ["surf", "hydropump"], - ["endeavor", "terablast"] - ], - "gender": "f", - "item": ["focussash"], - "nature": "rash", - "evs": [0, 4, 0, 252, 0, 252], - "teraType": ["fairy"], - "wantsTera": true, - "ability": "adaptability" - } - ] + "weight": 1, + "sets": [ + { + "species": "Basculegion-F", + "weight": 70, + "moves": [ + ["Shadow Ball"], + ["Aqua Jet"], + ["Hydro Pump", "Surf"], + ["Endeavor"] + ], + "gender": "F", + "item": ["Focus Sash"], + "nature": "Rash", + "evs": {"atk": 4, "spa": 252, "spe": 252}, + "teraType": ["Water"], + "ability": ["Adaptability"] + }, + { + "species": "Basculegion-F", + "weight": 30, + "moves": [ + ["Shadow Ball"], + ["Aqua Jet"], + ["Hydro Pump", "Surf"], + ["Endeavor", "Tera Blast"] + ], + "gender": "F", + "item": ["Focus Sash"], + "nature": "Rash", + "evs": {"atk": 4, "spa": 252, "spe": 252}, + "teraType": ["Fairy"], + "wantsTera": true, + "ability": ["Adaptability"] + } + ] }, "irontreads": { - "weight": 1, - "sets": [ - { - "species": "irontreads", - "weight": 15, - "moves": [ - ["earthquake"], - ["ironhead", "heavyslam"], - ["rapidspin", "icespinner", "voltswitch"], - ["knockoff"] - ], - "item": ["assaultvest"], - "nature": "jolly", - "evs": [252, 4, 0, 0, 252, 0], - "teraType": ["grass", "water", "fairy", "flying"], - "ability": "quarkdrive" - }, - { - "species": "irontreads", - "weight": 60, - "moves": [ - ["earthquake", "endeavor"], - ["ironhead"], - ["stealthrock", "rapidspin", "substitute"], - ["knockoff", "icespinner"] - ], - "item": ["boosterenergy"], - "nature": "jolly", - "evs": [4, 252, 0, 0, 0, 252], - "teraType": ["grass", "water", "fairy", "ground"], - "ability": "quarkdrive" - }, - { - "species": "irontreads", - "weight": 25, - "moves": [ - ["earthquake", "endeavor"], - ["ironhead"], - ["stealthrock", "rapidspin", "substitute"], - ["terablast"] - ], - "item": ["boosterenergy"], - "nature": "jolly", - "evs": [4, 252, 0, 0, 0, 252], - "teraType": ["grass", "water", "fairy"], - "wantsTera": true, - "ability": "quarkdrive" - } - ] + "weight": 1, + "sets": [ + { + "species": "Iron Treads", + "weight": 15, + "moves": [ + ["Earthquake"], + ["Heavy Slam", "Iron Head"], + ["Ice Spinner", "Rapid Spin", "Volt Switch"], + ["Knock Off"] + ], + "item": ["Assault Vest"], + "nature": "Jolly", + "evs": {"hp": 252, "atk": 4, "spd": 252}, + "teraType": ["Fairy", "Flying", "Grass", "Water"], + "ability": ["Quark Drive"] + }, + { + "species": "Iron Treads", + "weight": 60, + "moves": [ + ["Earthquake", "Endeavor"], + ["Iron Head"], + ["Rapid Spin", "Stealth Rock", "Substitute"], + ["Ice Spinner", "Knock Off"] + ], + "item": ["Booster Energy"], + "nature": "Jolly", + "evs": {"hp": 4, "atk": 252, "spe": 252}, + "teraType": ["Fairy", "Grass", "Ground", "Water"], + "ability": ["Quark Drive"] + }, + { + "species": "Iron Treads", + "weight": 25, + "moves": [ + ["Earthquake", "Endeavor"], + ["Iron Head"], + ["Rapid Spin", "Stealth Rock", "Substitute"], + ["Tera Blast"] + ], + "item": ["Booster Energy"], + "nature": "Jolly", + "evs": {"hp": 4, "atk": 252, "spe": 252}, + "teraType": ["Fairy", "Grass", "Water"], + "wantsTera": true, + "ability": ["Quark Drive"] + } + ] }, "overqwil": { - "weight": 1, - "sets": [ - { - "species": "overqwil", - "weight": 60, - "moves": [ - ["crunch"], - ["barbbarrage", "toxic"], - ["minimize"], - ["substitute"] - ], - "item": ["leftovers"], - "nature": "jolly", - "evs": [252, 0, 0, 0, 4, 252], - "teraType": ["water", "dark"], - "ability": "poisonpoint" - }, - { - "species": "overqwil", - "weight": 40, - "moves": [ - ["crunch"], - ["barbbarrage", "toxic"], - ["minimize"], - ["substitute"] - ], - "item": ["blacksludge"], - "nature": "jolly", - "evs": [252, 0, 0, 0, 4, 252], - "teraType": ["poison"], - "ability": "poisonpoint" - } - ] + "weight": 1, + "sets": [ + { + "species": "Overqwil", + "weight": 60, + "moves": [ + ["Crunch"], + ["Barb Barrage", "Toxic"], + ["Minimize"], + ["Substitute"] + ], + "item": ["Leftovers"], + "nature": "Jolly", + "evs": {"hp": 252, "spd": 4, "spe": 252}, + "teraType": ["Dark", "Water"], + "ability": ["Poison Point"] + }, + { + "species": "Overqwil", + "weight": 40, + "moves": [ + ["Crunch"], + ["Barb Barrage", "Toxic"], + ["Minimize"], + ["Substitute"] + ], + "item": ["Black Sludge"], + "nature": "Jolly", + "evs": {"hp": 252, "spd": 4, "spe": 252}, + "teraType": ["Poison"], + "ability": ["Poison Point"] + } + ] }, "spectrier": { - "weight": 1, - "sets": [ - { - "species": "spectrier", - "weight": 100, - "moves": [["shadowball"], ["drainingkiss"], ["willowisp"], ["calmmind"]], - "item": ["leftovers", "sitrusberry"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "timid", - "evs": [252, 0, 0, 4, 0, 252], - "teraType": ["fairy"], - "wantsTera": true, - "ability": "grimneigh" - } - ] + "weight": 1, + "sets": [ + { + "species": "Spectrier", + "weight": 100, + "moves": [ + ["Shadow Ball"], + ["Draining Kiss"], + ["Will-O-Wisp"], + ["Calm Mind"] + ], + "item": ["Leftovers", "Sitrus Berry"], + "nature": "Timid", + "evs": {"hp": 252, "spa": 4, "spe": 252}, + "ivs": {"atk": 0}, + "teraType": ["Fairy"], + "wantsTera": true, + "ability": ["Grim Neigh"] + } + ] }, "maushold": { - "weight": 1, - "sets": [ - { - "species": "maushold", - "weight": 100, - "moves": [ - ["populationbomb"], - ["bite", "mudshot"], - ["encore"], - ["thunderwave", "tidyup"] - ], - "item": ["widelens", "kingsrock"], - "nature": "jolly", - "evs": [0, 252, 0, 0, 4, 252], - "teraType": ["normal", "ghost", "poison"], - "ability": "technician" - } - ] + "weight": 1, + "sets": [ + { + "species": "Maushold", + "weight": 100, + "moves": [ + ["Population Bomb"], + ["Bite", "Mud Shot"], + ["Encore"], + ["Thunder Wave", "Tidy Up"] + ], + "item": ["King's Rock", "Wide Lens"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Ghost", "Normal", "Poison"], + "ability": ["Technician"] + } + ] }, "polteageist": { - "weight": 1, - "sets": [ - { - "species": "polteageist", - "weight": 100, - "moves": [["shellsmash"], ["strengthsap"], ["storedpower"], ["terablast"]], - "item": ["whiteherb", "focussash"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "bold", - "evs": [108, 0, 196, 0, 0, 204], - "teraType": ["water", "fighting"], - "wantsTera": true, - "ability": "cursedbody" - } - ] + "weight": 1, + "sets": [ + { + "species": "Polteageist", + "weight": 100, + "moves": [ + ["Shell Smash"], + ["Strength Sap"], + ["Stored Power"], + ["Tera Blast"] + ], + "item": ["Focus Sash", "White Herb"], + "nature": "Bold", + "evs": {"hp": 108, "def": 196, "spe": 204}, + "ivs": {"atk": 0}, + "teraType": ["Fighting", "Water"], + "wantsTera": true, + "ability": ["Cursed Body"] + } + ] }, "taurospaldeaaqua": { - "weight": 1, - "sets": [ - { - "species": "taurospaldeaaqua", - "weight": 100, - "moves": [ - ["wavecrash"], - ["closecombat"], - ["trailblaze", "aquajet"], - ["endeavor"] - ], - "item": ["rockyhelmet"], - "nature": "adamant", - "evs": [252, 4, 108, 0, 4, 140], - "teraType": ["water", "steel"], - "ability": "intimidate" - } - ] + "weight": 1, + "sets": [ + { + "species": "Tauros-Paldea-Aqua", + "weight": 100, + "moves": [ + ["Wave Crash"], + ["Close Combat"], + ["Aqua Jet", "Trailblaze"], + ["Endeavor"] + ], + "item": ["Rocky Helmet"], + "nature": "Adamant", + "evs": {"hp": 252, "atk": 4, "def": 108, "spd": 4, "spe": 140}, + "teraType": ["Steel", "Water"], + "ability": ["Intimidate"] + } + ] }, "forretress": { - "weight": 1, - "sets": [ - { - "species": "forretress", - "weight": 50, - "moves": [["bodypress"], ["voltswitch"], ["stealthrock"], ["toxicspikes"]], - "item": ["rockyhelmet"], - "ivs": [31, 0, 31, 31, 31, 0], - "nature": "relaxed", - "evs": [252, 0, 252, 0, 4, 0], - "teraType": ["fighting", "water"], - "ability": "sturdy" - }, - { - "species": "forretress", - "weight": 50, - "moves": [["bodypress"], ["voltswitch"], ["stealthrock"], ["gyroball"]], - "item": ["rockyhelmet"], - "ivs": [31, 31, 31, 31, 31, 0], - "nature": "relaxed", - "evs": [252, 0, 252, 0, 4, 0], - "teraType": ["fighting", "water"], - "ability": "sturdy" - } - ] + "weight": 1, + "sets": [ + { + "species": "Forretress", + "weight": 50, + "moves": [ + ["Body Press"], + ["Volt Switch"], + ["Stealth Rock"], + ["Toxic Spikes"] + ], + "item": ["Rocky Helmet"], + "nature": "Relaxed", + "evs": {"hp": 252, "def": 252, "spd": 4}, + "ivs": {"atk": 0, "spe": 0}, + "teraType": ["Fighting", "Water"], + "ability": ["Sturdy"] + }, + { + "species": "Forretress", + "weight": 50, + "moves": [ + ["Body Press"], + ["Volt Switch"], + ["Stealth Rock"], + ["Gyro Ball"] + ], + "item": ["Rocky Helmet"], + "nature": "Relaxed", + "evs": {"hp": 252, "def": 252, "spd": 4}, + "ivs": {"spe": 0}, + "teraType": ["Fighting", "Water"], + "ability": ["Sturdy"] + } + ] }, "glastrier": { - "weight": 1, - "sets": [ - { - "species": "glastrier", - "weight": 80, - "moves": [ - ["iciclecrash"], - ["heavyslam"], - ["terablast"], - ["closecombat", "highhorsepower"] - ], - "item": ["assaultvest"], - "nature": "adamant", - "evs": [252, 252, 0, 0, 4, 0], - "teraType": ["electric", "water"], - "wantsTera": true, - "ability": "chillingneigh" - }, - { - "species": "glastrier", - "weight": 20, - "moves": [ - ["iciclecrash"], - ["heavyslam"], - ["closecombat"], - ["highhorsepower"] - ], - "item": ["assaultvest"], - "nature": "adamant", - "evs": [252, 252, 0, 0, 4, 0], - "teraType": ["ghost"], - "wantsTera": true, - "ability": "chillingneigh" - } - ] + "weight": 1, + "sets": [ + { + "species": "Glastrier", + "weight": 80, + "moves": [ + ["Icicle Crash"], + ["Heavy Slam"], + ["Tera Blast"], + ["Close Combat", "High Horsepower"] + ], + "item": ["Assault Vest"], + "nature": "Adamant", + "evs": {"hp": 252, "atk": 252, "spd": 4}, + "teraType": ["Electric", "Water"], + "wantsTera": true, + "ability": ["Chilling Neigh"] + }, + { + "species": "Glastrier", + "weight": 20, + "moves": [ + ["Icicle Crash"], + ["Heavy Slam"], + ["Close Combat"], + ["High Horsepower"] + ], + "item": ["Assault Vest"], + "nature": "Adamant", + "evs": {"hp": 252, "atk": 252, "spd": 4}, + "teraType": ["Ghost"], + "wantsTera": true, + "ability": ["Chilling Neigh"] + } + ] }, "gothitelle": { - "weight": 1, - "sets": [ - { - "species": "gothitelle", - "weight": 65, - "moves": [ - ["trick"], - ["calmmind"], - ["rest"], - ["terablast", "storedpower"] - ], - "item": ["choicescarf"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "bold", - "evs": [236, 0, 196, 4, 4, 68], - "teraType": ["flying", "fairy"], - "ability": "shadowtag" - }, - { - "species": "gothitelle", - "weight": 35, - "moves": [ - ["charm"], - ["calmmind"], - ["rest"], - ["terablast", "storedpower"] - ], - "item": ["leftovers", "covertcloak"], - "ivs": [31, 0, 31, 31, 31, 31], - "nature": "bold", - "evs": [236, 0, 196, 4, 4, 68], - "teraType": ["fairy"], - "wantsTera": true, - "ability": "shadowtag" - } - ] + "weight": 1, + "sets": [ + { + "species": "Gothitelle", + "weight": 65, + "moves": [ + ["Trick"], + ["Calm Mind"], + ["Rest"], + ["Stored Power", "Tera Blast"] + ], + "item": ["Choice Scarf"], + "nature": "Bold", + "evs": {"hp": 236, "def": 196, "spa": 4, "spd": 4, "spe": 68}, + "ivs": {"atk": 0}, + "teraType": ["Fairy", "Flying"], + "ability": ["Shadow Tag"] + }, + { + "species": "Gothitelle", + "weight": 35, + "moves": [ + ["Charm"], + ["Calm Mind"], + ["Rest"], + ["Stored Power", "Tera Blast"] + ], + "item": ["Covert Cloak", "Leftovers"], + "nature": "Bold", + "evs": {"hp": 236, "def": 196, "spa": 4, "spd": 4, "spe": 68}, + "ivs": {"atk": 0}, + "teraType": ["Fairy"], + "wantsTera": true, + "ability": ["Shadow Tag"] + } + ] } } diff --git a/data/random-battles/gen9/teams.ts b/data/random-battles/gen9/teams.ts index 183ab5e42f8c..f9993273db9d 100644 --- a/data/random-battles/gen9/teams.ts +++ b/data/random-battles/gen9/teams.ts @@ -40,8 +40,9 @@ interface BSSFactorySet { nature: string; moves: string[][]; teraType: string[]; + gender?: string; wantsTera?: boolean; - evs?: number[]; + evs: number[]; ivs?: number[]; } export class MoveCounter extends Utils.Multiset { @@ -2592,36 +2593,18 @@ export class RandomTeams { moves.push(setData.moveVariants ? moveSlot[setData.moveVariants[i]] : this.sample(moveSlot)); } - const setDataAbility = this.sampleIfArray(setData.set.ability); - const evs = setData.set.evs; - const ivs = setData.set.ivs; return { name: setData.set.species || species.baseSpecies, species: setData.set.species, - // Temporary fix - teraType: this.dex.types.get(this.sampleIfArray(setData.set.teraType)).name, - gender: species.gender || (this.randomChance(1, 2) ? "M" : "F"), + teraType: (this.sampleIfArray(setData.set.teraType)), + gender: setData.set.gender || species.gender || (this.randomChance(1, 2) ? "M" : "F"), item: this.sampleIfArray(setData.set.item) || "", - ability: setDataAbility || "No Ability", + ability: this.sampleIfArray(setData.set.ability), shiny: this.randomChance(1, 1024), level: 50, happiness: 255, - evs: { - hp: (evs?.[0] || 0), - atk: (evs?.[1] || 0), - def: (evs?.[2] || 0), - spa: (evs?.[3] || 0), - spd: (evs?.[4] || 0), - spe: (evs?.[5] || 0), - }, - ivs: { - hp: (ivs?.[0] || 31), - atk: (ivs?.[1] || 31), - def: (ivs?.[2] || 31), - spa: (ivs?.[3] || 31), - spd: (ivs?.[4] || 31), - spe: (ivs?.[5] || 31), - }, + evs: {hp: 0, atk: 0, def: 0, spa: 0, spd: 0, spe: 0, ...setData.set.evs}, + ivs: {hp: 31, atk: 31, def: 31, spa: 31, spd: 31, spe: 31, ...setData.set.ivs}, nature: setData.set.nature || "Serious", moves, wantsTera: setData.set.wantsTera, diff --git a/server/chat-plugins/randombattles/index.ts b/server/chat-plugins/randombattles/index.ts index c0983ca5b0ee..133156156ce2 100644 --- a/server/chat-plugins/randombattles/index.ts +++ b/server/chat-plugins/randombattles/index.ts @@ -332,18 +332,24 @@ function battleFactorySets(species: string | Species, tier: string | null, gen = buf += `
  • Ability: ${formatAbility(set.ability)}
  • `; buf += `
  • Level: 50
  • `; buf += `
  • Tera Type: ${set.teraType.map(formatType).join(' / ')}
  • `; - buf += `
  • EVs: `; - const evs = []; - for (const [j, stat] of Object.values(STAT_NAMES).entries()) { - if (set.evs[j] > 0) evs.push(`${set.evs[j]} ${stat}`); + if (set.evs) { + buf += `
  • EVs: `; + const evs: string[] = []; + let ev: string; + for (ev in set.evs) { + if (!set.evs[ev]) continue; + evs.push(`${set.evs[ev]} ${STAT_NAMES[ev]}`); + } + buf += `${evs.join(" / ")}
  • `; } - buf += `${evs.join(" / ")}`; buf += `
  • ${formatNature(set.nature)} Nature
  • `; if (set.ivs) { buf += `
  • IVs: `; - const ivs = []; - for (const [j, stat] of Object.values(STAT_NAMES).entries()) { - if (set.ivs[j] < 31) ivs.push(`${set.ivs[j]} ${stat}`); + const ivs: string[] = []; + let iv: string; + for (iv in set.ivs) { + if (set.ivs[iv] === 31) continue; + ivs.push(`${set.ivs[iv]} ${STAT_NAMES[iv]}`); } buf += `${ivs.join(" / ")}
  • `; } diff --git a/test/random-battles/all-gens.js b/test/random-battles/all-gens.js index 711bbedfcc58..6d053026e4b0 100644 --- a/test/random-battles/all-gens.js +++ b/test/random-battles/all-gens.js @@ -246,3 +246,71 @@ describe('Battle Factory and BSS Factory data should be valid (slow)', () => { }); } }); + +describe('[Gen 9] BSS Factory data should be valid (slow)', () => { + it(`gen9/bss-factory-sets.json should contain valid sets`, function () { + this.timeout(0); + const setsJSON = require(`../../dist/data/random-battles/gen9/bss-factory-sets.json`); + const mod = 'gen9'; + const genNum = 9; + + for (const speciesid in setsJSON) { + const vType = 'battlestadiumsingles'; + let totalWeight = 0; + for (const set of setsJSON[speciesid].sets) { + totalWeight += set.weight; + const species = Dex.species.get(set.species); + assert(species.exists, `invalid species "${set.species}" of ${speciesid}`); + assert(!species.isNonstandard, `illegal species "${set.species}" of ${speciesid}`); + assert.equal(species.name, set.species, `miscapitalized species "${set.species}" of ${speciesid}`); + + assert(species.id.startsWith(toID(species.baseSpecies)), `non-matching species "${set.species}" of ${speciesid}`); + + assert(!species.battleOnly, `invalid battle-only forme "${set.species}" of ${speciesid}`); + + for (const itemName of [].concat(set.item)) { + if (!itemName && [].concat(...set.moves).includes("Acrobatics")) continue; + const item = Dex.forGen(genNum).items.get(itemName); + assert(item.exists, `invalid item "${itemName}" of ${speciesid}`); + assert.equal(item.name, itemName, `miscapitalized item "${itemName}" of ${speciesid}`); + } + + for (const abilityName of [].concat(set.ability)) { + const ability = Dex.forGen(genNum).abilities.get(abilityName); + assert(ability.exists, `invalid ability "${abilityName}" of ${speciesid}`); + assert.equal(ability.name, abilityName, `miscapitalized ability "${abilityName}" of ${speciesid}`); + } + + for (const natureName of [].concat(set.nature)) { + const nature = Dex.forGen(genNum).natures.get(natureName); + assert(nature.exists, `invalid nature "${natureName}" of ${speciesid}`); + assert.equal(nature.name, natureName, `miscapitalized nature "${natureName}" of ${speciesid}`); + } + + for (const moveSpec of set.moves) { + for (const moveName of [].concat(moveSpec)) { + const move = Dex.forGen(genNum).moves.get(moveName); + assert(move.exists, `invalid move "${moveName}" of ${speciesid}`); + assert.equal(move.name, moveName, `miscapitalized move "${moveName}" ≠ "${move.name}" of ${speciesid}`); + assert(validateLearnset(move, set, vType, mod), `illegal move "${moveName}" of ${speciesid}`); + } + } + + assert(!!set.evs, `Set of ${speciesid} has no EVs specified`); + const keys = Object.keys(set.evs); + let totalEVs = 0; + for (const ev of keys) { + assert(Dex.stats.ids().includes(ev), `Invalid EV key (${ev}) on set of ${speciesid}`); + totalEVs += set.evs[ev]; + assert.equal(set.evs[ev] % 4, 0, `EVs of ${ev} not divisible by 4 on ${speciesid}`); + } + const sortedKeys = Utils.sortBy([...keys], ev => Dex.stats.ids().indexOf(ev)); + assert.deepEqual(keys, sortedKeys, `EVs out of order on set of ${speciesid}, possibly because one of them is for the wrong stat`); + assert(totalEVs <= 510, `more than 510 EVs on set of ${speciesid}`); + } + // Some species have 1/3 probability for each set + if (totalWeight === 99) totalWeight += 1; + assert.equal(totalWeight, 100, `Total set weight for ${speciesid} is ${totalWeight < 100 ? 'less' : 'greater'} than 100%`); + } + }); +}); From 717ef95c32ddcd8dc814e6a46194d461e2d69357 Mon Sep 17 00:00:00 2001 From: Marty-D Date: Sun, 2 Jun 2024 21:53:45 -0400 Subject: [PATCH 016/139] ZU: Ban Vulpix https://www.smogon.com/forums/posts/10135881/ --- data/formats-data.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/data/formats-data.ts b/data/formats-data.ts index 18f1c0664409..da29db04e21c 100644 --- a/data/formats-data.ts +++ b/data/formats-data.ts @@ -319,7 +319,8 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { natDexTier: "UU", }, vulpix: { - tier: "NFE", + tier: "ZUBL", + doublesTier: "NFE", natDexTier: "LC", }, vulpixalola: { From 44ea4080b22383dffbfbbbc072caa3821a8e16c7 Mon Sep 17 00:00:00 2001 From: "Alex \"Mathy" <4866817+MathyFurret@users.noreply.github.com> Date: Sun, 2 Jun 2024 20:56:30 -0500 Subject: [PATCH 017/139] Gen IV: Make Download ignore foes behind substitutes (#10310) --- data/mods/gen4/abilities.ts | 17 +++++++ test/sim/abilities/download.js | 92 ++++++++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 test/sim/abilities/download.js diff --git a/data/mods/gen4/abilities.ts b/data/mods/gen4/abilities.ts index ba42dd09525b..408ff55ccbc5 100644 --- a/data/mods/gen4/abilities.ts +++ b/data/mods/gen4/abilities.ts @@ -72,6 +72,23 @@ export const Abilities: {[k: string]: ModdedAbilityData} = { } }, }, + download: { + inherit: true, + onStart(pokemon) { + let totaldef = 0; + let totalspd = 0; + for (const target of pokemon.foes()) { + if (target.volatiles.substitute) continue; + totaldef += target.getStat('def', false, true); + totalspd += target.getStat('spd', false, true); + } + if (totaldef && totaldef >= totalspd) { + this.boost({spa: 1}); + } else if (totalspd) { + this.boost({atk: 1}); + } + }, + }, effectspore: { inherit: true, onDamagingHit(damage, target, source, move) { diff --git a/test/sim/abilities/download.js b/test/sim/abilities/download.js new file mode 100644 index 000000000000..4e9725208b61 --- /dev/null +++ b/test/sim/abilities/download.js @@ -0,0 +1,92 @@ +'use strict'; + +const assert = require('./../../assert'); +const common = require('./../../common'); + +let battle; + +describe('Download', () => { + afterEach(() => battle.destroy()); + + it('should boost based on which defensive stat is higher', () => { + battle = common.createBattle([[ + {species: 'porygon', moves: ['sleeptalk'], ability: 'download'}, + {species: 'furret', moves: ['sleeptalk']}, + ], [ + {species: 'stonjourner', moves: ['sleeptalk']}, + {species: 'chansey', moves: ['sleeptalk']}, + ]]); + assert.statStage(battle.p1.active[0], 'spa', 1); + battle.makeChoices('switch 2', 'switch 2'); + battle.makeChoices('switch 2', 'auto'); + assert.statStage(battle.p1.active[0], 'atk', 1); + }); + + it('should boost Special Attack if both stats are tied', () => { + battle = common.createBattle([[ + {species: 'porygon', moves: ['sleeptalk'], ability: 'download'}, + ], [ + {species: 'mew', moves: ['sleeptalk']}, + ]]); + assert.statStage(battle.p1.active[0], 'spa', 1); + assert.statStage(battle.p1.active[0], 'atk', 0); + }); + + it('should boost based on the total of both foes in a Double Battle', () => { + battle = common.createBattle({gameType: 'doubles'}, [[ + {species: 'porygon', moves: ['sleeptalk'], ability: 'download'}, + {species: 'blissey', moves: ['sleeptalk']}, + ], [ + {species: 'blissey', level: 1, moves: ['sleeptalk']}, + {species: 'stonjourner', moves: ['sleeptalk']}, + ]]); + assert.statStage(battle.p1.active[0], 'spa', 1); + assert.statStage(battle.p1.active[0], 'atk', 0); + }); + + it('should trigger even if the foe is behind a Substitute', () => { + battle = common.createBattle([[ + {species: 'furret', moves: ['sleeptalk']}, + {species: 'porygon', ability: 'download', moves: ['sleeptalk']}, + ], [ + {species: 'blissey', moves: ['substitute']}, + ]]); + battle.makeChoices(); + battle.makeChoices('switch 2', 'auto'); + assert.statStage(battle.p1.active[0], 'atk', 1); + }); + + describe('Gen 4', () => { + it('should not trigger if the foe is behind a Substitute', () => { + battle = common.gen(4).createBattle([[ + {species: 'furret', moves: ['sleeptalk']}, + {species: 'porygon', ability: 'download', moves: ['sleeptalk']}, + ], [ + {species: 'ampharos', moves: ['substitute']}, + ]]); + battle.makeChoices(); + battle.makeChoices('switch 2', 'auto'); + assert.statStage(battle.p1.active[0], 'atk', 0); + assert.statStage(battle.p1.active[0], 'spa', 0); + }); + + it('in Double Battles, should only account for foes not behind a Substitute', () => { + battle = common.gen(4).createBattle({gameType: 'doubles'}, [[ + {species: 'furret', moves: ['sleeptalk']}, + {species: 'ampharos', moves: ['sleeptalk']}, + {species: 'porygon', ability: 'download', moves: ['sleeptalk']}, + ], [ + {species: 'blissey', moves: ['substitute']}, + {species: 'furret', moves: ['sleeptalk', 'substitute']}, + ]]); + battle.makeChoices(); + battle.makeChoices('move 1, switch 3', 'auto'); + assert.statStage(battle.p1.active[1], 'atk', 0); + assert.statStage(battle.p1.active[1], 'spa', 1); + battle.makeChoices('move 1, switch 3', 'move 1, move 2'); + battle.makeChoices('move 1, switch 3', 'auto'); + assert.statStage(battle.p1.active[1], 'atk', 0); + assert.statStage(battle.p1.active[1], 'spa', 0); + }); + }); +}); From cb09767c6f6f979237350f584668db865a835e84 Mon Sep 17 00:00:00 2001 From: Mia <49593536+mia-pi-git@users.noreply.github.com> Date: Sun, 2 Jun 2024 23:53:58 -0500 Subject: [PATCH 018/139] Roomlogs: Support logging to flat files while database config exists Smogtours.... --- server/roomlogs.ts | 5 ++++- server/users.ts | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/server/roomlogs.ts b/server/roomlogs.ts index 8aea6334e1f1..2bbdd8d48a0d 100644 --- a/server/roomlogs.ts +++ b/server/roomlogs.ts @@ -28,7 +28,10 @@ interface RoomlogRow { content: string | null; } -export const roomlogDB = global.Config?.replaysdb ? new PGDatabase(Config.replaysdb) : null; +export const roomlogDB = (() => { + if (!global.Config || Config.replaysdb || Config.disableroomlogdb) return null; + return new PGDatabase(Config.replaysdb); +})(); export const roomlogTable = roomlogDB?.getTable('roomlogs'); /** diff --git a/server/users.ts b/server/users.ts index 5f1447e98290..2f29d3480300 100644 --- a/server/users.ts +++ b/server/users.ts @@ -188,7 +188,7 @@ function isUsername(name: string) { function isTrusted(userid: ID) { if (globalAuth.has(userid)) return userid; for (const room of Rooms.global.chatRooms) { - if (room.persist && room.settings.isPrivate !== true && room.auth.isStaff(userid)) { + if (room.persist && !room.settings.isPrivate && room.auth.isStaff(userid)) { return userid; } } From 1ec6d1476cbc9b172ddc642b0b08e3eb8221f85f Mon Sep 17 00:00:00 2001 From: Mia <49593536+mia-pi-git@users.noreply.github.com> Date: Sun, 2 Jun 2024 23:56:38 -0500 Subject: [PATCH 019/139] Roomlogs: Be properly agnostic to config settings --- server/roomlogs.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/roomlogs.ts b/server/roomlogs.ts index 2bbdd8d48a0d..6cab630a5aaf 100644 --- a/server/roomlogs.ts +++ b/server/roomlogs.ts @@ -99,7 +99,7 @@ export class Roomlog { this.numTruncatedLines = 0; - if (!Config.replaysdb) { + if (!roomlogTable) { void this.setupRoomlogStream(true); } } From 706fe2899727c1f02aa24a16e4d7229e9b8ced91 Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Mon, 3 Jun 2024 18:48:06 -0600 Subject: [PATCH 020/139] SSB: Add Daki and Neko --- data/mods/gen9ssb/abilities.ts | 55 ++++++++++-- data/mods/gen9ssb/conditions.ts | 81 +++++++++++++---- data/mods/gen9ssb/moves.ts | 140 ++++++++++++++++++++++++++---- data/mods/gen9ssb/pokedex.ts | 14 ++- data/mods/gen9ssb/random-teams.ts | 12 +++ data/mods/gen9ssb/scripts.ts | 56 ++++++++++-- 6 files changed, 308 insertions(+), 50 deletions(-) diff --git a/data/mods/gen9ssb/abilities.ts b/data/mods/gen9ssb/abilities.ts index 73ff91f033b0..ee8008ae79e4 100644 --- a/data/mods/gen9ssb/abilities.ts +++ b/data/mods/gen9ssb/abilities.ts @@ -1,5 +1,5 @@ import {ssbSets} from "./random-teams"; -import {changeSet, getName, enemyStaff} from "./scripts"; +import {changeSet, getName, enemyStaff, PSEUDO_WEATHERS} from "./scripts"; const STRONG_WEATHERS = ['desolateland', 'primordialsea', 'deltastream', 'deserteddunes', 'millenniumcastle']; @@ -614,6 +614,26 @@ export const Abilities: {[k: string]: ModdedAbilityData} = { flags: {}, }, + // Daki + astrothunder: { + shortDesc: "Drizzle + Static.", + name: "Astrothunder", + onStart(source) { + for (const action of this.queue) { + if (action.choice === 'runPrimal' && action.pokemon === source && source.species.id === 'kyogre') return; + if (action.choice !== 'runSwitch' && action.choice !== 'runPrimal') break; + } + this.field.setWeather('raindance'); + }, + onDamagingHit(damage, target, source, move) { + if (this.checkMoveMakesContact(move, source, target)) { + if (this.randomChance(3, 10)) { + source.trySetStatus('par', target); + } + } + }, + }, + // Dawn of Artemis formchange: { shortDesc: ">50% HP Necrozma, else Necrozma-Ultra. SpA boosts become Atk boosts and vice versa.", @@ -1111,14 +1131,12 @@ export const Abilities: {[k: string]: ModdedAbilityData} = { ]; for (const sideCondition of remove) { if (side.removeSideCondition(sideCondition)) { - success = true; + this.add('-sideend', side, this.dex.conditions.get(sideCondition).name, '[from] ability: Anfield', '[of] ' + target); } } } - if (Object.keys(this.field.pseudoWeather).length) { - for (const pseudoWeather in this.field.pseudoWeather) { - if (this.field.removePseudoWeather(pseudoWeather)) success = true; - } + for (const pseudoWeather of PSEUDO_WEATHERS) { + if (this.field.removePseudoWeather(pseudoWeather)) success = true; } if (success) { this.add('-activate', target, 'ability: Anfield'); @@ -1280,7 +1298,7 @@ export const Abilities: {[k: string]: ModdedAbilityData} = { } this.field.clearTerrain(); this.field.clearWeather(); - for (const pseudoWeather of Object.keys(this.field.pseudoWeather)) { + for (const pseudoWeather of PSEUDO_WEATHERS) { this.field.removePseudoWeather(pseudoWeather); } this.add('-clearallboost'); @@ -1548,6 +1566,27 @@ export const Abilities: {[k: string]: ModdedAbilityData} = { flags: {}, }, + // Neko + weatherproof: { + shortDesc: "Water-/Fire-type moves against this Pokemon deal damage with a halved offensive stat.", + name: "Weatherproof", + onSourceModifyAtkPriority: 6, + onSourceModifyAtk(atk, attacker, defender, move) { + if (move.type === 'Water' || move.type === 'Fire') { + this.debug('Weatherproof weaken'); + return this.chainModify(0.5); + } + }, + onSourceModifySpAPriority: 5, + onSourceModifySpA(atk, attacker, defender, move) { + if (move.type === 'Water' || move.type === 'Fire') { + this.debug('Weatherproof weaken'); + return this.chainModify(0.5); + } + }, + flags: {breakable: 1}, + }, + // Ney pranksterplus: { shortDesc: "This Pokemon's Status moves have priority raised by 1. Dark types are not immune.", @@ -2524,7 +2563,7 @@ export const Abilities: {[k: string]: ModdedAbilityData} = { name: "Wild Growth", onModifyMovePriority: -1, onAfterMove(source, target, move) { - if (target.hasType('Grass') || target.hasAbility('Sap Sipper') || !move.hit) return null; + if (target.hasType('Grass') || target.hasAbility('Sap Sipper') || !move.hit || target === source) return null; target.addVolatile('leechseed', source); }, flags: {}, diff --git a/data/mods/gen9ssb/conditions.ts b/data/mods/gen9ssb/conditions.ts index 8a77dc45afc6..2e31d05a8e3c 100644 --- a/data/mods/gen9ssb/conditions.ts +++ b/data/mods/gen9ssb/conditions.ts @@ -619,6 +619,17 @@ export const Conditions: {[k: string]: ModdedConditionData & {innateName?: strin this.add(`c:|${getName('Corthius')}|Maurice, I can't "move it move it" anymore.`); }, }, + daki: { + onStart() { + this.add(`c:|${getName('Daki')}|Sun is down, freezing cold`); + }, + onSwitchOut() { + this.add(`c:|${getName('Daki')}|She thought it was the ocean, it's just the pool!`); + }, + onFaint() { + this.add(`c:|${getName('Daki')}|Had me out like a light (like a light)`); + }, + }, dawnofartemis: { noCopy: true, onStart(pokemon) { @@ -1604,6 +1615,18 @@ export const Conditions: {[k: string]: ModdedConditionData & {innateName?: strin this.add(`c:|${getName('MyPearl')}|ta permitido isso?`); }, }, + neko: { + noCopy: true, + onStart() { + this.add(`c:|${getName('Neko')}|Gmeow :3`); + }, + onSwitchOut() { + this.add(`c:|${getName('Neko')}|Meow go poof :3c`); + }, + onFaint() { + this.add(`c:|${getName('Neko')}|Chien-Meow is cute when it doesn't scratch the ground, between it and Flutter Mane its dangerous to go out and ladder. You have been warned ;w;`); + }, + }, ney: { noCopy: true, onStart() { @@ -2971,22 +2994,6 @@ export const Conditions: {[k: string]: ModdedConditionData & {innateName?: strin }, }, - // HoeenHero - virus: { - name: 'Virus', - onStart(target, source, sourceEffect) { - this.effectState.stage = 0; - this.add('-start', target, 'virus'); - }, - onResidualOrder: 9, - onResidual(pokemon) { - if (this.effectState.stage < 15) { - this.effectState.stage++; - } - this.damage(this.clampIntRange(pokemon.baseMaxhp / 16, 1) * this.effectState.stage); - }, - }, - // kenn deserteddunes: { name: 'DesertedDunes', @@ -3021,6 +3028,48 @@ export const Conditions: {[k: string]: ModdedConditionData & {innateName?: strin }, }, + // Neko + catstampofapproval: { + name: "Cat Stamp of Approval", + noCopy: true, + onStart(target) { + this.add('-start', target, 'Cat Stamp of Approval'); + this.effectState.bestStat = target.getBestStat(false, true); + }, + onEnd(target) { + this.add('-end', target, 'Cat Stamp of Approval'); + }, + onModifyAtkPriority: 5, + onModifyAtk(atk, pokemon) { + if (this.effectState.bestStat !== 'atk' || pokemon.ignoringAbility()) return; + this.debug('Cat Stamp of Approval atk boost'); + return this.chainModify([5325, 4096]); + }, + onModifyDefPriority: 6, + onModifyDef(def, pokemon) { + if (this.effectState.bestStat !== 'def' || pokemon.ignoringAbility()) return; + this.debug('Cat Stamp of Approval def boost'); + return this.chainModify([5325, 4096]); + }, + onModifySpAPriority: 5, + onModifySpA(spa, pokemon) { + if (this.effectState.bestStat !== 'spa' || pokemon.ignoringAbility()) return; + this.debug('Cat Stamp of Approval spa boost'); + return this.chainModify([5325, 4096]); + }, + onModifySpDPriority: 6, + onModifySpD(spd, pokemon) { + if (this.effectState.bestStat !== 'spd' || pokemon.ignoringAbility()) return; + this.debug('Cat Stamp of Approval spd boost'); + return this.chainModify([5325, 4096]); + }, + onModifySpe(spe, pokemon) { + if (this.effectState.bestStat !== 'spe' || pokemon.ignoringAbility()) return; + this.debug('Cat Stamp of Approval spe boost'); + return this.chainModify(1.5); + }, + }, + // Effects needed to be overriden for things to happen attract: { onStart(pokemon, source, effect) { diff --git a/data/mods/gen9ssb/moves.ts b/data/mods/gen9ssb/moves.ts index db5c63716c35..5dc36adc119b 100644 --- a/data/mods/gen9ssb/moves.ts +++ b/data/mods/gen9ssb/moves.ts @@ -1,5 +1,5 @@ import {ssbSets} from "./random-teams"; -import {changeSet, getName} from "./scripts"; +import {PSEUDO_WEATHERS, changeSet, getName} from "./scripts"; import {Teams} from '../../../sim/teams'; export const Moves: {[k: string]: ModdedMoveData} = { @@ -521,7 +521,7 @@ export const Moves: {[k: string]: ModdedMoveData} = { }, volatileStatus: 'flinch', onHit(target, source, move) { - if (!source.getMoveHitData(move).crit) { + if (target && !target.getMoveHitData(move).crit) { delete move.volatileStatus; } }, @@ -1445,6 +1445,36 @@ export const Moves: {[k: string]: ModdedMoveData} = { type: "Grass", }, + // Daki + antidote: { + accuracy: true, + basePower: 0, + category: "Status", + name: "Antidote", + shortDesc: "Recover + Magnet Rise for 3 turns.", + pp: 10, + priority: 0, + flags: {snatch: 1, heal: 1, gravity: 1, metronome: 1}, + heal: [1, 2], + onTry(source, target, move) { + if (target.volatiles['smackdown'] || target.volatiles['ingrain']) return false; + + // Additional Gravity check for Z-move variant + if (this.field.getPseudoWeather('Gravity')) { + this.add('cant', source, 'move: Gravity', move); + return null; + } + }, + onHit(target, source, move) { + if (!source.volatiles['magnetrise']) { + source.addVolatile('magnetrise', source, move); + } + }, + secondary: null, + target: "self", + type: "Normal", + }, + // Dawn of Artemis magicalfocus: { accuracy: 100, @@ -1982,7 +2012,6 @@ export const Moves: {[k: string]: ModdedMoveData} = { pp: 5, priority: 4, flags: {}, - sideCondition: 'toxicspikes', onTry(source) { if (source.activeMoveActions > 1) { this.hint("Puffy Spiky Destruction only works on your first turn out."); @@ -1997,19 +2026,21 @@ export const Moves: {[k: string]: ModdedMoveData} = { this.add('-anim', source, 'Spiky Shield', source); this.add('-anim', source, 'Toxic Spikes', target); }, - self: { - volatileStatus: 'spikyshield', - onHit(target, source, move) { - source.setType(source.getTypes(true).filter(type => type !== "Poison")); - this.add('-start', source, 'typechange', source.getTypes().join('/'), '[from] move: Puffy Spiky Destruction'); - }, - boosts: { - spe: 1, - atk: 1, - }, + volatileStatus: 'spikyshield', + onHit(target, source, move) { + source.setType(source.getTypes(true).filter(type => type !== "Poison")); + this.add('-start', source, 'typechange', source.getTypes().join('/'), '[from] move: Puffy Spiky Destruction'); + const foeSide = source.side.foe; + if (!foeSide.sideConditions['toxicspikes'] || foeSide.sideConditions['toxicspikes'].layers < 2) { + foeSide.addSideCondition('toxicspikes', source, move); + } + }, + boosts: { + spe: 1, + atk: 1, }, secondary: null, - target: 'normal', + target: 'self', type: "Poison", }, @@ -2961,7 +2992,7 @@ export const Moves: {[k: string]: ModdedMoveData} = { if (moveSlot.pp < moveSlot.maxpp) moveSlot.pp += 1; } }, - target: "self", + target: "normal", type: "Fairy", }, @@ -3719,6 +3750,61 @@ export const Moves: {[k: string]: ModdedMoveData} = { type: "Psychic", }, + // Neko + qualitycontrolzoomies: { + accuracy: 100, + basePower: 50, + basePowerCallback(pokemon, target, move) { + if (pokemon.side.pokemonLeft === 1) return move.basePower + 30; + return move.basePower; + }, + category: "Physical", + shortDesc: "User swap, replacement Booster Energy boost.", + name: "Quality Control Zoomies", + gen: 9, + pp: 15, + priority: 0, + flags: {contact: 1, protect: 1, mirror: 1}, + onTryMove() { + this.attrLastMove('[still]'); + }, + onPrepareHit(target, source) { + this.add('-anim', source, 'Ice Spinner', target); + this.add('-anim', source, 'Chilly Reception', source); + }, + self: { + slotCondition: 'Quality Control Zoomies', + }, + condition: { + onSwap(target) { + if (!target.fainted) { + target.addVolatile('catstampofapproval'); + } + }, + }, + onHit(target, source, move) { + let message = 'Meow has no other options, so ;w;'; + if (source.side.pokemonLeft > 1) { + message = 'Meow is not the right Pokemon to be an example here, swap meow out please.'; + } + this.add(`c:|${getName('Neko')}|${message}`); + }, + onModifyMove(move, pokemon, target) { + if (pokemon.side.pokemonLeft === 1) { + move.self = { + onHit(t, source, m) { + source.addVolatile('catstampofapproval'); + }, + }; + delete move.condition; + } + }, + selfSwitch: true, + secondary: null, + target: "normal", + type: "Ice", + }, + // Ney shadowdance: { accuracy: 90, @@ -4390,7 +4476,7 @@ export const Moves: {[k: string]: ModdedMoveData} = { } this.field.clearTerrain(); this.field.clearWeather(); - for (const pseudoWeather of Object.keys(this.field.pseudoWeather)) { + for (const pseudoWeather of PSEUDO_WEATHERS) { this.field.removePseudoWeather(pseudoWeather); } }, @@ -5633,7 +5719,7 @@ export const Moves: {[k: string]: ModdedMoveData} = { type: "Grass", }, - // WarriorGallade - TODO: Fix animations + // WarriorGallade fruitfullongbow: { accuracy: 90, basePower: 160, @@ -6598,6 +6684,26 @@ export const Moves: {[k: string]: ModdedMoveData} = { }, }, }, + magnetrise: { + inherit: true, + condition: { + duration: 5, + durationCallback(target, source, effect) { + if (effect?.name === 'Antidote') return 3; + return 5; + }, + onStart(target) { + this.add('-start', target, 'Magnet Rise'); + }, + onImmunity(type) { + if (type === 'Ground') return false; + }, + onResidualOrder: 18, + onEnd(target) { + this.add('-end', target, 'Magnet Rise'); + }, + }, + }, // Try playing Staff Bros with dynamax clause and see what happens supermetronome: { diff --git a/data/mods/gen9ssb/pokedex.ts b/data/mods/gen9ssb/pokedex.ts index bd2808988093..23ce0edd4b5d 100644 --- a/data/mods/gen9ssb/pokedex.ts +++ b/data/mods/gen9ssb/pokedex.ts @@ -21,7 +21,7 @@ export const Pokedex: {[k: string]: ModdedSpeciesData} = { // Aethernum giratinaorigin: { inherit: true, - abilities: {0: "The Eminince in the Shadow"}, + abilities: {0: "The Eminence in the Shadow"}, }, // Akir @@ -239,6 +239,12 @@ export const Pokedex: {[k: string]: ModdedSpeciesData} = { abilities: {0: "Grassy Emperor"}, }, + // Daki + ragingbolt: { + inherit: true, + abilities: {0: "Astrothunder"}, + }, + // Dawn of Artemis necrozma: { inherit: true, @@ -631,6 +637,12 @@ export const Pokedex: {[k: string]: ModdedSpeciesData} = { abilities: {0: "Eon Call"}, }, + // Neko + chienpao: { + inherit: true, + abilities: {0: "Weatherproof"}, + }, + // Ney banette: { inherit: true, diff --git a/data/mods/gen9ssb/random-teams.ts b/data/mods/gen9ssb/random-teams.ts index fc41e2b746db..4e1e04012eb2 100644 --- a/data/mods/gen9ssb/random-teams.ts +++ b/data/mods/gen9ssb/random-teams.ts @@ -288,6 +288,12 @@ export const ssbSets: SSBSets = { signatureMove: 'Monkey Beat Up', evs: {atk: 252, def: 4, spe: 252}, nature: 'Adamant', shiny: 69, }, + Daki: { + species: 'Raging Bolt', ability: 'Astrothunder', item: 'Leftovers', gender: 'N', + moves: ['Thunder', 'Dragon Pulse', 'Calm Mind'], + signatureMove: 'Antidote', + evs: {hp: 148, def: 156, spa: 204}, nature: 'Quiet', teraType: 'Steel', + }, 'Dawn of Artemis': { species: 'Necrozma', ability: 'Form Change', item: 'Expert Belt', gender: 'F', moves: ['Calm Mind', 'Photon Geyser', 'Earth Power'], @@ -637,6 +643,12 @@ export const ssbSets: SSBSets = { signatureMove: 'Eon Assault', evs: {hp: 252, def: 4, spe: 252}, ivs: {atk: 0}, nature: 'Timid', teraType: 'Steel', shiny: 50, skip: 'MyPearl', }, + Neko: { + species: 'Chien-Pao', ability: 'Weatherproof', item: 'Heavy-Duty Boots', gender: 'N', + moves: ['Swords Dance', 'Bitter Blade', ['Crunch', 'Sucker Punch']], + signatureMove: 'Quality Control Zoomies', + evs: {atk: 252, def: 4, spa: 252}, nature: 'Jolly', teraType: 'Fire', + }, Ney: { species: 'Banette', ability: 'Insomnia', item: 'Banettite', gender: 'M', moves: ['Destiny Bond', 'Will-O-Wisp', 'Parting Shot'], diff --git a/data/mods/gen9ssb/scripts.ts b/data/mods/gen9ssb/scripts.ts index e2a3523fd081..fb743607b727 100644 --- a/data/mods/gen9ssb/scripts.ts +++ b/data/mods/gen9ssb/scripts.ts @@ -115,6 +115,13 @@ export function changeSet(context: Battle, pokemon: Pokemon, newSet: SSBSet, cha context.add('message', `${pokemon.name} changed form!`); } +export const PSEUDO_WEATHERS = [ + // Normal pseudo weathers + 'fairylock', 'gravity', 'iondeluge', 'magicroom', 'mudsport', 'trickroom', 'watersport', 'wonderroom', + // SSB pseudo weathers + 'anfieldatmosphere', +]; + /** * Assigns new moves to a Pokemon * @param pokemon The Pokemon whose moveset is to be modified @@ -611,7 +618,7 @@ export const Scripts: ModdedBattleScriptsData = { for (const [pokemon, originalHP] of residualPokemon) { const maxhp = pokemon.getUndynamaxedHP(pokemon.maxhp); if (pokemon.hp && pokemon.getUndynamaxedHP() <= maxhp / 2 && originalHP > maxhp / 2) { - if (!pokemon.m.cascade) this.runEvent('EmergencyExit', pokemon); + this.runEvent('EmergencyExit', pokemon); } } } @@ -619,7 +626,7 @@ export const Scripts: ModdedBattleScriptsData = { if (action.choice === 'runSwitch') { const pokemon = action.pokemon; if (pokemon.hp && pokemon.hp <= pokemon.maxhp / 2 && pokemonOriginalHP! > pokemon.maxhp / 2) { - if (!pokemon.m.cascade) this.runEvent('EmergencyExit', pokemon); + this.runEvent('EmergencyExit', pokemon); } } @@ -676,6 +683,39 @@ export const Scripts: ModdedBattleScriptsData = { return false; }, actions: { + terastallize(pokemon) { + if (pokemon.illusion && ['Ogerpon', 'Terapagos'].includes(pokemon.illusion.species.baseSpecies)) { + this.battle.singleEvent('End', this.dex.abilities.get('Illusion'), pokemon.abilityState, pokemon); + } + + const type = pokemon.teraType; + this.battle.add('-terastallize', pokemon, type); + pokemon.terastallized = type; + for (const ally of pokemon.side.pokemon) { + ally.canTerastallize = null; + } + pokemon.addedType = ''; + pokemon.knownType = true; + pokemon.apparentType = type; + if (pokemon.species.baseSpecies === 'Ogerpon') { + const tera = pokemon.species.id === 'ogerpon' ? 'tealtera' : 'tera'; + pokemon.formeChange(pokemon.species.id + tera, null, true); + } + if (pokemon.species.name === 'Terapagos-Terastal' && type === 'Stellar') { + pokemon.formeChange('Terapagos-Stellar', null, true); + pokemon.baseMaxhp = Math.floor(Math.floor( + 2 * pokemon.species.baseStats['hp'] + pokemon.set.ivs['hp'] + Math.floor(pokemon.set.evs['hp'] / 4) + 100 + ) * pokemon.level / 100 + 10); + const newMaxHP = pokemon.baseMaxhp; + pokemon.hp = newMaxHP - (pokemon.maxhp - pokemon.hp); + pokemon.maxhp = newMaxHP; + this.battle.add('-heal', pokemon, pokemon.getHealth, '[silent]'); + } + if (!pokemon.illusion && pokemon.name === 'Neko') { + this.battle.add(`c:|${getName('Neko')}|Possible thermal failure if operation continues (Meow on fire ?)`); + } + this.battle.runEvent('AfterTerastallization', pokemon); + }, modifyDamage(baseDamage, pokemon, target, move, suppressMessages) { const tr = this.battle.trunc; if (!move.type) move.type = '???'; @@ -1355,7 +1395,7 @@ export const Scripts: ModdedBattleScriptsData = { this.battle.runEvent('AfterMoveSecondarySelf', pokemon, target, move); if (pokemon && pokemon !== target && move.category !== 'Status') { if (pokemon.hp <= pokemon.maxhp / 2 && originalHp > pokemon.maxhp / 2) { - if (!pokemon.m.cascade) this.battle.runEvent('EmergencyExit', pokemon, pokemon); + this.battle.runEvent('EmergencyExit', pokemon, pokemon); } } } @@ -1476,7 +1516,7 @@ export const Scripts: ModdedBattleScriptsData = { this.battle.damage(Math.round(pokemon.maxhp / 2), pokemon, pokemon, this.dex.conditions.get(move.id), true); move.mindBlownRecoil = false; if (pokemon.hp <= pokemon.maxhp / 2 && hpBeforeRecoil > pokemon.maxhp / 2) { - if (!pokemon.m.cascade) this.battle.runEvent('EmergencyExit', pokemon, pokemon); + this.battle.runEvent('EmergencyExit', pokemon, pokemon); } } this.battle.eachEvent('Update'); @@ -1497,7 +1537,7 @@ export const Scripts: ModdedBattleScriptsData = { const hpBeforeRecoil = pokemon.hp; this.battle.damage(this.calcRecoilDamage(move.totalDamage, move, pokemon), pokemon, pokemon, 'recoil'); if (pokemon.hp <= pokemon.maxhp / 2 && hpBeforeRecoil > pokemon.maxhp / 2) { - if (!pokemon.m.cascade) this.battle.runEvent('EmergencyExit', pokemon, pokemon); + this.battle.runEvent('EmergencyExit', pokemon, pokemon); } } @@ -1511,7 +1551,7 @@ export const Scripts: ModdedBattleScriptsData = { } this.battle.directDamage(recoilDamage, pokemon, pokemon, {id: 'strugglerecoil'} as Condition); if (pokemon.hp <= pokemon.maxhp / 2 && hpBeforeRecoil > pokemon.maxhp / 2) { - if (!pokemon.m.cascade) this.battle.runEvent('EmergencyExit', pokemon, pokemon); + this.battle.runEvent('EmergencyExit', pokemon, pokemon); } } @@ -1545,7 +1585,7 @@ export const Scripts: ModdedBattleScriptsData = { if (typeof curDamage === 'number' && targets[i].hp) { const targetHPBeforeDamage = (targets[i].hurtThisTurn || 0) + curDamage; if (targets[i].hp <= targets[i].maxhp / 2 && targetHPBeforeDamage > targets[i].maxhp / 2) { - if (!targets[i].m.cascade) this.battle.runEvent('EmergencyExit', targets[i], pokemon); + this.battle.runEvent('EmergencyExit', targets[i], pokemon); } } } @@ -1678,7 +1718,7 @@ export const Scripts: ModdedBattleScriptsData = { } } if (pokemon.hp && pokemon.hp <= pokemon.maxhp / 2 && pokemonOriginalHP > pokemon.maxhp / 2) { - if (!pokemon.m.cascade) this.battle.runEvent('EmergencyExit', pokemon); + this.battle.runEvent('EmergencyExit', pokemon); } } From 1ce51f850fc2e02c0401ce536aa472c4b3584584 Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Tue, 4 Jun 2024 14:33:50 -0600 Subject: [PATCH 021/139] SSB: Add Tuthur and yeet dab xd --- data/mods/gen9ssb/abilities.ts | 102 +++++++++++++++++++++++++ data/mods/gen9ssb/conditions.ts | 25 +++++++ data/mods/gen9ssb/moves.ts | 119 ++++++++++++++++++++++++++++-- data/mods/gen9ssb/pokedex.ts | 12 +++ data/mods/gen9ssb/random-teams.ts | 14 +++- 5 files changed, 265 insertions(+), 7 deletions(-) diff --git a/data/mods/gen9ssb/abilities.ts b/data/mods/gen9ssb/abilities.ts index ee8008ae79e4..4a300e0008b2 100644 --- a/data/mods/gen9ssb/abilities.ts +++ b/data/mods/gen9ssb/abilities.ts @@ -2674,6 +2674,108 @@ export const Abilities: {[k: string]: ModdedAbilityData} = { flags: {breakable: 1}, }, + // yeet dab xd + treasurebag: { + shortDesc: "Cycles between Blast Seed, Oran Berry, Petrify Orb, Luminous Orb and Reviver Seed.", + name: "Treasure Bag", + onStart(target) { + this.add('-ability', target, 'Treasure Bag'); + target.addVolatile('treasurebag'); + }, + condition: { + onStart(pokemon, source, sourceEffect) { + if (!pokemon.m.bag) { + pokemon.m.bag = ['Blast Seed', 'Oran Berry', 'Petrify Orb', 'Luminous Orb', 'Reviver Seed']; + } + }, + onEnd(target) { + delete target.volatiles['treasurebag']; + }, + onResidual(pokemon, source, effect) { + if (!pokemon.m.bag) { + pokemon.m.bag = ['Blast Seed', 'Oran Berry', 'Petrify Orb', 'Luminous Orb', 'Reviver Seed']; + } + if (!pokemon.m.cycledTreasureBag) { + const currentItem = pokemon.m.bag.shift(); + const foe = pokemon.foes()[0]; + switch (currentItem) { + case 'Blast Seed': { + this.add('-activate', pokemon, 'ability: Treasure Bag'); + this.add('-message', `${pokemon.name} dug through its Treasure Bag and found a ${currentItem}!`); + if (foe) { + this.damage(100, foe, pokemon, this.effect); + } else { + this.add('-message', `But there was no target!`); + } + break; + } + case 'Oran Berry': { + this.add('-activate', pokemon, 'ability: Treasure Bag'); + this.add('-message', `${pokemon.name} dug through its Treasure Bag and found an ${currentItem}!`); + this.heal(100, pokemon, pokemon, this.dex.items.get('Oran Berry')); + break; + } + case 'Petrify Orb': { + this.add('-activate', pokemon, 'ability: Treasure Bag'); + this.add('-message', `${pokemon.name} dug through its Treasure Bag and found a ${currentItem}!`); + if (foe?.trySetStatus('par', pokemon, this.effect)) { + this.add('-message', `${pokemon.name} petrified ${foe.name}`); + } else if (!foe) { + this.add('-message', `But there was no target!`); + } else { + this.add('-message', `But it failed!`); + } + break; + } + case 'Luminous Orb': { + this.add('-activate', pokemon, 'ability: Treasure Bag'); + this.add('-message', `${pokemon.name} dug through its Treasure Bag and found a ${currentItem}!`); + if (!pokemon.side.addSideCondition('auroraveil', pokemon, this.effect)) { + this.add('-message', `But it failed!`); + } + break; + } + // Handled separately + case 'Reviver Seed': { + this.add('-activate', pokemon, 'ability: Treasure Bag'); + this.add('-message', `${pokemon.name} dug through its Treasure Bag and found a Reviver Seed!`); + break; + } + } + pokemon.m.bag = [...pokemon.m.bag, currentItem]; + } + delete pokemon.m.cycledTreasureBag; + }, + onDamage(damage, pokemon, source, effect) { + if (damage >= pokemon.hp && pokemon.m.bag?.[0] === 'Reviver Seed') { + pokemon.m.seedActive = true; + if (!pokemon.m.reviverSeedTriggered) { + // Can't set hp to 0 because it causes visual bugs + pokemon.hp = 1; + this.add('-damage', pokemon, pokemon.getHealth, '[silent]'); + this.add('-activate', pokemon, 'ability: Treasure Bag'); + this.add('-message', `${pokemon.name} dug through its Treasure Bag and found a Reviver Seed!`); + pokemon.m.reviverSeedTriggered = true; + pokemon.hp = Math.floor(pokemon.maxhp / 2); + this.add('-heal', pokemon, pokemon.getHealth, '[silent]'); + this.add('-message', `${pokemon.name} was revived!`); + return 0; + } else { + this.add('-activate', pokemon, 'ability: Treasure Bag'); + this.add('-message', `${pokemon.name} was revived!`); + this.add('-message', `...thought it was the right one...`); + this.add('-message', `...looking closer, this is...`); + this.add('-message', `Not a Reviver Seed, but a Reviser Seed!`); + this.add(`c:|${getName('yeet dab xd')}|An "s"?`); + this.add('-message', `that wasn't a "v", but an "s"!`); + this.add('-message', `yeet dab xd burst into spontaneous laughter and fainted!`); + return damage; + } + } + }, + }, + }, + // YveltalNL heightadvantage: { shortDesc: "If this Pokemon's height is more than that of the foe, -1 to foe's Attack/Sp. Atk.", diff --git a/data/mods/gen9ssb/conditions.ts b/data/mods/gen9ssb/conditions.ts index 2e31d05a8e3c..0b96e6fedf71 100644 --- a/data/mods/gen9ssb/conditions.ts +++ b/data/mods/gen9ssb/conditions.ts @@ -2427,6 +2427,18 @@ export const Conditions: {[k: string]: ModdedConditionData & {innateName?: strin this.add(`c:|${getName('trace')}|How disappointingly short a dream lasts.`); }, }, + tuthur: { + noCopy: true, + onStart() { + this.add(`c:|${getName('Tuthur')}|QUEUE !`); + }, + onSwitchOut() { + this.add(`c:|${getName('Tuthur')}|feur`); + }, + onFaint() { + this.add(`c:|${getName('Tuthur')}|this wouldn't have gone like this if we'd played kunc`); + }, + }, twoofroses: { noCopy: true, onStart(pokemon) { @@ -2673,6 +2685,19 @@ export const Conditions: {[k: string]: ModdedConditionData & {innateName?: strin xy01: { noCopy: true, }, + yeetdabxd: { + noCopy: true, + onStart(pokemon) { + this.add(`c:|${getName('yeet dab xd')}|Ah, welcome~! The merchandise you have chosen will cost your soul. Is that acceptable?`); + }, + onSwitchOut() { + this.add(`c:|${getName('yeet dab xd')}|brb mum's getting the camera`); + }, + onFaint(pokemon) { + if (pokemon.m.seedActivated) return; + this.add(`c:|${getName('yeet dab xd')}|wait no you didn't join QW yet`); + }, + }, yellowpaint: { noCopy: true, onStart() { diff --git a/data/mods/gen9ssb/moves.ts b/data/mods/gen9ssb/moves.ts index 5dc36adc119b..4e92c4e0d402 100644 --- a/data/mods/gen9ssb/moves.ts +++ b/data/mods/gen9ssb/moves.ts @@ -5427,22 +5427,50 @@ export const Moves: {[k: string]: ModdedMoveData} = { type: "Psychic", }, + // Tuthur + symphonieduzero: { + accuracy: 100, + basePower: 80, + category: "Special", + shortDesc: "Salt cures target. Ignores abilities.", + name: "Symphonie du Ze\u0301ro", + pp: 10, + priority: 0, + flags: {protect: 1, mirror: 1, sound: 1, bypasssub: 1}, + onTryMove() { + this.attrLastMove('[still]'); + }, + onPrepareHit(target, source) { + this.add('-anim', source, 'Alluring Voice', target); + }, + secondary: { + chance: 100, + volatileStatus: 'saltcure', + }, + ignoreAbility: true, + target: "normal", + type: "Fairy", + }, + // Two of Roses dillydally: { accuracy: 90, basePower: 40, category: "Physical", - shortDesc: "2 hits, +1 random stat/hit. Type = User 2nd type.", + shortDesc: "2 hits, +1 random stat/hit. Type=User 2nd type.", desc: "This move hits 2 times. For each successful hit, the user boosts a random stat, except Accuracy and Evasion, by 1 stage. The typing of this move is equal to the user's secondary type; it will instead use the user's primary type if the user lacks a secondary type.", name: "Dilly Dally", pp: 20, priority: 0, multihit: 2, flags: {protect: 1, contact: 1}, - type: "???", onTryMove() { this.attrLastMove('[still]'); }, + onPrepareHit(target, source) { + this.add('-anim', source, 'Volt Tackle', source); + this.add('-anim', source, 'Extreme Speed', target); + }, onModifyType(move, pokemon) { let type = pokemon.getTypes()[pokemon.getTypes().length - 1]; if (type === "Bird" || type === undefined) type = "???"; @@ -5466,11 +5494,8 @@ export const Moves: {[k: string]: ModdedMoveData} = { this.boost(boost, source, source); }, }, - onPrepareHit(target, source) { - this.add('-anim', source, 'Volt Tackle', source); - this.add('-anim', source, 'Extreme Speed', target); - }, target: "normal", + type: "???", }, @@ -5898,6 +5923,88 @@ export const Moves: {[k: string]: ModdedMoveData} = { type: "Poison", }, + // yeet dab xd + topkek: { + accuracy: 100, + basePower: 70, + category: "Physical", + shortDesc: "Gives foe Miracle Seed. Cycles Treasure Bag.", + name: "top kek", + pp: 15, + priority: 0, + flags: {contact: 1, protect: 1, mirror: 1}, + onTryMove() { + this.attrLastMove('[still]'); + }, + onPrepareHit(target, source) { + this.add('-anim', source, "Thief", target); + this.add('-anim', source, "Trick", target); + this.add('-anim', source, "Nasty Plot", source); + }, + onAfterHit(target, source, move) { + if (source.hp) { + if (!target.hasItem('Miracle Seed')) { + const item = target.takeItem(); + if (item) { + this.add('-enditem', target, item.name, '[from] move: top kek', '[of] ' + source); + target.setItem('Miracle Seed', source, move); + } + } + if (source.m.bag) { + const currentItem = source.m.bag.shift(); + switch (currentItem) { + case 'Blast Seed': { + this.add('-activate', source, 'ability: Treasure Bag'); + this.add('-message', `${source.name} dug through its Treasure Bag and found a ${currentItem}!`); + if (target) { + this.damage(100, target, source, this.effect); + } else { + this.add('-message', `But there was no target!`); + } + break; + } + case 'Oran Berry': { + this.add('-activate', source, 'ability: Treasure Bag'); + this.add('-message', `${source.name} dug through its Treasure Bag and found an ${currentItem}!`); + this.heal(100, source, source, this.dex.items.get('Oran Berry')); + break; + } + case 'Petrify Orb': { + this.add('-activate', source, 'ability: Treasure Bag'); + this.add('-message', `${source.name} dug through its Treasure Bag and found a ${currentItem}!`); + if (target?.trySetStatus('par', source, this.effect)) { + this.add('-message', `${source.name} petrified ${target.name}`); + } else if (!target) { + this.add('-message', `But there was no target!`); + } else { + this.add('-message', `But it failed!`); + } + break; + } + case 'Luminous Orb': { + this.add('-activate', source, 'ability: Treasure Bag'); + this.add('-message', `${source.name} dug through its Treasure Bag and found a ${currentItem}!`); + if (!source.side.addSideCondition('auroraveil', source, this.effect)) { + this.add('-message', `But it failed!`); + } + break; + } + case 'Reviver Seed': { + this.add('-activate', source, 'ability: Treasure Bag'); + this.add('-message', `${source.name} dug through its Treasure Bag and found a ${currentItem}!`); + break; + } + } + source.m.bag = [...source.m.bag, currentItem]; + source.m.cycledTreasureBag = currentItem; + } + } + }, + secondary: null, + target: "normal", + type: "Dark", + }, + // Yellow Paint whiteout: { accuracy: 85, diff --git a/data/mods/gen9ssb/pokedex.ts b/data/mods/gen9ssb/pokedex.ts index 23ce0edd4b5d..39d11ad71657 100644 --- a/data/mods/gen9ssb/pokedex.ts +++ b/data/mods/gen9ssb/pokedex.ts @@ -1000,6 +1000,12 @@ export const Pokedex: {[k: string]: ModdedSpeciesData} = { abilities: {0: "Eyes of Eternity"}, }, + // Tuthur + screamtail: { + inherit: true, + abilities: {0: "Poison Heal"}, + }, + // Two of Roses luxray: { inherit: true, @@ -1094,6 +1100,12 @@ export const Pokedex: {[k: string]: ModdedSpeciesData} = { abilities: {0: "Panic"}, }, + // yeet dab xd + kecleon: { + inherit: true, + abilities: {0: "Treasure Bag"}, + }, + // Yellow Paint rotomfrost: { inherit: true, diff --git a/data/mods/gen9ssb/random-teams.ts b/data/mods/gen9ssb/random-teams.ts index 4e1e04012eb2..a0d6d25ea524 100644 --- a/data/mods/gen9ssb/random-teams.ts +++ b/data/mods/gen9ssb/random-teams.ts @@ -918,6 +918,12 @@ export const ssbSets: SSBSets = { signatureMove: 'Chronostasis', evs: {spa: 252, spd: 4, spe: 252}, nature: 'Modest', teraType: 'Psychic', }, + Tuthur: { + species: 'Scream Tail', ability: 'Poison Heal', item: 'Toxic Orb', gender: 'M', + moves: ['Spikes', 'Burning Bulwark', 'Encore'], + signatureMove: 'Symphonie du Ze\u0301ro', + evs: {hp: 244, def: 12, spe: 252}, nature: 'Timid', teraType: 'Water', + }, 'Two of Roses': { species: 'Luxray', ability: 'As We See', item: 'Mirror Herb', gender: 'M', moves: ['Knock Off', 'Supercell Slam', 'Trailblaze'], @@ -997,6 +1003,12 @@ export const ssbSets: SSBSets = { signatureMove: 'Poisonous Wind', evs: {hp: 248, def: 252, spd: 8}, nature: 'Bold', teraType: 'Fairy', shiny: true, }, + 'yeet dab xd': { + species: 'Kecleon', ability: 'Treasure Bag', item: 'Silk Scarf', gender: 'M', happiness: 0, + moves: ['Frustration', 'Shadow Sneak', 'Fake Out'], + signatureMove: 'top kek', + evs: {hp: 252, atk: 4, spd: 252}, nature: 'Careful', teraType: 'Ghost', + }, 'Yellow Paint': { species: 'Rotom-Frost', ability: 'Yellow Magic', item: 'Chilan Berry', gender: 'N', moves: ['Thunderbolt', 'Blizzard', 'Ion Deluge'], @@ -1052,7 +1064,7 @@ export class RandomStaffBrosTeams extends RandomTeams { this.enforceNoDirectCustomBanlistChanges(); const team: PokemonSet[] = []; - const debug: string[] = []; // Set this to a list of SSB sets to override the normal pool for debugging. + const debug: string[] = ['yeet dab xd']; // Set this to a list of SSB sets to override the normal pool for debugging. const ruleTable = this.dex.formats.getRuleTable(this.format); const monotype = this.forceMonotype || (ruleTable.has('sametypeclause') ? this.sample([...this.dex.types.names().filter(x => x !== 'Stellar')]) : false); From d349d2b8c379d8ecb2efc4e24ed6f20d05c14ff8 Mon Sep 17 00:00:00 2001 From: Kaen <66154904+Seerd@users.noreply.github.com> Date: Tue, 4 Jun 2024 16:39:29 -0400 Subject: [PATCH 022/139] Fervent Impersonation: Update bans (#10330) * Fervent Impersonation: Update bans * Update formats.ts --------- Co-authored-by: Kris Johnson <11083252+KrisXV@users.noreply.github.com> --- config/formats.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/config/formats.ts b/config/formats.ts index 7464f1253daa..568d284aadf1 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -630,12 +630,12 @@ export const Formats: FormatList = [ 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'], + banlist: ['Cramorant', 'Eiscue', 'Mimikyu', '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-Base', '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-Base', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', + 'Arceus', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Cramorant', 'Cramorant-Gorging', 'Cramorant-Gulping', 'Deoxys-Base', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', + 'Eiscue', 'Eiscue-Noice', 'Espathra', 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Koraidon', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Lugia', + 'Lunala', 'Magearna', 'Mewtwo', 'Mimikyu', 'Mimikyu-Busted', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palafin', 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Regieleki', + 'Reshiram', 'Shaymin-Sky', 'Solgaleo', 'Terapagos', 'Urshifu-Base', '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 }, From b5d0aa187ef1c4fbbc613ee14cb52cd9db01be99 Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Wed, 5 Jun 2024 00:01:11 -0600 Subject: [PATCH 023/139] SSB: Add Audiino --- data/mods/gen9ssb/abilities.ts | 16 ++++++++++++++++ data/mods/gen9ssb/conditions.ts | 12 ++++++++++++ data/mods/gen9ssb/moves.ts | 30 ++++++++++++++++++++++++++++++ data/mods/gen9ssb/pokedex.ts | 6 ++++++ data/mods/gen9ssb/random-teams.ts | 6 ++++++ 5 files changed, 70 insertions(+) diff --git a/data/mods/gen9ssb/abilities.ts b/data/mods/gen9ssb/abilities.ts index 4a300e0008b2..7c594792d8af 100644 --- a/data/mods/gen9ssb/abilities.ts +++ b/data/mods/gen9ssb/abilities.ts @@ -338,6 +338,22 @@ export const Abilities: {[k: string]: ModdedAbilityData} = { gen: 9, }, + // Audiino + mitosis: { + shortDesc: "Regenerator + Multiscale.", + name: "Mitosis", + onSwitchOut(pokemon) { + pokemon.heal(pokemon.baseMaxhp / 3); + }, + onSourceModifyDamage(damage, source, target, move) { + if (target.hp >= target.maxhp) { + this.debug('Multiscale weaken'); + return this.chainModify(0.5); + } + }, + flags: {breakable: 1}, + }, + // ausma cascade: { shortDesc: "At 25% HP, transforms into a Mismagius. Sigil's Storm becomes Ghost type and doesn't charge.", diff --git a/data/mods/gen9ssb/conditions.ts b/data/mods/gen9ssb/conditions.ts index 0b96e6fedf71..38e5a55bc64a 100644 --- a/data/mods/gen9ssb/conditions.ts +++ b/data/mods/gen9ssb/conditions.ts @@ -270,6 +270,18 @@ export const Conditions: {[k: string]: ModdedConditionData & {innateName?: strin this.add(`c:|${getName('Arya')}|W-whats this? Oh, come on...!!!`); }, }, + audiino: { + noCopy: true, + onStart() { + this.add(`c:|${getName('Audiino')}|anyone up for othello, scrabble, connect 4, splendor, codenames, catan, actually that's a long enough list already so don't actually take me up on all of those simultaneously`); + }, + onSwitchOut() { + this.add(`c:|${getName('Audiino')}|im only thinking, ill be back...`); + }, + onFaint() { + this.add(`c:|${getName('Audiino')}|ggs, with that i take my leave`); + }, + }, autumn: { noCopy: true, onFaint() { diff --git a/data/mods/gen9ssb/moves.ts b/data/mods/gen9ssb/moves.ts index 4e92c4e0d402..c3a92611c107 100644 --- a/data/mods/gen9ssb/moves.ts +++ b/data/mods/gen9ssb/moves.ts @@ -623,6 +623,36 @@ export const Moves: {[k: string]: ModdedMoveData} = { type: "Ground", }, + // Audiino + thinkinginprogress: { + accuracy: true, + basePower: 0, + category: "Status", + shortDesc: "Cure status, +1 Def/SpA/SpD.", + name: "Thinking In Progress", + gen: 9, + pp: 20, + priority: 0, + flags: {snatch: 1, metronome: 1}, + onTryMove() { + this.attrLastMove('[still]'); + }, + onPrepareHit(target, source) { + this.add('-anim', source, 'Calm Mind', source); + }, + onHit(target, source, move) { + source.cureStatus(); + }, + boosts: { + def: 1, + spa: 1, + spd: 1, + }, + secondary: null, + target: "self", + type: "Psychic", + }, + // autumn seasonssmite: { accuracy: 100, diff --git a/data/mods/gen9ssb/pokedex.ts b/data/mods/gen9ssb/pokedex.ts index 39d11ad71657..3a05dcb1b459 100644 --- a/data/mods/gen9ssb/pokedex.ts +++ b/data/mods/gen9ssb/pokedex.ts @@ -109,6 +109,12 @@ export const Pokedex: {[k: string]: ModdedSpeciesData} = { abilities: {0: "Tinted Lens"}, }, + // Audiino + audino: { + inherit: true, + abilities: {0: "Mitosis"}, + }, + // ausma hatterene: { inherit: true, diff --git a/data/mods/gen9ssb/random-teams.ts b/data/mods/gen9ssb/random-teams.ts index a0d6d25ea524..19e1c76e2c8f 100644 --- a/data/mods/gen9ssb/random-teams.ts +++ b/data/mods/gen9ssb/random-teams.ts @@ -132,6 +132,12 @@ export const ssbSets: SSBSets = { signatureMove: 'Anyone can be killed', evs: {spa: 252, spd: 4, spe: 252}, nature: 'Timid', }, + Audiino: { + species: 'Audino', ability: 'Mitosis', item: 'Leftovers', gender: 'N', + moves: ['Recover', 'Moongeist Beam', 'Hyper Voice'], + signatureMove: 'Thinking In Progress', + evs: {hp: 252, def: 4, spa: 252}, nature: 'Modest', teraType: 'Ghost', + }, autumn: { species: 'Flutter Mane', ability: 'Protosynthesis', item: 'Booster Energy', gender: 'N', moves: ['Moonblast', 'Taunt', 'Strength Sap'], From 5647192a6e1a4b6aea7ef1909ac46901be7445cb Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Wed, 5 Jun 2024 00:03:15 -0600 Subject: [PATCH 024/139] SSB: Fix bug --- data/mods/gen9ssb/random-teams.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/mods/gen9ssb/random-teams.ts b/data/mods/gen9ssb/random-teams.ts index 19e1c76e2c8f..e3471a56bb4e 100644 --- a/data/mods/gen9ssb/random-teams.ts +++ b/data/mods/gen9ssb/random-teams.ts @@ -1070,7 +1070,7 @@ export class RandomStaffBrosTeams extends RandomTeams { this.enforceNoDirectCustomBanlistChanges(); const team: PokemonSet[] = []; - const debug: string[] = ['yeet dab xd']; // Set this to a list of SSB sets to override the normal pool for debugging. + const debug: string[] = []; // Set this to a list of SSB sets to override the normal pool for debugging. const ruleTable = this.dex.formats.getRuleTable(this.format); const monotype = this.forceMonotype || (ruleTable.has('sametypeclause') ? this.sample([...this.dex.types.names().filter(x => x !== 'Stellar')]) : false); From ee113e24d5167458689a837d17c4d4dc67b81a8f Mon Sep 17 00:00:00 2001 From: Mia <49593536+mia-pi-git@users.noreply.github.com> Date: Wed, 5 Jun 2024 09:19:14 -0500 Subject: [PATCH 025/139] Roomlogs: Fix typo --- server/roomlogs.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/roomlogs.ts b/server/roomlogs.ts index 6cab630a5aaf..431506ea5db5 100644 --- a/server/roomlogs.ts +++ b/server/roomlogs.ts @@ -29,7 +29,7 @@ interface RoomlogRow { } export const roomlogDB = (() => { - if (!global.Config || Config.replaysdb || Config.disableroomlogdb) return null; + if (!global.Config || !Config.replaysdb || Config.disableroomlogdb) return null; return new PGDatabase(Config.replaysdb); })(); export const roomlogTable = roomlogDB?.getTable('roomlogs'); From a8730c26134fc9e7fd9892f2213e2c5758bbdb37 Mon Sep 17 00:00:00 2001 From: Mia <49593536+mia-pi-git@users.noreply.github.com> Date: Wed, 5 Jun 2024 09:28:22 -0500 Subject: [PATCH 026/139] Teams: Ensure empty teams cannot be uploaded at any stage --- server/chat-plugins/teams.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/server/chat-plugins/teams.ts b/server/chat-plugins/teams.ts index cd60f605c0f1..280d288e736d 100644 --- a/server/chat-plugins/teams.ts +++ b/server/chat-plugins/teams.ts @@ -225,6 +225,10 @@ export const TeamsHandler = new class { return null; } rawTeam = Teams.pack(team); + if (!rawTeam.trim()) { // extra sanity check + connection.popup("Invalid team provided."); + return null; + } // the && existing doesn't really matter because we've verified it above, this is just for TS if (isUpdate && existing) { const differenceExists = ( From 9fab8c38d59941639f748d978ce5d6a723b04ddb Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Wed, 5 Jun 2024 09:37:01 -0600 Subject: [PATCH 027/139] SSB: Fix bugs with Scumhunt and Platinum Record --- data/mods/gen9ssb/moves.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/data/mods/gen9ssb/moves.ts b/data/mods/gen9ssb/moves.ts index c3a92611c107..043543674831 100644 --- a/data/mods/gen9ssb/moves.ts +++ b/data/mods/gen9ssb/moves.ts @@ -242,9 +242,9 @@ export const Moves: {[k: string]: ModdedMoveData} = { for (const i of this.dex.types.names()) { if (i === "Stellar") continue; if (target) { - const effect = this.dex.getEffectiveness(i, target.types); - const immune = this.dex.getImmunity(i, target.types); - if (effect >= 0 && immune) { + const effect = this.dex.getEffectiveness(i, target); + const immune = !this.dex.getImmunity(i, target); + if (effect >= 0 && !immune) { nresTypes.push(i); } } @@ -3007,7 +3007,7 @@ export const Moves: {[k: string]: ModdedMoveData} = { name: "Platinum Record", pp: 5, priority: 0, - flags: {sound: 1, heal: 1}, + flags: {sound: 1, heal: 1, protect: 1, mirror: 1}, onTryMove() { this.attrLastMove('[still]'); }, @@ -3016,7 +3016,7 @@ export const Moves: {[k: string]: ModdedMoveData} = { this.add('-anim', source, 'Iron Defense', target); }, onHit(target, source, move) { - this.heal(source.maxhp / 2); + this.heal(source.maxhp / 2, source, source, move); for (const moveSlot of source.moveSlots) { if (moveSlot.id === move.id) continue; if (moveSlot.pp < moveSlot.maxpp) moveSlot.pp += 1; From f9cb5564d20655cae0a2e0c61a4cb48bd401cdfe Mon Sep 17 00:00:00 2001 From: Mia <49593536+mia-pi-git@users.noreply.github.com> Date: Wed, 5 Jun 2024 16:39:02 -0500 Subject: [PATCH 028/139] Friends: Use user's local time for last seen information --- server/chat-plugins/friends.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/server/chat-plugins/friends.ts b/server/chat-plugins/friends.ts index 53cfe28aacb5..fc9b827518e4 100644 --- a/server/chat-plugins/friends.ts +++ b/server/chat-plugins/friends.ts @@ -145,9 +145,7 @@ export const Friends = new class { buf += `On an alternate account
    `; } if (login && typeof login === 'number' && !user?.connected) { - // THIS IS A TERRIBLE HACK BUT IT WORKS OKAY - const time = Chat.toTimestamp(new Date(Number(login)), {human: true}); - buf += `Last seen: ${time.split(' ').reverse().join(', on ')}`; + buf += `Last seen: `; buf += ` (${Chat.toDurationString(Date.now() - login, {precision: 1})} ago)`; } else if (typeof login === 'string') { buf += `${login}`; From 284009fcc4474c7e1d04de75f751f203ac4e51de Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Wed, 5 Jun 2024 17:45:31 -0600 Subject: [PATCH 029/139] SSB: Add more new sets (#10336) * SSB: Add more new sets * Update data/mods/gen9ssb/abilities.ts * Update data/mods/gen9ssb/random-teams.ts --- data/mods/gen9ssb/abilities.ts | 173 +++++++++++++++++- data/mods/gen9ssb/conditions.ts | 107 ++++++++++- data/mods/gen9ssb/moves.ts | 294 +++++++++++++++++++++++++++++- data/mods/gen9ssb/pokedex.ts | 44 ++++- data/mods/gen9ssb/random-teams.ts | 40 +++- data/mods/gen9ssb/scripts.ts | 1 + 6 files changed, 643 insertions(+), 16 deletions(-) diff --git a/data/mods/gen9ssb/abilities.ts b/data/mods/gen9ssb/abilities.ts index 7c594792d8af..070c641a9ce3 100644 --- a/data/mods/gen9ssb/abilities.ts +++ b/data/mods/gen9ssb/abilities.ts @@ -375,6 +375,24 @@ export const Abilities: {[k: string]: ModdedAbilityData} = { flags: {}, }, + // Bert122 + pesteringassault: { + shortDesc: "Uses Knock Off, Taunt, Torment, Soak, and Confuse Ray with 40% accuracy at turn end.", + name: "Pestering Assault", + onResidual(pokemon, s, effect) { + const moves = ['knockoff', 'taunt', 'torment', 'soak', 'confuseray']; + for (const moveid of moves) { + const move = this.dex.getActiveMove(moveid); + move.accuracy = 40; + const target = pokemon.foes()[0]; + if (target && !target.fainted) { + this.actions.useMove(move, pokemon, target, effect); + } + } + }, + flags: {}, + }, + // blazeofvictory prismaticlens: { shortDesc: "Pixilate + Tinted Lens.", @@ -488,7 +506,7 @@ export const Abilities: {[k: string]: ModdedAbilityData} = { ]; this.add(`c:|${getName((target.illusion || target).name)}|${this.sample(abilMessages)}`); for (const foe of target.foes()) { - if (foe && !foe.volatiles['torment']) { + if (foe && !foe.fainted && !foe.volatiles['torment']) { foe.addVolatile('torment'); } } @@ -1070,6 +1088,58 @@ export const Abilities: {[k: string]: ModdedAbilityData} = { flags: {breakable: 1}, }, + // Irly + therollingspheal: { + shortDesc: "1.5x dmg boost for every repeated move use. Up to 5 uses. +1 Spe when use contact.", + name: "The Rolling Spheal", + onStart(pokemon) { + pokemon.addVolatile('therollingspheal'); + }, + onSourceHit(target, source, move) { + if (move.flags['contact'] && move.category === 'Physical') { + this.add('-activate', source, 'ability: The Rolling Spheal'); + this.boost({spe: 1}, source, source, move); + } + }, + condition: { + onStart(pokemon) { + this.effectState.lastMove = ''; + this.effectState.numConsecutive = 0; + }, + onTryMovePriority: -2, + onTryMove(pokemon, target, move) { + if (!pokemon.hasAbility('therollingspheal')) { + pokemon.removeVolatile('therollingspheal'); + return; + } + if (this.effectState.lastMove === move.id && pokemon.moveLastTurnResult) { + this.effectState.numConsecutive++; + } else if (pokemon.volatiles['twoturnmove']) { + if (this.effectState.lastMove !== move.id) { + this.effectState.numConsecutive = 1; + } else { + this.effectState.numConsecutive++; + } + } else { + this.effectState.numConsecutive = 0; + } + this.effectState.lastMove = move.id; + }, + onModifyDamage(damage, source, target, move) { + if (this.effectState.numConsecutive > 0) { + this.debug(`Current Metronome boost: 6144/4096`); + return this.chainModify([6144, 4096]); + } + }, + onAfterMove(source, target, move) { + if (this.effectState.numConsecutive > 5) { + this.effectState.numConsecutive = 0; + } + }, + }, + flags: {}, + }, + // Irpachuza mimeknowsbest: { shortDesc: "When this Pokemon switches in, it uses a random screen or protect move.", @@ -1506,7 +1576,7 @@ export const Abilities: {[k: string]: ModdedAbilityData} = { return this.chainModify(1.5); } }, - flags: {}, + flags: {cantsuppress: 1}, }, // maroon @@ -1536,6 +1606,72 @@ export const Abilities: {[k: string]: ModdedAbilityData} = { flags: {}, }, + // Merritty + endround: { + shortDesc: "Clears everything.", + name: "End Round", + onStart(pokemon) { + if (this.suppressingAbility(pokemon)) return; + this.add('-ability', pokemon, 'End Round'); + this.add('-message', 'A new round is starting! Resetting the field...'); + this.field.clearWeather(); + this.field.clearTerrain(); + for (const pseudoWeather of PSEUDO_WEATHERS) { + this.field.removePseudoWeather(pseudoWeather); + } + for (const side of this.sides) { + const remove = [ + 'reflect', 'lightscreen', 'auroraveil', 'safeguard', 'mist', 'spikes', 'toxicspikes', 'stealthrock', 'stickyweb', 'gmaxsteelsurge', + 'bioticorbfoe', 'bioticorbself', 'tailwind', 'luckychant', 'alting', + ]; + for (const sideCondition of remove) { + if (side.removeSideCondition(sideCondition)) { + this.add('-sideend', side, this.dex.conditions.get(sideCondition).name, '[from] ability: End Round', '[of] ' + pokemon); + } + } + } + for (const mon of this.getAllActive()) { + const volatilesToClear = [ + 'substitute', 'aquaring', 'snack', 'attract', 'confusion', 'bide', 'partiallytrapped', 'perfectmimic', + 'mustrecharge', 'defensecurl', 'disable', 'focusenergy', 'dragoncheer', 'embargo', 'endure', 'gastroacid', + 'foresight', 'glaiverush', 'grudge', 'healblock', 'imprison', 'curse', 'leechseed', 'magnetrise', 'minimize', + 'miracleeye', 'nightmare', 'noretreat', 'octolock', 'lockedmove', 'powder', 'powershift', 'powertrick', + 'rage', 'ragepowder', 'roost', 'saltcure', 'smackdown', 'snatch', 'sparklingaria', 'spotlight', 'stockpile', + 'syrupbomb', 'tarshot', 'taunt', 'telekinesis', 'torment', 'uproar', 'yawn', 'flashfire', 'protosynthesis', + 'quarkdrive', 'slowstart', 'truant', 'unburden', 'metronome', 'beakblast', 'charge', 'echoedvoice', 'encore', + 'focuspunch', 'furycutter', 'gmaxcannonade', 'gmaxchistrike', 'gmaxvinelash', 'gmaxvolcalith', 'gmaxwildfire', + 'iceball', 'rollout', 'laserfocus', 'lockon', 'perishsong', 'shelltrap', 'throatchop', 'trapped', 'trapper', + 'choicelock', 'stall', 'catstampofapproval', 'beefed', 'boiled', 'flipped', 'therollingspheal', 'treasurebag', + 'torisstori', 'anyonecanbekilled', 'sigilsstorm', 'wonderwing', 'riseabove', 'superrollout', 'meatgrinder', + 'risingsword', 'ultramystik', + ]; + for (const volatile of volatilesToClear) { + if (mon.volatiles[volatile]) { + mon.removeVolatile(volatile); + this.add('-activate', pokemon, 'ability: End Round'); + } + } + mon.clearBoosts(); + this.add('-clearboost', mon, '[from] ability: End Round', '[of] ' + pokemon); + } + }, + flags: {cantsuppress: 1}, + }, + + // Meteordash + tatsuglare: { + shortDesc: "Fur Coat + All moves hit off of Sp. Atk stat.", + name: "TatsuGlare", + onModifyMove(move, pokemon, target) { + if (move.category !== "Status") move.overrideOffensiveStat = 'spa'; + }, + onModifyDefPriority: 6, + onModifyDef(def) { + return this.chainModify(2); + }, + flags: {breakable: 1}, + }, + // Mex timedilation: { shortDesc: "+10% BP for every 10 turns passed in battle, max 200%.", @@ -1730,6 +1866,23 @@ export const Abilities: {[k: string]: ModdedAbilityData} = { }, }, + // Pastor Gigas + godsmercy: { + shortDesc: "Summons Misty Surge and cures the team's status conditions on switch-in.", + name: "God's Mercy", + onStart(source) { + this.field.setTerrain('mistyterrain'); + const allies = [...source.side.pokemon, ...source.side.allySide?.pokemon || []]; + for (const ally of allies) { + if (ally !== source && ally.hasAbility('sapsipper')) { + continue; + } + ally.cureStatus(); + } + }, + flags: {}, + }, + // PenQuin poleonspyroquirk: { shortDesc: "Burned Pokemon also become confused.", @@ -2698,6 +2851,9 @@ export const Abilities: {[k: string]: ModdedAbilityData} = { this.add('-ability', target, 'Treasure Bag'); target.addVolatile('treasurebag'); }, + onResidual(target, source, effect) { + if (!target.volatiles['treasurebag']) target.addVolatile('treasurebag'); + }, condition: { onStart(pokemon, source, sourceEffect) { if (!pokemon.m.bag) { @@ -2792,6 +2948,19 @@ export const Abilities: {[k: string]: ModdedAbilityData} = { }, }, + // yuki + partyup: { + shortDesc: "On switch-in, this Pokemon's ability is replaced with a random teammate's ability.", + name: "Party Up", + onStart(target) { + this.add('-ability', target, 'Party Up'); + const abilities = target.side.pokemon.map(x => x.getAbility()).filter(x => !x.flags['notrace']); + target.setAbility(this.sample(abilities), target); + this.add('-ability', target, target.getAbility().name); + }, + flags: {notrace: 1}, + }, + // YveltalNL heightadvantage: { shortDesc: "If this Pokemon's height is more than that of the foe, -1 to foe's Attack/Sp. Atk.", diff --git a/data/mods/gen9ssb/conditions.ts b/data/mods/gen9ssb/conditions.ts index 38e5a55bc64a..89d3227c36dd 100644 --- a/data/mods/gen9ssb/conditions.ts +++ b/data/mods/gen9ssb/conditions.ts @@ -386,6 +386,18 @@ export const Conditions: {[k: string]: ModdedConditionData & {innateName?: strin this.add(`c:|${getName('berry')}|and all I got was this lousy t-shirt`); }, }, + bert122: { + noCopy: true, + onStart() { + this.add(`c:|${getName('Bert122')}|*cackling laughter and gem crunching noises*`); + }, + onSwitchOut() { + this.add(`c:|${getName('Bert122')}|Off to collect more shiny rocks! Hehehe!`); + }, + onFaint() { + this.add(`c:|${getName('Bert122')}|Ack, all my gems are gone!`); + }, + }, billo: { noCopy: true, onStart(pokemon) { @@ -1079,6 +1091,18 @@ export const Conditions: {[k: string]: ModdedConditionData & {innateName?: strin this.add(`c:|${getName('in the hills')}|im starting to feel kinda stupid can i please leave`); }, }, + irly: { + noCopy: true, + onStart() { + this.add(`c:|${getName('Irly')}|They see me rollin'`); + }, + onSwitchOut() { + this.add(`c:|${getName('Irly')}|They hatin'`); + }, + onFaint() { + this.add(`c:|${getName('Irly')}|Em caso de investigação policial, eu declaro que não tenho envolvimento com este grupo e não sei como estou no mesmo, provavelmente fui inserido por terceiros, declaro que estou disposto a colaborar com as investigações e estou disposto a me apresentar a depoimento se necessário`); + }, + }, ironwater: { noCopy: true, onStart() { @@ -1148,7 +1172,7 @@ export const Conditions: {[k: string]: ModdedConditionData & {innateName?: strin innateName: "Tinted Lens", shortDesc: "Resisted moves hit with double power.", onModifyDamage(damage, source, target, move) { - if (!source || source.illusion) return; + if (source.illusion) return; if (target.getMoveHitData(move).typeMod < 0) { this.debug('Tinted Lens boost'); return this.chainModify(2); @@ -1579,6 +1603,34 @@ export const Conditions: {[k: string]: ModdedConditionData & {innateName?: strin this.add(`c:|${getName('Mathy')}|thanks for making my job harder :/`); }, }, + merritty: { + noCopy: true, + onStart() { + this.add(`c:|${getName('Merritty')}|Deadline.`); + }, + onSwitchOut() { + this.add(`c:|${getName('Merritty')}|If you believe there's been a mistake, please let me know ASAP.`); + }, + onFaint() { + this.add(`c:|${getName('Merritty')}|congratulations to our winner`); + }, + innateName: "Tourban", + shortDesc: "Takes half damage from Ghost moves, deals double damge to Ghost-types.", + onSourceModifyDamage(damage, source, target, move) { + if (source.illusion) return; + if (move.type === 'Ghost') { + this.debug('Tourban Ghost weaken'); + return this.chainModify(0.5); + } + }, + onModifyDamage(damage, source, target, move) { + if (source.illusion) return; + if (target?.hasType('Ghost')) { + this.debug('Tourban boost'); + return this.chainModify(2); + } + }, + }, meteordash: { noCopy: true, onStart() { @@ -1836,6 +1888,35 @@ export const Conditions: {[k: string]: ModdedConditionData & {innateName?: strin } }, }, + pastorgigas: { + noCopy: true, + onStart() { + this.add(`c:|${getName('Pastor Gigas')}|Turn back to God`); + }, + onSwitchOut() { + this.add(`c:|${getName('Pastor Gigas')}|I'll leave, but God stays forever`); + }, + onFaint() { + this.add(`c:|${getName('Pastor Gigas')}|I'm going to pray for you`); + }, + innateName: "Scrappy", + onModifyMovePriority: -5, + onModifyMove(move, pokemon, target) { + if (pokemon.illusion) return; + if (!move.ignoreImmunity) move.ignoreImmunity = {}; + if (move.ignoreImmunity !== true) { + move.ignoreImmunity['Fighting'] = true; + move.ignoreImmunity['Normal'] = true; + } + }, + onTryBoost(boost, target, source, effect) { + if (target.illusion) return; + if (effect.name === 'Intimidate' && boost.atk) { + delete boost.atk; + this.add('-fail', target, 'unboost', 'Attack', '[from] ability: Scrappy', '[of] ' + target); + } + }, + }, peary: { noCopy: true, onStart() { @@ -2247,6 +2328,18 @@ export const Conditions: {[k: string]: ModdedConditionData & {innateName?: strin this.add(`c:|${getName('Solaros & Lunaris')}|Too hot to handle!`); }, }, + spiderz: { + noCopy: true, + onStart() { + this.add(`c:|${getName('Spiderz')}|whats good gangy`); + }, + onSwitchOut() { + this.add(`c:|${getName('Spiderz')}|im moving DIFFERENT`); + }, + onFaint() { + this.add(`c:|${getName('Spiderz')}|fuck 12`); + }, + }, spoo: { noCopy: true, onStart() { @@ -2729,6 +2822,14 @@ export const Conditions: {[k: string]: ModdedConditionData & {innateName?: strin } }, }, + yuki: { + noCopy: true, + innateName: "Snow Warning", + onStart(source) { + if (source.illusion) return; + this.field.setWeather('snow', source, this.dex.abilities.get('snowwarning')); + }, + }, yveltalnl: { noCopy: true, onStart(pokemon) { @@ -2803,6 +2904,10 @@ export const Conditions: {[k: string]: ModdedConditionData & {innateName?: strin }, onEnd(target) { this.add('-end', target, 'flipped'); + if (target.species.name !== 'Avalugg') { + target.formeChange('Avalugg-Hisui', null, true); + target.removeVolatile('flipped'); + } }, }, diff --git a/data/mods/gen9ssb/moves.ts b/data/mods/gen9ssb/moves.ts index 043543674831..9359f61b4693 100644 --- a/data/mods/gen9ssb/moves.ts +++ b/data/mods/gen9ssb/moves.ts @@ -915,6 +915,91 @@ export const Moves: {[k: string]: ModdedMoveData} = { type: "Water", }, + // Bert122 + shatterandscatter: { + accuracy: true, + basePower: 0, + category: "Status", + name: "Shatter and Scatter", + pp: 10, + priority: 4, + flags: {failinstruct: 1, failcopycat: 1}, + stallingMove: true, + volatileStatus: 'shatterandscatter', + onTry(source) { + if (source.species.name === 'Sableye-Mega') { + return; + } + this.hint("Only Sableye-Mega can use this move."); + this.attrLastMove('[still]'); + this.add('-fail', source, 'move: Shatter and Scatter'); + return null; + }, + onTryMove() { + this.attrLastMove('[still]'); + }, + onPrepareHit(pokemon) { + this.add('-anim', pokemon, 'Protect', pokemon); + this.add('-anim', pokemon, 'Rock Polish', pokemon); + return !!this.queue.willAct() && this.runEvent('StallMove', pokemon); + }, + onHit(pokemon) { + pokemon.addVolatile('stall'); + }, + condition: { + duration: 1, + onStart(target) { + this.add('-singleturn', target, 'Protect'); + }, + onTryHitPriority: 3, + onTryHit(target, source, move) { + if (!move.flags['protect']) { + if (['gmaxoneblow', 'gmaxrapidflow'].includes(move.id)) return; + if (move.isZ || move.isMax) target.getMoveHitData(move).zBrokeProtect = true; + return; + } + if (move.smartTarget) { + move.smartTarget = false; + } else { + this.add('-activate', target, 'move: Protect'); + } + const lockedmove = source.getVolatile('lockedmove'); + if (lockedmove) { + // Outrage counter is reset + if (source.volatiles['lockedmove'].duration === 2) { + delete source.volatiles['lockedmove']; + } + } + let statDebuff = 'spe'; + if (move.category === 'Special') statDebuff = 'spa'; + if (move.category === 'Physical') statDebuff = 'atk'; + const success = this.boost({[statDebuff]: -2}, source, target, this.dex.getActiveMove("Shatter and Scatter")); + if (success) { + target.formeChange('Sableye', this.dex.getActiveMove('Shatter and Scatter'), true); + target.canMegaEvo = 'Sableye-Mega'; + target.switchFlag = 'shatterandscatter' as ID; + } + return this.NOT_FAIL; + }, + onHit(target, source, move) { + if (move.isZOrMaxPowered) { + let statDebuff = 'spe'; + if (move.category === 'Special') statDebuff = 'spa'; + if (move.category === 'Physical') statDebuff = 'atk'; + const success = this.boost({[statDebuff]: -2}, source, target, this.dex.getActiveMove("Shatter and Scatter")); + if (success) { + target.formeChange('Sableye', this.dex.getActiveMove('Shatter and Scatter'), true); + target.canMegaEvo = 'Sableye-Mega'; + target.switchFlag = 'shatterandscatter' as ID; + } + } + }, + }, + secondary: null, + target: "self", + type: "Dark", + }, + // Billo hackcheck: { accuracy: true, @@ -2521,6 +2606,31 @@ export const Moves: {[k: string]: ModdedMoveData} = { type: "Ground", }, + // Irly + vruuuuuum: { + accuracy: 100, + basePower: 90, + category: "Physical", + shortDesc: "Super effective on Water.", + name: "vruuuuuum", + pp: 20, + priority: 0, + flags: {contact: 1, protect: 1, mirror: 1}, + onTryMove() { + this.attrLastMove('[still]'); + }, + onPrepareHit(target, source) { + this.add('-anim', source, 'Shift Gear', source); + this.add('-anim', source, 'Ice Spinner', target); + }, + onEffectiveness(typeMod, target, type) { + if (type === 'Water') return 1; + }, + secondary: null, + target: "normal", + type: "Ice", + }, + // ironwater jirachibanhammer: { accuracy: 100, @@ -3609,6 +3719,43 @@ export const Moves: {[k: string]: ModdedMoveData} = { type: "Normal", }, + // Merritty + newbracket: { + accuracy: true, + basePower: 0, + category: "Status", + shortDesc: "Forces both Pokemon out. Can't be blocked.", + desc: "Both the target and the user are forced to switch out and be replaced with random unfainted allies. This effect cannot be blocked by any means other than having no valid allies that can be sent out.", + name: "New Bracket", + pp: 10, + priority: 0, + flags: {}, + onTry(source) { + if (source.side.pokemonLeft === 1) return false; + if (!source.hasAbility('endround')) { + this.hint(`The user's ability needs to be End Round for New Bracket to work.`); + return false; + } + }, + onTryMove(source, target, move) { + this.attrLastMove('[still]'); + }, + onPrepareHit(target, source, move) { + this.attrLastMove(`[anim] Trick Room`); + }, + onHitField(target, source, move) { + for (const pokemon of this.getAllActive()) { + if (pokemon.hp <= 0 || pokemon.fainted || pokemon.isSemiInvulnerable()) { + continue; + } + pokemon.forceSwitchFlag = true; + } + }, + secondary: null, + target: "all", + type: "Electric", + }, + // Meteordash plagiarism: { accuracy: 100, @@ -3617,10 +3764,15 @@ export const Moves: {[k: string]: ModdedMoveData} = { name: "Plagiarism", shortDesc: "Steal+use foe sig move+imprison. Fail: +1 stats.", desc: "User copies opponents signature move and adds it to its own movepool, replacing this move. The user then uses the copied move immediately and gains the Imprison condition, preventing foes from using moves in the user's moveset. The PP of the copied move will be adjusted to match the PP the copied signature move is supposed to have. If the copied custom move would fail if used in this manner, Plagiarism fails and the user boosts all stats by 1 stage, except Accuracy and Evasion.", - pp: 1, - noPPBoosts: true, + pp: 5, priority: 1, flags: {failencore: 1, nosleeptalk: 1, noassist: 1, failcopycat: 1, failinstruct: 1, failmimic: 1}, + onTry(source) { + if (source.m.usedPlagiarism) { + this.hint("Plagiarism only works once per switch-in."); + return false; + } + }, onPrepareHit() { this.attrLastMove('[anim] Mimic'); this.attrLastMove('[anim] Imprison'); @@ -3630,10 +3782,11 @@ export const Moves: {[k: string]: ModdedMoveData} = { const move = this.dex.getActiveMove(sigMoveName); if (!target || this.queue.willSwitch(target) || target.beingCalledBack || move.flags['failcopycat'] || move.noSketch) { - this.boost({atk: 1, def: 1, spa: 1, spd: 1, spe: 1, accuracy: 1}, source, source, m); + this.boost({spa: 1, spd: 1, spe: 1}, source, source, m); return; } const plagiarismIndex = source.moves.indexOf('plagiarism'); + const plagiarism = source.moveSlots[plagiarismIndex]; if (plagiarismIndex < 0) return false; this.add(`c:|${getName((source.illusion || source).name)}|yoink`); const plagiarisedMove = { @@ -3652,6 +3805,16 @@ export const Moves: {[k: string]: ModdedMoveData} = { this.actions.useMove(move.id, source, target); delete target.volatiles['imprison']; source.addVolatile('imprison', source); + source.addVolatile('plagiarism'); + source.volatiles['plagiarism'].moveSlot = plagiarism; + source.volatiles['plagiarism'].index = plagiarismIndex; + source.m.usedPlagiarism = true; + }, + condition: { + onSwitchOut(source) { + const index = this.effectState.index; + source.moveSlots[index] = source.baseMoveSlots[index] = this.effectState.plagiarism; + }, }, noSketch: true, secondary: null, @@ -3803,12 +3966,13 @@ export const Moves: {[k: string]: ModdedMoveData} = { this.add('-anim', source, 'Chilly Reception', source); }, self: { - slotCondition: 'Quality Control Zoomies', + slotCondition: 'qualitycontrolzoomies', }, condition: { onSwap(target) { if (!target.fainted) { target.addVolatile('catstampofapproval'); + target.side.removeSlotCondition(target, 'qualitycontrolzoomies'); } }, }, @@ -3953,7 +4117,7 @@ export const Moves: {[k: string]: ModdedMoveData} = { gen: 9, pp: 15, priority: 0, - flags: {contact: 1, protect: 1}, + flags: {contact: 1, protect: 1, mirror: 1}, onTryMove() { this.attrLastMove('[still]'); }, @@ -4066,6 +4230,37 @@ export const Moves: {[k: string]: ModdedMoveData} = { type: "Ghost", // Updated to ??? in onModifyMove }, + // Pastor Gigas + calltorepentance: { + accuracy: 100, + basePower: 80, + category: "Physical", + shortDesc: "Applies Heal Block + taunts target.", + name: "Call to Repentance", + gen: 9, + pp: 10, + priority: 0, + flags: {protect: 1, mirror: 1}, + onTryMove() { + this.attrLastMove('[still]'); + }, + onPrepareHit(target, source) { + this.add('-anim', source, 'Hyper Voice', target); + this.add('-anim', source, 'Judgment', target); + }, + secondaries: [ + { + chance: 100, + volatileStatus: 'healblock', + }, { + chance: 100, + volatileStatus: 'taunt', + }, + ], + target: "normal", + type: "Normal", + }, + // Peary "1000gears": { accuracy: true, @@ -5058,6 +5253,52 @@ export const Moves: {[k: string]: ModdedMoveData} = { type: "Fire", }, + // Spiderz + shepherdofthemafiaroom: { + accuracy: 100, + basePower: 90, + category: "Physical", + shortDesc: "Sets Sticky Web. 1.3x BP if faster.", + name: "Shepherd of the Mafia Room", + gen: 9, + pp: 15, + priority: 0, + flags: {contact: 1, protect: 1, mirror: 1}, + onTryMove() { + this.attrLastMove('[still]'); + }, + onPrepareHit(target, source, move) { + this.add('-anim', source, 'Explosion', source); + this.add('-anim', source, 'Explosion', source); + this.add('-anim', source, 'Explosion', source); + this.add('-anim', source, 'Explosion', source); + this.add('-anim', source, 'Explosion', source); + this.add('-anim', source, 'Explosion', source); + }, + onBasePower(relayVar, source, target, move) { + if (source.getStat('spe', false, true) > target.getStat('spe', false, true)) { + return this.chainModify([5325, 4096]); + } + }, + onAfterHit(target, source, move) { + if (!move.hasSheerForce && source.hp) { + for (const side of source.side.foeSidesWithConditions()) { + side.addSideCondition('stickyweb'); + } + } + }, + onAfterSubDamage(damage, target, source, move) { + if (!move.hasSheerForce && source.hp) { + for (const side of source.side.foeSidesWithConditions()) { + side.addSideCondition('stickyweb'); + } + } + }, + secondary: {}, // Sheer Force-boosted + target: "normal", + type: "Dark", + }, + // spoo cardiotraining: { accuracy: true, @@ -5066,16 +5307,16 @@ export const Moves: {[k: string]: ModdedMoveData} = { shortDesc: "Boosts Atk, Def, and Sp. Def by 1 stage.", desc: "Boosts the user's Attack, Defense, and Special Defense by 1 stage.", name: "Cardio Training", + gen: 9, + pp: 5, + priority: 0, + flags: {snatch: 1, dance: 1, metronome: 1}, onTryMove() { this.attrLastMove('[still]'); }, onPrepareHit(target, source, move) { this.add('-anim', source, 'Geomancy', source); }, - gen: 9, - pp: 5, - priority: 0, - flags: {snatch: 1, dance: 1, metronome: 1}, boosts: { atk: 1, def: 1, @@ -6065,6 +6306,39 @@ export const Moves: {[k: string]: ModdedMoveData} = { type: "Ice", }, + // yuki + tagyoureit: { + accuracy: true, + basePower: 0, + category: "Status", + shortDesc: "User swaps, replacement: Focus Energy, +1 Spe.", + name: "Tag, You're It!", + pp: 5, + priority: 0, + flags: {}, + onTryMove() { + this.attrLastMove('[still]'); + }, + onPrepareHit(target, source) { + this.add('-anim', source, "Baton Pass", target); + }, + slotCondition: 'tagyoureit', + condition: { + onSwap(target) { + if (target && !target.fainted) { + this.add('-anim', target, "Baton Pass", target); + target.addVolatile('focusenergy'); + this.boost({spe: 1}, target, this.effectState.source, this.dex.getActiveMove('tagyoureit')); + target.side.removeSlotCondition(target, 'tagyoureit'); + } + }, + }, + selfSwitch: true, + secondary: null, + target: "self", + type: "Dark", + }, + // YveltalNL highground: { accuracy: 100, @@ -6381,7 +6655,7 @@ export const Moves: {[k: string]: ModdedMoveData} = { }, // groundedness implemented in battle.engine.js:BattlePokemon#isGrounded onDragOut(pokemon, source, move) { - if (source && this.queue.willMove(source)?.moveid === 'protectoroftheskies') return; + if (source && this.queue.willMove(source)?.moveid !== 'protectoroftheskies') return; this.add('-activate', pokemon, 'move: Ingrain'); return null; }, diff --git a/data/mods/gen9ssb/pokedex.ts b/data/mods/gen9ssb/pokedex.ts index 3a05dcb1b459..dec914edef7d 100644 --- a/data/mods/gen9ssb/pokedex.ts +++ b/data/mods/gen9ssb/pokedex.ts @@ -145,6 +145,16 @@ export const Pokedex: {[k: string]: ModdedSpeciesData} = { abilities: {0: "Sturdy"}, }, + // Bert122 + sableye: { + inherit: true, + abilities: {0: "Prankster"}, + }, + sableyemega: { + inherit: true, + abilities: {0: "Pestering Assault"}, + }, + // Billo cosmog: { inherit: true, @@ -420,6 +430,13 @@ export const Pokedex: {[k: string]: ModdedSpeciesData} = { abilities: {0: "Illterit"}, }, + // Irly + spheal: { + inherit: true, + baseStats: {hp: 110, atk: 95, def: 90, spa: 80, spd: 90, spe: 65}, + abilities: {0: "The Rolling Spheal"}, + }, + // ironwater jirachi: { inherit: true, @@ -615,10 +632,17 @@ export const Pokedex: {[k: string]: ModdedSpeciesData} = { abilities: {0: "Dynamic Typing"}, }, + // Merritty + torchic: { + inherit: true, + baseStats: {hp: 65, atk: 60, def: 60, spa: 80, spd: 70, spe: 85}, + abilities: {0: "End Round"}, + }, + // Meteordash tatsugiri: { inherit: true, - abilities: {0: "Shadow Shield"}, + abilities: {0: "TatsuGlare"}, }, // Mex @@ -695,6 +719,12 @@ export const Pokedex: {[k: string]: ModdedSpeciesData} = { abilities: {0: "C- Tier Shitposter"}, }, + // Pastor Gigas + regigigas: { + inherit: true, + abilities: {0: "God's Mercy"}, + }, + // Peary klinklang: { inherit: true, @@ -870,6 +900,13 @@ export const Pokedex: {[k: string]: ModdedSpeciesData} = { abilities: {0: "Ride the Sun!"}, }, + // Spiderz + ironthorns: { + inherit: true, + types: ['Dark', 'Ground'], + abilities: {0: "Poison Heal"}, + }, + // spoo hemogoblin: { inherit: true, @@ -1118,6 +1155,11 @@ export const Pokedex: {[k: string]: ModdedSpeciesData} = { abilities: {0: "Yellow Magic"}, }, + ninetaleslola: { + inherit: true, + abilities: {0: "Party Up"}, + }, + // YveltalNL farigiraf: { inherit: true, diff --git a/data/mods/gen9ssb/random-teams.ts b/data/mods/gen9ssb/random-teams.ts index e3471a56bb4e..2a0f4427ad67 100644 --- a/data/mods/gen9ssb/random-teams.ts +++ b/data/mods/gen9ssb/random-teams.ts @@ -186,6 +186,12 @@ export const ssbSets: SSBSets = { signatureMove: 'what kind', evs: {hp: 252, atk: 4, spd: 252}, nature: 'Careful', teraType: 'Rock', }, + Bert122: { + species: 'Sableye', ability: 'Prankster', item: 'Sablenite', gender: '', + moves: ['Metal Burst', 'Recover', 'Will-O-Wisp'], + signatureMove: 'Shatter and Scatter', + evs: {hp: 252, def: 28, spd: 224}, ivs: {atk: 0, spe: 0}, nature: 'Relaxed', + }, Billo: { species: 'Cosmog', ability: 'Wonder Guard', item: 'Eviolite', gender: 'N', moves: [], @@ -457,6 +463,12 @@ export const ssbSets: SSBSets = { signatureMove: '10-20-40', evs: {hp: 252, def: 4, spd: 252}, nature: 'Careful', teraType: 'Water', }, + Irly: { + species: 'Spheal', ability: 'The Rolling Spheal', item: 'Choice Band', gender: '', + moves: ['Liquidation', 'Collision Course', 'Flip Turn'], + signatureMove: 'vruuuuuum', + evs: {hp: 8, atk: 252, spd: 4, spe: 244}, nature: 'Jolly', teraType: 'Fighting', shiny: 363, + }, ironwater: { species: 'Jirachi', ability: 'Good as Gold', item: 'Leftovers', gender: 'N', moves: ['Swords Dance', 'Zen Headbutt', 'Hammer Arm'], @@ -619,9 +631,15 @@ export const ssbSets: SSBSets = { signatureMove: 'Breaking Change', evs: {atk: 252, def: 4, spe: 252}, nature: 'Jolly', teraType: 'Ghost', }, + Merritty: { + species: 'Torchic', ability: 'End Round', item: 'Eviolite', gender: 'M', + moves: ['Quiver Dance', 'Fiery Dance', 'Strength Sap'], + signatureMove: 'New Bracket', + evs: {hp: 4, def: 36, spa: 196, spd: 36, spe: 236}, nature: 'Timid', teraType: 'Flying', shiny: true, + }, Meteordash: { - species: 'Tatsugiri', ability: 'Shadow Shield', item: 'Heavy-Duty Boots', gender: 'M', - moves: ['Fickle Beam', 'Scald', 'Glare'], + species: 'Tatsugiri', ability: 'TatsuGlare', item: 'Heavy-Duty Boots', gender: 'M', + moves: ['Spacial Rend', 'Steam Eruption', 'Glare'], signatureMove: 'Plagiarism', evs: {spa: 252, spd: 4, spe: 252}, nature: 'Timid', teraType: 'Steel', }, @@ -691,6 +709,12 @@ export const ssbSets: SSBSets = { signatureMove: 'Alting', evs: {hp: 252, spa: 69, spe: 188}, nature: 'Timid', }, + 'Pastor Gigas': { + species: 'Regigigas', ability: 'God\'s Mercy', item: 'Clear Amulet', gender: 'N', + moves: ['Sacred Fire', 'Knock Off', 'Healing Wish'], + signatureMove: 'Call to Repentance', + evs: {atk: 252, spd: 4, spe: 252}, nature: 'Adamant', teraType: 'Fairy', + }, Peary: { species: 'Klinklang', ability: 'Levitate', item: 'Pearyum Z', gender: '', moves: ['Lock On', 'Sheer Cold', 'Substitute'], @@ -854,6 +878,12 @@ export const ssbSets: SSBSets = { signatureMove: 'Mind Melt', evs: {spa: 252, spd: 4, spe: 252}, nature: 'Modest', teraType: 'Fire', }, + Spiderz: { + species: 'Iron Thorns', ability: 'Poison Heal', item: 'Toxic Orb', gender: 'M', + moves: ['Spiky Shield', 'Stone Axe', 'Thousand Arrows'], + signatureMove: 'Shepherd of the Mafia Room', + evs: {hp: 252, atk: 252, spe: 4}, nature: 'Adamant', teraType: 'Steel', shiny: true, + }, spoo: { species: 'Hemogoblin', ability: 'I Can Hear The Heart Beating As One', item: 'Heavy-Duty Boots', gender: 'N', moves: ['Extreme Speed', 'Bitter Blade', 'Moonlight'], @@ -1021,6 +1051,12 @@ export const ssbSets: SSBSets = { signatureMove: 'Whiteout', evs: {hp: 252, spa: 252, spe: 4}, nature: 'Modest', teraType: 'Steel', shiny: 2, }, + 'yuki ♪': { + species: 'Ninetales-Alola', ability: 'Party Up', item: 'Light Clay', gender: '', + moves: ['Blizzard', 'Aurora Veil', ['Encore', 'Lovely Kiss']], + signatureMove: 'Tag, You\'re It!', + evs: {hp: 4, spa: 252, spe: 252}, nature: 'Timid', teraType: 'Ghost', + }, YveltalNL: { species: 'Farigiraf', ability: 'Height Advantage', item: 'Leftovers', gender: 'M', moves: ['Freezing Glare', 'Ice Beam', 'Slack Off'], diff --git a/data/mods/gen9ssb/scripts.ts b/data/mods/gen9ssb/scripts.ts index fb743607b727..2452bde4a17d 100644 --- a/data/mods/gen9ssb/scripts.ts +++ b/data/mods/gen9ssb/scripts.ts @@ -894,6 +894,7 @@ export const Scripts: ModdedBattleScriptsData = { oldActive.statsLoweredThisTurn = false; // ptoad delete oldActive.m.usedPleek; + delete oldActive.m.usedPlagiarism; oldActive.position = pokemon.position; pokemon.position = pos; side.pokemon[pokemon.position] = pokemon; From 23b3ff962d852b1af3a5e74ae24b888a0c6ee95a Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Wed, 5 Jun 2024 23:19:56 -0600 Subject: [PATCH 030/139] Fervent Impersionation: Fix ability bugs --- data/rulesets.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/data/rulesets.ts b/data/rulesets.ts index 89f1a9f08f97..77ecdc729a2a 100644 --- a/data/rulesets.ts +++ b/data/rulesets.ts @@ -2854,6 +2854,8 @@ export const Rulesets: {[k: string]: FormatData} = { )) || "0"; const newAbility: string = (impersonation.abilities as any)[oldAbilityKey] || impersonation.abilities["0"]; pokemon.setAbility(newAbility, null, true); + // Ability persists through switching + pokemon.baseAbility = pokemon.ability; }, }, }; From 589fd06a4981b19a706d2585802c35bef6d89d4c Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Wed, 5 Jun 2024 23:20:46 -0600 Subject: [PATCH 031/139] OM of the Month: Update aliases --- data/aliases.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/aliases.ts b/data/aliases.ts index d2f3e7512bcd..82f2aaaec54f 100644 --- a/data/aliases.ts +++ b/data/aliases.ts @@ -86,8 +86,8 @@ export const Aliases: {[alias: string]: string} = { gen6ag: "[Gen 6] Anything Goes", crossevo: "[Gen 9] Cross Evolution", mayhem: "[Gen 9] Random Battle Mayhem", - omotm: "[Gen 9] Pokebilities", - lcotm: "[Gen 9] The Loser's Game", + omotm: "[Gen 9] Fervent Impersonation", + lcotm: "[Gen 9] 350 Cup", // mega evos fabio: "Ampharos-Mega", From c8c9051b610f05ef7de3ddfd57a1d0baa2371b75 Mon Sep 17 00:00:00 2001 From: adrivrie Date: Thu, 6 Jun 2024 07:26:23 +0200 Subject: [PATCH 032/139] Baby Random Battle: First set patch (#10334) * fix belly drum hp * add surf/pump incompatibility * mienfoo and mincinno set changes * snivy/nacli set updates * tandemaus set change * rockhead growhisui * remove illegal wiglett set * change capsakid sets --- data/random-battles/gen9baby/sets.json | 26 +++++++-------- data/random-battles/gen9baby/teams.ts | 46 ++++++++++++++------------ 2 files changed, 38 insertions(+), 34 deletions(-) diff --git a/data/random-battles/gen9baby/sets.json b/data/random-battles/gen9baby/sets.json index c2ea67917bcc..bd780917988d 100644 --- a/data/random-battles/gen9baby/sets.json +++ b/data/random-battles/gen9baby/sets.json @@ -224,8 +224,13 @@ "sets": [ { "role": "Wallbreaker", - "movepool": ["Crunch", "Giga Drain", "Growth", "Leaf Storm", "Stomping Tantrum"], + "movepool": ["Bullet Seed", "Crunch", "Leaf Storm", "Stomping Tantrum"], "teraTypes": ["Dark", "Ground"] + }, + { + "role": "Fast Support", + "movepool": ["Leaf Storm", "Giga Drain", "Stomping Tantrum", "Super Fang", "Thief"], + "teraTypes": ["Poison", "Water"] } ] }, @@ -1544,17 +1549,17 @@ "sets": [ { "role": "Setup Sweeper", - "movepool": ["Close Combat", "Knock Off", "Poison Jab", "Stone Edge", "Swords Dance"], + "movepool": ["High Jump Kick", "Knock Off", "Poison Jab", "Stone Edge", "Swords Dance"], "teraTypes": ["Dark", "Fighting", "Poison"] }, { "role": "Fast Support", - "movepool": ["Close Combat", "Fake Out", "Knock Off", "U-turn"], + "movepool": ["High Jump Kick", "Fake Out", "Knock Off", "U-turn"], "teraTypes": ["Dark", "Steel"] }, { "role": "Fast Attacker", - "movepool": ["Close Combat", "Knock Off", "Poison Jab", "Stone Edge", "Swords Dance", "U-turn"], + "movepool": ["High Jump Kick", "Knock Off", "Poison Jab", "Stone Edge", "Swords Dance", "U-turn"], "teraTypes": ["Dark", "Fighting", "Poison"] } ] @@ -1573,7 +1578,7 @@ "level": 6, "sets": [ { - "role": "Setup Sweeper", + "role": "Bulky Setup", "movepool": ["Bullet Seed", "Knock Off", "Tail Slap", "Tidy Up", "Triple Axel"], "teraTypes": ["Grass", "Ice", "Normal"] } @@ -1645,7 +1650,7 @@ { "role": "Bulky Attacker", "movepool": ["Curse", "Earthquake", "Recover", "Stealth Rock", "Stone Edge"], - "teraTypes": ["Dragon", "Fairy", "Ghost"] + "teraTypes": ["Dragon", "Fairy"] } ] }, @@ -2390,7 +2395,7 @@ { "role": "Tera Blast user", "movepool": ["Glare", "Knock Off", "Leaf Storm", "Substitute", "Synthesis", "Tera Blast"], - "teraTypes": ["Stellar"] + "teraTypes": ["Fire", "Rock"] } ] }, @@ -2614,7 +2619,7 @@ "sets": [ { "role": "Fast Support", - "movepool": ["Crunch", "Double-Edge", "Encore", "Low Sweep", "Play Rough", "Thief", "Thunder Wave", "U-turn"], + "movepool": ["Crunch", "Double-Edge", "Encore", "Low Sweep", "Switcheroo", "Thunder Wave", "U-turn"], "teraTypes": ["Ghost"] } ] @@ -2881,11 +2886,6 @@ "role": "Wallbreaker", "movepool": ["Aqua Jet", "Ice Beam", "Liquidation", "Stomping Tantrum", "Throat Chop"], "teraTypes": ["Dark", "Ground", "Water"] - }, - { - "role": "Fast Support", - "movepool": ["Liquidation", "Pain Split", "Substitute", "Throat Chop"], - "teraTypes": ["Poison", "Steel"] } ] }, diff --git a/data/random-battles/gen9baby/teams.ts b/data/random-battles/gen9baby/teams.ts index e2b1690a4fa9..89cd6bc7ae00 100644 --- a/data/random-battles/gen9baby/teams.ts +++ b/data/random-battles/gen9baby/teams.ts @@ -156,7 +156,7 @@ export class RandomBabyTeams extends RandomTeams { ['rockblast', 'stoneedge'], ['bodyslam', 'doubleedge'], ['gunkshot', 'poisonjab'], - ['liquidation', 'surf'], + [['hydropump', 'liquidation'], 'surf'], ]; for (const pair of incompatiblePairs) this.incompatibleMoves(moves, movePool, pair[0], pair[1]); @@ -441,7 +441,9 @@ export class RandomBabyTeams extends RandomTeams { if (species.id === 'chinchou') return 'Volt Absorb'; if (species.id === 'deerling') return 'Serene Grace'; if (species.id === 'geodudealola') return 'Galvanize'; + if (species.id === 'growlithehisui') return 'Rock Head'; if (species.id === 'gligar') return 'Immunity'; + if (species.id === 'minccino') return 'Skill Link'; if (species.id === 'rellor') return 'Shed Skin'; if (species.id === 'riolu') return 'Inner Focus'; if (species.id === 'shroomish') return 'Effect Spore'; @@ -531,7 +533,6 @@ export class RandomBabyTeams extends RandomTeams { return this.sample(species.requiredItems); } - if (species.id === 'minccino') return 'Loaded Dice'; if (species.id === 'nymble') return 'Silver Powder'; if (moves.has('focusenergy')) return 'Scope Lens'; @@ -650,27 +651,30 @@ export class RandomBabyTeams extends RandomTeams { // Get level const level = this.getLevel(species); - // Prepare optimal HP for Life Orb mons with HP close to the X9 threshold + + // Prepare optimal HP for Belly Drum and Life Orb + let hp = Math.floor(Math.floor(2 * species.baseStats.hp + ivs.hp + Math.floor(evs.hp / 4) + 100) * level / 100 + 10); + let targetHP = Math.floor(hp / 10) * 10 - 1; + const minimumHP = Math.floor(Math.floor(2 * species.baseStats.hp + 100) * level / 100 + 10); if (item === "Life Orb") { - let hp = Math.floor(Math.floor(2 * species.baseStats.hp + ivs.hp + Math.floor(evs.hp / 4) + 100) * level / 100 + 10); - const minimumHP = Math.floor(Math.floor(2 * species.baseStats.hp + 100) * level / 100 + 10); - const targetHP = Math.floor(hp / 10) * 10 - 1; - - // Don't subtract more than 3, that's not worth it - if (hp - targetHP <= 3 && minimumHP <= targetHP) { - // If setting evs to 0 is sufficient, decrement evs, otherwise decrement ivs with evs set to 0 - if (Math.floor(Math.floor(2 * species.baseStats.hp + ivs.hp + 100) * level / 100 + 10) >= targetHP) { - evs.hp = 0; + targetHP = Math.floor(hp / 10) * 10 - 1; + } else if (moves.has("bellydrum")) { + targetHP = Math.floor(hp / 2) * 2; + } + // If the difference is too extreme, don't adjust HP + if (hp > targetHP && hp - targetHP <= 3 && targetHP >= minimumHP) { + // If setting evs to 0 is sufficient, decrement evs, otherwise decrement ivs with evs set to 0 + if (Math.floor(Math.floor(2 * species.baseStats.hp + ivs.hp + 100) * level / 100 + 10) >= targetHP) { + evs.hp = 0; + hp = Math.floor(Math.floor(2 * species.baseStats.hp + ivs.hp + Math.floor(evs.hp / 4) + 100) * level / 100 + 10); + while (hp > targetHP) { + ivs.hp -= 1; + hp = Math.floor(Math.floor(2 * species.baseStats.hp + ivs.hp + Math.floor(evs.hp / 4) + 100) * level / 100 + 10); + } + } else { + while (hp > targetHP) { + evs.hp -= 4; hp = Math.floor(Math.floor(2 * species.baseStats.hp + ivs.hp + Math.floor(evs.hp / 4) + 100) * level / 100 + 10); - while (hp > targetHP) { - ivs.hp -= 1; - hp = Math.floor(Math.floor(2 * species.baseStats.hp + ivs.hp + Math.floor(evs.hp / 4) + 100) * level / 100 + 10); - } - } else { - while (hp > targetHP) { - evs.hp -= 4; - hp = Math.floor(Math.floor(2 * species.baseStats.hp + ivs.hp + Math.floor(evs.hp / 4) + 100) * level / 100 + 10); - } } } } From 2125fb162614fc3d3d2bf39b80db95e094d0765a Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Thu, 6 Jun 2024 10:12:04 -0600 Subject: [PATCH 033/139] SSB: Some bugfixes and buffs --- data/mods/gen9ssb/abilities.ts | 11 ++++++----- data/mods/gen9ssb/moves.ts | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/data/mods/gen9ssb/abilities.ts b/data/mods/gen9ssb/abilities.ts index 070c641a9ce3..888945285155 100644 --- a/data/mods/gen9ssb/abilities.ts +++ b/data/mods/gen9ssb/abilities.ts @@ -1976,11 +1976,11 @@ export const Abilities: {[k: string]: ModdedAbilityData} = { shortDesc: "Becomes a random typing at the beginning of each turn.", name: "High Performance Computing", flags: {}, - onBeforeTurn(source) { - if (source.terastallized) return; + onResidual(source) { const type = this.sample(this.dex.types.names().filter(i => i !== 'Stellar')); - source.setType(type); - this.add('-start', source, 'typechange', type, '[from] ability: High Performance Computing'); + if (source.setType(type)) { + this.add('-start', source, 'typechange', type, '[from] ability: High Performance Computing'); + } }, }, @@ -2051,7 +2051,8 @@ export const Abilities: {[k: string]: ModdedAbilityData} = { if (target.getMoveHitData(move).typeMod > 0) { this.effectState.superHit = true; target.removeVolatile('ultramystik'); - target.setAbility('Healer', undefined, true); + target.setAbility('Healer', null, true); + target.baseAbility = target.ability; } }, condition: { diff --git a/data/mods/gen9ssb/moves.ts b/data/mods/gen9ssb/moves.ts index 9359f61b4693..6d15add49815 100644 --- a/data/mods/gen9ssb/moves.ts +++ b/data/mods/gen9ssb/moves.ts @@ -691,7 +691,7 @@ export const Moves: {[k: string]: ModdedMoveData} = { shortDesc: "If hit, Trick Room. Else, attack+random effect.", desc: "Begins to charge an attack at the start of the turn. Nearly always moves last. If the user is directly damaged while charging, Trick Room is set instead, making the slower Pokemon move first for 5 turns. The Trick Room effect occurs before Cascade if both would activate on the same turn. If the user was not directly damaged while charging, the attack executes and one random effect will occur from the following: poison; burn; paralysis; confusion; the user recovers HP equal to 75% of damage dealt; all entry hazards are removed from the field; a random entry hazard is set, except G-Max Steelsurge; two random stats of the user are raised by 1 stage each, except Accuracy and Evasion; two random stats of the target are lowered by 1 stage each, except Accuracy and Evasion; or the target transforms into a Fennekin with Ember, Scratch, and Growl until they switch out.", name: "Sigil's Storm", - pp: 5, + pp: 20, priority: -6, onModifyPriority(priority, source, target, move) { if (source.species.id === 'mismagius') return priority + 6; From 02b392675e477a4c0d20fec4cf945e38c0910ba0 Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Thu, 6 Jun 2024 11:52:24 -0600 Subject: [PATCH 034/139] SSB: Fix bug --- data/mods/gen9ssb/moves.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/mods/gen9ssb/moves.ts b/data/mods/gen9ssb/moves.ts index 6d15add49815..2912d2fb17de 100644 --- a/data/mods/gen9ssb/moves.ts +++ b/data/mods/gen9ssb/moves.ts @@ -6655,7 +6655,7 @@ export const Moves: {[k: string]: ModdedMoveData} = { }, // groundedness implemented in battle.engine.js:BattlePokemon#isGrounded onDragOut(pokemon, source, move) { - if (source && this.queue.willMove(source)?.moveid !== 'protectoroftheskies') return; + if (source && this.queue.willMove(source)?.moveid === 'protectoroftheskies') return; this.add('-activate', pokemon, 'move: Ingrain'); return null; }, From aec832895234689f66e23b3ad29ef250b4277329 Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Thu, 6 Jun 2024 16:01:10 -0600 Subject: [PATCH 035/139] SSB: Fix crashes --- data/mods/gen9ssb/conditions.ts | 2 +- data/mods/gen9ssb/moves.ts | 11 ----------- 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/data/mods/gen9ssb/conditions.ts b/data/mods/gen9ssb/conditions.ts index 89d3227c36dd..c485db9144f5 100644 --- a/data/mods/gen9ssb/conditions.ts +++ b/data/mods/gen9ssb/conditions.ts @@ -2905,7 +2905,7 @@ export const Conditions: {[k: string]: ModdedConditionData & {innateName?: strin onEnd(target) { this.add('-end', target, 'flipped'); if (target.species.name !== 'Avalugg') { - target.formeChange('Avalugg-Hisui', null, true); + target.formeChange('Avalugg', null, true); target.removeVolatile('flipped'); } }, diff --git a/data/mods/gen9ssb/moves.ts b/data/mods/gen9ssb/moves.ts index 2912d2fb17de..47efadb58f6b 100644 --- a/data/mods/gen9ssb/moves.ts +++ b/data/mods/gen9ssb/moves.ts @@ -3786,7 +3786,6 @@ export const Moves: {[k: string]: ModdedMoveData} = { return; } const plagiarismIndex = source.moves.indexOf('plagiarism'); - const plagiarism = source.moveSlots[plagiarismIndex]; if (plagiarismIndex < 0) return false; this.add(`c:|${getName((source.illusion || source).name)}|yoink`); const plagiarisedMove = { @@ -3799,23 +3798,13 @@ export const Moves: {[k: string]: ModdedMoveData} = { used: false, }; source.moveSlots[plagiarismIndex] = plagiarisedMove; - source.baseMoveSlots[plagiarismIndex] = plagiarisedMove; this.add('-activate', source, 'move: Plagiarism', move.name); this.add('-message', `${source.name} plagiarised ${target.name}'s ${move.name}!`); this.actions.useMove(move.id, source, target); delete target.volatiles['imprison']; source.addVolatile('imprison', source); - source.addVolatile('plagiarism'); - source.volatiles['plagiarism'].moveSlot = plagiarism; - source.volatiles['plagiarism'].index = plagiarismIndex; source.m.usedPlagiarism = true; }, - condition: { - onSwitchOut(source) { - const index = this.effectState.index; - source.moveSlots[index] = source.baseMoveSlots[index] = this.effectState.plagiarism; - }, - }, noSketch: true, secondary: null, target: "normal", From fc42ec262a13b035c8cba5f8b3acfd9b1f3aef54 Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Thu, 6 Jun 2024 16:04:47 -0600 Subject: [PATCH 036/139] SSB: Remove Pastor Gigas' passive --- data/mods/gen9ssb/conditions.ts | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/data/mods/gen9ssb/conditions.ts b/data/mods/gen9ssb/conditions.ts index c485db9144f5..aba0709ac7c5 100644 --- a/data/mods/gen9ssb/conditions.ts +++ b/data/mods/gen9ssb/conditions.ts @@ -1899,23 +1899,6 @@ export const Conditions: {[k: string]: ModdedConditionData & {innateName?: strin onFaint() { this.add(`c:|${getName('Pastor Gigas')}|I'm going to pray for you`); }, - innateName: "Scrappy", - onModifyMovePriority: -5, - onModifyMove(move, pokemon, target) { - if (pokemon.illusion) return; - if (!move.ignoreImmunity) move.ignoreImmunity = {}; - if (move.ignoreImmunity !== true) { - move.ignoreImmunity['Fighting'] = true; - move.ignoreImmunity['Normal'] = true; - } - }, - onTryBoost(boost, target, source, effect) { - if (target.illusion) return; - if (effect.name === 'Intimidate' && boost.atk) { - delete boost.atk; - this.add('-fail', target, 'unboost', 'Attack', '[from] ability: Scrappy', '[of] ' + target); - } - }, }, peary: { noCopy: true, From 165c6ea766abff4aa0a2599491b327f249dc6fc2 Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Thu, 6 Jun 2024 16:06:32 -0600 Subject: [PATCH 037/139] SSB: Add a description to Bert122's move --- data/mods/gen9ssb/moves.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/data/mods/gen9ssb/moves.ts b/data/mods/gen9ssb/moves.ts index 47efadb58f6b..0c23d515b2b1 100644 --- a/data/mods/gen9ssb/moves.ts +++ b/data/mods/gen9ssb/moves.ts @@ -920,6 +920,7 @@ export const Moves: {[k: string]: ModdedMoveData} = { accuracy: true, basePower: 0, category: "Status", + shortDesc: "Protect, hit=-2 Atk/SpA/or Spe, user swap.", name: "Shatter and Scatter", pp: 10, priority: 4, From 192572f21609f022c1a421e06e9b93474bc67814 Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Thu, 6 Jun 2024 16:11:12 -0600 Subject: [PATCH 038/139] Fervent Impersonation: Fix Mimikyu/Cramorant/Eiscue --- config/formats.ts | 10 +++++----- data/rulesets.ts | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/config/formats.ts b/config/formats.ts index 568d284aadf1..7464f1253daa 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -630,12 +630,12 @@ export const Formats: FormatList = [ mod: 'gen9', // searchShow: false, ruleset: ['Standard OMs', 'Sleep Moves Clause', 'Fervent Impersonation Mod', '!Nickname Clause'], - banlist: ['Cramorant', 'Eiscue', 'Mimikyu', 'Arena Trap', 'Moody', 'Shadow Tag', 'King\'s Rock', 'Razor Fang', 'Baton Pass', 'Dire Claw', 'Shed Tail', 'Last Respects'], + 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', 'Cramorant', 'Cramorant-Gorging', 'Cramorant-Gulping', 'Deoxys-Base', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', - 'Eiscue', 'Eiscue-Noice', 'Espathra', 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Koraidon', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Lugia', - 'Lunala', 'Magearna', 'Mewtwo', 'Mimikyu', 'Mimikyu-Busted', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palafin', 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Regieleki', - 'Reshiram', 'Shaymin-Sky', 'Solgaleo', 'Terapagos', 'Urshifu-Base', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', + 'Arceus', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Deoxys-Base', '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-Base', '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 }, diff --git a/data/rulesets.ts b/data/rulesets.ts index 77ecdc729a2a..9eac725b2414 100644 --- a/data/rulesets.ts +++ b/data/rulesets.ts @@ -2839,7 +2839,7 @@ export const Rulesets: {[k: string]: FormatData} = { const oldAbilityName = pokemon.getAbility().name; const oldPokemon = pokemon.species; const impersonation = this.dex.species.get(pokemon.set.name); - if (pokemon.species.id === impersonation.id || pokemon.hp > pokemon.maxhp / 2) return; + if (pokemon.species.baseSpecies === impersonation.baseSpecies || pokemon.hp > pokemon.maxhp / 2) return; this.add('-activate', pokemon, 'ability: Power Construct'); pokemon.formeChange(impersonation.name, this.effect, true); pokemon.baseMaxhp = Math.floor(Math.floor( From 499ab92db0ad76666d1a71e0465cb2b2c44ca980 Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Thu, 6 Jun 2024 16:13:30 -0600 Subject: [PATCH 039/139] SSB: Oops --- data/mods/gen9ssb/random-teams.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/mods/gen9ssb/random-teams.ts b/data/mods/gen9ssb/random-teams.ts index 2a0f4427ad67..6d885cab0933 100644 --- a/data/mods/gen9ssb/random-teams.ts +++ b/data/mods/gen9ssb/random-teams.ts @@ -671,7 +671,7 @@ export const ssbSets: SSBSets = { species: 'Chien-Pao', ability: 'Weatherproof', item: 'Heavy-Duty Boots', gender: 'N', moves: ['Swords Dance', 'Bitter Blade', ['Crunch', 'Sucker Punch']], signatureMove: 'Quality Control Zoomies', - evs: {atk: 252, def: 4, spa: 252}, nature: 'Jolly', teraType: 'Fire', + evs: {atk: 252, def: 4, spe: 252}, nature: 'Jolly', teraType: 'Fire', }, Ney: { species: 'Banette', ability: 'Insomnia', item: 'Banettite', gender: 'M', From bf76033680e48d1b5b19dfc8c12d380a2b7b57aa Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Thu, 6 Jun 2024 17:13:11 -0600 Subject: [PATCH 040/139] SSB: Fix MORE bugs (#10338) --- data/mods/gen9ssb/abilities.ts | 4 ++++ data/mods/gen9ssb/conditions.ts | 4 ---- data/mods/gen9ssb/moves.ts | 5 ----- data/mods/gen9ssb/scripts.ts | 2 ++ 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/data/mods/gen9ssb/abilities.ts b/data/mods/gen9ssb/abilities.ts index 888945285155..595bb71f1ed6 100644 --- a/data/mods/gen9ssb/abilities.ts +++ b/data/mods/gen9ssb/abilities.ts @@ -1648,6 +1648,10 @@ export const Abilities: {[k: string]: ModdedAbilityData} = { for (const volatile of volatilesToClear) { if (mon.volatiles[volatile]) { mon.removeVolatile(volatile); + if (volatile === 'flipped') { + changeSet(this, mon, ssbSets['Clementine']); + this.add(`c:|${getName('Clementine')}|┬──┬◡ノ(° -°ノ)`); + } this.add('-activate', pokemon, 'ability: End Round'); } } diff --git a/data/mods/gen9ssb/conditions.ts b/data/mods/gen9ssb/conditions.ts index aba0709ac7c5..e7c3ca2bc5d3 100644 --- a/data/mods/gen9ssb/conditions.ts +++ b/data/mods/gen9ssb/conditions.ts @@ -2887,10 +2887,6 @@ export const Conditions: {[k: string]: ModdedConditionData & {innateName?: strin }, onEnd(target) { this.add('-end', target, 'flipped'); - if (target.species.name !== 'Avalugg') { - target.formeChange('Avalugg', null, true); - target.removeVolatile('flipped'); - } }, }, diff --git a/data/mods/gen9ssb/moves.ts b/data/mods/gen9ssb/moves.ts index 0c23d515b2b1..6998f562b33c 100644 --- a/data/mods/gen9ssb/moves.ts +++ b/data/mods/gen9ssb/moves.ts @@ -520,11 +520,6 @@ export const Moves: {[k: string]: ModdedMoveData} = { this.add('-anim', source, 'Earthquake', target); }, volatileStatus: 'flinch', - onHit(target, source, move) { - if (target && !target.getMoveHitData(move).crit) { - delete move.volatileStatus; - } - }, secondary: null, target: "normal", type: "???", diff --git a/data/mods/gen9ssb/scripts.ts b/data/mods/gen9ssb/scripts.ts index 2452bde4a17d..3695d72e3774 100644 --- a/data/mods/gen9ssb/scripts.ts +++ b/data/mods/gen9ssb/scripts.ts @@ -742,6 +742,8 @@ export const Scripts: ModdedBattleScriptsData = { const isCrit = target.getMoveHitData(move).crit; if (isCrit) { baseDamage = tr(baseDamage * (move.critModifier || (this.battle.gen >= 6 ? 1.5 : 2))); + } else { + if (move.id === 'megidolaon') delete move.volatileStatus; } // random factor - also not a modifier From 89128dee97060b57d4d4b9d265cf377a255b579a Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Thu, 6 Jun 2024 17:16:59 -0600 Subject: [PATCH 041/139] Utils#Multiset: Redefine `get` to remove `undefined` return (#10329) --- config/formats.ts | 20 ++++++++++---------- data/random-battles/gen8/teams.ts | 4 ---- data/random-battles/gen9/teams.ts | 4 ---- data/random-battles/gen9baby/teams.ts | 10 +++++----- data/rulesets.ts | 11 +++++------ lib/utils.ts | 7 +++++-- server/chat-plugins/chat-monitor.ts | 2 +- server/chat-plugins/modlog-viewer.ts | 4 ++-- server/chat-plugins/wifi.tsx | 4 ++-- sim/dex.ts | 1 + 10 files changed, 31 insertions(+), 36 deletions(-) diff --git a/config/formats.ts b/config/formats.ts index 7464f1253daa..9426bd9a28c9 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -834,7 +834,7 @@ export const Formats: FormatList = [ }, onValidateTeam(team, f, teamHas) { if (this.ruleTable.has('abilityclause')) { - const abilityTable = new Map(); + const abilityTable = new this.dex.Multiset(); const base: {[k: string]: string} = { airlock: 'cloudnine', armortail: 'queenlymajesty', @@ -860,13 +860,13 @@ export const Formats: FormatList = [ let ability = this.toID(set.ability.split('0')[0]); if (!ability) continue; if (ability in base) ability = base[ability] as ID; - if ((abilityTable.get(ability) || 0) >= num) { + 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.set(ability, (abilityTable.get(ability) || 0) + 1); + abilityTable.add(ability); } } @@ -2158,9 +2158,9 @@ export const Formats: FormatList = [ ], onValidateTeam(team, format, teamHas) { const problems = []; - for (const trademark in teamHas.trademarks) { - if (teamHas.trademarks[trademark] > 1) { - problems.push(`You are limited to 1 of each Trademark.`, `(You have ${teamHas.trademarks[trademark]} Pok\u00e9mon with ${trademark} as a Trademark.)`); + for (const trademark of teamHas.trademarks.keys()) { + if (teamHas.trademarks.get(trademark) > 1) { + problems.push(`You are limited to 1 of each Trademark.`, `(You have ${teamHas.trademarks.get(trademark)} Pok\u00e9mon with ${trademark} as a Trademark.)`); } } return problems; @@ -2199,8 +2199,8 @@ export const Formats: FormatList = [ set.ability = 'No Ability'; problems = problems.concat(validator.validateSet(set, teamHas) || []); set.ability = ability.id; - if (!teamHas.trademarks) teamHas.trademarks = {}; - teamHas.trademarks[ability.name] = (teamHas.trademarks[ability.name] || 0) + 1; + if (!teamHas.trademarks) teamHas.trademarks = new this.dex.Multiset(); + teamHas.trademarks.add(ability.name); return problems.length ? problems : null; }, }, @@ -2424,11 +2424,11 @@ export const Formats: FormatList = [ restricted: ['Arceus'], onValidateTeam(team, format) { // baseSpecies:count - const restrictedPokemonCount = new Map(); + 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.set(species.baseSpecies, (restrictedPokemonCount.get(species.baseSpecies) || 0) + 1); + restrictedPokemonCount.add(species.baseSpecies); } for (const [baseSpecies, count] of restrictedPokemonCount) { if (count > 1) { diff --git a/data/random-battles/gen8/teams.ts b/data/random-battles/gen8/teams.ts index 1cec6b38ed3e..7a20cf2c2a77 100644 --- a/data/random-battles/gen8/teams.ts +++ b/data/random-battles/gen8/teams.ts @@ -47,10 +47,6 @@ export class MoveCounter extends Utils.Multiset { this.damagingMoves = new Set(); this.setupType = ''; } - - get(key: string): number { - return super.get(key) || 0; - } } type MoveEnforcementChecker = ( diff --git a/data/random-battles/gen9/teams.ts b/data/random-battles/gen9/teams.ts index f9993273db9d..13f94c7f538c 100644 --- a/data/random-battles/gen9/teams.ts +++ b/data/random-battles/gen9/teams.ts @@ -54,10 +54,6 @@ export class MoveCounter extends Utils.Multiset { this.damagingMoves = new Set(); this.ironFist = 0; } - - get(key: string): number { - return super.get(key) || 0; - } } type MoveEnforcementChecker = ( diff --git a/data/random-battles/gen9baby/teams.ts b/data/random-battles/gen9baby/teams.ts index 89cd6bc7ae00..6d7723495669 100644 --- a/data/random-battles/gen9baby/teams.ts +++ b/data/random-battles/gen9baby/teams.ts @@ -770,7 +770,7 @@ export class RandomBabyTeams extends RandomTeams { // Limit two of any type for (const typeName of types) { - if ((typeCount.get(typeName) || 0) >= 2 * limitFactor) { + if (typeCount.get(typeName) >= 2 * limitFactor) { skip = true; break; } @@ -781,13 +781,13 @@ export class RandomBabyTeams extends RandomTeams { for (const typeName of this.dex.types.names()) { // it's weak to the type if (this.dex.getEffectiveness(typeName, species) > 0) { - if ((typeWeaknesses.get(typeName) || 0) >= 3 * limitFactor) { + if (typeWeaknesses.get(typeName) >= 3 * limitFactor) { skip = true; break; } } if (this.dex.getEffectiveness(typeName, species) > 1) { - if ((typeDoubleWeaknesses.get(typeName) || 0) >= 1 * limitFactor) { + if (typeDoubleWeaknesses.get(typeName) >= 1 * limitFactor) { skip = true; break; } @@ -797,12 +797,12 @@ export class RandomBabyTeams extends RandomTeams { // Limit four weak to Freeze-Dry if (weakToFreezeDry) { - if ((typeWeaknesses.get('Freeze-Dry') || 0) >= 4 * limitFactor) continue; + if (typeWeaknesses.get('Freeze-Dry') >= 4 * limitFactor) continue; } } // Limit three of any type combination in Monotype - if (!this.forceMonotype && isMonotype && ((typeComboCount.get(typeCombo) || 0) >= 3 * limitFactor)) continue; + if (!this.forceMonotype && isMonotype && typeComboCount.get(typeCombo) >= 3 * limitFactor) continue; const set: RandomTeamsTypes.RandomSet = this.randomSet(species, teamDetails, false, false); pokemon.push(set); diff --git a/data/rulesets.ts b/data/rulesets.ts index 9eac725b2414..b9171a543bbd 100644 --- a/data/rulesets.ts +++ b/data/rulesets.ts @@ -1,6 +1,5 @@ // Note: These are the rules that formats use -import {Utils} from "../lib"; import type {Learnset} from "../sim/dex-species"; import {Pokemon} from "../sim/pokemon"; @@ -812,7 +811,7 @@ export const Rulesets: {[k: string]: FormatData} = { }, onValidateTeam(team) { if (this.format.id === 'gen8multibility') return; - const abilityTable = new Map(); + const abilityTable = new this.dex.Multiset(); const base: {[k: string]: string} = { airlock: 'cloudnine', armortail: 'queenlymajesty', @@ -838,13 +837,13 @@ export const Rulesets: {[k: string]: FormatData} = { let ability = this.toID(set.ability); if (!ability) continue; if (ability in base) ability = base[ability] as ID; - if ((abilityTable.get(ability) || 0) >= num) { + if (abilityTable.get(ability) >= num) { return [ `You are limited to ${num} of each ability by Ability Clause.`, `(You have more than ${num} ${this.dex.abilities.get(ability).name} variant${num === 1 ? '' : 's'})`, ]; } - abilityTable.set(ability, (abilityTable.get(ability) || 0) + 1); + abilityTable.add(ability); } }, }, @@ -1590,7 +1589,7 @@ export const Rulesets: {[k: string]: FormatData} = { return null; }, onValidateTeam(team) { - const sketches = new Utils.Multiset(); + const sketches = new this.dex.Multiset(); for (const set of team) { if ((set as any).sketchMove) { sketches.add((set as any).sketchMove); @@ -2697,7 +2696,7 @@ export const Rulesets: {[k: string]: FormatData} = { } }, onValidateTeam(team, format) { - const donors = new Utils.Multiset(); + const donors = new this.dex.Multiset(); for (const set of team) { const species = this.dex.species.get(set.species); const fusion = this.dex.species.get(set.name); diff --git a/lib/utils.ts b/lib/utils.ts index beeb3f6be3bb..b121d6738c51 100644 --- a/lib/utils.ts +++ b/lib/utils.ts @@ -414,12 +414,15 @@ export function formatSQLArray(arr: unknown[], args?: unknown[]) { } export class Multiset extends Map { + get(key: T) { + return super.get(key) ?? 0; + } add(key: T) { - this.set(key, (this.get(key) ?? 0) + 1); + this.set(key, this.get(key) + 1); return this; } remove(key: T) { - const newValue = (this.get(key) ?? 0) - 1; + const newValue = this.get(key) - 1; if (newValue <= 0) return this.delete(key); this.set(key, newValue); return true; diff --git a/server/chat-plugins/chat-monitor.ts b/server/chat-plugins/chat-monitor.ts index e22135150c82..42a74907de15 100644 --- a/server/chat-plugins/chat-monitor.ts +++ b/server/chat-plugins/chat-monitor.ts @@ -428,7 +428,7 @@ export const namefilter: Chat.NameFilter = (name, user) => { if (Punishments.namefilterwhitelist.has(id)) return name; if (Monitor.forceRenames.has(id)) { if (typeof Monitor.forceRenames.get(id) === 'number') { - // we check this for hotpatching reasons, since on the initial chat patch this will still be a Utils.MultiSet + // we check this for hotpatching reasons, since on the initial chat patch this will still be a Utils.Multiset // we're gonna assume no one has seen it since that covers people who _haven't_ actually, and those who have // likely will not be attempting to log into it Monitor.forceRenames.set(id, false); diff --git a/server/chat-plugins/modlog-viewer.ts b/server/chat-plugins/modlog-viewer.ts index cef81f7ea48a..3afcdbef1a8b 100644 --- a/server/chat-plugins/modlog-viewer.ts +++ b/server/chat-plugins/modlog-viewer.ts @@ -389,7 +389,7 @@ export const pages: Chat.PageTable = { if (entry.ip) { let ipTable = punishmentsByIp.get(entry.ip); if (!ipTable) { - ipTable = new Utils.Multiset(); + ipTable = new Utils.Multiset(); punishmentsByIp.set(entry.ip, ipTable); } ipTable.add(entry.action); @@ -448,7 +448,7 @@ export const pages: Chat.PageTable = { for (const [ip, table] of punishmentsByIp) { buf += `${ip}`; for (const key of keys) { - buf += `${table.get(key) || 0}`; + buf += `${table.get(key)}`; } buf += ``; } diff --git a/server/chat-plugins/wifi.tsx b/server/chat-plugins/wifi.tsx index cba8b948c9e4..40d6fd63431b 100644 --- a/server/chat-plugins/wifi.tsx +++ b/server/chat-plugins/wifi.tsx @@ -449,7 +449,7 @@ export class QuestionGiveaway extends Giveaway { if (Giveaway.checkBanned(this.room, user)) return user.sendTo(this.room, "You are banned from entering giveaways."); if (this.checkExcluded(user)) return user.sendTo(this.room, "You are disallowed from entering the giveaway."); - if ((this.answered.get(user.id) ?? 0) >= 3) { + if (this.answered.get(user.id) >= 3) { return user.sendTo( this.room, "You have already guessed three times. You cannot guess anymore in this.giveaway." @@ -468,7 +468,7 @@ export class QuestionGiveaway extends Giveaway { this.joined.set(user.latestIp, user.id); this.answered.add(user.id); - if ((this.answered.get(user.id) ?? 0) >= 3) { + if (this.answered.get(user.id) >= 3) { user.sendTo( this.room, `Your guess '${guess}' is wrong. You have used up all of your guesses. Better luck next time!` diff --git a/sim/dex.ts b/sim/dex.ts index 9f2dd4255717..0afa9ee67bd0 100644 --- a/sim/dex.ts +++ b/sim/dex.ts @@ -123,6 +123,7 @@ export class ModdedDex { deepClone = Utils.deepClone; deepFreeze = Utils.deepFreeze; + Multiset = Utils.Multiset; readonly formats: DexFormats; readonly abilities: DexAbilities; From e046c5ea766451ca9500a73fe72ec774e92e6f7e Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Thu, 6 Jun 2024 18:24:26 -0600 Subject: [PATCH 042/139] SSB: Don't remove trapper volatile manually --- data/mods/gen9ssb/abilities.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/mods/gen9ssb/abilities.ts b/data/mods/gen9ssb/abilities.ts index 595bb71f1ed6..5ef54d402c2c 100644 --- a/data/mods/gen9ssb/abilities.ts +++ b/data/mods/gen9ssb/abilities.ts @@ -1640,10 +1640,10 @@ export const Abilities: {[k: string]: ModdedAbilityData} = { 'syrupbomb', 'tarshot', 'taunt', 'telekinesis', 'torment', 'uproar', 'yawn', 'flashfire', 'protosynthesis', 'quarkdrive', 'slowstart', 'truant', 'unburden', 'metronome', 'beakblast', 'charge', 'echoedvoice', 'encore', 'focuspunch', 'furycutter', 'gmaxcannonade', 'gmaxchistrike', 'gmaxvinelash', 'gmaxvolcalith', 'gmaxwildfire', - 'iceball', 'rollout', 'laserfocus', 'lockon', 'perishsong', 'shelltrap', 'throatchop', 'trapped', 'trapper', + 'iceball', 'rollout', 'laserfocus', 'lockon', 'perishsong', 'shelltrap', 'throatchop', 'trapped', 'ultramystik', 'choicelock', 'stall', 'catstampofapproval', 'beefed', 'boiled', 'flipped', 'therollingspheal', 'treasurebag', 'torisstori', 'anyonecanbekilled', 'sigilsstorm', 'wonderwing', 'riseabove', 'superrollout', 'meatgrinder', - 'risingsword', 'ultramystik', + 'risingsword', ]; for (const volatile of volatilesToClear) { if (mon.volatiles[volatile]) { From da2abea73494efa63c3168bd713a3e7334b6eaae Mon Sep 17 00:00:00 2001 From: PartMan <47669599+PartMan7@users.noreply.github.com> Date: Sat, 8 Jun 2024 14:32:54 +0530 Subject: [PATCH 043/139] Scavengers: Stop crashes on Minesweeper ending (#10332) --- server/chat-plugins/scavenger-games.ts | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/server/chat-plugins/scavenger-games.ts b/server/chat-plugins/scavenger-games.ts index 2cd9cc628586..927ed3c75158 100644 --- a/server/chat-plugins/scavenger-games.ts +++ b/server/chat-plugins/scavenger-games.ts @@ -92,10 +92,9 @@ class Leaderboard { async htmlLadder(): Promise { const data = await this.visualize('points'); - const display = `
    ${data.map(line => + return `
    RankNamePoints
    ${data.map(line => ``).join('') }
    RankNamePoints
    ${line.rank}${line.name}${line.points}
    `; - return display; } } @@ -517,11 +516,8 @@ const TWISTS: {[k: string]: Twist} = { const mines: {mine: string, users: string[]}[][] = []; - for (let index = 0; index < this.mines.length; index++) { - mines[index] = []; - for (const mine of this.mines[index]) { - mines[index].push({mine: mine.substr(1), users: []}); - } + for (const mineSet of this.mines as string[][]) { + mines.push(mineSet.map(mine => ({mine: mine.substr(1), users: [] as string[]}))); } for (const player of Object.values(this.playerTable)) { @@ -555,6 +551,7 @@ const TWISTS: {[k: string]: Twist} = { const mines: string[] = this.mines[q]; for (const [playerId, guesses] of Object.entries(guessObj)) { const player = this.playerTable[playerId]; + if (!player) continue; if (!player.mines) player.mines = []; (player.mines as {index: number, mine: string}[]).push(...mines .filter(mine => (guesses as Set).has(toID(mine))) From bd5a75ad08312a429a239d0e62f1ded0e76245a9 Mon Sep 17 00:00:00 2001 From: Yoshiblaze <53023564+Yoshiblaze@users.noreply.github.com> Date: Mon, 10 Jun 2024 12:10:15 -0400 Subject: [PATCH 044/139] PMotS: Update validation (#10341) * Do Not Use: Ban Wattrel * Update pokedex.ts --- config/formats.ts | 2 +- data/mods/moderngen2/pokedex.ts | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/config/formats.ts b/config/formats.ts index 9426bd9a28c9..c5fc4d286e53 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -469,7 +469,7 @@ export const Formats: FormatList = [ mod: 'gen9', ruleset: ['Standard NatDex', 'OHKO Clause', 'Evasion Moves Clause', 'Evasion Items Clause', 'Species Clause', 'Sleep Clause Mod', 'Terastal Clause', 'Z-Move Clause'], - banlist: ['Dewpider', 'Diglett-Alola', 'Flittle', 'Nidoran-M', 'Smeargle', 'Wingull', 'Wishiwashi', 'Zigzagoon-Base', 'Arena Trap', 'Huge Power', 'Moody', 'Pure Power', 'Shadow Tag', 'Baton Pass'], + banlist: ['Dewpider', 'Diglett-Alola', 'Flittle', 'Nidoran-M', 'Smeargle', 'Wattrel', 'Wingull', 'Wishiwashi', 'Zigzagoon-Base', 'Arena Trap', 'Huge Power', 'Moody', 'Pure Power', 'Shadow Tag', 'Baton Pass'], onBegin() { this.add('-message', `Welcome to Do Not Use!`); this.add('-message', `This is a National Dex metagame where only Pokemon with less than 280 BST are allowed, plus a select few others!`); diff --git a/data/mods/moderngen2/pokedex.ts b/data/mods/moderngen2/pokedex.ts index 9f40194fe299..40bd57158fd5 100644 --- a/data/mods/moderngen2/pokedex.ts +++ b/data/mods/moderngen2/pokedex.ts @@ -3814,4 +3814,24 @@ export const Pokedex: {[k: string]: ModdedSpeciesData} = { inherit: true, gen: 2, }, + sneaselhisui: { + inherit: true, + gen: 2, + }, + growlithehisui: { + inherit: true, + gen: 2, + }, + arcaninehisui: { + inherit: true, + gen: 2, + }, + typhlosionhisui: { + inherit: true, + gen: 2, + }, + qwilfishhisui: { + inherit: true, + gen: 2, + }, }; From 38e0c62e38f7e2cbca3df1fbf5ab1c71ff81ea75 Mon Sep 17 00:00:00 2001 From: ShivaD173 Date: Mon, 10 Jun 2024 12:10:40 -0400 Subject: [PATCH 045/139] ND RU: Unban Heat Rock (#10337) --- config/formats.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/formats.ts b/config/formats.ts index c5fc4d286e53..a96c636fbb99 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -2322,7 +2322,7 @@ export const Formats: FormatList = [ mod: 'gen9', searchShow: false, ruleset: ['[Gen 9] National Dex UU'], - banlist: ['ND UU', 'ND RUBL', 'Slowbro-Base + Slowbronite', 'Heat Rock'], + banlist: ['ND UU', 'ND RUBL', 'Slowbro-Base + Slowbronite'], }, { name: "[Gen 9] National Dex LC", From 733971c895f281b8cc68bab90cdef9a70ed5f966 Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Mon, 10 Jun 2024 10:12:17 -0600 Subject: [PATCH 046/139] STABmons: Ban Latios and Ogerpon-Wellspring --- config/formats.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/config/formats.ts b/config/formats.ts index a96c636fbb99..8e5d73fb6963 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -1145,10 +1145,10 @@ export const Formats: FormatList = [ banlist: [ 'Araquanid', 'Arceus', 'Azumarill', 'Basculegion', 'Basculegion-F', 'Baxcalibur', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Deoxys-Base', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', 'Dragapult', 'Dragonite', 'Enamorus-Base', 'Eternatus', 'Flutter Mane', 'Garchomp', 'Giratina', 'Giratina-Origin', - 'Groudon', 'Ho-Oh', 'Iron Bundle', 'Komala', 'Koraidon', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lugia', 'Lunala', 'Magearna', 'Manaphy', - 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Palkia-Origin', 'Pecharunt', 'Porygon-Z', 'Rayquaza', 'Reshiram', 'Roaring Moon', - 'Shaymin-Sky', 'Solgaleo', 'Spectrier', 'Terapagos', 'Ursaluna', 'Ursaluna-Bloodmoon', 'Urshifu-Base', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', - 'Zoroark-Hisui', 'Arena Trap', 'Moody', 'Shadow Tag', 'King\'s Rock', 'Razor Fang', 'Baton Pass', 'Shed Tail', + 'Groudon', 'Ho-Oh', 'Iron Bundle', 'Komala', 'Koraidon', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Latios', 'Lugia', 'Lunala', 'Magearna', + 'Manaphy', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Ogerpon-Wellspring', 'Palkia', 'Palkia-Origin', 'Pecharunt', 'Porygon-Z', + 'Rayquaza', 'Reshiram', 'Roaring Moon', 'Shaymin-Sky', 'Solgaleo', 'Spectrier', 'Terapagos', 'Ursaluna', 'Ursaluna-Bloodmoon', 'Urshifu-Base', 'Zacian', + 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', 'Zoroark-Hisui', 'Arena Trap', 'Moody', 'Shadow Tag', 'King\'s Rock', 'Razor Fang', 'Baton Pass', 'Shed Tail', ], restricted: [ 'Acupressure', 'Belly Drum', 'Clangorous Soul', 'Dire Claw', 'Extreme Speed', 'Fillet Away', 'Gigaton Hammer', 'Last Respects', 'No Retreat', From 8f86a9824e7250969e9b91f90e5b4bc4619b0349 Mon Sep 17 00:00:00 2001 From: Chessking345 <82059215+Chessking345@users.noreply.github.com> Date: Mon, 10 Jun 2024 12:39:39 -0400 Subject: [PATCH 047/139] Inheritance: Update bans (#10340) * Update formats.ts * Update formats.ts * Update formats.ts --------- Co-authored-by: Kris Johnson <11083252+KrisXV@users.noreply.github.com> --- config/formats.ts | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/config/formats.ts b/config/formats.ts index 8e5d73fb6963..fe5b590c52f2 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -733,13 +733,14 @@ export const Formats: FormatList = [ mod: 'gen9', ruleset: ['Standard OMs', 'Ability Clause = 1', 'Sleep Moves Clause', 'Terastal Clause'], banlist: [ - 'Arceus', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chien-Pao', 'Cresselia', 'Deoxys-Base', '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-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Palkia-Origin', - 'Pecharunt', 'Rayquaza', 'Regieleki', 'Regigigas', 'Reshiram', 'Sableye', 'Samurott-Hisui', 'Scream Tail', 'Shaymin-Sky', 'Slaking', 'Smeargle', 'Solgaleo', - 'Spectrier', 'Urshifu-Base', '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', 'Poison Heal', 'Pure Power', 'Shadow Tag', 'Speed Boost', - 'Stakeout', 'Water Bubble', 'King\'s Rock', 'Razor Fang', 'Baton Pass', 'Fillet Away', 'Last Respects', 'Rage Fist', 'Shed Tail', 'Shell Smash', + 'Arceus', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chien-Pao', 'Cresselia', 'Deoxys-Base', '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', 'Oricorio', 'Oricorio-Pa\'u', 'Oricorio-Pom-Pom', + 'Oricorio-Sensu', 'Palkia', 'Palkia-Origin', 'Pecharunt', 'Rayquaza', 'Regieleki', 'Regigigas', 'Reshiram', 'Sableye', 'Samurott-Hisui', 'Scream Tail', 'Shaymin-Sky', + 'Slaking', 'Smeargle', 'Solgaleo', 'Spectrier', 'Urshifu-Base', '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', 'Speed Boost', 'Stakeout', 'Water Bubble', 'King\'s Rock', 'Razor Fang', 'Baton Pass', 'Fillet Away', 'Last Respects', 'Rage Fist', 'Shed Tail', + 'Shell Smash', ], getEvoFamily(speciesid) { let species = Dex.species.get(speciesid); From 48059af0a2a887b3797d722e46b3d326e014e57c Mon Sep 17 00:00:00 2001 From: dot-Comfey <84290266+dot-Comfey@users.noreply.github.com> Date: Mon, 10 Jun 2024 19:37:38 -0700 Subject: [PATCH 048/139] Add min source gen for event-only Pokemon (#10339) --- sim/team-validator.ts | 6 ++++++ test/sim/team-validator/events.js | 12 ++++++++++++ 2 files changed, 18 insertions(+) diff --git a/sim/team-validator.ts b/sim/team-validator.ts index b15f06eef5ec..775a8365f04e 100644 --- a/sim/team-validator.ts +++ b/sim/team-validator.ts @@ -101,6 +101,10 @@ export class PokemonSources { * `null` = definitely not an event egg that can be used with the Pomeg glitch */ pomegEventEgg?: string | null; + /** + * For event-only Pokemon that do not have a minimum source gen identified by its moves + */ + eventOnlyMinSourceGen?: number; /** * Some Pokemon evolve by having a move in their learnset (like Piloswine * with Ancient Power). These can only carry three other moves from their @@ -151,6 +155,7 @@ export class PokemonSources { this.limitedEggMoves = null; } minSourceGen() { + if (this.eventOnlyMinSourceGen) return this.eventOnlyMinSourceGen; if (this.sourcesBefore) return this.sourcesAfter || 1; let min = 10; for (const source of this.sources) { @@ -877,6 +882,7 @@ export class TeamValidator { let legal = false; for (const event of eventData) { if (this.validateEvent(set, setSources, event, eventSpecies)) continue; + setSources.eventOnlyMinSourceGen = event.generation; legal = true; break; } diff --git a/test/sim/team-validator/events.js b/test/sim/team-validator/events.js index e3c1a75d322a..451811dd05ac 100644 --- a/test/sim/team-validator/events.js +++ b/test/sim/team-validator/events.js @@ -150,6 +150,18 @@ describe('Team Validator', function () { assert.false.legalTeam(team, 'gen7anythinggoes'); }); + it('should identify the minimum source gen of event-only Pokemon which haven\'t already been identified by its moves', function () { + let team = [ + {species: 'jirachi', ability: 'serenegrace', shiny: true, moves: ['aurasphere'], evs: {hp: 1}, ivs: {hp: 31, atk: 0, def: 31, spa: 31, spd: 31, spe: 31}}, + ]; + assert.legalTeam(team, 'gen9ou'); + + team = [ + {species: 'jirachi', ability: 'serenegrace', shiny: true, moves: ['hiddenpowerfighting'], nature: 'serious', evs: {hp: 1}, ivs: {hp: 31, atk: 0, def: 31, spa: 31, spd: 31, spe: 31}}, + ]; + assert.false.legalTeam(team, 'gen7ou'); + }); + it.skip('should allow evolved Pokemon obtainable from events at lower levels than they could otherwise be obtained', function () { const team = [ {species: 'dragonite', ability: 'innerfocus', moves: ['dracometeor'], evs: {hp: 1}, level: 50}, From 317a603b8034a73400c833ebdfa9e15a10fa22c8 Mon Sep 17 00:00:00 2001 From: Chloe Nixon <93556823+ChloeNixon@users.noreply.github.com> Date: Tue, 11 Jun 2024 18:35:29 -0700 Subject: [PATCH 049/139] Fix Slow Start duration on switch in (#10262) --- data/abilities.ts | 5 +++++ test/sim/abilities/slowstart.js | 13 +++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/data/abilities.ts b/data/abilities.ts index 31a263acfc42..f38a525479a6 100644 --- a/data/abilities.ts +++ b/data/abilities.ts @@ -4243,6 +4243,11 @@ export const Abilities: {[abilityid: string]: AbilityData} = { onStart(target) { this.add('-start', target, 'ability: Slow Start'); }, + onResidual(pokemon) { + if (!pokemon.activeTurns) { + this.effectState.duration += 1; + } + }, onModifyAtkPriority: 5, onModifyAtk(atk, pokemon) { return this.chainModify(0.5); diff --git a/test/sim/abilities/slowstart.js b/test/sim/abilities/slowstart.js index 8241342d36a0..81971e3ac33e 100644 --- a/test/sim/abilities/slowstart.js +++ b/test/sim/abilities/slowstart.js @@ -10,7 +10,7 @@ describe(`Slow Start`, function () { battle.destroy(); }); - it(`should not delay activation on switch-in, unlike Speed Boost`, function () { + it(`should delay activation on switch-in, like Speed Boost`, function () { battle = common.createBattle([[ {species: 'diglett', moves: ['sleeptalk']}, {species: 'regigigas', ability: 'slowstart', item: 'normaliumz', moves: ['sleeptalk']}, @@ -19,9 +19,14 @@ describe(`Slow Start`, function () { ]]); battle.makeChoices('switch 2', 'auto'); for (let i = 0; i < 4; i++) { battle.makeChoices(); } - const log = battle.getDebugLog(); - const slowStartEnd = log.indexOf('|-end|p1a: Regigigas|Slow Start'); - assert(slowStartEnd > -1, 'Slow Start should end in 5 turns, including the turn it switched in.'); + let log = battle.getDebugLog(); + let slowStartEnd = log.indexOf('|-end|p1a: Regigigas|Slow Start'); + assert.false(slowStartEnd > -1, 'Slow Start should remain in effect after 4 active turns.'); + + battle.makeChoices(); + log = battle.getDebugLog(); + slowStartEnd = log.indexOf('|-end|p1a: Regigigas|Slow Start'); + assert(slowStartEnd > -1, 'Slow Start should not be in effect after 5 active turns.'); }); it(`[Gen 7] should halve the user's Special Attack when using a special Z-move`, function () { From 1e89fc563d3254e66e44c71167de45eb30df1701 Mon Sep 17 00:00:00 2001 From: Mia <49593536+mia-pi-git@users.noreply.github.com> Date: Wed, 12 Jun 2024 19:29:06 -0500 Subject: [PATCH 050/139] Roomlogs: Fix bugs in database handling Cropped up while hunting the memory bug. Maybe related. Dunno yet. --- server/roomlogs.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/server/roomlogs.ts b/server/roomlogs.ts index 431506ea5db5..245d47070858 100644 --- a/server/roomlogs.ts +++ b/server/roomlogs.ts @@ -295,8 +295,12 @@ export class Roomlog { void Rooms.Modlog.write(this.roomid, entry, overrideID); } async rename(newID: RoomID): Promise { + await Rooms.Modlog.rename(this.roomid, newID); + this.roomid = newID; if (roomlogTable) { - await roomlogTable.updateAll({roomid: this.roomid})`WHERE roomid = ${this.roomid}`; + if (!(!Config.logchat || this.roomid.startsWith('battle-'))) { + await roomlogTable.updateAll({roomid: this.roomid})`WHERE roomid = ${this.roomid}`; + } return true; } else { const roomlogPath = `chat`; @@ -309,8 +313,6 @@ export class Roomlog { if (roomlogExists && !newRoomlogExists) { await Monitor.logPath(roomlogPath + `/${this.roomid}`).rename(Monitor.logPath(roomlogPath + `/${newID}`).path); } - await Rooms.Modlog.rename(this.roomid, newID); - this.roomid = newID; Roomlogs.roomlogs.set(newID, this); if (roomlogStreamExisted) { this.roomlogStream = undefined; From 2a5a3607559005f795d9a820633083ac129d105d Mon Sep 17 00:00:00 2001 From: TomOfTomKat <73961857+TomOfTomKat@users.noreply.github.com> Date: Fri, 14 Jun 2024 15:44:11 -0500 Subject: [PATCH 051/139] MnM: Ban Red Orb (#10343) --- config/formats.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/formats.ts b/config/formats.ts index fe5b590c52f2..bca4666c0eed 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -930,7 +930,7 @@ export const Formats: FormatList = [ ruleset: ['Standard OMs', 'Evasion Items Clause', 'Evasion Abilities Clause', 'Sleep Moves Clause', 'Terastal Clause'], banlist: [ 'Calyrex-Shadow', 'Koraidon', 'Kyogre', 'Miraidon', 'Moody', 'Rusted Sword', 'Shadow Tag', 'Beedrillite', 'Blazikenite', 'Gengarite', - 'Kangaskhanite', 'Mawilite', 'Medichamite', 'Pidgeotite', 'Baton Pass', 'Shed Tail', + 'Kangaskhanite', 'Mawilite', 'Medichamite', 'Pidgeotite', 'Red Orb', 'Baton Pass', 'Shed Tail', ], restricted: [ 'Arceus', 'Basculegion-Base', 'Calyrex-Ice', 'Deoxys-Base', 'Deoxys-Attack', 'Dialga', 'Dragapult', 'Enamorus-Base', 'Eternatus', From 4889600bda1acb0774744ff53da68f92112bba91 Mon Sep 17 00:00:00 2001 From: TomOfTomKat <73961857+TomOfTomKat@users.noreply.github.com> Date: Fri, 14 Jun 2024 15:47:01 -0500 Subject: [PATCH 052/139] MnM: Unrestrict Jolteon and Enamorus (#10344) --- config/formats.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/config/formats.ts b/config/formats.ts index bca4666c0eed..2f7fb83b7887 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -933,10 +933,10 @@ export const Formats: FormatList = [ 'Kangaskhanite', 'Mawilite', 'Medichamite', 'Pidgeotite', 'Red Orb', 'Baton Pass', 'Shed Tail', ], restricted: [ - 'Arceus', 'Basculegion-Base', 'Calyrex-Ice', 'Deoxys-Base', 'Deoxys-Attack', 'Dialga', 'Dragapult', 'Enamorus-Base', 'Eternatus', - 'Flutter Mane', 'Gengar', 'Gholdengo', 'Giratina', 'Gouging Fire', 'Groudon', 'Ho-Oh', 'Iron Bundle', 'Jolteon', 'Kilowattrel', - 'Kyurem-Black', 'Kyurem-White', 'Lunala', 'Manaphy', 'Mewtwo', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Rayquaza', - 'Regigigas', 'Reshiram', 'Slaking', 'Sneasler', 'Ursaluna-Bloodmoon', 'Urshifu-Base', 'Zacian', 'Zekrom', + 'Arceus', 'Basculegion-Base', 'Calyrex-Ice', 'Deoxys-Base', 'Deoxys-Attack', 'Dialga', 'Dragapult', 'Eternatus', 'Flutter Mane', + 'Gengar', 'Gholdengo', 'Giratina', 'Gouging Fire', 'Groudon', 'Ho-Oh', 'Iron Bundle', 'Kilowattrel', 'Kyurem-Black', 'Kyurem-White', + 'Lunala', 'Manaphy', 'Mewtwo', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Rayquaza', 'Regigigas', 'Reshiram', 'Slaking', + 'Sneasler', 'Ursaluna-Bloodmoon', 'Urshifu-Base', 'Zacian', 'Zekrom', ], onValidateTeam(team) { const itemTable = new Set(); From 25630949dbaeb453af58e4037d3075bf720d2916 Mon Sep 17 00:00:00 2001 From: Leonard Craft III Date: Fri, 14 Jun 2024 16:45:19 -0500 Subject: [PATCH 053/139] Gen III-IV: Fix Mud/Water Sport with Baton Pass https://www.smogon.com/forums/posts/10151015/ --- data/mods/gen4/moves.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/data/mods/gen4/moves.ts b/data/mods/gen4/moves.ts index 448e44caba69..c414a9c6dcd4 100644 --- a/data/mods/gen4/moves.ts +++ b/data/mods/gen4/moves.ts @@ -1088,14 +1088,13 @@ export const Moves: {[k: string]: ModdedMoveData} = { mudsport: { inherit: true, condition: { - noCopy: true, onStart(pokemon) { this.add('-start', pokemon, 'move: Mud Sport'); }, onAnyBasePowerPriority: 3, onAnyBasePower(basePower, user, target, move) { if (move.type === 'Electric') { - this.debug('mud sport weaken'); + this.debug('Mud Sport weaken'); return this.chainModify(0.5); } }, @@ -1752,14 +1751,13 @@ export const Moves: {[k: string]: ModdedMoveData} = { watersport: { inherit: true, condition: { - noCopy: true, onStart(pokemon) { this.add('-start', pokemon, 'move: Water Sport'); }, onAnyBasePowerPriority: 3, onAnyBasePower(basePower, user, target, move) { if (move.type === 'Fire') { - this.debug('water sport weaken'); + this.debug('Water Sport weaken'); return this.chainModify(0.5); } }, From 5a000c62622cf284c30f9d589883c8c141e56b6c Mon Sep 17 00:00:00 2001 From: Christopher Monsanto Date: Sat, 15 Jun 2024 17:48:47 -0400 Subject: [PATCH 054/139] Move Kommo-o to UUBL (PRs welcome for this sort of thing!!) --- data/formats-data.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/formats-data.ts b/data/formats-data.ts index da29db04e21c..64a0d663095f 100644 --- a/data/formats-data.ts +++ b/data/formats-data.ts @@ -4489,7 +4489,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { tier: "NFE", }, kommoo: { - tier: "UU", + tier: "UUBL", doublesTier: "(DUU)", natDexTier: "UUBL", }, From 7daa81d4704529c311c8a0818eb56ab1de794ab5 Mon Sep 17 00:00:00 2001 From: Sergio Garcia <47090312+singiamtel@users.noreply.github.com> Date: Sun, 16 Jun 2024 00:38:54 +0200 Subject: [PATCH 055/139] Trademarked: Fix crash (#10342) Apparently it could be undefined in the past too, but JS accepts iterating undefined in for..in just fine --- config/formats.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/config/formats.ts b/config/formats.ts index 2f7fb83b7887..81428512185f 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -2159,6 +2159,7 @@ export const Formats: FormatList = [ ], onValidateTeam(team, format, teamHas) { const problems = []; + if (!teamHas.trademarks) return; for (const trademark of teamHas.trademarks.keys()) { if (teamHas.trademarks.get(trademark) > 1) { problems.push(`You are limited to 1 of each Trademark.`, `(You have ${teamHas.trademarks.get(trademark)} Pok\u00e9mon with ${trademark} as a Trademark.)`); From 95c21bef638b692bb9d19dac05dbe038afd172cb Mon Sep 17 00:00:00 2001 From: shrianshChari <30420527+shrianshChari@users.noreply.github.com> Date: Sat, 15 Jun 2024 15:43:17 -0700 Subject: [PATCH 056/139] ZU: Update bans (#10348) * ZU: Ban Uxie, unban Vulpix https://www.smogon.com/forums/threads/np-zu-stage-9-march-of-the-pigs-uxie-ban-and-vulpix-unban-18.3743382/ * Update data/formats-data.ts --------- Co-authored-by: Kris Johnson <11083252+KrisXV@users.noreply.github.com> --- data/formats-data.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/formats-data.ts b/data/formats-data.ts index 64a0d663095f..68ddc7d60940 100644 --- a/data/formats-data.ts +++ b/data/formats-data.ts @@ -319,7 +319,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { natDexTier: "UU", }, vulpix: { - tier: "ZUBL", + tier: "NFE", doublesTier: "NFE", natDexTier: "LC", }, @@ -2789,7 +2789,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { natDexTier: "RU", }, uxie: { - tier: "ZU", + tier: "ZUBL", doublesTier: "(DUU)", natDexTier: "RU", }, From 3ac9f2e4c7ef347e9a42e76c3a9bf247e896fcd0 Mon Sep 17 00:00:00 2001 From: shrianshChari <30420527+shrianshChari@users.noreply.github.com> Date: Sat, 15 Jun 2024 15:43:29 -0700 Subject: [PATCH 057/139] NU: Ban Mew and Drought (#10347) * NU: Ban Mew https://www.smogon.com/forums/threads/np-stage-11-calm-down-drought-banned-17-mew-banned-18.3743606/#post-10150714 * NU: Ban Drought https://www.smogon.com/forums/threads/np-stage-11-calm-down-drought-banned-17-mew-banned-18.3743606/#post-10148995 * Update config/formats.ts --------- Co-authored-by: Kris Johnson <11083252+KrisXV@users.noreply.github.com> --- config/formats.ts | 2 +- data/formats-data.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/formats.ts b/config/formats.ts index 81428512185f..438c39aaa5ad 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -133,7 +133,7 @@ export const Formats: FormatList = [ mod: 'gen9', ruleset: ['[Gen 9] RU'], - banlist: ['RU', 'NUBL', 'Quick Claw'], + banlist: ['RU', 'NUBL', 'Drought', 'Quick Claw'], }, { name: "[Gen 9] PU", diff --git a/data/formats-data.ts b/data/formats-data.ts index 68ddc7d60940..452393246ce4 100644 --- a/data/formats-data.ts +++ b/data/formats-data.ts @@ -1204,7 +1204,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { natDexTier: "Uber", }, mew: { - tier: "NU", + tier: "NUBL", doublesTier: "(DUU)", natDexTier: "RUBL", }, From 26034e2b5e8aaad849fccdd0240739d5883b86ab Mon Sep 17 00:00:00 2001 From: adrivrie Date: Sun, 16 Jun 2024 00:45:24 +0200 Subject: [PATCH 058/139] Baby Random Battle: Set updates and bug fixes (#10346) * fix belly drum hp * add surf/pump incompatibility * mienfoo and mincinno set changes * snivy/nacli set updates * tandemaus set change * rockhead growhisui * remove illegal wiglett set * change capsakid sets * add mon/move existence check * bunch of set and technical changes --- data/random-battles/gen9baby/sets.json | 61 ++++++++++++++------------ data/random-battles/gen9baby/teams.ts | 15 +++---- test/random-battles/gen9.js | 12 +++-- 3 files changed, 48 insertions(+), 40 deletions(-) diff --git a/data/random-battles/gen9baby/sets.json b/data/random-battles/gen9baby/sets.json index bd780917988d..18244141cff0 100644 --- a/data/random-battles/gen9baby/sets.json +++ b/data/random-battles/gen9baby/sets.json @@ -104,7 +104,7 @@ }, { "role": "Setup Sweeper", - "movepool": ["Sludge Bomb", "Solar Beam", "Sunny Day", "Weather Ball"], + "movepool": ["Power Whip", "Sludge Bomb", "Sunny Day", "Weather Ball"], "teraTypes": ["Fire"] } ] @@ -504,7 +504,7 @@ "sets": [ { "role": "Bulky Attacker", - "movepool": ["Belch", "Crunch", "Outrage", "Thunder Wave", "Work Up"], + "movepool": ["Crunch", "Outrage", "Roar", "Thunder Wave", "Work Up"], "teraTypes": ["Poison"] } ] @@ -644,8 +644,8 @@ }, { "role": "Wallbreaker", - "movepool": ["Body Press", "Draco Meteor", "Flash Cannon", "Focus Energy", "Thunderbolt"], - "teraTypes": ["Electric", "Fighting"] + "movepool": ["Body Press", "Draco Meteor", "Flash Cannon", "Thunderbolt"], + "teraTypes": ["Dragon", "Electric", "Fighting", "Steel"] }, { "role": "Bulky Attacker", @@ -690,7 +690,7 @@ { "role": "Bulky Setup", "movepool": ["Coil", "Earthquake", "Gunk Shot", "Trailblaze"], - "teraTypes": ["Dark", "Ground"] + "teraTypes": ["Dark", "Grass", "Ground"] } ] }, @@ -925,7 +925,7 @@ { "role": "Fast Attacker", "movepool": ["Dragon Claw", "Earthquake", "Iron Head", "Outrage", "Stealth Rock", "Stone Edge"], - "teraTypes": ["Stellar"] + "teraTypes": ["Dragon", "Ground", "Steel"] } ] }, @@ -995,7 +995,7 @@ { "role": "Fast Support", "movepool": ["Dazzling Gleam", "Power Gem", "Sludge Wave", "Spikes", "Stealth Rock"], - "teraTypes": ["Grass"] + "teraTypes": ["Ghost", "Grass"] } ] }, @@ -1062,14 +1062,9 @@ "grookey": { "level": 6, "sets": [ - { - "role": "Setup Sweeper", - "movepool": ["Drain Punch", "Grassy Glide", "Knock Off", "Swords Dance", "Wood Hammer"], - "teraTypes": ["Dark", "Fighting", "Grass"] - }, { "role": "Wallbreaker", - "movepool": ["Drain Punch", "Grassy Glide", "Knock Off", "U-turn", "Wood Hammer"], + "movepool": ["Drain Punch", "Grassy Glide", "Knock Off", "Swords Dance", "U-turn", "Wood Hammer"], "teraTypes": ["Grass"] } ] @@ -1114,7 +1109,7 @@ "sets": [ { "role": "Bulky Attacker", - "movepool": ["Encore", "Fire Punch", "Giga Drain", "Pain Split", "Sludge Bomb", "Thunder Wave", "Toxic", "Toxic Spikes"], + "movepool": ["Encore", "Fire Punch", "Giga Drain", "Pain Split", "Sludge Bomb", "Thunder Wave", "Toxic Spikes"], "teraTypes": ["Dark", "Grass"] }, { @@ -1144,12 +1139,12 @@ "sets": [ { "role": "Bulky Attacker", - "movepool": ["Dazzling Gleam", "Mystical Fire", "Nuzzle", "Psychic"], + "movepool": ["Draining Kiss", "Mystical Fire", "Nuzzle", "Psychic"], "teraTypes": ["Electric", "Fairy"] }, { "role": "Bulky Setup", - "movepool": ["Calm Mind", "Dazzling Gleam", "Draining Kiss", "Mystical Fire", "Psychic"], + "movepool": ["Calm Mind", "Draining Kiss", "Mystical Fire", "Psychic"], "teraTypes": ["Fairy", "Steel"] } ] @@ -1274,7 +1269,7 @@ "sets": [ { "role": "Fast Support", - "movepool": ["Bug Buzz", "Giga Drain", "Leech Life", "Lunge", "Thunder", "Thunder Wave", "Volt Switch"], + "movepool": ["Giga Drain", "Leech Life", "Thunder", "Thunder Wave", "Volt Switch"], "teraTypes": ["Electric"] } ] @@ -1434,8 +1429,8 @@ "sets": [ { "role": "Bulky Setup", - "movepool": ["Bulk Up", "Bullet Punch", "Drain Punch", "Earthquake", "Heavy Slam", "Stone Edge"], - "teraTypes": ["Ground", "Steel"] + "movepool": ["Bulk Up", "Bullet Punch", "Drain Punch", "Earthquake", "Heavy Slam", "Knock Off", "Stone Edge"], + "teraTypes": ["Dark", "Ground", "Steel"] } ] }, @@ -1625,7 +1620,7 @@ { "role": "Bulky Support", "movepool": ["Body Slam", "Crunch", "Curse", "Earthquake", "Rest", "Sleep Talk"], - "teraTypes": ["Fairy", "Ghost", "Ground"] + "teraTypes": ["Fairy", "Ground"] } ] }, @@ -1830,7 +1825,7 @@ { "role": "Setup Sweeper", "movepool": ["Belly Drum", "Body Slam", "Encore", "Hypnosis", "Waterfall"], - "teraTypes": ["Ground", "Normal", "Water"] + "teraTypes": ["Dragon", "Normal", "Water"] }, { "role": "Tera Blast user", @@ -1905,7 +1900,7 @@ { "role": "Bulky Support", "movepool": ["Brave Bird", "Encore", "Liquidation", "Rapid Spin", "Roost"], - "teraTypes": ["Flying", "Steel"] + "teraTypes": ["Dragon", "Steel"] } ] }, @@ -1989,7 +1984,7 @@ } ] }, - "rookiedee": { + "rookidee": { "level": 8, "sets": [ { @@ -2019,7 +2014,7 @@ "sets": [ { "role": "Bulky Setup", - "movepool": ["Brave Bird", "Bulk Up", "Close Combat", "Hone Claws", "Roost"], + "movepool": ["Brave Bird", "Close Combat", "Hone Claws", "Roost"], "teraTypes": ["Fighting"] } ] @@ -2129,7 +2124,7 @@ "sets": [ { "role": "Bulky Support", - "movepool": ["Bullet Seed", "Defog", "Foul Play", "Sucker Punch", "Synthesis"], + "movepool": ["Body Slam", "Bullet Seed", "Defog", "Sucker Punch", "Synthesis"], "teraTypes": ["Steel", "Water"] } ] @@ -2434,7 +2429,7 @@ } ] }, - "snubble": { + "snubbull": { "level": 7, "sets": [ { @@ -2671,6 +2666,11 @@ "role": "Bulky Attacker", "movepool": ["Bulk Up", "Defog", "Drain Punch", "Knock Off", "Stone Edge"], "teraTypes": ["Dark", "Steel"] + }, + { + "role": "Fast Support", + "movepool": ["Bulk Up", "Defog", "Drain Punch", "Knock Off", "Mach Punch"], + "teraTypes": ["Dark", "Steel"] } ] }, @@ -2702,10 +2702,15 @@ "movepool": ["Flare Blitz", "Protect", "Rock Slide", "Swords Dance"], "teraTypes": ["Dragon", "Fire", "Rock"] }, + { + "role": "Wallbreaker", + "movepool": ["Flare Blitz", "Overheat", "Protect", "Rock Slide"], + "teraTypes": ["Dragon", "Fire", "Rock"] + }, { "role": "Tera Blast user", - "movepool": ["Focus Energy", "Overheat", "Protect", "Tera Blast"], - "teraTypes": ["Fighting", "Ground"] + "movepool": ["Flare Blitz", "Protect", "Swords Dance", "Tera Blast"], + "teraTypes": ["Fighting", "Grass", "Ground"] } ] }, diff --git a/data/random-battles/gen9baby/teams.ts b/data/random-battles/gen9baby/teams.ts index 6d7723495669..8ebe9ed383fc 100644 --- a/data/random-battles/gen9baby/teams.ts +++ b/data/random-battles/gen9baby/teams.ts @@ -55,8 +55,7 @@ export class RandomBabyTeams extends RandomTeams { // Overwrite enforcementcheckers where needed here this.moveEnforcementCheckers['Bug'] = (movePool, moves, abilities, types, counter) => ( - movePool.includes('megahorn') || movePool.includes('xscissor') || - (!counter.get('Bug') && (types.includes('Electric') || types.includes('Water'))) + !counter.get('Bug') ); } @@ -139,7 +138,7 @@ export class RandomBabyTeams extends RandomTeams { [SETUP, PIVOT_MOVES], [SETUP, HAZARDS], [PHYSICAL_SETUP, PHYSICAL_SETUP], - [statusMoves, ['healingwish', 'trick', 'destinybond']], + [statusMoves, ['destinybond', 'healingwish', 'switcheroo', 'trick']], ['curse', 'rapidspin'], // These moves are redundant with each other @@ -148,7 +147,7 @@ export class RandomBabyTeams extends RandomTeams { ['alluringvoice', 'dazlinggleam', 'drainingkiss', 'moonblast'], ], [['bulletseed', 'gigadrain', 'leafstorm', 'seedbomb'], ['bulletseed', 'gigadrain', 'leafstorm', 'seedbomb']], - [['thunderwave', 'toxic', 'willowisp'], ['thunderwave', 'toxic', 'willowisp']], + [['hypnosis', 'thunderwave', 'toxic', 'willowisp', 'yawn'], ['hypnosis', 'thunderwave', 'toxic', 'willowisp', 'yawn']], ['roar', 'yawn'], ['dragonclaw', 'outrage'], ['dracometeor', 'dragonpulse'], @@ -448,6 +447,7 @@ export class RandomBabyTeams extends RandomTeams { if (species.id === 'riolu') return 'Inner Focus'; if (species.id === 'shroomish') return 'Effect Spore'; if (species.id === 'silicobra') return 'Shed Skin'; + if (species.id === 'tepig') return 'Blaze'; if (species.id === 'timburr') return 'Guts'; if (species.id === 'tyrogue') return 'Guts'; @@ -537,7 +537,7 @@ export class RandomBabyTeams extends RandomTeams { if (moves.has('focusenergy')) return 'Scope Lens'; if (moves.has('thief')) return ''; - if (moves.has('trick')) return 'Choice Scarf'; + if (moves.has('trick') || moves.has('switcheroo')) return 'Choice Scarf'; if (moves.has('acrobatics')) return ability === 'Unburden' ? 'Oran Berry' : ''; if (moves.has('auroraveil') || moves.has('lightscreen') && moves.has('reflect')) return 'Light Clay'; @@ -547,10 +547,7 @@ export class RandomBabyTeams extends RandomTeams { if (ability === 'Quick Feet') return 'Toxic Orb'; if (this.dex.getEffectiveness('Rock', species) >= 2) return 'Heavy-Duty Boots'; - if ( - ['Harvest', 'Ripen', 'Unburden'].includes(ability) || - moves.has('belch') || moves.has('bellydrum') - ) return 'Oran Berry'; + if (['Harvest', 'Ripen', 'Unburden'].includes(ability) || moves.has('bellydrum')) return 'Oran Berry'; } getItem( diff --git a/test/random-battles/gen9.js b/test/random-battles/gen9.js index e4241b184ba6..74c4260c3c7a 100644 --- a/test/random-battles/gen9.js +++ b/test/random-battles/gen9.js @@ -20,16 +20,18 @@ describe('[Gen 9] Random Battle (slow)', () => { }); }); - it('all moves on all sets should be obtainable', function () { + it('all moves on all sets should exist and be obtainable', function () { const generator = Teams.getGenerator(options.format); const rounds = 100; for (const pokemon of Object.keys(setsJSON)) { const species = dex.species.get(pokemon); + assert(species.exists, `Pokemon ${species} does not exist`); const sets = setsJSON[pokemon]["sets"]; const types = species.types; const abilities = new Set(Object.values(species.abilities)); if (species.unreleasedHidden) abilities.delete(species.abilities.H); for (const set of sets) { + assert(set.movepool.every(m => dex.moves.get(m).exists), `One of ${set.movepool} does not exist.`); const role = set.role; const moves = new Set(set.movepool.map(m => dex.moves.get(m).id)); const teraTypes = set.teraTypes; @@ -78,16 +80,18 @@ describe('[Gen 9] Baby Random Battle (slow)', () => { }); }); - it('all moves on all sets should be obtainable', function () { + it('all moves on all sets should exist and be obtainable', function () { const generator = Teams.getGenerator(options.format); const rounds = 100; for (const pokemon of Object.keys(setsJSON)) { const species = dex.species.get(pokemon); + assert(species.exists, `Pokemon ${species} does not exist`); const sets = setsJSON[pokemon]["sets"]; const types = species.types; const abilities = new Set(Object.values(species.abilities)); if (species.unreleasedHidden) abilities.delete(species.abilities.H); for (const set of sets) { + assert(set.movepool.every(m => dex.moves.get(m).exists), `One of ${set.movepool} does not exist.`); const role = set.role; const moves = new Set(set.movepool.map(m => dex.moves.get(m).id)); const teraTypes = set.teraTypes; @@ -142,16 +146,18 @@ describe('[Gen 9] Random Doubles Battle (slow)', () => { }); }); - it('all moves on all sets should be obtainable', function () { + it('all moves on all sets should exist and be obtainable', function () { const generator = Teams.getGenerator(options.format); const rounds = 100; for (const pokemon of Object.keys(setsJSON)) { const species = dex.species.get(pokemon); + assert(species.exists, `Pokemon ${species} does not exist`); const sets = setsJSON[pokemon]["sets"]; const types = species.types; const abilities = new Set(Object.values(species.abilities)); if (species.unreleasedHidden) abilities.delete(species.abilities.H); for (const set of sets) { + assert(set.movepool.every(m => dex.moves.get(m).exists), `One of ${set.movepool} does not exist.`); const role = set.role; const moves = new Set(set.movepool.map(m => dex.moves.get(m).id)); const teraTypes = set.teraTypes; From f332f6e66c888c6399c77e4ee9d4d682fcd18d40 Mon Sep 17 00:00:00 2001 From: HiZo <96159984+HisuianZoroark@users.noreply.github.com> Date: Sat, 15 Jun 2024 18:51:02 -0400 Subject: [PATCH 059/139] Partners in Crime: Ban Evasion Abilities, Stench (#10349) --- config/formats.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/formats.ts b/config/formats.ts index 438c39aaa5ad..380de7953f7b 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -1000,13 +1000,13 @@ export const Formats: FormatList = [ mod: 'partnersincrime', gameType: 'doubles', - ruleset: ['Standard Doubles'], + 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', - 'Bright Powder', 'King\'s Rock', 'Razor Fang', 'Ally Switch', 'Dragon Cheer', 'Last Respects', 'Revival Blessing', 'Swagger', + 'Stench', 'Bright Powder', 'King\'s Rock', 'Razor Fang', 'Ally Switch', 'Dragon Cheer', 'Last Respects', 'Revival Blessing', 'Swagger', ], onBegin() { for (const pokemon of this.getAllPokemon()) { From a7c6f1241dab9861f6b7d6ef415fd921ad661fc1 Mon Sep 17 00:00:00 2001 From: ACakeWearingAHat <45981036+ACakeWearingAHat@users.noreply.github.com> Date: Sun, 16 Jun 2024 22:50:14 -0500 Subject: [PATCH 060/139] SSB: Add missing QC changes and update descriptions (#10351) * SSB: Add missing qc changes and UI patch * remove comment --- data/mods/gen9ssb/abilities.ts | 7 ++++--- data/mods/gen9ssb/moves.ts | 5 +++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/data/mods/gen9ssb/abilities.ts b/data/mods/gen9ssb/abilities.ts index 5ef54d402c2c..b39e028062fa 100644 --- a/data/mods/gen9ssb/abilities.ts +++ b/data/mods/gen9ssb/abilities.ts @@ -1609,6 +1609,7 @@ export const Abilities: {[k: string]: ModdedAbilityData} = { // Merritty endround: { shortDesc: "Clears everything.", + desc: "When this Pokemon switches in, all weather, terrains, field conditions, entry hazards, stat stage changes, and volatile status conditions are removed from the field.", name: "End Round", onStart(pokemon) { if (this.suppressingAbility(pokemon)) return; @@ -1664,7 +1665,7 @@ export const Abilities: {[k: string]: ModdedAbilityData} = { // Meteordash tatsuglare: { - shortDesc: "Fur Coat + All moves hit off of Sp. Atk stat.", + shortDesc: "Fur Coat + All of the user's moves use the Special Attack stat.", name: "TatsuGlare", onModifyMove(move, pokemon, target) { if (move.category !== "Status") move.overrideOffensiveStat = 'spa'; @@ -1872,10 +1873,10 @@ export const Abilities: {[k: string]: ModdedAbilityData} = { // Pastor Gigas godsmercy: { - shortDesc: "Summons Misty Surge and cures the team's status conditions on switch-in.", + shortDesc: "Summons Grassy Terrain and cures the team's status conditions on switch-in.", name: "God's Mercy", onStart(source) { - this.field.setTerrain('mistyterrain'); + this.field.setTerrain('grassyterrain'); const allies = [...source.side.pokemon, ...source.side.allySide?.pokemon || []]; for (const ally of allies) { if (ally !== source && ally.hasAbility('sapsipper')) { diff --git a/data/mods/gen9ssb/moves.ts b/data/mods/gen9ssb/moves.ts index 6998f562b33c..843c91755d17 100644 --- a/data/mods/gen9ssb/moves.ts +++ b/data/mods/gen9ssb/moves.ts @@ -916,6 +916,7 @@ export const Moves: {[k: string]: ModdedMoveData} = { basePower: 0, category: "Status", shortDesc: "Protect, hit=-2 Atk/SpA/or Spe, user swap.", + desc: "Nearly always moves first. This move can only be used by Mega Sableye. The user is protected from most attacks made by other Pokemon during this turn. If a targeted move is blocked during this effect, the attacker's stats are lowered depending on the move used. If the attacker used a physical attack, their Attack is lowered by 2 stages. If the attacker used a special attack, their Special Attack is lowere dby 2 stages. If the attacker used a status move, their Speed is lowered by 2 stages. If this move successfully decreases a Pokemon's stat stages, this Pokemon's Mega Evolution is removed, and it immediately switches out and is replaced by a selected party member. This move fails if the user moves last, and has an increasing chance to fail when used consecutively.", name: "Shatter and Scatter", pp: 10, priority: 4, @@ -5240,8 +5241,8 @@ export const Moves: {[k: string]: ModdedMoveData} = { // Spiderz shepherdofthemafiaroom: { - accuracy: 100, - basePower: 90, + accuracy: 90, + basePower: 65, category: "Physical", shortDesc: "Sets Sticky Web. 1.3x BP if faster.", name: "Shepherd of the Mafia Room", From 05f7811d116fede574b72462be3d6ee6091e31ab Mon Sep 17 00:00:00 2001 From: livid washed <115855253+livid-washed@users.noreply.github.com> Date: Mon, 17 Jun 2024 13:53:58 +1000 Subject: [PATCH 061/139] Randomized format set updates (#10350) * Randomized format set updates * fix two sets having the same role * Bonemerang marowak gen 3 * Remove bp from wishtect Delcatty and Hypno * Curse hoodra vetoed * Dragon Tail neckboy * Enforce aveil on ninetales alola gen 7 * Gen 2: remove sub from dodrio and fearow * Gen 1: remove Slash from Sandslash * Remove TBU tales-alola, add TBU salazzle * Add freeze dry tales-alola * Mud Shot glaceon in dubs --- data/random-battles/gen1/data.json | 3 +- data/random-battles/gen2/sets.json | 4 +- data/random-battles/gen3/sets.json | 14 ++-- data/random-battles/gen4/sets.json | 6 +- data/random-battles/gen5/sets.json | 13 ++-- data/random-battles/gen6/sets.json | 37 ++++------ data/random-battles/gen6/teams.ts | 6 +- data/random-battles/gen7/sets.json | 25 +++---- data/random-battles/gen7/teams.ts | 10 ++- data/random-battles/gen9/doubles-sets.json | 15 ++-- data/random-battles/gen9/sets.json | 81 ++++++++++++++-------- data/random-battles/gen9/teams.ts | 22 +++--- 12 files changed, 131 insertions(+), 105 deletions(-) diff --git a/data/random-battles/gen1/data.json b/data/random-battles/gen1/data.json index a9f1aebefc0c..91177aa20dfb 100644 --- a/data/random-battles/gen1/data.json +++ b/data/random-battles/gen1/data.json @@ -119,8 +119,7 @@ }, "sandslash": { "level": 76, - "moves": ["bodyslam", "earthquake", "rockslide"], - "exclusiveMoves": ["slash", "swordsdance", "swordsdance", "swordsdance"] + "moves": ["bodyslam", "earthquake", "rockslide", "swordsdance"] }, "nidoranf": { "level": 90, diff --git a/data/random-battles/gen2/sets.json b/data/random-battles/gen2/sets.json index d97458ad810a..e1dccea29926 100644 --- a/data/random-battles/gen2/sets.json +++ b/data/random-battles/gen2/sets.json @@ -79,7 +79,7 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["doubleedge", "drillpeck", "hiddenpowerground", "rest", "sleeptalk", "substitute"] + "movepool": ["doubleedge", "drillpeck", "hiddenpowerground", "rest", "sleeptalk"] } ] }, @@ -428,7 +428,7 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["doubleedge", "drillpeck", "hiddenpowerground", "rest", "sleeptalk", "substitute"] + "movepool": ["doubleedge", "drillpeck", "hiddenpowerground", "rest", "sleeptalk"] } ] }, diff --git a/data/random-battles/gen3/sets.json b/data/random-battles/gen3/sets.json index 3b8b0b3ced0d..9bda7d118982 100644 --- a/data/random-battles/gen3/sets.json +++ b/data/random-battles/gen3/sets.json @@ -517,7 +517,7 @@ }, { "role": "Bulky Support", - "movepool": ["batonpass", "firepunch", "protect", "psychic", "wish"] + "movepool": ["firepunch", "protect", "psychic", "toxic", "wish"] }, { "role": "Staller", @@ -566,6 +566,10 @@ { "role": "Setup Sweeper", "movepool": ["doubleedge", "earthquake", "rockslide", "swordsdance"] + }, + { + "role": "Generalist", + "movepool": ["bonemerang", "doubleedge", "rockslide", "swordsdance"] } ] }, @@ -1722,13 +1726,9 @@ "role": "Bulky Setup", "movepool": ["calmmind", "rest", "sleeptalk", "surf"] }, - { - "role": "Staller", - "movepool": ["protect", "roar", "substitute", "surf", "toxic"] - }, { "role": "Bulky Attacker", - "movepool": ["calmmind", "icebeam", "rest", "substitute", "surf", "toxic"] + "movepool": ["calmmind", "icebeam", "rest", "substitute", "surf"] } ] }, @@ -2049,7 +2049,7 @@ }, { "role": "Generalist", - "movepool": ["batonpass", "bodyslam", "healbell", "protect", "wish"] + "movepool": ["bodyslam", "healbell", "protect", "wish"] }, { "role": "Setup Sweeper", diff --git a/data/random-battles/gen4/sets.json b/data/random-battles/gen4/sets.json index 4707e69d717d..7fc4a7c000e1 100644 --- a/data/random-battles/gen4/sets.json +++ b/data/random-battles/gen4/sets.json @@ -1552,9 +1552,13 @@ "swellow": { "level": 82, "sets": [ + { + "role": "Fast Attacker", + "movepool": ["bravebird", "facade", "protect", "uturn"] + }, { "role": "Wallbreaker", - "movepool": ["bravebird", "facade", "protect", "quickattack", "uturn"] + "movepool": ["bravebird", "facade", "quickattack", "uturn"] } ] }, diff --git a/data/random-battles/gen5/sets.json b/data/random-battles/gen5/sets.json index 1455d4c0d3d4..a8b449878b5f 100644 --- a/data/random-battles/gen5/sets.json +++ b/data/random-battles/gen5/sets.json @@ -1602,9 +1602,13 @@ "swellow": { "level": 83, "sets": [ + { + "role": "Fast Attacker", + "movepool": ["bravebird", "facade", "protect", "uturn"] + }, { "role": "Wallbreaker", - "movepool": ["bravebird", "facade", "protect", "quickattack", "uturn"] + "movepool": ["bravebird", "facade", "quickattack", "uturn"] } ] }, @@ -3169,7 +3173,7 @@ "sets": [ { "role": "Bulky Setup", - "movepool": ["calmmind", "hiddenpowerfighting", "moonlight", "psyshock", "substitute"] + "movepool": ["calmmind", "hiddenpowerfighting", "moonlight", "psyshock", "signalbeam", "substitute"] }, { "role": "Bulky Support", @@ -3575,8 +3579,9 @@ "level": 86, "sets": [ { - "role": "Bulky Support", - "movepool": ["earthquake", "explosion", "stealthrock", "stoneedge", "superpower"] + "role": "Bulky Attacker", + "movepool": ["earthquake", "explosion", "stealthrock", "stoneedge", "superpower", "toxic"], + "preferredTypes": ["Ground"] } ] }, diff --git a/data/random-battles/gen6/sets.json b/data/random-battles/gen6/sets.json index f2b6dccaf1a5..f6b90846063c 100644 --- a/data/random-battles/gen6/sets.json +++ b/data/random-battles/gen6/sets.json @@ -260,7 +260,7 @@ "sets": [ { "role": "Bulky Setup", - "movepool": ["bugbuzz", "quiverdance", "sleeppowder", "sludgebomb", "substitute"] + "movepool": ["bugbuzz", "quiverdance", "sleeppowder", "sludgebomb"] } ] }, @@ -983,10 +983,6 @@ "role": "Setup Sweeper", "movepool": ["crunch", "dragondance", "earthquake", "icepunch", "waterfall"], "preferredTypes": ["Ice"] - }, - { - "role": "Bulky Setup", - "movepool": ["aquajet", "crunch", "icepunch", "swordsdance", "waterfall"] } ] }, @@ -1782,7 +1778,11 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["bravebird", "facade", "protect", "quickattack", "uturn"] + "movepool": ["bravebird", "facade", "protect", "uturn"] + }, + { + "role": "Wallbreaker", + "movepool": ["bravebird", "facade", "quickattack", "uturn"] } ] }, @@ -2018,10 +2018,6 @@ { "role": "Setup Sweeper", "movepool": ["grassknot", "hiddenpowerice", "nastyplot", "thunderbolt"] - }, - { - "role": "Bulky Attacker", - "movepool": ["encore", "hiddenpowerice", "nuzzle", "thunderbolt", "toxic", "voltswitch"] } ] }, @@ -2036,10 +2032,6 @@ { "role": "Setup Sweeper", "movepool": ["grassknot", "hiddenpowerice", "nastyplot", "thunderbolt"] - }, - { - "role": "Bulky Attacker", - "movepool": ["encore", "hiddenpowerice", "nuzzle", "thunderbolt", "toxic", "voltswitch"] } ] }, @@ -3983,8 +3975,9 @@ "level": 83, "sets": [ { - "role": "Bulky Support", - "movepool": ["earthquake", "explosion", "stealthrock", "stoneedge", "superpower"] + "role": "Bulky Attacker", + "movepool": ["earthquake", "explosion", "stealthrock", "stoneedge", "superpower", "toxic"], + "preferredTypes": ["Ground"] } ] }, @@ -3992,7 +3985,7 @@ "level": 86, "sets": [ { - "role": "Bulky Setup", + "role": "Bulky Attacker", "movepool": ["calmmind", "heatwave", "roost", "storedpower"] }, { @@ -4228,7 +4221,7 @@ "sets": [ { "role": "Setup Sweeper", - "movepool": ["aquajet", "earthquake", "shellsmash", "stoneedge", "waterfall"] + "movepool": ["aquajet", "earthquake", "icebeam", "shellsmash", "stoneedge", "waterfall"] } ] }, @@ -4420,7 +4413,7 @@ "sets": [ { "role": "AV Pivot", - "movepool": ["flamethrower", "gigadrain", "hiddenpowerice", "knockoff", "superpower", "thunderbolt", "uturn"] + "movepool": ["discharge", "flamethrower", "gigadrain", "hiddenpowerice", "knockoff", "superpower", "uturn"] } ] }, @@ -4792,7 +4785,7 @@ }, { "role": "Bulky Setup", - "movepool": ["calmmind", "hydropump", "scald", "secretsword", "substitute"] + "movepool": ["calmmind", "scald", "secretsword", "substitute"] }, { "role": "Fast Attacker", @@ -4908,7 +4901,7 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["darkpulse", "fireblast", "hypervoice", "solarbeam", "sunnyday", "willowisp"], + "movepool": ["darkpulse", "fireblast", "hypervoice", "solarbeam", "sunnyday", "willowisp", "workup"], "preferredTypes": ["Normal"] } ] @@ -5249,7 +5242,7 @@ "sets": [ { "role": "Setup Sweeper", - "movepool": ["focusblast", "geomancy", "hiddenpowerfire", "moonblast", "psyshock", "thunder"] + "movepool": ["focusblast", "geomancy", "moonblast", "psyshock"] } ] }, diff --git a/data/random-battles/gen6/teams.ts b/data/random-battles/gen6/teams.ts index f0470f103834..062e000b3b5e 100644 --- a/data/random-battles/gen6/teams.ts +++ b/data/random-battles/gen6/teams.ts @@ -620,7 +620,7 @@ export class RandomGen6Teams extends RandomGen7Teams { case 'Torrent': return (!counter.get('Water') || !!species.isMega); case 'Unaware': - return (role !== 'Bulky Support' && role !== 'Staller'); + return (!['Bulky Setup', 'Bulky Support', 'Staller'].includes(role)); case 'Unburden': return (!!species.isMega || !counter.get('setup') && !moves.has('acrobatics')); case 'Water Absorb': @@ -776,9 +776,7 @@ export class RandomGen6Teams extends RandomGen7Teams { if ((ability === 'Guts' || moves.has('facade')) && !moves.has('sleeptalk')) { return species.name === 'Conkeldurr' ? 'Flame Orb' : 'Toxic Orb'; } - if (ability === 'Magic Guard' && role !== 'Bulky Support') { - return moves.has('counter') ? 'Focus Sash' : 'Life Orb'; - } + if (ability === 'Magic Guard') return moves.has('counter') ? 'Focus Sash' : 'Life Orb'; if (species.id === 'rampardos' && role === 'Fast Attacker') return 'Choice Scarf'; if (ability === 'Sheer Force' && counter.get('sheerforce')) return 'Life Orb'; if (ability === 'Unburden') return (species.id === 'hitmonlee') ? 'White Herb' : 'Sitrus Berry'; diff --git a/data/random-battles/gen7/sets.json b/data/random-battles/gen7/sets.json index 21f87addc055..1a8f1379992c 100644 --- a/data/random-battles/gen7/sets.json +++ b/data/random-battles/gen7/sets.json @@ -293,7 +293,7 @@ "sets": [ { "role": "Fast Support", - "movepool": ["auroraveil", "blizzard", "freezedry", "hiddenpowerground", "moonblast", "nastyplot"] + "movepool": ["auroraveil", "blizzard", "encore", "freezedry", "hiddenpowerground", "moonblast", "nastyplot"] } ] }, @@ -330,7 +330,7 @@ "sets": [ { "role": "Bulky Setup", - "movepool": ["bugbuzz", "quiverdance", "sleeppowder", "sludgebomb", "substitute"] + "movepool": ["bugbuzz", "quiverdance", "sleeppowder", "sludgebomb"] }, { "role": "Z-Move user", @@ -1170,10 +1170,6 @@ "role": "Setup Sweeper", "movepool": ["crunch", "dragondance", "earthquake", "icepunch", "liquidation"], "preferredTypes": ["Ice"] - }, - { - "role": "Bulky Setup", - "movepool": ["aquajet", "crunch", "icepunch", "liquidation", "swordsdance"] } ] }, @@ -4278,8 +4274,9 @@ "level": 83, "sets": [ { - "role": "Bulky Support", - "movepool": ["earthquake", "explosion", "stealthrock", "stoneedge", "superpower"] + "role": "Bulky Attacker", + "movepool": ["earthquake", "explosion", "stealthrock", "stoneedge", "superpower", "toxic"], + "preferredTypes": ["Ground"] } ] }, @@ -4287,7 +4284,7 @@ "level": 87, "sets": [ { - "role": "Bulky Setup", + "role": "Bulky Attacker", "movepool": ["calmmind", "heatwave", "roost", "storedpower"] }, { @@ -4528,7 +4525,7 @@ "sets": [ { "role": "Setup Sweeper", - "movepool": ["aquajet", "earthquake", "liquidation", "shellsmash", "stoneedge"] + "movepool": ["aquajet", "earthquake", "icebeam", "liquidation", "shellsmash", "stoneedge"] } ] }, @@ -4730,7 +4727,7 @@ "sets": [ { "role": "AV Pivot", - "movepool": ["flamethrower", "gigadrain", "hiddenpowerice", "knockoff", "superpower", "thunderbolt", "uturn"] + "movepool": ["discharge", "flamethrower", "gigadrain", "hiddenpowerice", "knockoff", "superpower", "uturn"] } ] }, @@ -5150,7 +5147,7 @@ }, { "role": "Bulky Setup", - "movepool": ["calmmind", "hydropump", "scald", "secretsword", "substitute"] + "movepool": ["calmmind", "scald", "secretsword", "substitute"] }, { "role": "Fast Attacker", @@ -5276,7 +5273,7 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["darkpulse", "fireblast", "hypervoice", "solarbeam", "sunnyday", "willowisp"] + "movepool": ["darkpulse", "fireblast", "hypervoice", "solarbeam", "sunnyday", "willowisp", "workup"] }, { "role": "Z-Move user", @@ -5630,7 +5627,7 @@ "sets": [ { "role": "Setup Sweeper", - "movepool": ["focusblast", "geomancy", "hiddenpowerfire", "moonblast", "psyshock", "thunder"] + "movepool": ["focusblast", "geomancy", "moonblast", "psyshock"] } ] }, diff --git a/data/random-battles/gen7/teams.ts b/data/random-battles/gen7/teams.ts index 3ef8c21d743b..d6de32fdbc8f 100644 --- a/data/random-battles/gen7/teams.ts +++ b/data/random-battles/gen7/teams.ts @@ -516,8 +516,8 @@ export class RandomGen7Teams extends RandomGen8Teams { movePool, preferredType, role); } - // Enforce Blizzard, Seismic Toss, Spore, and Sticky Web - for (const moveid of ['blizzard', 'seismictoss', 'spore', 'stickyweb']) { + // Enforce Aurora Veil, Blizzard, Seismic Toss, Spore, and Sticky Web + for (const moveid of ['auroraveil', 'blizzard', 'seismictoss', 'spore', 'stickyweb']) { if (movePool.includes(moveid)) { counter = this.addMove(moveid, moves, types, abilities, teamDetails, species, isLead, movePool, preferredType, role); @@ -829,7 +829,7 @@ export class RandomGen7Teams extends RandomGen8Teams { case 'Torrent': return (!counter.get('Water') || !!species.isMega); case 'Unaware': - return (role !== 'Bulky Support' && role !== 'Staller'); + return (!['Bulky Setup', 'Bulky Support', 'Staller'].includes(role)); case 'Unburden': return (!!species.isMega || !counter.get('setup') && !moves.has('acrobatics')); case 'Water Absorb': @@ -1023,9 +1023,7 @@ export class RandomGen7Teams extends RandomGen8Teams { if ((ability === 'Guts' || moves.has('facade')) && !moves.has('sleeptalk')) { return (types.includes('Fire') || ability === 'Quick Feet' || ability === 'Toxic Boost') ? 'Toxic Orb' : 'Flame Orb'; } - if (ability === 'Magic Guard' && role !== 'Bulky Support') { - return moves.has('counter') ? 'Focus Sash' : 'Life Orb'; - } + if (ability === 'Magic Guard') return moves.has('counter') ? 'Focus Sash' : 'Life Orb'; if (species.id === 'rampardos' && role === 'Fast Attacker') return 'Choice Scarf'; if (ability === 'Sheer Force' && counter.get('sheerforce')) return 'Life Orb'; if (ability === 'Unburden') return moves.has('closecombat') ? 'White Herb' : 'Sitrus Berry'; diff --git a/data/random-battles/gen9/doubles-sets.json b/data/random-battles/gen9/doubles-sets.json index a9ef801d8a59..9eb433cd5ca8 100644 --- a/data/random-battles/gen9/doubles-sets.json +++ b/data/random-battles/gen9/doubles-sets.json @@ -1096,6 +1096,11 @@ "role": "Choice Item user", "movepool": ["Body Press", "Explosion", "Iron Head", "Lunge"], "teraTypes": ["Fighting", "Fire"] + }, + { + "role": "Doubles Bulky Setup", + "movepool": ["Body Press", "Iron Defense", "Iron Head", "Rest", "Thunder Wave"], + "teraTypes": ["Fighting", "Fire"] } ] }, @@ -1333,7 +1338,7 @@ "teraTypes": ["Dragon", "Grass"] }, { - "role": "Doubles Support", + "role": "Bulky Protect", "movepool": ["Calm Mind", "Ice Beam", "Protect", "Scald"], "teraTypes": ["Dragon", "Grass"] } @@ -2353,9 +2358,9 @@ "teraTypes": ["Ghost", "Ice"] }, { - "role": "Tera Blast user", - "movepool": ["Blizzard", "Calm Mind", "Freeze-Dry", "Tera Blast"], - "teraTypes": ["Fire", "Ground"] + "role": "Doubles Wallbreaker", + "movepool": ["Blizzard", "Calm Mind", "Freeze-Dry", "Mud Shot"], + "teraTypes": ["Ground"] } ] }, @@ -5444,7 +5449,7 @@ }, { "role": "Doubles Bulky Attacker", - "movepool": ["Body Press", "Helping Hand", "Iron Head", "Protect", "Shed Tail", "Stealth Rock"], + "movepool": ["Body Press", "Heavy Slam", "Helping Hand", "Protect", "Shed Tail"], "teraTypes": ["Electric", "Poison"] } ] diff --git a/data/random-battles/gen9/sets.json b/data/random-battles/gen9/sets.json index f42accde8200..bfd24dc64ae6 100644 --- a/data/random-battles/gen9/sets.json +++ b/data/random-battles/gen9/sets.json @@ -153,7 +153,7 @@ "level": 79, "sets": [ { - "role": "Fast Support", + "role": "Bulky Support", "movepool": ["Aurora Veil", "Blizzard", "Encore", "Moonblast"], "teraTypes": ["Steel", "Water"] }, @@ -163,9 +163,9 @@ "teraTypes": ["Steel", "Water"] }, { - "role": "Tera Blast user", - "movepool": ["Blizzard", "Moonblast", "Nasty Plot", "Tera Blast"], - "teraTypes": ["Ground"] + "role": "Fast Support", + "movepool": ["Aurora Veil", "Blizzard", "Freeze-Dry", "Moonblast"], + "teraTypes": ["Steel", "Water"] } ] }, @@ -449,7 +449,7 @@ "sets": [ { "role": "Bulky Attacker", - "movepool": ["Drain Punch", "Gunk Shot", "Haze", "Ice Punch", "Knock Off", "Poison Jab", "Shadow Sneak", "Toxic", "Toxic Spikes"], + "movepool": ["Drain Punch", "Gunk Shot", "Haze", "Ice Punch", "Knock Off", "Poison Jab", "Shadow Sneak", "Toxic Spikes"], "teraTypes": ["Dark"] }, { @@ -574,8 +574,8 @@ }, { "role": "AV Pivot", - "movepool": ["Draco Meteor", "Flamethrower", "Giga Drain", "Knock Off"], - "teraTypes": ["Fire", "Steel"] + "movepool": ["Draco Meteor", "Dragon Tail", "Flamethrower", "Giga Drain", "Knock Off"], + "teraTypes": ["Fire"] } ] }, @@ -661,6 +661,11 @@ "role": "Fast Attacker", "movepool": ["Body Slam", "Close Combat", "Earthquake", "Throat Chop"], "teraTypes": ["Fighting", "Ground", "Normal"] + }, + { + "role": "Wallbreaker", + "movepool": ["Body Slam", "Close Combat", "Throat Chop", "Zen Headbutt"], + "teraTypes": ["Fighting", "Normal", "Psychic"] } ] }, @@ -1081,11 +1086,6 @@ "role": "Bulky Attacker", "movepool": ["Earthquake", "Head Smash", "Stealth Rock", "Sucker Punch", "Wood Hammer"], "teraTypes": ["Grass", "Rock"] - }, - { - "role": "Setup Sweeper", - "movepool": ["Earthquake", "Head Smash", "Rock Polish", "Wood Hammer"], - "teraTypes": ["Grass", "Rock"] } ] }, @@ -1403,8 +1403,8 @@ "level": 86, "sets": [ { - "role": "Fast Attacker", - "movepool": ["Dark Pulse", "Fire Blast", "Nasty Plot", "Sludge Bomb", "Sucker Punch"], + "role": "Setup Sweeper", + "movepool": ["Dark Pulse", "Fire Blast", "Nasty Plot", "Sludge Bomb", "Sucker Punch", "Will-O-Wisp"], "teraTypes": ["Dark", "Fire", "Poison"] } ] @@ -1469,7 +1469,7 @@ "sets": [ { "role": "Bulky Support", - "movepool": ["Close Combat", "Earthquake", "Rapid Spin", "Sucker Punch", "Triple Axel"], + "movepool": ["Close Combat", "Earthquake", "Rapid Spin", "Stone Edge", "Sucker Punch"], "teraTypes": ["Steel"] }, { @@ -2718,9 +2718,14 @@ "level": 94, "sets": [ { - "role": "Bulky Support", - "movepool": ["Calm Mind", "Freeze-Dry", "Protect", "Wish", "Yawn"], + "role": "Bulky Setup", + "movepool": ["Calm Mind", "Freeze-Dry", "Protect", "Wish"], "teraTypes": ["Water"] + }, + { + "role": "Bulky Attacker", + "movepool": ["Freeze-Dry", "Mud Shot", "Protect", "Wish"], + "teraTypes": ["Ground"] } ] }, @@ -2806,6 +2811,11 @@ "role": "Bulky Support", "movepool": ["Earthquake", "Pain Split", "Poltergeist", "Shadow Sneak", "Will-O-Wisp"], "teraTypes": ["Dark", "Fairy"] + }, + { + "role": "Bulky Attacker", + "movepool": ["Focus Punch", "Pain Split", "Poltergeist", "Substitute"], + "teraTypes": ["Fighting"] } ] }, @@ -3466,11 +3476,6 @@ "role": "Fast Support", "movepool": ["Knock Off", "Leaf Blade", "Lunge", "Sticky Web", "Swords Dance"], "teraTypes": ["Ghost", "Rock"] - }, - { - "role": "Setup Sweeper", - "movepool": ["Knock Off", "Leaf Blade", "Lunge", "Swords Dance", "Triple Axel"], - "teraTypes": ["Dark", "Rock"] } ] }, @@ -3809,7 +3814,12 @@ }, { "role": "Wallbreaker", - "movepool": ["Calm Mind", "Defog", "Esper Wing", "Heat Wave", "Hurricane", "U-turn"], + "movepool": ["Esper Wing", "Hurricane", "U-turn", "Vacuum Wave"], + "teraTypes": ["Fairy", "Fighting", "Psychic", "Steel"] + }, + { + "role": "Bulky Attacker", + "movepool": ["Calm Mind", "Defog", "Esper Wing", "Hurricane", "Roost"], "teraTypes": ["Fairy", "Psychic", "Steel"] } ] @@ -3980,7 +3990,7 @@ { "role": "Setup Sweeper", "movepool": ["Bolt Strike", "Dragon Dance", "Outrage", "Substitute"], - "teraTypes": ["Electric"] + "teraTypes": ["Electric", "Steel"] } ] }, @@ -4666,6 +4676,11 @@ "role": "Fast Support", "movepool": ["Flamethrower", "Protect", "Substitute", "Toxic"], "teraTypes": ["Flying", "Grass"] + }, + { + "role": "Tera Blast user", + "movepool": ["Fire Blast", "Nasty Plot", "Sludge Wave", "Tera Blast"], + "teraTypes": ["Grass"] } ] }, @@ -5540,7 +5555,7 @@ { "role": "Bulky Support", "movepool": ["Hex", "Slack Off", "Torch Song", "Will-O-Wisp"], - "teraTypes": ["Fairy", "Ghost", "Water"] + "teraTypes": ["Fairy", "Water"] } ] }, @@ -6124,8 +6139,18 @@ "sets": [ { "role": "Bulky Attacker", - "movepool": ["Close Combat", "Crunch", "Seed Bomb", "Spore", "Sucker Punch"], - "teraTypes": ["Dark", "Fighting"] + "movepool": ["Close Combat", "Seed Bomb", "Spore", "Sucker Punch"], + "teraTypes": ["Fighting", "Poison"] + }, + { + "role": "Bulky Support", + "movepool": ["Crunch", "Seed Bomb", "Spore", "Sucker Punch"], + "teraTypes": ["Dark", "Poison"] + }, + { + "role": "Wallbreaker", + "movepool": ["Close Combat", "Crunch", "Seed Bomb", "Sucker Punch"], + "teraTypes": ["Dark", "Fighting", "Poison"] } ] }, @@ -6409,7 +6434,7 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["Collision Course", "Flare Blitz", "Outrage", "U-turn"], + "movepool": ["Close Combat", "Flare Blitz", "Outrage", "U-turn"], "teraTypes": ["Fire"] }, { diff --git a/data/random-battles/gen9/teams.ts b/data/random-battles/gen9/teams.ts index 13f94c7f538c..ef57ca36885f 100644 --- a/data/random-battles/gen9/teams.ts +++ b/data/random-battles/gen9/teams.ts @@ -76,7 +76,7 @@ const PHYSICAL_SETUP = [ ]; // Moves which boost Special Attack: const SPECIAL_SETUP = [ - 'calmmind', 'chargebeam', 'geomancy', 'nastyplot', 'quiverdance', 'tailglow', 'torchsong', + 'calmmind', 'chargebeam', 'geomancy', 'nastyplot', 'quiverdance', 'tailglow', 'takeheart', 'torchsong', ]; // Moves that boost Attack AND Special Attack: const MIXED_SETUP = [ @@ -88,16 +88,16 @@ const SPEED_SETUP = [ ]; // Conglomerate for ease of access const SETUP = [ - 'acidarmor', 'agility', 'autotomize', 'bellydrum', 'bulkup', 'calmmind', 'clangoroussoul', 'coil', 'cosmicpower', 'curse', - 'dragondance', 'flamecharge', 'growth', 'honeclaws', 'howl', 'irondefense', 'meditate', 'nastyplot', 'noretreat', 'poweruppunch', - 'quiverdance', 'rockpolish', 'shellsmash', 'shiftgear', 'swordsdance', 'tailglow', 'tidyup', 'trailblaze', 'workup', 'victorydance', + 'acidarmor', 'agility', 'autotomize', 'bellydrum', 'bulkup', 'calmmind', 'clangoroussoul', 'coil', 'cosmicpower', 'curse', 'dragondance', + 'flamecharge', 'growth', 'honeclaws', 'howl', 'irondefense', 'meditate', 'nastyplot', 'noretreat', 'poweruppunch', 'quiverdance', + 'rockpolish', 'shellsmash', 'shiftgear', 'swordsdance', 'tailglow', 'takeheart', 'tidyup', 'trailblaze', 'workup', 'victorydance', ]; const SPEED_CONTROL = [ 'electroweb', 'glare', 'icywind', 'lowsweep', 'quash', 'stringshot', 'tailwind', 'thunderwave', 'trickroom', ]; // Moves that shouldn't be the only STAB moves: const NO_STAB = [ - 'accelerock', 'aquajet', 'bounce', 'breakingswipe', 'bulletpunch', 'chatter', 'chloroblast', 'clearsmog', 'covet', + 'accelerock', 'aquajet', 'bounce', 'breakingswipe', 'bulletpunch', 'chatter', 'chloroblast', 'circlethrow', 'clearsmog', 'covet', 'dragontail', 'doomdesire', 'electroweb', 'eruption', 'explosion', 'fakeout', 'feint', 'flamecharge', 'flipturn', 'futuresight', 'grassyglide', 'iceshard', 'icywind', 'incinerate', 'infestation', 'machpunch', 'meteorbeam', 'mortalspin', 'nuzzle', 'pluck', 'pursuit', 'quickattack', 'rapidspin', 'reversal', 'selfdestruct', 'shadowsneak', 'skydrop', 'snarl', 'strugglebug', 'suckerpunch', 'uturn', @@ -1099,10 +1099,9 @@ export class RandomTeams { case 'Seed Sower': return role === 'Bulky Support'; case 'Sheer Force': - const braviaryCase = (species.id === 'braviaryhisui' && (role === 'Wallbreaker' || role === 'Bulky Protect')); const abilitiesCase = (abilities.has('Guts') || abilities.has('Sharpness')); const movesCase = (moves.has('bellydrum') || moves.has('flamecharge')); - return (!counter.get('sheerforce') || braviaryCase || abilitiesCase || movesCase); + return (!counter.get('sheerforce') || abilitiesCase || movesCase); case 'Slush Rush': return !teamDetails.snow; case 'Solar Power': @@ -1125,9 +1124,8 @@ export class RandomTeams { case 'Technician': return (!counter.get('technician') || abilities.has('Punk Rock') || abilities.has('Fur Coat')); case 'Tinted Lens': - const hbraviaryCase = (species.id === 'braviaryhisui' && (role === 'Setup Sweeper' || role === 'Doubles Wallbreaker')); const yanmegaCase = (species.id === 'yanmega' && moves.has('protect')); - return (yanmegaCase || hbraviaryCase || species.id === 'illumise'); + return (yanmegaCase || species.id === 'illumise'); case 'Unburden': return (abilities.has('Prankster') || !counter.get('setup') || species.id === 'sceptile'); case 'Vital Spirit': @@ -1167,6 +1165,7 @@ export class RandomTeams { if (species.id === 'florges') return 'Flower Veil'; if (species.id === 'bombirdier' && !counter.get('Rock')) return 'Big Pecks'; if (species.id === 'scovillain') return 'Chlorophyll'; + if (species.id === 'regirock' || (species.id === 'carbink' && moves.has('irondefense'))) return 'Clear Body'; if (species.id === 'empoleon') return 'Competitive'; if (species.id === 'swampert' && !counter.get('Water') && !moves.has('flipturn')) return 'Damp'; if (species.id === 'thundurus' && (role === 'Offensive Protect' || moves.has('terablast'))) return 'Defiant'; @@ -1181,6 +1180,9 @@ export class RandomTeams { if (species.id === 'smeargle' && !counter.get('technician')) return 'Own Tempo'; if (species.id === 'zebstrika') return moves.has('thunderbolt') ? 'Lightning Rod' : 'Sap Sipper'; if (species.id === 'sandaconda' || (species.id === 'scrafty' && moves.has('rest'))) return 'Shed Skin'; + if (species.id === 'braviaryhisui') { + return (role === 'Setup Sweeper' || role === 'Doubles Wallbreaker') ? 'Sheer Force' : 'Tinted Lens'; + } if (species.id === 'cetitan' && (role === 'Wallbreaker' || isDoubles)) return 'Sheer Force'; if (species.id === 'charizard' && moves.has('sunnyday')) return 'Solar Power'; if (species.id === 'dipplin') return 'Sticky Hold'; @@ -1208,7 +1210,7 @@ export class RandomTeams { if (isDoubles) { if (species.id === 'gumshoos' || species.id === 'porygonz') return 'Adaptability'; if (species.id === 'farigiraf') return 'Armor Tail'; - if (['carbink', 'dragapult', 'regirock', 'tentacruel'].includes(species.id)) return 'Clear Body'; + if (['dragapult', 'tentacruel'].includes(species.id)) return 'Clear Body'; if (species.id === 'altaria') return 'Cloud Nine'; if (species.id === 'kilowattrel' || species.id === 'meowsticf') return 'Competitive'; if (species.id === 'armarouge' && !moves.has('meteorbeam')) return 'Flash Fire'; From 40a36c6f79b0d835ef8c6688e39adc82f509bacc Mon Sep 17 00:00:00 2001 From: Vinayak-Shukla <43382124+Vinayak-Shukla@users.noreply.github.com> Date: Mon, 17 Jun 2024 22:44:47 +0530 Subject: [PATCH 062/139] Scavenger Hunt Bug fix (#10331) * Scavenger Hunt Bug fix Once a user finished a hunt, upon refresh, they would get the scavenger hunt added back to their games list since they're present in the playerTable. Adding a check during RejoinGames to ignore players who're in scavengers and have completed the current game/hunt. * fixing lint error * removing scav-specific check * adding explanatory comment * fixed lint issue and added completed type definition to RoomGamePlayer * made suggested changes and fixed lint issues --- server/room-game.ts | 1 + server/rooms.ts | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/server/room-game.ts b/server/room-game.ts index e93e5620a6fe..0c725312b955 100644 --- a/server/room-game.ts +++ b/server/room-game.ts @@ -62,6 +62,7 @@ export class RoomGamePlayer { * `this.getUser().games`. */ readonly id: ID; + completed?: boolean; constructor(user: User | string | null, game: GameClass, num = 0) { this.num = num; if (!user) user = num ? `Player ${num}` : `Player`; diff --git a/server/rooms.ts b/server/rooms.ts index 273b983ed018..1914610df2ae 100644 --- a/server/rooms.ts +++ b/server/rooms.ts @@ -1396,7 +1396,8 @@ export class GlobalRoomState { for (const room of Rooms.rooms.values()) { const player = room.game && !room.game.ended && room.game.playerTable[user.id]; if (!player) continue; - + // prevents players from being re-added to games like Scavengers after they've finished + if (player.completed) continue; user.games.add(room.roomid); player.name = user.name; user.joinRoom(room.roomid); From 8819e60f9a01cede7471b534a2fb53a3a85674fc Mon Sep 17 00:00:00 2001 From: Karthik <32044378+Karthik99999@users.noreply.github.com> Date: Mon, 17 Jun 2024 17:05:16 -0400 Subject: [PATCH 063/139] Fix Roomlogs crash (#10352) * Fix Roomlogs crash * suggestions * Fix roomlogStream stuff --- server/roomlogs.ts | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/server/roomlogs.ts b/server/roomlogs.ts index 245d47070858..735cb1ddf6cd 100644 --- a/server/roomlogs.ts +++ b/server/roomlogs.ts @@ -126,11 +126,7 @@ export class Roomlog { } async setupRoomlogStream(sync = false) { if (this.roomlogStream === null || roomlogTable) return; - if (!Config.logchat) { - this.roomlogStream = null; - return; - } - if (this.roomid.startsWith('battle-')) { + if (!Config.logchat || this.roomid.startsWith('battle-')) { this.roomlogStream = null; return; } @@ -296,16 +292,14 @@ export class Roomlog { } async rename(newID: RoomID): Promise { await Rooms.Modlog.rename(this.roomid, newID); - this.roomid = newID; + const roomlogStreamExisted = this.roomlogStream !== null; + await this.destroy(); if (roomlogTable) { if (!(!Config.logchat || this.roomid.startsWith('battle-'))) { - await roomlogTable.updateAll({roomid: this.roomid})`WHERE roomid = ${this.roomid}`; + await roomlogTable.updateAll({roomid: newID})`WHERE roomid = ${this.roomid}`; } - return true; } else { const roomlogPath = `chat`; - const roomlogStreamExisted = this.roomlogStream !== null; - await this.destroy(); const [roomlogExists, newRoomlogExists] = await Promise.all([ Monitor.logPath(roomlogPath + `/${this.roomid}`).exists(), Monitor.logPath(roomlogPath + `/${newID}`).exists(), @@ -313,14 +307,15 @@ export class Roomlog { if (roomlogExists && !newRoomlogExists) { await Monitor.logPath(roomlogPath + `/${this.roomid}`).rename(Monitor.logPath(roomlogPath + `/${newID}`).path); } - Roomlogs.roomlogs.set(newID, this); if (roomlogStreamExisted) { this.roomlogStream = undefined; this.roomlogFilename = ""; await this.setupRoomlogStream(true); } - return true; } + Roomlogs.roomlogs.set(newID, this); + this.roomid = newID; + return true; } static async rollLogs() { if (Roomlogs.rollLogTimer === true) return; From fa2fcbefacd9ec28b920d1fe3a63da14f50ab6c0 Mon Sep 17 00:00:00 2001 From: Mia <49593536+mia-pi-git@users.noreply.github.com> Date: Tue, 18 Jun 2024 15:56:49 -0500 Subject: [PATCH 064/139] Artemis: Give drivers access to /am edithistory --- server/chat-plugins/abuse-monitor.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/server/chat-plugins/abuse-monitor.ts b/server/chat-plugins/abuse-monitor.ts index 2b43e0b9782a..103dae3858c3 100644 --- a/server/chat-plugins/abuse-monitor.ts +++ b/server/chat-plugins/abuse-monitor.ts @@ -1679,7 +1679,7 @@ export const commands: Chat.ChatCommands = { this.refreshPage('abusemonitor-settings'); }, edithistory(target, room, user) { - this.checkCan('globalban'); + this.checkCan('lock'); target = toID(target); if (!target) { return this.parse(`/help abusemonitor`); @@ -1688,7 +1688,7 @@ export const commands: Chat.ChatCommands = { }, ignoremodlog: { add(target, room, user) { - this.checkCan('globalban'); + this.checkCan('lock'); let targetUser: string; [targetUser, target] = this.splitOne(target).map(f => f.trim()); targetUser = toID(targetUser); @@ -1721,7 +1721,7 @@ export const commands: Chat.ChatCommands = { this.refreshPage(`abusemonitor-edithistory-${targetUser}`); }, remove(target, room, user) { - this.checkCan('globalban'); + this.checkCan('lock'); let [targetUser, rawNum] = this.splitOne(target).map(f => f.trim()); targetUser = toID(targetUser); const num = Number(rawNum); @@ -2312,7 +2312,7 @@ export const pages: Chat.PageTable = { return buf; }, async edithistory(query, user) { - this.checkCan('globalban'); + this.checkCan('lock'); const targetUser = toID(query[0]); if (!targetUser) { return this.errorReply(`Specify a user.`); From afa8c084d093b91a68677421e8dcab90f2542926 Mon Sep 17 00:00:00 2001 From: Leonard Craft III Date: Tue, 18 Jun 2024 19:32:57 -0500 Subject: [PATCH 065/139] Add skipped test for Protean submove interaction --- test/sim/abilities/protean.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/test/sim/abilities/protean.js b/test/sim/abilities/protean.js index f7d0b6847a23..305429a5b6db 100644 --- a/test/sim/abilities/protean.js +++ b/test/sim/abilities/protean.js @@ -22,6 +22,20 @@ describe('Protean', function () { assert(cinder.hasType('Fighting')); }); + it.skip(`should change the user's type for submoves to the type of that submove, not the move calling it`, function () { + battle = common.gen(6).createBattle([[ + {species: 'Wynaut', ability: 'protean', moves: ['sleeptalk', 'flamethrower']}, + ], [ + {species: 'Regieleki', moves: ['spore']}, + ]]); + + battle.makeChoices(); + const wynaut = battle.p1.active[0]; + console.log(battle.log); + assert(battle.log.every(line => !line.includes('|Normal|')), `It should not temporarily become Normal-type`); + assert(wynaut.hasType('Fire')); + }); + it(`should not change the user's type when using moves that fail earlier than Protean will activate`, function () { battle = common.createBattle([[ {species: 'Kecleon', ability: 'protean', moves: ['fling', 'suckerpunch', 'steelroller', 'aurawheel']}, From d91ffce48253cfb2311633bb14f4eb19d9fc861f Mon Sep 17 00:00:00 2001 From: dot-Comfey <84290266+dot-Comfey@users.noreply.github.com> Date: Thu, 20 Jun 2024 16:46:02 -0700 Subject: [PATCH 066/139] Add picnic mechanics to Cap Pikachu (#10345) --- data/learnsets.ts | 21 +++++---------------- sim/dex-species.ts | 15 +++++++++++---- sim/team-validator.ts | 4 ++++ test/sim/team-validator/breeding.js | 1 + 4 files changed, 21 insertions(+), 20 deletions(-) diff --git a/data/learnsets.ts b/data/learnsets.ts index 35cb913b03f3..f22f78cb11d7 100644 --- a/data/learnsets.ts +++ b/data/learnsets.ts @@ -30302,29 +30302,23 @@ export const Learnsets: {[k: string]: LearnsetData} = { ursalunabloodmoon: { learnset: { avalanche: ["9M"], - bellydrum: ["9E"], bloodmoon: ["9L70", "9S0"], bodypress: ["9M"], bodyslam: ["9M"], brickbreak: ["9M"], bulldoze: ["9M"], calmmind: ["9M", "9S0"], - closecombat: ["9E"], - counter: ["9E"], - crosschop: ["9E"], - crunch: ["9M", "9E"], + crunch: ["9M"], dig: ["9M"], - doubleedge: ["9M", "9E"], + doubleedge: ["9M"], earthpower: ["9M", "9L48", "9S0"], earthquake: ["9M"], endure: ["9M"], facade: ["9M"], - faketears: ["9E"], firepunch: ["9M"], fling: ["9M"], focusblast: ["9M"], focuspunch: ["9M"], - furycutter: ["9E"], furyswipes: ["9L8"], gigaimpact: ["9M"], gunkshot: ["9M"], @@ -30341,11 +30335,10 @@ export const Learnsets: {[k: string]: LearnsetData} = { leer: ["9L1"], lick: ["9L1"], lowkick: ["9M"], - metalclaw: ["9M", "9E"], + metalclaw: ["9M"], moonblast: ["9L56"], moonlight: ["9L1"], mudshot: ["9M"], - nightslash: ["9E"], payback: ["9L13"], playnice: ["9L25"], protect: ["9M"], @@ -30357,7 +30350,6 @@ export const Learnsets: {[k: string]: LearnsetData} = { scaryface: ["9M", "9L35"], scratch: ["9L1"], seedbomb: ["9M"], - seismictoss: ["9E"], shadowclaw: ["9M"], slash: ["9L22", "9S0"], sleeptalk: ["9M"], @@ -30378,7 +30370,6 @@ export const Learnsets: {[k: string]: LearnsetData} = { trailblaze: ["9M"], uproar: ["9M"], vacuumwave: ["9M"], - yawn: ["9E"], }, eventData: [ {generation: 9, level: 70, nature: "Hardy", perfectIVs: 3, moves: ["bloodmoon", "earthpower", "slash", "calmmind"]}, @@ -68363,7 +68354,6 @@ export const Learnsets: {[k: string]: LearnsetData} = { bubble: ["7L1"], chillingwater: ["9M"], confide: ["7M"], - counter: ["9E"], darkpulse: ["9M", "7M"], dig: ["9M"], doubleteam: ["9L56", "7M", "7L56", "7S0"], @@ -68401,7 +68391,6 @@ export const Learnsets: {[k: string]: LearnsetData} = { quickattack: ["9L1", "7L1"], raindance: ["9M", "7M"], rest: ["9M", "7M"], - retaliate: ["9E"], return: ["7M"], rockslide: ["9M", "7M"], rocktomb: ["9M", "7M"], @@ -68416,7 +68405,7 @@ export const Learnsets: {[k: string]: LearnsetData} = { snatch: ["7T"], snore: ["7T"], snowscape: ["9M"], - spikes: ["9M", "9L28", "9E", "7L28"], + spikes: ["9M", "9L28", "7L28"], spite: ["7T"], substitute: ["9M", "9L42", "7M", "7L42"], surf: ["9M", "7M"], @@ -68429,7 +68418,7 @@ export const Learnsets: {[k: string]: LearnsetData} = { terablast: ["9M"], thief: ["9M", "7M"], toxic: ["7M"], - toxicspikes: ["9M", "9E"], + toxicspikes: ["9M"], trailblaze: ["9M"], upperhand: ["9M"], uturn: ["9M", "7M"], diff --git a/sim/dex-species.ts b/sim/dex-species.ts index c82e4a9fa533..97c1c258cfee 100644 --- a/sim/dex-species.ts +++ b/sim/dex-species.ts @@ -592,7 +592,7 @@ export class DexSpecies { const learnset = this.getLearnsetData(species.id); if (learnset.learnset) { out.push(learnset as any); - species = this.learnsetParent(species); + species = this.learnsetParent(species, true); continue; } @@ -623,7 +623,7 @@ export class DexSpecies { return out; } - learnsetParent(species: Species) { + learnsetParent(species: Species, checkingMoves = false) { // Own Tempo Rockruff and Battle Bond Greninja are special event formes // that are visually indistinguishable from their base forme but have // different learnsets. To prevent a leak, we make them show up as their @@ -633,8 +633,6 @@ export class DexSpecies { return this.get(species.baseSpecies); } else if (species.name === 'Lycanroc-Dusk') { return this.get('Rockruff-Dusk'); - } else if (species.name === 'Greninja-Bond') { - return null; } else if (species.prevo) { // there used to be a check for Hidden Ability here, but apparently it's unnecessary // Shed Skin Pupitar can definitely evolve into Unnerve Tyranitar @@ -644,6 +642,15 @@ export class DexSpecies { } else if (species.changesFrom && species.baseSpecies !== 'Kyurem') { // For Pokemon like Rotom and Necrozma whose movesets are extensions are their base formes return this.get(species.changesFrom); + } else if ( + checkingMoves && !species.prevo && species.baseSpecies && this.get(species.baseSpecies).prevo + ) { + // For Pokemon like Cap Pikachu, who should be able to have egg moves in Gen 9 + let baseEvo = this.get(species.baseSpecies); + while (baseEvo.prevo) { + baseEvo = this.get(baseEvo.prevo); + } + return baseEvo; } return null; } diff --git a/sim/team-validator.ts b/sim/team-validator.ts index 775a8365f04e..5fae39667918 100644 --- a/sim/team-validator.ts +++ b/sim/team-validator.ts @@ -2421,6 +2421,8 @@ export class TeamValidator { } } + if (checkingPrevo && !originalSpecies.prevo && dex.gen < 9) break; + let sources = learnset[moveid] || []; if (moveid === 'sketch') { sketch = true; @@ -2468,6 +2470,8 @@ export class TeamValidator { continue; } + if (checkingPrevo && !originalSpecies.prevo && (learned.charAt(1) !== 'E' || learnedGen < 9)) continue; + // redundant if (learnedGen <= moveSources.sourcesBefore) continue; diff --git a/test/sim/team-validator/breeding.js b/test/sim/team-validator/breeding.js index a39178c7d324..98a7572c4750 100644 --- a/test/sim/team-validator/breeding.js +++ b/test/sim/team-validator/breeding.js @@ -233,6 +233,7 @@ describe('Team Validator', function () { team = [ {species: 'ursalunabloodmoon', ability: 'mindseye', moves: ['yawn', 'bellydrum'], evs: {hp: 1}}, {species: 'greninjabond', ability: 'battlebond', moves: ['counter', 'switcheroo'], evs: {hp: 1}}, + {species: 'pikachualola', ability: 'static', moves: ['wish', 'fakeout'], evs: {hp: 1}}, ]; assert.legalTeam(team, 'gen9anythinggoes'); }); From c3adf047fc100520dce52d747adde3a7e1ab452e Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Thu, 20 Jun 2024 18:28:19 -0600 Subject: [PATCH 067/139] Godly Gift: Update restrictions and bans --- config/formats.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/config/formats.ts b/config/formats.ts index 380de7953f7b..25a5d98d8d0d 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -661,15 +661,15 @@ export const Formats: FormatList = [ mod: 'gen9', ruleset: ['Standard OMs', 'Sleep Moves Clause', 'Godly Gift Mod'], banlist: [ - 'Blissey', 'Calyrex-Shadow', 'Chansey', 'Deoxys-Attack', 'Koraidon', 'Miraidon', 'Arena Trap', 'Huge Power', 'Moody', 'Pure Power', 'Shadow Tag', + 'Blissey', 'Calyrex-Shadow', 'Chansey', 'Deoxys-Attack', 'Koraidon', 'Miraidon', 'Zacian-Crowned', 'Arena Trap', '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: [ - 'Annihilape', 'Arceus', 'Calyrex-Ice', 'Chi-Yu', 'Crawdaunt', 'Deoxys-Base', 'Deoxys-Speed', 'Dialga', 'Dialga-Origin', 'Dragapult', 'Espathra', 'Eternatus', - 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Gliscor', 'Groudon', 'Hawlucha', 'Ho-Oh', 'Iron Bundle', 'Kingambit', 'Kyogre', 'Kyurem', 'Kyurem-Black', - 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Ogerpon-Hearthflame', 'Palafin', 'Palkia', 'Palkia-Origin', - 'Rayquaza', 'Regieleki', 'Reshiram', 'Shaymin-Sky', 'Smeargle', 'Solgaleo', 'Terapagos', 'Toxapex', 'Ursaluna', 'Ursaluna-Bloodmoon', 'Volcarona', 'Zacian', - 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', + 'Annihilape', 'Arceus', 'Baxcalibur', 'Calyrex-Ice', 'Chi-Yu', 'Chien-Pao', 'Crawdaunt', 'Deoxys-Base', 'Deoxys-Speed', 'Dialga', 'Dialga-Origin', 'Dragapult', + 'Espathra', 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Gliscor', 'Groudon', 'Hawlucha', 'Ho-Oh', 'Iron Bundle', 'Kingambit', 'Kyogre', 'Kyurem', + 'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Ogerpon-Hearthflame', 'Palafin', 'Palkia', + 'Palkia-Origin', 'Rayquaza', 'Regieleki', 'Reshiram', 'Shaymin-Sky', 'Smeargle', 'Solgaleo', 'Terapagos', 'Toxapex', 'Ursaluna', 'Ursaluna-Bloodmoon', 'Volcarona', + 'Zacian', 'Zamazenta-Crowned', 'Zekrom', ], }, From d954e8f350be665d25fbc0421df5bc3b1a2f2c70 Mon Sep 17 00:00:00 2001 From: dot-Comfey <84290266+dot-Comfey@users.noreply.github.com> Date: Fri, 21 Jun 2024 05:35:22 -0700 Subject: [PATCH 068/139] Fix crash (#10360) --- sim/team-validator.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/sim/team-validator.ts b/sim/team-validator.ts index 5fae39667918..6f5b30dfa09d 100644 --- a/sim/team-validator.ts +++ b/sim/team-validator.ts @@ -2421,7 +2421,9 @@ export class TeamValidator { } } - if (checkingPrevo && !originalSpecies.prevo && dex.gen < 9) break; + const formeCantInherit = checkingPrevo && !originalSpecies.prevo && + (!originalSpecies.changesFrom || originalSpecies.name === "Greninja-Ash"); + if (formeCantInherit && dex.gen < 9) break; let sources = learnset[moveid] || []; if (moveid === 'sketch') { @@ -2470,7 +2472,7 @@ export class TeamValidator { continue; } - if (checkingPrevo && !originalSpecies.prevo && (learned.charAt(1) !== 'E' || learnedGen < 9)) continue; + if (formeCantInherit && (learned.charAt(1) !== 'E' || learnedGen < 9)) continue; // redundant if (learnedGen <= moveSources.sourcesBefore) continue; From 3e37df09cde846f1f3dca3298241f4d280333587 Mon Sep 17 00:00:00 2001 From: adrivrie Date: Sat, 22 Jun 2024 03:30:38 +0200 Subject: [PATCH 069/139] /bssfactory: Fix ability display (#10357) --- server/chat-plugins/randombattles/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/chat-plugins/randombattles/index.ts b/server/chat-plugins/randombattles/index.ts index 133156156ce2..9f9e5d9c636a 100644 --- a/server/chat-plugins/randombattles/index.ts +++ b/server/chat-plugins/randombattles/index.ts @@ -329,7 +329,7 @@ function battleFactorySets(species: string | Species, tier: string | null, gen = buf += `
    Set ${i + 1} (${set.weight}%)`; buf += `
      `; buf += `
    • ${Dex.forFormat(format).species.get(set.species).name} @ ${set.item.map(formatItem).join(" / ")}
    • `; - buf += `
    • Ability: ${formatAbility(set.ability)}
    • `; + buf += `
    • Ability: ${set.ability.map(formatAbility).join(" / ")}
    • `; buf += `
    • Level: 50
    • `; buf += `
    • Tera Type: ${set.teraType.map(formatType).join(' / ')}
    • `; if (set.evs) { From ec7746682091fea070009cc6f1e37ca9235643a6 Mon Sep 17 00:00:00 2001 From: quziel Date: Fri, 21 Jun 2024 21:07:43 -0500 Subject: [PATCH 070/139] CAP: Remove Draining Kiss from Chuggalong (#10358) --- data/learnsets.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/data/learnsets.ts b/data/learnsets.ts index f22f78cb11d7..91b9ae194d4f 100644 --- a/data/learnsets.ts +++ b/data/learnsets.ts @@ -99475,7 +99475,6 @@ export const Learnsets: {[k: string]: LearnsetData} = { destinybond: ["9L1"], dracometeor: ["9M"], dragontail: ["9M"], - drainingkiss: ["9M"], encore: ["9M"], endure: ["9M"], facade: ["9M"], From 011ff744625e17674d2223cfcc3e45aec06a1adc Mon Sep 17 00:00:00 2001 From: bilalafzalshafi <136026279+bilalafzalshafi@users.noreply.github.com> Date: Sat, 22 Jun 2024 08:09:47 +0500 Subject: [PATCH 071/139] Fix Metronome (item) with calling moves (#10361) --- data/items.ts | 1 + data/moves.ts | 10 +++++++++- sim/dex-moves.ts | 1 + test/sim/items/metronome.js | 2 +- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/data/items.ts b/data/items.ts index 60f77fd76ff1..02889cd87847 100644 --- a/data/items.ts +++ b/data/items.ts @@ -3652,6 +3652,7 @@ export const Items: {[itemid: string]: ItemData} = { pokemon.removeVolatile('metronome'); return; } + if (move.callsMove) return; if (this.effectState.lastMove === move.id && pokemon.moveLastTurnResult) { this.effectState.numConsecutive++; } else if (pokemon.volatiles['twoturnmove']) { diff --git a/data/moves.ts b/data/moves.ts index 06c70b45a6cb..6108a806c43a 100644 --- a/data/moves.ts +++ b/data/moves.ts @@ -650,6 +650,7 @@ export const Moves: {[moveid: string]: MoveData} = { } this.actions.useMove(randomMove, target); }, + callsMove: true, secondary: null, target: "self", type: "Normal", @@ -2948,6 +2949,7 @@ export const Moves: {[moveid: string]: MoveData} = { } this.actions.useMove(move.id, pokemon); }, + callsMove: true, secondary: null, target: "self", type: "Normal", @@ -11923,7 +11925,8 @@ export const Moves: {[moveid: string]: MoveData} = { priority: 0, flags: { protect: 1, bypasssub: 1, - failencore: 1, failmefirst: 1, nosleeptalk: 1, noassist: 1, failcopycat: 1, failmimic: 1, failinstruct: 1, + failencore: 1, failmefirst: 1, nosleeptalk: 1, noassist: 1, + failcopycat: 1, failmimic: 1, failinstruct: 1, }, onTryHit(target, pokemon) { const action = this.queue.willMove(target); @@ -11944,6 +11947,7 @@ export const Moves: {[moveid: string]: MoveData} = { return this.chainModify(1.5); }, }, + callsMove: true, secondary: null, target: "adjacentFoe", type: "Normal", @@ -12202,6 +12206,7 @@ export const Moves: {[moveid: string]: MoveData} = { source.side.lastSelectedMove = this.toID(randomMove); this.actions.useMove(randomMove, target); }, + callsMove: true, secondary: null, target: "self", type: "Normal", @@ -12460,6 +12465,7 @@ export const Moves: {[moveid: string]: MoveData} = { this.actions.useMove(move.id, pokemon, target); return null; }, + callsMove: true, secondary: null, target: "normal", type: "Flying", @@ -13046,6 +13052,7 @@ export const Moves: {[moveid: string]: MoveData} = { this.actions.useMove(move, pokemon, target); return null; }, + callsMove: true, secondary: null, target: "normal", type: "Normal", @@ -17554,6 +17561,7 @@ export const Moves: {[moveid: string]: MoveData} = { } this.actions.useMove(randomMove, pokemon); }, + callsMove: true, secondary: null, target: "self", type: "Normal", diff --git a/sim/dex-moves.ts b/sim/dex-moves.ts index 0bbc84bc81f0..bfcb3946f569 100644 --- a/sim/dex-moves.ts +++ b/sim/dex-moves.ts @@ -266,6 +266,7 @@ export interface MoveData extends EffectData, MoveEventMethods, HitEffect { */ tracksTarget?: boolean; willCrit?: boolean; + callsMove?: boolean; // Mechanics flags // --------------- diff --git a/test/sim/items/metronome.js b/test/sim/items/metronome.js index 799a17187a11..893233c43386 100644 --- a/test/sim/items/metronome.js +++ b/test/sim/items/metronome.js @@ -97,7 +97,7 @@ describe('Metronome (item)', function () { assert.bounded(damage, [80, 95], `Solar Beam should be Metronome 1 boosted`); }); - it.skip(`should use called moves to determine the Metronome multiplier`, function () { + it(`should use called moves to determine the Metronome multiplier`, function () { battle = common.createBattle([[ {species: 'goomy', item: 'metronome', moves: ['copycat', 'surf']}, ], [ From 35e5fbbd72dd2fa9f42f292be4d4cdbb4686a933 Mon Sep 17 00:00:00 2001 From: Leonard Craft III Date: Fri, 21 Jun 2024 22:15:38 -0500 Subject: [PATCH 072/139] Fix Protean/Libero submove interaction --- data/abilities.ts | 4 ++-- data/mods/gen8/abilities.ts | 4 ++-- test/sim/abilities/protean.js | 3 +-- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/data/abilities.ts b/data/abilities.ts index f38a525479a6..0d208495bbd4 100644 --- a/data/abilities.ts +++ b/data/abilities.ts @@ -2271,7 +2271,7 @@ export const Abilities: {[abilityid: string]: AbilityData} = { libero: { onPrepareHit(source, target, move) { if (this.effectState.libero) return; - if (move.hasBounced || move.flags['futuremove'] || move.sourceEffect === 'snatch') return; + if (move.hasBounced || move.flags['futuremove'] || move.sourceEffect === 'snatch' || move.callsMove) return; const type = move.type; if (type && type !== '???' && source.getTypes().join() !== type) { if (!source.setType(type)) return; @@ -3415,7 +3415,7 @@ export const Abilities: {[abilityid: string]: AbilityData} = { protean: { onPrepareHit(source, target, move) { if (this.effectState.protean) return; - if (move.hasBounced || move.flags['futuremove'] || move.sourceEffect === 'snatch') return; + if (move.hasBounced || move.flags['futuremove'] || move.sourceEffect === 'snatch' || move.callsMove) return; const type = move.type; if (type && type !== '???' && source.getTypes().join() !== type) { if (!source.setType(type)) return; diff --git a/data/mods/gen8/abilities.ts b/data/mods/gen8/abilities.ts index 3d343babdc72..815bac2c15e3 100644 --- a/data/mods/gen8/abilities.ts +++ b/data/mods/gen8/abilities.ts @@ -552,7 +552,7 @@ export const Abilities: {[k: string]: ModdedAbilityData} = { libero: { inherit: true, onPrepareHit(source, target, move) { - if (move.hasBounced || move.flags['futuremove'] || move.sourceEffect === 'snatch') return; + if (move.hasBounced || move.flags['futuremove'] || move.sourceEffect === 'snatch' || move.callsMove) return; const type = move.type; if (type && type !== '???' && source.getTypes().join() !== type) { if (!source.setType(type)) return; @@ -773,7 +773,7 @@ export const Abilities: {[k: string]: ModdedAbilityData} = { protean: { inherit: true, onPrepareHit(source, target, move) { - if (move.hasBounced || move.flags['futuremove'] || move.sourceEffect === 'snatch') return; + if (move.hasBounced || move.flags['futuremove'] || move.sourceEffect === 'snatch' || move.callsMove) return; const type = move.type; if (type && type !== '???' && source.getTypes().join() !== type) { if (!source.setType(type)) return; diff --git a/test/sim/abilities/protean.js b/test/sim/abilities/protean.js index 305429a5b6db..8d91bbe3cea1 100644 --- a/test/sim/abilities/protean.js +++ b/test/sim/abilities/protean.js @@ -22,7 +22,7 @@ describe('Protean', function () { assert(cinder.hasType('Fighting')); }); - it.skip(`should change the user's type for submoves to the type of that submove, not the move calling it`, function () { + it(`should change the user's type for submoves to the type of that submove, not the move calling it`, function () { battle = common.gen(6).createBattle([[ {species: 'Wynaut', ability: 'protean', moves: ['sleeptalk', 'flamethrower']}, ], [ @@ -31,7 +31,6 @@ describe('Protean', function () { battle.makeChoices(); const wynaut = battle.p1.active[0]; - console.log(battle.log); assert(battle.log.every(line => !line.includes('|Normal|')), `It should not temporarily become Normal-type`); assert(wynaut.hasType('Fire')); }); From 39395fb4cb60efc822bcfbeb9d375335a3b09293 Mon Sep 17 00:00:00 2001 From: dot-Comfey <84290266+dot-Comfey@users.noreply.github.com> Date: Sat, 22 Jun 2024 14:28:39 -0700 Subject: [PATCH 073/139] Fix egg move legality for some male-only Pokemon (#9895) --- data/pokedex.ts | 3 +++ sim/dex-species.ts | 2 ++ sim/team-validator.ts | 20 +++++++++++++++++--- test/sim/team-validator/breeding.js | 9 ++++++++- 4 files changed, 30 insertions(+), 4 deletions(-) diff --git a/data/pokedex.ts b/data/pokedex.ts index 945d20647b55..5d69d46a946a 100644 --- a/data/pokedex.ts +++ b/data/pokedex.ts @@ -937,6 +937,7 @@ export const Pokedex: {[speciesid: string]: SpeciesData} = { color: "Purple", evos: ["Nidorino"], eggGroups: ["Monster", "Field"], + mother: 'nidoranf', }, nidorino: { num: 33, @@ -5823,6 +5824,7 @@ export const Pokedex: {[speciesid: string]: SpeciesData} = { weightkg: 17.7, color: "Gray", eggGroups: ["Bug", "Human-Like"], + mother: 'illumise', }, illumise: { num: 314, @@ -15904,6 +15906,7 @@ export const Pokedex: {[speciesid: string]: SpeciesData} = { eggGroups: ["Fairy"], otherFormes: ["Indeedee-F"], formeOrder: ["Indeedee", "Indeedee-F"], + mother: 'indeedeef', }, indeedeef: { num: 876, diff --git a/sim/dex-species.ts b/sim/dex-species.ts index 97c1c258cfee..8789f384a229 100644 --- a/sim/dex-species.ts +++ b/sim/dex-species.ts @@ -175,6 +175,8 @@ export class Species extends BasicEffect implements Readonly= 6 && !setSources.levelUpEggMoves) return true; + if (!getAll && eggGen >= 6 && !setSources.levelUpEggMoves && !species.mother) return true; let eggMoves = setSources.limitedEggMoves; if (eggGen === 3) eggMoves = eggMoves?.filter(eggMove => !setSources.pomegEggMoves?.includes(eggMove)); @@ -1493,6 +1493,15 @@ export class TeamValidator { return true; } + motherCanLearn(species: ID, move: ID) { + if (!species) return false; + const fullLearnset = this.dex.species.getFullLearnset(species); + for (const {learnset} of fullLearnset) { + if (learnset[move]) return true; + } + return false; + } + validateForme(set: PokemonSet) { const dex = this.dex; const name = set.name || set.species; @@ -2528,9 +2537,14 @@ export class TeamValidator { } else if (level >= 5 && learnedGen === 3 && species.canHatch) { // Pomeg Glitch learned = learnedGen + 'Epomeg'; - } else if ((!species.gender || species.gender === 'F') && + } else if (species.gender !== 'N' && learnedGen >= 2 && species.canHatch && !setSources.isFromPokemonGo) { // available as egg move + if (species.gender === 'M' && !this.motherCanLearn(toID(species.mother), moveid)) { + // male-only Pokemon can have level-up egg moves if it can have a mother that learns the move + cantLearnReason = `is learned at level ${parseInt(learned.substr(2))}.`; + continue; + } learned = learnedGen + 'Eany'; // falls through to E check below } else { @@ -2578,7 +2592,7 @@ export class TeamValidator { // Pomeg glitched moves have to be from an egg but since they aren't true egg moves, // there should be no breeding restrictions moveSources.pomegEggMoves = [move.id]; - } else if (learnedGen < 6) { + } else if (learnedGen < 6 || (species.mother && !this.motherCanLearn(toID(species.mother), moveid))) { limitedEggMove = move.id; } learned = learnedGen + 'E' + (species.prevo ? species.id : ''); diff --git a/test/sim/team-validator/breeding.js b/test/sim/team-validator/breeding.js index 98a7572c4750..ae1f02dba01e 100644 --- a/test/sim/team-validator/breeding.js +++ b/test/sim/team-validator/breeding.js @@ -222,13 +222,20 @@ describe('Team Validator', function () { assert.legalTeam(team, 'gen4ou'); }); - it.skip('should reject Volbeat with both Lunge and Dizzy Punch in Gen 7', function () { + it('should reject Volbeat with both Lunge and Dizzy Punch in Gen 7', function () { team = [ {species: 'volbeat', ability: 'swarm', moves: ['lunge', 'dizzypunch'], evs: {hp: 1}}, ]; assert.false.legalTeam(team, 'gen7anythinggoes'); }); + it('should allow level 5 Indeedee-M with Disarming Voice', function () { + team = [ + {species: 'indeedee', level: 5, ability: 'innerfocus', moves: ['disarmingvoice'], evs: {hp: 1}}, + ]; + assert.legalTeam(team, 'gen8ou'); + }); + it('should allow egg moves on event formes in Gen 9', function () { team = [ {species: 'ursalunabloodmoon', ability: 'mindseye', moves: ['yawn', 'bellydrum'], evs: {hp: 1}}, From f0cfceb09d9c1576c646bfef49e6a646c86c5e21 Mon Sep 17 00:00:00 2001 From: Guangcong Luo Date: Fri, 10 May 2024 00:59:06 -0700 Subject: [PATCH 074/139] Comment chat-formatter better --- server/chat-formatter.ts | 59 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/server/chat-formatter.ts b/server/chat-formatter.ts index c3425eee1be1..97338fc64042 100644 --- a/server/chat-formatter.ts +++ b/server/chat-formatter.ts @@ -60,6 +60,16 @@ REGEXFREE SOURCE FOR LINKREGEX */ export const linkRegex = /(?:(?:https?:\/\/[a-z0-9-]+(?:\.[a-z0-9-]+)*|www\.[a-z0-9-]+(?:\.[a-z0-9-]+)+|\b[a-z0-9-]+(?:\.[a-z0-9-]+)*\.(?:(?:com?|org|net|edu|info|us|jp)\b|[a-z]{2,3}(?=:[0-9]|\/)))(?::[0-9]+)?(?:\/(?:(?:[^\s()&<>]|&|"|\((?:[^\\s()<>&]|&)*\))*(?:[^\s()[\]{}".,!?;:&<>*`^~\\]|\((?:[^\s()<>&]|&)*\)))?)?|[a-z0-9.]+@[a-z0-9-]+(?:\.[a-z0-9-]+)*\.[a-z]{2,})(?![^ ]*>)/ig; +/** + * A span is a part of the text that's formatted. In the text: + * + * Hi, **this** is an example. + * + * The word `this` is a `*` span. Many spans are just a symbol repeated, and + * that symbol is the span type, but also many are more complicated. + * For an explanation of all of these, see the `TextFormatter#get` function + * implementation. + */ type SpanType = '_' | '*' | '~' | '^' | '\\' | '|' | '<' | '[' | '`' | 'a' | 'spoiler' | '>' | '('; type FormatSpan = [SpanType, number]; @@ -122,6 +132,15 @@ class TextFormatter { return this.str.charAt(start); } + /** + * We've encountered a possible start for a span. It's pushed onto our span + * stack. + * + * The span stack saves the start position so it can be replaced with HTML + * if we find an end for the span, but we don't actually replace it until + * `closeSpan` is called, so nothing happens (it stays plaintext) if no end + * is found. + */ pushSpan(spanType: SpanType, start: number, end: number) { this.pushSlice(start); this.stack.push([spanType, this.buffers.length]); @@ -155,7 +174,8 @@ class TextFormatter { } /** - * Attempt to close a span. + * We've encountered a possible end for a span. If it's in the span stack, + * we transform it into HTML. */ closeSpan(spanType: SpanType, start: number, end: number) { // loop backwards @@ -230,9 +250,15 @@ class TextFormatter { return encodeURIComponent(component); } + /** + * Handles special cases. + */ runLookahead(spanType: SpanType, start: number) { switch (spanType) { case '`': + // code span. Not only are the contents not formatted, but + // the start and end delimiters must match in length. + // ``Neither `this` nor ```this``` end this code span.`` { let delimLength = 0; let i = start; @@ -274,6 +300,11 @@ class TextFormatter { } return true; case '[': + // Link span. Several possiblilities: + // [[text ]] - a link with custom text + // [[search term]] - Google search + // [[wiki: search term]] - Wikipedia search + // [[pokemon: species name]] - icon (also item:, type:, category:) { if (this.slice(start, start + 2) !== '[[') return false; let i = start + 2; @@ -352,6 +383,9 @@ class TextFormatter { } return true; case 'a': + // URL span. Skip to the end of the link - where `` is. + // Nothing inside should be formatted further (obviously we don't want + // `example.com/__foo__` to turn `foo` italic). { let i = start + 1; while (this.at(i) !== '/' || this.at(i + 1) !== 'a' || this.at(i + 2) !== '>') i++; // @@ -375,7 +409,10 @@ class TextFormatter { case '^': case '\\': case '|': + // Must be exactly two chars long. if (this.at(i + 1) === char && this.at(i + 2) !== char) { + // This is a completely normal two-char span. Close it if it's + // already open, open it if it's not. if (!(this.at(i - 1) !== ' ' && this.closeSpan(char, i, i + 2))) { if (this.at(i + 2) !== ' ') this.pushSpan(char, i, i + 2); } @@ -387,9 +424,11 @@ class TextFormatter { while (this.at(i + 1) === char) i++; break; case '(': + // `(` span - does nothing except end spans this.stack.push(['(', -1]); break; case ')': + // end of `(` span this.closeParenSpan(i); if (i < this.offset) { i = this.offset - 1; @@ -397,6 +436,9 @@ class TextFormatter { } break; case '`': + // ` ``code`` ` span. Uses lookahead because its contents are not + // formatted. + // Must be at least two `` ` `` in a row. if (this.at(i + 1) === '`') this.runLookahead('`', i); if (i < this.offset) { i = this.offset - 1; @@ -405,6 +447,9 @@ class TextFormatter { while (this.at(i + 1) === '`') i++; break; case '[': + // `[` (link) span. Uses lookahead because it might contain a + // URL which can't be formatted, or search terms that can't be + // formatted. this.runLookahead('[', i); if (i < this.offset) { i = this.offset - 1; @@ -413,6 +458,9 @@ class TextFormatter { while (this.at(i + 1) === '[') i++; break; case ':': + // Looks behind for `spoiler:` or `spoilers:`. Spoiler spans + // are also weird because they don't require an ending symbol, + // although that's not handled here. if (i < 7) break; if (this.slice(i - 7, i + 1).toLowerCase() === 'spoiler:' || this.slice(i - 8, i + 1).toLowerCase() === 'spoilers:') { @@ -421,11 +469,16 @@ class TextFormatter { } break; case '&': // escaped '<' or '>' + // greentext or roomid if (i === beginningOfLine && this.slice(i, i + 4) === '>') { + // greentext span, normal except it lacks an ending span + // check for certain emoticons like `>_>` or `>w<` if (!"._/=:;".includes(this.at(i + 4)) && !['w<', 'w>'].includes(this.slice(i + 4, i + 9))) { this.pushSpan('>', i, i); } } else { + // completely normal `<>` span + // uses lookahead because roomids can't be formatted. this.runLookahead('<', i); } if (i < this.offset) { @@ -435,6 +488,9 @@ class TextFormatter { while (this.slice(i + 1, i + 5) === 'lt;&') i += 4; break; case '<': // guaranteed to be `); From 262160e8e3b36473732b88a198ed8981dbd37668 Mon Sep 17 00:00:00 2001 From: Guangcong Luo Date: Tue, 14 May 2024 08:38:28 -0700 Subject: [PATCH 075/139] Add syntax mode for chat-formatter This adds support for a chat-formatter mode that retains the syntax, for use in Discord-style syntax highlighting WYSIWYM editors. --- server/chat-formatter.ts | 83 ++++++++++++++++++++++++++++------------ 1 file changed, 59 insertions(+), 24 deletions(-) diff --git a/server/chat-formatter.ts b/server/chat-formatter.ts index 97338fc64042..0b6c12175548 100644 --- a/server/chat-formatter.ts +++ b/server/chat-formatter.ts @@ -70,7 +70,7 @@ export const linkRegex = /(?:(?:https?:\/\/[a-z0-9-]+(?:\.[a-z0-9-]+)*|www\.[a-z * For an explanation of all of these, see the `TextFormatter#get` function * implementation. */ -type SpanType = '_' | '*' | '~' | '^' | '\\' | '|' | '<' | '[' | '`' | 'a' | 'spoiler' | '>' | '('; +type SpanType = '_' | '*' | '~' | '^' | '\\' | '|' | '<' | '[' | '`' | 'a' | 'u' | 'spoiler' | '>' | '('; type FormatSpan = [SpanType, number]; @@ -78,12 +78,16 @@ class TextFormatter { readonly str: string; readonly buffers: string[]; readonly stack: FormatSpan[]; + /** Allows access to special formatting (links without URL preview, pokemon icons) */ readonly isTrusted: boolean; + /** Replace \n with
      */ readonly replaceLinebreaks: boolean; + /** Discord-style WYSIWYM output; markup characters are in `` */ + readonly showSyntax: boolean; /** offset of str that's been parsed so far */ offset: number; - constructor(str: string, isTrusted = false, replaceLinebreaks = false) { + constructor(str: string, isTrusted = false, replaceLinebreaks = false, showSyntax = false) { // escapeHTML, without escaping / str = `${str}` .replace(/&/g, '&') @@ -94,6 +98,7 @@ class TextFormatter { // filter links first str = str.replace(linkRegex, uri => { + if (showSyntax) return `${uri}`; let fulluri; if (/^[a-z0-9.]+@/ig.test(uri)) { fulluri = 'mailto:' + uri; @@ -120,6 +125,7 @@ class TextFormatter { this.stack = []; this.isTrusted = isTrusted; this.replaceLinebreaks = this.isTrusted || replaceLinebreaks; + this.showSyntax = showSyntax; this.offset = 0; } // debugAt(i=0, j=i+1) { console.log(`${this.slice(0, i)}[${this.slice(i, j)}]${this.slice(j, this.str.length)}`); } @@ -201,11 +207,12 @@ class TextFormatter { case '~': tagName = 's'; break; case '^': tagName = 'sup'; break; case '\\': tagName = 'sub'; break; - case '|': tagName = 'span'; attrs = ' class="spoiler"'; break; + case '|': tagName = 'span'; attrs = (this.showSyntax ? ' class="spoiler-shown"' : ' class="spoiler"'); break; } + const syntax = (this.showSyntax ? `${spanType}${spanType}` : ''); if (tagName) { - this.buffers[startIndex] = `<${tagName}${attrs}>`; - this.buffers.push(``); + this.buffers[startIndex] = `${syntax}<${tagName}${attrs}>`; + this.buffers.push(`${syntax}`); this.offset = end; } return true; @@ -223,7 +230,7 @@ class TextFormatter { switch (span[0]) { case 'spoiler': this.buffers.push(``); - this.buffers[span[1]] = ``; + this.buffers[span[1]] = (this.showSyntax ? `` : ``); break; case '>': this.buffers.push(``); @@ -279,9 +286,9 @@ class TextFormatter { i++; } if (curDelimLength !== delimLength) return false; + const end = i; // matching delims found this.pushSlice(start); - this.buffers.push(``); let innerStart = start + delimLength; let innerEnd = i - delimLength; if (innerStart + 1 >= innerEnd) { @@ -294,9 +301,12 @@ class TextFormatter { } else if (this.at(innerEnd - 1) === ' ' && this.at(innerEnd - 2) === '`') { innerEnd--; // strip ending space } + if (this.showSyntax) this.buffers.push(`${this.slice(start, innerStart)}`); + this.buffers.push(``); this.buffers.push(this.slice(innerStart, innerEnd)); this.buffers.push(``); - this.offset = i; + if (this.showSyntax) this.buffers.push(`${this.slice(innerEnd, end)}`); + this.offset = end; } return true; case '[': @@ -318,6 +328,9 @@ class TextFormatter { i++; } if (this.slice(i, i + 2) !== ']]') return false; + + this.pushSlice(start); + this.offset = i + 2; let termEnd = i; let uri = ''; if (anglePos >= 0 && this.slice(i - 4, i) === '>') { // `>` @@ -326,17 +339,21 @@ class TextFormatter { if (this.at(termEnd - 1) === ' ') termEnd--; uri = encodeURI(uri.replace(/^([a-z]*[^a-z:])/g, 'http://$1')); } - let term = this.slice(start + 2, termEnd).replace(/<\/?a(?: [^>]+)?>/g, ''); - if (uri && !this.isTrusted) { + let term = this.slice(start + 2, termEnd).replace(/<\/?[au](?: [^>]+)?>/g, ''); + if (this.showSyntax) { + term += `${this.slice(termEnd, i)}`; + } else if (uri && !this.isTrusted) { const shortUri = uri.replace(/^https?:\/\//, '').replace(/^www\./, '').replace(/\/$/, ''); term += ` <${shortUri}>`; uri += '" rel="noopener'; } + if (colonPos > 0) { const key = this.slice(start + 2, colonPos).toLowerCase(); switch (key) { case 'w': case 'wiki': + if (this.showSyntax) break; term = term.slice(term.charAt(key.length + 1) === ' ' ? key.length + 2 : key.length + 1); uri = `//en.wikipedia.org/w/index.php?title=Special:Search&search=${this.toUriComponent(term)}`; term = `wiki: ${term}`; @@ -345,6 +362,10 @@ class TextFormatter { case 'item': case 'type': case 'category': + if (this.showSyntax) { + this.buffers.push(`${this.slice(start, this.offset)}`); + return true; + } term = term.slice(term.charAt(key.length + 1) === ' ' ? key.length + 2 : key.length + 1); let display = ''; @@ -365,31 +386,42 @@ class TextFormatter { if (!uri) { uri = `//www.google.com/search?ie=UTF-8&btnI&q=${this.toUriComponent(term)}`; } - this.pushSlice(start); - this.buffers.push(`
      ${term}`); - this.offset = i + 2; + if (this.showSyntax) { + this.buffers.push(`[[${term}]]`); + } else { + this.buffers.push(`${term}`); + } } return true; case '<': + // Roomid-link span. Not to be confused with a URL span. + // `<>` { if (this.slice(start, start + 8) !== '<<') return false; // << let i = start + 8; while (/[a-z0-9-]/.test(this.at(i))) i++; if (this.slice(i, i + 8) !== '>>') return false; // >> + this.pushSlice(start); const roomid = this.slice(start + 8, i); - this.buffers.push(`«${roomid}»`); + if (this.showSyntax) { + this.buffers.push(`<<${roomid}>>`); + } else { + this.buffers.push(`«${roomid}»`); + } this.offset = i + 8; } return true; - case 'a': - // URL span. Skip to the end of the link - where `` is. + case 'a': case 'u': + // URL span. Skip to the end of the link - where `` or `` is. // Nothing inside should be formatted further (obviously we don't want // `example.com/__foo__` to turn `foo` italic). { - let i = start + 1; - while (this.at(i) !== '/' || this.at(i + 1) !== 'a' || this.at(i + 2) !== '>') i++; // - i += 3; + let i = start + 2; + // Find or . + // We need to check the location of `>` to disambiguate from . + while (this.at(i) !== '<' || this.at(i + 1) !== '/' || this.at(i + 3) !== '>') i++; + i += 4; this.pushSlice(i); } return true; @@ -399,7 +431,9 @@ class TextFormatter { get() { let beginningOfLine = this.offset; - // main loop! i tracks our position + // main loop! `i` tracks our position + // Note that we skip around a lot; `i` is mutated inside the loop + // pretty often. for (let i = beginningOfLine; i < this.str.length; i++) { const char = this.at(i); switch (char) { @@ -413,6 +447,7 @@ class TextFormatter { if (this.at(i + 1) === char && this.at(i + 2) !== char) { // This is a completely normal two-char span. Close it if it's // already open, open it if it's not. + // The inside of regular spans must not start or end with a space. if (!(this.at(i - 1) !== ' ' && this.closeSpan(char, i, i + 2))) { if (this.at(i + 2) !== ' ') this.pushSpan(char, i, i + 2); } @@ -487,10 +522,10 @@ class TextFormatter { } while (this.slice(i + 1, i + 5) === 'lt;&') i += 4; break; - case '<': // guaranteed to be or // URL span // The constructor has already converted `<` to `<` and URLs - // to links, so `<` must be the start of a URL link. + // to links, so `<` must be the start of a converted link. this.runLookahead('a', i); if (i < this.offset) { i = this.offset - 1; @@ -519,8 +554,8 @@ class TextFormatter { /** * Takes a string and converts it to HTML by replacing standard chat formatting with the appropriate HTML tags. */ -export function formatText(str: string, isTrusted = false, replaceLinebreaks = false) { - return new TextFormatter(str, isTrusted, replaceLinebreaks).get(); +export function formatText(str: string, isTrusted = false, replaceLinebreaks = false, showSyntax = false) { + return new TextFormatter(str, isTrusted, replaceLinebreaks, showSyntax).get(); } /** From ec66e09bd1c6c5926ced158c7fa6c048ec1e80c4 Mon Sep 17 00:00:00 2001 From: DorronSmogon <165947742+DorronSmogon@users.noreply.github.com> Date: Tue, 25 Jun 2024 17:53:05 +0200 Subject: [PATCH 076/139] NDRU: Ban Pecharunt (#10362) Banned via council vote: https://www.smogon.com/forums/threads/national-dex-ru-metagame-discussion.3713801/post-10162141 --- data/formats-data.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/formats-data.ts b/data/formats-data.ts index 452393246ce4..cf07a3142c0d 100644 --- a/data/formats-data.ts +++ b/data/formats-data.ts @@ -5661,7 +5661,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { pecharunt: { tier: "UU", doublesTier: "DUU", - natDexTier: "RU", + natDexTier: "RUBL", }, missingno: { isNonstandard: "Custom", From 3be86ebf3b09082c022123080f35850da9161c27 Mon Sep 17 00:00:00 2001 From: Kaen <66154904+Seerd@users.noreply.github.com> Date: Tue, 25 Jun 2024 12:02:30 -0400 Subject: [PATCH 077/139] Full Potential: Update bans (#10364) https://www.smogon.com/forums/threads/full-potential.3711127/page-3#post-10087574 --- config/formats.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/config/formats.ts b/config/formats.ts index 25a5d98d8d0d..a6cf54a37495 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -1621,11 +1621,11 @@ export const Formats: FormatList = [ 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', - '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', + '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', ], }, { From 021bb6b4147d783a3aa9da22896c4e1e173f1b61 Mon Sep 17 00:00:00 2001 From: Ashley Date: Tue, 25 Jun 2024 12:02:59 -0400 Subject: [PATCH 078/139] ADV LC: Ban Thunder Wave (#10365) --- config/formats.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/formats.ts b/config/formats.ts index a6cf54a37495..a051809db2ac 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -4706,7 +4706,7 @@ export const Formats: FormatList = [ mod: 'gen3', searchShow: false, ruleset: ['Standard', 'Little Cup', 'Sleep Moves Clause', 'Accuracy Moves Clause'], - banlist: ['Chansey', 'Meditite', 'Omanyte', 'Scyther', 'Wynaut', 'Zigzagoon', 'Deep Sea Tooth', 'Baton Pass', 'Dragon Rage', 'Sonic Boom', 'Swagger'], + banlist: ['Chansey', 'Meditite', 'Omanyte', 'Scyther', 'Wynaut', 'Zigzagoon', 'Deep Sea Tooth', 'Baton Pass', 'Dragon Rage', 'Sonic Boom', 'Swagger', 'Thunder Wave'], }, { name: "[Gen 3] 1v1", From 82ed9b0d2b2e15af54d30de4a1adec20c52be970 Mon Sep 17 00:00:00 2001 From: Guangcong Luo Date: Wed, 26 Jun 2024 01:19:36 +0000 Subject: [PATCH 079/139] Fix slow chatlog queries Databases can't optimize these month/date extractions so they were super slow. These queries are instead fast. Assuming the OOM crashes were due to slow queries, this change should fix them. (TODO: Figure out why the int cast is necessary.) --- server/chat-plugins/chatlog.ts | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/server/chat-plugins/chatlog.ts b/server/chat-plugins/chatlog.ts index 2ceb33b09d9e..e9925fcbfd96 100644 --- a/server/chat-plugins/chatlog.ts +++ b/server/chat-plugins/chatlog.ts @@ -87,9 +87,10 @@ export class LogReaderRoom { async getLog(day: string) { if (roomlogTable) { + const [dayStart, dayEnd] = LogReader.dayToRange(day); const logs = await roomlogTable.selectAll( ['log', 'time'] - )`WHERE roomid = ${this.roomid} AND time::DATE = ${day}`; + )`WHERE roomid = ${this.roomid} AND time BETWEEN ${dayStart}::int::timestamp AND ${dayEnd}::int::timestamp`; return new Streams.ObjectReadStream({ read(this: Streams.ObjectReadStream) { for (const {log, time} of logs) { @@ -177,6 +178,23 @@ export const LogReader = new class { return {official, normal, hidden, secret, deleted, personal, deletedPersonal}; } + /** @returns [dayStart, dayEnd] as seconds (NOT milliseconds) since Unix epoch */ + dayToRange(day: string): [number, number] { + const nextDay = LogReader.nextDay(day); + return [ + Math.trunc(new Date(day).getTime() / 1000), + Math.trunc(new Date(nextDay).getTime() / 1000), + ]; + } + /** @returns [monthStart, monthEnd] as seconds (NOT milliseconds) since Unix epoch */ + monthToRange(month: string): [number, number] { + const nextMonth = LogReader.nextMonth(month); + return [ + Math.trunc(new Date(`${month}-01`).getTime() / 1000), + Math.trunc(new Date(`${nextMonth}-01`).getTime() / 1000), + ]; + } + getMonth(day?: string) { if (!day) day = Chat.toTimestamp(new Date()).split(' ')[0]; return day.slice(0, 7); @@ -803,14 +821,15 @@ export class RipgrepLogSearcher extends FSLogSearcher { } export class DatabaseLogSearcher extends Searcher { - async searchLinecounts(roomid: RoomID, monthString: string, user?: ID) { + async searchLinecounts(roomid: RoomID, month: string, user?: ID) { user = toID(user); if (!Rooms.Roomlogs.table) throw new Error(`Database search made while database is disabled.`); const results: {[date: string]: {[user: string]: number}} = {}; - const [year, month] = monthString.split('-').map(Number); + const [monthStart, monthEnd] = LogReader.monthToRange(month); const rows = await Rooms.Roomlogs.table.selectAll()` - WHERE EXTRACT("year" FROM time::DATE) = ${year} AND EXTRACT("month" FROM time::DATE) = ${month} AND - roomid = ${roomid} AND type = ${'c'}${user ? SQL` AND userid = ${user}` : SQL``} + WHERE ${user ? SQL`userid = ${user} AND` : SQL``}roomid = ${roomid} AND + time BETWEEN ${monthStart}::int::timestamp AND ${monthEnd}::int::timestamp AND + type = ${'c'} `; for (const row of rows) { @@ -823,7 +842,7 @@ export class DatabaseLogSearcher extends Searcher { results[day][row.userid]++; } - return this.renderLinecountResults(results, roomid, monthString, user); + return this.renderLinecountResults(results, roomid, month, user); } activityStats(room: RoomID, month: string): Promise<{average: RoomStats, days: RoomStats[]}> { throw new Chat.ErrorMessage('This is not yet implemented for the new logs database.'); From 00b77c31decac94ad438791b29e6f88cc65ca097 Mon Sep 17 00:00:00 2001 From: BoingK <83502726+thekee04@users.noreply.github.com> Date: Wed, 26 Jun 2024 22:50:28 +0100 Subject: [PATCH 080/139] SV Godly Gift: Update bans (#10367) * SV Godly Gift: Ban Kyurem-Black, Unban Zacian-Crowned, Unrestrict Baxcalibur and Chien-Pao Right this got messy Previous tiering actions commited here (banning ZacC, restricting Chien-Pao and Bax) were taken in the middle of a suspect test, and have since been reversed: https://www.smogon.com/forums/threads/godly-gift.3710734/post-10160970. There has been no post since then regarding any further action on these. Furthermore, Kyurem-Black was banned by suspect vote: https://www.smogon.com/forums/threads/sv-godly-gift-kyurem-black.3745750/post-10164343 * Update formats.ts * Update formats.ts --------- Co-authored-by: Kris Johnson <11083252+KrisXV@users.noreply.github.com> --- config/formats.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/config/formats.ts b/config/formats.ts index a051809db2ac..97d33bdbefce 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -661,15 +661,15 @@ export const Formats: FormatList = [ mod: 'gen9', ruleset: ['Standard OMs', 'Sleep Moves Clause', 'Godly Gift Mod'], banlist: [ - 'Blissey', 'Calyrex-Shadow', 'Chansey', 'Deoxys-Attack', 'Koraidon', 'Miraidon', 'Zacian-Crowned', 'Arena Trap', 'Huge Power', 'Moody', 'Pure Power', 'Shadow Tag', + 'Blissey', 'Calyrex-Shadow', 'Chansey', 'Deoxys-Attack', 'Koraidon', 'Kyurem-Black', 'Miraidon', 'Arena Trap', '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: [ - 'Annihilape', 'Arceus', 'Baxcalibur', 'Calyrex-Ice', 'Chi-Yu', 'Chien-Pao', 'Crawdaunt', 'Deoxys-Base', 'Deoxys-Speed', 'Dialga', 'Dialga-Origin', 'Dragapult', - 'Espathra', 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Gliscor', 'Groudon', 'Hawlucha', 'Ho-Oh', 'Iron Bundle', 'Kingambit', 'Kyogre', 'Kyurem', - 'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Ogerpon-Hearthflame', 'Palafin', 'Palkia', - 'Palkia-Origin', 'Rayquaza', 'Regieleki', 'Reshiram', 'Shaymin-Sky', 'Smeargle', 'Solgaleo', 'Terapagos', 'Toxapex', 'Ursaluna', 'Ursaluna-Bloodmoon', 'Volcarona', - 'Zacian', 'Zamazenta-Crowned', 'Zekrom', + 'Annihilape', 'Arceus', 'Calyrex-Ice', 'Chi-Yu', 'Crawdaunt', 'Deoxys-Base', 'Deoxys-Speed', 'Dialga', 'Dialga-Origin', 'Dragapult', 'Espathra', 'Eternatus', + 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Gliscor', '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', 'Rayquaza', + 'Regieleki', 'Reshiram', 'Shaymin-Sky', 'Smeargle', 'Solgaleo', 'Terapagos', 'Toxapex', 'Ursaluna', 'Ursaluna-Bloodmoon', 'Volcarona', 'Zacian', 'Zacian-Crowned', + 'Zamazenta-Crowned', 'Zekrom', ], }, From ab079a052db4a6aca24d547e417bd0a3841b8b7d Mon Sep 17 00:00:00 2001 From: Waleed Hassan Date: Fri, 28 Jun 2024 03:59:01 +0300 Subject: [PATCH 081/139] Seasons: Improve logging (#10370) * Seasons: Improve logging Logged battles will now include: - relevant badge of the players - format of the battle - floored Elo - usernames instead of IDs ![log](https://i.ibb.co/7VjkNnq/image.png) * Abstract out HTML generation --- server/chat-plugins/seasons.ts | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/server/chat-plugins/seasons.ts b/server/chat-plugins/seasons.ts index 3f4ef88d5b5b..d682201f8329 100644 --- a/server/chat-plugins/seasons.ts +++ b/server/chat-plugins/seasons.ts @@ -62,6 +62,15 @@ export function getBadges(user: User, curFormat: string) { return userBadges; } +function getUserHTML(user: User, format: string) { + const buf = `${user.name}`; + const badgeType = getBadges(user, format).filter(x => x.format === format)[0]?.type; + if (badgeType) { + return `` + buf; + } + return buf; +} + export function setFormatSchedule() { // guard heavily against this being overwritten if (data.current.formatsGeneratedAt === getYear()) return; @@ -346,10 +355,14 @@ export const handlers: Chat.Handlers = { room.setPrivate(false); const seasonRoom = Rooms.search('seasondiscussion'); if (seasonRoom) { - const players = Object.keys(room.battle.playerTable).map(toID); + const p1html = getUserHTML(user, room.battle.format); + const otherPlayer = user.id === room.battle.p1.id ? room.battle.p2 : room.battle.p1; + const otherUser = otherPlayer.getUser(); + const p2html = otherUser ? getUserHTML(otherUser, room.battle.format) : `${otherPlayer.name}`; + const formatName = Dex.formats.get(room.battle.format).name; seasonRoom.add( - `|raw|Battle started between ` + - `${players[0]} and ${players[1]}. (rating: ${room.battle.rated})` + `|raw|${formatName} battle started between ` + + `${p1html} and ${p2html}. (rating: ${Math.floor(room.battle.rated)})` ).update(); } } From 7b1c39c22f162611ee8681e187cf59fef7961923 Mon Sep 17 00:00:00 2001 From: Sergio Garcia <47090312+singiamtel@users.noreply.github.com> Date: Fri, 28 Jun 2024 02:59:19 +0200 Subject: [PATCH 082/139] Chatlog: Fix broken query (#10369) Missing space, seems like a regression from 82ed9b0d2b2e15af54d30de4a1adec20c52be970 --- server/chat-plugins/chatlog.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/chat-plugins/chatlog.ts b/server/chat-plugins/chatlog.ts index e9925fcbfd96..9783b7323510 100644 --- a/server/chat-plugins/chatlog.ts +++ b/server/chat-plugins/chatlog.ts @@ -827,7 +827,7 @@ export class DatabaseLogSearcher extends Searcher { const results: {[date: string]: {[user: string]: number}} = {}; const [monthStart, monthEnd] = LogReader.monthToRange(month); const rows = await Rooms.Roomlogs.table.selectAll()` - WHERE ${user ? SQL`userid = ${user} AND` : SQL``}roomid = ${roomid} AND + WHERE ${user ? SQL`userid = ${user} AND ` : SQL``}roomid = ${roomid} AND time BETWEEN ${monthStart}::int::timestamp AND ${monthEnd}::int::timestamp AND type = ${'c'} `; From 5345fe9f07ca4f2950562e0e65a664261a5935e4 Mon Sep 17 00:00:00 2001 From: livid washed <115855253+livid-washed@users.noreply.github.com> Date: Fri, 28 Jun 2024 14:32:21 +1000 Subject: [PATCH 083/139] Improve and simplify Random Battles tests (#10366) --- data/random-battles/gen3/sets.json | 9 +- data/random-battles/gen9baby/sets.json | 13 +- test/random-battles/all-gens.js | 154 ++++++++++++++++++----- test/random-battles/gen2.js | 92 -------------- test/random-battles/gen3.js | 86 ------------- test/random-battles/gen4.js | 111 ---------------- test/random-battles/gen5.js | 106 +--------------- test/random-battles/gen6.js | 124 +----------------- test/random-battles/gen7.js | 152 +--------------------- test/random-battles/gen9.js | 167 ------------------------- 10 files changed, 138 insertions(+), 876 deletions(-) delete mode 100644 test/random-battles/gen2.js delete mode 100644 test/random-battles/gen3.js delete mode 100644 test/random-battles/gen4.js diff --git a/data/random-battles/gen3/sets.json b/data/random-battles/gen3/sets.json index 9bda7d118982..5a009282a9a1 100644 --- a/data/random-battles/gen3/sets.json +++ b/data/random-battles/gen3/sets.json @@ -1156,12 +1156,12 @@ "sets": [ { "role": "Bulky Attacker", - "movepool": ["encore", "hiddenpowergrass", "hypnosis", "icebeam", "rest", "surf", "toxic"], + "movepool": ["hiddenpowergrass", "hypnosis", "icebeam", "rest", "surf", "toxic"], "preferredTypes": ["Ice"] }, { "role": "Staller", - "movepool": ["encore", "icebeam", "protect", "surf", "toxic"] + "movepool": ["icebeam", "protect", "surf", "toxic"] }, { "role": "Bulky Support", @@ -2687,11 +2687,6 @@ "movepool": ["dragondance", "earthquake", "hiddenpowerflying", "overheat", "rockslide"], "preferredTypes": ["Ground"] }, - { - "role": "Bulky Setup", - "movepool": ["earthquake", "extremespeed", "hiddenpowerflying", "rockslide", "swordsdance"], - "preferredTypes": ["Ground"] - }, { "role": "Wallbreaker", "movepool": ["earthquake", "extremespeed", "hiddenpowerflying", "overheat", "rockslide"], diff --git a/data/random-battles/gen9baby/sets.json b/data/random-battles/gen9baby/sets.json index 18244141cff0..aa0bdf25a9cb 100644 --- a/data/random-battles/gen9baby/sets.json +++ b/data/random-battles/gen9baby/sets.json @@ -229,7 +229,7 @@ }, { "role": "Fast Support", - "movepool": ["Leaf Storm", "Giga Drain", "Stomping Tantrum", "Super Fang", "Thief"], + "movepool": ["Giga Drain", "Leaf Storm", "Stomping Tantrum", "Super Fang", "Thief"], "teraTypes": ["Poison", "Water"] } ] @@ -436,11 +436,6 @@ "role": "Bulky Setup", "movepool": ["Bulk Up", "Drain Punch", "Earthquake", "Gunk Shot", "Knock Off", "Sucker Punch"], "teraTypes": ["Dark", "Fighting", "Ground"] - }, - { - "role": "Fast Attacker", - "movepool": ["Close Combat", "Earthquake", "Gunk Shot", "Knock Off", "Swords Dance"], - "teraTypes": ["Dark"] } ] }, @@ -1004,7 +999,7 @@ "sets": [ { "role": "Bulky Attacker", - "movepool": ["Dynamic Punch", "Earthquake", "Poltergeist", "Stealth Rock", "Stone Edge"], + "movepool": ["Dynamic Punch", "Earthquake", "Poltergeist", "Rock Tomb", "Stealth Rock"], "teraTypes": ["Fighting"] } ] @@ -1534,7 +1529,7 @@ }, { "role": "Bulky Support", - "movepool": ["Iron Head", "Knock Off", "Play Rough", "Stealth Rock", "Thunder Wave", "U-turn"], + "movepool": ["Iron Head", "Knock Off", "Play Rough", "Stealth Rock", "U-turn"], "teraTypes": ["Fairy", "Water"] } ] @@ -1549,7 +1544,7 @@ }, { "role": "Fast Support", - "movepool": ["High Jump Kick", "Fake Out", "Knock Off", "U-turn"], + "movepool": ["Fake Out", "High Jump Kick", "Knock Off", "U-turn"], "teraTypes": ["Dark", "Steel"] }, { diff --git a/test/random-battles/all-gens.js b/test/random-battles/all-gens.js index 6d053026e4b0..5286ef42ad17 100644 --- a/test/random-battles/all-gens.js +++ b/test/random-battles/all-gens.js @@ -113,44 +113,142 @@ describe('value rule support (slow)', () => { } }); -describe("New set format", () => { - const files = ['../../data/random-battles/gen9/sets.json', '../../data/random-battles/gen9/doubles-sets.json']; - for (const filename of files) { - it(`${filename} should have valid set data`, () => { - const setsJSON = require(filename); - let validRoles = []; - if (filename === '../../data/random-battles/gen9/sets.json') { - validRoles = ["Fast Attacker", "Setup Sweeper", "Wallbreaker", "Tera Blast user", - "Bulky Attacker", "Bulky Setup", "Fast Bulky Setup", "Bulky Support", "Fast Support", "AV Pivot"]; - } else { - validRoles = ["Doubles Fast Attacker", "Doubles Setup Sweeper", "Doubles Wallbreaker", "Tera Blast user", - "Doubles Bulky Attacker", "Doubles Bulky Setup", "Offensive Protect", "Bulky Protect", "Doubles Support", "Choice Item user"]; - } +describe("New set format (slow)", () => { + // formatInfo lists filenames and roles for each format + const formatInfo = { + "gen2randombattle": { + filename: "gen2/sets", + roles: ["Fast Attacker", "Setup Sweeper", "Bulky Attacker", "Bulky Setup", "Bulky Support", "Generalist", "Thief user"], + }, + "gen3randombattle": { + filename: "gen3/sets", + roles: ["Fast Attacker", "Setup Sweeper", "Wallbreaker", "Bulky Attacker", "Bulky Setup", "Staller", "Bulky Support", "Generalist", "Berry Sweeper"], + }, + "gen4randombattle": { + filename: "gen4/sets", + roles: ["Fast Attacker", "Setup Sweeper", "Wallbreaker", "Bulky Attacker", "Bulky Setup", "Staller", "Bulky Support", "Fast Support", "Spinner"], + }, + "gen5randombattle": { + filename: "gen5/sets", + roles: ["Fast Attacker", "Setup Sweeper", "Wallbreaker", "Bulky Attacker", "Bulky Setup", "Staller", "Bulky Support", "Fast Support", "Spinner"], + }, + "gen6randombattle": { + filename: "gen6/sets", + roles: ["Fast Attacker", "Setup Sweeper", "Wallbreaker", "Bulky Attacker", "Bulky Setup", "Staller", "Bulky Support", "Fast Support", "AV Pivot"], + }, + "gen7randombattle": { + filename: "gen7/sets", + roles: ["Fast Attacker", "Setup Sweeper", "Wallbreaker", "Z-Move user", "Bulky Attacker", "Bulky Setup", "Staller", "Bulky Support", "Fast Support", "AV Pivot"], + }, + "gen9randombattle": { + filename: "gen9/sets", + roles: ["Fast Attacker", "Setup Sweeper", "Wallbreaker", "Tera Blast user", "Bulky Attacker", "Bulky Setup", "Fast Bulky Setup", "Bulky Support", "Fast Support", "AV Pivot"], + }, + "gen9randomdoublesbattle": { + filename: "gen9/doubles-sets", + roles: ["Doubles Fast Attacker", "Doubles Setup Sweeper", "Doubles Wallbreaker", "Tera Blast user", "Doubles Bulky Attacker", "Doubles Bulky Setup", "Offensive Protect", "Bulky Protect", "Doubles Support", "Choice Item user"], + }, + "gen9babyrandombattle": { + filename: "gen9baby/sets", + roles: ["Fast Attacker", "Setup Sweeper", "Wallbreaker", "Tera Blast user", "Bulky Attacker", "Bulky Setup", "Bulky Support", "Fast Support"], + }, + }; + for (const format of Object.keys(formatInfo)) { + const filename = formatInfo[format].filename; + const setsJSON = require(`../../dist/data/random-battles/${filename}.json`); + const mod = filename.split('/')[0]; + const genNum = parseInt(mod[3]); + const rounds = 100; + const dex = Dex.forFormat(format); + it(`${filename}.json should have valid set data`, () => { + const validRoles = formatInfo[format].roles; for (const [id, sets] of Object.entries(setsJSON)) { const species = Dex.species.get(id); - assert(species.exists, `Misspelled species ID: ${id}`); + assert(species.exists, `In ${format}, misspelled species ID: ${id}`); assert(Array.isArray(sets.sets)); for (const set of sets.sets) { - assert(validRoles.includes(set.role), `Set for ${species.name} has invalid role: ${set.role}`); - assert.equal(set.role === "Tera Blast user", set.movepool.includes("Tera Blast"), - `Set for ${species.name} has inconsistent Tera Blast user status`); + assert(validRoles.includes(set.role), `In ${format}, set for ${species.name} has invalid role: ${set.role}`); for (const move of set.movepool) { const dexMove = Dex.moves.get(move); - assert(dexMove.exists, `${species.name} has invalid move: ${move}`); - assert.equal(move, dexMove.name, `${species.name} has misformatted move: ${move}`); - assert(validateLearnset(dexMove, {species}, 'anythinggoes', 'gen9'), `${species.name} can't learn ${move}`); + assert(dexMove.exists, `In ${format}, ${species.name} has invalid move: ${move}`); + // Old gens have moves in id form, currently. + if (genNum === 9) { + assert.equal(move, dexMove.name, `In ${format}, ${species.name} has misformatted move: ${move}`); + } else { + assert(move === dexMove.id || move.startsWith('hiddenpower'), `In ${format}, ${species.name} has misformatted move: ${move}`); + } + assert(validateLearnset(dexMove, {species}, 'ubers', `gen${genNum}`), `In ${format}, ${species.name} can't learn ${move}`); } for (let i = 0; i < set.movepool.length - 1; i++) { - assert(set.movepool[i + 1] > set.movepool[i], `${species} movepool should be sorted alphabetically`); + assert(set.movepool[i + 1] > set.movepool[i], `In ${format}, ${species.name} movepool should be sorted alphabetically`); + } + if (set.teraTypes) { + for (const type of set.teraTypes) { + const dexType = Dex.types.get(type); + assert(dexType.exists, `In ${format}, ${species.name} has invalid Tera Type: ${type}`); + assert.equal(type, dexType.name, `In ${format}, ${species.name} has misformatted Tera Type: ${type}`); + } + for (let i = 0; i < set.teraTypes.length - 1; i++) { + assert(set.teraTypes[i + 1] > set.teraTypes[i], `In ${format}, ${species.name} teraTypes should be sorted alphabetically`); + } } - for (const type of set.teraTypes) { - const dexType = Dex.types.get(type); - assert(dexType.exists, `${species.name} has invalid Tera Type: ${type}`); - assert.equal(type, dexType.name, `${species.name} has misformatted Tera Type: ${type}`); + if (set.preferredTypes) { + for (const type of set.preferredTypes) { + const dexType = Dex.types.get(type); + assert(dexType.exists, `In ${format}, ${species.name} has invalid Preferred Type: ${type}`); + assert.equal(type, dexType.name, `In ${format}, ${species.name} has misformatted Preferred Type: ${type}`); + } + for (let i = 0; i < set.preferredTypes.length - 1; i++) { + assert(set.preferredTypes[i + 1] > set.preferredTypes[i], `In ${format}, ${species.name} preferredTypes should be sorted alphabetically`); + } } - for (let i = 0; i < set.teraTypes.length - 1; i++) { - assert(set.teraTypes[i + 1] > set.teraTypes[i], `${species} teraTypes should be sorted alphabetically`); + } + } + }); + it('all Pokemon should have 4 moves, except for Ditto and Unown', function () { + testTeam({format, rounds}, team => { + for (const pokemon of team) assert(pokemon.name === 'Ditto' || pokemon.name === 'Unown' || pokemon.moves.length === 4, `In ${format}, ${pokemon.name} can generate with ${pokemon.moves.length} moves`); + }); + }); + it('all moves on all sets should exist and be obtainable', function () { + const generator = Teams.getGenerator(format); + for (const pokemon of Object.keys(setsJSON)) { + const species = dex.species.get(pokemon); + assert(species.exists, `In ${format}, Pokemon ${species} does not exist`); + const sets = setsJSON[pokemon]["sets"]; + const types = species.types; + const abilities = new Set(Object.values(species.abilities)); + if (species.unreleasedHidden) abilities.delete(species.abilities.H); + for (const set of sets) { + assert(set.movepool.every(m => dex.moves.get(m).exists), `In ${format}, for Pokemon ${species}, one of ${set.movepool} does not exist.`); + const role = set.role; + const moves = new Set(set.movepool.map(m => (m.startsWith('hiddenpower') ? m : dex.moves.get(m).id))); + const specialTypes = genNum === 9 ? set.teraTypes : set.preferredTypes; + // Go through all possible teamDetails combinations, if necessary + for (let j = 0; j < rounds; j++) { + // In Gens 2-3, if a set has multiple preferred types, we enforce moves of all the types. + const specialType = specialTypes ? (genNum > 3 ? specialTypes[j % specialTypes.length] : specialTypes.join()) : ''; + // Generate a moveset for each combination of relevant teamDetails. Spikes is relevant for Gen 2. + for (let i = 0; i < 16; i++) { + const rapidSpin = i % 2; + const stealthRock = Math.floor(i / 2) % 2; + const stickyWeb = Math.floor(i / 4) % 2; + const spikes = Math.floor(i / 8) % 2; + const teamDetails = {rapidSpin, stealthRock, stickyWeb, spikes}; + // randomMoveset() deletes moves from the movepool, so recreate it every time + const movePool = set.movepool.map(m => (m.startsWith('hiddenpower') ? m : dex.moves.get(m).id)); + let moveSet; + if (genNum === 9) { + moveSet = generator.randomMoveset(types, abilities, teamDetails, species, false, format.includes('doubles'), movePool, specialType, role); + } else { + moveSet = generator.randomMoveset(types, abilities, teamDetails, species, false, movePool, specialType, role); + } + for (const move of moveSet) moves.delete(move); + if (!moves.size) break; + } + if (!moves.size) break; } + assert.false(moves.size, `In ${format}, the following moves on ${species.name} are unused: ${[...moves].join(', ')}`); } } }); @@ -183,7 +281,7 @@ describe('Battle Factory and BSS Factory data should be valid (slow)', () => { this.timeout(0); const setsJSON = require(`../../dist/data/random-battles/${filename}.json`); const mod = filename.split('/')[0] || 'gen' + Dex.gen; - const genNum = isNaN(mod[3]) ? Dex.gen : mod[3]; + const genNum = isNaN(mod[3]) ? Dex.gen : parseInt(mod[3]); for (const type in setsJSON) { const typeTable = filename.includes('bss-factory-sets') ? setsJSON : setsJSON[type]; diff --git a/test/random-battles/gen2.js b/test/random-battles/gen2.js deleted file mode 100644 index e52a895a460f..000000000000 --- a/test/random-battles/gen2.js +++ /dev/null @@ -1,92 +0,0 @@ -/** - * Tests for Gen 2 randomized formats - */ -'use strict'; - -const assert = require('../assert'); -const {testTeam, validateLearnset} = require('./tools'); - -describe('[Gen 2] Random Battle (slow)', () => { - const options = {format: 'gen2randombattle'}; - const setsJSON = require(`../../dist/data/random-battles/gen2/sets.json`); - const dex = Dex.forFormat(options.format); - - describe("New set format", () => { - const filename = '../../data/random-battles/gen2/sets.json'; - it(`${filename} should have valid set data`, () => { - const setsJSON = require(filename); - const validRoles = [ - "Fast Attacker", "Setup Sweeper", "Bulky Attacker", "Bulky Setup", "Bulky Support", "Generalist", "Thief user", - ]; - for (const [id, sets] of Object.entries(setsJSON)) { - const species = Dex.species.get(id); - assert(species.exists, `Misspelled species ID: ${id}`); - assert(Array.isArray(sets.sets)); - for (const set of sets.sets) { - assert(validRoles.includes(set.role), `Set for ${species.name} has invalid role: ${set.role}`); - for (const move of set.movepool) { - const dexMove = Dex.moves.get(move); - assert(dexMove.exists, `${species.name} has invalid move: ${move}`); - assert(move === dexMove.id || move.startsWith('hiddenpower'), `${species.name} has misformatted move: ${move}`); - assert(validateLearnset(dexMove, {species}, 'ubers', 'gen2'), `${species.name} can't learn ${move}`); - } - for (let i = 0; i < set.movepool.length - 1; i++) { - assert(set.movepool[i + 1] > set.movepool[i], `${species} movepool should be sorted alphabetically`); - } - if (set.preferredTypes) { - for (const type of set.preferredTypes) { - const dexType = Dex.types.get(type); - assert(dexType.exists, `${species.name} has invalid Preferred Type: ${type}`); - assert.equal(type, dexType.name, `${species.name} has misformatted Preferred Type: ${type}`); - } - for (let i = 0; i < set.preferredTypes.length - 1; i++) { - assert(set.preferredTypes[i + 1] > set.preferredTypes[i], `${species} preferredTypes should be sorted alphabetically`); - } - } - } - } - }); - }); - - it('all Pokemon should have 4 moves, except for Ditto and Unown', function () { - // This test takes more than 2000ms - testTeam({...options, rounds: 100}, team => { - for (const pokemon of team) assert(pokemon.name === 'Ditto' || pokemon.name === 'Unown' || pokemon.moves.length === 4); - }); - }); - - it('all moves on all sets should be obtainable', function () { - const generator = Teams.getGenerator(options.format); - const rounds = 100; - for (const pokemon of Object.keys(setsJSON)) { - const species = dex.species.get(pokemon); - const sets = setsJSON[pokemon]["sets"]; - const types = species.types; - const abilities = new Set(Object.values(species.abilities)); - if (species.unreleasedHidden) abilities.delete(species.abilities.H); - for (const set of sets) { - const role = set.role; - const moves = new Set(Array.from(set.movepool)); - const preferredTypes = set.preferredTypes; - let teamDetails = {}; - // Go through all possible teamDetails combinations, if necessary - for (let j = 0; j < rounds; j++) { - const preferredType = preferredTypes ? preferredTypes[j % preferredTypes.length] : ''; - // Generate a moveset for each combination of relevant teamDetails - for (let i = 0; i < 4; i++) { - const rapidSpin = i % 2; - const spikes = Math.floor(i / 2) % 2; - teamDetails = {rapidSpin, spikes}; - // randomMoveset() deletes moves from the movepool, so recreate it every time - const movePool = Array.from(set.movepool); - const moveSet = generator.randomMoveset(types, abilities, teamDetails, species, false, movePool, preferredType, role); - for (const move of moveSet) moves.delete(move); - if (!moves.size) break; - } - if (!moves.size) break; - } - assert(!moves.size, species); - } - } - }); -}); diff --git a/test/random-battles/gen3.js b/test/random-battles/gen3.js deleted file mode 100644 index 9d5709340cd5..000000000000 --- a/test/random-battles/gen3.js +++ /dev/null @@ -1,86 +0,0 @@ -/** - * Tests for Gen 3 randomized formats - */ -'use strict'; - -const assert = require('../assert'); -const {testTeam, validateLearnset} = require('./tools'); - -describe('[Gen 3] Random Battle (slow)', () => { - const options = {format: 'gen3randombattle'}; - const setsJSON = require(`../../dist/data/random-battles/gen3/sets.json`); - const dex = Dex.forFormat(options.format); - - describe("New set format", () => { - const filename = '../../data/random-battles/gen3/sets.json'; - it(`${filename} should have valid set data`, () => { - const setsJSON = require(filename); - const validRoles = [ - "Fast Attacker", "Setup Sweeper", "Wallbreaker", "Bulky Attacker", - "Bulky Setup", "Staller", "Bulky Support", "Generalist", "Berry Sweeper", - ]; - for (const [id, sets] of Object.entries(setsJSON)) { - const species = Dex.species.get(id); - assert(species.exists, `Misspelled species ID: ${id}`); - assert(Array.isArray(sets.sets)); - for (const set of sets.sets) { - assert(validRoles.includes(set.role), `Set for ${species.name} has invalid role: ${set.role}`); - for (const move of set.movepool) { - const dexMove = Dex.moves.get(move); - assert(dexMove.exists, `${species.name} has invalid move: ${move}`); - assert(move === dexMove.id || move.startsWith('hiddenpower'), `${species.name} has misformatted move: ${move}`); - assert(validateLearnset(dexMove, {species}, 'anythinggoes', 'gen3'), `${species.name} can't learn ${move}`); - } - for (let i = 0; i < set.movepool.length - 1; i++) { - assert(set.movepool[i + 1] > set.movepool[i], `${species} movepool should be sorted alphabetically`); - } - if (set.preferredTypes) { - for (const type of set.preferredTypes) { - const dexType = Dex.types.get(type); - assert(dexType.exists, `${species.name} has invalid Preferred Type: ${type}`); - assert.equal(type, dexType.name, `${species.name} has misformatted Preferred Type: ${type}`); - } - for (let i = 0; i < set.preferredTypes.length - 1; i++) { - assert(set.preferredTypes[i + 1] > set.preferredTypes[i], `${species} preferredTypes should be sorted alphabetically`); - } - } - } - } - }); - }); - - it('all Pokemon should have 4 moves, except for Ditto and Unown', function () { - // This test takes more than 2000ms - testTeam({...options, rounds: 100}, team => { - for (const pokemon of team) assert(pokemon.name === 'Ditto' || pokemon.name === 'Unown' || pokemon.moves.length === 4); - }); - }); - - it('all moves on all sets should be obtainable', function () { - const generator = Teams.getGenerator(options.format); - const rounds = 100; - for (const pokemon of Object.keys(setsJSON)) { - const species = dex.species.get(pokemon); - const sets = setsJSON[pokemon]["sets"]; - const types = species.types; - const abilities = new Set(Object.values(species.abilities)); - if (species.unreleasedHidden) abilities.delete(species.abilities.H); - for (const set of sets) { - const role = set.role; - const moves = new Set(Array.from(set.movepool)); - const preferredTypes = set.preferredTypes; - // Go through all possible teamDetails combinations, if necessary - for (let j = 0; j < rounds; j++) { - // Generate a moveset - // randomMoveset() deletes moves from the movepool, so recreate it every time - const preferredType = preferredTypes ? preferredTypes.join() : ''; - const movePool = Array.from(set.movepool); - const moveSet = generator.randomMoveset(types, abilities, {}, species, false, movePool, preferredType, role); - for (const move of moveSet) moves.delete(move); - if (!moves.size) break; - } - assert(!moves.size, species); - } - } - }); -}); diff --git a/test/random-battles/gen4.js b/test/random-battles/gen4.js deleted file mode 100644 index 3cdbd444bc13..000000000000 --- a/test/random-battles/gen4.js +++ /dev/null @@ -1,111 +0,0 @@ -/** - * Tests for Gen 4 randomized formats - */ -'use strict'; - -const assert = require('../assert'); -const {testTeam, testSet, testHiddenPower, validateLearnset} = require('./tools'); - -describe('[Gen 4] Random Battle (slow)', () => { - const options = {format: 'gen4randombattle'}; - const setsJSON = require(`../../dist/data/random-battles/gen4/sets.json`); - const dex = Dex.forFormat(options.format); - - describe("New set format", () => { - const filename = '../../data/random-battles/gen4/sets.json'; - it(`${filename} should have valid set data`, () => { - const setsJSON = require(filename); - const validRoles = [ - "Fast Attacker", "Setup Sweeper", "Wallbreaker", "Bulky Attacker", - "Bulky Setup", "Staller", "Bulky Support", "Fast Support", "Spinner", - ]; - for (const [id, sets] of Object.entries(setsJSON)) { - const species = Dex.species.get(id); - assert(species.exists, `Misspelled species ID: ${id}`); - assert(Array.isArray(sets.sets)); - for (const set of sets.sets) { - assert(validRoles.includes(set.role), `Set for ${species.name} has invalid role: ${set.role}`); - for (const move of set.movepool) { - const dexMove = Dex.moves.get(move); - assert(dexMove.exists, `${species.name} has invalid move: ${move}`); - assert(move === dexMove.id || move.startsWith('hiddenpower'), `${species.name} has misformatted move: ${move}`); - assert(validateLearnset(dexMove, {species}, 'anythinggoes', 'gen4'), `${species.name} can't learn ${move}`); - } - for (let i = 0; i < set.movepool.length - 1; i++) { - assert(set.movepool[i + 1] > set.movepool[i], `${species} movepool should be sorted alphabetically`); - } - if (set.preferredTypes) { - for (const type of set.preferredTypes) { - const dexType = Dex.types.get(type); - assert(dexType.exists, `${species.name} has invalid Preferred Type: ${type}`); - assert.equal(type, dexType.name, `${species.name} has misformatted Preferred Type: ${type}`); - } - for (let i = 0; i < set.preferredTypes.length - 1; i++) { - assert(set.preferredTypes[i + 1] > set.preferredTypes[i], `${species} preferredTypes should be sorted alphabetically`); - } - } - } - } - }); - }); - - it('all Pokemon should have 4 moves, except for Ditto and Unown', function () { - // This test takes more than 2000ms - testTeam({...options, rounds: 100}, team => { - for (const pokemon of team) assert(pokemon.name === 'Ditto' || pokemon.name === 'Unown' || pokemon.moves.length === 4); - }); - }); - - it('all moves on all sets should be obtainable', function () { - const generator = Teams.getGenerator(options.format); - const rounds = 100; - for (const pokemon of Object.keys(setsJSON)) { - const species = dex.species.get(pokemon); - const sets = setsJSON[pokemon]["sets"]; - const types = species.types; - const abilities = new Set(Object.values(species.abilities)); - if (species.unreleasedHidden) abilities.delete(species.abilities.H); - for (const set of sets) { - const role = set.role; - const moves = new Set(Array.from(set.movepool)); - const preferredTypes = set.preferredTypes; - let teamDetails = {}; - // Go through all possible teamDetails combinations, if necessary - for (let j = 0; j < rounds; j++) { - // Generate a moveset as the lead, teamDetails is always empty for this - const preferredType = preferredTypes ? preferredTypes[j % preferredTypes.length] : ''; - const movePool = Array.from(set.movepool); - const moveSet = generator.randomMoveset(types, abilities, {}, species, true, movePool, preferredType, role); - for (const move of moveSet) moves.delete(move); - if (!moves.size) break; - // Generate a moveset for each combination of relevant teamDetails - for (let i = 0; i < 4; i++) { - const rapidSpin = i % 2; - const stealthRock = Math.floor(i / 2) % 2; - teamDetails = {rapidSpin, stealthRock}; - // randomMoveset() deletes moves from the movepool, so recreate it every time - const movePool = Array.from(set.movepool); - const moveSet = generator.randomMoveset(types, abilities, teamDetails, species, false, movePool, preferredType, role); - for (const move of moveSet) moves.delete(move); - if (!moves.size) break; - } - if (!moves.size) break; - } - assert(!moves.size, species); - } - } - }); - - it('should not generate Shaymin-Sky without Air Slash', () => { - testSet('shayminsky', options, set => assert(set.moves.includes('airslash'), `got ${set.moves}`)); - }); - - it('should prevent double Hidden Power', () => testHiddenPower('magnezone', options)); - - it('should give Yanmega Speed Boost if it has Protect', () => { - testSet('yanmega', options, set => { - if (set.ability !== 'Speed Boost') return; - assert(set.moves.includes('protect'), `got ${set.moves}`); - }); - }); -}); diff --git a/test/random-battles/gen5.js b/test/random-battles/gen5.js index 1e13d531bf2f..8d501077a9ec 100644 --- a/test/random-battles/gen5.js +++ b/test/random-battles/gen5.js @@ -4,110 +4,10 @@ 'use strict'; const assert = require('../assert'); -const {testTeam, testSet, testHiddenPower, testAlwaysHasMove, validateLearnset} = require('./tools'); +const {testSet} = require('./tools'); describe('[Gen 5] Random Battle (slow)', () => { const options = {format: 'gen5randombattle'}; - const setsJSON = require(`../../dist/data/random-battles/gen5/sets.json`); - const dex = Dex.forFormat(options.format); - - describe("New set format", () => { - const filename = '../../data/random-battles/gen5/sets.json'; - it(`${filename} should have valid set data`, () => { - const setsJSON = require(filename); - const validRoles = [ - "Fast Attacker", "Setup Sweeper", "Wallbreaker", "Bulky Attacker", - "Bulky Setup", "Staller", "Bulky Support", "Fast Support", "Spinner", - ]; - for (const [id, sets] of Object.entries(setsJSON)) { - const species = Dex.species.get(id); - assert(species.exists, `Misspelled species ID: ${id}`); - assert(Array.isArray(sets.sets)); - for (const set of sets.sets) { - assert(validRoles.includes(set.role), `Set for ${species.name} has invalid role: ${set.role}`); - for (const move of set.movepool) { - const dexMove = Dex.moves.get(move); - assert(dexMove.exists, `${species.name} has invalid move: ${move}`); - assert(move === dexMove.id || move.startsWith('hiddenpower'), `${species.name} has misformatted move: ${move}`); - assert(validateLearnset(dexMove, {species}, 'anythinggoes', 'gen5'), `${species.name} can't learn ${move}`); - } - for (let i = 0; i < set.movepool.length - 1; i++) { - assert(set.movepool[i + 1] > set.movepool[i], `${species} movepool should be sorted alphabetically`); - } - if (set.preferredTypes) { - for (const type of set.preferredTypes) { - const dexType = Dex.types.get(type); - assert(dexType.exists, `${species.name} has invalid Preferred Type: ${type}`); - assert.equal(type, dexType.name, `${species.name} has misformatted Preferred Type: ${type}`); - } - for (let i = 0; i < set.preferredTypes.length - 1; i++) { - assert(set.preferredTypes[i + 1] > set.preferredTypes[i], `${species} preferredTypes should be sorted alphabetically`); - } - } - } - } - }); - }); - - it('all Pokemon should have 4 moves, except for Ditto and Unown', function () { - // This test takes more than 2000ms - testTeam({...options, rounds: 100}, team => { - for (const pokemon of team) assert(pokemon.name === 'Ditto' || pokemon.name === 'Unown' || pokemon.moves.length === 4); - }); - }); - - it('all moves on all sets should be obtainable', function () { - const generator = Teams.getGenerator(options.format); - const rounds = 100; - for (const pokemon of Object.keys(setsJSON)) { - const species = dex.species.get(pokemon); - const sets = setsJSON[pokemon]["sets"]; - const types = species.types; - const abilities = new Set(Object.values(species.abilities)); - if (species.unreleasedHidden) abilities.delete(species.abilities.H); - for (const set of sets) { - const role = set.role; - const moves = new Set(Array.from(set.movepool)); - const preferredTypes = set.preferredTypes; - let teamDetails = {}; - // Go through all possible teamDetails combinations, if necessary - for (let j = 0; j < rounds; j++) { - // Generate a moveset as the lead, teamDetails is always empty for this - const preferredType = preferredTypes ? preferredTypes[j % preferredTypes.length] : ''; - const movePool = Array.from(set.movepool); - const moveSet = generator.randomMoveset(types, abilities, {}, species, true, movePool, preferredType, role); - for (const move of moveSet) moves.delete(move); - if (!moves.size) break; - // Generate a moveset for each combination of relevant teamDetails - for (let i = 0; i < 4; i++) { - const rapidSpin = i % 2; - const stealthRock = Math.floor(i / 2) % 2; - teamDetails = {rapidSpin, stealthRock}; - // randomMoveset() deletes moves from the movepool, so recreate it every time - const movePool = Array.from(set.movepool); - const moveSet = generator.randomMoveset(types, abilities, teamDetails, species, false, movePool, preferredType, role); - for (const move of moveSet) moves.delete(move); - if (!moves.size) break; - } - if (!moves.size) break; - } - assert(!moves.size, species); - } - } - }); - - it('should prevent double Hidden Power', () => { - testHiddenPower('ampharos', options); - testHiddenPower('venusaur', options); - }); - - it('should give Venusaur four moves', () => { - testSet( - 'venusaur', - {format: 'gen5randombattle', rounds: 1, seed: [2201, 2201, 2201, 2201]}, - set => assert.equal(set.moves.length, 4, `got ${JSON.stringify(set.moves)}`) - ); - }); it('should prevent unreleased HAs from being used', () => { testSet('chandelure', options, set => assert.notEqual(set.ability, 'Shadow Tag')); @@ -116,8 +16,4 @@ describe('[Gen 5] Random Battle (slow)', () => { it('should not give Ursaring Eviolite', () => { testSet('ursaring', options, set => assert.notEqual(set.item, 'Eviolite')); }); - - it('should always give Watchog Return', () => { - testAlwaysHasMove('watchog', options, 'return'); - }); }); diff --git a/test/random-battles/gen6.js b/test/random-battles/gen6.js index 66b0e8f74aab..e5b1fb8853d1 100644 --- a/test/random-battles/gen6.js +++ b/test/random-battles/gen6.js @@ -4,98 +4,10 @@ 'use strict'; const assert = require('../assert'); -const {testTeam, testNotBothMoves, testSet, testHiddenPower, testAlwaysHasMove, validateLearnset} = require('./tools'); +const {testSet} = require('./tools'); describe('[Gen 6] Random Battle (slow)', () => { const options = {format: 'gen6randombattle'}; - const setsJSON = require(`../../dist/data/random-battles/gen6/sets.json`); - const dex = Dex.forFormat(options.format); - - describe("New set format", () => { - const filename = '../../data/random-battles/gen6/sets.json'; - it(`${filename} should have valid set data`, () => { - const setsJSON = require(filename); - const validRoles = [ - "Fast Attacker", "Setup Sweeper", "Wallbreaker", "Bulky Attacker", - "Bulky Setup", "Staller", "Bulky Support", "Fast Support", "AV Pivot", - ]; - for (const [id, sets] of Object.entries(setsJSON)) { - const species = Dex.species.get(id); - assert(species.exists, `Misspelled species ID: ${id}`); - assert(Array.isArray(sets.sets)); - for (const set of sets.sets) { - assert(validRoles.includes(set.role), `Set for ${species.name} has invalid role: ${set.role}`); - for (const move of set.movepool) { - const dexMove = Dex.moves.get(move); - assert(dexMove.exists, `${species.name} has invalid move: ${move}`); - assert(move === dexMove.id || move.startsWith('hiddenpower'), `${species.name} has misformatted move: ${move}`); - assert(validateLearnset(dexMove, {species}, 'anythinggoes', 'gen6'), `${species.name} can't learn ${move}`); - } - for (let i = 0; i < set.movepool.length - 1; i++) { - assert(set.movepool[i + 1] > set.movepool[i], `${species} movepool should be sorted alphabetically`); - } - if (set.preferredTypes) { - for (const type of set.preferredTypes) { - const dexType = Dex.types.get(type); - assert(dexType.exists, `${species.name} has invalid Preferred Type: ${type}`); - assert.equal(type, dexType.name, `${species.name} has misformatted Preferred Type: ${type}`); - } - for (let i = 0; i < set.preferredTypes.length - 1; i++) { - assert(set.preferredTypes[i + 1] > set.preferredTypes[i], `${species} preferredTypes should be sorted alphabetically`); - } - } - } - } - }); - }); - - it('all Pokemon should have 4 moves, except for Ditto and Unown', function () { - // This test takes more than 2000ms - testTeam({...options, rounds: 100}, team => { - for (const pokemon of team) assert(pokemon.name === 'Ditto' || pokemon.name === 'Unown' || pokemon.moves.length === 4); - }); - }); - - it('all moves on all sets should be obtainable', function () { - const generator = Teams.getGenerator(options.format); - const rounds = 100; - for (const pokemon of Object.keys(setsJSON)) { - const species = dex.species.get(pokemon); - const sets = setsJSON[pokemon]["sets"]; - const types = species.types; - const abilities = new Set(Object.values(species.abilities)); - if (species.unreleasedHidden) abilities.delete(species.abilities.H); - for (const set of sets) { - const role = set.role; - const moves = new Set(Array.from(set.movepool)); - const preferredTypes = set.preferredTypes; - let teamDetails = {}; - // Go through all possible teamDetails combinations, if necessary - for (let j = 0; j < rounds; j++) { - // Generate a moveset as the lead, teamDetails is always empty for this - const preferredType = preferredTypes ? preferredTypes[j % preferredTypes.length] : ''; - const movePool = Array.from(set.movepool); - const moveSet = generator.randomMoveset(types, abilities, {}, species, true, movePool, preferredType, role); - for (const move of moveSet) moves.delete(move); - if (!moves.size) break; - // Generate a moveset for each combination of relevant teamDetails - for (let i = 0; i < 8; i++) { - const defog = i % 2; - const stealthRock = Math.floor(i / 2) % 2; - const stickyWeb = Math.floor(i / 4) % 2; - teamDetails = {defog, stealthRock, stickyWeb}; - // randomMoveset() deletes moves from the movepool, so recreate it every time - const movePool = Array.from(set.movepool); - const moveSet = generator.randomMoveset(types, abilities, teamDetails, species, false, movePool, preferredType, role); - for (const move of moveSet) moves.delete(move); - if (!moves.size) break; - } - if (!moves.size) break; - } - assert(!moves.size, species); - } - } - }); it('should not give mega evolution abilities to base formes', () => { testSet('manectricmega', {rounds: 1, ...options}, set => { @@ -103,40 +15,10 @@ describe('[Gen 6] Random Battle (slow)', () => { }); }); - it('should not select Air Slash and Hurricane together', () => { - testNotBothMoves('swanna', options, 'hurricane', 'airslash'); - }); - - it('should enforce STAB properly', () => { - testAlwaysHasMove('hariyama', options, 'closecombat'); - testAlwaysHasMove('rapidash', options, 'flareblitz'); - }); - - it('should give Drifblim only one Ghost-type attack', () => { - testSet('drifblim', options, set => { - assert.equal(set.moves.filter(m => { - const move = Dex.moves.get(m); - return move.type === 'Ghost' && move.category !== 'Status'; - }).length, 1, `got ${JSON.stringify(set.moves)}`); - }); - }); - - it('should prevent double Hidden Power', () => testHiddenPower('thundurustherian', options)); - - it('should always give Mega Glalie Return', () => testAlwaysHasMove('glaliemega', options, 'return')); - it('should not give Ursaring Eviolite', () => { testSet('ursaring', options, set => assert.notEqual(set.item, 'Eviolite')); }); - it('should always give Quagsire Unaware', () => { - testSet('quagsire', options, set => assert.equal(set.ability, 'Unaware')); - }); - - it('should always give Quagsire Recover', () => { - testAlwaysHasMove('quagsire', options, 'recover'); - }); - it('should not give Raikou Volt Absorb', () => { testSet('raikou', options, set => assert.notEqual(set.ability, 'Volt Absorb')); }); @@ -148,8 +30,4 @@ describe('[Gen 6] Random Battle (slow)', () => { it('should not give Entei Flash Fire', () => { testSet('entei', options, set => assert.notEqual(set.ability, 'Flash Fire')); }); - - it('should only give Charizard one of Air Slash and Acrobatics', () => { - testNotBothMoves('charizard', options, 'airslash', 'acrobatics'); - }); }); diff --git a/test/random-battles/gen7.js b/test/random-battles/gen7.js index 5e14129487de..e7bbc7f112b8 100644 --- a/test/random-battles/gen7.js +++ b/test/random-battles/gen7.js @@ -4,162 +4,18 @@ 'use strict'; const assert = require('../assert'); -const {testTeam, testNotBothMoves, testSet, testHiddenPower, testAlwaysHasMove, validateLearnset} = require('./tools'); +const {testSet} = require('./tools'); describe('[Gen 7] Random Battle (slow)', () => { const options = {format: 'gen7randombattle'}; - const setsJSON = require(`../../dist/data/random-battles/gen7/sets.json`); - const dex = Dex.forFormat(options.format); - describe("New set format", () => { - const filename = '../../data/random-battles/gen7/sets.json'; - it(`${filename} should have valid set data`, () => { - const setsJSON = require(filename); - const validRoles = [ - "Fast Attacker", "Setup Sweeper", "Wallbreaker", "Z-Move user", "Bulky Attacker", - "Bulky Setup", "Staller", "Bulky Support", "Fast Support", "AV Pivot", - ]; - for (const [id, sets] of Object.entries(setsJSON)) { - const species = Dex.species.get(id); - assert(species.exists, `Misspelled species ID: ${id}`); - assert(Array.isArray(sets.sets)); - for (const set of sets.sets) { - assert(validRoles.includes(set.role), `Set for ${species.name} has invalid role: ${set.role}`); - for (const move of set.movepool) { - const dexMove = Dex.moves.get(move); - assert(dexMove.exists, `${species.name} has invalid move: ${move}`); - assert(move === dexMove.id || move.startsWith('hiddenpower'), `${species.name} has misformatted move: ${move}`); - assert(validateLearnset(dexMove, {species}, 'anythinggoes', 'gen7'), `${species.name} can't learn ${move}`); - } - for (let i = 0; i < set.movepool.length - 1; i++) { - assert(set.movepool[i + 1] > set.movepool[i], `${species} movepool should be sorted alphabetically`); - } - if (set.preferredTypes) { - for (const type of set.preferredTypes) { - const dexType = Dex.types.get(type); - assert(dexType.exists, `${species.name} has invalid Preferred Type: ${type}`); - assert.equal(type, dexType.name, `${species.name} has misformatted Preferred Type: ${type}`); - } - for (let i = 0; i < set.preferredTypes.length - 1; i++) { - assert(set.preferredTypes[i + 1] > set.preferredTypes[i], `${species} preferredTypes should be sorted alphabetically`); - } - } - } - } + it('should not give mega evolution abilities to base formes', () => { + testSet('manectricmega', {rounds: 1, ...options}, set => { + assert(set.ability !== 'Intimidate', 'Mega Manectric should not have Intimidate before it mega evolves'); }); }); - it('all Pokemon should have 4 moves, except for Ditto and Unown', function () { - // This test takes more than 2000ms - testTeam({...options, rounds: 100}, team => { - for (const pokemon of team) assert(pokemon.name === 'Ditto' || pokemon.name === 'Unown' || pokemon.moves.length === 4); - }); - }); - - it('all moves on all sets should be obtainable', function () { - const generator = Teams.getGenerator(options.format); - const rounds = 100; - for (const pokemon of Object.keys(setsJSON)) { - const species = dex.species.get(pokemon); - const sets = setsJSON[pokemon]["sets"]; - const types = species.types; - const abilities = new Set(Object.values(species.abilities)); - if (species.unreleasedHidden) abilities.delete(species.abilities.H); - for (const set of sets) { - const role = set.role; - const moves = new Set(Array.from(set.movepool)); - const preferredTypes = set.preferredTypes; - let teamDetails = {}; - // Go through all possible teamDetails combinations, if necessary - for (let j = 0; j < rounds; j++) { - // Generate a moveset as the lead, teamDetails is always empty for this - const preferredType = preferredTypes ? preferredTypes[j % preferredTypes.length] : ''; - const movePool = Array.from(set.movepool); - const moveSet = generator.randomMoveset(types, abilities, {}, species, true, movePool, preferredType, role); - for (const move of moveSet) moves.delete(move); - if (!moves.size) break; - // Generate a moveset for each combination of relevant teamDetails - for (let i = 0; i < 8; i++) { - const defog = i % 2; - const stealthRock = Math.floor(i / 2) % 2; - const stickyWeb = Math.floor(i / 4) % 2; - teamDetails = {defog, stealthRock, stickyWeb}; - // randomMoveset() deletes moves from the movepool, so recreate it every time - const movePool = Array.from(set.movepool); - const moveSet = generator.randomMoveset(types, abilities, teamDetails, species, false, movePool, preferredType, role); - for (const move of moveSet) moves.delete(move); - if (!moves.size) break; - } - if (!moves.size) break; - } - assert(!moves.size, species); - } - } - }); - - it('should not generate Calm Mind + Yawn', () => { - testNotBothMoves('chimecho', options, 'calmmind', 'yawn'); - }); - - it('should give Azumarill Aqua Jet', () => { - testSet('azumarill', options, set => { - assert(set.moves.includes('aquajet'), `Azumarill: got ${set.moves}`); - }); - }); - - it('should give Typhlosion Eruption', () => { - testSet('typhlosion', options, set => { - assert(set.moves.includes('eruption'), `Typhlosion: got ${set.moves}`); - }); - }); - - it('should not generate Dragon Tail as the only STAB move', () => { - // Mono-Dragon Pokémon chosen as test dummies for simplicity - testSet('druddigon', options, set => { - if (set.moves.includes('dragontail')) { - assert(set.moves.includes('outrage'), `Druddigon: got ${set.moves}`); - } - }); - - testSet('goodra', options, set => { - if (set.moves.includes('dragontail')) { - assert(set.moves.includes('dracometeor') || set.moves.includes('dragonpulse'), `Goodra: got ${set.moves}`); - } - }); - }); - - it('should not generate Swords Dance + Ice Beam', () => { - testNotBothMoves('arceusground', options, 'swordsdance', 'icebeam'); - }); - - it('should prevent double Hidden Power', () => testHiddenPower('thundurustherian', options)); - - it('should never give Xerneas Assault Vest', () => { - testSet('xerneas', options, set => assert.notEqual(set.item, 'Assault Vest')); - }); - - it('should always give Gastrodon Recover', () => { - testAlwaysHasMove('gastrodon', options, 'recover'); - }); - - it('should never give Poliwrath both Rain Dance and Rest', () => { - testNotBothMoves('poliwrath', options, 'raindance', 'rest'); - }); - it('should not give Ursaring Eviolite', () => { testSet('ursaring', options, set => assert.notEqual(set.item, 'Eviolite')); }); - - it('should always give Mega Glalie Return', () => testAlwaysHasMove('glaliemega', options, 'return')); - - it('should not give Zebstrika Thunderbolt and Wild Charge', () => { - testNotBothMoves('zebstrika', options, 'thunderbolt', 'wildcharge'); - }); - - it('should always give Mega Diancie Moonblast if it has Calm Mind', () => { - testSet('dianciemega', options, set => { - if (!set.moves.includes('calmmind')) return; - assert(set.moves.includes('moonblast'), `Diancie: got ${set.moves}`); - }); - }); }); diff --git a/test/random-battles/gen9.js b/test/random-battles/gen9.js index 74c4260c3c7a..fd7f4a5f8b67 100644 --- a/test/random-battles/gen9.js +++ b/test/random-battles/gen9.js @@ -5,125 +5,14 @@ const {testTeam, testAlwaysHasMove} = require('./tools'); const assert = require('../assert'); -const Teams = require('./../../dist/sim/teams').Teams; -const Dex = require('./../../dist/sim/dex').Dex; describe('[Gen 9] Random Battle (slow)', () => { const options = {format: 'gen9randombattle'}; - const setsJSON = require(`../../dist/data/random-battles/gen9/sets.json`); - const dex = Dex.forFormat(options.format); - - it('all Pokemon should have 4 moves, except for Ditto', function () { - // This test takes more than 2000ms - testTeam({...options, rounds: 100}, team => { - for (const pokemon of team) assert(pokemon.name === 'Ditto' || pokemon.moves.length === 4); - }); - }); - - it('all moves on all sets should exist and be obtainable', function () { - const generator = Teams.getGenerator(options.format); - const rounds = 100; - for (const pokemon of Object.keys(setsJSON)) { - const species = dex.species.get(pokemon); - assert(species.exists, `Pokemon ${species} does not exist`); - const sets = setsJSON[pokemon]["sets"]; - const types = species.types; - const abilities = new Set(Object.values(species.abilities)); - if (species.unreleasedHidden) abilities.delete(species.abilities.H); - for (const set of sets) { - assert(set.movepool.every(m => dex.moves.get(m).exists), `One of ${set.movepool} does not exist.`); - const role = set.role; - const moves = new Set(set.movepool.map(m => dex.moves.get(m).id)); - const teraTypes = set.teraTypes; - let teamDetails = {}; - // Go through all possible teamDetails combinations, if necessary - for (let j = 0; j < rounds; j++) { - // Generate a moveset as the lead, teamDetails is always empty for this - const teraType = teraTypes[j % teraTypes.length]; - const movePool = set.movepool.map(m => dex.moves.get(m).id); - const moveSet = generator.randomMoveset(types, abilities, {}, species, true, false, movePool, teraType, role); - for (const move of moveSet) moves.delete(move); - if (!moves.size) break; - // Generate a moveset for each combination of relevant teamDetails - for (let i = 0; i < 8; i++) { - const defog = i % 2; - const stealthRock = Math.floor(i / 2) % 2; - const stickyWeb = Math.floor(i / 4) % 2; - teamDetails = {defog, stealthRock, stickyWeb}; - // randomMoveset() deletes moves from the movepool, so recreate it every time - const movePool = set.movepool.map(m => dex.moves.get(m).id); - const moveSet = generator.randomMoveset(types, abilities, teamDetails, species, false, false, movePool, teraType, role); - for (const move of moveSet) moves.delete(move); - if (!moves.size) break; - } - if (!moves.size) break; - } - assert.false(moves.size, `The following moves on ${species.name} are unused: ${[...moves].join(', ')}`); - } - } - }); - it("should always give Iron Bundle Freeze-Dry", () => { testAlwaysHasMove('ironbundle', options, 'freezedry'); }); }); -describe('[Gen 9] Baby Random Battle (slow)', () => { - const options = {format: 'gen9babyrandombattle'}; - const setsJSON = require(`../../dist/data/random-battles/gen9baby/sets.json`); - const dex = Dex.forFormat(options.format); - - it('all Pokemon should have 4 moves', function () { - // This test takes more than 2000ms - testTeam({...options, rounds: 100}, team => { - for (const pokemon of team) assert(pokemon.moves.length === 4); - }); - }); - - it('all moves on all sets should exist and be obtainable', function () { - const generator = Teams.getGenerator(options.format); - const rounds = 100; - for (const pokemon of Object.keys(setsJSON)) { - const species = dex.species.get(pokemon); - assert(species.exists, `Pokemon ${species} does not exist`); - const sets = setsJSON[pokemon]["sets"]; - const types = species.types; - const abilities = new Set(Object.values(species.abilities)); - if (species.unreleasedHidden) abilities.delete(species.abilities.H); - for (const set of sets) { - assert(set.movepool.every(m => dex.moves.get(m).exists), `One of ${set.movepool} does not exist.`); - const role = set.role; - const moves = new Set(set.movepool.map(m => dex.moves.get(m).id)); - const teraTypes = set.teraTypes; - let teamDetails = {}; - // Go through all possible teamDetails combinations, if necessary - for (let j = 0; j < rounds; j++) { - // Generate a moveset as the lead, teamDetails is always empty for this - const teraType = teraTypes[j % teraTypes.length]; - const movePool = set.movepool.map(m => dex.moves.get(m).id); - const moveSet = generator.randomMoveset(types, abilities, {}, species, true, false, movePool, teraType, role); - for (const move of moveSet) moves.delete(move); - if (!moves.size) break; - // Generate a moveset for each combination of relevant teamDetails - for (let i = 0; i < 8; i++) { - const defog = i % 2; - const stealthRock = Math.floor(i / 2) % 2; - const stickyWeb = Math.floor(i / 4) % 2; - teamDetails = {defog, stealthRock, stickyWeb}; - // randomMoveset() deletes moves from the movepool, so recreate it every time - const movePool = set.movepool.map(m => dex.moves.get(m).id); - const moveSet = generator.randomMoveset(types, abilities, teamDetails, species, false, false, movePool, teraType, role); - for (const move of moveSet) moves.delete(move); - if (!moves.size) break; - } - if (!moves.size) break; - } - assert.false(moves.size, `The following moves on ${species.name} are unused: ${[...moves].join(', ')}`); - } - } - }); -}); - describe('[Gen 9] Monotype Random Battle (slow)', () => { const options = {format: 'gen9monotyperandombattle'}; @@ -133,59 +22,3 @@ describe('[Gen 9] Monotype Random Battle (slow)', () => { }); }); }); - -describe('[Gen 9] Random Doubles Battle (slow)', () => { - const options = {format: 'gen9randomdoublesbattle'}; - const setsJSON = require(`../../dist/data/random-battles/gen9/doubles-sets.json`); - const dex = Dex.forFormat(options.format); - - it('all Pokemon should have 4 moves, except for Ditto', function () { - // This test takes more than 2000ms - testTeam({...options, rounds: 100}, team => { - for (const pokemon of team) assert(pokemon.name === 'Ditto' || pokemon.moves.length === 4); - }); - }); - - it('all moves on all sets should exist and be obtainable', function () { - const generator = Teams.getGenerator(options.format); - const rounds = 100; - for (const pokemon of Object.keys(setsJSON)) { - const species = dex.species.get(pokemon); - assert(species.exists, `Pokemon ${species} does not exist`); - const sets = setsJSON[pokemon]["sets"]; - const types = species.types; - const abilities = new Set(Object.values(species.abilities)); - if (species.unreleasedHidden) abilities.delete(species.abilities.H); - for (const set of sets) { - assert(set.movepool.every(m => dex.moves.get(m).exists), `One of ${set.movepool} does not exist.`); - const role = set.role; - const moves = new Set(set.movepool.map(m => dex.moves.get(m).id)); - const teraTypes = set.teraTypes; - let teamDetails = {}; - // Go through all possible teamDetails combinations, if necessary - for (let j = 0; j < rounds; j++) { - // Generate a moveset as the lead, teamDetails is always empty for this - const teraType = teraTypes[j % teraTypes.length]; - const movePool = set.movepool.map(m => dex.moves.get(m).id); - const moveSet = generator.randomMoveset(types, abilities, {}, species, true, true, movePool, teraType, role); - for (const move of moveSet) moves.delete(move); - if (!moves.size) break; - // Generate a moveset for each combination of relevant teamDetails - for (let i = 0; i < 8; i++) { - const defog = i % 2; - const stealthRock = Math.floor(i / 2) % 2; - const stickyWeb = Math.floor(i / 4) % 2; - teamDetails = {defog, stealthRock, stickyWeb}; - // randomMoveset() deletes moves from the movepool, so recreate it every time - const movePool = set.movepool.map(m => dex.moves.get(m).id); - const moveSet = generator.randomMoveset(types, abilities, teamDetails, species, false, true, movePool, teraType, role); - for (const move of moveSet) moves.delete(move); - if (!moves.size) break; - } - if (!moves.size) break; - } - assert(!moves.size); - } - } - }); -}); From c4ad9dd35365cbf05a1b9a47206e43ccf5a1b6ef Mon Sep 17 00:00:00 2001 From: shrianshChari <30420527+shrianshChari@users.noreply.github.com> Date: Fri, 28 Jun 2024 07:28:21 -0700 Subject: [PATCH 084/139] ZU: Ban Kingdra (#10371) https://www.smogon.com/forums/threads/sv-zu-4-kingdra.3745999/#post-10168753 --- data/formats-data.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/formats-data.ts b/data/formats-data.ts index cf07a3142c0d..df21b25b2315 100644 --- a/data/formats-data.ts +++ b/data/formats-data.ts @@ -888,7 +888,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { tier: "NFE", }, kingdra: { - tier: "ZU", + tier: "ZUBL", doublesTier: "(DUU)", natDexTier: "RU", }, From fc85da28bbcf84cd276699aee60e319d784ef076 Mon Sep 17 00:00:00 2001 From: shrianshChari <30420527+shrianshChari@users.noreply.github.com> Date: Fri, 28 Jun 2024 07:28:34 -0700 Subject: [PATCH 085/139] Create alias for High Horsepower (#10372) --- data/aliases.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/data/aliases.ts b/data/aliases.ts index 82f2aaaec54f..c67f66212dcc 100644 --- a/data/aliases.ts +++ b/data/aliases.ts @@ -864,6 +864,7 @@ export const Aliases: {[alias: string]: string} = { faintattack: "Feint Attack", glowpunch: "Power-up Punch", gterrain: "Grassy Terrain", + hhp: "High Horsepower", hp: "Hidden Power", hpbug: "Hidden Power Bug", hpdark: "Hidden Power Dark", From 4f5956540bf4b78535d5ba58b4edfeefe687e371 Mon Sep 17 00:00:00 2001 From: Waleed Hassan Date: Sat, 29 Jun 2024 20:03:23 +0300 Subject: [PATCH 086/139] Seasons: Fix logging (#10373) --- server/chat-plugins/seasons.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/server/chat-plugins/seasons.ts b/server/chat-plugins/seasons.ts index d682201f8329..06a20e427145 100644 --- a/server/chat-plugins/seasons.ts +++ b/server/chat-plugins/seasons.ts @@ -66,7 +66,9 @@ function getUserHTML(user: User, format: string) { const buf = `${user.name}`; const badgeType = getBadges(user, format).filter(x => x.format === format)[0]?.type; if (badgeType) { - return `` + buf; + let formatType = format.split(/gen\d+/)[1]; + if (!['ou', 'randombattle'].includes(formatType)) formatType = 'rotating'; + return `` + buf; } return buf; } From 5b24baa5a27cfc11fe69d971d5795ff1c043bf61 Mon Sep 17 00:00:00 2001 From: adrivrie Date: Sun, 30 Jun 2024 06:27:51 +0200 Subject: [PATCH 087/139] Random Battles: June 2024 balance patch (#10375) --- data/random-battles/gen3/sets.json | 40 +++++----- data/random-battles/gen4/sets.json | 24 +++--- data/random-battles/gen5/sets.json | 66 ++++++++-------- data/random-battles/gen6/sets.json | 60 +++++++-------- data/random-battles/gen7/sets.json | 88 +++++++++++----------- data/random-battles/gen8/data.json | 46 +++++------ data/random-battles/gen9/doubles-sets.json | 64 ++++++++-------- data/random-battles/gen9/sets.json | 28 +++---- 8 files changed, 208 insertions(+), 208 deletions(-) diff --git a/data/random-battles/gen3/sets.json b/data/random-battles/gen3/sets.json index 5a009282a9a1..e89cc57c3bdf 100644 --- a/data/random-battles/gen3/sets.json +++ b/data/random-battles/gen3/sets.json @@ -33,7 +33,7 @@ ] }, "blastoise": { - "level": 83, + "level": 82, "sets": [ { "role": "Bulky Support", @@ -50,7 +50,7 @@ ] }, "butterfree": { - "level": 95, + "level": 96, "sets": [ { "role": "Generalist", @@ -180,7 +180,7 @@ ] }, "clefable": { - "level": 84, + "level": 85, "sets": [ { "role": "Bulky Support", @@ -238,7 +238,7 @@ ] }, "venomoth": { - "level": 88, + "level": 87, "sets": [ { "role": "Generalist", @@ -358,7 +358,7 @@ ] }, "victreebel": { - "level": 84, + "level": 85, "sets": [ { "role": "Fast Attacker", @@ -424,7 +424,7 @@ ] }, "magneton": { - "level": 84, + "level": 85, "sets": [ { "role": "Staller", @@ -561,7 +561,7 @@ ] }, "marowak": { - "level": 82, + "level": 83, "sets": [ { "role": "Setup Sweeper", @@ -702,7 +702,7 @@ ] }, "jynx": { - "level": 81, + "level": 80, "sets": [ { "role": "Setup Sweeper", @@ -711,7 +711,7 @@ ] }, "electabuzz": { - "level": 83, + "level": 82, "sets": [ { "role": "Fast Attacker", @@ -726,7 +726,7 @@ ] }, "magmar": { - "level": 84, + "level": 85, "sets": [ { "role": "Fast Attacker", @@ -900,7 +900,7 @@ ] }, "zapdos": { - "level": 75, + "level": 74, "sets": [ { "role": "Staller", @@ -955,7 +955,7 @@ ] }, "mew": { - "level": 73, + "level": 72, "sets": [ { "role": "Bulky Support", @@ -1050,7 +1050,7 @@ ] }, "ariados": { - "level": 97, + "level": 98, "sets": [ { "role": "Setup Sweeper", @@ -1087,7 +1087,7 @@ ] }, "togetic": { - "level": 95, + "level": 96, "sets": [ { "role": "Staller", @@ -1778,7 +1778,7 @@ ] }, "celebi": { - "level": 75, + "level": 74, "sets": [ { "role": "Bulky Setup", @@ -1996,7 +1996,7 @@ ] }, "shedinja": { - "level": 97, + "level": 99, "sets": [ { "role": "Fast Attacker", @@ -2032,7 +2032,7 @@ ] }, "nosepass": { - "level": 98, + "level": 99, "sets": [ { "role": "Bulky Attacker", @@ -2255,7 +2255,7 @@ ] }, "spinda": { - "level": 98, + "level": 99, "sets": [ { "role": "Staller", @@ -2313,7 +2313,7 @@ ] }, "zangoose": { - "level": 80, + "level": 79, "sets": [ { "role": "Fast Attacker", @@ -2648,7 +2648,7 @@ ] }, "latios": { - "level": 66, + "level": 67, "sets": [ { "role": "Bulky Setup", diff --git a/data/random-battles/gen4/sets.json b/data/random-battles/gen4/sets.json index 7fc4a7c000e1..6d3b96021dca 100644 --- a/data/random-battles/gen4/sets.json +++ b/data/random-battles/gen4/sets.json @@ -903,7 +903,7 @@ ] }, "crobat": { - "level": 82, + "level": 81, "sets": [ { "role": "Bulky Support", @@ -944,7 +944,7 @@ ] }, "bellossom": { - "level": 90, + "level": 91, "sets": [ { "role": "Bulky Support", @@ -989,7 +989,7 @@ ] }, "jumpluff": { - "level": 91, + "level": 92, "sets": [ { "role": "Bulky Support", @@ -1097,7 +1097,7 @@ ] }, "dunsparce": { - "level": 92, + "level": 93, "sets": [ { "role": "Bulky Attacker", @@ -1257,7 +1257,7 @@ ] }, "kingdra": { - "level": 80, + "level": 79, "sets": [ { "role": "Bulky Setup", @@ -1326,7 +1326,7 @@ ] }, "miltank": { - "level": 82, + "level": 83, "sets": [ { "role": "Bulky Support", @@ -1352,7 +1352,7 @@ ] }, "raikou": { - "level": 76, + "level": 75, "sets": [ { "role": "Fast Attacker", @@ -1366,7 +1366,7 @@ ] }, "entei": { - "level": 81, + "level": 80, "sets": [ { "role": "Wallbreaker", @@ -1550,7 +1550,7 @@ ] }, "swellow": { - "level": 82, + "level": 81, "sets": [ { "role": "Fast Attacker", @@ -2098,7 +2098,7 @@ ] }, "absol": { - "level": 85, + "level": 84, "sets": [ { "role": "Bulky Attacker", @@ -2472,7 +2472,7 @@ ] }, "rampardos": { - "level": 89, + "level": 88, "sets": [ { "role": "Setup Sweeper", @@ -3180,7 +3180,7 @@ ] }, "giratina": { - "level": 69, + "level": 68, "sets": [ { "role": "Bulky Setup", diff --git a/data/random-battles/gen5/sets.json b/data/random-battles/gen5/sets.json index a8b449878b5f..8166cc447585 100644 --- a/data/random-battles/gen5/sets.json +++ b/data/random-battles/gen5/sets.json @@ -13,7 +13,7 @@ ] }, "charizard": { - "level": 85, + "level": 84, "sets": [ { "role": "Fast Attacker", @@ -194,7 +194,7 @@ ] }, "wigglytuff": { - "level": 95, + "level": 96, "sets": [ { "role": "Bulky Support", @@ -216,7 +216,7 @@ ] }, "parasect": { - "level": 97, + "level": 98, "sets": [ { "role": "Bulky Support", @@ -234,7 +234,7 @@ ] }, "venomoth": { - "level": 82, + "level": 81, "sets": [ { "role": "Bulky Setup", @@ -648,7 +648,7 @@ ] }, "tauros": { - "level": 82, + "level": 81, "sets": [ { "role": "Wallbreaker", @@ -825,7 +825,7 @@ ] }, "dragonite": { - "level": 75, + "level": 74, "sets": [ { "role": "Wallbreaker", @@ -974,7 +974,7 @@ ] }, "bellossom": { - "level": 93, + "level": 94, "sets": [ { "role": "Bulky Support", @@ -1020,7 +1020,7 @@ ] }, "jumpluff": { - "level": 86, + "level": 85, "sets": [ { "role": "Fast Support", @@ -1046,7 +1046,7 @@ ] }, "quagsire": { - "level": 85, + "level": 86, "sets": [ { "role": "Bulky Attacker", @@ -1149,7 +1149,7 @@ ] }, "gligar": { - "level": 83, + "level": 82, "sets": [ { "role": "Staller", @@ -1428,7 +1428,7 @@ ] }, "suicune": { - "level": 81, + "level": 80, "sets": [ { "role": "Bulky Attacker", @@ -1668,7 +1668,7 @@ ] }, "slaking": { - "level": 83, + "level": 82, "sets": [ { "role": "Fast Attacker", @@ -1690,7 +1690,7 @@ ] }, "shedinja": { - "level": 90, + "level": 91, "sets": [ { "role": "Setup Sweeper", @@ -1699,7 +1699,7 @@ ] }, "exploud": { - "level": 91, + "level": 92, "sets": [ { "role": "Wallbreaker", @@ -2406,7 +2406,7 @@ ] }, "empoleon": { - "level": 81, + "level": 80, "sets": [ { "role": "Staller", @@ -2423,7 +2423,7 @@ ] }, "staraptor": { - "level": 80, + "level": 79, "sets": [ { "role": "Fast Attacker", @@ -2474,7 +2474,7 @@ ] }, "rampardos": { - "level": 89, + "level": 88, "sets": [ { "role": "Setup Sweeper", @@ -2549,7 +2549,7 @@ ] }, "pachirisu": { - "level": 92, + "level": 93, "sets": [ { "role": "Bulky Support", @@ -2683,7 +2683,7 @@ ] }, "chatot": { - "level": 92, + "level": 93, "sets": [ { "role": "Wallbreaker", @@ -2745,7 +2745,7 @@ ] }, "drapion": { - "level": 84, + "level": 85, "sets": [ { "role": "Fast Attacker", @@ -2844,7 +2844,7 @@ ] }, "tangrowth": { - "level": 85, + "level": 86, "sets": [ { "role": "Bulky Attacker", @@ -3064,7 +3064,7 @@ ] }, "uxie": { - "level": 81, + "level": 80, "sets": [ { "role": "Bulky Support", @@ -3147,7 +3147,7 @@ ] }, "giratina": { - "level": 72, + "level": 71, "sets": [ { "role": "Fast Support", @@ -3204,7 +3204,7 @@ ] }, "darkrai": { - "level": 71, + "level": 70, "sets": [ { "role": "Setup Sweeper", @@ -3867,7 +3867,7 @@ ] }, "swanna": { - "level": 86, + "level": 87, "sets": [ { "role": "Bulky Attacker", @@ -3949,7 +3949,7 @@ ] }, "galvantula": { - "level": 82, + "level": 81, "sets": [ { "role": "Wallbreaker", @@ -3959,7 +3959,7 @@ ] }, "ferrothorn": { - "level": 74, + "level": 73, "sets": [ { "role": "Bulky Attacker", @@ -3995,7 +3995,7 @@ ] }, "beheeyem": { - "level": 89, + "level": 90, "sets": [ { "role": "Wallbreaker", @@ -4101,7 +4101,7 @@ ] }, "bisharp": { - "level": 84, + "level": 83, "sets": [ { "role": "Fast Attacker", @@ -4187,7 +4187,7 @@ ] }, "cobalion": { - "level": 78, + "level": 77, "sets": [ { "role": "Bulky Attacker", @@ -4233,7 +4233,7 @@ ] }, "tornadustherian": { - "level": 76, + "level": 75, "sets": [ { "role": "Fast Attacker", @@ -4327,7 +4327,7 @@ ] }, "kyuremblack": { - "level": 75, + "level": 74, "sets": [ { "role": "Bulky Attacker", @@ -4375,7 +4375,7 @@ ] }, "genesect": { - "level": 74, + "level": 73, "sets": [ { "role": "Setup Sweeper", diff --git a/data/random-battles/gen6/sets.json b/data/random-battles/gen6/sets.json index f6b90846063c..86ed60e3cb9b 100644 --- a/data/random-battles/gen6/sets.json +++ b/data/random-battles/gen6/sets.json @@ -652,7 +652,7 @@ ] }, "seaking": { - "level": 91, + "level": 92, "sets": [ { "role": "Fast Attacker", @@ -662,7 +662,7 @@ ] }, "starmie": { - "level": 81, + "level": 82, "sets": [ { "role": "Wallbreaker", @@ -784,7 +784,7 @@ ] }, "vaporeon": { - "level": 83, + "level": 84, "sets": [ { "role": "Bulky Support", @@ -905,7 +905,7 @@ ] }, "dragonite": { - "level": 75, + "level": 74, "sets": [ { "role": "Setup Sweeper", @@ -959,7 +959,7 @@ ] }, "meganium": { - "level": 91, + "level": 92, "sets": [ { "role": "Staller", @@ -997,7 +997,7 @@ ] }, "noctowl": { - "level": 94, + "level": 95, "sets": [ { "role": "Bulky Support", @@ -1075,7 +1075,7 @@ ] }, "bellossom": { - "level": 93, + "level": 94, "sets": [ { "role": "Bulky Support", @@ -1370,7 +1370,7 @@ ] }, "magcargo": { - "level": 96, + "level": 97, "sets": [ { "role": "Staller", @@ -1423,7 +1423,7 @@ ] }, "skarmory": { - "level": 79, + "level": 78, "sets": [ { "role": "Bulky Support", @@ -1999,7 +1999,7 @@ ] }, "manectricmega": { - "level": 80, + "level": 79, "sets": [ { "role": "Fast Attacker", @@ -2216,7 +2216,7 @@ ] }, "lunatone": { - "level": 93, + "level": 94, "sets": [ { "role": "Wallbreaker", @@ -2393,7 +2393,7 @@ ] }, "glalie": { - "level": 88, + "level": 89, "sets": [ { "role": "Fast Support", @@ -2566,7 +2566,7 @@ ] }, "latiasmega": { - "level": 78, + "level": 77, "sets": [ { "role": "Bulky Attacker", @@ -2768,7 +2768,7 @@ ] }, "bibarel": { - "level": 93, + "level": 94, "sets": [ { "role": "Setup Sweeper", @@ -2809,7 +2809,7 @@ ] }, "rampardos": { - "level": 88, + "level": 87, "sets": [ { "role": "Setup Sweeper", @@ -3138,7 +3138,7 @@ ] }, "carnivine": { - "level": 97, + "level": 98, "sets": [ { "role": "Bulky Support", @@ -3156,7 +3156,7 @@ ] }, "abomasnow": { - "level": 86, + "level": 85, "sets": [ { "role": "Bulky Attacker", @@ -3299,7 +3299,7 @@ ] }, "glaceon": { - "level": 89, + "level": 90, "sets": [ { "role": "Bulky Support", @@ -3312,7 +3312,7 @@ ] }, "gliscor": { - "level": 78, + "level": 77, "sets": [ { "role": "Staller", @@ -3366,7 +3366,7 @@ ] }, "probopass": { - "level": 90, + "level": 91, "sets": [ { "role": "Bulky Attacker", @@ -3827,7 +3827,7 @@ ] }, "victini": { - "level": 79, + "level": 78, "sets": [ { "role": "Fast Attacker", @@ -4150,7 +4150,7 @@ ] }, "maractus": { - "level": 95, + "level": 96, "sets": [ { "role": "Fast Support", @@ -4173,7 +4173,7 @@ ] }, "scrafty": { - "level": 84, + "level": 83, "sets": [ { "role": "Setup Sweeper", @@ -4249,7 +4249,7 @@ ] }, "zoroark": { - "level": 84, + "level": 83, "sets": [ { "role": "Wallbreaker", @@ -4268,7 +4268,7 @@ ] }, "gothitelle": { - "level": 86, + "level": 87, "sets": [ { "role": "Bulky Attacker", @@ -4491,7 +4491,7 @@ ] }, "mienshao": { - "level": 82, + "level": 81, "sets": [ { "role": "Wallbreaker", @@ -4638,7 +4638,7 @@ ] }, "virizion": { - "level": 82, + "level": 81, "sets": [ { "role": "Fast Attacker", @@ -4647,7 +4647,7 @@ ] }, "tornadus": { - "level": 83, + "level": 82, "sets": [ { "role": "Fast Attacker", @@ -4759,7 +4759,7 @@ ] }, "kyuremblack": { - "level": 75, + "level": 76, "sets": [ { "role": "Bulky Attacker", @@ -4856,7 +4856,7 @@ ] }, "diggersby": { - "level": 82, + "level": 81, "sets": [ { "role": "Setup Sweeper", diff --git a/data/random-battles/gen7/sets.json b/data/random-battles/gen7/sets.json index 1a8f1379992c..9edf74fe35fe 100644 --- a/data/random-battles/gen7/sets.json +++ b/data/random-battles/gen7/sets.json @@ -22,7 +22,7 @@ ] }, "charizard": { - "level": 83, + "level": 82, "sets": [ { "role": "Z-Move user", @@ -71,7 +71,7 @@ ] }, "blastoisemega": { - "level": 83, + "level": 82, "sets": [ { "role": "Bulky Support", @@ -316,7 +316,7 @@ ] }, "parasect": { - "level": 97, + "level": 98, "sets": [ { "role": "Bulky Attacker", @@ -437,7 +437,7 @@ ] }, "alakazam": { - "level": 82, + "level": 81, "sets": [ { "role": "Fast Attacker", @@ -519,7 +519,7 @@ ] }, "golemalola": { - "level": 89, + "level": 90, "sets": [ { "role": "Bulky Attacker", @@ -792,7 +792,7 @@ ] }, "kangaskhan": { - "level": 88, + "level": 87, "sets": [ { "role": "Bulky Support", @@ -829,7 +829,7 @@ ] }, "starmie": { - "level": 84, + "level": 85, "sets": [ { "role": "Wallbreaker", @@ -1115,7 +1115,7 @@ ] }, "mewtwomegax": { - "level": 71, + "level": 70, "sets": [ { "role": "Setup Sweeper", @@ -1124,7 +1124,7 @@ ] }, "mewtwomegay": { - "level": 71, + "level": 70, "sets": [ { "role": "Setup Sweeper", @@ -1155,7 +1155,7 @@ ] }, "typhlosion": { - "level": 86, + "level": 85, "sets": [ { "role": "Fast Attacker", @@ -1246,7 +1246,7 @@ ] }, "ampharos": { - "level": 88, + "level": 87, "sets": [ { "role": "Bulky Attacker", @@ -1393,7 +1393,7 @@ ] }, "wobbuffet": { - "level": 87, + "level": 88, "sets": [ { "role": "Bulky Support", @@ -1437,7 +1437,7 @@ ] }, "gligar": { - "level": 83, + "level": 82, "sets": [ { "role": "Staller", @@ -1482,7 +1482,7 @@ ] }, "qwilfish": { - "level": 88, + "level": 87, "sets": [ { "role": "Fast Support", @@ -1530,7 +1530,7 @@ ] }, "heracross": { - "level": 83, + "level": 82, "sets": [ { "role": "Wallbreaker", @@ -1576,7 +1576,7 @@ ] }, "corsola": { - "level": 93, + "level": 94, "sets": [ { "role": "Bulky Support", @@ -1585,7 +1585,7 @@ ] }, "octillery": { - "level": 94, + "level": 95, "sets": [ { "role": "Wallbreaker", @@ -1670,7 +1670,7 @@ ] }, "stantler": { - "level": 90, + "level": 91, "sets": [ { "role": "Wallbreaker", @@ -1738,7 +1738,7 @@ ] }, "entei": { - "level": 79, + "level": 78, "sets": [ { "role": "Wallbreaker", @@ -1781,7 +1781,7 @@ ] }, "tyranitarmega": { - "level": 78, + "level": 77, "sets": [ { "role": "Setup Sweeper", @@ -1925,7 +1925,7 @@ ] }, "dustox": { - "level": 94, + "level": 95, "sets": [ { "role": "Bulky Setup", @@ -2070,7 +2070,7 @@ ] }, "shedinja": { - "level": 92, + "level": 93, "sets": [ { "role": "Setup Sweeper", @@ -2536,7 +2536,7 @@ ] }, "banette": { - "level": 92, + "level": 93, "sets": [ { "role": "Wallbreaker", @@ -2820,7 +2820,7 @@ ] }, "kyogre": { - "level": 70, + "level": 69, "sets": [ { "role": "Fast Attacker", @@ -2868,7 +2868,7 @@ ] }, "rayquaza": { - "level": 72, + "level": 71, "sets": [ { "role": "Z-Move user", @@ -3100,7 +3100,7 @@ ] }, "mothim": { - "level": 95, + "level": 94, "sets": [ { "role": "Setup Sweeper", @@ -3123,7 +3123,7 @@ ] }, "pachirisu": { - "level": 94, + "level": 95, "sets": [ { "role": "Bulky Support", @@ -3242,7 +3242,7 @@ ] }, "purugly": { - "level": 89, + "level": 90, "sets": [ { "role": "Fast Attacker", @@ -3347,7 +3347,7 @@ ] }, "lucariomega": { - "level": 76, + "level": 75, "sets": [ { "role": "Bulky Setup", @@ -3439,7 +3439,7 @@ ] }, "magnezone": { - "level": 83, + "level": 84, "sets": [ { "role": "Fast Attacker", @@ -4174,7 +4174,7 @@ ] }, "watchog": { - "level": 94, + "level": 95, "sets": [ { "role": "Bulky Attacker", @@ -4221,7 +4221,7 @@ ] }, "simisear": { - "level": 89, + "level": 90, "sets": [ { "role": "Setup Sweeper", @@ -4741,7 +4741,7 @@ ] }, "chandelure": { - "level": 83, + "level": 84, "sets": [ { "role": "Fast Attacker", @@ -4870,7 +4870,7 @@ ] }, "braviary": { - "level": 84, + "level": 83, "sets": [ { "role": "Bulky Attacker", @@ -5169,7 +5169,7 @@ ] }, "genesect": { - "level": 75, + "level": 74, "sets": [ { "role": "Setup Sweeper", @@ -5350,7 +5350,7 @@ ] }, "meowsticf": { - "level": 89, + "level": 90, "sets": [ { "role": "Fast Attacker", @@ -5414,7 +5414,7 @@ ] }, "barbaracle": { - "level": 82, + "level": 81, "sets": [ { "role": "Setup Sweeper", @@ -5530,7 +5530,7 @@ ] }, "goodra": { - "level": 84, + "level": 85, "sets": [ { "role": "Bulky Attacker", @@ -5610,7 +5610,7 @@ ] }, "noivern": { - "level": 84, + "level": 83, "sets": [ { "role": "Fast Attacker", @@ -5754,7 +5754,7 @@ ] }, "toucannon": { - "level": 87, + "level": 88, "sets": [ { "role": "Wallbreaker", @@ -5918,7 +5918,7 @@ ] }, "mudsdale": { - "level": 84, + "level": 83, "sets": [ { "role": "Bulky Support", @@ -6313,7 +6313,7 @@ ] }, "mimikyu": { - "level": 74, + "level": 73, "sets": [ { "role": "Setup Sweeper", @@ -6494,7 +6494,7 @@ ] }, "celesteela": { - "level": 80, + "level": 79, "sets": [ { "role": "AV Pivot", @@ -6552,7 +6552,7 @@ ] }, "necrozmaduskmane": { - "level": 68, + "level": 69, "sets": [ { "role": "Bulky Setup", diff --git a/data/random-battles/gen8/data.json b/data/random-battles/gen8/data.json index c3ab34d4fb8a..7b1861069fc2 100644 --- a/data/random-battles/gen8/data.json +++ b/data/random-battles/gen8/data.json @@ -275,7 +275,7 @@ "doublesMoves": ["coaching", "drainpunch", "feint", "firepunch", "icepunch", "machpunch"] }, "weezing": { - "level": 86, + "level": 87, "moves": ["fireblast", "painsplit", "sludgebomb", "toxicspikes", "willowisp"], "doublesLevel": 88, "doublesMoves": ["fireblast", "painsplit", "sludgebomb", "toxicspikes", "willowisp"] @@ -301,7 +301,7 @@ "doublesMoves": ["doubleedge", "drainpunch", "fakeout", "protect", "rockslide", "suckerpunch"] }, "seaking": { - "level": 89, + "level": 90, "moves": ["drillrun", "knockoff", "megahorn", "swordsdance", "waterfall"], "doublesLevel": 88, "doublesMoves": ["drillrun", "knockoff", "megahorn", "protect", "scaleshot", "swordsdance", "waterfall"] @@ -319,11 +319,11 @@ "doublesMoves": ["dazzlinggleam", "fakeout", "icywind", "lightscreen", "psychic", "reflect"] }, "mrmimegalar": { - "level": 85, + "level": 84, "moves": ["focusblast", "freezedry", "nastyplot", "psychic", "rapidspin"] }, "scyther": { - "level": 81, + "level": 82, "moves": ["brickbreak", "dualwingbeat", "knockoff", "roost", "swordsdance", "uturn"], "doublesLevel": 84, "doublesMoves": ["brickbreak", "bugbite", "dualwingbeat", "uturn"] @@ -377,7 +377,7 @@ "doublesMoves": ["faketears", "helpinghand", "shadowball", "thunderbolt", "thunderwave"] }, "flareon": { - "level": 86, + "level": 87, "moves": ["facade", "flamecharge", "flareblitz", "quickattack", "superpower"], "doublesLevel": 88, "doublesMoves": ["facade", "flamecharge", "flareblitz", "protect", "quickattack", "superpower"] @@ -830,7 +830,7 @@ "doublesMoves": ["earthpower", "icebeam", "meteorbeam", "protect", "psychic", "trickroom"] }, "solrock": { - "level": 89, + "level": 90, "moves": ["earthquake", "explosion", "morningsun", "rockslide", "stealthrock", "willowisp"], "doublesLevel": 88, "doublesMoves": ["flareblitz", "helpinghand", "rockslide", "stoneedge", "willowisp"] @@ -867,7 +867,7 @@ "noDynamaxMoves": ["earthquake", "knockoff", "rapidspin", "stealthrock", "stoneedge", "swordsdance"] }, "milotic": { - "level": 82, + "level": 81, "moves": ["haze", "icebeam", "recover", "scald", "toxic"], "doublesLevel": 80, "doublesMoves": ["coil", "hypnosis", "muddywater", "recover"] @@ -903,7 +903,7 @@ "doublesMoves": ["dragonclaw", "fireblast", "hurricane", "protect", "tailwind"] }, "metagross": { - "level": 78, + "level": 79, "moves": ["agility", "bulletpunch", "earthquake", "explosion", "meteormash", "stealthrock", "thunderpunch"], "doublesLevel": 82, "doublesMoves": ["agility", "bulletpunch", "icepunch", "meteormash", "stompingtantrum", "trick", "zenheadbutt"] @@ -1053,7 +1053,7 @@ "doublesMoves": ["knockoff", "poisonjab", "protect", "swordsdance", "taunt"] }, "toxicroak": { - "level": 84, + "level": 85, "moves": ["drainpunch", "gunkshot", "icepunch", "knockoff", "substitute", "suckerpunch", "swordsdance"], "doublesLevel": 86, "doublesMoves": ["drainpunch", "fakeout", "gunkshot", "protect", "suckerpunch", "swordsdance", "taunt"] @@ -1144,7 +1144,7 @@ "doublesMoves": ["closecombat", "feint", "knockoff", "protect", "swordsdance", "tripleaxel", "zenheadbutt"] }, "dusknoir": { - "level": 87, + "level": 88, "moves": ["earthquake", "icepunch", "painsplit", "poltergeist", "shadowsneak", "trick", "willowisp"], "doublesLevel": 86, "doublesMoves": ["earthquake", "haze", "icepunch", "poltergeist", "shadowsneak", "trickroom", "willowisp"] @@ -1394,7 +1394,7 @@ "doublesMoves": ["knockoff", "protect", "rockslide", "shellsmash", "xscissor"] }, "scrafty": { - "level": 83, + "level": 82, "moves": ["closecombat", "dragondance", "icepunch", "knockoff", "poisonjab"], "doublesLevel": 84, "doublesMoves": ["closecombat", "coaching", "drainpunch", "fakeout", "icepunch", "knockoff"] @@ -1430,7 +1430,7 @@ "doublesMoves": ["drainpunch", "explosion", "gunkshot", "protect", "toxicspikes"] }, "zoroark": { - "level": 84, + "level": 83, "moves": ["darkpulse", "flamethrower", "nastyplot", "sludgebomb", "trick"], "doublesLevel": 84, "doublesMoves": ["darkpulse", "flamethrower", "focusblast", "nastyplot", "protect", "sludgebomb"] @@ -1496,7 +1496,7 @@ "doublesMoves": ["bodypress", "gyroball", "leechseed", "powerwhip", "protect", "toxic"] }, "klinklang": { - "level": 84, + "level": 83, "moves": ["geargrind", "shiftgear", "substitute", "wildcharge"], "doublesLevel": 88, "doublesMoves": ["geargrind", "protect", "shiftgear", "wildcharge"] @@ -1581,7 +1581,7 @@ "doublesMoves": ["closecombat", "headcharge", "lashout", "protect", "wildcharge"] }, "braviary": { - "level": 81, + "level": 80, "moves": ["bravebird", "bulkup", "closecombat", "roost"], "doublesLevel": 82, "doublesMoves": ["bravebird", "bulkup", "closecombat", "roost", "tailwind"] @@ -1879,7 +1879,7 @@ "doublesMoves": ["poltergeist", "powerwhip", "protect", "shadowsneak", "trickroom"] }, "gourgeistsuper": { - "level": 85, + "level": 84, "moves": ["poltergeist", "powerwhip", "rockslide", "shadowsneak", "trickroom"], "doublesLevel": 88, "doublesMoves": ["poltergeist", "powerwhip", "protect", "shadowsneak", "trickroom"] @@ -1988,7 +1988,7 @@ "doublesMoves": ["earthquake", "helpinghand", "hydropump", "icebeam", "muddywater", "protect"] }, "toxapex": { - "level": 80, + "level": 79, "moves": ["banefulbunker", "haze", "recover", "scald", "toxic", "toxicspikes"], "doublesLevel": 90, "doublesMoves": ["banefulbunker", "haze", "recover", "scald", "toxic", "toxicspikes"] @@ -2054,7 +2054,7 @@ "doublesMoves": ["closecombat", "gunkshot", "knockoff", "rockslide", "uturn"] }, "golisopod": { - "level": 84, + "level": 85, "moves": ["firstimpression", "knockoff", "leechlife", "liquidation", "spikes"], "doublesLevel": 88, "doublesMoves": ["aquajet", "firstimpression", "knockoff", "leechlife", "liquidation", "protect", "wideguard"] @@ -2244,7 +2244,7 @@ "doublesMoves": ["haze", "healpulse", "moonblast", "muddywater", "naturesmadness", "protect", "taunt"] }, "solgaleo": { - "level": 71, + "level": 72, "moves": ["closecombat", "flamecharge", "flareblitz", "knockoff", "psychicfangs", "sunsteelstrike"], "doublesLevel": 76, "doublesMoves": ["closecombat", "flareblitz", "morningsun", "protect", "psychicfangs", "stoneedge", "sunsteelstrike"] @@ -2355,7 +2355,7 @@ "doublesMoves": ["closecombat", "fakeout", "grassknot", "knockoff", "plasmafists", "snarl"] }, "melmetal": { - "level": 74, + "level": 73, "moves": ["doubleironbash", "earthquake", "superpower", "thunderpunch", "thunderwave"], "doublesLevel": 76, "doublesMoves": ["acidarmor", "bodypress", "doubleironbash", "protect", "thunderpunch", "thunderwave"] @@ -2456,13 +2456,13 @@ "doublesMoves": ["acrobatics", "dragondance", "dragonrush", "gravapple", "protect"] }, "appletun": { - "level": 90, + "level": 91, "moves": ["appleacid", "dragonpulse", "leechseed", "recover"], "doublesLevel": 90, "doublesMoves": ["appleacid", "dragonpulse", "leechseed", "protect", "recover"] }, "appletungmax": { - "level": 90, + "level": 91, "moves": ["appleacid", "dracometeor", "leechseed", "recover"] }, "sandaconda": { @@ -2672,7 +2672,7 @@ "doublesMoves": ["bodypress", "dracometeor", "dragonpulse", "flashcannon", "protect", "snarl", "thunderbolt"] }, "dragapult": { - "level": 77, + "level": 76, "moves": ["dracometeor", "fireblast", "shadowball", "thunderbolt", "uturn"], "doublesLevel": 80, "doublesMoves": ["dragondarts", "fireblast", "protect", "shadowball", "thunderbolt", "thunderwave"] @@ -2696,7 +2696,7 @@ "doublesMoves": ["closecombat", "crunch", "playrough", "protect", "psychicfangs"] }, "zamazentacrowned": { - "level": 71, + "level": 70, "moves": ["behemothbash", "closecombat", "crunch", "howl", "psychicfangs"], "doublesLevel": 72, "doublesMoves": ["behemothbash", "closecombat", "crunch", "howl", "protect"] diff --git a/data/random-battles/gen9/doubles-sets.json b/data/random-battles/gen9/doubles-sets.json index 9eb433cd5ca8..03c452515dd9 100644 --- a/data/random-battles/gen9/doubles-sets.json +++ b/data/random-battles/gen9/doubles-sets.json @@ -10,7 +10,7 @@ ] }, "charizard": { - "level": 83, + "level": 82, "sets": [ { "role": "Offensive Protect", @@ -120,7 +120,7 @@ ] }, "clefairy": { - "level": 96, + "level": 97, "sets": [ { "role": "Doubles Support", @@ -510,7 +510,7 @@ ] }, "hitmonchan": { - "level": 89, + "level": 90, "sets": [ { "role": "Doubles Bulky Attacker", @@ -530,7 +530,7 @@ ] }, "weezinggalar": { - "level": 87, + "level": 88, "sets": [ { "role": "Doubles Bulky Attacker", @@ -665,7 +665,7 @@ ] }, "ditto": { - "level": 96, + "level": 97, "sets": [ { "role": "Choice Item user", @@ -765,7 +765,7 @@ ] }, "zapdosgalar": { - "level": 78, + "level": 77, "sets": [ { "role": "Doubles Fast Attacker", @@ -1215,7 +1215,7 @@ ] }, "houndoom": { - "level": 87, + "level": 86, "sets": [ { "role": "Doubles Fast Attacker", @@ -1295,7 +1295,7 @@ ] }, "blissey": { - "level": 95, + "level": 96, "sets": [ { "role": "Doubles Support", @@ -1305,7 +1305,7 @@ ] }, "raikou": { - "level": 82, + "level": 81, "sets": [ { "role": "Offensive Protect", @@ -1480,7 +1480,7 @@ ] }, "masquerain": { - "level": 88, + "level": 89, "sets": [ { "role": "Doubles Setup Sweeper", @@ -1750,7 +1750,7 @@ ] }, "tropius": { - "level": 93, + "level": 94, "sets": [ { "role": "Doubles Support", @@ -1815,7 +1815,7 @@ ] }, "regirock": { - "level": 84, + "level": 83, "sets": [ { "role": "Doubles Bulky Setup", @@ -1840,7 +1840,7 @@ ] }, "registeel": { - "level": 79, + "level": 78, "sets": [ { "role": "Doubles Bulky Setup", @@ -1965,7 +1965,7 @@ ] }, "deoxysspeed": { - "level": 83, + "level": 84, "sets": [ { "role": "Doubles Support", @@ -2930,7 +2930,7 @@ ] }, "serperior": { - "level": 82, + "level": 81, "sets": [ { "role": "Offensive Protect", @@ -3470,7 +3470,7 @@ ] }, "tornadustherian": { - "level": 78, + "level": 77, "sets": [ { "role": "Doubles Setup Sweeper", @@ -3485,7 +3485,7 @@ ] }, "thundurus": { - "level": 80, + "level": 79, "sets": [ { "role": "Doubles Setup Sweeper", @@ -3505,7 +3505,7 @@ ] }, "thundurustherian": { - "level": 79, + "level": 78, "sets": [ { "role": "Doubles Fast Attacker", @@ -3810,7 +3810,7 @@ ] }, "dedenne": { - "level": 87, + "level": 86, "sets": [ { "role": "Doubles Support", @@ -3820,7 +3820,7 @@ ] }, "carbink": { - "level": 89, + "level": 88, "sets": [ { "role": "Doubles Bulky Setup", @@ -4060,7 +4060,7 @@ ] }, "oricoriopau": { - "level": 88, + "level": 89, "sets": [ { "role": "Bulky Protect", @@ -4350,7 +4350,7 @@ ] }, "necrozmadawnwings": { - "level": 73, + "level": 74, "sets": [ { "role": "Doubles Wallbreaker", @@ -4420,7 +4420,7 @@ ] }, "inteleon": { - "level": 81, + "level": 80, "sets": [ { "role": "Choice Item user", @@ -4470,7 +4470,7 @@ ] }, "flapple": { - "level": 93, + "level": 94, "sets": [ { "role": "Doubles Bulky Attacker", @@ -4520,7 +4520,7 @@ ] }, "barraskewda": { - "level": 83, + "level": 84, "sets": [ { "role": "Doubles Wallbreaker", @@ -4655,7 +4655,7 @@ ] }, "stonjourner": { - "level": 89, + "level": 88, "sets": [ { "role": "Doubles Fast Attacker", @@ -5595,7 +5595,7 @@ ] }, "brutebonnet": { - "level": 79, + "level": 80, "sets": [ { "role": "Doubles Bulky Attacker", @@ -5605,7 +5605,7 @@ ] }, "sandyshocks": { - "level": 80, + "level": 79, "sets": [ { "role": "Doubles Fast Attacker", @@ -5835,7 +5835,7 @@ ] }, "koraidon": { - "level": 67, + "level": 66, "sets": [ { "role": "Choice Item user", @@ -5885,7 +5885,7 @@ ] }, "dipplin": { - "level": 90, + "level": 91, "sets": [ { "role": "Doubles Bulky Attacker", @@ -6030,7 +6030,7 @@ ] }, "hydrapple": { - "level": 84, + "level": 85, "sets": [ { "role": "Doubles Wallbreaker", @@ -6050,7 +6050,7 @@ ] }, "ragingbolt": { - "level": 78, + "level": 77, "sets": [ { "role": "Doubles Wallbreaker", diff --git a/data/random-battles/gen9/sets.json b/data/random-battles/gen9/sets.json index bfd24dc64ae6..afbcffa60e97 100644 --- a/data/random-battles/gen9/sets.json +++ b/data/random-battles/gen9/sets.json @@ -825,7 +825,7 @@ ] }, "articunogalar": { - "level": 83, + "level": 84, "sets": [ { "role": "Fast Bulky Setup", @@ -970,7 +970,7 @@ ] }, "feraligatr": { - "level": 80, + "level": 79, "sets": [ { "role": "Fast Bulky Setup", @@ -1010,7 +1010,7 @@ ] }, "ariados": { - "level": 94, + "level": 95, "sets": [ { "role": "Fast Support", @@ -1080,7 +1080,7 @@ ] }, "sudowoodo": { - "level": 93, + "level": 94, "sets": [ { "role": "Bulky Attacker", @@ -2080,7 +2080,7 @@ ] }, "regirock": { - "level": 84, + "level": 83, "sets": [ { "role": "Bulky Attacker", @@ -2850,7 +2850,7 @@ ] }, "rotomheat": { - "level": 82, + "level": 83, "sets": [ { "role": "Bulky Attacker", @@ -3195,7 +3195,7 @@ ] }, "arceusfighting": { - "level": 69, + "level": 70, "sets": [ { "role": "Fast Bulky Setup", @@ -3240,7 +3240,7 @@ ] }, "arceusghost": { - "level": 70, + "level": 69, "sets": [ { "role": "Bulky Support", @@ -3300,7 +3300,7 @@ ] }, "arceuspoison": { - "level": 72, + "level": 71, "sets": [ { "role": "Setup Sweeper", @@ -3365,7 +3365,7 @@ ] }, "serperior": { - "level": 80, + "level": 79, "sets": [ { "role": "Tera Blast user", @@ -4150,7 +4150,7 @@ ] }, "vivillon": { - "level": 85, + "level": 84, "sets": [ { "role": "Fast Bulky Setup", @@ -4460,7 +4460,7 @@ ] }, "incineroar": { - "level": 84, + "level": 83, "sets": [ { "role": "AV Pivot", @@ -5730,7 +5730,7 @@ ] }, "armarouge": { - "level": 81, + "level": 80, "sets": [ { "role": "Wallbreaker", @@ -5970,7 +5970,7 @@ ] }, "glimmora": { - "level": 76, + "level": 75, "sets": [ { "role": "Fast Support", From 973b01c1e41017170f80a47f21649272bd4e7dae Mon Sep 17 00:00:00 2001 From: Guangcong Luo Date: Mon, 1 Jul 2024 01:01:40 -0700 Subject: [PATCH 088/139] Refactor Crazyhouse rule implementation Previous implementation was quite wonky and doesn't really need to be. --- data/rulesets.ts | 59 +++++++++++++++++------------------------------- sim/side.ts | 14 +++++++++--- 2 files changed, 32 insertions(+), 41 deletions(-) diff --git a/data/rulesets.ts b/data/rulesets.ts index b9171a543bbd..246599155cdf 100644 --- a/data/rulesets.ts +++ b/data/rulesets.ts @@ -1,7 +1,6 @@ // Note: These are the rules that formats use import type {Learnset} from "../sim/dex-species"; -import {Pokemon} from "../sim/pokemon"; // The list of formats is stored in config/formats.js export const Rulesets: {[k: string]: FormatData} = { @@ -2069,47 +2068,31 @@ export const Rulesets: {[k: string]: FormatData} = { } }, onFaint(target, source, effect) { - if (!target.m.numSwaps) { - target.m.numSwaps = 0; - } + target.m.numSwaps ||= 0; target.m.numSwaps++; - if (effect && effect.effectType === 'Move' && source.side.pokemon.length < 24 && - source.side !== target.side && target.m.numSwaps < 4) { - const hpCost = this.clampIntRange(Math.floor((target.baseMaxhp * target.m.numSwaps) / 4), 1); - // Just in case(tm) and for Shedinja - if (hpCost === target.baseMaxhp) { - target.m.outofplay = true; - return; - } - source.side.pokemonLeft++; - source.side.pokemon.length++; - - // A new Pokemon is created and stuff gets aside akin to a deep clone. - // This is because deepClone crashes when side is called recursively. - // Until a refactor is made to prevent it, this is the best option to prevent crashes. - const newPoke = new Pokemon(target.set, source.side); - const newPos = source.side.pokemon.length - 1; + if (effect?.effectType !== 'Move' || source.side.pokemon.length >= 24 || + source.side === target.side || target.m.numSwaps >= 4) { + target.m.outofplay = true; + return; + } - const doNotCarryOver = [ - 'fullname', 'side', 'fainted', 'status', 'hp', 'illusion', - 'transformed', 'position', 'isActive', 'faintQueued', - 'subFainted', 'getHealth', 'getDetails', 'moveSlots', 'ability', - ]; - for (const [key, value] of Object.entries(target)) { - if (doNotCarryOver.includes(key)) continue; - // @ts-ignore - newPoke[key] = value; - } - newPoke.maxhp = newPoke.baseMaxhp; // for dynamax - newPoke.hp = newPoke.baseMaxhp - hpCost; - newPoke.clearVolatile(); - newPoke.position = newPos; - source.side.pokemon[newPos] = newPoke; - this.add('poke', source.side.pokemon[newPos].side.id, source.side.pokemon[newPos].details, ''); - this.add('-message', `${target.name} was captured by ${newPoke.side.name}!`); - } else { + const hpCost = this.clampIntRange(Math.floor((target.baseMaxhp * target.m.numSwaps) / 4), 1); + // Just in case(tm) and for Shedinja + if (hpCost >= target.baseMaxhp) { target.m.outofplay = true; + return; } + + const newPoke = source.side.addPokemon({...target.set, item: target.item})!; + + // copy PP over + (newPoke as any).baseMoveSlots = target.baseMoveSlots; + + newPoke.hp = this.clampIntRange(newPoke.maxhp - hpCost, 1); + newPoke.clearVolatile(); + + this.add('poke', newPoke.side.id, newPoke.details, ''); + this.add('-message', `${target.name} was captured by ${newPoke.side.name}!`); }, }, chimera1v1rule: { diff --git a/sim/side.ts b/sim/side.ts index b5144666da6c..829f6aea64a9 100644 --- a/sim/side.ts +++ b/sim/side.ts @@ -117,10 +117,9 @@ export class Side { this.team = team; this.pokemon = []; - for (let i = 0; i < this.team.length && i < 24; i++) { + for (const set of this.team) { // console.log("NEW POKEMON: " + (this.team[i] ? this.team[i].name : '[unidentified]')); - this.pokemon.push(new Pokemon(this.team[i], this)); - this.pokemon[i].position = i; + this.addPokemon(set); } switch (this.battle.gameType) { @@ -176,6 +175,15 @@ export class Side { return 'move'; } + addPokemon(set: PokemonSet) { + if (this.pokemon.length >= 24) return null; + const newPokemon = new Pokemon(set, this); + newPokemon.position = this.pokemon.length; + this.pokemon.push(newPokemon); + this.pokemonLeft++; + return newPokemon; + } + canDynamaxNow(): boolean { if (this.battle.gen !== 8) return false; // In multi battles, players on a team are alternatingly given the option to dynamax each turn From 77f6c9de2e9574bde1b78380997b03e94195a2af Mon Sep 17 00:00:00 2001 From: ACakeWearingAHat <45981036+ACakeWearingAHat@users.noreply.github.com> Date: Mon, 1 Jul 2024 08:48:29 -0500 Subject: [PATCH 089/139] Randomized format set updates (#10376) --- data/random-battles/gen2/teams.ts | 4 + data/random-battles/gen3/sets.json | 2 +- data/random-battles/gen3/teams.ts | 6 + data/random-battles/gen4/sets.json | 27 ++- data/random-battles/gen4/teams.ts | 5 + data/random-battles/gen5/sets.json | 32 ++- data/random-battles/gen5/teams.ts | 10 +- data/random-battles/gen6/sets.json | 45 ++-- data/random-battles/gen6/teams.ts | 5 + data/random-battles/gen7/sets.json | 54 ++--- data/random-battles/gen7/teams.ts | 9 +- data/random-battles/gen8/data.json | 8 +- .../random-battles/gen9/bss-factory-sets.json | 209 ++++++++++++++---- data/random-battles/gen9/doubles-sets.json | 11 +- data/random-battles/gen9/sets.json | 133 +++++------ data/random-battles/gen9/teams.ts | 21 +- data/random-battles/gen9baby/sets.json | 51 +++-- data/random-battles/gen9baby/teams.ts | 6 +- 18 files changed, 414 insertions(+), 224 deletions(-) diff --git a/data/random-battles/gen2/teams.ts b/data/random-battles/gen2/teams.ts index 7810c2d9c711..b8660a3965b3 100644 --- a/data/random-battles/gen2/teams.ts +++ b/data/random-battles/gen2/teams.ts @@ -112,6 +112,10 @@ export class RandomGen2Teams extends RandomGen3Teams { if (movePool.includes('rapidspin')) this.fastPop(movePool, movePool.indexOf('rapidspin')); if (moves.size + movePool.length <= this.maxMoveCount) return; } + if (teamDetails.statusCure) { + if (movePool.includes('healbell')) this.fastPop(movePool, movePool.indexOf('healbell')); + if (moves.size + movePool.length <= this.maxMoveCount) return; + } // General incompatibilities const incompatiblePairs = [ diff --git a/data/random-battles/gen3/sets.json b/data/random-battles/gen3/sets.json index e89cc57c3bdf..f5a7df1efdd3 100644 --- a/data/random-battles/gen3/sets.json +++ b/data/random-battles/gen3/sets.json @@ -513,7 +513,7 @@ "sets": [ { "role": "Bulky Setup", - "movepool": ["batonpass", "calmmind", "firepunch", "protect", "psychic", "wish"] + "movepool": ["batonpass", "calmmind", "firepunch", "psychic"] }, { "role": "Bulky Support", diff --git a/data/random-battles/gen3/teams.ts b/data/random-battles/gen3/teams.ts index 203f26215cda..bdb0c8a14f48 100644 --- a/data/random-battles/gen3/teams.ts +++ b/data/random-battles/gen3/teams.ts @@ -122,6 +122,11 @@ export class RandomGen3Teams extends RandomGen4Teams { if (movePool.includes('rapidspin')) this.fastPop(movePool, movePool.indexOf('rapidspin')); if (moves.size + movePool.length <= this.maxMoveCount) return; } + if (teamDetails.statusCure) { + if (movePool.includes('aromatherapy')) this.fastPop(movePool, movePool.indexOf('aromatherapy')); + if (movePool.includes('healbell')) this.fastPop(movePool, movePool.indexOf('healbell')); + if (moves.size + movePool.length <= this.maxMoveCount) return; + } // Develop additional move lists const badWithSetup = ['knockoff', 'rapidspin', 'toxic']; @@ -772,6 +777,7 @@ export class RandomGen3Teams extends RandomGen4Teams { if (set.ability === 'Drizzle' || set.moves.includes('raindance')) teamDetails.rain = 1; if (set.ability === 'Drought' || set.moves.includes('sunnyday')) teamDetails.sun = 1; if (set.ability === 'Sand Stream') teamDetails.sand = 1; + if (set.moves.includes('aromatherapy') || set.moves.includes('healbell')) teamDetails.statusCure = 1; if (set.moves.includes('spikes')) teamDetails.spikes = 1; if (set.moves.includes('rapidspin')) teamDetails.rapidSpin = 1; diff --git a/data/random-battles/gen4/sets.json b/data/random-battles/gen4/sets.json index 6d3b96021dca..7f0752073207 100644 --- a/data/random-battles/gen4/sets.json +++ b/data/random-battles/gen4/sets.json @@ -957,7 +957,8 @@ "sets": [ { "role": "Bulky Attacker", - "movepool": ["aquajet", "doubleedge", "icepunch", "superpower", "waterfall"] + "movepool": ["aquajet", "doubleedge", "icepunch", "superpower", "waterfall"], + "preferredTypes": ["Ice"] }, { "role": "Bulky Setup", @@ -1431,7 +1432,7 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["earthpower", "energyball", "hiddenpowerfire", "leafstorm", "nastyplot", "psychic", "uturn"], + "movepool": ["earthpower", "energyball", "leafstorm", "nastyplot", "psychic", "uturn"], "preferredTypes": ["Psychic"] }, { @@ -2339,8 +2340,11 @@ "sets": [ { "role": "Wallbreaker", - "movepool": ["extremespeed", "icebeam", "psychoboost", "shadowball", "stealthrock", "superpower"], - "preferredTypes": ["Fighting"] + "movepool": ["extremespeed", "psychoboost", "shadowball", "superpower"] + }, + { + "role": "Fast Attacker", + "movepool": ["icebeam", "psychoboost", "shadowball", "superpower"] } ] }, @@ -2349,8 +2353,11 @@ "sets": [ { "role": "Wallbreaker", - "movepool": ["extremespeed", "icebeam", "psychoboost", "shadowball", "superpower"], - "preferredTypes": ["Fighting"] + "movepool": ["extremespeed", "psychoboost", "shadowball", "superpower"] + }, + { + "role": "Fast Attacker", + "movepool": ["icebeam", "psychoboost", "shadowball", "superpower"] } ] }, @@ -3175,7 +3182,7 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["dracometeor", "earthquake", "hiddenpowerfire", "outrage", "shadowball", "shadowsneak", "willowisp"] + "movepool": ["dracometeor", "earthquake", "outrage", "shadowball", "shadowsneak", "willowisp"] } ] }, @@ -3191,13 +3198,9 @@ "cresselia": { "level": 79, "sets": [ - { - "role": "Bulky Attacker", - "movepool": ["calmmind", "hiddenpowerfighting", "psychic", "substitute"] - }, { "role": "Bulky Setup", - "movepool": ["calmmind", "hiddenpowerfighting", "moonlight", "psychic"] + "movepool": ["calmmind", "hiddenpowerfighting", "moonlight", "psychic", "signalbeam"] }, { "role": "Bulky Support", diff --git a/data/random-battles/gen4/teams.ts b/data/random-battles/gen4/teams.ts index af367fa8c43d..5e248ae7d8df 100644 --- a/data/random-battles/gen4/teams.ts +++ b/data/random-battles/gen4/teams.ts @@ -157,6 +157,11 @@ export class RandomGen4Teams extends RandomGen5Teams { if (movePool.includes('spikes')) this.fastPop(movePool, movePool.indexOf('spikes')); if (moves.size + movePool.length <= this.maxMoveCount) return; } + if (teamDetails.statusCure) { + if (movePool.includes('aromatherapy')) this.fastPop(movePool, movePool.indexOf('aromatherapy')); + if (movePool.includes('healbell')) this.fastPop(movePool, movePool.indexOf('healbell')); + if (moves.size + movePool.length <= this.maxMoveCount) return; + } // Develop additional move lists const badWithSetup = ['healbell', 'pursuit', 'toxic']; diff --git a/data/random-battles/gen5/sets.json b/data/random-battles/gen5/sets.json index 8166cc447585..1897c6fb7de1 100644 --- a/data/random-battles/gen5/sets.json +++ b/data/random-battles/gen5/sets.json @@ -987,7 +987,8 @@ "sets": [ { "role": "Bulky Attacker", - "movepool": ["aquajet", "doubleedge", "icepunch", "superpower", "waterfall"] + "movepool": ["aquajet", "doubleedge", "icepunch", "superpower", "waterfall"], + "preferredTypes": ["Ice"] }, { "role": "Bulky Setup", @@ -1480,7 +1481,7 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["earthpower", "gigadrain", "hiddenpowerfire", "leafstorm", "nastyplot", "psychic", "uturn"], + "movepool": ["earthpower", "gigadrain", "leafstorm", "nastyplot", "psychic", "uturn"], "preferredTypes": ["Psychic"] }, { @@ -1754,9 +1755,14 @@ "mawile": { "level": 95, "sets": [ + { + "role": "Bulky Setup", + "movepool": ["firefang", "ironhead", "suckerpunch", "swordsdance", "thunderpunch"], + "preferredTypes": ["Fire"] + }, { "role": "Bulky Attacker", - "movepool": ["firefang", "ironhead", "stealthrock", "suckerpunch", "swordsdance", "thunderpunch"], + "movepool": ["fireblast", "ironhead", "stealthrock", "suckerpunch", "thunderpunch"], "preferredTypes": ["Fire"] } ] @@ -2346,8 +2352,11 @@ "sets": [ { "role": "Wallbreaker", - "movepool": ["darkpulse", "extremespeed", "icebeam", "psychoboost", "stealthrock", "superpower"], - "preferredTypes": ["Fighting"] + "movepool": ["darkpulse", "extremespeed", "psychoboost", "superpower"] + }, + { + "role": "Fast Attacker", + "movepool": ["darkpulse", "icebeam", "psychoboost", "superpower"] } ] }, @@ -2356,8 +2365,11 @@ "sets": [ { "role": "Wallbreaker", - "movepool": ["darkpulse", "extremespeed", "icebeam", "psychoboost", "superpower"], - "preferredTypes": ["Fighting"] + "movepool": ["darkpulse", "extremespeed", "psychoboost", "superpower"] + }, + { + "role": "Fast Attacker", + "movepool": ["darkpulse", "icebeam", "psychoboost", "superpower"] } ] }, @@ -2704,7 +2716,7 @@ }, { "role": "Bulky Attacker", - "movepool": ["foulplay", "painsplit", "pursuit", "suckerpunch", "willowisp"] + "movepool": ["darkpulse", "painsplit", "pursuit", "suckerpunch", "willowisp"] } ] }, @@ -3164,7 +3176,7 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["dracometeor", "earthquake", "hiddenpowerfire", "outrage", "shadowball", "shadowsneak", "willowisp"] + "movepool": ["dracometeor", "earthquake", "outrage", "shadowball", "shadowsneak", "willowisp"] } ] }, @@ -3173,7 +3185,7 @@ "sets": [ { "role": "Bulky Setup", - "movepool": ["calmmind", "hiddenpowerfighting", "moonlight", "psyshock", "signalbeam", "substitute"] + "movepool": ["calmmind", "hiddenpowerfighting", "moonlight", "psyshock", "signalbeam"] }, { "role": "Bulky Support", diff --git a/data/random-battles/gen5/teams.ts b/data/random-battles/gen5/teams.ts index fad01c79990c..91c300ac8479 100644 --- a/data/random-battles/gen5/teams.ts +++ b/data/random-battles/gen5/teams.ts @@ -172,6 +172,11 @@ export class RandomGen5Teams extends RandomGen6Teams { if (movePool.includes('spikes')) this.fastPop(movePool, movePool.indexOf('spikes')); if (moves.size + movePool.length <= this.maxMoveCount) return; } + if (teamDetails.statusCure) { + if (movePool.includes('aromatherapy')) this.fastPop(movePool, movePool.indexOf('aromatherapy')); + if (movePool.includes('healbell')) this.fastPop(movePool, movePool.indexOf('healbell')); + if (moves.size + movePool.length <= this.maxMoveCount) return; + } // Develop additional move lists const badWithSetup = ['healbell', 'pursuit', 'toxic']; @@ -716,9 +721,7 @@ export class RandomGen5Teams extends RandomGen6Teams { if (moves.has('waterspout')) return 'Choice Scarf'; if (moves.has('shellsmash')) return 'White Herb'; if (moves.has('psychoshift')) return 'Flame Orb'; - if (ability === 'Magic Guard' && role !== 'Bulky Support') { - return moves.has('counter') ? 'Focus Sash' : 'Life Orb'; - } + if (ability === 'Magic Guard') return moves.has('counter') ? 'Focus Sash' : 'Life Orb'; if (species.id === 'rampardos' && role === 'Fast Attacker') return 'Choice Scarf'; if (ability === 'Sheer Force' && counter.get('sheerforce')) return 'Life Orb'; if (moves.has('acrobatics')) return 'Flying Gem'; @@ -1068,6 +1071,7 @@ export class RandomGen5Teams extends RandomGen6Teams { if (set.ability === 'Drizzle' || set.moves.includes('raindance')) teamDetails.rain = 1; if (set.ability === 'Sand Stream') teamDetails.sand = 1; if (set.ability === 'Drought' || set.moves.includes('sunnyday')) teamDetails.sun = 1; + if (set.moves.includes('aromatherapy') || set.moves.includes('healbell')) teamDetails.statusCure = 1; if (set.moves.includes('spikes')) teamDetails.spikes = (teamDetails.spikes || 0) + 1; if (set.moves.includes('stealthrock')) teamDetails.stealthRock = 1; if (set.moves.includes('toxicspikes')) teamDetails.toxicSpikes = 1; diff --git a/data/random-battles/gen6/sets.json b/data/random-battles/gen6/sets.json index 86ed60e3cb9b..31c6046e9320 100644 --- a/data/random-battles/gen6/sets.json +++ b/data/random-battles/gen6/sets.json @@ -79,7 +79,7 @@ "sets": [ { "role": "Setup Sweeper", - "movepool": ["bugbuzz", "energyball", "psychic", "quiverdance", "sleeppowder"] + "movepool": ["bugbuzz", "psychic", "quiverdance", "sleeppowder"] } ] }, @@ -283,7 +283,7 @@ }, { "role": "Setup Sweeper", - "movepool": ["hiddenpowerfighting", "hiddenpowerfire", "hypervoice", "nastyplot", "shadowball", "waterpulse"] + "movepool": ["hiddenpowerfighting", "hypervoice", "nastyplot", "shadowball"] } ] }, @@ -1623,7 +1623,7 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["earthpower", "gigadrain", "hiddenpowerfire", "leafstorm", "nastyplot", "psychic", "uturn"], + "movepool": ["earthpower", "gigadrain", "leafstorm", "nastyplot", "psychic", "uturn"], "preferredTypes": ["Psychic"] }, { @@ -1654,7 +1654,7 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["dragonpulse", "earthquake", "focusblast", "gigadrain", "hiddenpowerfire", "leafstorm", "substitute"] + "movepool": ["dragonpulse", "earthquake", "focusblast", "gigadrain", "leafstorm", "substitute"] }, { "role": "Setup Sweeper", @@ -1830,7 +1830,7 @@ }, { "role": "Fast Support", - "movepool": ["airslash", "bugbuzz", "hydropump", "icebeam", "roost", "stickyweb", "stunspore", "uturn"] + "movepool": ["airslash", "bugbuzz", "roost", "scald", "stickyweb", "stunspore", "uturn"] } ] }, @@ -2526,12 +2526,13 @@ "level": 87, "sets": [ { - "role": "Bulky Support", - "movepool": ["icebeam", "rest", "sleeptalk", "thunderwave", "toxic"] + "role": "Staller", + "movepool": ["icebeam", "protect", "thunderbolt", "toxic"] }, { "role": "Bulky Attacker", - "movepool": ["icebeam", "rest", "sleeptalk", "thunderbolt"] + "movepool": ["focusblast", "icebeam", "rest", "sleeptalk", "thunderbolt", "thunderwave"], + "preferredTypes": ["Electric"] }, { "role": "Bulky Setup", @@ -2681,8 +2682,11 @@ "sets": [ { "role": "Wallbreaker", - "movepool": ["extremespeed", "icebeam", "knockoff", "psychoboost", "stealthrock", "superpower"], - "preferredTypes": ["Fighting"] + "movepool": ["extremespeed", "knockoff", "psychoboost", "superpower"] + }, + { + "role": "Fast Attacker", + "movepool": ["icebeam", "knockoff", "psychoboost", "superpower"] } ] }, @@ -2691,8 +2695,11 @@ "sets": [ { "role": "Wallbreaker", - "movepool": ["extremespeed", "icebeam", "knockoff", "psychoboost", "superpower"], - "preferredTypes": ["Fighting"] + "movepool": ["extremespeed", "knockoff", "psychoboost", "superpower"] + }, + { + "role": "Fast Attacker", + "movepool": ["icebeam", "knockoff", "psychoboost", "superpower"] } ] }, @@ -3048,7 +3055,7 @@ }, { "role": "Bulky Attacker", - "movepool": ["foulplay", "painsplit", "pursuit", "suckerpunch", "willowisp"] + "movepool": ["darkpulse", "painsplit", "pursuit", "suckerpunch", "willowisp"] } ] }, @@ -3564,7 +3571,7 @@ "sets": [ { "role": "Bulky Setup", - "movepool": ["calmmind", "moonblast", "moonlight", "psyshock", "substitute"] + "movepool": ["calmmind", "moonblast", "moonlight", "psyshock"] }, { "role": "Bulky Support", @@ -4077,10 +4084,6 @@ "leavanny": { "level": 88, "sets": [ - { - "role": "Setup Sweeper", - "movepool": ["knockoff", "leafblade", "swordsdance", "xscissor"] - }, { "role": "Fast Support", "movepool": ["knockoff", "leafblade", "stickyweb", "toxic", "xscissor"] @@ -5096,11 +5099,13 @@ "sets": [ { "role": "Bulky Attacker", - "movepool": ["ancientpower", "blizzard", "earthpower", "freezedry", "stealthrock"] + "movepool": ["ancientpower", "blizzard", "earthpower", "freezedry", "haze", "stealthrock", "thunderwave"], + "preferredTypes": ["Ground"] }, { "role": "Bulky Support", - "movepool": ["earthpower", "freezedry", "haze", "hypervoice", "stealthrock", "thunderwave"] + "movepool": ["ancientpower", "earthpower", "freezedry", "haze", "hypervoice", "stealthrock", "thunderwave"], + "preferredTypes": ["Ground"] } ] }, diff --git a/data/random-battles/gen6/teams.ts b/data/random-battles/gen6/teams.ts index 062e000b3b5e..73df2e6f702b 100644 --- a/data/random-battles/gen6/teams.ts +++ b/data/random-battles/gen6/teams.ts @@ -193,6 +193,11 @@ export class RandomGen6Teams extends RandomGen7Teams { if (movePool.includes('spikes')) this.fastPop(movePool, movePool.indexOf('spikes')); if (moves.size + movePool.length <= this.maxMoveCount) return; } + if (teamDetails.statusCure) { + if (movePool.includes('aromatherapy')) this.fastPop(movePool, movePool.indexOf('aromatherapy')); + if (movePool.includes('healbell')) this.fastPop(movePool, movePool.indexOf('healbell')); + if (moves.size + movePool.length <= this.maxMoveCount) return; + } // Develop additional move lists const badWithSetup = ['defog', 'dragontail', 'haze', 'healbell', 'nuzzle', 'pursuit', 'rapidspin', 'toxic']; diff --git a/data/random-battles/gen7/sets.json b/data/random-battles/gen7/sets.json index 9edf74fe35fe..b8b9854a7ae1 100644 --- a/data/random-battles/gen7/sets.json +++ b/data/random-battles/gen7/sets.json @@ -84,7 +84,7 @@ "sets": [ { "role": "Setup Sweeper", - "movepool": ["airslash", "bugbuzz", "energyball", "quiverdance", "sleeppowder"] + "movepool": ["airslash", "bugbuzz", "quiverdance", "sleeppowder"] }, { "role": "Z-Move user", @@ -367,7 +367,7 @@ }, { "role": "Setup Sweeper", - "movepool": ["hiddenpowerfighting", "hiddenpowerfire", "hypervoice", "nastyplot", "shadowball", "waterpulse"] + "movepool": ["hiddenpowerfighting", "hypervoice", "nastyplot", "shadowball"] } ] }, @@ -1812,7 +1812,7 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["earthpower", "gigadrain", "hiddenpowerfire", "leafstorm", "nastyplot", "psychic", "uturn"], + "movepool": ["earthpower", "gigadrain", "leafstorm", "nastyplot", "psychic", "uturn"], "preferredTypes": ["Psychic"] }, { @@ -1844,7 +1844,7 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["dragonpulse", "earthquake", "focusblast", "gigadrain", "hiddenpowerfire", "leafstorm", "substitute"] + "movepool": ["dragonpulse", "earthquake", "focusblast", "gigadrain", "leafstorm", "substitute"] }, { "role": "Setup Sweeper", @@ -2020,7 +2020,7 @@ }, { "role": "Fast Support", - "movepool": ["airslash", "bugbuzz", "hydropump", "icebeam", "roost", "stickyweb", "stunspore", "uturn"] + "movepool": ["airslash", "bugbuzz", "roost", "scald", "stickyweb", "stunspore", "uturn"] } ] }, @@ -2743,12 +2743,13 @@ "level": 87, "sets": [ { - "role": "Bulky Support", - "movepool": ["icebeam", "rest", "sleeptalk", "thunderwave", "toxic"] + "role": "Staller", + "movepool": ["icebeam", "protect", "thunderbolt", "toxic"] }, { "role": "Bulky Attacker", - "movepool": ["icebeam", "rest", "sleeptalk", "thunderbolt"] + "movepool": ["focusblast", "icebeam", "rest", "sleeptalk", "thunderbolt", "thunderwave"], + "preferredTypes": ["Electric"] }, { "role": "Bulky Setup", @@ -2914,8 +2915,11 @@ "sets": [ { "role": "Wallbreaker", - "movepool": ["extremespeed", "icebeam", "knockoff", "psychoboost", "stealthrock", "superpower"], - "preferredTypes": ["Fighting"] + "movepool": ["extremespeed", "knockoff", "psychoboost", "superpower"] + }, + { + "role": "Fast Attacker", + "movepool": ["icebeam", "knockoff", "psychoboost", "superpower"] } ] }, @@ -2924,8 +2928,11 @@ "sets": [ { "role": "Wallbreaker", - "movepool": ["extremespeed", "icebeam", "knockoff", "psychoboost", "superpower"], - "preferredTypes": ["Fighting"] + "movepool": ["extremespeed", "knockoff", "psychoboost", "superpower"] + }, + { + "role": "Fast Attacker", + "movepool": ["icebeam", "knockoff", "psychoboost", "superpower"] } ] }, @@ -3297,7 +3304,7 @@ }, { "role": "Bulky Attacker", - "movepool": ["foulplay", "painsplit", "pursuit", "suckerpunch", "willowisp"] + "movepool": ["darkpulse", "painsplit", "pursuit", "suckerpunch", "willowisp"] } ] }, @@ -3833,7 +3840,7 @@ "sets": [ { "role": "Bulky Setup", - "movepool": ["calmmind", "moonblast", "moonlight", "psyshock", "substitute"] + "movepool": ["calmmind", "moonblast", "moonlight", "psyshock"] }, { "role": "Bulky Support", @@ -4385,10 +4392,6 @@ "leavanny": { "level": 88, "sets": [ - { - "role": "Setup Sweeper", - "movepool": ["knockoff", "leafblade", "swordsdance", "xscissor"] - }, { "role": "Fast Support", "movepool": ["knockoff", "leafblade", "stickyweb", "toxic", "xscissor"] @@ -5477,11 +5480,8 @@ "sets": [ { "role": "Bulky Attacker", - "movepool": ["ancientpower", "blizzard", "earthpower", "freezedry", "stealthrock"] - }, - { - "role": "Bulky Support", - "movepool": ["earthpower", "freezedry", "haze", "hypervoice", "stealthrock", "thunderwave"] + "movepool": ["ancientpower", "blizzard", "earthpower", "freezedry", "stealthrock", "thunderwave"], + "preferredTypes": ["Ground"] } ] }, @@ -5921,8 +5921,9 @@ "level": 83, "sets": [ { - "role": "Bulky Support", - "movepool": ["closecombat", "earthquake", "heavyslam", "rockslide", "stealthrock"] + "role": "Bulky Attacker", + "movepool": ["closecombat", "earthquake", "heavyslam", "rockslide", "stealthrock", "toxic"], + "preferredTypes": ["Rock"] } ] }, @@ -6330,7 +6331,8 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["aquajet", "crunch", "icefang", "liquidation", "psychicfangs", "swordsdance"] + "movepool": ["aquajet", "crunch", "icefang", "liquidation", "psychicfangs", "swordsdance"], + "preferredTypes": ["Dark"] } ] }, diff --git a/data/random-battles/gen7/teams.ts b/data/random-battles/gen7/teams.ts index d6de32fdbc8f..7d7068eec0f4 100644 --- a/data/random-battles/gen7/teams.ts +++ b/data/random-battles/gen7/teams.ts @@ -310,6 +310,11 @@ export class RandomGen7Teams extends RandomGen8Teams { if (movePool.includes('spikes')) this.fastPop(movePool, movePool.indexOf('spikes')); if (moves.size + movePool.length <= this.maxMoveCount) return; } + if (teamDetails.statusCure) { + if (movePool.includes('aromatherapy')) this.fastPop(movePool, movePool.indexOf('aromatherapy')); + if (movePool.includes('healbell')) this.fastPop(movePool, movePool.indexOf('healbell')); + if (moves.size + movePool.length <= this.maxMoveCount) return; + } // Develop additional move lists const badWithSetup = ['defog', 'dragontail', 'haze', 'healbell', 'nuzzle', 'pursuit', 'rapidspin', 'toxic']; @@ -812,9 +817,6 @@ export class RandomGen7Teams extends RandomGen8Teams { return !counter.get('setup'); case 'Slush Rush': return !teamDetails.hail; - case 'Snow Warning': - // Aurorus - return moves.has('hypervoice'); case 'Solar Power': return (!counter.get('Special') || !teamDetails.sun || !!species.isMega); case 'Sturdy': @@ -1492,6 +1494,7 @@ export class RandomGen7Teams extends RandomGen8Teams { if (set.moves.includes('raindance') || set.ability === 'Drizzle' && !item.onPrimal) teamDetails.rain = 1; if (set.ability === 'Sand Stream') teamDetails.sand = 1; if (set.moves.includes('sunnyday') || set.ability === 'Drought' && !item.onPrimal) teamDetails.sun = 1; + if (set.moves.includes('aromatherapy') || set.moves.includes('healbell')) teamDetails.statusCure = 1; if (set.moves.includes('spikes')) teamDetails.spikes = (teamDetails.spikes || 0) + 1; if (set.moves.includes('stealthrock')) teamDetails.stealthRock = 1; if (set.moves.includes('stickyweb')) teamDetails.stickyWeb = 1; diff --git a/data/random-battles/gen8/data.json b/data/random-battles/gen8/data.json index 7b1861069fc2..73e97a6203dd 100644 --- a/data/random-battles/gen8/data.json +++ b/data/random-battles/gen8/data.json @@ -384,7 +384,7 @@ }, "omastar": { "level": 82, - "moves": ["earthpower", "hydropump", "icebeam", "shellsmash", "spikes", "stealthrock"], + "moves": ["earthpower", "hydropump", "icebeam", "shellsmash"], "doublesLevel": 86, "doublesMoves": ["earthpower", "icebeam", "muddywater", "shellsmash"] }, @@ -1114,7 +1114,7 @@ }, "leafeon": { "level": 87, - "moves": ["doubleedge", "knockoff", "leafblade", "swordsdance", "synthesis", "xscissor"], + "moves": ["doubleedge", "knockoff", "leafblade", "swordsdance", "synthesis"], "doublesLevel": 86, "doublesMoves": ["doubleedge", "knockoff", "leafblade", "protect", "swordsdance"] }, @@ -1389,7 +1389,7 @@ }, "crustle": { "level": 83, - "moves": ["earthquake", "shellsmash", "spikes", "stealthrock", "stoneedge", "xscissor"], + "moves": ["earthquake", "shellsmash", "stoneedge", "xscissor"], "doublesLevel": 84, "doublesMoves": ["knockoff", "protect", "rockslide", "shellsmash", "xscissor"] }, @@ -1898,7 +1898,7 @@ }, "xerneas": { "level": 67, - "moves": ["focusblast", "geomancy", "moonblast", "psyshock", "thunderbolt"], + "moves": ["focusblast", "geomancy", "moonblast", "psyshock"], "doublesLevel": 70, "doublesMoves": ["dazzlinggleam", "focusblast", "geomancy", "moonblast", "thunderbolt"] }, diff --git a/data/random-battles/gen9/bss-factory-sets.json b/data/random-battles/gen9/bss-factory-sets.json index c41eab5a64e0..b095cace0479 100644 --- a/data/random-battles/gen9/bss-factory-sets.json +++ b/data/random-battles/gen9/bss-factory-sets.json @@ -382,18 +382,34 @@ }, { "species": "Flutter Mane", - "weight": 5, + "weight": 2, "moves": [ ["Moonblast"], ["Shadow Ball"], ["Psyshock"], - ["Energy Ball", "Mystical Fire"] + ["Energy Ball"] ], "item": ["Assault Vest"], "nature": "Modest", "evs": {"hp": 164, "def": 28, "spa": 196, "spd": 4, "spe": 116}, "ivs": {"atk": 0}, - "teraType": ["Fire", "Grass"], + "teraType": ["Grass"], + "ability": ["Protosynthesis"] + }, + { + "species": "Flutter Mane", + "weight": 3, + "moves": [ + ["Moonblast"], + ["Shadow Ball"], + ["Psyshock"], + ["Mystical Fire"] + ], + "item": ["Assault Vest"], + "nature": "Modest", + "evs": {"hp": 164, "def": 28, "spa": 196, "spd": 4, "spe": 116}, + "ivs": {"atk": 0}, + "teraType": ["Fire"], "ability": ["Protosynthesis"] } ] @@ -1489,7 +1505,7 @@ ["Sucker Punch"], ["Tera Blast"] ], - "item": ["Choice Band", "Choice Scarf"], + "item": ["Choice Band"], "nature": "Jolly", "evs": {"atk": 252, "spd": 4, "spe": 252}, "teraType": ["Fairy", "Fire", "Ghost", "Steel"], @@ -1553,7 +1569,7 @@ ["Thunderbolt"], ["Flamethrower", "U-turn"] ], - "item": ["Choice Scarf", "Choice Specs"], + "item": ["Choice Specs"], "nature": "Timid", "evs": {"spa": 252, "spd": 4, "spe": 252}, "teraType": ["Electric", "Fighting", "Fire", "Ghost"], @@ -1961,7 +1977,7 @@ "sets": [ { "species": "Breloom", - "weight": 80, + "weight": 85, "moves": [ ["Bullet Seed"], ["Mach Punch"], @@ -1976,7 +1992,7 @@ }, { "species": "Breloom", - "weight": 10, + "weight": 15, "moves": [ ["Bullet Seed"], ["Mach Punch"], @@ -1989,23 +2005,6 @@ "teraType": ["Fire"], "wantsTera": true, "ability": ["Technician"] - }, - { - "species": "Breloom", - "weight": 10, - "moves": [ - ["Substitute"], - ["Leech Seed", "Toxic"], - ["Spore"], - ["Protect"] - ], - "item": ["Toxic Orb"], - "nature": "Bold", - "evs": {"hp": 204, "def": 252, "spd": 48, "spe": 4}, - "ivs": {"atk": 0}, - "teraType": ["Fire", "Steel"], - "wantsTera": true, - "ability": ["Poison Heal"] } ] }, @@ -2787,7 +2786,7 @@ }, { "species": "Iron Moth", - "weight": 20, + "weight": 10, "moves": [ ["Toxic Spikes"], ["Fiery Dance"], @@ -2798,9 +2797,25 @@ "nature": "Calm", "evs": {"hp": 196, "spd": 132, "spe": 180}, "ivs": {"atk": 0}, - "teraType": ["Grass", "Poison"], + "teraType": ["Poison"], "ability": ["Quark Drive"] }, + { + "species": "Iron Moth", + "weight": 10, + "moves": [ + ["Toxic Spikes"], + ["Fiery Dance"], + ["Morning Sun"], + ["Whirlwind"] + ], + "item": ["Heavy-Duty Boots", "Leftovers"], + "nature": "Calm", + "evs": {"hp": 196, "spd": 132, "spe": 180}, + "ivs": {"atk": 0}, + "teraType": ["Grass"], + "ability": ["Quark Drive"] + }, { "species": "Iron Moth", "weight": 10, @@ -3223,7 +3238,7 @@ "moves": [ ["Moonblast"], ["Encore", "Shadow Ball", "Shadow Sneak"], - ["Aura Sphere", "Close Combat", "Shadow Ball"], + ["Aura Sphere", "Close Combat"], ["Destiny Bond"] ], "item": ["Booster Energy", "Focus Sash"], @@ -3239,7 +3254,7 @@ ["Moonblast"], ["Close Combat"], ["Encore", "Shadow Ball"], - ["Psychic", "Psyshock", "Shadow Ball", "Thunderbolt"] + ["Psychic", "Psyshock", "Thunderbolt"] ], "item": ["Booster Energy", "Life Orb"], "nature": "Naive", @@ -3669,21 +3684,51 @@ }, { "species": "Blissey", - "weight": 40, + "weight": 13, "moves": [ ["Calm Mind"], ["Soft-Boiled"], ["Shadow Ball"], - ["Flamethrower", "Stealth Rock", "Tera Blast"] + ["Flamethrower"] ], "item": ["Leftovers"], "nature": "Calm", "evs": {"hp": 4, "def": 252, "spd": 252}, "teraType": ["Dark", "Fire", "Ghost"], - "wantsTera": true, "ability": ["Natural Cure"] }, { + "species": "Blissey", + "weight": 13, + "moves": [ + ["Calm Mind"], + ["Soft-Boiled"], + ["Shadow Ball"], + ["Stealth Rock"] + ], + "item": ["Leftovers"], + "nature": "Calm", + "evs": {"hp": 4, "def": 252, "spd": 252}, + "teraType": ["Dark", "Ghost"], + "ability": ["Natural Cure"] + }, + { + "species": "Blissey", + "weight": 14, + "moves": [ + ["Calm Mind"], + ["Soft-Boiled"], + ["Shadow Ball"], + ["Tera Blast"] + ], + "item": ["Leftovers"], + "nature": "Calm", + "evs": {"hp": 4, "def": 252, "spd": 252}, + "teraType": ["Fighting", "Fire"], + "wantsTera": true, + "ability": ["Natural Cure"] + }, + { "species": "Blissey", "weight": 50, "moves": [ @@ -3692,12 +3737,12 @@ ["Flamethrower", "Shadow Ball"], ["Fling"] ], - "item": ["Flame Orb", "Light Ball", "Poison Barb"], + "item": ["Flame Orb", "Poison Barb"], "nature": "Calm", "evs": {"hp": 4, "def": 252, "spd": 252}, "teraType": ["Dark", "Fire"], "ability": ["Natural Cure"] - } + } ] }, "ceruledge": { @@ -3756,10 +3801,10 @@ "sets": [ { "species": "Chansey", - "weight": 100, + "weight": 70, "moves": [ ["Seismic Toss"], - ["Shadow Ball", "Stealth Rock", "Thunder Wave"], + ["Shadow Ball"], ["Calm Mind"], ["Soft-Boiled"] ], @@ -3769,6 +3814,22 @@ "ivs": {"atk": 0}, "teraType": ["Dark", "Ghost"], "ability": ["Natural Cure"] + }, + { + "species": "Chansey", + "weight": 30, + "moves": [ + ["Seismic Toss"], + ["Stealth Rock"], + ["Thunder Wave"], + ["Soft-Boiled"] + ], + "item": ["Eviolite"], + "nature": "Bold", + "evs": {"hp": 12, "def": 252, "spd": 244}, + "ivs": {"atk": 0}, + "teraType": ["Dark", "Ghost"], + "ability": ["Natural Cure"] } ] }, @@ -4000,7 +4061,7 @@ "sets": [ { "species": "Kleavor", - "weight": 55, + "weight": 28, "moves": [ ["Stone Axe"], ["Night Slash"], @@ -4010,12 +4071,27 @@ "item": ["Focus Sash"], "nature": "Jolly", "evs": {"atk": 252, "spd": 4, "spe": 252}, - "teraType": ["Bug", "Grass", "Water"], + "teraType": ["Grass", "Water"], "ability": ["Sharpness"] }, + { + "species": "Kleavor", + "weight": 27, + "moves": [ + ["Stone Axe"], + ["Night Slash"], + ["Feint", "Trailblaze"], + ["U-turn", "X-Scissor"] + ], + "item": ["Focus Sash"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Bug", "Grass", "Water"], + "ability": ["Sharpness"] + }, { "species": "Kleavor", - "weight": 10, + "weight": 5, "moves": [ ["Stone Axe"], ["Night Slash"], @@ -4025,12 +4101,27 @@ "item": ["Assault Vest"], "nature": "Adamant", "evs": {"hp": 140, "atk": 52, "def": 4, "spd": 244, "spe": 68}, - "teraType": ["Bug", "Grass", "Water"], + "teraType": ["Grass", "Water"], "ability": ["Sharpness"] }, + { + "species": "Kleavor", + "weight": 5, + "moves": [ + ["Stone Axe"], + ["Night Slash"], + ["Feint", "Trailblaze"], + ["U-turn", "X-Scissor"] + ], + "item": ["Assault Vest"], + "nature": "Adamant", + "evs": {"hp": 140, "atk": 52, "def": 4, "spd": 244, "spe": 68}, + "teraType": ["Bug", "Grass", "Water"], + "ability": ["Sharpness"] + }, { "species": "Kleavor", - "weight": 35, + "weight": 18, "moves": [ ["Stone Axe"], ["U-turn"], @@ -4040,8 +4131,23 @@ "item": ["Choice Scarf"], "nature": "Jolly", "evs": {"atk": 252, "spd": 4, "spe": 252}, - "teraType": ["Bug", "Grass"], + "teraType": ["Grass"], "ability": ["Sharpness"] + }, + { + "species": "Kleavor", + "weight": 17, + "moves": [ + ["Stone Axe"], + ["U-turn"], + ["Night Slash"], + ["X-Scissor"] + ], + "item": ["Choice Scarf"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "teraType": ["Bug", "Grass"], + "ability": ["Sharpness"] } ] }, @@ -4151,17 +4257,32 @@ "sets": [ { "species": "Okidogi", - "weight": 40, + "weight": 15, + "moves": [ + ["Bulk Up"], + ["Drain Punch"], + ["Knock Off"], + ["Poison Jab"] + ], + "item": ["Black Sludge", "Rocky Helmet"], + "nature": "Adamant", + "evs": {"hp": 252, "atk": 156, "spe": 100}, + "teraType": ["Poison"], + "ability": ["Toxic Chain"] + }, + { + "species": "Okidogi", + "weight": 25, "moves": [ ["Bulk Up"], ["Drain Punch"], ["Knock Off"], ["Ice Punch", "Poison Jab", "Substitute", "Taunt"] ], - "item": ["Black Sludge", "Leftovers", "Rocky Helmet"], + "item": ["Leftovers", "Rocky Helmet"], "nature": "Adamant", "evs": {"hp": 252, "atk": 156, "spe": 100}, - "teraType": ["Flying", "Poison", "Water"], + "teraType": ["Flying", "Water"], "ability": ["Toxic Chain"] }, { diff --git a/data/random-battles/gen9/doubles-sets.json b/data/random-battles/gen9/doubles-sets.json index 03c452515dd9..2b1935102825 100644 --- a/data/random-battles/gen9/doubles-sets.json +++ b/data/random-battles/gen9/doubles-sets.json @@ -671,6 +671,11 @@ "role": "Choice Item user", "movepool": ["Transform"], "teraTypes": ["Bug", "Dark", "Dragon", "Electric", "Fairy", "Fighting", "Fire", "Flying", "Ghost", "Grass", "Ground", "Ice", "Normal", "Poison", "Psychic", "Rock", "Steel", "Water"] + }, + { + "role": "Doubles Bulky Attacker", + "movepool": ["Transform"], + "teraTypes": ["Bug", "Dark", "Dragon", "Electric", "Fairy", "Fighting", "Fire", "Flying", "Ghost", "Grass", "Ground", "Ice", "Normal", "Poison", "Psychic", "Rock", "Steel", "Water"] } ] }, @@ -2658,9 +2663,9 @@ "level": 76, "sets": [ { - "role": "Doubles Bulky Attacker", - "movepool": ["Aura Sphere", "Draco Meteor", "Poltergeist", "Shadow Force", "Will-O-Wisp"], - "teraTypes": ["Dragon", "Fairy", "Ghost", "Poison"] + "role": "Doubles Fast Attacker", + "movepool": ["Draco Meteor", "Poltergeist", "Shadow Force", "Shadow Sneak", "Will-O-Wisp"], + "teraTypes": ["Dragon", "Fairy", "Ghost", "Poison", "Steel"] } ] }, diff --git a/data/random-battles/gen9/sets.json b/data/random-battles/gen9/sets.json index afbcffa60e97..eb1519087f0c 100644 --- a/data/random-battles/gen9/sets.json +++ b/data/random-battles/gen9/sets.json @@ -204,7 +204,7 @@ "sets": [ { "role": "Fast Support", - "movepool": ["Earthquake", "Stealth Rock", "Stone Edge", "Sucker Punch", "Swords Dance"], + "movepool": ["Earthquake", "Stone Edge", "Sucker Punch", "Swords Dance"], "teraTypes": ["Dark", "Fairy", "Flying", "Ghost", "Ground"] }, { @@ -272,14 +272,9 @@ "annihilape": { "level": 76, "sets": [ - { - "role": "Fast Bulky Setup", - "movepool": ["Bulk Up", "Drain Punch", "Rage Fist", "Rest"], - "teraTypes": ["Fairy", "Ghost", "Steel", "Water"] - }, { "role": "Bulky Setup", - "movepool": ["Bulk Up", "Drain Punch", "Gunk Shot", "Rage Fist", "Stone Edge", "Taunt"], + "movepool": ["Bulk Up", "Drain Punch", "Gunk Shot", "Rage Fist", "Rest", "Taunt"], "teraTypes": ["Fairy", "Ghost", "Steel", "Water"] } ] @@ -494,8 +489,8 @@ }, { "role": "Fast Attacker", - "movepool": ["Encore", "Focus Blast", "Shadow Ball", "Sludge Wave", "Toxic Spikes", "Will-O-Wisp"], - "teraTypes": ["Ghost"] + "movepool": ["Destiny Bond", "Encore", "Focus Blast", "Shadow Ball", "Sludge Wave", "Toxic Spikes", "Will-O-Wisp"], + "teraTypes": ["Fighting", "Ghost"] } ] }, @@ -831,11 +826,6 @@ "role": "Fast Bulky Setup", "movepool": ["Calm Mind", "Freezing Glare", "Hurricane", "Recover"], "teraTypes": ["Steel"] - }, - { - "role": "Fast Support", - "movepool": ["Future Sight", "Hurricane", "Recover", "U-turn"], - "teraTypes": ["Steel"] } ] }, @@ -844,7 +834,7 @@ "sets": [ { "role": "Bulky Attacker", - "movepool": ["Discharge", "Heat Wave", "Hurricane", "Roost", "U-turn"], + "movepool": ["Discharge", "Heat Wave", "Hurricane", "Roost", "U-turn", "Volt Switch"], "teraTypes": ["Electric", "Steel"] } ] @@ -1915,7 +1905,7 @@ { "role": "Setup Sweeper", "movepool": ["Drain Punch", "Knock Off", "Seed Bomb", "Sucker Punch", "Swords Dance"], - "teraTypes": ["Dark", "Fighting", "Poison"] + "teraTypes": ["Dark", "Poison"] } ] }, @@ -2394,7 +2384,7 @@ }, { "role": "Fast Support", - "movepool": ["Encore", "Super Fang", "Thunderbolt", "U-turn"], + "movepool": ["Discharge", "Encore", "Super Fang", "U-turn"], "teraTypes": ["Flying"] } ] @@ -2534,8 +2524,8 @@ }, { "role": "Setup Sweeper", - "movepool": ["Earthquake", "Fire Fang", "Scale Shot", "Stone Edge", "Swords Dance"], - "teraTypes": ["Dragon", "Fire", "Ground"] + "movepool": ["Earthquake", "Fire Fang", "Iron Head", "Scale Shot", "Stone Edge", "Swords Dance"], + "teraTypes": ["Dragon", "Fire", "Ground", "Steel"] } ] }, @@ -2549,8 +2539,8 @@ }, { "role": "Setup Sweeper", - "movepool": ["Aura Sphere", "Dark Pulse", "Flash Cannon", "Focus Blast", "Nasty Plot", "Vacuum Wave"], - "teraTypes": ["Fighting"] + "movepool": ["Aura Sphere", "Flash Cannon", "Focus Blast", "Nasty Plot", "Shadow Ball", "Vacuum Wave"], + "teraTypes": ["Fighting", "Ghost"] } ] }, @@ -2634,12 +2624,12 @@ }, { "role": "AV Pivot", - "movepool": ["Flash Cannon", "Mirror Coat", "Thunderbolt", "Volt Switch"], + "movepool": ["Discharge", "Flash Cannon", "Mirror Coat", "Thunderbolt", "Volt Switch"], "teraTypes": ["Flying", "Water"] }, { "role": "Bulky Setup", - "movepool": ["Body Press", "Flash Cannon", "Iron Defense", "Thunderbolt"], + "movepool": ["Body Press", "Discharge", "Flash Cannon", "Iron Defense", "Thunderbolt"], "teraTypes": ["Fighting"] } ] @@ -2739,7 +2729,7 @@ }, { "role": "Bulky Support", - "movepool": ["Earthquake", "Knock Off", "Protect", "Stealth Rock", "Toxic", "Toxic Spikes", "U-turn"], + "movepool": ["Earthquake", "Knock Off", "Protect", "Toxic", "Toxic Spikes", "U-turn"], "teraTypes": ["Water"] } ] @@ -2875,7 +2865,7 @@ { "role": "Bulky Attacker", "movepool": ["Air Slash", "Nasty Plot", "Thunderbolt", "Volt Switch", "Will-O-Wisp"], - "teraTypes": ["Electric"] + "teraTypes": ["Electric", "Steel"] } ] }, @@ -3123,9 +3113,14 @@ "level": 69, "sets": [ { - "role": "Setup Sweeper", + "role": "Fast Bulky Setup", "movepool": ["Earthquake", "Extreme Speed", "Recover", "Shadow Claw", "Swords Dance"], - "teraTypes": ["Ghost", "Normal"] + "teraTypes": ["Ghost"] + }, + { + "role": "Setup Sweeper", + "movepool": ["Earthquake", "Extreme Speed", "Recover", "Swords Dance"], + "teraTypes": ["Normal"] } ] }, @@ -3418,13 +3413,8 @@ "level": 77, "sets": [ { - "role": "Setup Sweeper", - "movepool": ["Ceaseless Edge", "Razor Shell", "Sucker Punch", "Swords Dance"], - "teraTypes": ["Dark", "Poison", "Water"] - }, - { - "role": "Wallbreaker", - "movepool": ["Aqua Jet", "Ceaseless Edge", "Flip Turn", "Razor Shell"], + "role": "Fast Attacker", + "movepool": ["Ceaseless Edge", "Flip Turn", "Razor Shell", "Sacred Sword", "Sucker Punch", "Swords Dance"], "teraTypes": ["Dark", "Poison", "Water"] } ] @@ -3499,7 +3489,7 @@ "sets": [ { "role": "Tera Blast user", - "movepool": ["Giga Drain", "Pollen Puff", "Quiver Dance", "Sleep Powder", "Tera Blast"], + "movepool": ["Giga Drain", "Quiver Dance", "Sleep Powder", "Tera Blast"], "teraTypes": ["Fire", "Rock"] }, { @@ -3855,7 +3845,7 @@ { "role": "Fast Bulky Setup", "movepool": ["Bug Buzz", "Fiery Dance", "Fire Blast", "Giga Drain", "Morning Sun", "Quiver Dance"], - "teraTypes": ["Fire", "Grass", "Water"] + "teraTypes": ["Fire", "Grass"] }, { "role": "Tera Blast user", @@ -3940,7 +3930,7 @@ { "role": "Fast Attacker", "movepool": ["Focus Blast", "Grass Knot", "Knock Off", "Nasty Plot", "Sludge Wave", "Taunt", "Thunder Wave", "Thunderbolt", "U-turn"], - "teraTypes": ["Electric", "Grass"] + "teraTypes": ["Electric", "Grass", "Steel"] }, { "role": "Tera Blast user", @@ -4154,7 +4144,7 @@ "sets": [ { "role": "Fast Bulky Setup", - "movepool": ["Bug Buzz", "Energy Ball", "Hurricane", "Quiver Dance", "Sleep Powder"], + "movepool": ["Bug Buzz", "Hurricane", "Quiver Dance", "Sleep Powder"], "teraTypes": ["Flying"] }, { @@ -4339,7 +4329,7 @@ "sets": [ { "role": "Wallbreaker", - "movepool": ["Drain Punch", "Horn Leech", "Poltergeist", "Rest", "Trick Room", "Wood Hammer"], + "movepool": ["Drain Punch", "Horn Leech", "Poltergeist", "Rest", "Trick Room", "Will-O-Wisp", "Wood Hammer"], "teraTypes": ["Fighting"] }, { @@ -4455,7 +4445,7 @@ { "role": "Bulky Attacker", "movepool": ["Defog", "Knock Off", "Leaf Blade", "Roost", "Sucker Punch", "Swords Dance", "Triple Arrows", "U-turn"], - "teraTypes": ["Steel"] + "teraTypes": ["Steel", "Water"] } ] }, @@ -4524,7 +4514,7 @@ "sets": [ { "role": "Bulky Support", - "movepool": ["Bug Buzz", "Energy Ball", "Sticky Web", "Thunderbolt", "Volt Switch"], + "movepool": ["Bug Buzz", "Discharge", "Energy Ball", "Sticky Web", "Thunderbolt", "Volt Switch"], "teraTypes": ["Electric"] } ] @@ -4534,7 +4524,7 @@ "sets": [ { "role": "Wallbreaker", - "movepool": ["Close Combat", "Drain Punch", "Earthquake", "Gunk Shot", "Ice Hammer", "Knock Off"], + "movepool": ["Close Combat", "Drain Punch", "Earthquake", "Ice Hammer", "Knock Off"], "teraTypes": ["Fighting", "Ground"] } ] @@ -4764,13 +4754,13 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["Double-Edge", "Earthquake", "Knock Off", "Sucker Punch", "Superpower", "U-turn", "Wood Hammer"], - "teraTypes": ["Dark", "Fighting", "Grass", "Ground"] + "movepool": ["Double-Edge", "Earthquake", "Knock Off", "Superpower", "U-turn", "Wood Hammer"], + "teraTypes": ["Fighting", "Grass", "Ground"] }, { "role": "Bulky Support", - "movepool": ["Body Slam", "Earthquake", "Knock Off", "Rapid Spin", "Sucker Punch", "U-turn"], - "teraTypes": ["Dark", "Ghost"] + "movepool": ["Body Slam", "Earthquake", "Knock Off", "Rapid Spin", "U-turn"], + "teraTypes": ["Ghost"] } ] }, @@ -4917,10 +4907,20 @@ "cinderace": { "level": 77, "sets": [ + { + "role": "Wallbreaker", + "movepool": ["Gunk Shot", "High Jump Kick", "Pyro Ball", "U-turn"], + "teraTypes": ["Fire", "Poison"] + }, + { + "role": "Fast Support", + "movepool": ["Court Change", "High Jump Kick", "Pyro Ball", "Sucker Punch"], + "teraTypes": ["Fighting", "Fire"] + }, { "role": "Fast Attacker", - "movepool": ["Court Change", "Gunk Shot", "High Jump Kick", "Pyro Ball", "Sucker Punch", "U-turn"], - "teraTypes": ["Fighting", "Fire", "Poison"] + "movepool": ["Court Change", "Gunk Shot", "High Jump Kick", "Pyro Ball", "U-turn"], + "teraTypes": ["Fighting"] } ] }, @@ -5144,7 +5144,7 @@ "sets": [ { "role": "Bulky Attacker", - "movepool": ["Discharge", "Recover", "Scald", "Spikes", "Toxic Spikes"], + "movepool": ["Discharge", "Recover", "Scald", "Spikes", "Thunderbolt", "Toxic Spikes"], "teraTypes": ["Water"] }, { @@ -5428,9 +5428,14 @@ "level": 93, "sets": [ { - "role": "Bulky Support", + "role": "Bulky Setup", "movepool": ["Calm Mind", "Encore", "Giga Drain", "Leech Seed", "Psychic", "Psyshock"], "teraTypes": ["Steel"] + }, + { + "role": "Bulky Attacker", + "movepool": ["Body Press", "Encore", "Giga Drain", "Leech Seed", "Psychic", "Psyshock"], + "teraTypes": ["Fighting", "Steel"] } ] }, @@ -5649,7 +5654,7 @@ "sets": [ { "role": "Bulky Support", - "movepool": ["Body Press", "Play Rough", "Protect", "Wish"], + "movepool": ["Body Press", "Play Rough", "Protect", "Stomping Tantrum", "Wish"], "teraTypes": ["Steel"] } ] @@ -5685,7 +5690,7 @@ { "role": "Wallbreaker", "movepool": ["Brave Bird", "Double-Edge", "Foul Play", "Parting Shot", "Quick Attack"], - "teraTypes": ["Dark", "Flying", "Normal"] + "teraTypes": ["Flying", "Normal"] } ] }, @@ -5705,7 +5710,7 @@ { "role": "Wallbreaker", "movepool": ["Brave Bird", "Double-Edge", "Foul Play", "Parting Shot", "Quick Attack"], - "teraTypes": ["Dark", "Flying", "Normal"] + "teraTypes": ["Flying", "Normal"] } ] }, @@ -5770,7 +5775,7 @@ { "role": "Fast Support", "movepool": ["Hurricane", "Roost", "Thunder Wave", "Thunderbolt", "U-turn"], - "teraTypes": ["Electric", "Flying"] + "teraTypes": ["Electric", "Flying", "Steel", "Water"] } ] }, @@ -5989,7 +5994,7 @@ "sets": [ { "role": "Bulky Attacker", - "movepool": ["Body Press", "Poltergeist", "Roar", "Shadow Sneak", "Trick", "Will-O-Wisp"], + "movepool": ["Body Press", "Play Rough", "Poltergeist", "Roar", "Shadow Sneak", "Trick", "Will-O-Wisp"], "teraTypes": ["Fighting"] }, { @@ -6040,7 +6045,7 @@ { "role": "Fast Attacker", "movepool": ["Aqua Cutter", "Aqua Jet", "Flip Turn", "Night Slash", "Psycho Cut"], - "teraTypes": ["Water"] + "teraTypes": ["Dark", "Water"] }, { "role": "Setup Sweeper", @@ -6254,12 +6259,7 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["Energy Ball", "Fiery Dance", "Fire Blast", "Sludge Wave", "U-turn"], - "teraTypes": ["Fire", "Grass"] - }, - { - "role": "Fast Support", - "movepool": ["Energy Ball", "Fiery Dance", "Morning Sun", "Sludge Wave", "Toxic Spikes", "U-turn"], + "movepool": ["Energy Ball", "Fiery Dance", "Fire Blast", "Morning Sun", "Sludge Wave", "Toxic Spikes", "U-turn"], "teraTypes": ["Fire", "Grass"] } ] @@ -6326,6 +6326,11 @@ "role": "Fast Attacker", "movepool": ["Calm Mind", "Close Combat", "Moonblast", "Psychic"], "teraTypes": ["Fairy", "Fighting", "Steel"] + }, + { + "role": "Wallbreaker", + "movepool": ["Close Combat", "Encore", "Knock Off", "Moonblast"], + "teraTypes": ["Dark", "Fairy", "Fighting", "Steel"] } ] }, @@ -6380,7 +6385,7 @@ { "role": "Bulky Support", "movepool": ["Earthquake", "Spikes", "Stealth Rock", "Throat Chop", "Whirlwind"], - "teraTypes": ["Ghost", "Ground", "Poison"] + "teraTypes": ["Ghost", "Poison"] }, { "role": "Bulky Attacker", @@ -6639,7 +6644,7 @@ "sets": [ { "role": "AV Pivot", - "movepool": ["Draco Meteor", "Thunderbolt", "Thunderclap", "Volt Switch"], + "movepool": ["Discharge", "Draco Meteor", "Thunderbolt", "Thunderclap", "Volt Switch"], "teraTypes": ["Electric"] }, { diff --git a/data/random-battles/gen9/teams.ts b/data/random-battles/gen9/teams.ts index ef57ca36885f..4b860d151e3b 100644 --- a/data/random-battles/gen9/teams.ts +++ b/data/random-battles/gen9/teams.ts @@ -190,7 +190,7 @@ export class RandomTeams { this.moveEnforcementCheckers = { Bug: (movePool, moves, abilities, types, counter) => ( movePool.includes('megahorn') || movePool.includes('xscissor') || - (!counter.get('Bug') && types.includes('Electric')) + (!counter.get('Bug') && (types.includes('Electric') || types.includes('Psychic'))) ), Dark: ( movePool, moves, abilities, types, counter, species, teamDetails, isLead, isDoubles, teraType, role @@ -226,7 +226,7 @@ export class RandomTeams { if (counter.get('Psychic')) return false; if (movePool.includes('calmmind') || abilities.has('Strong Jaw')) return true; if (isDoubles && movePool.includes('psychicfangs')) return true; - return abilities.has('Psychic Surge') || ['Electric', 'Fighting', 'Fire', 'Grass', 'Poison'].some(m => types.includes(m)); + return abilities.has('Psychic Surge') || ['Bug', 'Electric', 'Fighting', 'Fire', 'Grass', 'Poison'].some(m => types.includes(m)); }, Rock: (movePool, moves, abilities, types, counter, species) => !counter.get('Rock') && species.baseStats.atk >= 80, Steel: (movePool, moves, abilities, types, counter, species, teamDetails, isLead, isDoubles) => ( @@ -508,6 +508,10 @@ export class RandomTeams { if (movePool.includes('spikes')) this.fastPop(movePool, movePool.indexOf('spikes')); if (moves.size + movePool.length <= this.maxMoveCount) return; } + if (teamDetails.statusCure) { + if (movePool.includes('healbell')) this.fastPop(movePool, movePool.indexOf('healbell')); + if (moves.size + movePool.length <= this.maxMoveCount) return; + } if (isDoubles) { const doublesIncompatiblePairs = [ @@ -565,6 +569,7 @@ export class RandomTeams { ['fireblast', ['fierydance', 'flamethrower']], ['lavaplume', 'magmastorm'], ['thunderpunch', 'wildcharge'], + ['thunderbolt', 'discharge'], ['gunkshot', ['direclaw', 'poisonjab', 'sludgebomb']], ['aurasphere', 'focusblast'], ['closecombat', 'drainpunch'], @@ -583,8 +588,6 @@ export class RandomTeams { ['nastyplot', ['rockslide', 'knockoff']], // Persian ['switcheroo', 'fakeout'], - // Beartic - ['snowscape', 'swordsdance'], // Amoonguss, though this can work well as a general rule later ['toxic', 'clearsmog'], // Chansey and Blissey @@ -1213,6 +1216,7 @@ export class RandomTeams { if (['dragapult', 'tentacruel'].includes(species.id)) return 'Clear Body'; if (species.id === 'altaria') return 'Cloud Nine'; if (species.id === 'kilowattrel' || species.id === 'meowsticf') return 'Competitive'; + if (species.id === 'kingambit') return 'Defiant'; if (species.id === 'armarouge' && !moves.has('meteorbeam')) return 'Flash Fire'; if (species.id === 'talonflame') return 'Gale Wings'; if ( @@ -1232,8 +1236,6 @@ export class RandomTeams { if (['drifblim', 'hitmonlee', 'sceptile'].includes(species.id) && !moves.has('shedtail')) return 'Unburden'; if (abilities.has('Intimidate')) return 'Intimidate'; - if (this.randomChance(1, 2) && species.id === 'kingambit') return 'Defiant'; - // just doubles and multi if (this.format.gameType !== 'freeforall') { if (species.id === 'clefairy') return 'Friend Guard'; @@ -1334,7 +1336,7 @@ export class RandomTeams { ) return 'Weakness Policy'; if (['dragonenergy', 'lastrespects', 'waterspout'].some(m => moves.has(m))) return 'Choice Scarf'; if ( - ability === 'Imposter' || (species.id === 'magnezone' && role === 'Fast Attacker') + !isDoubles && (ability === 'Imposter' || (species.id === 'magnezone' && role === 'Fast Attacker')) ) return 'Choice Scarf'; if (species.id === 'rampardos' && (role === 'Fast Attacker' || isDoubles)) return 'Choice Scarf'; if (species.id === 'palkia' && counter.get('Special') < 4) return 'Lustrous Orb'; @@ -1538,8 +1540,8 @@ export class RandomTeams { if (moves.has('outrage')) return 'Lum Berry'; if (moves.has('protect') && ability !== 'Speed Boost') return 'Leftovers'; if ( - role === 'Fast Support' && isLead && - !counter.get('recovery') && !counter.get('recoil') && + role === 'Fast Support' && isLead && !counter.get('recovery') && !counter.get('recoil') && + (counter.get('hazards') || counter.get('setup')) && (species.baseStats.hp + species.baseStats.def + species.baseStats.spd) < 258 ) return 'Focus Sash'; if ( @@ -1942,6 +1944,7 @@ export class RandomTeams { if (set.ability === 'Snow Warning' || set.moves.includes('snowscape') || set.moves.includes('chillyreception')) { teamDetails.snow = 1; } + if (set.moves.includes('healbell')) teamDetails.statusCure = 1; if (set.moves.includes('spikes') || set.moves.includes('ceaselessedge')) { teamDetails.spikes = (teamDetails.spikes || 0) + 1; } diff --git a/data/random-battles/gen9baby/sets.json b/data/random-battles/gen9baby/sets.json index aa0bdf25a9cb..7aa5fd3985f2 100644 --- a/data/random-battles/gen9baby/sets.json +++ b/data/random-battles/gen9baby/sets.json @@ -262,11 +262,6 @@ "charmander": { "level": 7, "sets": [ - { - "role": "Wallbreaker", - "movepool": ["Flamethrower", "Focus Blast", "Sunny Day", "Weather Ball"], - "teraTypes": ["Fire"] - }, { "role": "Setup Sweeper", "movepool": ["Brick Break", "Dragon Dance", "Flare Blitz", "Outrage", "Thunder Punch"], @@ -389,7 +384,7 @@ "sets": [ { "role": "Setup Sweeper", - "movepool": ["Aqua Jet", "Brick Break", "Crabhammer", "Dragon Dance", "Knock Off", "X-Scissor"], + "movepool": ["Aqua Jet", "Crabhammer", "Dragon Dance", "Knock Off"], "teraTypes": ["Water"] } ] @@ -834,7 +829,7 @@ "sets": [ { "role": "Bulky Support", - "movepool": ["Foul Play", "Giga Drain", "Leaf Storm", "Sludge Bomb", "Spore", "Stun Spore"], + "movepool": ["Clear Smog", "Foul Play", "Giga Drain", "Leaf Storm", "Sludge Bomb", "Spore", "Stun Spore"], "teraTypes": ["Steel", "Water"] }, { @@ -848,7 +843,7 @@ "level": 6, "sets": [ { - "role": "Setup Sweeper", + "role": "Bulky Setup", "movepool": ["Crunch", "Icicle Spear", "Outrage", "Swords Dance"], "teraTypes": ["Dragon", "Fairy", "Ice"] } @@ -1466,6 +1461,11 @@ "role": "Bulky Attacker", "movepool": ["Dazzling Gleam", "Thunder Wave", "Thunderbolt", "Volt Switch"], "teraTypes": ["Fairy"] + }, + { + "role": "Tera Blast user", + "movepool": ["Agility", "Dazzling Gleam", "Tera Blast", "Thunderbolt"], + "teraTypes": ["Ice"] } ] }, @@ -1499,7 +1499,7 @@ "sets": [ { "role": "Wallbreaker", - "movepool": ["Fake Out", "Fury Swipes", "Knock Off", "Play Rough", "Thunder Wave", "U-turn"], + "movepool": ["Double-Edge", "Fake Out", "Knock Off", "Play Rough", "Thunder Wave", "U-turn"], "teraTypes": ["Normal"] } ] @@ -1538,7 +1538,7 @@ "level": 6, "sets": [ { - "role": "Setup Sweeper", + "role": "Bulky Setup", "movepool": ["High Jump Kick", "Knock Off", "Poison Jab", "Stone Edge", "Swords Dance"], "teraTypes": ["Dark", "Fighting", "Poison"] }, @@ -1733,9 +1733,14 @@ "level": 7, "sets": [ { - "role": "Bulky Support", + "role": "Bulky Attacker", "movepool": ["Encore", "Giga Drain", "Leaf Storm", "Pollen Puff", "Sleep Powder", "Stun Spore", "Synthesis"], "teraTypes": ["Poison", "Steel", "Water"] + }, + { + "role": "Tera Blast user", + "movepool": ["Giga Drain", "Leaf Storm", "Stun Spore", "Synthesis", "Tera Blast"], + "teraTypes": ["Fire", "Rock"] } ] }, @@ -2108,8 +2113,13 @@ "level": 5, "sets": [ { - "role": "Bulky Attacker", - "movepool": ["Close Combat", "Dual Wingbeat", "Pounce", "Swords Dance", "U-turn"], + "role": "Setup Sweeper", + "movepool": ["Bug Bite", "Close Combat", "Dual Wingbeat", "Swords Dance"], + "teraTypes": ["Fighting"] + }, + { + "role": "Fast Support", + "movepool": ["Close Combat", "Defog", "Dual Wingbeat", "U-turn"], "teraTypes": ["Fighting"] } ] @@ -2369,7 +2379,7 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["Close Combat", "Gunk Shot", "Lash Out", "Swords Dance", "Toxic Spikes"], + "movepool": ["Close Combat", "Gunk Shot", "Swords Dance", "Throat Chop", "Toxic Spikes"], "teraTypes": ["Dark", "Fighting", "Poison"] } ] @@ -2492,20 +2502,15 @@ "squirtle": { "level": 6, "sets": [ - { - "role": "Fast Attacker", - "movepool": ["Flip Turn", "Ice Beam", "Surf", "Water Spout"], - "teraTypes": ["Water"] - }, { "role": "Bulky Support", "movepool": ["Flip Turn", "Ice Beam", "Rapid Spin", "Surf", "Yawn"], "teraTypes": ["Poison", "Steel"] }, { - "role": "Bulky Setup", - "movepool": ["Body Slam", "Ice Beam", "Shell Smash", "Surf"], - "teraTypes": ["Ice", "Normal", "Water"] + "role": "Tera Blast user", + "movepool": ["Ice Beam", "Shell Smash", "Surf", "Tera Blast"], + "teraTypes": ["Electric", "Grass"] } ] }, @@ -2683,7 +2688,7 @@ "level": 6, "sets": [ { - "role": "Fast Support", + "role": "Bulky Support", "movepool": ["Earth Power", "Giga Drain", "Knock Off", "Leaf Storm", "Rapid Spin", "Spikes", "Spore", "Toxic Spikes"], "teraTypes": ["Water"] } diff --git a/data/random-battles/gen9baby/teams.ts b/data/random-battles/gen9baby/teams.ts index 8ebe9ed383fc..50f633d460bb 100644 --- a/data/random-battles/gen9baby/teams.ts +++ b/data/random-battles/gen9baby/teams.ts @@ -439,6 +439,7 @@ export class RandomBabyTeams extends RandomTeams { if (species.id === 'blitzle') return 'Sap Sipper'; if (species.id === 'chinchou') return 'Volt Absorb'; if (species.id === 'deerling') return 'Serene Grace'; + if (species.id === 'doduo') return 'Early Bird'; if (species.id === 'geodudealola') return 'Galvanize'; if (species.id === 'growlithehisui') return 'Rock Head'; if (species.id === 'gligar') return 'Immunity'; @@ -541,12 +542,13 @@ export class RandomBabyTeams extends RandomTeams { if (moves.has('acrobatics')) return ability === 'Unburden' ? 'Oran Berry' : ''; if (moves.has('auroraveil') || moves.has('lightscreen') && moves.has('reflect')) return 'Light Clay'; - if (moves.has('rest') && moves.has('sleeptalk')) return 'Eviolite'; if (ability === 'Guts' && moves.has('facade')) return 'Flame Orb'; if (ability === 'Quick Feet') return 'Toxic Orb'; - if (this.dex.getEffectiveness('Rock', species) >= 2) return 'Heavy-Duty Boots'; + if ( + this.dex.getEffectiveness('Rock', species) >= 2 && this.dex.getEffectiveness('Ground', species) >= 0 + ) return 'Heavy-Duty Boots'; if (['Harvest', 'Ripen', 'Unburden'].includes(ability) || moves.has('bellydrum')) return 'Oran Berry'; } From 585f27f40b75650591d1b1fea65cd818b835adab Mon Sep 17 00:00:00 2001 From: shrianshChari <30420527+shrianshChari@users.noreply.github.com> Date: Mon, 1 Jul 2024 09:01:31 -0700 Subject: [PATCH 090/139] Mix and Mega: Restrict Solgaleo (#10381) https://www.smogon.com/forums/threads/mix-and-mega.3710921/page-11#post-10172629 --- config/formats.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/formats.ts b/config/formats.ts index 97d33bdbefce..f580a1258dab 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -936,7 +936,7 @@ export const Formats: FormatList = [ 'Arceus', 'Basculegion-Base', 'Calyrex-Ice', 'Deoxys-Base', 'Deoxys-Attack', 'Dialga', 'Dragapult', 'Eternatus', 'Flutter Mane', 'Gengar', 'Gholdengo', 'Giratina', 'Gouging Fire', 'Groudon', 'Ho-Oh', 'Iron Bundle', 'Kilowattrel', 'Kyurem-Black', 'Kyurem-White', 'Lunala', 'Manaphy', 'Mewtwo', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Rayquaza', 'Regigigas', 'Reshiram', 'Slaking', - 'Sneasler', 'Ursaluna-Bloodmoon', 'Urshifu-Base', 'Zacian', 'Zekrom', + 'Sneasler', 'Solgaleo', 'Ursaluna-Bloodmoon', 'Urshifu-Base', 'Zacian', 'Zekrom', ], onValidateTeam(team) { const itemTable = new Set(); From ef94d4eff4805aa9c3c57642af6d2ecd75a25965 Mon Sep 17 00:00:00 2001 From: shrianshChari <30420527+shrianshChari@users.noreply.github.com> Date: Mon, 1 Jul 2024 09:01:42 -0700 Subject: [PATCH 091/139] Godly Gift: Restrict Baxcalibur and Chien-Pao (#10382) * Godly Gift: Restrict Baxcalibur and Chien-Pao https://www.smogon.com/forums/threads/godly-gift.3710734/page-9#post-10171968 * Update formats.ts --------- Co-authored-by: Kris Johnson <11083252+KrisXV@users.noreply.github.com> --- config/formats.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/config/formats.ts b/config/formats.ts index f580a1258dab..7db5e596fcee 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -665,11 +665,11 @@ export const Formats: FormatList = [ 'Swift Swim', 'Bright Powder', 'Focus Band', 'King\'s Rock', 'Quick Claw', 'Razor Fang', 'Baton Pass', 'Last Respects', 'Shed Tail', ], restricted: [ - 'Annihilape', 'Arceus', 'Calyrex-Ice', 'Chi-Yu', 'Crawdaunt', 'Deoxys-Base', 'Deoxys-Speed', 'Dialga', 'Dialga-Origin', 'Dragapult', 'Espathra', 'Eternatus', - 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Gliscor', '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', 'Rayquaza', - 'Regieleki', 'Reshiram', 'Shaymin-Sky', 'Smeargle', 'Solgaleo', 'Terapagos', 'Toxapex', 'Ursaluna', 'Ursaluna-Bloodmoon', 'Volcarona', 'Zacian', 'Zacian-Crowned', - 'Zamazenta-Crowned', 'Zekrom', + 'Annihilape', 'Arceus', 'Baxcalibur', 'Calyrex-Ice', 'Chien-Pao', 'Chi-Yu', 'Crawdaunt', 'Deoxys-Base', 'Deoxys-Speed', 'Dialga', 'Dialga-Origin', 'Dragapult', 'Espathra', + 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Gliscor', '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', 'Rayquaza', 'Regieleki', + 'Reshiram', 'Shaymin-Sky', 'Smeargle', 'Solgaleo', 'Terapagos', 'Toxapex', 'Ursaluna', 'Ursaluna-Bloodmoon', 'Volcarona', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Crowned', + 'Zekrom', ], }, From cccc7db25c12eb6a38297d376a0cc3887882a05f Mon Sep 17 00:00:00 2001 From: shrianshChari <30420527+shrianshChari@users.noreply.github.com> Date: Mon, 1 Jul 2024 09:14:51 -0700 Subject: [PATCH 092/139] Add [Gen 5] BW1 OU (#10380) * Add BW1OU * Add BW1 OU Resource thread * Add March 2012 OU/UUBL/UU tiering placements https://www.smogon.com/forums/threads/smogon-university-po-statistics-%E2%80%94-march-2012.3464495/ * Remove Froslass and Gothitelle from UUBL * Move BW1 OU below official BW tiers * Satisfy linter 1 * Satisfy linter 2 * Update data/mods/gen5bw1/formats-data.ts * Update config/formats.ts --------- Co-authored-by: Kris Johnson <11083252+KrisXV@users.noreply.github.com> --- config/formats.ts | 11 +++++ data/mods/gen5bw1/formats-data.ts | 78 +++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+) diff --git a/config/formats.ts b/config/formats.ts index 7db5e596fcee..8c9e3174997a 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -4280,6 +4280,17 @@ export const Formats: FormatList = [ ruleset: ['[Gen 5] RU', '!Sleep Moves Clause', 'Sleep Clause Mod'], banlist: ['RU', 'NUBL', 'Assist', 'Copycat'], }, + { + name: "[Gen 5] BW1 OU", + threads: [ + `• BW1 OU`, + ], + + mod: 'gen5bw1', + searchShow: false, + ruleset: ['Standard', 'Sleep Clause Mod', 'Swagger Clause'], + banlist: ['Uber', 'Drizzle ++ Swift Swim', 'King\'s Rock', 'Razor Fang', 'Soul Dew', 'Acupressure', 'Assist'], + }, { name: "[Gen 5] PU", threads: [ diff --git a/data/mods/gen5bw1/formats-data.ts b/data/mods/gen5bw1/formats-data.ts index 454df83921b6..e067fe2121ef 100644 --- a/data/mods/gen5bw1/formats-data.ts +++ b/data/mods/gen5bw1/formats-data.ts @@ -1,4 +1,79 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { + venusaur: { + tier: "OU", + }, + dugtrio: { + tier: "OU", + }, + cloyster: { + tier: "OU", + }, + chansey: { + tier: "OU", + }, + vaporeon: { + tier: "OU", + }, + jolteon: { + tier: "OU", + }, + espeon: { + tier: "OU", + }, + donphan: { + tier: "OU", + }, + froslass: { + tier: "UU", + }, + metagross: { + tier: "OU", + }, + deoxysdefense: { + tier: "UUBL", + }, + infernape: { + tier: "OU", + }, + lucario: { + tier: "OU", + }, + hippowdon: { + tier: "UUBL", + }, + snover: { + tier: "UUBL", + }, + abomasnow: { + tier: "UUBL", + }, + garchomp: { + tier: "Uber", + }, + excadrill: { + tier: "Uber", + }, + scrafty: { + tier: "OU", + }, + gothitelle: { + tier: "PU", + }, + chandelure: { + tier: "UU", + }, + haxorus: { + tier: "OU", + }, + mienshao: { + tier: "OU", + }, + virizion: { + tier: "OU", + }, + tornadus: { + tier: "OU", + }, tornadustherian: { isNonstandard: "Future", tier: "Illegal", @@ -7,6 +82,9 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { isNonstandard: "Future", tier: "Illegal", }, + landorus: { + tier: "OU", + }, landorustherian: { isNonstandard: "Future", tier: "Illegal", From f87e2547dde8fcf4258dcfd10be7456d1f7bd85f Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Mon, 1 Jul 2024 10:27:15 -0600 Subject: [PATCH 093/139] Add July 2024 tier shifts --- config/formats.ts | 17 ++++----- data/formats-data.ts | 88 ++++++++++++++++++++++---------------------- 2 files changed, 52 insertions(+), 53 deletions(-) diff --git a/config/formats.ts b/config/formats.ts index 8c9e3174997a..af55b129075e 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -382,12 +382,11 @@ export const Formats: FormatList = [ ruleset: ['[Gen 9] Ubers'], banlist: [ // Ubers OU - 'Arceus-Base', 'Arceus-Fairy', 'Arceus-Ground', 'Calyrex-Ice', 'Clodsire', 'Deoxys-Attack', 'Eternatus', 'Flutter Mane', - 'Giratina-Origin', 'Glimmora', 'Gliscor', 'Grimmsnarl', 'Groudon', 'Hatterene', 'Ho-Oh', 'Iron Bundle', 'Kingambit', - 'Koraidon', 'Kyogre', 'Kyurem-Black', 'Miraidon', 'Necrozma-Dusk-Mane', 'Rayquaza', 'Ribombee', 'Skeledirge', 'Ting-Lu', - 'Zacian-Crowned', - // Ubers UUBL - 'Arceus-Fire', 'Arceus-Flying', 'Arceus-Ghost', 'Arceus-Steel', 'Arceus-Water', 'Lunala', 'Shaymin-Sky', 'Zekrom', + 'Arceus-Base', 'Arceus-Fairy', 'Arceus-Ground', 'Calyrex-Ice', 'Clodsire', 'Deoxys-Attack', 'Ditto', 'Eternatus', 'Flutter Mane', + 'Giratina-Origin', 'Glimmora', 'Gliscor', 'Grimmsnarl', 'Groudon', 'Ho-Oh', 'Iron Bundle', 'Iron Treads', 'Kingambit', 'Koraidon', + 'Kyogre', 'Kyurem-Black', 'Lunala', 'Miraidon', 'Necrozma-Dusk-Mane', 'Rayquaza', 'Ribombee', 'Skeledirge', 'Ting-Lu', 'Zacian-Crowned', + // Ubers UUBL + Lunala + 'Arceus-Fire', 'Arceus-Flying', 'Arceus-Ghost', 'Arceus-Steel', 'Arceus-Water', 'Shaymin-Sky', 'Zekrom', ], }, { @@ -431,9 +430,9 @@ export const Formats: FormatList = [ searchShow: false, ruleset: ['[Gen 9] LC'], banlist: [ - 'Chinchou', 'Diglett-Alola', 'Elekid', 'Foongus', 'Glimmet', 'Gothita', 'Grimer-Alola', 'Grookey', 'Growlithe-Hisui', 'Impidimp', - 'Koffing', 'Magby', 'Mareanie', 'Mienfoo', 'Minccino', 'Mudbray', 'Pawniard', 'Sandshrew-Alola', 'Shellder', 'Shellos', 'Snubbull', - 'Stunky', 'Timburr', 'Tinkatink', 'Toedscool', 'Trapinch', 'Voltorb-Hisui', 'Vullaby', + 'Diglett-Alola', 'Drifloon', 'Drilbur', 'Foongus', 'Gastly', 'Glimmet', 'Gothita', 'Grookey', 'Growlithe-Hisui', 'Impidimp', 'Koffing', + 'Magby', 'Mareanie', 'Mienfoo', 'Mudbray', 'Pawniard', 'Shellder', 'Snubbull', 'Stunky', 'Tentacool', 'Timburr', 'Tinkatink', 'Toedscool', + 'Torchic', 'Voltorb-Hisui', 'Vullaby', 'Wattrel', 'Zorua-Hisui', ], }, { diff --git a/data/formats-data.ts b/data/formats-data.ts index df21b25b2315..e6f613c2e7e5 100644 --- a/data/formats-data.ts +++ b/data/formats-data.ts @@ -469,7 +469,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { }, arcaninehisui: { tier: "UU", - doublesTier: "DOU", + doublesTier: "DUU", natDexTier: "RU", }, poliwag: { @@ -595,7 +595,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { tier: "LC", }, slowbro: { - tier: "NU", + tier: "RU", doublesTier: "(DUU)", natDexTier: "UU", }, @@ -628,7 +628,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { natDexTier: "NFE", }, magnezone: { - tier: "NU", + tier: "RU", doublesTier: "(DUU)", natDexTier: "UU", }, @@ -831,7 +831,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { natDexTier: "RU", }, weezinggalar: { - tier: "UU", + tier: "RU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -844,7 +844,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { natDexTier: "NFE", }, rhyperior: { - tier: "NU", + tier: "UU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -1168,13 +1168,13 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { natDexTier: "UU", }, moltres: { - tier: "RU", + tier: "OU", doublesTier: "(DUU)", natDexTier: "OU", }, moltresgalar: { tier: "UUBL", - doublesTier: "(DUU)", + doublesTier: "DUU", natDexTier: "RUBL", }, dratini: { @@ -1457,7 +1457,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { }, gliscor: { tier: "OU", - doublesTier: "(DUU)", + doublesTier: "DUU", natDexTier: "OU", }, snubbull: { @@ -1640,7 +1640,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { natDexTier: "RU", }, raikou: { - tier: "NU", + tier: "PU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -1668,7 +1668,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { tyranitarmega: { isNonstandard: "Past", tier: "Illegal", - natDexTier: "UU", + natDexTier: "OU", }, lugia: { tier: "Uber", @@ -1733,7 +1733,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { swampertmega: { isNonstandard: "Past", tier: "Illegal", - natDexTier: "RU", + natDexTier: "OU", }, poochyena: { tier: "LC", @@ -1871,7 +1871,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { tier: "LC", }, breloom: { - tier: "RU", + tier: "NU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -2092,7 +2092,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { natDexTier: "RU", }, torkoal: { - tier: "OU", + tier: "UU", doublesTier: "DOU", natDexTier: "RU", }, @@ -2452,7 +2452,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { natDexTier: "Uber", }, deoxysdefense: { - tier: "RU", + tier: "NU", doublesTier: "(DUU)", natDexTier: "RUBL", }, @@ -2844,7 +2844,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { natDexTier: "Uber", }, cresselia: { - tier: "RU", + tier: "NU", doublesTier: "DOU", natDexTier: "RU", }, @@ -2890,7 +2890,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { tier: "NFE", }, serperior: { - tier: "OU", + tier: "UU", doublesTier: "(DUU)", natDexTier: "OU", }, @@ -3130,7 +3130,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { tier: "LC", }, whimsicott: { - tier: "PU", + tier: "ZU", doublesTier: "DOU", natDexTier: "RU", }, @@ -3144,7 +3144,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { }, lilliganthisui: { tier: "NUBL", - doublesTier: "DUU", + doublesTier: "(DUU)", natDexTier: "RUBL", }, basculin: { @@ -3169,7 +3169,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { tier: "NFE", }, krookodile: { - tier: "NU", + tier: "RU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -3301,7 +3301,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { tier: "LC", }, cinccino: { - tier: "RU", + tier: "NU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -3323,7 +3323,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { tier: "NFE", }, reuniclus: { - tier: "NU", + tier: "RU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -3470,7 +3470,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { haxorus: { tier: "RUBL", doublesTier: "(DUU)", - natDexTier: "UU", + natDexTier: "RU", }, cubchoo: { tier: "LC", @@ -3590,7 +3590,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { natDexTier: "OU", }, cobalion: { - tier: "RU", + tier: "UU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -3615,7 +3615,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { natDexTier: "UUBL", }, thundurus: { - tier: "NU", + tier: "RU", doublesTier: "DUU", natDexTier: "RU", }, @@ -3749,7 +3749,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { }, talonflame: { tier: "NU", - doublesTier: "DUU", + doublesTier: "(DUU)", natDexTier: "RU", }, scatterbug: { @@ -3949,7 +3949,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { natDexTier: "RU", }, goodrahisui: { - tier: "UU", + tier: "RU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -4011,7 +4011,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { tier: "LC", }, noivern: { - tier: "NU", + tier: "RU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -4055,18 +4055,18 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { natDexTier: "OU", }, hoopa: { - tier: "ZU", + tier: "PU", doublesTier: "(DUU)", natDexTier: "RU", }, hoopaunbound: { tier: "RUBL", doublesTier: "(DUU)", - natDexTier: "OU", + natDexTier: "UUBL", }, volcanion: { tier: "RU", - doublesTier: "DOU", + doublesTier: "DUU", natDexTier: "RU", }, rowlet: { @@ -4177,7 +4177,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { tier: "NFE", }, ribombee: { - tier: "OU", + tier: "UU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -4234,7 +4234,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { tier: "LC", }, araquanid: { - tier: "RU", + tier: "NU", doublesTier: "DUU", natDexTier: "RU", }, @@ -4298,7 +4298,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { natDexTier: "RU", }, comfey: { - tier: "RUBL", + tier: "UU", doublesTier: "DUU", natDexTier: "RU", }, @@ -4541,7 +4541,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { buzzwole: { isNonstandard: "Past", tier: "Illegal", - natDexTier: "RUBL", + natDexTier: "UU", }, pheromosa: { isNonstandard: "Past", @@ -4963,7 +4963,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { natDexTier: "RU", }, indeedee: { - tier: "UU", + tier: "NU", doublesTier: "DUU", natDexTier: "RU", }, @@ -4981,7 +4981,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { tier: "LC", }, copperajah: { - tier: "NU", + tier: "PU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -4992,7 +4992,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { dracozolt: { isNonstandard: "Past", tier: "Illegal", - natDexTier: "UU", + natDexTier: "RU", }, arctozolt: { isNonstandard: "Past", @@ -5086,7 +5086,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { }, regieleki: { tier: "Uber", - doublesTier: "DUU", + doublesTier: "(DUU)", natDexTier: "Uber", }, regidrago: { @@ -5340,7 +5340,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { natDexTier: "RU", }, bombirdier: { - tier: "ZU", + tier: "PU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -5384,7 +5384,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { tier: "LC", }, grafaiai: { - tier: "PU", + tier: "ZU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -5495,7 +5495,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { }, tinglu: { tier: "OU", - doublesTier: "DUU", + doublesTier: "DOU", natDexTier: "UU", }, chienpao: { @@ -5586,7 +5586,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { sinistcha: { tier: "UU", doublesTier: "DOU", - natDexTier: "UU", + natDexTier: "RU", }, okidogi: { tier: "RU", @@ -5649,7 +5649,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { natDexTier: "UU", }, ironcrown: { - tier: "UU", + tier: "OU", doublesTier: "DUU", natDexTier: "OU", }, @@ -5660,7 +5660,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { }, pecharunt: { tier: "UU", - doublesTier: "DUU", + doublesTier: "(DUU)", natDexTier: "RUBL", }, missingno: { From b4dc5a19d5e0535987ffbc9f50790fc87fc81239 Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Mon, 1 Jul 2024 10:48:08 -0600 Subject: [PATCH 094/139] Add July 2024 rotational formats --- config/formats.ts | 341 +++++++++++++++++++++++++--------------------- data/aliases.ts | 4 +- 2 files changed, 186 insertions(+), 159 deletions(-) diff --git a/config/formats.ts b/config/formats.ts index af55b129075e..1f7e514f1352 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -430,8 +430,8 @@ export const Formats: FormatList = [ searchShow: false, ruleset: ['[Gen 9] LC'], banlist: [ - 'Diglett-Alola', 'Drifloon', 'Drilbur', 'Foongus', 'Gastly', 'Glimmet', 'Gothita', 'Grookey', 'Growlithe-Hisui', 'Impidimp', 'Koffing', - 'Magby', 'Mareanie', 'Mienfoo', 'Mudbray', 'Pawniard', 'Shellder', 'Snubbull', 'Stunky', 'Tentacool', 'Timburr', 'Tinkatink', 'Toedscool', + 'Diglett-Alola', 'Drifloon', 'Drilbur', 'Foongus', 'Glimmet', 'Gothita', 'Grookey', 'Growlithe-Hisui', 'Impidimp', 'Koffing', 'Magby', + 'Mareanie', 'Mienfoo', 'Mudbray', 'Pawniard', 'Shellder', 'Snubbull', 'Stunky', 'Tentacool', 'Timburr', 'Tinkatink', 'Toedscool', 'Torchic', 'Voltorb-Hisui', 'Vullaby', 'Wattrel', 'Zorua-Hisui', ], }, @@ -620,106 +620,41 @@ export const Formats: FormatList = [ column: 2, }, { - 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.`, + 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.`, threads: [ - `• Fervent Impersonation`, + `• Frantic Fusions`, ], 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-Base', '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-Base', '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] 350 Cup", - desc: `Pokemon with a BST of 350 or lower have their stats doubled.`, - threads: [ - `• 350 Cup`, - ], - - mod: 'gen9', - 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] 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.`, - threads: [ - `• Godly Gift`, - `• Godly Gift Resources`, - ], - - mod: 'gen9', - ruleset: ['Standard OMs', 'Sleep Moves Clause', 'Godly Gift Mod'], - banlist: [ - 'Blissey', 'Calyrex-Shadow', 'Chansey', 'Deoxys-Attack', 'Koraidon', 'Kyurem-Black', 'Miraidon', 'Arena Trap', '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: [ - 'Annihilape', 'Arceus', 'Baxcalibur', 'Calyrex-Ice', 'Chien-Pao', 'Chi-Yu', 'Crawdaunt', 'Deoxys-Base', 'Deoxys-Speed', 'Dialga', 'Dialga-Origin', 'Dragapult', 'Espathra', - 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Gliscor', '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', 'Rayquaza', 'Regieleki', - 'Reshiram', 'Shaymin-Sky', 'Smeargle', 'Solgaleo', 'Terapagos', 'Toxapex', 'Ursaluna', 'Ursaluna-Bloodmoon', 'Volcarona', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Crowned', - 'Zekrom', - ], - }, - - // Other Metagames - /////////////////////////////////////////////////////////////////// - - { - section: "Other Metagames", - column: 2, - }, - { - name: "[Gen 9] Almost Any Ability", - desc: `Pokémon have access to almost any ability.`, - threads: [ - `• Almost Any Ability`, - `• AAA Resources`, - ], - - mod: 'gen9', - ruleset: ['Standard OMs', '!Obtainable Abilities', 'Ability Clause = 1', 'Sleep Moves Clause', 'Terastal Clause'], + ruleset: ['Standard OMs', '!Nickname Clause', '!Obtainable Abilities', 'Sleep Moves Clause', 'Frantic Fusions Mod', 'Terastal Clause'], banlist: [ - 'Annihilape', 'Arceus', 'Baxcalibur', 'Calyrex-Ice', 'Calyrex-Shadow', 'Darkrai', 'Deoxys-Base', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', 'Dragapult', 'Enamorus-Base', - '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', - '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', 'Revival Blessing', 'Shed Tail', + 'Annihilape', 'Arceus', 'Baxcalibur', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Comfey', 'Cresselia', 'Darkrai', 'Deoxys-Base', 'Deoxys-Attack', + 'Deoxys-Speed', 'Dialga', 'Dialga-Origin', 'Ditto', 'Dragapult', 'Enamorus-Base', '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-Base', 'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Numel', 'Ogerpon-Hearthflame', + 'Palafin', 'Palkia', 'Palkia-Origin', 'Persian-Alola', 'Rayquaza', 'Regieleki', 'Regigigas', 'Reshiram', 'Shaymin-Sky', 'Slaking', '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] Balanced Hackmons", - desc: `Anything directly hackable onto a set (EVs, IVs, forme, ability, item, and move) and is usable in local battles is allowed.`, + name: "[Gen 9] Category Swap", + desc: `All Special moves become Physical, and all Physical moves become Special.`, threads: [ - `• Balanced Hackmons`, - `• BH Resources`, + `• Category Swap`, ], 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', - ], + ruleset: ['Standard OMs', 'Sleep Clause Mod', 'Category Swap Mod'], 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', 'Dire Claw', 'Electro Shot', 'Fillet Away', - 'Imprison', 'Last Respects', 'Lumina Crash', 'Photon Geyser', 'Quiver Dance', 'Rage Fist', 'Revival Blessing', 'Shed Tail', 'Substitute', 'Shell Smash', - 'Tail Glow', + 'Arceus', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Darkrai', 'Deoxys-Base', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', 'Giratina', 'Giratina-Origin', 'Groudon', + 'Ho-Oh', 'Iron Valiant', 'Koraidon', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lunala', 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', + 'Necrozma-Dusk-Mane', 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Regieleki', 'Reshiram', 'Solgaleo', 'Spectrier', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', + 'Arena Trap', 'Moody', 'Shadow Tag', 'King\'s Rock', 'Razor Fang', 'Baton Pass', 'Draco Meteor', 'Last Respects', 'Overheat', 'Shed Tail', ], }, { @@ -917,6 +852,79 @@ export const Formats: FormatList = [ this.add('-start', pokemon, donorTemplate.name, '[silent]'); }, }, + + // Other Metagames + /////////////////////////////////////////////////////////////////// + + { + section: "Other Metagames", + column: 2, + }, + { + name: "[Gen 9] Almost Any Ability", + desc: `Pokémon have access to almost any ability.`, + threads: [ + `• Almost Any Ability`, + `• AAA Resources`, + ], + + mod: 'gen9', + ruleset: ['Standard OMs', '!Obtainable Abilities', 'Ability Clause = 1', 'Sleep Moves Clause', 'Terastal Clause'], + banlist: [ + 'Annihilape', 'Arceus', 'Baxcalibur', 'Calyrex-Ice', 'Calyrex-Shadow', 'Darkrai', 'Deoxys-Base', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', 'Dragapult', 'Enamorus-Base', + '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', + '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', 'Revival Blessing', '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.`, + threads: [ + `• Balanced Hackmons`, + `• BH Resources`, + ], + + 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', 'Dire Claw', 'Electro Shot', 'Fillet Away', + 'Imprison', 'Last Respects', 'Lumina Crash', '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.`, + threads: [ + `• Godly Gift`, + `• Godly Gift Resources`, + ], + + mod: 'gen9', + ruleset: ['Standard OMs', 'Sleep Moves Clause', 'Godly Gift Mod'], + banlist: [ + 'Blissey', 'Calyrex-Shadow', 'Chansey', 'Deoxys-Attack', 'Koraidon', 'Kyurem-Black', 'Miraidon', 'Arena Trap', '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: [ + 'Annihilape', 'Arceus', 'Baxcalibur', 'Calyrex-Ice', 'Chien-Pao', 'Chi-Yu', 'Crawdaunt', 'Deoxys-Base', 'Deoxys-Speed', 'Dialga', 'Dialga-Origin', 'Dragapult', 'Espathra', + 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Gliscor', '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', 'Rayquaza', 'Regieleki', + 'Reshiram', 'Shaymin-Sky', 'Smeargle', 'Solgaleo', '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 Primal orbs, Origin orbs, and Rusted items with no limit. Mega and Primal boosts based on form changes from gen 7.`, @@ -1173,6 +1181,18 @@ export const Formats: FormatList = [ section: "Challengeable OMs", column: 2, }, + { + name: "[Gen 9] 350 Cup", + desc: `Pokemon with a BST of 350 or lower have their stats doubled.`, + threads: [ + `• 350 Cup`, + ], + + 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.`, @@ -1350,6 +1370,25 @@ export const Formats: FormatList = [ } }, }, + { + 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.`, + threads: [ + `• Fervent Impersonation`, + ], + + 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-Base', '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-Base', '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.`, @@ -1586,28 +1625,6 @@ export const Formats: FormatList = [ }, }, }, - { - 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.`, - threads: [ - `• Frantic Fusions`, - ], - - 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-Base', 'Deoxys-Attack', - 'Deoxys-Speed', 'Dialga', 'Dialga-Origin', 'Ditto', 'Dragapult', 'Enamorus-Base', '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-Base', 'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Numel', 'Ogerpon-Hearthflame', - 'Palafin', 'Palkia', 'Palkia-Origin', 'Persian-Alola', 'Rayquaza', 'Regieleki', 'Regigigas', 'Reshiram', 'Shaymin-Sky', 'Slaking', '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.`, @@ -2414,10 +2431,10 @@ export const Formats: FormatList = [ ], mod: 'gen9', - searchShow: false, + // 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', 'Groudon-Primal', 'Rayquaza-Mega', 'Shedinja', 'Arena Trap', + 'Cramorant-Gorging', 'Calyrex-Shadow', 'Darmanitan-Galar-Zen', 'Eternatus-Eternamax', 'Greninja-Ash', 'Groudon-Primal', 'Rayquaza-Mega', 'Shedinja', 'Arena Trap', 'Contrary', 'Gorilla Tactics', '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', 'Chatter', 'Double Iron Bash', 'Electrify', 'Last Respects', 'Octolock', 'Rage Fist', 'Revival Blessing', 'Shed Tail', 'Shell Smash', 'Comatose + Sleep Talk', 'Imprison + Transform', @@ -3137,44 +3154,38 @@ export const Formats: FormatList = [ column: 4, }, { - name: "[Gen 7] UU", + name: "[Gen 8] UU", threads: [ - `• USM UU Sample Teams`, - `• USM UU Viability Rankings`, + `• UU Metagame Discussion`, + `• UU Sample Teams`, + `• UU Viability Rankings`, ], - mod: 'gen7', + mod: 'gen8', // searchShow: false, - ruleset: ['[Gen 7] OU'], - banlist: ['OU', 'UUBL', 'Drizzle', 'Drought', 'Kommonium Z', 'Mewnium Z'], + ruleset: ['[Gen 8] OU'], + banlist: ['OU', 'UUBL', 'Light Clay'], }, { - name: "[Gen 4] LC", + name: "[Gen 5] BW1 OU", threads: [ - `• DPP LC Guide`, - `• DPP LC Viability Rankings`, + `• BW1 OU`, ], - mod: 'gen4', - // searchShow: false, - ruleset: ['Standard', 'Little Cup', 'Sleep Moves Clause'], - banlist: [ - 'Meditite', 'Misdreavus', 'Murkrow', 'Scyther', 'Sneasel', 'Tangela', 'Yanma', - 'Berry Juice', 'Deep Sea Tooth', 'Dragon Rage', 'Sonic Boom', 'Swagger', - ], + mod: 'gen5bw1', + ruleset: ['Standard', 'Sleep Clause Mod', 'Swagger Clause'], + banlist: ['Uber', 'Drizzle ++ Swift Swim', 'King\'s Rock', 'Razor Fang', 'Soul Dew', 'Acupressure', 'Assist'], }, { - name: "[Gen 8] NU", + name: "[Gen 1] ZU", threads: [ - `• NU Metagame Discussion`, - `• NU Sample Teams`, - `• NU Viability Rankings`, + `• RBY ZU Metagame Discussion & Resources`, ], - mod: 'gen8', - // searchShow: false, - ruleset: ['[Gen 8] RU'], - banlist: ['RU', 'NUBL', 'Drizzle', 'Drought', 'Slush Rush'], + mod: 'gen1', + searchShow: false, + ruleset: ['[Gen 1] PU'], + banlist: ['PU', 'ZUBL'], }, // Past Gens OU @@ -3385,28 +3396,28 @@ export const Formats: FormatList = [ banlist: ['AG', 'Shadow Tag', 'Baton Pass'], }, { - name: "[Gen 8] UU", + name: "[Gen 8] RU", threads: [ - `• UU Metagame Discussion`, - `• UU Sample Teams`, - `• UU Viability Rankings`, + `• SS RU Resources`, ], mod: 'gen8', searchShow: false, - ruleset: ['[Gen 8] OU'], - banlist: ['OU', 'UUBL', 'Light Clay'], + ruleset: ['[Gen 8] UU'], + banlist: ['UU', 'RUBL'], }, { - name: "[Gen 8] RU", + name: "[Gen 8] NU", threads: [ - `• SS RU Resources`, + `• NU Metagame Discussion`, + `• NU Sample Teams`, + `• NU Viability Rankings`, ], mod: 'gen8', searchShow: false, - ruleset: ['[Gen 8] UU'], - banlist: ['UU', 'RUBL'], + ruleset: ['[Gen 8] RU'], + banlist: ['RU', 'NUBL', 'Drizzle', 'Drought', 'Slush Rush'], }, { name: "[Gen 8] PU", @@ -3667,6 +3678,18 @@ export const Formats: FormatList = [ ruleset: ['Standard', 'Mega Rayquaza Clause'], banlist: ['Baton Pass'], }, + { + name: "[Gen 7] UU", + threads: [ + `• USM UU Sample Teams`, + `• USM UU Viability Rankings`, + ], + + mod: 'gen7', + searchShow: false, + ruleset: ['[Gen 7] OU'], + banlist: ['OU', 'UUBL', 'Drizzle', 'Drought', 'Kommonium Z', 'Mewnium Z'], + }, { name: "[Gen 7] RU", threads: [ @@ -4279,17 +4302,6 @@ export const Formats: FormatList = [ ruleset: ['[Gen 5] RU', '!Sleep Moves Clause', 'Sleep Clause Mod'], banlist: ['RU', 'NUBL', 'Assist', 'Copycat'], }, - { - name: "[Gen 5] BW1 OU", - threads: [ - `• BW1 OU`, - ], - - mod: 'gen5bw1', - searchShow: false, - ruleset: ['Standard', 'Sleep Clause Mod', 'Swagger Clause'], - banlist: ['Uber', 'Drizzle ++ Swift Swim', 'King\'s Rock', 'Razor Fang', 'Soul Dew', 'Acupressure', 'Assist'], - }, { name: "[Gen 5] PU", threads: [ @@ -4524,6 +4536,21 @@ export const Formats: FormatList = [ 'Vileplume', ], }, + { + name: "[Gen 4] LC", + threads: [ + `• DPP LC Guide`, + `• DPP LC Viability Rankings`, + ], + + mod: 'gen4', + searchShow: false, + ruleset: ['Standard', 'Little Cup', 'Sleep Moves Clause'], + banlist: [ + 'Meditite', 'Misdreavus', 'Murkrow', 'Scyther', 'Sneasel', 'Tangela', 'Yanma', + 'Berry Juice', 'Deep Sea Tooth', 'Dragon Rage', 'Sonic Boom', 'Swagger', + ], + }, { name: "[Gen 4] Anything Goes", diff --git a/data/aliases.ts b/data/aliases.ts index c67f66212dcc..ac70362aa652 100644 --- a/data/aliases.ts +++ b/data/aliases.ts @@ -86,8 +86,8 @@ export const Aliases: {[alias: string]: string} = { gen6ag: "[Gen 6] Anything Goes", crossevo: "[Gen 9] Cross Evolution", mayhem: "[Gen 9] Random Battle Mayhem", - omotm: "[Gen 9] Fervent Impersonation", - lcotm: "[Gen 9] 350 Cup", + omotm: "[Gen 9] Frantic Fusions", + lcotm: "[Gen 9] Category Swap", // mega evos fabio: "Ampharos-Mega", From b2f346344c15f915f0eaf86e60a00d3cd6d7cddd Mon Sep 17 00:00:00 2001 From: livid washed <115855253+livid-washed@users.noreply.github.com> Date: Tue, 2 Jul 2024 02:50:34 +1000 Subject: [PATCH 095/139] Add July 2024 Randomized Format Spotlight (#10379) * Add July 2024 Randomized Format Spotlight * description * clear out spotlight section, move to normal * lint * Update config/formats.ts * Update data/random-battles/gen9/teams.ts * Update data/random-battles/gen9/teams.ts * last minute set changes thanks quziel --------- Co-authored-by: ACakeWearingAHat <45981036+ACakeWearingAHat@users.noreply.github.com> Co-authored-by: Kris Johnson <11083252+KrisXV@users.noreply.github.com> --- config/formats.ts | 58 ++- data/random-battles/gen9/teams.ts | 4 +- data/random-battles/gen9cap/sets.json | 512 ++++++++++++++++++++++++++ data/random-battles/gen9cap/teams.ts | 385 +++++++++++++++++++ sim/teams.ts | 2 + test/random-battles/all-gens.js | 4 + 6 files changed, 933 insertions(+), 32 deletions(-) create mode 100644 data/random-battles/gen9cap/sets.json create mode 100644 data/random-battles/gen9cap/teams.ts diff --git a/config/formats.ts b/config/formats.ts index 1f7e514f1352..9e828f744cfe 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -2499,32 +2499,20 @@ export const Formats: FormatList = [ column: 3, }, { - name: "[Gen 9] Chimera 1v1 Random Battle", - desc: "Merges a team of six into a single Pok\u00e9mon depending on the order chosen at team preview: It gains the typing of the first, item of the second, ability of the third, stats of the fourth, the first two moves of the fifth, and the last two moves of the sixth.", - + name: "[Gen 9] CAP Random Battle", + desc: "[Gen 9] Random Battle with CAP Pokémon included. Every team will generate with at least one CAP Pokémon.", + mod: 'gen9', team: 'random', - ruleset: ['[Gen 9] Random Battle', 'Chimera 1v1 Rule', 'Terastal Clause', 'Adjust Level = 100'], - onBegin() { - this.add(`raw|
      Chimera Rands is a 1v1 format where you combine your 6 Pokemon into one "Chimera." The order you select during team preview is important! In sequence, your picks determine your Chimera's Type, Item, Ability, Stats, Moves 1 & 2, then finally Moves 3 & 4.
      `); - }, - }, - { - name: "[Gen 9] BSS Factory", - desc: `Randomized 3v3 Singles featuring Pokémon and movesets popular in Battle Stadium Singles.`, - threads: [ - `• Information and Suggestions Thread`, - ], - mod: 'gen9', - team: 'randomBSSFactory', - ruleset: ['Flat Rules', 'VGC Timer'], + ruleset: ['[Gen 9] Random Battle'], }, - { - name: "[Gen 9] Baby Random Battle", - mod: 'gen9', - team: 'randomBaby', - ruleset: ['Obtainable', 'Species Clause', 'HP Percentage Mod', 'Cancel Mod', 'Sleep Clause Mod', 'Illusion Level Mod'], + // Randomized Metas + /////////////////////////////////////////////////////////////////// + + { + section: "Randomized Metas", + column: 3, }, { name: "[Gen 9] Random Roulette", @@ -2534,14 +2522,6 @@ export const Formats: FormatList = [ team: 'random', searchShow: false, }, - - // Randomized Metas - /////////////////////////////////////////////////////////////////// - - { - section: "Randomized Metas", - column: 3, - }, { name: "[Gen 9] Super Staff Bros Ultimate", desc: "The fifth iteration of Super Staff Bros is here! Battle with a random team of pokemon created by the sim staff.", @@ -2639,6 +2619,24 @@ export const Formats: FormatList = [ }, }, + { + name: "[Gen 9] BSS Factory", + desc: `Randomized 3v3 Singles featuring Pokémon and movesets popular in Battle Stadium Singles.`, + threads: [ + `• Information and Suggestions Thread`, + ], + + mod: 'gen9', + team: 'randomBSSFactory', + ruleset: ['Flat Rules', 'VGC Timer'], + }, + { + name: "[Gen 9] Baby Random Battle", + + mod: 'gen9', + team: 'randomBaby', + ruleset: ['Obtainable', 'Species Clause', 'HP Percentage Mod', 'Cancel Mod', 'Sleep Clause Mod', 'Illusion Level Mod'], + }, { name: "[Gen 9] Computer-Generated Teams", desc: `Teams generated automatically based on heuristics (rules), with levels based on previous success/failure in battle. ` + diff --git a/data/random-battles/gen9/teams.ts b/data/random-battles/gen9/teams.ts index 4b860d151e3b..5efc3688580a 100644 --- a/data/random-battles/gen9/teams.ts +++ b/data/random-battles/gen9/teams.ts @@ -1528,7 +1528,7 @@ export class RandomTeams { // Low Priority if ( - (species.id === 'garchomp' && role === 'Fast Support') || ( + ability === 'Rough Skin' || ( ability === 'Regenerator' && (role === 'Bulky Support' || role === 'Bulky Attacker') && (species.baseStats.hp + species.baseStats.def) >= 180 && this.randomChance(1, 2) ) || ( @@ -1537,7 +1537,7 @@ export class RandomTeams { (species.baseStats.hp + species.baseStats.def) > 200 && this.randomChance(1, 2) ) ) return 'Rocky Helmet'; - if (moves.has('outrage')) return 'Lum Berry'; + if (moves.has('outrage') && counter.get('setup')) return 'Lum Berry'; if (moves.has('protect') && ability !== 'Speed Boost') return 'Leftovers'; if ( role === 'Fast Support' && isLead && !counter.get('recovery') && !counter.get('recoil') && diff --git a/data/random-battles/gen9cap/sets.json b/data/random-battles/gen9cap/sets.json new file mode 100644 index 000000000000..b94b32f6c397 --- /dev/null +++ b/data/random-battles/gen9cap/sets.json @@ -0,0 +1,512 @@ +{ + "syclant": { + "level": 78, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Earth Power", "Focus Blast", "Spikes", "Triple Axel", "U-turn"], + "teraTypes": ["Fighting", "Ground"] + }, + { + "role": "Fast Bulky Setup", + "movepool": ["Close Combat", "Earthquake", "Leech Life", "Swords Dance", "Triple Axel"], + "teraTypes": ["Fighting", "Ground"] + }, + { + "role": "Setup Sweeper", + "movepool": ["Blizzard", "Bug Buzz", "Earth Power", "Focus Blast", "Tail Glow"], + "teraTypes": ["Fighting", "Ground"] + } + ] + }, + "revenankh": { + "level": 77, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Bulk Up", "Drain Punch", "Moonlight", "Poltergeist"], + "teraTypes": ["Fairy", "Fighting", "Steel", "Water"] + }, + { + "role": "Bulky Attacker", + "movepool": ["Bulk Up", "Drain Punch", "Poltergeist", "Shadow Sneak"], + "teraTypes": ["Fairy", "Fighting", "Steel", "Water"] + } + ] + }, + "pyroak": { + "level": 86, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Earth Power", "Energy Ball", "Overheat", "Synthesis"], + "teraTypes": ["Fire", "Ground"] + }, + { + "role": "AV Pivot", + "movepool": ["Dragon Tail", "Earth Power", "Giga Drain", "Overheat"], + "teraTypes": ["Fire", "Ground"] + } + ] + }, + "fidgit": { + "level": 86, + "sets": [ + { + "role": "Fast Support", + "movepool": ["Earth Power", "Encore", "Knock Off", "Rapid Spin", "Sludge Bomb", "Stealth Rock", "Tailwind", "Toxic", "Toxic Spikes", "U-turn"], + "teraTypes": ["Flying", "Steel"] + } + ] + }, + "stratagem": { + "level": 80, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["Energy Ball", "Fire Blast", "Paleo Wave", "Trick"], + "teraTypes": ["Fire", "Grass", "Rock"] + }, + { + "role": "Setup Sweeper", + "movepool": ["Energy Ball", "Fire Blast", "Meteor Beam", "Paleo Wave"], + "teraTypes": ["Fire", "Grass", "Rock"] + } + ] + }, + "arghonaut": { + "level": 78, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Bulk Up", "Drain Punch", "Liquidation", "Recover"], + "teraTypes": ["Steel"] + }, + { + "role": "Bulky Support", + "movepool": ["Circle Throw", "Knock Off", "Recover", "Spikes"], + "teraTypes": ["Dark", "Steel"] + } + ] + }, + "kitsunoh": { + "level": 79, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Bullet Punch", "Close Combat", "Meteor Mash", "Poltergeist", "Strength Sap", "Trick"], + "teraTypes": ["Fairy", "Fighting", "Ghost", "Steel"] + }, + { + "role": "Bulky Attacker", + "movepool": ["Defog", "Meteor Mash", "Poltergeist", "Strength Sap", "U-turn", "Will-O-Wisp"], + "teraTypes": ["Dark", "Water"] + } + ] + }, + "cyclohm": { + "level": 79, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Defog", "Discharge", "Draco Meteor", "Fire Blast", "Ice Beam", "Slack Off", "Thunderbolt", "Volt Switch"], + "teraTypes": ["Electric", "Fairy", "Steel"] + }, + { + "role": "AV Pivot", + "movepool": ["Discharge", "Draco Meteor", "Fire Blast", "Ice Beam", "Thunderbolt", "Volt Switch"], + "teraTypes": ["Electric", "Fairy", "Steel"] + } + ] + }, + "colossoil": { + "level": 78, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Facade", "Headlong Rush", "Knock Off", "Rapid Spin", "Sucker Punch", "U-turn"], + "teraTypes": ["Normal"] + } + ] + }, + "krilowatt": { + "level": 85, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Ice Beam", "Surf", "Volt Switch", "Wild Charge"], + "teraTypes": ["Electric", "Flying"] + } + ] + }, + "voodoom": { + "level": 82, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Aura Sphere", "Dark Pulse", "Flash Cannon", "Focus Blast", "Nasty Plot", "Volt Switch"], + "teraTypes": ["Steel"] + } + ] + }, + "tomohawk": { + "level": 82, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Aura Sphere", "Haze", "Hurricane", "Rapid Spin", "Roost"], + "teraTypes": ["Steel"] + } + ] + }, + "necturna": { + "level": 82, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Power Whip", "Shadow Claw", "Shell Smash", "Stone Edge"], + "teraTypes": ["Rock"] + } + ] + }, + "mollux": { + "level": 84, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Hydro Pump", "Lava Plume", "Rapid Spin", "Recover", "Sludge Bomb", "Thunder Wave"], + "teraTypes": ["Grass", "Water"] + }, + { + "role": "Fast Attacker", + "movepool": ["Eruption", "Hydro Pump", "Sludge Wave", "Trick"], + "teraTypes": ["Fire"] + } + ] + }, + "aurumoth": { + "level": 77, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Bug Buzz", "Focus Blast", "Psyshock", "Tail Glow"], + "teraTypes": ["Fighting"] + }, + { + "role": "Wallbreaker", + "movepool": ["Blizzard", "Bug Buzz", "Focus Blast", "Hydro Pump", "Overheat", "Psychic", "Psyshock", "Thunder"], + "teraTypes": ["Fighting", "Fire"] + }, + { + "role": "Setup Sweeper", + "movepool": ["Close Combat", "Dragon Dance", "Megahorn", "Zen Headbutt"], + "teraTypes": ["Fighting"] + } + ] + }, + "malaconda": { + "level": 84, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Glare", "Knock Off", "Parting Shot", "Rapid Spin", "Solar Blade", "Synthesis", "Temper Flare"], + "teraTypes": ["Poison", "Water"] + }, + { + "role": "Bulky Support", + "movepool": ["Knock Off", "Solar Blade", "Sucker Punch", "Synthesis"], + "teraTypes": ["Poison", "Water"] + }, + { + "role": "AV Pivot", + "movepool": ["Knock Off", "Rapid Spin", "Solar Blade", "Sucker Punch", "Temper Flare", "U-turn"], + "teraTypes": ["Fire", "Poison"] + } + ] + }, + "cawmodore": { + "level": 77, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Acrobatics", "Belly Drum", "Bullet Punch", "Drain Punch"], + "teraTypes": ["Flying", "Water"] + } + ] + }, + "volkraken": { + "level": 84, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Flamethrower", "Hydro Pump", "Overheat", "U-turn"], + "teraTypes": ["Fire", "Water"] + }, + { + "role": "Wallbreaker", + "movepool": ["Fire Blast", "Hydro Pump", "Scald", "U-turn"], + "teraTypes": ["Fire", "Water"] + } + ] + }, + "plasmanta": { + "level": 86, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Discharge", "Encore", "Sludge Bomb", "Surf", "Taunt", "Thunderbolt"], + "teraTypes": ["Water"] + } + ] + }, + "naviathan": { + "level": 81, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Dragon Dance", "Facade", "Heavy Slam", "Wave Crash"], + "teraTypes": ["Grass", "Normal"] + } + ] + }, + "crucibelle": { + "level": 87, + "sets": [ + { + "role": "AV Pivot", + "movepool": ["Gunk Shot", "Knock Off", "Poison Jab", "Stone Edge", "U-turn", "Wood Hammer"], + "teraTypes": ["Grass"] + }, + { + "role": "Fast Support", + "movepool": ["Gunk Shot", "Knock Off", "Stealth Rock", "Stone Edge", "Toxic Spikes"], + "teraTypes": ["Dark", "Grass"] + }, + { + "role": "Bulky Setup", + "movepool": ["Coil", "Gunk Shot", "Stone Edge", "Wood Hammer"], + "teraTypes": ["Grass"] + } + ] + }, + "kerfluffle": { + "level": 82, + "sets": [ + { + "role": "Fast Support", + "movepool": ["Aura Sphere", "Encore", "Focus Blast", "Moonblast", "Parting Shot", "Psychic", "Vacuum Wave"], + "teraTypes": ["Steel"] + } + ] + }, + "pajantom": { + "level": 80, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Earthquake", "Leech Life", "Outrage", "Spirit Shackle", "Taunt", "Toxic Spikes"], + "teraTypes": ["Fairy", "Ghost"] + } + ] + }, + "jumbao": { + "level": 84, + "sets": [ + { + "role": "Fast Support", + "movepool": ["Focus Blast", "Healing Wish", "Moonblast", "Solar Beam", "Synthesis"], + "teraTypes": ["Poison", "Water"] + }, + { + "role": "Tera Blast user", + "movepool": ["Healing Wish", "Moonblast", "Solar Beam", "Synthesis", "Tera Blast"], + "teraTypes": ["Fire"] + } + ] + }, + "caribolt": { + "level": 83, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Horn Leech", "Hyper Drill", "Knock Off", "Swords Dance"], + "teraTypes": ["Electric"] + }, + { + "role": "Bulky Setup", + "movepool": ["Double-Edge", "Horn Leech", "Rapid Spin", "Swords Dance"], + "teraTypes": ["Electric"] + } + ] + }, + "smokomodo": { + "level": 82, + "sets": [ + { + "role": "Fast Bulky Setup", + "movepool": ["Bone Rush", "Bulk Up", "Flame Charge", "Morning Sun"], + "teraTypes": ["Grass", "Ground"] + }, + { + "role": "Setup Sweeper", + "movepool": ["Bone Rush", "Bulk Up", "Flame Wheel", "Scale Shot"], + "teraTypes": ["Dragon"] + }, + { + "role": "Fast Support", + "movepool": ["Bone Rush", "Clear Smog", "Defog", "Flame Wheel", "Morning Sun", "Stealth Rock", "Taunt", "Toxic", "Will-O-Wisp"], + "teraTypes": ["Grass", "Ground", "Water"] + } + ] + }, + "snaelstrom": { + "level": 81, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Liquidation", "Rapid Spin", "Stealth Rock", "Sticky Web", "Toxic", "U-turn"], + "teraTypes": ["Electric", "Ground"] + }, + { + "role": "Bulky Attacker", + "movepool": ["Liquidation", "Recover", "Spiky Shield", "Toxic"], + "teraTypes": ["Electric", "Ground"] + } + ] + }, + "equilibra": { + "level": 84, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Doom Desire", "Earth Power", "Flash Cannon", "Pain Split", "Rapid Spin"], + "teraTypes": ["Electric", "Steel", "Water"] + } + ] + }, + "astrolotl": { + "level": 79, + "sets": [ + { + "role": "Fast Support", + "movepool": ["Defog", "Draco Meteor", "Encore", "Fire Lash", "Spikes", "Thunder Wave", "Will-O-Wisp"], + "teraTypes": ["Steel", "Water"] + } + ] + }, + "miasmaw": { + "level": 80, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Earthquake", "Megahorn", "Scale Shot", "Swords Dance"], + "teraTypes": ["Dragon", "Steel"] + }, + { + "role": "Fast Bulky Setup", + "movepool": ["Close Combat", "Earthquake", "Gunk Shot", "Scale Shot", "Swords Dance"], + "teraTypes": ["Poison"] + }, + { + "role": "Fast Attacker", + "movepool": ["Dragon Rush", "Earthquake", "First Impression", "U-turn"], + "teraTypes": ["Bug", "Steel"] + } + ] + }, + "chromera": { + "level": 84, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["Boomburst", "Dark Pulse", "Recover", "Switcheroo", "Thunderbolt", "Toxic Spikes"], + "teraTypes": ["Normal"] + }, + { + "role": "Bulky Setup", + "movepool": ["Boomburst", "Calm Mind", "Dark Pulse", "Recover"], + "teraTypes": ["Normal"] + } + ] + }, + "venomicon": { + "level": 82, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Air Slash", "Body Press", "Hurricane", "Roost", "Sludge Bomb"], + "teraTypes": ["Fighting"] + }, + { + "role": "Bulky Support", + "movepool": ["Air Slash", "Body Press", "Hurricane", "Knock Off", "Roost"], + "teraTypes": ["Fighting"] + } + ] + }, + "venomiconepilogue": { + "level": 82, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Brave Bird", "Coil", "Gunk Shot", "Roost", "Stealth Rock", "Toxic Spikes"], + "teraTypes": ["Dark", "Flying", "Poison"] + } + ] + }, + "saharaja": { + "level": 80, + "sets": [ + { + "role": "AV Pivot", + "movepool": ["Body Press", "Diamond Storm", "Earthquake", "Rapid Spin"], + "teraTypes": ["Fighting"] + }, + { + "role": "Bulky Attacker", + "movepool": ["Body Press", "Diamond Storm", "Earthquake", "Pain Split"], + "teraTypes": ["Fighting"] + }, + { + "role": "Setup Sweeper", + "movepool": ["Diamond Storm", "Earthquake", "Pain Split", "Swords Dance"], + "teraTypes": ["Rock", "Steel"] + } + ] + }, + "hemogoblin": { + "level": 77, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Bulk Up", "Extreme Speed", "Flare Blitz", "Moonlight"], + "teraTypes": ["Fairy", "Water"] + }, + { + "role": "Wallbreaker", + "movepool": ["Explosion", "Extreme Speed", "Overheat", "Spikes", "Will-O-Wisp"], + "teraTypes": ["Fairy", "Water"] + } + ] + }, + "cresceidon": { + "level": 82, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Encore", "Moonblast", "Recover", "Scald", "Thunder Wave"], + "teraTypes": ["Steel"] + } + ] + }, + "chuggalong": { + "level": 78, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Clanging Scales", "Clangorous Soul", "Flamethrower", "Sludge Wave", "Surf"], + "teraTypes": ["Fire", "Water"] + } + ] + } +} diff --git a/data/random-battles/gen9cap/teams.ts b/data/random-battles/gen9cap/teams.ts new file mode 100644 index 000000000000..8df76fdda46e --- /dev/null +++ b/data/random-battles/gen9cap/teams.ts @@ -0,0 +1,385 @@ +import {RandomTeams, MoveCounter} from "../gen9/teams"; + +/** Pokemon who should never be in the lead slot */ +const NO_LEAD_POKEMON = [ + 'Zacian', 'Zamazenta', +]; + +export class RandomCAPTeams extends RandomTeams { + getCAPAbility( + types: string[], + moves: Set, + abilities: Set, + counter: MoveCounter, + teamDetails: RandomTeamsTypes.TeamDetails, + species: Species, + isLead: boolean, + teraType: string, + role: RandomTeamsTypes.Role, + ): string { + // Hard-code abilities here + if (species.id === 'volkraken') return 'Analytic'; + if (species.id === 'syclant') return 'Compound Eyes'; + if (species.id === 'caribolt') return 'Galvanize'; + if (species.id === 'equilibra') return 'Levitate'; + if (species.id === 'kerfluffle') return 'Natural Cure'; + if (species.id === 'fidgit') return moves.has('tailwind') ? 'Persistent' : 'Frisk'; + if (species.id === 'hemogoblin') return 'Pixilate'; + if (species.id === 'tomohawk') return 'Prankster'; + if (species.id === 'saharaja' && moves.has('bodypress')) return 'Serene Grace'; + if (species.id === 'cawmodore') return 'Volt Absorb'; + // Default to regular ability selection + return this.getAbility(types, moves, abilities, counter, teamDetails, species, isLead, false, teraType, role); + } + + getCAPPriorityItem( + ability: string, + types: string[], + moves: Set, + counter: MoveCounter, + teamDetails: RandomTeamsTypes.TeamDetails, + species: Species, + isLead: boolean, + teraType: string, + role: RandomTeamsTypes.Role, + ) { + // Placeholder in case we need to hardcode items for CAP mons. + } + + getLevel( + species: Species, + isDoubles: boolean, + ): number { + if (this.adjustLevel) return this.adjustLevel; + return (species.num > 0 ? this.randomSets[species.id]["level"] : this.randomCAPSets[species.id]["level"]) || 80; + } + + randomCAPSet( + s: string | Species, + teamDetails: RandomTeamsTypes.TeamDetails = {}, + isLead = false, + isDoubles = false + ): RandomTeamsTypes.RandomSet { + const species = this.dex.species.get(s); + // Generate Non-CAP Pokemon using the regular randomSet() method + if (species.num > 0) return this.randomSet(s, teamDetails, isLead, isDoubles); + const forme = this.getForme(species); + const sets = this.randomCAPSets[species.id]["sets"]; + const possibleSets = []; + + const ruleTable = this.dex.formats.getRuleTable(this.format); + + for (const set of sets) { + // Prevent Fast Bulky Setup on lead Paradox Pokemon, since it generates Booster Energy. + const abilities = new Set(Object.values(species.abilities)); + if (isLead && (abilities.has('Protosynthesis') || abilities.has('Quark Drive')) && set.role === 'Fast Bulky Setup') { + continue; + } + // Prevent Tera Blast user if the team already has one, or if Terastallizion is prevented. + if ((teamDetails.teraBlast || ruleTable.has('terastalclause')) && set.role === 'Tera Blast user') { + continue; + } + possibleSets.push(set); + } + const set = this.sampleIfArray(possibleSets); + const role = set.role; + const movePool: string[] = []; + for (const movename of set.movepool) { + movePool.push(this.dex.moves.get(movename).id); + } + const teraTypes = set.teraTypes; + let teraType = this.sampleIfArray(teraTypes); + + let ability = ''; + let item = undefined; + + const evs = {hp: 85, atk: 85, def: 85, spa: 85, spd: 85, spe: 85}; + const ivs = {hp: 31, atk: 31, def: 31, spa: 31, spd: 31, spe: 31}; + + const types = species.types; + const abilities = new Set(Object.values(species.abilities)); + if (species.unreleasedHidden) abilities.delete(species.abilities.H); + + // Get moves + const moves = this.randomMoveset(types, abilities, teamDetails, species, isLead, isDoubles, movePool, teraType!, role); + const counter = this.queryMoves(moves, species, teraType!, abilities); + + // Get ability + ability = this.getCAPAbility(types, moves, abilities, counter, teamDetails, species, isLead, teraType!, role); + + // Get items + // First, the priority items + item = this.getCAPPriorityItem(ability, types, moves, counter, teamDetails, species, isLead, teraType!, role); + if (item === undefined) { + item = this.getPriorityItem(ability, types, moves, counter, teamDetails, species, isLead, isDoubles, teraType!, role); + } + if (item === undefined) { + item = this.getItem(ability, types, moves, counter, teamDetails, species, isLead, teraType!, role); + } + + // Get level + const level = this.getLevel(species, isDoubles); + + // Prepare optimal HP + const srImmunity = ability === 'Magic Guard' || item === 'Heavy-Duty Boots'; + let srWeakness = srImmunity ? 0 : this.dex.getEffectiveness('Rock', species); + // Crash damage move users want an odd HP to survive two misses + if (['axekick', 'highjumpkick', 'jumpkick'].some(m => moves.has(m))) srWeakness = 2; + while (evs.hp > 1) { + const hp = Math.floor(Math.floor(2 * species.baseStats.hp + ivs.hp + Math.floor(evs.hp / 4) + 100) * level / 100 + 10); + if ((moves.has('substitute') && ['Sitrus Berry', 'Salac Berry'].includes(item))) { + // Two Substitutes should activate Sitrus Berry + if (hp % 4 === 0) break; + } else if ((moves.has('bellydrum') || moves.has('filletaway')) && (item === 'Sitrus Berry' || ability === 'Gluttony')) { + // Belly Drum should activate Sitrus Berry + if (hp % 2 === 0) break; + } else if (moves.has('substitute') && moves.has('endeavor')) { + // Luvdisc should be able to Substitute down to very low HP + if (hp % 4 > 0) break; + } else { + // Maximize number of Stealth Rock switch-ins + if (srWeakness <= 0 || ability === 'Regenerator' || ['Leftovers', 'Life Orb'].includes(item)) break; + if (item !== 'Sitrus Berry' && hp % (4 / srWeakness) > 0) break; + // Minimise number of Stealth Rock switch-ins to activate Sitrus Berry + if (item === 'Sitrus Berry' && hp % (4 / srWeakness) === 0) break; + } + evs.hp -= 4; + } + + // Minimize confusion damage + const noAttackStatMoves = [...moves].every(m => { + const move = this.dex.moves.get(m); + if (move.damageCallback || move.damage) return true; + if (move.id === 'shellsidearm') return false; + // Magearna and doubles Dragonite, though these can work well as a general rule + if (move.id === 'terablast' && ( + species.id === 'porygon2' || moves.has('shiftgear') || species.baseStats.atk > species.baseStats.spa) + ) return false; + return move.category !== 'Physical' || move.id === 'bodypress' || move.id === 'foulplay'; + }); + if (noAttackStatMoves && !moves.has('transform') && this.format.mod !== 'partnersincrime') { + evs.atk = 0; + ivs.atk = 0; + } + + if (moves.has('gyroball') || moves.has('trickroom')) { + evs.spe = 0; + ivs.spe = 0; + } + + // Enforce Tera Type after all set generation is done to prevent infinite generation + if (this.forceTeraType) teraType = this.forceTeraType; + + // shuffle moves to add more randomness to camomons + const shuffledMoves = Array.from(moves); + this.prng.shuffle(shuffledMoves); + return { + name: species.baseSpecies, + species: forme, + gender: species.baseSpecies === 'Greninja' ? 'M' : species.gender, + shiny: this.randomChance(1, 1024), + level, + moves: shuffledMoves, + ability, + evs, + ivs, + item, + teraType, + role, + }; + } + + randomCAPSets: {[species: string]: RandomTeamsTypes.RandomSpeciesData} = require('./sets.json'); + + randomTeam() { + this.enforceNoDirectCustomBanlistChanges(); + + const seed = this.prng.seed; + const ruleTable = this.dex.formats.getRuleTable(this.format); + const pokemon: RandomTeamsTypes.RandomSet[] = []; + + // For Monotype + const isMonotype = !!this.forceMonotype || ruleTable.has('sametypeclause'); + const isDoubles = false; + const typePool = this.dex.types.names().filter(name => name !== "Stellar"); + const type = this.forceMonotype || this.sample(typePool); + + const baseFormes: {[k: string]: number} = {}; + + const typeCount: {[k: string]: number} = {}; + const typeComboCount: {[k: string]: number} = {}; + const typeWeaknesses: {[k: string]: number} = {}; + const typeDoubleWeaknesses: {[k: string]: number} = {}; + const teamDetails: RandomTeamsTypes.TeamDetails = {}; + let numMaxLevelPokemon = 0; + + const pokemonList = Object.keys(this.randomSets); + const capPokemonList = Object.keys(this.randomCAPSets); + + const [pokemonPool, baseSpeciesPool] = this.getPokemonPool(type, pokemon, isMonotype, pokemonList); + const [capPokemonPool, capBaseSpeciesPool] = this.getPokemonPool(type, pokemon, isMonotype, capPokemonList); + + let leadsRemaining = 1; + while (baseSpeciesPool.length && pokemon.length < this.maxTeamSize) { + let baseSpecies, species; + // Always generate a CAP Pokemon in slot 2; other slots can randomly generate CAP Pokemon. + if ((pokemon.length === 1 || this.randomChance(1, 5)) && capBaseSpeciesPool.length) { + baseSpecies = this.sampleNoReplace(capBaseSpeciesPool); + species = this.dex.species.get(this.sample(capPokemonPool[baseSpecies])); + } else { + baseSpecies = this.sampleNoReplace(baseSpeciesPool); + species = this.dex.species.get(this.sample(pokemonPool[baseSpecies])); + } + if (!species.exists) continue; + + // Limit to one of each species (Species Clause) + if (baseFormes[species.baseSpecies]) continue; + + // Treat Ogerpon formes and Terapagos like the Tera Blast user role; reject if team has one already + if ((species.baseSpecies === 'Ogerpon' || species.baseSpecies === 'Terapagos') && teamDetails.teraBlast) continue; + + // Illusion shouldn't be on the last slot + if (species.baseSpecies === 'Zoroark' && pokemon.length >= (this.maxTeamSize - 1)) continue; + + const types = species.types; + const typeCombo = types.slice().sort().join(); + const weakToFreezeDry = ( + this.dex.getEffectiveness('Ice', species) > 0 || + (this.dex.getEffectiveness('Ice', species) > -2 && types.includes('Water')) + ); + // Dynamically scale limits for different team sizes. The default and minimum value is 1. + const limitFactor = Math.round(this.maxTeamSize / 6) || 1; + + if (!isMonotype && !this.forceMonotype) { + let skip = false; + + // Limit two of any type + for (const typeName of types) { + if (typeCount[typeName] >= 2 * limitFactor) { + skip = true; + break; + } + } + if (skip) continue; + + // Limit three weak to any type, and one double weak to any type + for (const typeName of this.dex.types.names()) { + // it's weak to the type + if (this.dex.getEffectiveness(typeName, species) > 0) { + if (!typeWeaknesses[typeName]) typeWeaknesses[typeName] = 0; + if (typeWeaknesses[typeName] >= 3 * limitFactor) { + skip = true; + break; + } + } + if (this.dex.getEffectiveness(typeName, species) > 1) { + if (!typeDoubleWeaknesses[typeName]) typeDoubleWeaknesses[typeName] = 0; + if (typeDoubleWeaknesses[typeName] >= 1 * limitFactor) { + skip = true; + break; + } + } + } + if (skip) continue; + + // Limit four weak to Freeze-Dry + if (weakToFreezeDry) { + if (!typeWeaknesses['Freeze-Dry']) typeWeaknesses['Freeze-Dry'] = 0; + if (typeWeaknesses['Freeze-Dry'] >= 4 * limitFactor) continue; + } + + // Limit one level 100 Pokemon + if (!this.adjustLevel && (this.getLevel(species, isDoubles) === 100) && numMaxLevelPokemon >= limitFactor) { + continue; + } + } + + // Limit three of any type combination in Monotype + if (!this.forceMonotype && isMonotype && (typeComboCount[typeCombo] >= 3 * limitFactor)) continue; + + let set: RandomTeamsTypes.RandomSet; + + if (leadsRemaining) { + if (NO_LEAD_POKEMON.includes(species.baseSpecies)) { + if (pokemon.length + leadsRemaining === this.maxTeamSize) continue; + set = this.randomCAPSet(species, teamDetails, false, isDoubles); + pokemon.push(set); + } else { + set = this.randomCAPSet(species, teamDetails, true, isDoubles); + pokemon.unshift(set); + leadsRemaining--; + } + } else { + set = this.randomCAPSet(species, teamDetails, false, isDoubles); + pokemon.push(set); + } + + // Don't bother tracking details for the last Pokemon + if (pokemon.length === this.maxTeamSize) break; + + // Now that our Pokemon has passed all checks, we can increment our counters + baseFormes[species.baseSpecies] = 1; + + // Increment type counters + for (const typeName of types) { + if (typeName in typeCount) { + typeCount[typeName]++; + } else { + typeCount[typeName] = 1; + } + } + if (typeCombo in typeComboCount) { + typeComboCount[typeCombo]++; + } else { + typeComboCount[typeCombo] = 1; + } + + // Increment weakness counter + for (const typeName of this.dex.types.names()) { + // it's weak to the type + if (this.dex.getEffectiveness(typeName, species) > 0) { + typeWeaknesses[typeName]++; + } + if (this.dex.getEffectiveness(typeName, species) > 1) { + typeDoubleWeaknesses[typeName]++; + } + } + if (weakToFreezeDry) typeWeaknesses['Freeze-Dry']++; + + // Increment level 100 counter + if (set.level === 100) numMaxLevelPokemon++; + + // Track what the team has + if (set.ability === 'Drizzle' || set.moves.includes('raindance')) teamDetails.rain = 1; + if (set.ability === 'Drought' || set.ability === 'Orichalcum Pulse' || set.moves.includes('sunnyday')) { + teamDetails.sun = 1; + } + if (set.ability === 'Sand Stream') teamDetails.sand = 1; + if (set.ability === 'Snow Warning' || set.moves.includes('snowscape') || set.moves.includes('chillyreception')) { + teamDetails.snow = 1; + } + if (set.moves.includes('healbell')) teamDetails.statusCure = 1; + if (set.moves.includes('spikes') || set.moves.includes('ceaselessedge')) { + teamDetails.spikes = (teamDetails.spikes || 0) + 1; + } + if (set.moves.includes('toxicspikes') || set.ability === 'Toxic Debris') teamDetails.toxicSpikes = 1; + if (set.moves.includes('stealthrock') || set.moves.includes('stoneaxe')) teamDetails.stealthRock = 1; + if (set.moves.includes('stickyweb')) teamDetails.stickyWeb = 1; + if (set.moves.includes('defog')) teamDetails.defog = 1; + if (set.moves.includes('rapidspin') || set.moves.includes('mortalspin')) teamDetails.rapidSpin = 1; + if (set.moves.includes('auroraveil') || (set.moves.includes('reflect') && set.moves.includes('lightscreen'))) { + teamDetails.screens = 1; + } + if (set.role === 'Tera Blast user' || species.baseSpecies === "Ogerpon" || species.baseSpecies === "Terapagos") { + teamDetails.teraBlast = 1; + } + } + if (pokemon.length < this.maxTeamSize && pokemon.length < 12) { // large teams sometimes cannot be built + throw new Error(`Could not build a random team for ${this.format} (seed=${seed})`); + } + + return pokemon; + } +} + +export default RandomCAPTeams; diff --git a/sim/teams.ts b/sim/teams.ts index 323c7879e788..0b39a6f67108 100644 --- a/sim/teams.ts +++ b/sim/teams.ts @@ -624,6 +624,8 @@ export const Teams = new class Teams { TeamGenerator = require(`../data/mods/gen9ssb/random-teams`).default; } else if (toID(format).includes('gen9babyrandombattle')) { TeamGenerator = require(`../data/random-battles/gen9baby/teams`).default; + } else if (toID(format).includes('gen9caprandombattle')) { + TeamGenerator = require(`../data/random-battles/gen9cap/teams`).default; } else { TeamGenerator = require(`../data/random-battles/${format.mod}/teams`).default; } diff --git a/test/random-battles/all-gens.js b/test/random-battles/all-gens.js index 5286ef42ad17..b9a4526a3437 100644 --- a/test/random-battles/all-gens.js +++ b/test/random-battles/all-gens.js @@ -152,6 +152,10 @@ describe("New set format (slow)", () => { filename: "gen9baby/sets", roles: ["Fast Attacker", "Setup Sweeper", "Wallbreaker", "Tera Blast user", "Bulky Attacker", "Bulky Setup", "Bulky Support", "Fast Support"], }, + "gen9caprandombattle": { + filename: "gen9cap/sets", + roles: ["Fast Attacker", "Setup Sweeper", "Wallbreaker", "Tera Blast user", "Bulky Attacker", "Bulky Setup", "Fast Bulky Setup", "Bulky Support", "Fast Support", "AV Pivot"], + }, }; for (const format of Object.keys(formatInfo)) { const filename = formatInfo[format].filename; From ef640e9f8c425c3a9c68fd38a08698ce3615e160 Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Mon, 1 Jul 2024 10:52:09 -0600 Subject: [PATCH 096/139] Fix RBY ZU ladder --- config/formats.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/formats.ts b/config/formats.ts index 9e828f744cfe..6bbf59aa99cc 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -3181,7 +3181,7 @@ export const Formats: FormatList = [ ], mod: 'gen1', - searchShow: false, + // searchShow: false, ruleset: ['[Gen 1] PU'], banlist: ['PU', 'ZUBL'], }, From 26771249c35d7a4b83b8b432d5cb35999166eb23 Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Mon, 1 Jul 2024 10:55:30 -0600 Subject: [PATCH 097/139] Add GSC ZU challenge format --- config/formats.ts | 9 +++++++++ data/mods/gen2/formats-data.ts | 28 ++++++++++++++-------------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/config/formats.ts b/config/formats.ts index 6bbf59aa99cc..b89177a50478 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -4820,6 +4820,15 @@ export const Formats: FormatList = [ banlist: ['NU', 'PUBL'], unbanlist: ['Swagger'], }, + { + name: "[Gen 2] ZU", + threads: [`• GSC ZU`], + + mod: 'gen2', + searchShow: false, + ruleset: ['[Gen 2] PU'], + banlist: ['PU', 'ZUBL'], + }, { name: "[Gen 2] 1v1", threads: [`• GSC 1v1`], diff --git a/data/mods/gen2/formats-data.ts b/data/mods/gen2/formats-data.ts index c914865d28ad..8d1073952089 100644 --- a/data/mods/gen2/formats-data.ts +++ b/data/mods/gen2/formats-data.ts @@ -12,7 +12,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { tier: "LC", }, charmeleon: { - tier: "PU", + tier: "ZU", }, charizard: { tier: "UUBL", @@ -21,7 +21,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { tier: "LC", }, wartortle: { - tier: "ZUBL", + tier: "ZU", }, blastoise: { tier: "UU", @@ -42,7 +42,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { tier: "NFE", }, beedrill: { - tier: "PU", + tier: "ZU", }, pidgey: { tier: "LC", @@ -192,10 +192,10 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { tier: "UU", }, poliwag: { - tier: "ZUBL", + tier: "ZU", }, poliwhirl: { - tier: "PU", + tier: "ZUBL", }, poliwrath: { tier: "NUBL", @@ -237,7 +237,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { tier: "UUBL", }, geodude: { - tier: "PU", + tier: "ZU", }, graveler: { tier: "NU", @@ -252,7 +252,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { tier: "NU", }, slowpoke: { - tier: "PU", + tier: "ZU", }, slowbro: { tier: "UU", @@ -321,7 +321,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { tier: "NU", }, voltorb: { - tier: "PU", + tier: "ZU", }, electrode: { tier: "UU", @@ -393,7 +393,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { tier: "PU", }, staryu: { - tier: "PU", + tier: "ZU", }, starmie: { tier: "OU", @@ -444,7 +444,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { tier: "ZU", }, eevee: { - tier: "PU", + tier: "ZU", }, vaporeon: { tier: "OU", @@ -468,7 +468,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { tier: "UUBL", }, omanyte: { - tier: "PU", + tier: "ZU", }, omastar: { tier: "UU", @@ -522,7 +522,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { tier: "LC", }, quilava: { - tier: "ZUBL", + tier: "ZU", }, typhlosion: { tier: "UUBL", @@ -606,7 +606,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { tier: "UU", }, aipom: { - tier: "PU", + tier: "ZU", }, sunkern: { tier: "LC", @@ -699,7 +699,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { tier: "PU", }, mantine: { - tier: "PU", + tier: "ZU", }, skarmory: { tier: "OU", From 19f1dcf84bcfe44a671a5b547b28ebd99bf8e528 Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Mon, 1 Jul 2024 12:10:15 -0600 Subject: [PATCH 098/139] Formats: Fix line spacing for CAP Random Battle --- config/formats.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/formats.ts b/config/formats.ts index b89177a50478..f9aed7c7a86e 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -2501,9 +2501,9 @@ export const Formats: FormatList = [ { name: "[Gen 9] CAP Random Battle", desc: "[Gen 9] Random Battle with CAP Pokémon included. Every team will generate with at least one CAP Pokémon.", + mod: 'gen9', team: 'random', - ruleset: ['[Gen 9] Random Battle'], }, From 834b4ba8bc9486a115095205c86593dac1858bf9 Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Mon, 1 Jul 2024 12:21:52 -0600 Subject: [PATCH 099/139] Fix `/randbats` for CAP Pokemon --- server/chat-plugins/randombattles/index.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/server/chat-plugins/randombattles/index.ts b/server/chat-plugins/randombattles/index.ts index 9f9e5d9c636a..ffe80a497a64 100644 --- a/server/chat-plugins/randombattles/index.ts +++ b/server/chat-plugins/randombattles/index.ts @@ -160,9 +160,11 @@ function getSets(species: string | Species, format: string | Format = 'gen9rando format = Dex.formats.get(format); species = dex.species.get(species); const isDoubles = format.gameType === 'doubles'; - const isBaby = format.team === 'randomBaby'; + let folderName = format.mod; + if (format.team === 'randomBaby') folderName += 'baby'; + if (species.isNonstandard === 'CAP') folderName += 'cap'; const setsFile = JSON.parse( - FS(`data/random-battles/${format.mod}${isBaby ? 'baby' : ''}/${isDoubles ? 'doubles-' : ''}sets.json`) + FS(`data/random-battles/${folderName}/${isDoubles ? 'doubles-' : ''}sets.json`) .readIfExistsSync() || '{}' ); const data = setsFile[species.id]; From 812f656ac75052d7371d5d3fe00c33e7a996d34a Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Mon, 1 Jul 2024 12:23:44 -0600 Subject: [PATCH 100/139] Update various instances of old author names --- README.md | 2 +- server/chat-commands/info.ts | 4 ++-- server/chat-plugins/othermetas.ts | 2 +- server/chat-plugins/randombattles/index.ts | 2 +- server/chat-plugins/the-studio.ts | 4 ++-- server/chat-plugins/wifi.tsx | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index f6d12202cbe4..5696798b1d2e 100644 --- a/README.md +++ b/README.md @@ -89,7 +89,7 @@ Staff - Andrew Werner [HoeenHero] - Development - Annika L. [Annika] - Development - Chris Monsanto [chaos] - Development, Sysadmin -- Kris Johnson [Kris] - Development +- Kris Johnson [dhelmise] - Development - Leonard Craft III [DaWoblefet] - Research (game mechanics) - Mathieu Dias-Martins [Marty-D] - Research (game mechanics), Development - Mia A [Mia] - Development diff --git a/server/chat-commands/info.ts b/server/chat-commands/info.ts index 5b312305a767..e7ca0c88790d 100644 --- a/server/chat-commands/info.ts +++ b/server/chat-commands/info.ts @@ -1790,7 +1790,7 @@ export const commands: Chat.ChatCommands = { if (RANDOMS_CALC_COMMANDS.includes(cmd) || (isRandomBattle && !DEFAULT_CALC_COMMANDS.includes(cmd) && !BATTLESPOT_CALC_COMMANDS.includes(cmd))) { return this.sendReplyBox( - `Random Battles damage calculator. (Courtesy of Austin)
      ` + + `Random Battles damage calculator. (Courtesy of dhelmise & jetou)
      ` + `- Random Battles Damage Calculator` ); } @@ -1801,7 +1801,7 @@ export const commands: Chat.ChatCommands = { ); } this.sendReplyBox( - `Pokémon Showdown! damage calculator. (Courtesy of Honko, Austin, & Kris)
      ` + + `Pokémon Showdown! damage calculator. (Courtesy of Honko, Austin, dhelmise, & jetou)
      ` + `- Damage Calculator` ); }, diff --git a/server/chat-plugins/othermetas.ts b/server/chat-plugins/othermetas.ts index 7a4905469ace..3878a8b8a049 100644 --- a/server/chat-plugins/othermetas.ts +++ b/server/chat-plugins/othermetas.ts @@ -2,7 +2,7 @@ * Other Metagames chat plugin * Lets users see elements of Pokemon in various Other Metagames. * Originally by Spandan. - * @author Kris + * @author dhelmise */ import {Utils} from '../../lib'; diff --git a/server/chat-plugins/randombattles/index.ts b/server/chat-plugins/randombattles/index.ts index ffe80a497a64..580b22f2baae 100644 --- a/server/chat-plugins/randombattles/index.ts +++ b/server/chat-plugins/randombattles/index.ts @@ -1,6 +1,6 @@ /** * Random Battles chat-plugin - * Written by Kris with inspiration from sirDonovan and The Immortal + * Written by dhelmise with inspiration from sirDonovan and The Immortal * * Set probability code written by Annika */ diff --git a/server/chat-plugins/the-studio.ts b/server/chat-plugins/the-studio.ts index aeb7e8b6e71a..604eeb722d20 100644 --- a/server/chat-plugins/the-studio.ts +++ b/server/chat-plugins/the-studio.ts @@ -2,8 +2,8 @@ * The Studio room chat-plugin. * Supports scrobbling and searching for music from last.fm. * Also supports storing and suggesting recommendations. - * Written by Kris, loosely based on the concept from bumbadadabum. - * @author Kris + * Written by dhelmise, loosely based on the concept from bumbadadabum. + * @author dhelmise */ import {FS, Net, Utils} from '../../lib'; diff --git a/server/chat-plugins/wifi.tsx b/server/chat-plugins/wifi.tsx index 40d6fd63431b..2d956e93c884 100644 --- a/server/chat-plugins/wifi.tsx +++ b/server/chat-plugins/wifi.tsx @@ -1,7 +1,7 @@ /** * Wi-Fi chat-plugin. Only works in a room with id 'wifi' * Handles giveaways in the formats: question, lottery, gts - * Written by Kris and bumbadadabum, based on the original plugin as written by Codelegend, SilverTactic, DanielCranham + * Written by dhelmise and bumbadadabum, based on the original plugin as written by Codelegend, SilverTactic, DanielCranham */ import {FS, Utils} from '../../lib'; @@ -1024,7 +1024,7 @@ export const commands: Chat.ChatCommands = { }, }, gtshelp: [ - `GTS giveaways are currently disabled. If you are a Room Owner and would like them to be re-enabled, contact Kris.`, + `GTS giveaways are currently disabled. If you are a Room Owner and would like them to be re-enabled, contact dhelmise.`, ], ga: 'giveaway', giveaway: { From 7bd9326193a997a7210f6dc79e0b20753b32b671 Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Mon, 1 Jul 2024 13:13:59 -0600 Subject: [PATCH 101/139] Appease linter --- server/chat-plugins/wifi.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/chat-plugins/wifi.tsx b/server/chat-plugins/wifi.tsx index 2d956e93c884..56a85901cbb3 100644 --- a/server/chat-plugins/wifi.tsx +++ b/server/chat-plugins/wifi.tsx @@ -1,7 +1,8 @@ /** * Wi-Fi chat-plugin. Only works in a room with id 'wifi' * Handles giveaways in the formats: question, lottery, gts - * Written by dhelmise and bumbadadabum, based on the original plugin as written by Codelegend, SilverTactic, DanielCranham + * Written by dhelmise and bumbadadabum, based on the original + * plugin as written by Codelegend, SilverTactic, DanielCranham */ import {FS, Utils} from '../../lib'; From 88be8d7b3cf6a86f87416cb710e5d93ae184a2ab Mon Sep 17 00:00:00 2001 From: Guangcong Luo Date: Mon, 1 Jul 2024 15:57:14 -0700 Subject: [PATCH 102/139] Refactor types for Lowercase (#10377) TypeScript 4.8+ supports Lowercase for lowercase strings, which isn't exactly what ID is, but can be used to type IDs in object keys and data entries that previously required string. I'm calling it IDEntry in places where it should be an ID but TypeScript doesn't support that. Very conveniently, no additional casts will be needed when using ID where IDEntry is expected. It's caught at least a few bugs, which is also why I'm PRing: I didn't write the code for the bugs it found, and don't know if it's the right way to fix them. This ballooned into several other type refactors. --- config/formats.ts | 2 +- data/abilities.ts | 2 +- data/aliases.ts | 2 +- data/cg-team-data.ts | 8 +- data/cg-teams.ts | 10 +- data/conditions.ts | 2 +- data/formats-data.ts | 2 +- data/items.ts | 2 +- data/learnsets.ts | 2 +- data/mods/fullpotential/abilities.ts | 2 +- data/mods/gen1/conditions.ts | 2 +- data/mods/gen1/formats-data.ts | 2 +- data/mods/gen1/moves.ts | 2 +- data/mods/gen1/pokedex.ts | 2 +- data/mods/gen1/rulesets.ts | 2 +- data/mods/gen1/typechart.ts | 2 +- data/mods/gen1jpn/conditions.ts | 2 +- data/mods/gen1jpn/moves.ts | 2 +- data/mods/gen1jpn/rulesets.ts | 2 +- data/mods/gen1stadium/conditions.ts | 2 +- data/mods/gen1stadium/formats-data.ts | 2 +- data/mods/gen1stadium/moves.ts | 2 +- data/mods/gen1stadium/rulesets.ts | 2 +- data/mods/gen2/conditions.ts | 2 +- data/mods/gen2/formats-data.ts | 2 +- data/mods/gen2/items.ts | 2 +- data/mods/gen2/learnsets.ts | 2 +- data/mods/gen2/moves.ts | 2 +- data/mods/gen2/pokedex.ts | 2 +- data/mods/gen2/rulesets.ts | 2 +- data/mods/gen2/typechart.ts | 2 +- data/mods/gen2stadium2/conditions.ts | 2 +- data/mods/gen2stadium2/items.ts | 2 +- data/mods/gen2stadium2/moves.ts | 2 +- data/mods/gen2stadium2/rulesets.ts | 2 +- data/mods/gen3/abilities.ts | 2 +- data/mods/gen3/conditions.ts | 2 +- data/mods/gen3/formats-data.ts | 2 +- data/mods/gen3/items.ts | 2 +- data/mods/gen3/moves.ts | 2 +- data/mods/gen3/rulesets.ts | 2 +- data/mods/gen4/abilities.ts | 2 +- data/mods/gen4/conditions.ts | 2 +- data/mods/gen4/formats-data.ts | 2 +- data/mods/gen4/items.ts | 2 +- data/mods/gen4/moves.ts | 2 +- data/mods/gen4/pokedex.ts | 2 +- data/mods/gen4/rulesets.ts | 2 +- data/mods/gen4pt/formats-data.ts | 2 +- data/mods/gen4pt/learnsets.ts | 2 +- data/mods/gen5/abilities.ts | 2 +- data/mods/gen5/conditions.ts | 2 +- data/mods/gen5/formats-data.ts | 2 +- data/mods/gen5/items.ts | 2 +- data/mods/gen5/moves.ts | 2 +- data/mods/gen5/pokedex.ts | 2 +- data/mods/gen5/rulesets.ts | 2 +- data/mods/gen5/typechart.ts | 2 +- data/mods/gen5bw1/formats-data.ts | 2 +- data/mods/gen5bw1/items.ts | 2 +- data/mods/gen5bw1/learnsets.ts | 2 +- data/mods/gen5bw1/pokedex.ts | 2 +- data/mods/gen6/abilities.ts | 2 +- data/mods/gen6/conditions.ts | 2 +- data/mods/gen6/formats-data.ts | 2 +- data/mods/gen6/items.ts | 2 +- data/mods/gen6/learnsets.ts | 2 +- data/mods/gen6/moves.ts | 2 +- data/mods/gen6/pokedex.ts | 2 +- data/mods/gen6/typechart.ts | 2 +- data/mods/gen6xy/formats-data.ts | 2 +- data/mods/gen6xy/items.ts | 2 +- data/mods/gen6xy/learnsets.ts | 2 +- data/mods/gen6xy/moves.ts | 2 +- data/mods/gen6xy/pokedex.ts | 2 +- data/mods/gen7/abilities.ts | 2 +- data/mods/gen7/formats-data.ts | 2 +- data/mods/gen7/items.ts | 2 +- data/mods/gen7/moves.ts | 2 +- data/mods/gen7/pokedex.ts | 2 +- data/mods/gen7/rulesets.ts | 2 +- data/mods/gen7letsgo/formats-data.ts | 2 +- data/mods/gen7letsgo/learnsets.ts | 2 +- data/mods/gen7letsgo/moves.ts | 2 +- data/mods/gen7letsgo/pokedex.ts | 2 +- data/mods/gen7pokebilities/abilities.ts | 2 +- data/mods/gen7pokebilities/moves.ts | 2 +- data/mods/gen7sm/formats-data.ts | 2 +- data/mods/gen7sm/items.ts | 2 +- data/mods/gen7sm/learnsets.ts | 2 +- data/mods/gen7sm/moves.ts | 2 +- data/mods/gen7sm/pokedex.ts | 2 +- data/mods/gen8/abilities.ts | 2 +- data/mods/gen8/formats-data.ts | 2 +- data/mods/gen8/items.ts | 2 +- data/mods/gen8/learnsets.ts | 2 +- data/mods/gen8/moves.ts | 2 +- data/mods/gen8/pokedex.ts | 2 +- data/mods/gen8/rulesets.ts | 2 +- data/mods/gen8/typechart.ts | 2 +- data/mods/gen8bdsp/abilities.ts | 2 +- data/mods/gen8bdsp/formats-data.ts | 2 +- data/mods/gen8bdsp/items.ts | 2 +- data/mods/gen8bdsp/learnsets.ts | 2 +- data/mods/gen8bdsp/moves.ts | 2 +- data/mods/gen8bdsp/pokedex.ts | 2 +- data/mods/gen8dlc1/abilities.ts | 2 +- data/mods/gen8dlc1/formats-data.ts | 2 +- data/mods/gen8dlc1/items.ts | 2 +- data/mods/gen8dlc1/learnsets.ts | 2 +- data/mods/gen8dlc1/moves.ts | 2 +- data/mods/gen8dlc1/pokedex.ts | 2 +- data/mods/gen8dlc1/rulesets.ts | 2 +- data/mods/gen8linked/conditions.ts | 2 +- data/mods/gen8linked/items.ts | 2 +- data/mods/gen8linked/moves.ts | 2 +- data/mods/gen9dlc1/abilities.ts | 2 +- data/mods/gen9dlc1/formats-data.ts | 2 +- data/mods/gen9dlc1/items.ts | 2 +- data/mods/gen9dlc1/learnsets.ts | 2 +- data/mods/gen9dlc1/moves.ts | 2 +- data/mods/gen9dlc1/pokedex.ts | 2 +- data/mods/gen9dlc1/typechart.ts | 2 +- data/mods/gen9predlc/abilities.ts | 2 +- data/mods/gen9predlc/formats-data.ts | 2 +- data/mods/gen9predlc/items.ts | 2 +- data/mods/gen9predlc/learnsets.ts | 2 +- data/mods/gen9predlc/moves.ts | 2 +- data/mods/gen9predlc/pokedex.ts | 2 +- data/mods/gen9ssb/abilities.ts | 2 +- data/mods/gen9ssb/conditions.ts | 3 +- data/mods/gen9ssb/items.ts | 2 +- data/mods/gen9ssb/moves.ts | 2 +- data/mods/gen9ssb/pokedex.ts | 2 +- data/mods/gen9ssb/rulesets.ts | 2 +- data/mods/gen9ssb/typechart.ts | 2 +- data/mods/gennext/abilities.ts | 2 +- data/mods/gennext/conditions.ts | 2 +- data/mods/gennext/formats-data.ts | 2 +- data/mods/gennext/items.ts | 2 +- data/mods/gennext/moves.ts | 2 +- data/mods/gennext/pokedex.ts | 2 +- data/mods/mixandmega/items.ts | 2 +- data/mods/moderngen2/formats-data.ts | 2 +- data/mods/moderngen2/learnsets.ts | 2732 +++++++++++------------ data/mods/moderngen2/pokedex.ts | 2 +- data/mods/moderngen2/rulesets.ts | 2 +- data/mods/partnersincrime/abilities.ts | 2 +- data/mods/partnersincrime/items.ts | 2 +- data/mods/partnersincrime/moves.ts | 2 +- data/mods/pokebilities/abilities.ts | 2 +- data/mods/pokebilities/moves.ts | 2 +- data/mods/sharedpower/abilities.ts | 2 +- data/mods/sharedpower/moves.ts | 2 +- data/mods/sharingiscaring/conditions.ts | 2 +- data/mods/sharingiscaring/items.ts | 2 +- data/mods/sharingiscaring/moves.ts | 2 +- data/mods/thecardgame/abilities.ts | 2 +- data/mods/thecardgame/conditions.ts | 2 +- data/mods/thecardgame/items.ts | 2 +- data/mods/thecardgame/moves.ts | 2 +- data/mods/thecardgame/typechart.ts | 2 +- data/moves.ts | 2 +- data/natures.ts | 2 +- data/pokedex.ts | 2 +- data/pokemongo.ts | 2 +- data/random-battles/gen1/teams.ts | 2 +- data/random-battles/gen2/teams.ts | 2 +- data/random-battles/gen8/teams.ts | 2 +- data/random-battles/gen9/teams.ts | 2 +- data/rulesets.ts | 2 +- data/tags.ts | 2 +- data/text/abilities.ts | 2 +- data/text/default.ts | 2 +- data/text/items.ts | 2 +- data/text/moves.ts | 2 +- data/text/pokedex.ts | 2 +- data/typechart.ts | 2 +- server/global-types.ts | 2 +- server/room-battle.ts | 1 + sim/battle-actions.ts | 2 +- sim/dex-abilities.ts | 4 +- sim/dex-conditions.ts | 2 + sim/dex-data.ts | 24 +- sim/dex-formats.ts | 22 +- sim/dex-items.ts | 5 +- sim/dex-moves.ts | 46 +- sim/dex-species.ts | 49 +- sim/dex.ts | 44 +- sim/global-types.ts | 139 +- sim/team-validator.ts | 11 +- 191 files changed, 1734 insertions(+), 1718 deletions(-) diff --git a/config/formats.ts b/config/formats.ts index f9aed7c7a86e..d88d06187159 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -17,7 +17,7 @@ New sections will be added to the bottom of the specified column. The column value will be ignored for repeat sections. */ -export const Formats: FormatList = [ +export const Formats: import('../sim/dex-formats').FormatList = [ // S/V Singles /////////////////////////////////////////////////////////////////// diff --git a/data/abilities.ts b/data/abilities.ts index 0d208495bbd4..9ce3a1a33ce5 100644 --- a/data/abilities.ts +++ b/data/abilities.ts @@ -32,7 +32,7 @@ Ratings and how they work: */ -export const Abilities: {[abilityid: string]: AbilityData} = { +export const Abilities: import('../sim/dex-abilities').AbilityDataTable = { noability: { isNonstandard: "Past", flags: {}, diff --git a/data/aliases.ts b/data/aliases.ts index ac70362aa652..0e33254ae42b 100644 --- a/data/aliases.ts +++ b/data/aliases.ts @@ -1,4 +1,4 @@ -export const Aliases: {[alias: string]: string} = { +export const Aliases: import('../sim/dex').AliasesTable = { // formats randbats: "[Gen 9] Random Battle", uber: "[Gen 9] Ubers", diff --git a/data/cg-team-data.ts b/data/cg-team-data.ts index 90dfde36fee4..72212de674d0 100644 --- a/data/cg-team-data.ts +++ b/data/cg-team-data.ts @@ -1,17 +1,17 @@ // Data for computer-generated teams -export const MOVE_PAIRINGS: {[moveID: string]: string} = { +export const MOVE_PAIRINGS: {[moveID: IDEntry]: IDEntry} = { rest: 'sleeptalk', sleeptalk: 'rest', }; // Bonuses to move ratings by ability -export const ABILITY_MOVE_BONUSES: {[abilityID: string]: {[moveID: string]: number}} = { +export const ABILITY_MOVE_BONUSES: {[abilityID: IDEntry]: {[moveID: IDEntry]: number}} = { drought: {sunnyday: 0.2, solarbeam: 2}, contrary: {terablast: 2}, }; // Bonuses to move ratings by move type -export const ABILITY_MOVE_TYPE_BONUSES: {[abilityID: string]: {[typeID: string]: number}} = { +export const ABILITY_MOVE_TYPE_BONUSES: {[abilityID: IDEntry]: {[typeName: string]: number}} = { darkaura: {Dark: 1.33}, dragonsmaw: {Dragon: 1.5}, fairyaura: {Fairy: 1.33}, @@ -31,7 +31,7 @@ export const ABILITY_MOVE_TYPE_BONUSES: {[abilityID: string]: {[typeID: string]: }; // For moves whose quality isn't obvious from data // USE SPARINGLY! -export const HARDCODED_MOVE_WEIGHTS: {[moveID: string]: number} = { +export const HARDCODED_MOVE_WEIGHTS: {[moveID: IDEntry]: number} = { // Fails unless user is asleep snore: 0, // Hard to use diff --git a/data/cg-teams.ts b/data/cg-teams.ts index 4982fc5f00ca..5037b46b74cf 100644 --- a/data/cg-teams.ts +++ b/data/cg-teams.ts @@ -149,14 +149,14 @@ export default class TeamGenerator { } protected makeSet(species: Species, teamStats: TeamStats): PokemonSet { - const abilityPool = Object.values(species.abilities); + const abilityPool: string[] = Object.values(species.abilities); const abilityWeights = abilityPool.map(a => this.getAbilityWeight(this.dex.abilities.get(a))); const ability = this.weightedRandomPick(abilityPool, abilityWeights); const level = this.forceLevel || TeamGenerator.getLevel(species); const moves: Move[] = []; - let movePool: string[] = [...this.dex.species.getMovePool(species.id)]; + let movePool: IDEntry[] = [...this.dex.species.getMovePool(species.id)]; if (!movePool.length) throw new Error(`No moves for ${species.id}`); // Consider either the top 15 moves or top 30% of moves, whichever is greater. @@ -173,7 +173,7 @@ export default class TeamGenerator { // this is just a second reference the array because movePool gets set to point to a new array before the old one // gets mutated const movePoolCopy = movePool; - let interimMovePool: {move: string, weight: number}[] = []; + let interimMovePool: {move: IDEntry, weight: number}[] = []; while (moves.length < 4 && movePool.length) { let weights; if (!movePoolIsTrimmed) { @@ -514,8 +514,8 @@ export default class TeamGenerator { if (move.category === 'Special' && hasPhysicalSetup) powerEstimate *= 0.7; const abilityBonus = ( - ((ABILITY_MOVE_BONUSES[ability] || {})[move.id] || 1) * - ((ABILITY_MOVE_TYPE_BONUSES[ability] || {})[moveType] || 1) + ((ABILITY_MOVE_BONUSES[toID(ability)] || {})[move.id] || 1) * + ((ABILITY_MOVE_TYPE_BONUSES[toID(ability)] || {})[moveType] || 1) ); let weight = powerEstimate * abilityBonus; diff --git a/data/conditions.ts b/data/conditions.ts index bf25285685b2..06d8e6eeca43 100644 --- a/data/conditions.ts +++ b/data/conditions.ts @@ -1,4 +1,4 @@ -export const Conditions: {[k: string]: ConditionData} = { +export const Conditions: import('../sim/dex-conditions').ConditionDataTable = { brn: { name: 'brn', effectType: 'Status', diff --git a/data/formats-data.ts b/data/formats-data.ts index e6f613c2e7e5..4a939b5daabd 100644 --- a/data/formats-data.ts +++ b/data/formats-data.ts @@ -1,4 +1,4 @@ -export const FormatsData: {[k: string]: SpeciesFormatsData} = { +export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = { bulbasaur: { tier: "LC", }, diff --git a/data/items.ts b/data/items.ts index 02889cd87847..104181fe42ef 100644 --- a/data/items.ts +++ b/data/items.ts @@ -1,4 +1,4 @@ -export const Items: {[itemid: string]: ItemData} = { +export const Items: import('../sim/dex-items').ItemDataTable = { abilityshield: { name: "Ability Shield", spritenum: 746, diff --git a/data/learnsets.ts b/data/learnsets.ts index 91b9ae194d4f..e22df88b18a0 100644 --- a/data/learnsets.ts +++ b/data/learnsets.ts @@ -1,4 +1,4 @@ -export const Learnsets: {[k: string]: LearnsetData} = { +export const Learnsets: import('../sim/dex-species').LearnsetDataTable = { missingno: { learnset: { blizzard: ["3L1"], diff --git a/data/mods/fullpotential/abilities.ts b/data/mods/fullpotential/abilities.ts index 60df6850dc09..fbd32c84044b 100644 --- a/data/mods/fullpotential/abilities.ts +++ b/data/mods/fullpotential/abilities.ts @@ -1,4 +1,4 @@ -export const Abilities: {[k: string]: ModdedAbilityData} = { +export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = { unaware: { inherit: true, onAnyModifyBoost(boosts, pokemon) { diff --git a/data/mods/gen1/conditions.ts b/data/mods/gen1/conditions.ts index 58e3a91528fa..150081088830 100644 --- a/data/mods/gen1/conditions.ts +++ b/data/mods/gen1/conditions.ts @@ -8,7 +8,7 @@ * under certain conditions and re-applied under other conditions. */ -export const Conditions: {[id: string]: ModdedConditionData} = { +export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDataTable = { brn: { name: 'brn', effectType: 'Status', diff --git a/data/mods/gen1/formats-data.ts b/data/mods/gen1/formats-data.ts index d0e446f210fb..695af81fea49 100644 --- a/data/mods/gen1/formats-data.ts +++ b/data/mods/gen1/formats-data.ts @@ -1,4 +1,4 @@ -export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { +export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormatsDataTable = { bulbasaur: { tier: "LC", }, diff --git a/data/mods/gen1/moves.ts b/data/mods/gen1/moves.ts index 0962234efe7b..b82c1efeb792 100644 --- a/data/mods/gen1/moves.ts +++ b/data/mods/gen1/moves.ts @@ -3,7 +3,7 @@ * Some moves have had major changes, such as Bite's typing. */ -export const Moves: {[k: string]: ModdedMoveData} = { +export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { acid: { inherit: true, secondary: { diff --git a/data/mods/gen1/pokedex.ts b/data/mods/gen1/pokedex.ts index 2287635fb39f..f918ae1928cb 100644 --- a/data/mods/gen1/pokedex.ts +++ b/data/mods/gen1/pokedex.ts @@ -1,4 +1,4 @@ -export const Pokedex: {[k: string]: ModdedSpeciesData} = { +export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable = { missingno: { inherit: true, baseStats: {hp: 33, atk: 136, def: 0, spa: 6, spd: 6, spe: 29}, diff --git a/data/mods/gen1/rulesets.ts b/data/mods/gen1/rulesets.ts index bd3bca4d59aa..942fe0f4fe55 100644 --- a/data/mods/gen1/rulesets.ts +++ b/data/mods/gen1/rulesets.ts @@ -1,4 +1,4 @@ -export const Rulesets: {[k: string]: ModdedFormatData} = { +export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable = { standard: { effectType: 'ValidatorRule', name: 'Standard', diff --git a/data/mods/gen1/typechart.ts b/data/mods/gen1/typechart.ts index 85d83e1804c8..d90271e37f8e 100644 --- a/data/mods/gen1/typechart.ts +++ b/data/mods/gen1/typechart.ts @@ -6,7 +6,7 @@ * Psychic was immune to ghost */ -export const TypeChart: {[k: string]: ModdedTypeData | null} = { +export const TypeChart: import('../../../sim/dex-data').ModdedTypeDataTable = { bug: { damageTaken: { Bug: 0, diff --git a/data/mods/gen1jpn/conditions.ts b/data/mods/gen1jpn/conditions.ts index 6538f881525d..09499f5a443b 100644 --- a/data/mods/gen1jpn/conditions.ts +++ b/data/mods/gen1jpn/conditions.ts @@ -1,4 +1,4 @@ -export const Conditions: {[k: string]: ModdedConditionData} = { +export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDataTable = { invulnerability: { // Dig/Fly name: 'invulnerability', diff --git a/data/mods/gen1jpn/moves.ts b/data/mods/gen1jpn/moves.ts index b4c1163815e6..c865231b9d45 100644 --- a/data/mods/gen1jpn/moves.ts +++ b/data/mods/gen1jpn/moves.ts @@ -2,7 +2,7 @@ * The japanese version of Blizzard in Gen 1 had a 30% chance to freeze */ -export const Moves: {[k: string]: ModdedMoveData} = { +export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { blizzard: { inherit: true, secondary: { diff --git a/data/mods/gen1jpn/rulesets.ts b/data/mods/gen1jpn/rulesets.ts index 6bcd264a6f1d..cd12e27ecfdc 100644 --- a/data/mods/gen1jpn/rulesets.ts +++ b/data/mods/gen1jpn/rulesets.ts @@ -1,4 +1,4 @@ -export const Rulesets: {[k: string]: ModdedFormatData} = { +export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable = { standard: { effectType: 'ValidatorRule', name: 'Standard', diff --git a/data/mods/gen1stadium/conditions.ts b/data/mods/gen1stadium/conditions.ts index cf34f690d577..b7c6a0fe296b 100644 --- a/data/mods/gen1stadium/conditions.ts +++ b/data/mods/gen1stadium/conditions.ts @@ -1,4 +1,4 @@ -export const Conditions: {[k: string]: ModdedConditionData} = { +export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDataTable = { brn: { name: 'brn', effectType: 'Status', diff --git a/data/mods/gen1stadium/formats-data.ts b/data/mods/gen1stadium/formats-data.ts index bfea94eb4f21..b80dfef904a2 100644 --- a/data/mods/gen1stadium/formats-data.ts +++ b/data/mods/gen1stadium/formats-data.ts @@ -1,4 +1,4 @@ -export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { +export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormatsDataTable = { bulbasaur: { tier: "LC", }, diff --git a/data/mods/gen1stadium/moves.ts b/data/mods/gen1stadium/moves.ts index bdd0ebcead0a..a7bb04d3170b 100644 --- a/data/mods/gen1stadium/moves.ts +++ b/data/mods/gen1stadium/moves.ts @@ -1,4 +1,4 @@ -export const Moves: {[k: string]: ModdedMoveData} = { +export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { bide: { inherit: true, priority: 0, diff --git a/data/mods/gen1stadium/rulesets.ts b/data/mods/gen1stadium/rulesets.ts index 94983569c7c9..716eb00d5abc 100644 --- a/data/mods/gen1stadium/rulesets.ts +++ b/data/mods/gen1stadium/rulesets.ts @@ -1,4 +1,4 @@ -export const Rulesets: {[k: string]: ModdedFormatData} = { +export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable = { standard: { effectType: 'ValidatorRule', name: 'Standard', diff --git a/data/mods/gen2/conditions.ts b/data/mods/gen2/conditions.ts index 16dbd0136079..08f6a70a3eae 100644 --- a/data/mods/gen2/conditions.ts +++ b/data/mods/gen2/conditions.ts @@ -1,4 +1,4 @@ -export const Conditions: {[k: string]: ModdedConditionData} = { +export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDataTable = { brn: { name: 'brn', effectType: 'Status', diff --git a/data/mods/gen2/formats-data.ts b/data/mods/gen2/formats-data.ts index 8d1073952089..793ea0449b63 100644 --- a/data/mods/gen2/formats-data.ts +++ b/data/mods/gen2/formats-data.ts @@ -1,4 +1,4 @@ -export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { +export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormatsDataTable = { bulbasaur: { tier: "LC", }, diff --git a/data/mods/gen2/items.ts b/data/mods/gen2/items.ts index fe8a5c944ce5..d264e3e4fed6 100644 --- a/data/mods/gen2/items.ts +++ b/data/mods/gen2/items.ts @@ -1,4 +1,4 @@ -export const Items: {[k: string]: ModdedItemData} = { +export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { berryjuice: { inherit: true, isNonstandard: null, diff --git a/data/mods/gen2/learnsets.ts b/data/mods/gen2/learnsets.ts index 02475fa2b99b..335338db4e5c 100644 --- a/data/mods/gen2/learnsets.ts +++ b/data/mods/gen2/learnsets.ts @@ -1,4 +1,4 @@ -export const Learnsets: {[k: string]: ModdedLearnsetData} = { +export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTable = { missingno: { learnset: { blizzard: ["1M"], diff --git a/data/mods/gen2/moves.ts b/data/mods/gen2/moves.ts index 968cfdec9794..7a311e66108a 100644 --- a/data/mods/gen2/moves.ts +++ b/data/mods/gen2/moves.ts @@ -2,7 +2,7 @@ * Gen 2 moves */ -export const Moves: {[k: string]: ModdedMoveData} = { +export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { aeroblast: { inherit: true, critRatio: 3, diff --git a/data/mods/gen2/pokedex.ts b/data/mods/gen2/pokedex.ts index af117f0082b1..3fc7613f8dde 100644 --- a/data/mods/gen2/pokedex.ts +++ b/data/mods/gen2/pokedex.ts @@ -1,4 +1,4 @@ -export const Pokedex: {[k: string]: ModdedSpeciesData} = { +export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable = { unown: { inherit: true, cosmeticFormes: ["Unown-B", "Unown-C", "Unown-D", "Unown-E", "Unown-F", "Unown-G", "Unown-H", "Unown-I", "Unown-J", "Unown-K", "Unown-L", "Unown-M", "Unown-N", "Unown-O", "Unown-P", "Unown-Q", "Unown-R", "Unown-S", "Unown-T", "Unown-U", "Unown-V", "Unown-W", "Unown-X", "Unown-Y", "Unown-Z"], diff --git a/data/mods/gen2/rulesets.ts b/data/mods/gen2/rulesets.ts index 1d3bffdb2e28..55a717528727 100644 --- a/data/mods/gen2/rulesets.ts +++ b/data/mods/gen2/rulesets.ts @@ -1,6 +1,6 @@ import type {Learnset} from "../../../sim/dex-species"; -export const Rulesets: {[k: string]: ModdedFormatData} = { +export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable = { obtainablemoves: { inherit: true, banlist: [ diff --git a/data/mods/gen2/typechart.ts b/data/mods/gen2/typechart.ts index eb62f8447d3b..de3df304e62d 100644 --- a/data/mods/gen2/typechart.ts +++ b/data/mods/gen2/typechart.ts @@ -1,4 +1,4 @@ -export const TypeChart: {[k: string]: ModdedTypeData} = { +export const TypeChart: import('../../../sim/dex-data').ModdedTypeDataTable = { fire: { inherit: true, damageTaken: { diff --git a/data/mods/gen2stadium2/conditions.ts b/data/mods/gen2stadium2/conditions.ts index 8d6dae2eff78..3ced97f51a3c 100644 --- a/data/mods/gen2stadium2/conditions.ts +++ b/data/mods/gen2stadium2/conditions.ts @@ -4,7 +4,7 @@ * a volatile along with them to keep track of if their respective stat changes should be factored * in during stat calculations or not. */ -export const Conditions: {[k: string]: ModdedConditionData} = { +export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDataTable = { brn: { name: 'brn', effectType: 'Status', diff --git a/data/mods/gen2stadium2/items.ts b/data/mods/gen2stadium2/items.ts index bf2a797ed2c2..990e14c2a468 100644 --- a/data/mods/gen2stadium2/items.ts +++ b/data/mods/gen2stadium2/items.ts @@ -1,5 +1,5 @@ // Gen 2 Stadium fixes Dragon Fang and Dragon Scale having the wrong effects. -export const Items: {[k: string]: ModdedItemData} = { +export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { dragonfang: { inherit: true, onModifyDamage(damage, source, target, move) { diff --git a/data/mods/gen2stadium2/moves.ts b/data/mods/gen2stadium2/moves.ts index acf213c3f168..9a34450484de 100644 --- a/data/mods/gen2stadium2/moves.ts +++ b/data/mods/gen2stadium2/moves.ts @@ -1,4 +1,4 @@ -export const Moves: {[k: string]: ModdedMoveData} = { +export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { // Belly Drum no longer boosts attack by 2 stages if under 50% health. bellydrum: { inherit: true, diff --git a/data/mods/gen2stadium2/rulesets.ts b/data/mods/gen2stadium2/rulesets.ts index 539707fc9aa9..0bbab70192e9 100644 --- a/data/mods/gen2stadium2/rulesets.ts +++ b/data/mods/gen2stadium2/rulesets.ts @@ -1,4 +1,4 @@ -export const Rulesets: {[k: string]: ModdedFormatData} = { +export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable = { standard: { effectType: 'ValidatorRule', name: 'Standard', diff --git a/data/mods/gen3/abilities.ts b/data/mods/gen3/abilities.ts index fef0ace3cfcc..3d2bd5b5e6f7 100644 --- a/data/mods/gen3/abilities.ts +++ b/data/mods/gen3/abilities.ts @@ -1,4 +1,4 @@ -export const Abilities: {[k: string]: ModdedAbilityData} = { +export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = { cutecharm: { inherit: true, onDamagingHit(damage, target, source, move) { diff --git a/data/mods/gen3/conditions.ts b/data/mods/gen3/conditions.ts index b2daf4308749..381451eab155 100644 --- a/data/mods/gen3/conditions.ts +++ b/data/mods/gen3/conditions.ts @@ -1,4 +1,4 @@ -export const Conditions: {[k: string]: ModdedConditionData} = { +export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDataTable = { slp: { name: 'slp', effectType: 'Status', diff --git a/data/mods/gen3/formats-data.ts b/data/mods/gen3/formats-data.ts index 31f0804fa617..3e5c0679fe66 100644 --- a/data/mods/gen3/formats-data.ts +++ b/data/mods/gen3/formats-data.ts @@ -1,4 +1,4 @@ -export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { +export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormatsDataTable = { bulbasaur: { tier: "LC", }, diff --git a/data/mods/gen3/items.ts b/data/mods/gen3/items.ts index 9ab3eb5bacd3..f3bc45365e95 100644 --- a/data/mods/gen3/items.ts +++ b/data/mods/gen3/items.ts @@ -1,4 +1,4 @@ -export const Items: {[k: string]: ModdedItemData} = { +export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { aguavberry: { inherit: true, onUpdate() {}, diff --git a/data/mods/gen3/moves.ts b/data/mods/gen3/moves.ts index c44944f31afb..9165c3b33790 100644 --- a/data/mods/gen3/moves.ts +++ b/data/mods/gen3/moves.ts @@ -2,7 +2,7 @@ * Gen 3 moves */ -export const Moves: {[k: string]: ModdedMoveData} = { +export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { absorb: { inherit: true, pp: 20, diff --git a/data/mods/gen3/rulesets.ts b/data/mods/gen3/rulesets.ts index 8169d853c299..1f10237c4bc2 100644 --- a/data/mods/gen3/rulesets.ts +++ b/data/mods/gen3/rulesets.ts @@ -1,4 +1,4 @@ -export const Rulesets: {[k: string]: ModdedFormatData} = { +export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable = { standard: { effectType: 'ValidatorRule', name: 'Standard', diff --git a/data/mods/gen4/abilities.ts b/data/mods/gen4/abilities.ts index 408ff55ccbc5..26dc82a2e4ca 100644 --- a/data/mods/gen4/abilities.ts +++ b/data/mods/gen4/abilities.ts @@ -1,4 +1,4 @@ -export const Abilities: {[k: string]: ModdedAbilityData} = { +export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = { airlock: { inherit: true, onSwitchIn() {}, diff --git a/data/mods/gen4/conditions.ts b/data/mods/gen4/conditions.ts index a7e0c62c594b..576737c7e4c6 100644 --- a/data/mods/gen4/conditions.ts +++ b/data/mods/gen4/conditions.ts @@ -1,4 +1,4 @@ -export const Conditions: {[k: string]: ModdedConditionData} = { +export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDataTable = { brn: { inherit: true, onResidualOrder: 10, diff --git a/data/mods/gen4/formats-data.ts b/data/mods/gen4/formats-data.ts index 93566ced1607..4065adac334a 100644 --- a/data/mods/gen4/formats-data.ts +++ b/data/mods/gen4/formats-data.ts @@ -1,4 +1,4 @@ -export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { +export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormatsDataTable = { bulbasaur: { tier: "LC", }, diff --git a/data/mods/gen4/items.ts b/data/mods/gen4/items.ts index fd9357387c03..3dd96be8c70e 100644 --- a/data/mods/gen4/items.ts +++ b/data/mods/gen4/items.ts @@ -1,4 +1,4 @@ -export const Items: {[k: string]: ModdedItemData} = { +export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { adamantorb: { inherit: true, onBasePower(basePower, user, target, move) { diff --git a/data/mods/gen4/moves.ts b/data/mods/gen4/moves.ts index c414a9c6dcd4..28cc6267ae24 100644 --- a/data/mods/gen4/moves.ts +++ b/data/mods/gen4/moves.ts @@ -1,4 +1,4 @@ -export const Moves: {[k: string]: ModdedMoveData} = { +export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { acupressure: { inherit: true, flags: {snatch: 1, metronome: 1}, diff --git a/data/mods/gen4/pokedex.ts b/data/mods/gen4/pokedex.ts index b2d37153ffa5..633ee04652b2 100644 --- a/data/mods/gen4/pokedex.ts +++ b/data/mods/gen4/pokedex.ts @@ -1,4 +1,4 @@ -export const Pokedex: {[k: string]: ModdedSpeciesData} = { +export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable = { milotic: { inherit: true, evoType: 'levelExtra', diff --git a/data/mods/gen4/rulesets.ts b/data/mods/gen4/rulesets.ts index e19dedb65e09..f13fdb466323 100644 --- a/data/mods/gen4/rulesets.ts +++ b/data/mods/gen4/rulesets.ts @@ -1,4 +1,4 @@ -export const Rulesets: {[k: string]: ModdedFormatData} = { +export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable = { standard: { inherit: true, ruleset: ['Obtainable', 'Sleep Clause Mod', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Items Clause', 'Evasion Moves Clause', 'Endless Battle Clause', 'HP Percentage Mod', 'Cancel Mod'], diff --git a/data/mods/gen4pt/formats-data.ts b/data/mods/gen4pt/formats-data.ts index b7409463658a..8fc4ca29bf34 100644 --- a/data/mods/gen4pt/formats-data.ts +++ b/data/mods/gen4pt/formats-data.ts @@ -1,4 +1,4 @@ -export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { +export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormatsDataTable = { pichuspikyeared: { isNonstandard: "Future", tier: "Illegal", diff --git a/data/mods/gen4pt/learnsets.ts b/data/mods/gen4pt/learnsets.ts index 26fffa250ef3..bdf926055348 100644 --- a/data/mods/gen4pt/learnsets.ts +++ b/data/mods/gen4pt/learnsets.ts @@ -1,4 +1,4 @@ -export const Learnsets: {[k: string]: ModdedLearnsetData} = { +export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTable = { bulbasaur: { inherit: true, learnset: { diff --git a/data/mods/gen5/abilities.ts b/data/mods/gen5/abilities.ts index e85062c742a8..d3cc8e8a4919 100644 --- a/data/mods/gen5/abilities.ts +++ b/data/mods/gen5/abilities.ts @@ -1,4 +1,4 @@ -export const Abilities: {[k: string]: ModdedAbilityData} = { +export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = { anticipation: { inherit: true, onStart(pokemon) { diff --git a/data/mods/gen5/conditions.ts b/data/mods/gen5/conditions.ts index 8c8758936e2f..5193df8eeca9 100644 --- a/data/mods/gen5/conditions.ts +++ b/data/mods/gen5/conditions.ts @@ -1,4 +1,4 @@ -export const Conditions: {[k: string]: ModdedConditionData} = { +export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDataTable = { slp: { inherit: true, onSwitchIn(target) { diff --git a/data/mods/gen5/formats-data.ts b/data/mods/gen5/formats-data.ts index 54f3bdf573ad..d057636dd927 100644 --- a/data/mods/gen5/formats-data.ts +++ b/data/mods/gen5/formats-data.ts @@ -1,4 +1,4 @@ -export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { +export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormatsDataTable = { bulbasaur: { tier: "LC", }, diff --git a/data/mods/gen5/items.ts b/data/mods/gen5/items.ts index d2beff78ebb4..34cfe9b68c50 100644 --- a/data/mods/gen5/items.ts +++ b/data/mods/gen5/items.ts @@ -1,4 +1,4 @@ -export const Items: {[k: string]: ModdedItemData} = { +export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { aguavberry: { inherit: true, naturalGift: { diff --git a/data/mods/gen5/moves.ts b/data/mods/gen5/moves.ts index ffd083c27fbe..9b89a5e6125d 100644 --- a/data/mods/gen5/moves.ts +++ b/data/mods/gen5/moves.ts @@ -1,4 +1,4 @@ -export const Moves: {[k: string]: ModdedMoveData} = { +export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { absorb: { inherit: true, flags: {protect: 1, mirror: 1, metronome: 1}, diff --git a/data/mods/gen5/pokedex.ts b/data/mods/gen5/pokedex.ts index 6783c558f84b..06f3e54db589 100644 --- a/data/mods/gen5/pokedex.ts +++ b/data/mods/gen5/pokedex.ts @@ -1,4 +1,4 @@ -export const Pokedex: {[k: string]: ModdedSpeciesData} = { +export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable = { bulbasaur: { inherit: true, maleOnlyHidden: true, diff --git a/data/mods/gen5/rulesets.ts b/data/mods/gen5/rulesets.ts index 54d18aae405a..09d83f76357e 100644 --- a/data/mods/gen5/rulesets.ts +++ b/data/mods/gen5/rulesets.ts @@ -1,4 +1,4 @@ -export const Rulesets: {[k: string]: ModdedFormatData} = { +export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable = { standard: { inherit: true, ruleset: [ diff --git a/data/mods/gen5/typechart.ts b/data/mods/gen5/typechart.ts index e8e04f803e4a..cc0df5951fee 100644 --- a/data/mods/gen5/typechart.ts +++ b/data/mods/gen5/typechart.ts @@ -1,4 +1,4 @@ -export const TypeChart: {[k: string]: ModdedTypeData | null} = { +export const TypeChart: import('../../../sim/dex-data').ModdedTypeDataTable = { electric: { inherit: true, damageTaken: { diff --git a/data/mods/gen5bw1/formats-data.ts b/data/mods/gen5bw1/formats-data.ts index e067fe2121ef..bafde5f2109d 100644 --- a/data/mods/gen5bw1/formats-data.ts +++ b/data/mods/gen5bw1/formats-data.ts @@ -1,4 +1,4 @@ -export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { +export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormatsDataTable = { venusaur: { tier: "OU", }, diff --git a/data/mods/gen5bw1/items.ts b/data/mods/gen5bw1/items.ts index 40a15d8e56b8..4ea2feedacbf 100644 --- a/data/mods/gen5bw1/items.ts +++ b/data/mods/gen5bw1/items.ts @@ -1,4 +1,4 @@ -export const Items: {[k: string]: ModdedItemData} = { +export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { apicotberry: { inherit: true, isNonstandard: "Unobtainable", diff --git a/data/mods/gen5bw1/learnsets.ts b/data/mods/gen5bw1/learnsets.ts index d2e3fa61e51f..cdbd72f8d822 100644 --- a/data/mods/gen5bw1/learnsets.ts +++ b/data/mods/gen5bw1/learnsets.ts @@ -1,4 +1,4 @@ -export const Learnsets: {[k: string]: ModdedLearnsetData} = { +export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTable = { bulbasaur: { inherit: true, learnset: { diff --git a/data/mods/gen5bw1/pokedex.ts b/data/mods/gen5bw1/pokedex.ts index bbc0175826d5..af4fa84a0409 100644 --- a/data/mods/gen5bw1/pokedex.ts +++ b/data/mods/gen5bw1/pokedex.ts @@ -1,4 +1,4 @@ -export const Pokedex: {[k: string]: ModdedSpeciesData} = { +export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable = { weedle: { inherit: true, unreleasedHidden: true, diff --git a/data/mods/gen6/abilities.ts b/data/mods/gen6/abilities.ts index 0e5eae2c2c97..5d91c41eb83d 100644 --- a/data/mods/gen6/abilities.ts +++ b/data/mods/gen6/abilities.ts @@ -1,4 +1,4 @@ -export const Abilities: {[k: string]: ModdedAbilityData} = { +export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = { aerilate: { inherit: true, onBasePower(basePower, pokemon, target, move) { diff --git a/data/mods/gen6/conditions.ts b/data/mods/gen6/conditions.ts index 33997b63c15f..fedfe5dafae7 100644 --- a/data/mods/gen6/conditions.ts +++ b/data/mods/gen6/conditions.ts @@ -1,4 +1,4 @@ -export const Conditions: {[k: string]: ModdedConditionData} = { +export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDataTable = { brn: { inherit: true, onResidual(pokemon) { diff --git a/data/mods/gen6/formats-data.ts b/data/mods/gen6/formats-data.ts index 526a112d64f8..eb91b9423077 100644 --- a/data/mods/gen6/formats-data.ts +++ b/data/mods/gen6/formats-data.ts @@ -1,4 +1,4 @@ -export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { +export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormatsDataTable = { bulbasaur: { tier: "LC", }, diff --git a/data/mods/gen6/items.ts b/data/mods/gen6/items.ts index 6b822fe8d5b2..ebf483dd329c 100644 --- a/data/mods/gen6/items.ts +++ b/data/mods/gen6/items.ts @@ -1,4 +1,4 @@ -export const Items: {[k: string]: ModdedItemData} = { +export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { aguavberry: { inherit: true, onUpdate(pokemon) { diff --git a/data/mods/gen6/learnsets.ts b/data/mods/gen6/learnsets.ts index ec925e49ccd5..0c25790ff3ea 100644 --- a/data/mods/gen6/learnsets.ts +++ b/data/mods/gen6/learnsets.ts @@ -1,4 +1,4 @@ -export const Learnsets: {[k: string]: ModdedLearnsetData} = { +export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTable = { tomohawk: { inherit: true, learnset: { diff --git a/data/mods/gen6/moves.ts b/data/mods/gen6/moves.ts index aa3c8df47fae..01a560af818d 100644 --- a/data/mods/gen6/moves.ts +++ b/data/mods/gen6/moves.ts @@ -1,4 +1,4 @@ -export const Moves: {[k: string]: ModdedMoveData} = { +export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { allyswitch: { inherit: true, priority: 1, diff --git a/data/mods/gen6/pokedex.ts b/data/mods/gen6/pokedex.ts index 2714d78bab35..8bf3af4e713e 100644 --- a/data/mods/gen6/pokedex.ts +++ b/data/mods/gen6/pokedex.ts @@ -1,4 +1,4 @@ -export const Pokedex: {[k: string]: ModdedSpeciesData} = { +export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable = { charizardmegax: { inherit: true, color: "Red", diff --git a/data/mods/gen6/typechart.ts b/data/mods/gen6/typechart.ts index 9ea29b6bb00e..e267f56e4509 100644 --- a/data/mods/gen6/typechart.ts +++ b/data/mods/gen6/typechart.ts @@ -1,4 +1,4 @@ -export const TypeChart: {[k: string]: ModdedTypeData} = { +export const TypeChart: import('../../../sim/dex-data').ModdedTypeDataTable = { dark: { inherit: true, damageTaken: { diff --git a/data/mods/gen6xy/formats-data.ts b/data/mods/gen6xy/formats-data.ts index 6d6becbc0fc4..959b35b549db 100644 --- a/data/mods/gen6xy/formats-data.ts +++ b/data/mods/gen6xy/formats-data.ts @@ -1,4 +1,4 @@ -export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { +export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormatsDataTable = { beedrillmega: { isNonstandard: "Future", tier: "Illegal", diff --git a/data/mods/gen6xy/items.ts b/data/mods/gen6xy/items.ts index 989b05429628..6f0871f2a456 100644 --- a/data/mods/gen6xy/items.ts +++ b/data/mods/gen6xy/items.ts @@ -1,4 +1,4 @@ -export const Items: {[k: string]: ModdedItemData} = { +export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { altarianite: { inherit: true, isNonstandard: "Future", diff --git a/data/mods/gen6xy/learnsets.ts b/data/mods/gen6xy/learnsets.ts index cd5270584d65..9c7d54d47348 100644 --- a/data/mods/gen6xy/learnsets.ts +++ b/data/mods/gen6xy/learnsets.ts @@ -1,4 +1,4 @@ -export const Learnsets: {[k: string]: ModdedLearnsetData} = { +export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTable = { bulbasaur: { inherit: true, learnset: { diff --git a/data/mods/gen6xy/moves.ts b/data/mods/gen6xy/moves.ts index f2017d6446e9..6f0e1aa8dbc2 100644 --- a/data/mods/gen6xy/moves.ts +++ b/data/mods/gen6xy/moves.ts @@ -1,4 +1,4 @@ -export const Moves: {[k: string]: ModdedMoveData} = { +export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { dragonascent: { inherit: true, isNonstandard: "Future", diff --git a/data/mods/gen6xy/pokedex.ts b/data/mods/gen6xy/pokedex.ts index 579941112037..228ab61532e9 100644 --- a/data/mods/gen6xy/pokedex.ts +++ b/data/mods/gen6xy/pokedex.ts @@ -1,4 +1,4 @@ -export const Pokedex: {[k: string]: ModdedSpeciesData} = { +export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable = { pikachu: { inherit: true, formeOrder: ["Pikachu"], diff --git a/data/mods/gen7/abilities.ts b/data/mods/gen7/abilities.ts index 6cc1cdc4bcd4..6d57c8da206d 100644 --- a/data/mods/gen7/abilities.ts +++ b/data/mods/gen7/abilities.ts @@ -1,4 +1,4 @@ -export const Abilities: {[k: string]: ModdedAbilityData} = { +export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = { disguise: { inherit: true, onDamage(damage, target, source, effect) { diff --git a/data/mods/gen7/formats-data.ts b/data/mods/gen7/formats-data.ts index 4585f0639ba4..4fc2cef0cb26 100644 --- a/data/mods/gen7/formats-data.ts +++ b/data/mods/gen7/formats-data.ts @@ -1,4 +1,4 @@ -export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { +export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormatsDataTable = { bulbasaur: { tier: "LC", }, diff --git a/data/mods/gen7/items.ts b/data/mods/gen7/items.ts index 076c4a3586a3..d3ade1a4cca8 100644 --- a/data/mods/gen7/items.ts +++ b/data/mods/gen7/items.ts @@ -1,4 +1,4 @@ -export const Items: {[k: string]: ModdedItemData} = { +export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { abomasite: { inherit: true, isNonstandard: null, diff --git a/data/mods/gen7/moves.ts b/data/mods/gen7/moves.ts index fc8e6e3c57e4..bb1b097a9534 100644 --- a/data/mods/gen7/moves.ts +++ b/data/mods/gen7/moves.ts @@ -1,4 +1,4 @@ -export const Moves: {[k: string]: ModdedMoveData} = { +export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { "10000000voltthunderbolt": { inherit: true, isNonstandard: null, diff --git a/data/mods/gen7/pokedex.ts b/data/mods/gen7/pokedex.ts index f94f6ec63005..b4662fc1b2e3 100644 --- a/data/mods/gen7/pokedex.ts +++ b/data/mods/gen7/pokedex.ts @@ -1,4 +1,4 @@ -export const Pokedex: {[k: string]: ModdedSpeciesData} = { +export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable = { pikachuoriginal: { inherit: true, abilities: {0: "Static"}, diff --git a/data/mods/gen7/rulesets.ts b/data/mods/gen7/rulesets.ts index 7bda3473e876..7114fc638baa 100644 --- a/data/mods/gen7/rulesets.ts +++ b/data/mods/gen7/rulesets.ts @@ -1,4 +1,4 @@ -export const Rulesets: {[k: string]: ModdedFormatData} = { +export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable = { standard: { inherit: true, ruleset: ['Obtainable', 'Team Preview', 'Sleep Clause Mod', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Moody Clause', 'Evasion Items Clause', 'Evasion Moves Clause', 'Endless Battle Clause', 'HP Percentage Mod', 'Cancel Mod'], diff --git a/data/mods/gen7letsgo/formats-data.ts b/data/mods/gen7letsgo/formats-data.ts index 7914ce92eda2..79158f835dd5 100644 --- a/data/mods/gen7letsgo/formats-data.ts +++ b/data/mods/gen7letsgo/formats-data.ts @@ -1,4 +1,4 @@ -export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { +export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormatsDataTable = { bulbasaur: { tier: "LC", }, diff --git a/data/mods/gen7letsgo/learnsets.ts b/data/mods/gen7letsgo/learnsets.ts index 72886a9cbbc5..d6001762a63b 100644 --- a/data/mods/gen7letsgo/learnsets.ts +++ b/data/mods/gen7letsgo/learnsets.ts @@ -1,6 +1,6 @@ /* eslint-disable max-len */ -export const Learnsets: {[k: string]: ModdedLearnsetData} = { +export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTable = { bulbasaur: { learnset: { doubleedge: ["7L32"], diff --git a/data/mods/gen7letsgo/moves.ts b/data/mods/gen7letsgo/moves.ts index 47e0b8e00b43..552a0df8c87b 100644 --- a/data/mods/gen7letsgo/moves.ts +++ b/data/mods/gen7letsgo/moves.ts @@ -1,4 +1,4 @@ -export const Moves: {[k: string]: ModdedMoveData} = { +export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { absorb: { inherit: true, basePower: 40, diff --git a/data/mods/gen7letsgo/pokedex.ts b/data/mods/gen7letsgo/pokedex.ts index e9fc3dd1dd86..08b995f3cb74 100644 --- a/data/mods/gen7letsgo/pokedex.ts +++ b/data/mods/gen7letsgo/pokedex.ts @@ -1,4 +1,4 @@ -export const Pokedex: {[k: string]: ModdedSpeciesData} = { +export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable = { pichu: { inherit: true, evos: [], diff --git a/data/mods/gen7pokebilities/abilities.ts b/data/mods/gen7pokebilities/abilities.ts index 978934e45901..edffea067633 100644 --- a/data/mods/gen7pokebilities/abilities.ts +++ b/data/mods/gen7pokebilities/abilities.ts @@ -1,4 +1,4 @@ -export const Abilities: {[k: string]: ModdedAbilityData} = { +export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = { mummy: { inherit: true, onDamagingHit(damage, target, source, move) { diff --git a/data/mods/gen7pokebilities/moves.ts b/data/mods/gen7pokebilities/moves.ts index 8fd18a791128..c473cb8bba8d 100644 --- a/data/mods/gen7pokebilities/moves.ts +++ b/data/mods/gen7pokebilities/moves.ts @@ -1,4 +1,4 @@ -export const Moves: {[k: string]: ModdedMoveData} = { +export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { gastroacid: { inherit: true, condition: { diff --git a/data/mods/gen7sm/formats-data.ts b/data/mods/gen7sm/formats-data.ts index 72f38d3b9433..aa488e96c544 100644 --- a/data/mods/gen7sm/formats-data.ts +++ b/data/mods/gen7sm/formats-data.ts @@ -1,4 +1,4 @@ -export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { +export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormatsDataTable = { pikachupartner: { isNonstandard: "Future", tier: "Illegal", diff --git a/data/mods/gen7sm/items.ts b/data/mods/gen7sm/items.ts index bca4ea102a7a..cd8a7a72ed69 100644 --- a/data/mods/gen7sm/items.ts +++ b/data/mods/gen7sm/items.ts @@ -1,4 +1,4 @@ -export const Items: {[k: string]: ModdedItemData} = { +export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { kommoniumz: { inherit: true, isNonstandard: "Future", diff --git a/data/mods/gen7sm/learnsets.ts b/data/mods/gen7sm/learnsets.ts index bf73a945b621..8e65324c9d87 100644 --- a/data/mods/gen7sm/learnsets.ts +++ b/data/mods/gen7sm/learnsets.ts @@ -1,4 +1,4 @@ -export const Learnsets: {[k: string]: ModdedLearnsetData} = { +export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTable = { bulbasaur: { inherit: true, learnset: { diff --git a/data/mods/gen7sm/moves.ts b/data/mods/gen7sm/moves.ts index 7f79335e2a73..5a42912cac18 100644 --- a/data/mods/gen7sm/moves.ts +++ b/data/mods/gen7sm/moves.ts @@ -1,4 +1,4 @@ -export const Moves: {[k: string]: ModdedMoveData} = { +export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { mindblown: { inherit: true, isNonstandard: "Future", diff --git a/data/mods/gen7sm/pokedex.ts b/data/mods/gen7sm/pokedex.ts index b9cbd2d0c38a..630e47e8ab77 100644 --- a/data/mods/gen7sm/pokedex.ts +++ b/data/mods/gen7sm/pokedex.ts @@ -1,4 +1,4 @@ -export const Pokedex: {[k: string]: ModdedSpeciesData} = { +export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable = { litten: { inherit: true, unreleasedHidden: true, diff --git a/data/mods/gen8/abilities.ts b/data/mods/gen8/abilities.ts index 815bac2c15e3..b43d0032258d 100644 --- a/data/mods/gen8/abilities.ts +++ b/data/mods/gen8/abilities.ts @@ -32,7 +32,7 @@ Ratings and how they work: */ -export const Abilities: {[k: string]: ModdedAbilityData} = { +export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = { noability: { inherit: true, rating: 0.1, diff --git a/data/mods/gen8/formats-data.ts b/data/mods/gen8/formats-data.ts index 2facdbeea697..91a8d4e57a48 100644 --- a/data/mods/gen8/formats-data.ts +++ b/data/mods/gen8/formats-data.ts @@ -1,4 +1,4 @@ -export const FormatsData: {[k: string]: SpeciesFormatsData} = { +export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormatsDataTable = { bulbasaur: { tier: "LC", }, diff --git a/data/mods/gen8/items.ts b/data/mods/gen8/items.ts index 8a1dbdd47201..59dc8c70a595 100644 --- a/data/mods/gen8/items.ts +++ b/data/mods/gen8/items.ts @@ -1,4 +1,4 @@ -export const Items: {[k: string]: ModdedItemData} = { +export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { adamantcrystal: { inherit: true, isNonstandard: "Future", diff --git a/data/mods/gen8/learnsets.ts b/data/mods/gen8/learnsets.ts index f0b173174a2e..ad2ee795440f 100644 --- a/data/mods/gen8/learnsets.ts +++ b/data/mods/gen8/learnsets.ts @@ -1,4 +1,4 @@ -export const Learnsets: {[k: string]: ModdedLearnsetData} = { +export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTable = { vivillonfancy: { inherit: true, eventOnly: true, diff --git a/data/mods/gen8/moves.ts b/data/mods/gen8/moves.ts index 63c1056a739b..ae1424f9da1a 100644 --- a/data/mods/gen8/moves.ts +++ b/data/mods/gen8/moves.ts @@ -1,4 +1,4 @@ -export const Moves: {[k: string]: ModdedMoveData} = { +export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { allyswitch: { inherit: true, // Prevents setting the volatile used to check for Ally Switch failure diff --git a/data/mods/gen8/pokedex.ts b/data/mods/gen8/pokedex.ts index 74f2bdb35da6..8a9f3e38c1f9 100644 --- a/data/mods/gen8/pokedex.ts +++ b/data/mods/gen8/pokedex.ts @@ -1,4 +1,4 @@ -export const Pokedex: {[k: string]: ModdedSpeciesData} = { +export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable = { growlithehisui: { inherit: true, abilities: {0: "Intimidate", 1: "Flash Fire", H: "Justified"}, diff --git a/data/mods/gen8/rulesets.ts b/data/mods/gen8/rulesets.ts index 1dc66795cac3..58b0abca1fb4 100644 --- a/data/mods/gen8/rulesets.ts +++ b/data/mods/gen8/rulesets.ts @@ -1,4 +1,4 @@ -export const Rulesets: {[k: string]: ModdedFormatData} = { +export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable = { standard: { inherit: true, ruleset: [ diff --git a/data/mods/gen8/typechart.ts b/data/mods/gen8/typechart.ts index 8035817ee651..8ddf618a16a0 100644 --- a/data/mods/gen8/typechart.ts +++ b/data/mods/gen8/typechart.ts @@ -1,4 +1,4 @@ -export const TypeChart: {[k: string]: ModdedTypeData | null} = { +export const TypeChart: import('../../../sim/dex-data').ModdedTypeDataTable = { stellar: { inherit: true, isNonstandard: 'Future', diff --git a/data/mods/gen8bdsp/abilities.ts b/data/mods/gen8bdsp/abilities.ts index 5833384bb002..d05958a97529 100644 --- a/data/mods/gen8bdsp/abilities.ts +++ b/data/mods/gen8bdsp/abilities.ts @@ -1,4 +1,4 @@ -export const Abilities: {[k: string]: ModdedAbilityData} = { +export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = { asoneglastrier: { inherit: true, isNonstandard: "Past", diff --git a/data/mods/gen8bdsp/formats-data.ts b/data/mods/gen8bdsp/formats-data.ts index ecf95fb85a52..c3dee6585b4e 100644 --- a/data/mods/gen8bdsp/formats-data.ts +++ b/data/mods/gen8bdsp/formats-data.ts @@ -1,5 +1,5 @@ // TODO: alphabetize move names. I'm trying to implement this on a low-quality laptop under time pressure, so I haven't bothered doing so. -export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { +export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormatsDataTable = { bulbasaur: { tier: "LC", }, diff --git a/data/mods/gen8bdsp/items.ts b/data/mods/gen8bdsp/items.ts index 7b95d154b276..73c6951b68fd 100644 --- a/data/mods/gen8bdsp/items.ts +++ b/data/mods/gen8bdsp/items.ts @@ -1,4 +1,4 @@ -export const Items: {[k: string]: ModdedItemData} = { +export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { absorbbulb: { inherit: true, isNonstandard: "Past", diff --git a/data/mods/gen8bdsp/learnsets.ts b/data/mods/gen8bdsp/learnsets.ts index 4cea60b95cdd..2dc4771e9eaf 100644 --- a/data/mods/gen8bdsp/learnsets.ts +++ b/data/mods/gen8bdsp/learnsets.ts @@ -1,6 +1,6 @@ /* eslint-disable max-len */ -export const Learnsets: {[k: string]: ModdedLearnsetData} = { +export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTable = { bulbasaur: { learnset: { amnesia: ["8E"], diff --git a/data/mods/gen8bdsp/moves.ts b/data/mods/gen8bdsp/moves.ts index 02582b33e52d..70ac8215ff7f 100644 --- a/data/mods/gen8bdsp/moves.ts +++ b/data/mods/gen8bdsp/moves.ts @@ -1,4 +1,4 @@ -export const Moves: {[k: string]: ModdedMoveData} = { +export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { accelerock: { inherit: true, isNonstandard: "Past", diff --git a/data/mods/gen8bdsp/pokedex.ts b/data/mods/gen8bdsp/pokedex.ts index 7d65904d2578..a804a714cc72 100644 --- a/data/mods/gen8bdsp/pokedex.ts +++ b/data/mods/gen8bdsp/pokedex.ts @@ -1,4 +1,4 @@ -export const Pokedex: {[k: string]: ModdedSpeciesData} = { +export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable = { eevee: { inherit: true, evos: ["Vaporeon", "Jolteon", "Flareon", "Espeon", "Umbreon", "Leafeon", "Glaceon"], diff --git a/data/mods/gen8dlc1/abilities.ts b/data/mods/gen8dlc1/abilities.ts index 243ebe173bb9..cee6dfe06a03 100644 --- a/data/mods/gen8dlc1/abilities.ts +++ b/data/mods/gen8dlc1/abilities.ts @@ -1,4 +1,4 @@ -export const Abilities: {[k: string]: ModdedAbilityData} = { +export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = { asoneglastrier: { inherit: true, isNonstandard: "Unobtainable", diff --git a/data/mods/gen8dlc1/formats-data.ts b/data/mods/gen8dlc1/formats-data.ts index abc765612d71..16b18855d70f 100644 --- a/data/mods/gen8dlc1/formats-data.ts +++ b/data/mods/gen8dlc1/formats-data.ts @@ -1,4 +1,4 @@ -export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { +export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormatsDataTable = { pikachuworld: { isNonstandard: "Unobtainable", tier: "Unreleased", diff --git a/data/mods/gen8dlc1/items.ts b/data/mods/gen8dlc1/items.ts index 1b4862efd0cd..571eb872f6b6 100644 --- a/data/mods/gen8dlc1/items.ts +++ b/data/mods/gen8dlc1/items.ts @@ -1,4 +1,4 @@ -export const Items: {[k: string]: ModdedItemData} = { +export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { adamantorb: { inherit: true, isNonstandard: "Unobtainable", diff --git a/data/mods/gen8dlc1/learnsets.ts b/data/mods/gen8dlc1/learnsets.ts index a48ea9d3877e..4cab77a12254 100644 --- a/data/mods/gen8dlc1/learnsets.ts +++ b/data/mods/gen8dlc1/learnsets.ts @@ -1,6 +1,6 @@ /* eslint-disable max-len */ -export const Learnsets: {[speciesid: string]: LearnsetData} = { +export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTable = { bulbasaur: { learnset: { amnesia: ["8M", "7E", "6E", "5E", "4E"], diff --git a/data/mods/gen8dlc1/moves.ts b/data/mods/gen8dlc1/moves.ts index 06f3ba95b997..c981ebaabc11 100644 --- a/data/mods/gen8dlc1/moves.ts +++ b/data/mods/gen8dlc1/moves.ts @@ -1,4 +1,4 @@ -export const Moves: {[k: string]: ModdedMoveData} = { +export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { aeroblast: { inherit: true, isNonstandard: "Unobtainable", diff --git a/data/mods/gen8dlc1/pokedex.ts b/data/mods/gen8dlc1/pokedex.ts index 4a72e653f0f7..16ae1b096702 100644 --- a/data/mods/gen8dlc1/pokedex.ts +++ b/data/mods/gen8dlc1/pokedex.ts @@ -1,4 +1,4 @@ -export const Pokedex: {[k: string]: ModdedSpeciesData} = { +export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable = { pumpkaboosmall: { inherit: true, unreleasedHidden: true, diff --git a/data/mods/gen8dlc1/rulesets.ts b/data/mods/gen8dlc1/rulesets.ts index 13489be369cf..41a37960bccc 100644 --- a/data/mods/gen8dlc1/rulesets.ts +++ b/data/mods/gen8dlc1/rulesets.ts @@ -1,4 +1,4 @@ -export const Rulesets: {[k: string]: ModdedFormatData} = { +export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable = { teampreview: { inherit: true, onBattleStart() { diff --git a/data/mods/gen8linked/conditions.ts b/data/mods/gen8linked/conditions.ts index fd5f5d625a17..de549ffb2a11 100644 --- a/data/mods/gen8linked/conditions.ts +++ b/data/mods/gen8linked/conditions.ts @@ -1,4 +1,4 @@ -export const Conditions: {[k: string]: ModdedConditionData} = { +export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDataTable = { slp: { inherit: true, onBeforeMove(pokemon, target, move) { diff --git a/data/mods/gen8linked/items.ts b/data/mods/gen8linked/items.ts index 59c64c736c17..2765c2ed4ad7 100644 --- a/data/mods/gen8linked/items.ts +++ b/data/mods/gen8linked/items.ts @@ -1,4 +1,4 @@ -export const Items: {[k: string]: ModdedItemData} = { +export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { leppaberry: { inherit: true, onUpdate(pokemon) { diff --git a/data/mods/gen8linked/moves.ts b/data/mods/gen8linked/moves.ts index a2253dd52414..58b3b7d619aa 100644 --- a/data/mods/gen8linked/moves.ts +++ b/data/mods/gen8linked/moves.ts @@ -1,4 +1,4 @@ -export const Moves: {[k: string]: ModdedMoveData} = { +export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { pursuit: { inherit: true, beforeTurnCallback(pokemon, target) { diff --git a/data/mods/gen9dlc1/abilities.ts b/data/mods/gen9dlc1/abilities.ts index 7b62af1a0c7d..de6d8f837808 100644 --- a/data/mods/gen9dlc1/abilities.ts +++ b/data/mods/gen9dlc1/abilities.ts @@ -1,4 +1,4 @@ -export const Abilities: {[k: string]: ModdedAbilityData} = { +export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = { commander: { inherit: true, flags: {failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, notransform: 1}, diff --git a/data/mods/gen9dlc1/formats-data.ts b/data/mods/gen9dlc1/formats-data.ts index 5e2dd6dbc8a9..bd8f196cf624 100644 --- a/data/mods/gen9dlc1/formats-data.ts +++ b/data/mods/gen9dlc1/formats-data.ts @@ -1,4 +1,4 @@ -export const FormatsData: {[k: string]: SpeciesFormatsData} = { +export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormatsDataTable = { bulbasaur: { isNonstandard: "Past", tier: "Illegal", diff --git a/data/mods/gen9dlc1/items.ts b/data/mods/gen9dlc1/items.ts index 7925a1dbeb61..d1e16c3a9b4a 100644 --- a/data/mods/gen9dlc1/items.ts +++ b/data/mods/gen9dlc1/items.ts @@ -1,4 +1,4 @@ -export const Items: {[k: string]: ModdedItemData} = { +export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { berrysweet: { inherit: true, isNonstandard: "Past", diff --git a/data/mods/gen9dlc1/learnsets.ts b/data/mods/gen9dlc1/learnsets.ts index 5978b1f50a99..c60ae7eee29d 100644 --- a/data/mods/gen9dlc1/learnsets.ts +++ b/data/mods/gen9dlc1/learnsets.ts @@ -1,4 +1,4 @@ -export const Learnsets: {[k: string]: LearnsetData} = { +export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTable = { missingno: { learnset: { blizzard: ["3L1"], diff --git a/data/mods/gen9dlc1/moves.ts b/data/mods/gen9dlc1/moves.ts index d2047b1357fb..4be094d41fdd 100644 --- a/data/mods/gen9dlc1/moves.ts +++ b/data/mods/gen9dlc1/moves.ts @@ -1,4 +1,4 @@ -export const Moves: {[k: string]: ModdedMoveData} = { +export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { aeroblast: { inherit: true, flags: {protect: 1, mirror: 1, distance: 1, metronome: 1}, diff --git a/data/mods/gen9dlc1/pokedex.ts b/data/mods/gen9dlc1/pokedex.ts index a4131ce212bd..3df76f7db60c 100644 --- a/data/mods/gen9dlc1/pokedex.ts +++ b/data/mods/gen9dlc1/pokedex.ts @@ -1,4 +1,4 @@ -export const Pokedex: {[k: string]: ModdedSpeciesData} = { +export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable = { cresceidon: { inherit: true, baseStats: {hp: 80, atk: 32, def: 111, spa: 88, spd: 99, spe: 125}, diff --git a/data/mods/gen9dlc1/typechart.ts b/data/mods/gen9dlc1/typechart.ts index 8035817ee651..8ddf618a16a0 100644 --- a/data/mods/gen9dlc1/typechart.ts +++ b/data/mods/gen9dlc1/typechart.ts @@ -1,4 +1,4 @@ -export const TypeChart: {[k: string]: ModdedTypeData | null} = { +export const TypeChart: import('../../../sim/dex-data').ModdedTypeDataTable = { stellar: { inherit: true, isNonstandard: 'Future', diff --git a/data/mods/gen9predlc/abilities.ts b/data/mods/gen9predlc/abilities.ts index f2892d7d06ac..0d989708d022 100644 --- a/data/mods/gen9predlc/abilities.ts +++ b/data/mods/gen9predlc/abilities.ts @@ -1,4 +1,4 @@ -export const Abilities: {[k: string]: ModdedAbilityData} = { +export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = { commander: { inherit: true, flags: {failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, cantsuppress: 1, notransform: 1}, diff --git a/data/mods/gen9predlc/formats-data.ts b/data/mods/gen9predlc/formats-data.ts index b4c7ac370f64..a6bc3d53c4fe 100644 --- a/data/mods/gen9predlc/formats-data.ts +++ b/data/mods/gen9predlc/formats-data.ts @@ -1,4 +1,4 @@ -export const FormatsData: {[k: string]: SpeciesFormatsData} = { +export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormatsDataTable = { bulbasaur: { isNonstandard: "Past", tier: "Illegal", diff --git a/data/mods/gen9predlc/items.ts b/data/mods/gen9predlc/items.ts index bc5ed7c80b50..1c2b1b537ce5 100644 --- a/data/mods/gen9predlc/items.ts +++ b/data/mods/gen9predlc/items.ts @@ -1,4 +1,4 @@ -export const Items: {[k: string]: ModdedItemData} = { +export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { custapberry: { inherit: true, isNonstandard: "Unobtainable", diff --git a/data/mods/gen9predlc/learnsets.ts b/data/mods/gen9predlc/learnsets.ts index e74b4019ad7e..d0744247f764 100644 --- a/data/mods/gen9predlc/learnsets.ts +++ b/data/mods/gen9predlc/learnsets.ts @@ -1,6 +1,6 @@ /* eslint-disable max-len */ -export const Learnsets: {[speciesid: string]: LearnsetData} = { +export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTable = { bulbasaur: { learnset: { amnesia: ["8M", "7E", "6E", "5E", "4E"], diff --git a/data/mods/gen9predlc/moves.ts b/data/mods/gen9predlc/moves.ts index 17d435205f1b..1af9032814ea 100644 --- a/data/mods/gen9predlc/moves.ts +++ b/data/mods/gen9predlc/moves.ts @@ -1,4 +1,4 @@ -export const Moves: {[k: string]: ModdedMoveData} = { +export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { aurawheel: { inherit: true, isNonstandard: "Past", diff --git a/data/mods/gen9predlc/pokedex.ts b/data/mods/gen9predlc/pokedex.ts index d88cc83a9ee5..8d215ef7e7ae 100644 --- a/data/mods/gen9predlc/pokedex.ts +++ b/data/mods/gen9predlc/pokedex.ts @@ -1,4 +1,4 @@ -export const Pokedex: {[k: string]: ModdedSpeciesData} = { +export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable = { shiftry: { inherit: true, abilities: {0: "Chlorophyll", 1: "Early Bird", H: "Pickpocket"}, diff --git a/data/mods/gen9ssb/abilities.ts b/data/mods/gen9ssb/abilities.ts index b39e028062fa..582ce8e4bd3b 100644 --- a/data/mods/gen9ssb/abilities.ts +++ b/data/mods/gen9ssb/abilities.ts @@ -3,7 +3,7 @@ import {changeSet, getName, enemyStaff, PSEUDO_WEATHERS} from "./scripts"; const STRONG_WEATHERS = ['desolateland', 'primordialsea', 'deltastream', 'deserteddunes', 'millenniumcastle']; -export const Abilities: {[k: string]: ModdedAbilityData} = { +export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = { /* // Example abilityid: { diff --git a/data/mods/gen9ssb/conditions.ts b/data/mods/gen9ssb/conditions.ts index e7c3ca2bc5d3..8443faf99061 100644 --- a/data/mods/gen9ssb/conditions.ts +++ b/data/mods/gen9ssb/conditions.ts @@ -1,7 +1,8 @@ import {ssbSets} from "./random-teams"; import {changeSet, getName, enemyStaff} from './scripts'; +import {ModdedConditionData} from "../../../sim/dex-conditions"; -export const Conditions: {[k: string]: ModdedConditionData & {innateName?: string}} = { +export const Conditions: {[id: IDEntry]: ModdedConditionData & {innateName?: string}} = { /* // Example: userid: { diff --git a/data/mods/gen9ssb/items.ts b/data/mods/gen9ssb/items.ts index cb9fc9444611..51471555cbca 100644 --- a/data/mods/gen9ssb/items.ts +++ b/data/mods/gen9ssb/items.ts @@ -1,4 +1,4 @@ -export const Items: {[k: string]: ModdedItemData} = { +export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { // Archas lilligantiumz: { name: "Lilligantium Z", diff --git a/data/mods/gen9ssb/moves.ts b/data/mods/gen9ssb/moves.ts index 843c91755d17..987368248015 100644 --- a/data/mods/gen9ssb/moves.ts +++ b/data/mods/gen9ssb/moves.ts @@ -2,7 +2,7 @@ import {ssbSets} from "./random-teams"; import {PSEUDO_WEATHERS, changeSet, getName} from "./scripts"; import {Teams} from '../../../sim/teams'; -export const Moves: {[k: string]: ModdedMoveData} = { +export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { /* // Example moveid: { diff --git a/data/mods/gen9ssb/pokedex.ts b/data/mods/gen9ssb/pokedex.ts index dec914edef7d..7b023e13b3a2 100644 --- a/data/mods/gen9ssb/pokedex.ts +++ b/data/mods/gen9ssb/pokedex.ts @@ -1,4 +1,4 @@ -export const Pokedex: {[k: string]: ModdedSpeciesData} = { +export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable = { /* // Example id: { diff --git a/data/mods/gen9ssb/rulesets.ts b/data/mods/gen9ssb/rulesets.ts index b5f8a95db8ab..143bedc50473 100644 --- a/data/mods/gen9ssb/rulesets.ts +++ b/data/mods/gen9ssb/rulesets.ts @@ -1,4 +1,4 @@ -export const Rulesets: {[k: string]: ModdedFormatData} = { +export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable = { sleepclausemod: { inherit: true, onSetStatus(status, target, source) { diff --git a/data/mods/gen9ssb/typechart.ts b/data/mods/gen9ssb/typechart.ts index 3733f8dc3524..490d656b5e5e 100644 --- a/data/mods/gen9ssb/typechart.ts +++ b/data/mods/gen9ssb/typechart.ts @@ -1,4 +1,4 @@ -export const TypeChart: {[k: string]: ModdedTypeData} = { +export const TypeChart: import('../../../sim/dex-data').ModdedTypeDataTable = { ground: { inherit: true, damageTaken: { diff --git a/data/mods/gennext/abilities.ts b/data/mods/gennext/abilities.ts index 497a80006104..d1d39969fe31 100644 --- a/data/mods/gennext/abilities.ts +++ b/data/mods/gennext/abilities.ts @@ -1,4 +1,4 @@ -export const Abilities: {[k: string]: ModdedAbilityData} = { +export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = { swiftswim: { inherit: true, onModifySpe(spe, pokemon) { diff --git a/data/mods/gennext/conditions.ts b/data/mods/gennext/conditions.ts index cba06a34a1a1..45375d2b14cc 100644 --- a/data/mods/gennext/conditions.ts +++ b/data/mods/gennext/conditions.ts @@ -1,4 +1,4 @@ -export const Conditions: {[k: string]: ModdedConditionData} = { +export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDataTable = { frz: { name: 'frz', effectType: 'Status', diff --git a/data/mods/gennext/formats-data.ts b/data/mods/gennext/formats-data.ts index b208a289c873..9d0f7c76481e 100644 --- a/data/mods/gennext/formats-data.ts +++ b/data/mods/gennext/formats-data.ts @@ -1,4 +1,4 @@ -export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { +export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormatsDataTable = { aegislash: { inherit: true, tier: "OU", diff --git a/data/mods/gennext/items.ts b/data/mods/gennext/items.ts index d6ac4b4e160d..0f854a74fb67 100644 --- a/data/mods/gennext/items.ts +++ b/data/mods/gennext/items.ts @@ -1,4 +1,4 @@ -export const Items: {[k: string]: ModdedItemData} = { +export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { burndrive: { inherit: true, onBasePower(basePower, user, target, move) {}, diff --git a/data/mods/gennext/moves.ts b/data/mods/gennext/moves.ts index 3741c0231d3b..d6704a2ddfc4 100644 --- a/data/mods/gennext/moves.ts +++ b/data/mods/gennext/moves.ts @@ -1,4 +1,4 @@ -export const Moves: {[k: string]: ModdedMoveData} = { +export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { /****************************************************************** Perfect accuracy moves: - base power increased to 90 diff --git a/data/mods/gennext/pokedex.ts b/data/mods/gennext/pokedex.ts index d04603358bc7..aa23f340d210 100644 --- a/data/mods/gennext/pokedex.ts +++ b/data/mods/gennext/pokedex.ts @@ -1,4 +1,4 @@ -export const Pokedex: {[k: string]: ModdedSpeciesData} = { +export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable = { genesectdouse: { inherit: true, types: ["Bug", "Water"], diff --git a/data/mods/mixandmega/items.ts b/data/mods/mixandmega/items.ts index 8d62a4bf520d..e4d3533f2753 100644 --- a/data/mods/mixandmega/items.ts +++ b/data/mods/mixandmega/items.ts @@ -1,4 +1,4 @@ -export const Items: {[k: string]: ModdedItemData} = { +export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { abomasite: { inherit: true, isNonstandard: null, diff --git a/data/mods/moderngen2/formats-data.ts b/data/mods/moderngen2/formats-data.ts index 787c08e5ecfc..8d12814b35d3 100644 --- a/data/mods/moderngen2/formats-data.ts +++ b/data/mods/moderngen2/formats-data.ts @@ -1,4 +1,4 @@ -export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { +export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormatsDataTable = { bulbasaur: { tier: "LC", }, diff --git a/data/mods/moderngen2/learnsets.ts b/data/mods/moderngen2/learnsets.ts index 01ecfee16d9e..1a94088d033a 100644 --- a/data/mods/moderngen2/learnsets.ts +++ b/data/mods/moderngen2/learnsets.ts @@ -1,4 +1,4 @@ -export const Learnsets: {[k: string]: ModdedLearnsetData} = { +export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTable = { missingno: { learnset: { blizzard: ["2L1"], @@ -122,12 +122,12 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { worryseed: ["2L1"], }, eventData: [ - {generation: 3, level: 70, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 5, level: 10, gender: "M", isHidden: true, moves: ["2L1"]}, - {generation: 5, level: 1, shiny: 1, ivs: {def: 31}, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 6, level: 5, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 5, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 70, pokeball: "pokeball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, + {generation: 5, level: 10, gender: "M", isHidden: true}, + {generation: 5, level: 1, shiny: 1, ivs: {def: 31}, pokeball: "pokeball"}, + {generation: 6, level: 5, pokeball: "cherishball"}, + {generation: 6, level: 5, isHidden: true, pokeball: "cherishball"}, ], encounters: [ {generation: 1, level: 5}, @@ -317,7 +317,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { worryseed: ["2L1"], }, eventData: [ - {generation: 6, level: 100, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 6, level: 100, isHidden: true, pokeball: "cherishball"}, ], }, charmander: { @@ -434,15 +434,15 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 4, level: 40, gender: "M", nature: "Mild", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 4, level: 40, gender: "M", nature: "Naive", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 4, level: 40, gender: "M", nature: "Naughty", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 10, gender: "M", isHidden: true, moves: ["2L1"]}, - {generation: 4, level: 40, gender: "M", nature: "Hardy", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 1, shiny: 1, ivs: {spe: 31}, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 6, level: 5, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 5, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, + {generation: 4, level: 40, gender: "M", nature: "Mild", pokeball: "cherishball"}, + {generation: 4, level: 40, gender: "M", nature: "Naive", pokeball: "cherishball"}, + {generation: 4, level: 40, gender: "M", nature: "Naughty", pokeball: "cherishball"}, + {generation: 5, level: 10, gender: "M", isHidden: true}, + {generation: 4, level: 40, gender: "M", nature: "Hardy", pokeball: "cherishball"}, + {generation: 5, level: 1, shiny: 1, ivs: {spe: 31}, pokeball: "pokeball"}, + {generation: 6, level: 5, pokeball: "cherishball"}, + {generation: 6, level: 5, isHidden: true, pokeball: "cherishball"}, ], encounters: [ {generation: 1, level: 5}, @@ -684,18 +684,18 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 3, level: 70, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 6, level: 36, gender: "M", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 36, gender: "M", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 36, shiny: true, gender: "M", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 100, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 36, gender: "M", nature: "Serious", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 40, nature: "Jolly", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 40, gender: "M", nature: "Jolly", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 40, gender: "M", nature: "Adamant", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 7, level: 50, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 50, gender: "M", nature: "Adamant", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 9, level: 50, nature: "Adamant", ivs: {hp: 20, atk: 31, def: 20, spa: 20, spd: 20, spe: 31}, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 70, pokeball: "pokeball"}, + {generation: 6, level: 36, gender: "M", pokeball: "cherishball"}, + {generation: 6, level: 36, gender: "M", pokeball: "cherishball"}, + {generation: 6, level: 36, shiny: true, gender: "M", pokeball: "cherishball"}, + {generation: 6, level: 100, isHidden: true, pokeball: "cherishball"}, + {generation: 6, level: 36, gender: "M", nature: "Serious", pokeball: "cherishball"}, + {generation: 7, level: 40, nature: "Jolly", pokeball: "cherishball"}, + {generation: 7, level: 40, gender: "M", nature: "Jolly", pokeball: "cherishball"}, + {generation: 7, level: 40, gender: "M", nature: "Adamant", pokeball: "pokeball"}, + {generation: 7, level: 50, pokeball: "cherishball"}, + {generation: 8, level: 50, gender: "M", nature: "Adamant", pokeball: "pokeball"}, + {generation: 9, level: 50, nature: "Adamant", ivs: {hp: 20, atk: 31, def: 20, spa: 20, spd: 20, spe: 31}, pokeball: "pokeball"}, ], }, squirtle: { @@ -811,11 +811,11 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 5, level: 10, gender: "M", isHidden: true, moves: ["2L1"]}, - {generation: 5, level: 1, shiny: 1, ivs: {hp: 31}, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 6, level: 5, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 5, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, + {generation: 5, level: 10, gender: "M", isHidden: true}, + {generation: 5, level: 1, shiny: 1, ivs: {hp: 31}, pokeball: "pokeball"}, + {generation: 6, level: 5, pokeball: "cherishball"}, + {generation: 6, level: 5, isHidden: true, pokeball: "cherishball"}, ], encounters: [ {generation: 1, level: 5}, @@ -1034,8 +1034,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 70, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 6, level: 100, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 70, pokeball: "pokeball"}, + {generation: 6, level: 100, isHidden: true, pokeball: "cherishball"}, ], }, caterpie: { @@ -1160,7 +1160,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { whirlwind: ["2L1"], }, eventData: [ - {generation: 3, level: 30, moves: ["2L1"]}, + {generation: 3, level: 30}, ], encounters: [ {generation: 2, level: 7}, @@ -1283,7 +1283,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { xscissor: ["2L1"], }, eventData: [ - {generation: 3, level: 30, moves: ["2L1"]}, + {generation: 3, level: 30}, ], encounters: [ {generation: 2, level: 7}, @@ -1428,7 +1428,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 3, level: 30, abilities: ["2L1"], moves: ["2L1"]}, + {generation: 3, level: 30}, ], encounters: [ {generation: 1, level: 9}, @@ -1504,7 +1504,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 5, level: 61, gender: "M", nature: "Naughty", ivs: {hp: 30, atk: 30, def: 30, spa: 30, spd: 30, spe: 30}, abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 61, gender: "M", nature: "Naughty", ivs: {hp: 30, atk: 30, def: 30, spa: 30, spd: 30, spe: 30}, pokeball: "cherishball"}, ], encounters: [ {generation: 7, level: 29}, @@ -1753,7 +1753,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 34, moves: ["2L1"]}, + {generation: 3, level: 34}, ], encounters: [ {generation: 1, level: 15}, @@ -1902,7 +1902,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 7, level: 20, perfectIVs: 3, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 7, level: 20, perfectIVs: 3, pokeball: "pokeball"}, ], eventOnly: false, }, @@ -1979,7 +1979,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 3, level: 22, moves: ["2L1"]}, + {generation: 3, level: 22}, ], encounters: [ {generation: 1, level: 3}, @@ -2163,8 +2163,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wrap: ["2L1"], }, eventData: [ - {generation: 3, level: 14, gender: "F", nature: "Docile", ivs: {hp: 26, atk: 28, def: 6, spa: 14, spd: 30, spe: 11}, abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 14, gender: "F", nature: "Docile", ivs: {hp: 26, atk: 28, def: 6, spa: 14, spd: 30, spe: 11}, pokeball: "pokeball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, ], encounters: [ {generation: 1, level: 6}, @@ -2275,7 +2275,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wrap: ["2L1"], }, eventData: [ - {generation: 3, level: 33, moves: ["2L1"]}, + {generation: 3, level: 33}, ], encounters: [ {generation: 2, level: 10}, @@ -2373,13 +2373,13 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zapcannon: ["2L1"], }, eventData: [ - {generation: 3, level: 5, shiny: 1, moves: ["2L1"], pokeball: "pokeball", emeraldEventEgg: true}, - {generation: 3, level: 5, shiny: 1, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: 1, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: 1, moves: ["2L1"], pokeball: "pokeball", emeraldEventEgg: true}, - {generation: 4, level: 1, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 4, level: 30, shiny: true, gender: "M", nature: "Jolly", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 9, level: 30, shiny: true, gender: "M", nature: "Jolly", moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 5, shiny: 1, pokeball: "pokeball", emeraldEventEgg: true}, + {generation: 3, level: 5, shiny: 1, pokeball: "pokeball"}, + {generation: 3, level: 5, shiny: 1, pokeball: "pokeball"}, + {generation: 3, level: 5, shiny: 1, pokeball: "pokeball", emeraldEventEgg: true}, + {generation: 4, level: 1, pokeball: "pokeball"}, + {generation: 4, level: 30, shiny: true, gender: "M", nature: "Jolly", pokeball: "cherishball"}, + {generation: 9, level: 30, shiny: true, gender: "M", nature: "Jolly", pokeball: "cherishball"}, ], }, pichuspikyeared: { @@ -2429,7 +2429,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { volttackle: ["2L1"], }, eventData: [ - {generation: 4, level: 30, gender: "F", nature: "Naughty", moves: ["2L1"], pokeball: "pokeball"}, + {generation: 4, level: 30, gender: "F", nature: "Naughty", pokeball: "pokeball"}, ], eventOnly: false, }, @@ -2558,62 +2558,62 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zapcannon: ["2L1"], }, eventData: [ - {generation: 3, level: 50, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 10, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 10, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 5, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 10, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 10, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 70, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 70, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 70, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 4, level: 10, gender: "F", nature: "Hardy", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 4, level: 50, gender: "M", nature: "Hardy", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 4, level: 20, gender: "F", nature: "Bashful", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 4, level: 20, gender: "M", nature: "Jolly", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 4, level: 40, gender: "M", nature: "Modest", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 4, level: 20, gender: "F", nature: "Bashful", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 4, level: 40, gender: "M", nature: "Mild", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 4, level: 20, gender: "F", nature: "Bashful", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 4, level: 30, gender: "M", nature: "Naughty", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 4, level: 50, gender: "M", nature: "Relaxed", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 4, level: 20, gender: "M", nature: "Docile", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 4, level: 50, gender: "M", nature: "Naughty", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 4, level: 20, gender: "M", nature: "Bashful", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 30, gender: "F", isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 50, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 100, shiny: 1, gender: "F", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 50, shiny: 1, gender: "F", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 50, gender: "F", nature: "Timid", isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 10, gender: "M", isHidden: true, moves: ["2L1"]}, - {generation: 5, level: 100, gender: "M", isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 50, gender: "M", nature: "Brave", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 10, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 22, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 10, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 10, gender: "F", moves: ["2L1"], pokeball: "healball"}, - {generation: 6, level: 36, shiny: true, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 10, gender: "F", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 50, gender: "M", nature: "Naughty", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 10, shiny: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 10, perfectIVs: 2, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 99, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 10, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 10, moves: ["2L1"], pokeball: "healball"}, - {generation: 7, level: 10, nature: "Jolly", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 10, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 10, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 10, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 40, shiny: 1, perfectIVs: 3, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 7, level: 5, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 10, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 5, gender: "M", nature: "Serious", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 21, gender: "M", nature: "Brave", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 25, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 9, level: 5, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 9, level: 100, gender: "M", nature: "Quiet", perfectIVs: 6, isHidden: true, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 9, level: 25, gender: "M", ivs: {hp: 25, atk: 25, def: 25, spa: 25, spd: 25, spe: 25}, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 50, pokeball: "pokeball"}, + {generation: 3, level: 10, pokeball: "pokeball"}, + {generation: 3, level: 10, pokeball: "pokeball"}, + {generation: 3, level: 5, pokeball: "pokeball"}, + {generation: 3, level: 10, pokeball: "pokeball"}, + {generation: 3, level: 10, pokeball: "pokeball"}, + {generation: 3, level: 70, pokeball: "pokeball"}, + {generation: 3, level: 70, pokeball: "pokeball"}, + {generation: 3, level: 70, pokeball: "pokeball"}, + {generation: 4, level: 10, gender: "F", nature: "Hardy", pokeball: "pokeball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, + {generation: 4, level: 50, gender: "M", nature: "Hardy", pokeball: "cherishball"}, + {generation: 4, level: 20, gender: "F", nature: "Bashful", pokeball: "cherishball"}, + {generation: 4, level: 20, gender: "M", nature: "Jolly", pokeball: "pokeball"}, + {generation: 4, level: 40, gender: "M", nature: "Modest", pokeball: "cherishball"}, + {generation: 4, level: 20, gender: "F", nature: "Bashful", pokeball: "cherishball"}, + {generation: 4, level: 40, gender: "M", nature: "Mild", pokeball: "cherishball"}, + {generation: 4, level: 20, gender: "F", nature: "Bashful", pokeball: "cherishball"}, + {generation: 4, level: 30, gender: "M", nature: "Naughty", pokeball: "cherishball"}, + {generation: 4, level: 50, gender: "M", nature: "Relaxed", pokeball: "cherishball"}, + {generation: 4, level: 20, gender: "M", nature: "Docile", pokeball: "cherishball"}, + {generation: 4, level: 50, gender: "M", nature: "Naughty", pokeball: "cherishball"}, + {generation: 4, level: 20, gender: "M", nature: "Bashful", pokeball: "cherishball"}, + {generation: 5, level: 30, gender: "F", isHidden: true, pokeball: "cherishball"}, + {generation: 5, level: 50, pokeball: "cherishball"}, + {generation: 5, level: 100, shiny: 1, gender: "F", pokeball: "cherishball"}, + {generation: 5, level: 50, shiny: 1, gender: "F", pokeball: "cherishball"}, + {generation: 5, level: 50, gender: "F", nature: "Timid", isHidden: true, pokeball: "cherishball"}, + {generation: 5, level: 10, gender: "M", isHidden: true}, + {generation: 5, level: 100, gender: "M", isHidden: true, pokeball: "cherishball"}, + {generation: 5, level: 50, gender: "M", nature: "Brave", pokeball: "cherishball"}, + {generation: 6, level: 10, pokeball: "cherishball"}, + {generation: 6, level: 22, pokeball: "cherishball"}, + {generation: 6, level: 10, pokeball: "cherishball"}, + {generation: 6, level: 10, gender: "F", pokeball: "healball"}, + {generation: 6, level: 36, shiny: true, isHidden: true, pokeball: "cherishball"}, + {generation: 6, level: 10, gender: "F", pokeball: "cherishball"}, + {generation: 6, level: 50, gender: "M", nature: "Naughty", pokeball: "cherishball"}, + {generation: 6, level: 10, shiny: true, pokeball: "cherishball"}, + {generation: 6, level: 10, perfectIVs: 2, isHidden: true, pokeball: "cherishball"}, + {generation: 6, level: 99, pokeball: "cherishball"}, + {generation: 6, level: 10, pokeball: "cherishball"}, + {generation: 6, level: 10, pokeball: "healball"}, + {generation: 7, level: 10, nature: "Jolly", pokeball: "cherishball"}, + {generation: 7, level: 10, pokeball: "cherishball"}, + {generation: 7, level: 10, pokeball: "cherishball"}, + {generation: 7, level: 10, pokeball: "cherishball"}, + {generation: 7, level: 40, shiny: 1, perfectIVs: 3, pokeball: "pokeball"}, + {generation: 7, level: 5, pokeball: "cherishball"}, + {generation: 7, level: 10, pokeball: "cherishball"}, + {generation: 8, level: 5, gender: "M", nature: "Serious", pokeball: "cherishball"}, + {generation: 8, level: 21, gender: "M", nature: "Brave", pokeball: "cherishball"}, + {generation: 8, level: 25, isHidden: true, pokeball: "cherishball"}, + {generation: 9, level: 5, pokeball: "pokeball"}, + {generation: 9, level: 100, gender: "M", nature: "Quiet", perfectIVs: 6, isHidden: true, pokeball: "pokeball"}, + {generation: 9, level: 25, gender: "M", ivs: {hp: 25, atk: 25, def: 25, spa: 25, spd: 25, spe: 25}, pokeball: "cherishball"}, ], encounters: [ {generation: 1, level: 3}, @@ -2679,7 +2679,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wildcharge: ["2L1"], }, eventData: [ - {generation: 6, level: 20, perfectIVs: 3, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 6, level: 20, perfectIVs: 3, pokeball: "pokeball"}, ], eventOnly: false, }, @@ -2803,8 +2803,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wish: ["2L1"], }, eventData: [ - {generation: 7, level: 1, nature: "Hardy", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 8, level: 25, nature: "Hardy", isHidden: true, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 7, level: 1, nature: "Hardy", pokeball: "pokeball"}, + {generation: 8, level: 25, nature: "Hardy", isHidden: true, pokeball: "pokeball"}, ], eventOnly: false, }, @@ -2898,8 +2898,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wish: ["2L1"], }, eventData: [ - {generation: 7, level: 6, nature: "Hardy", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 8, level: 25, nature: "Hardy", isHidden: true, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 7, level: 6, nature: "Hardy", pokeball: "pokeball"}, + {generation: 8, level: 25, nature: "Hardy", isHidden: true, pokeball: "pokeball"}, ], eventOnly: false, }, @@ -2993,8 +2993,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wish: ["2L1"], }, eventData: [ - {generation: 7, level: 10, nature: "Hardy", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 8, level: 25, nature: "Hardy", isHidden: true, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 7, level: 10, nature: "Hardy", pokeball: "pokeball"}, + {generation: 8, level: 25, nature: "Hardy", isHidden: true, pokeball: "pokeball"}, ], eventOnly: false, }, @@ -3088,8 +3088,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wish: ["2L1"], }, eventData: [ - {generation: 7, level: 14, nature: "Hardy", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 8, level: 25, nature: "Hardy", isHidden: true, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 7, level: 14, nature: "Hardy", pokeball: "pokeball"}, + {generation: 8, level: 25, nature: "Hardy", isHidden: true, pokeball: "pokeball"}, ], eventOnly: false, }, @@ -3183,8 +3183,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wish: ["2L1"], }, eventData: [ - {generation: 7, level: 17, nature: "Hardy", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 8, level: 25, nature: "Hardy", isHidden: true, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 7, level: 17, nature: "Hardy", pokeball: "pokeball"}, + {generation: 8, level: 25, nature: "Hardy", isHidden: true, pokeball: "pokeball"}, ], eventOnly: false, }, @@ -3278,8 +3278,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wish: ["2L1"], }, eventData: [ - {generation: 7, level: 20, nature: "Hardy", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 8, level: 25, nature: "Hardy", isHidden: true, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 7, level: 20, nature: "Hardy", pokeball: "pokeball"}, + {generation: 8, level: 25, nature: "Hardy", isHidden: true, pokeball: "pokeball"}, ], eventOnly: false, }, @@ -3373,8 +3373,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wish: ["2L1"], }, eventData: [ - {generation: 7, level: 21, shiny: 1, nature: "Hardy", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 8, level: 25, nature: "Hardy", isHidden: true, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 7, level: 21, shiny: 1, nature: "Hardy", pokeball: "pokeball"}, + {generation: 8, level: 25, nature: "Hardy", isHidden: true, pokeball: "pokeball"}, ], eventOnly: false, }, @@ -3413,7 +3413,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zippyzap: ["2L1"], }, eventData: [ - {generation: 7, level: 5, perfectIVs: 6, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 7, level: 5, perfectIVs: 6, pokeball: "pokeball"}, ], eventOnly: false, }, @@ -3490,8 +3490,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wish: ["2L1"], }, eventData: [ - {generation: 8, level: 25, nature: "Hardy", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 8, level: 80, nature: "Hardy", ivs: {hp: 31, atk: 30, def: 30, spa: 31, spd: 30, spe: 31}, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 8, level: 25, nature: "Hardy", pokeball: "pokeball"}, + {generation: 8, level: 80, nature: "Hardy", ivs: {hp: 31, atk: 30, def: 30, spa: 31, spd: 30, spe: 31}, pokeball: "pokeball"}, ], eventOnly: false, }, @@ -3818,7 +3818,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { xscissor: ["2L1"], }, eventData: [ - {generation: 3, level: 12, gender: "M", nature: "Docile", ivs: {hp: 4, atk: 23, def: 8, spa: 31, spd: 1, spe: 25}, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 12, gender: "M", nature: "Docile", ivs: {hp: 4, atk: 23, def: 8, spa: 31, spd: 1, spe: 25}, pokeball: "pokeball"}, ], encounters: [ {generation: 1, level: 6}, @@ -3919,7 +3919,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { xscissor: ["2L1"], }, eventData: [ - {generation: 7, level: 10, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 7, level: 10, pokeball: "cherishball"}, ], }, sandslash: { @@ -4436,7 +4436,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { whirlpool: ["2L1"], }, eventData: [ - {generation: 6, level: 41, perfectIVs: 2, abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 6, level: 41, perfectIVs: 2, pokeball: "cherishball"}, ], }, nidoranm: { @@ -4747,7 +4747,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { whirlpool: ["2L1"], }, eventData: [ - {generation: 7, level: 68, abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 7, level: 68, pokeball: "cherishball"}, ], }, cleffa: { @@ -5017,8 +5017,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 8, level: 50, gender: "F", shiny: true, nature: "Bold", isHidden: true, ivs: {hp: 31, atk: 0, def: 31, spa: 31, spd: 31, spe: 31}, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 15, gender: "M", nature: "Modest", abilities: ["2L1"], moves: ["2L1"], pokeball: "moonball"}, + {generation: 8, level: 50, gender: "F", shiny: true, nature: "Bold", isHidden: true, ivs: {hp: 31, atk: 0, def: 31, spa: 31, spd: 31, spe: 31}, pokeball: "cherishball"}, + {generation: 8, level: 15, gender: "M", nature: "Modest", pokeball: "moonball"}, ], encounters: [ {generation: 1, level: 8}, @@ -5275,8 +5275,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 18, gender: "F", nature: "Quirky", ivs: {hp: 15, atk: 6, def: 3, spa: 25, spd: 13, spe: 22}, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 18, moves: ["2L1"]}, + {generation: 3, level: 18, gender: "F", nature: "Quirky", ivs: {hp: 15, atk: 6, def: 3, spa: 25, spd: 13, spe: 22}, pokeball: "pokeball"}, + {generation: 3, level: 18}, ], encounters: [ {generation: 1, level: 18}, @@ -5373,8 +5373,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 7, level: 10, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 10, gender: "F", nature: "Modest", moves: ["2L1"], pokeball: "cherishball"}, + {generation: 7, level: 10, pokeball: "cherishball"}, + {generation: 7, level: 10, gender: "F", nature: "Modest", pokeball: "cherishball"}, ], }, ninetales: { @@ -5473,7 +5473,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 5, level: 50, gender: "M", nature: "Bold", ivs: {def: 31}, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 50, gender: "M", nature: "Bold", ivs: {def: 31}, isHidden: true, pokeball: "cherishball"}, ], }, ninetalesalola: { @@ -5670,7 +5670,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zapcannon: ["2L1"], }, eventData: [ - {generation: 3, level: 5, shiny: 1, abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball", emeraldEventEgg: true}, + {generation: 3, level: 5, shiny: 1, pokeball: "pokeball", emeraldEventEgg: true}, ], }, jigglypuff: { @@ -6255,8 +6255,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 4, level: 30, gender: "M", nature: "Timid", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 64, gender: "M", moves: ["2L1"], pokeball: "cherishball"}, + {generation: 4, level: 30, gender: "M", nature: "Timid", pokeball: "cherishball"}, + {generation: 7, level: 64, gender: "M", pokeball: "cherishball"}, ], }, oddish: { @@ -6337,8 +6337,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { worryseed: ["2L1"], }, eventData: [ - {generation: 3, level: 26, gender: "M", nature: "Quirky", ivs: {hp: 23, atk: 24, def: 20, spa: 21, spd: 9, spe: 16}, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: 1, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 26, gender: "M", nature: "Quirky", ivs: {hp: 23, atk: 24, def: 20, spa: 21, spd: 9, spe: 16}, pokeball: "pokeball"}, + {generation: 3, level: 5, shiny: 1, pokeball: "pokeball"}, ], encounters: [ {generation: 1, level: 12}, @@ -6420,7 +6420,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { worryseed: ["2L1"], }, eventData: [ - {generation: 3, level: 50, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 50, pokeball: "pokeball"}, ], encounters: [ {generation: 2, level: 14}, @@ -6685,7 +6685,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { xscissor: ["2L1"], }, eventData: [ - {generation: 3, level: 28, abilities: ["2L1"], moves: ["2L1"]}, + {generation: 3, level: 28}, ], encounters: [ {generation: 1, level: 8}, @@ -6957,7 +6957,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 32, abilities: ["2L1"], moves: ["2L1"]}, + {generation: 3, level: 32}, ], encounters: [ {generation: 1, level: 30}, @@ -7138,7 +7138,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 7, level: 10, abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 7, level: 10, pokeball: "cherishball"}, ], }, dugtrio: { @@ -7230,7 +7230,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 3, level: 40, moves: ["2L1"]}, + {generation: 3, level: 40}, ], encounters: [ {generation: 1, level: 15}, @@ -7440,18 +7440,18 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zapcannon: ["2L1"], }, eventData: [ - {generation: 3, level: 5, shiny: 1, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 5, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 22, moves: ["2L1"]}, - {generation: 4, level: 21, gender: "F", nature: "Jolly", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, - {generation: 4, level: 10, gender: "M", nature: "Jolly", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 15, gender: "M", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 20, abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 5, shiny: 1, pokeball: "pokeball"}, + {generation: 3, level: 5, pokeball: "pokeball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, + {generation: 3, level: 22}, + {generation: 4, level: 21, gender: "F", nature: "Jolly", pokeball: "cherishball"}, + {generation: 4, level: 10, gender: "M", nature: "Jolly", pokeball: "cherishball"}, + {generation: 5, level: 15, gender: "M", pokeball: "cherishball"}, + {generation: 6, level: 20, pokeball: "cherishball"}, ], encounters: [ {generation: 1, level: 10}, - {generation: 3, level: 3, gender: "M", nature: "Naive", ivs: {hp: 4, atk: 5, def: 4, spa: 5, spd: 4, spe: 4}, abilities: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 3, gender: "M", nature: "Naive", ivs: {hp: 4, atk: 5, def: 4, spa: 5, spd: 4, spe: 4}, pokeball: "pokeball"}, ], }, meowthalola: { @@ -7632,7 +7632,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { xscissor: ["2L1"], }, eventData: [ - {generation: 8, level: 15, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 8, level: 15, isHidden: true, pokeball: "cherishball"}, ], }, persian: { @@ -8062,8 +8062,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 27, gender: "M", nature: "Lax", ivs: {hp: 31, atk: 16, def: 12, spa: 29, spd: 31, spe: 14}, abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: 1, moves: ["2L1"], pokeball: "pokeball", emeraldEventEgg: true}, + {generation: 3, level: 27, gender: "M", nature: "Lax", ivs: {hp: 31, atk: 16, def: 12, spa: 29, spd: 31, spe: 14}, pokeball: "pokeball"}, + {generation: 3, level: 5, shiny: 1, pokeball: "pokeball", emeraldEventEgg: true}, ], encounters: [ {generation: 1, level: 15}, @@ -8195,8 +8195,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 33, moves: ["2L1"]}, - {generation: 7, level: 50, gender: "M", nature: "Timid", ivs: {hp: 31, atk: 30, def: 31, spa: 31, spd: 31, spe: 31}, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 33}, + {generation: 7, level: 50, gender: "M", nature: "Timid", ivs: {hp: 31, atk: 30, def: 31, spa: 31, spd: 31, spe: 31}, isHidden: true, pokeball: "cherishball"}, ], encounters: [ {generation: 1, level: 15}, @@ -8450,7 +8450,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 3, level: 34, abilities: ["2L1"], moves: ["2L1"]}, + {generation: 3, level: 34}, ], encounters: [ {generation: 2, level: 15}, @@ -8624,9 +8624,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { willowisp: ["2L1"], }, eventData: [ - {generation: 3, level: 32, gender: "F", nature: "Quiet", ivs: {hp: 11, atk: 24, def: 28, spa: 1, spd: 20, spe: 2}, abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 28, moves: ["2L1"]}, + {generation: 3, level: 32, gender: "F", nature: "Quiet", ivs: {hp: 11, atk: 24, def: 28, spa: 1, spd: 20, spe: 2}, pokeball: "pokeball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, + {generation: 3, level: 28}, ], encounters: [ {generation: 1, level: 15}, @@ -8690,7 +8690,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { willowisp: ["2L1"], }, eventData: [ - {generation: 9, level: 15, isHidden: true, nature: "Jolly", ivs: {hp: 31, atk: 31, def: 20, spa: 20, spd: 20, spe: 31}, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 9, level: 15, isHidden: true, nature: "Jolly", ivs: {hp: 31, atk: 31, def: 20, spa: 20, spd: 20, spe: 31}, pokeball: "pokeball"}, ], }, arcanine: { @@ -8787,9 +8787,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { willowisp: ["2L1"], }, eventData: [ - {generation: 4, level: 50, abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 50, abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, - {generation: 9, level: 50, shiny: true, gender: "F", nature: "Adamant", abilities: ["2L1"], ivs: {hp: 31, atk: 31, def: 31, spa: 8, spd: 31, spe: 31}, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 4, level: 50, pokeball: "cherishball"}, + {generation: 7, level: 50, pokeball: "cherishball"}, + {generation: 9, level: 50, shiny: true, gender: "F", nature: "Adamant", ivs: {hp: 31, atk: 31, def: 31, spa: 8, spd: 31, spe: 31}, pokeball: "cherishball"}, ], }, arcaninehisui: { @@ -8941,7 +8941,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { whirlpool: ["2L1"], }, eventData: [ - {generation: 3, level: 5, shiny: 1, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 5, shiny: 1, pokeball: "pokeball"}, ], encounters: [ {generation: 1, level: 5}, @@ -9046,7 +9046,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { {generation: 3, level: 20}, {generation: 4, level: 10}, {generation: 7, level: 24}, - {generation: 7, level: 22, gender: "F", nature: "Naughty", abilities: ["2L1"], pokeball: "pokeball"}, + {generation: 7, level: 22, gender: "F", nature: "Naughty", pokeball: "pokeball"}, ], }, poliwrath: { @@ -9168,7 +9168,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 3, level: 42, moves: ["2L1"]}, + {generation: 3, level: 42}, ], }, politoed: { @@ -9265,7 +9265,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { whirlpool: ["2L1"], }, eventData: [ - {generation: 5, level: 50, gender: "M", nature: "Calm", ivs: {hp: 31, atk: 13, def: 31, spa: 5, spd: 31, spe: 5}, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 50, gender: "M", nature: "Calm", ivs: {hp: 31, atk: 13, def: 31, spa: 5, spd: 31, spe: 5}, isHidden: true, pokeball: "cherishball"}, ], }, abra: { @@ -9596,7 +9596,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 70, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 70, pokeball: "pokeball"}, ], }, machop: { @@ -9796,7 +9796,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 5, level: 30, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 30, pokeball: "cherishball"}, ], encounters: [ {generation: 2, level: 14}, @@ -9908,10 +9908,10 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 3, level: 38, gender: "M", nature: "Quiet", ivs: {hp: 9, atk: 23, def: 25, spa: 20, spd: 15, spe: 10}, abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, - {generation: 6, level: 50, shiny: true, gender: "M", nature: "Adamant", ivs: {hp: 31, atk: 31, def: 31, spa: 31, spd: 31, spe: 31}, abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 39, gender: "M", nature: "Hardy", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 34, gender: "F", nature: "Brave", ivs: {atk: 31}, abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 38, gender: "M", nature: "Quiet", ivs: {hp: 9, atk: 23, def: 25, spa: 20, spd: 15, spe: 10}, pokeball: "pokeball"}, + {generation: 6, level: 50, shiny: true, gender: "M", nature: "Adamant", ivs: {hp: 31, atk: 31, def: 31, spa: 31, spd: 31, spe: 31}, pokeball: "cherishball"}, + {generation: 6, level: 39, gender: "M", nature: "Hardy", pokeball: "cherishball"}, + {generation: 7, level: 34, gender: "F", nature: "Brave", ivs: {atk: 31}, pokeball: "cherishball"}, ], encounters: [ {generation: 1, level: 16}, @@ -10003,8 +10003,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wringout: ["2L1"], }, eventData: [ - {generation: 3, level: 5, shiny: 1, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 5, shiny: 1, pokeball: "pokeball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, ], encounters: [ {generation: 1, level: 12}, @@ -10094,7 +10094,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wringout: ["2L1"], }, eventData: [ - {generation: 3, level: 32, moves: ["2L1"]}, + {generation: 3, level: 32}, ], encounters: [ {generation: 2, level: 12}, @@ -11063,7 +11063,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 8, level: 15, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 8, level: 15, isHidden: true, pokeball: "cherishball"}, ], }, rapidash: { @@ -11147,7 +11147,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { willowisp: ["2L1"], }, eventData: [ - {generation: 3, level: 40, moves: ["2L1"]}, + {generation: 3, level: 40}, ], encounters: [ {generation: 2, level: 14, gender: "M"}, @@ -11331,9 +11331,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 31, gender: "F", nature: "Naive", ivs: {hp: 17, atk: 11, def: 19, spa: 20, spd: 5, spe: 10}, abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 5, level: 30, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 31, gender: "F", nature: "Naive", ivs: {hp: 17, atk: 11, def: 19, spa: 20, spd: 5, spe: 10}, pokeball: "pokeball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, + {generation: 5, level: 30, pokeball: "cherishball"}, ], encounters: [ {generation: 1, level: 15}, @@ -11560,7 +11560,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 6, level: 100, nature: "Quiet", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 6, level: 100, nature: "Quiet", pokeball: "cherishball"}, ], encounters: [ {generation: 1, level: 15}, @@ -12100,7 +12100,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zapcannon: ["2L1"], }, eventData: [ - {generation: 3, level: 30, moves: ["2L1"]}, + {generation: 3, level: 30}, ], encounters: [ {generation: 2, level: 5}, @@ -12294,12 +12294,12 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { yawn: ["2L1"], }, eventData: [ - {generation: 3, level: 5, shiny: 1, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 36, moves: ["2L1"]}, + {generation: 3, level: 5, shiny: 1, pokeball: "pokeball"}, + {generation: 3, level: 36}, ], encounters: [ {generation: 1, level: 3}, - {generation: 3, level: 3, gender: "M", nature: "Adamant", ivs: {hp: 20, atk: 25, def: 21, spa: 24, spd: 15, spe: 20}, abilities: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 3, gender: "M", nature: "Adamant", ivs: {hp: 20, atk: 25, def: 21, spa: 24, spd: 15, spe: 20}, pokeball: "pokeball"}, ], }, farfetchdgalar: { @@ -12404,7 +12404,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 8, level: 80, gender: "M", nature: "Brave", abilities: ["2L1"], ivs: {hp: 30, atk: 31, def: 31, spa: 30, spd: 30, spe: 31}, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 8, level: 80, gender: "M", nature: "Brave", ivs: {hp: 30, atk: 31, def: 31, spa: 30, spd: 30, spe: 31}, pokeball: "pokeball"}, ], }, doduo: { @@ -12577,14 +12577,14 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 3, level: 34, moves: ["2L1"]}, + {generation: 3, level: 34}, ], encounters: [ {generation: 1, level: 29}, {generation: 2, level: 10, gender: "F"}, {generation: 2, level: 30}, {generation: 3, level: 29, pokeball: "safariball"}, - {generation: 4, level: 15, gender: "F", nature: "Impish", ivs: {hp: 20, atk: 20, def: 20, spa: 15, spd: 15, spe: 15}, abilities: ["2L1"], pokeball: "pokeball"}, + {generation: 4, level: 15, gender: "F", nature: "Impish", ivs: {hp: 20, atk: 20, def: 20, spa: 15, spd: 15, spe: 15}, pokeball: "pokeball"}, ], }, seel: { @@ -12678,7 +12678,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { whirlpool: ["2L1"], }, eventData: [ - {generation: 3, level: 23, abilities: ["2L1"], moves: ["2L1"]}, + {generation: 3, level: 23}, ], encounters: [ {generation: 1, level: 22}, @@ -12877,7 +12877,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 23, moves: ["2L1"]}, + {generation: 3, level: 23}, ], encounters: [ {generation: 1, level: 23}, @@ -12985,7 +12985,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 7, level: 10, abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 7, level: 10, pokeball: "cherishball"}, ], }, muk: { @@ -13284,9 +13284,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { withdraw: ["2L1"], }, eventData: [ - {generation: 3, level: 24, gender: "F", nature: "Brave", ivs: {hp: 5, atk: 19, def: 18, spa: 5, spd: 11, spe: 13}, abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 10, gender: "M", abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 29, abilities: ["2L1"], moves: ["2L1"]}, + {generation: 3, level: 24, gender: "F", nature: "Brave", ivs: {hp: 5, atk: 19, def: 18, spa: 5, spd: 11, spe: 13}, pokeball: "pokeball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, + {generation: 3, level: 29}, ], encounters: [ {generation: 1, level: 10}, @@ -13384,7 +13384,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { withdraw: ["2L1"], }, eventData: [ - {generation: 5, level: 30, gender: "M", nature: "Naughty", abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, + {generation: 5, level: 30, gender: "M", nature: "Naughty", pokeball: "pokeball"}, ], }, gastly: { @@ -13592,7 +13592,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zapcannon: ["2L1"], }, eventData: [ - {generation: 5, level: 30, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 30, pokeball: "cherishball"}, ], encounters: [ {generation: 1, level: 20}, @@ -13729,14 +13729,14 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zapcannon: ["2L1"], }, eventData: [ - {generation: 3, level: 23, gender: "F", nature: "Hardy", ivs: {hp: 19, atk: 14, def: 0, spa: 14, spd: 17, spe: 27}, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 6, level: 25, nature: "Timid", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 25, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 50, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 25, shiny: true, moves: ["2L1"], pokeball: "duskball"}, - {generation: 6, level: 50, shiny: true, gender: "M", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 80, gender: "M", nature: "Naughty", abilities: ["2L1"], ivs: {hp: 30, atk: 30, def: 30, spa: 31, spd: 31, spe: 31}, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 23, gender: "F", nature: "Hardy", ivs: {hp: 19, atk: 14, def: 0, spa: 14, spd: 17, spe: 27}, pokeball: "pokeball"}, + {generation: 6, level: 25, nature: "Timid", pokeball: "cherishball"}, + {generation: 6, level: 25, pokeball: "cherishball"}, + {generation: 6, level: 50, pokeball: "cherishball"}, + {generation: 6, level: 25, shiny: true, pokeball: "duskball"}, + {generation: 6, level: 50, shiny: true, gender: "M", pokeball: "cherishball"}, + {generation: 6, level: 100, pokeball: "cherishball"}, + {generation: 8, level: 80, gender: "M", nature: "Naughty", ivs: {hp: 30, atk: 30, def: 30, spa: 31, spd: 31, spe: 31}, pokeball: "pokeball"}, ], }, onix: { @@ -14055,7 +14055,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 5, shiny: 1, abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 5, shiny: 1, pokeball: "pokeball"}, ], encounters: [ {generation: 1, level: 9}, @@ -14182,7 +14182,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 34, abilities: ["2L1"], moves: ["2L1"]}, + {generation: 3, level: 34}, ], encounters: [ {generation: 2, level: 16}, @@ -14444,7 +14444,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zapcannon: ["2L1"], }, eventData: [ - {generation: 3, level: 19, moves: ["2L1"]}, + {generation: 3, level: 19}, ], encounters: [ {generation: 1, level: 14}, @@ -14581,7 +14581,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { encounters: [ {generation: 1, level: 3}, {generation: 2, level: 23}, - {generation: 3, level: 3, nature: "Hasty", ivs: {hp: 19, atk: 16, def: 18, spa: 25, spd: 25, spe: 19}, abilities: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 3, nature: "Hasty", ivs: {hp: 19, atk: 16, def: 18, spa: 25, spd: 25, spe: 19}, pokeball: "pokeball"}, {generation: 4, level: 23}, ], }, @@ -14733,7 +14733,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 5, shiny: 1, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 5, shiny: 1, pokeball: "pokeball"}, ], encounters: [ {generation: 1, level: 20}, @@ -14856,7 +14856,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 46, moves: ["2L1"]}, + {generation: 3, level: 46}, ], }, exeggutoralola: { @@ -14963,7 +14963,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 7, level: 50, gender: "M", nature: "Modest", isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 7, level: 50, gender: "M", nature: "Modest", isHidden: true, pokeball: "cherishball"}, ], }, cubone: { @@ -15172,7 +15172,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { watergun: ["2L1"], }, eventData: [ - {generation: 3, level: 44, moves: ["2L1"]}, + {generation: 3, level: 44}, ], encounters: [ {generation: 1, level: 24}, @@ -15364,7 +15364,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { willowisp: ["2L1"], }, eventData: [ - {generation: 7, level: 25, perfectIVs: 3, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 7, level: 25, perfectIVs: 3, pokeball: "pokeball"}, ], eventOnly: false, }, @@ -15542,7 +15542,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 3, level: 38, abilities: ["2L1"], moves: ["2L1"]}, + {generation: 3, level: 38}, ], encounters: [ {generation: 1, level: 30}, @@ -15653,7 +15653,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 3, level: 38, abilities: ["2L1"], moves: ["2L1"]}, + {generation: 3, level: 38}, ], encounters: [ {generation: 1, level: 30}, @@ -15749,7 +15749,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 5, level: 55, gender: "M", nature: "Adamant", abilities: ["2L1"], moves: ["2L1"]}, + {generation: 5, level: 55, gender: "M", nature: "Adamant"}, ], }, lickitung: { @@ -15874,8 +15874,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 5, shiny: 1, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 38, moves: ["2L1"]}, + {generation: 3, level: 5, shiny: 1, pokeball: "pokeball"}, + {generation: 3, level: 38}, ], encounters: [ {generation: 1, level: 15}, @@ -16485,7 +16485,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zapcannon: ["2L1"], }, eventData: [ - {generation: 3, level: 46, moves: ["2L1"]}, + {generation: 3, level: 46}, ], encounters: [ {generation: 1, level: 15}, @@ -16846,10 +16846,10 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 5, shiny: 1, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 10, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 39, moves: ["2L1"]}, - {generation: 8, level: 7, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 5, shiny: 1, pokeball: "pokeball"}, + {generation: 3, level: 10, pokeball: "pokeball"}, + {generation: 3, level: 39}, + {generation: 8, level: 7, pokeball: "cherishball"}, ], encounters: [ {generation: 1, level: 7}, @@ -16991,7 +16991,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 5, level: 10, isHidden: true, moves: ["2L1"]}, + {generation: 5, level: 10, isHidden: true}, ], }, tangela: { @@ -17078,7 +17078,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wringout: ["2L1"], }, eventData: [ - {generation: 3, level: 30, abilities: ["2L1"], moves: ["2L1"]}, + {generation: 3, level: 30}, ], encounters: [ {generation: 1, level: 13}, @@ -17171,7 +17171,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wringout: ["2L1"], }, eventData: [ - {generation: 4, level: 50, gender: "M", nature: "Brave", moves: ["2L1"], pokeball: "cherishball"}, + {generation: 4, level: 50, gender: "M", nature: "Brave", pokeball: "cherishball"}, ], }, kangaskhan: { @@ -17302,10 +17302,10 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zapcannon: ["2L1"], }, eventData: [ - {generation: 3, level: 5, shiny: 1, abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 10, abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 35, abilities: ["2L1"], moves: ["2L1"]}, - {generation: 6, level: 50, abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 5, shiny: 1, pokeball: "pokeball"}, + {generation: 3, level: 10, pokeball: "pokeball"}, + {generation: 3, level: 35}, + {generation: 6, level: 50, pokeball: "cherishball"}, ], encounters: [ {generation: 1, level: 25}, @@ -17387,7 +17387,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { whirlpool: ["2L1"], }, eventData: [ - {generation: 5, level: 1, shiny: true, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 5, level: 1, shiny: true, pokeball: "pokeball"}, ], encounters: [ {generation: 1, level: 5}, @@ -17467,7 +17467,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { whirlpool: ["2L1"], }, eventData: [ - {generation: 3, level: 45, abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 45, pokeball: "pokeball"}, ], encounters: [ {generation: 1, level: 20}, @@ -17553,8 +17553,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { yawn: ["2L1"], }, eventData: [ - {generation: 3, level: 50, abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, - {generation: 5, level: 50, gender: "M", nature: "Timid", ivs: {hp: 31, atk: 17, def: 8, spa: 31, spd: 11, spe: 31}, abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 50, pokeball: "pokeball"}, + {generation: 5, level: 50, gender: "M", nature: "Timid", ivs: {hp: 31, atk: 17, def: 8, spa: 31, spd: 11, spe: 31}, pokeball: "cherishball"}, ], }, goldeen: { @@ -17805,8 +17805,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zapcannon: ["2L1"], }, eventData: [ - {generation: 3, level: 50, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 18, nature: "Timid", ivs: {hp: 10, atk: 3, def: 22, spa: 24, spd: 3, spe: 18}, abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 50, pokeball: "pokeball"}, + {generation: 3, level: 18, nature: "Timid", ivs: {hp: 10, atk: 3, def: 22, spa: 24, spd: 3, spe: 18}, pokeball: "pokeball"}, ], encounters: [ {generation: 1, level: 5}, @@ -17909,7 +17909,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zapcannon: ["2L1"], }, eventData: [ - {generation: 3, level: 41, moves: ["2L1"]}, + {generation: 3, level: 41}, ], }, mimejr: { @@ -18138,7 +18138,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 42, abilities: ["2L1"], moves: ["2L1"]}, + {generation: 3, level: 42}, ], encounters: [ {generation: 1, level: 6}, @@ -18237,7 +18237,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 8, level: 15, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 8, level: 15, isHidden: true, pokeball: "cherishball"}, ], }, mrrime: { @@ -18426,9 +18426,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { xscissor: ["2L1"], }, eventData: [ - {generation: 3, level: 10, gender: "M", abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 40, abilities: ["2L1"], moves: ["2L1"]}, - {generation: 5, level: 30, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, + {generation: 3, level: 40}, + {generation: 5, level: 30, pokeball: "cherishball"}, ], encounters: [ {generation: 1, level: 15}, @@ -18536,14 +18536,14 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { xscissor: ["2L1"], }, eventData: [ - {generation: 3, level: 50, gender: "M", abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, - {generation: 4, level: 50, gender: "M", nature: "Adamant", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 100, gender: "M", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 10, gender: "M", isHidden: true, moves: ["2L1"]}, - {generation: 6, level: 50, gender: "M", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 25, nature: "Adamant", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 25, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 50, abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 50, gender: "M", pokeball: "pokeball"}, + {generation: 4, level: 50, gender: "M", nature: "Adamant", pokeball: "cherishball"}, + {generation: 5, level: 100, gender: "M", pokeball: "cherishball"}, + {generation: 5, level: 10, gender: "M", isHidden: true}, + {generation: 6, level: 50, gender: "M", pokeball: "cherishball"}, + {generation: 6, level: 25, nature: "Adamant", pokeball: "cherishball"}, + {generation: 6, level: 25, pokeball: "cherishball"}, + {generation: 6, level: 50, pokeball: "cherishball"}, ], }, kleavor: { @@ -18829,7 +18829,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { encounters: [ {generation: 1, level: 15}, {generation: 2, level: 10}, - {generation: 3, level: 20, nature: "Mild", ivs: {hp: 18, atk: 17, def: 18, spa: 22, spd: 25, spe: 21}, abilities: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 20, nature: "Mild", ivs: {hp: 18, atk: 17, def: 18, spa: 22, spd: 25, spe: 21}, pokeball: "pokeball"}, {generation: 4, level: 22}, {generation: 7, level: 9}, ], @@ -18924,7 +18924,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zapcannon: ["2L1"], }, eventData: [ - {generation: 3, level: 20, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 20, pokeball: "pokeball"}, ], }, electabuzz: { @@ -19027,11 +19027,11 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zapcannon: ["2L1"], }, eventData: [ - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 43, moves: ["2L1"]}, - {generation: 4, level: 30, gender: "M", nature: "Naughty", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 5, level: 30, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 30, gender: "M", isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, + {generation: 3, level: 43}, + {generation: 4, level: 30, gender: "M", nature: "Naughty", pokeball: "pokeball"}, + {generation: 5, level: 30, pokeball: "cherishball"}, + {generation: 6, level: 30, gender: "M", isHidden: true, pokeball: "cherishball"}, ], encounters: [ {generation: 1, level: 33}, @@ -19137,8 +19137,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wildcharge: ["2L1"], }, eventData: [ - {generation: 4, level: 50, gender: "M", nature: "Adamant", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 4, level: 50, gender: "M", nature: "Serious", moves: ["2L1"], pokeball: "cherishball"}, + {generation: 4, level: 50, gender: "M", nature: "Adamant", pokeball: "pokeball"}, + {generation: 4, level: 50, gender: "M", nature: "Serious", pokeball: "cherishball"}, ], }, magby: { @@ -19328,11 +19328,11 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { willowisp: ["2L1"], }, eventData: [ - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 36, moves: ["2L1"]}, - {generation: 4, level: 30, gender: "M", nature: "Quiet", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 5, level: 30, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 30, gender: "M", isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, + {generation: 3, level: 36}, + {generation: 4, level: 30, gender: "M", nature: "Quiet", pokeball: "pokeball"}, + {generation: 5, level: 30, pokeball: "cherishball"}, + {generation: 6, level: 30, gender: "M", isHidden: true, pokeball: "cherishball"}, ], encounters: [ {generation: 1, level: 34}, @@ -19439,8 +19439,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { willowisp: ["2L1"], }, eventData: [ - {generation: 4, level: 50, gender: "F", nature: "Modest", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 4, level: 50, gender: "M", nature: "Hardy", moves: ["2L1"], pokeball: "cherishball"}, + {generation: 4, level: 50, gender: "F", nature: "Modest", pokeball: "pokeball"}, + {generation: 4, level: 50, gender: "M", nature: "Hardy", pokeball: "cherishball"}, ], }, pinsir: { @@ -19532,9 +19532,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { xscissor: ["2L1"], }, eventData: [ - {generation: 3, level: 35, abilities: ["2L1"], moves: ["2L1"]}, - {generation: 6, level: 50, gender: "F", nature: "Adamant", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 50, nature: "Jolly", isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 35}, + {generation: 6, level: 50, gender: "F", nature: "Adamant", pokeball: "cherishball"}, + {generation: 6, level: 50, nature: "Jolly", isHidden: true, pokeball: "cherishball"}, ], encounters: [ {generation: 1, level: 15}, @@ -19641,9 +19641,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 25, nature: "Docile", ivs: {hp: 14, atk: 19, def: 12, spa: 17, spd: 5, spe: 26}, abilities: ["2L1"], moves: ["2L1"], pokeball: "safariball"}, - {generation: 3, level: 10, abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 46, abilities: ["2L1"], moves: ["2L1"]}, + {generation: 3, level: 25, nature: "Docile", ivs: {hp: 14, atk: 19, def: 12, spa: 17, spd: 5, spe: 26}, pokeball: "safariball"}, + {generation: 3, level: 10, pokeball: "pokeball"}, + {generation: 3, level: 46}, ], encounters: [ {generation: 1, level: 21}, @@ -19831,14 +19831,14 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { tackle: ["2L1"], }, eventData: [ - {generation: 4, level: 5, gender: "M", nature: "Relaxed", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 4, level: 6, gender: "F", nature: "Rash", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 4, level: 7, gender: "F", nature: "Hardy", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 4, level: 5, gender: "F", nature: "Lonely", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 4, level: 4, gender: "M", nature: "Modest", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 5, level: 99, shiny: true, gender: "M", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 1, shiny: 1, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 19, shiny: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 4, level: 5, gender: "M", nature: "Relaxed", pokeball: "pokeball"}, + {generation: 4, level: 6, gender: "F", nature: "Rash", pokeball: "pokeball"}, + {generation: 4, level: 7, gender: "F", nature: "Hardy", pokeball: "pokeball"}, + {generation: 4, level: 5, gender: "F", nature: "Lonely", pokeball: "pokeball"}, + {generation: 4, level: 4, gender: "M", nature: "Modest", pokeball: "pokeball"}, + {generation: 5, level: 99, shiny: true, gender: "M", pokeball: "cherishball"}, + {generation: 6, level: 1, shiny: 1, pokeball: "cherishball"}, + {generation: 7, level: 19, shiny: true, pokeball: "cherishball"}, ], encounters: [ {generation: 1, level: 5}, @@ -19949,8 +19949,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zapcannon: ["2L1"], }, eventData: [ - {generation: 6, level: 50, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 20, shiny: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 6, level: 50, pokeball: "cherishball"}, + {generation: 6, level: 20, shiny: true, pokeball: "cherishball"}, ], encounters: [ {generation: 1, level: 15}, @@ -20077,7 +20077,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 44, moves: ["2L1"]}, + {generation: 3, level: 44}, ], encounters: [ {generation: 1, level: 15}, @@ -20088,7 +20088,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { transform: ["2L1"], }, eventData: [ - {generation: 7, level: 10, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 7, level: 10, pokeball: "cherishball"}, ], encounters: [ {generation: 1, level: 12}, @@ -20180,13 +20180,13 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { yawn: ["2L1"], }, eventData: [ - {generation: 4, level: 10, gender: "F", nature: "Lonely", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, - {generation: 4, level: 50, shiny: true, gender: "M", nature: "Hardy", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 50, gender: "F", nature: "Hardy", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 10, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 15, shiny: true, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 10, nature: "Jolly", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 5, gender: "M", nature: "Docile", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 4, level: 10, gender: "F", nature: "Lonely", pokeball: "cherishball"}, + {generation: 4, level: 50, shiny: true, gender: "M", nature: "Hardy", pokeball: "cherishball"}, + {generation: 5, level: 50, gender: "F", nature: "Hardy", pokeball: "cherishball"}, + {generation: 6, level: 10, pokeball: "cherishball"}, + {generation: 6, level: 15, shiny: true, isHidden: true, pokeball: "cherishball"}, + {generation: 7, level: 10, nature: "Jolly", pokeball: "cherishball"}, + {generation: 8, level: 5, gender: "M", nature: "Docile", pokeball: "cherishball"}, ], encounters: [ {generation: 1, level: 25}, @@ -20227,7 +20227,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { veeveevolley: ["2L1"], }, eventData: [ - {generation: 7, level: 5, perfectIVs: 6, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 7, level: 5, perfectIVs: 6, pokeball: "pokeball"}, ], eventOnly: false, }, @@ -20333,9 +20333,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { yawn: ["2L1"], }, eventData: [ - {generation: 5, level: 10, gender: "M", isHidden: true, moves: ["2L1"]}, - {generation: 6, level: 10, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 50, gender: "F", isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 10, gender: "M", isHidden: true}, + {generation: 6, level: 10, pokeball: "cherishball"}, + {generation: 7, level: 50, gender: "F", isHidden: true, pokeball: "cherishball"}, ], }, jolteon: { @@ -20440,9 +20440,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zapcannon: ["2L1"], }, eventData: [ - {generation: 5, level: 10, gender: "M", isHidden: true, moves: ["2L1"]}, - {generation: 6, level: 10, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 50, gender: "F", moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 10, gender: "M", isHidden: true}, + {generation: 6, level: 10, pokeball: "cherishball"}, + {generation: 7, level: 50, gender: "F", pokeball: "cherishball"}, ], }, flareon: { @@ -20544,9 +20544,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zapcannon: ["2L1"], }, eventData: [ - {generation: 5, level: 10, gender: "M", isHidden: true, moves: ["2L1"]}, - {generation: 6, level: 10, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 50, gender: "F", isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 10, gender: "M", isHidden: true}, + {generation: 6, level: 10, pokeball: "cherishball"}, + {generation: 7, level: 50, gender: "F", isHidden: true, pokeball: "cherishball"}, ], }, espeon: { @@ -20655,10 +20655,10 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 70, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 5, level: 10, gender: "M", isHidden: true, moves: ["2L1"]}, - {generation: 6, level: 10, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 50, gender: "F", isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 70, pokeball: "pokeball"}, + {generation: 5, level: 10, gender: "M", isHidden: true}, + {generation: 6, level: 10, pokeball: "cherishball"}, + {generation: 7, level: 50, gender: "F", isHidden: true, pokeball: "cherishball"}, ], }, umbreon: { @@ -20764,10 +20764,10 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zapcannon: ["2L1"], }, eventData: [ - {generation: 3, level: 70, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 5, level: 10, gender: "M", isHidden: true, moves: ["2L1"]}, - {generation: 6, level: 10, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 50, gender: "F", moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 70, pokeball: "pokeball"}, + {generation: 5, level: 10, gender: "M", isHidden: true}, + {generation: 6, level: 10, pokeball: "cherishball"}, + {generation: 7, level: 50, gender: "F", pokeball: "cherishball"}, ], }, leafeon: { @@ -20863,9 +20863,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { xscissor: ["2L1"], }, eventData: [ - {generation: 5, level: 10, gender: "M", isHidden: true, moves: ["2L1"]}, - {generation: 6, level: 10, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 50, gender: "F", isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 10, gender: "M", isHidden: true}, + {generation: 6, level: 10, pokeball: "cherishball"}, + {generation: 7, level: 50, gender: "F", isHidden: true, pokeball: "cherishball"}, ], }, glaceon: { @@ -20959,9 +20959,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 5, level: 10, gender: "M", isHidden: true, moves: ["2L1"]}, - {generation: 6, level: 10, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 50, gender: "F", moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 10, gender: "M", isHidden: true}, + {generation: 6, level: 10, pokeball: "cherishball"}, + {generation: 7, level: 50, gender: "F", pokeball: "cherishball"}, ], }, porygon: { @@ -21055,8 +21055,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 5, level: 10, isHidden: true, moves: ["2L1"]}, - {generation: 8, level: 25, isHidden: true, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 5, level: 10, isHidden: true}, + {generation: 8, level: 25, isHidden: true, pokeball: "pokeball"}, ], encounters: [ {generation: 1, level: 18}, @@ -21144,7 +21144,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 8, level: 50, nature: "Sassy", abilities: ["2L1"], ivs: {hp: 31, atk: 0, spe: 0}, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 8, level: 50, nature: "Sassy", ivs: {hp: 31, atk: 0, spe: 0}, pokeball: "cherishball"}, ], }, porygonz: { @@ -21314,7 +21314,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wringout: ["2L1"], }, eventData: [ - {generation: 5, level: 15, gender: "M", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 15, gender: "M", pokeball: "cherishball"}, ], encounters: [ {generation: 1, level: 30}, @@ -21497,7 +21497,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wringout: ["2L1"], }, eventData: [ - {generation: 5, level: 15, gender: "M", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 15, gender: "M", pokeball: "cherishball"}, ], encounters: [ {generation: 1, level: 30}, @@ -21713,8 +21713,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wingattack: ["2L1"], }, eventData: [ - {generation: 5, level: 15, gender: "M", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 50, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 15, gender: "M", pokeball: "cherishball"}, + {generation: 7, level: 50, isHidden: true, pokeball: "cherishball"}, ], encounters: [ {generation: 1, level: 30}, @@ -21830,10 +21830,10 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 4, level: 5, moves: ["2L1"]}, - {generation: 4, level: 5, gender: "F", nature: "Relaxed", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 5, abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, - {generation: 9, level: 1, shiny: true, gender: "M", isHidden: true, nature: "Impish", moves: ["2L1"], pokeball: "pokeball"}, + {generation: 4, level: 5}, + {generation: 4, level: 5, gender: "F", nature: "Relaxed", pokeball: "cherishball"}, + {generation: 7, level: 5, pokeball: "cherishball"}, + {generation: 9, level: 1, shiny: true, gender: "M", isHidden: true, nature: "Impish", pokeball: "pokeball"}, ], }, snorlax: { @@ -21978,8 +21978,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 43, moves: ["2L1"]}, - {generation: 7, level: 30, abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 43}, + {generation: 7, level: 30, pokeball: "cherishball"}, ], encounters: [ {generation: 1, level: 30}, @@ -22079,15 +22079,15 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { whirlwind: ["2L1"], }, eventData: [ - {generation: 3, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 3, level: 70, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 50, moves: ["2L1"]}, - {generation: 4, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 4, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 6, level: 70, moves: ["2L1"]}, - {generation: 6, level: 70, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 3, level: 50, shiny: 1}, + {generation: 3, level: 70, pokeball: "pokeball"}, + {generation: 3, level: 50}, + {generation: 4, level: 60, shiny: 1}, + {generation: 4, level: 50, shiny: 1}, + {generation: 6, level: 70}, + {generation: 6, level: 70, isHidden: true, pokeball: "cherishball"}, + {generation: 7, level: 60, shiny: 1}, + {generation: 8, level: 70, shiny: 1}, ], encounters: [ {generation: 1, level: 50}, @@ -22156,8 +22156,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { uturn: ["2L1"], }, eventData: [ - {generation: 8, level: 70, moves: ["2L1"]}, - {generation: 8, level: 70, shiny: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 8, level: 70}, + {generation: 8, level: 70, shiny: true, pokeball: "cherishball"}, ], eventOnly: false, }, @@ -22253,15 +22253,15 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zapcannon: ["2L1"], }, eventData: [ - {generation: 3, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 3, level: 70, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 50, moves: ["2L1"]}, - {generation: 4, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 4, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 6, level: 70, moves: ["2L1"]}, - {generation: 6, level: 70, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 3, level: 50, shiny: 1}, + {generation: 3, level: 70, pokeball: "pokeball"}, + {generation: 3, level: 50}, + {generation: 4, level: 60, shiny: 1}, + {generation: 4, level: 50, shiny: 1}, + {generation: 6, level: 70}, + {generation: 6, level: 70, isHidden: true, pokeball: "cherishball"}, + {generation: 7, level: 60, shiny: 1}, + {generation: 8, level: 70, shiny: 1}, ], encounters: [ {generation: 1, level: 50}, @@ -22334,8 +22334,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { uturn: ["2L1"], }, eventData: [ - {generation: 8, level: 70, moves: ["2L1"]}, - {generation: 8, level: 70, shiny: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 8, level: 70}, + {generation: 8, level: 70, shiny: true, pokeball: "cherishball"}, ], eventOnly: false, }, @@ -22427,15 +22427,15 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wingattack: ["2L1"], }, eventData: [ - {generation: 3, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 3, level: 70, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 50, moves: ["2L1"]}, - {generation: 4, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 4, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 6, level: 70, moves: ["2L1"]}, - {generation: 6, level: 70, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 3, level: 50, shiny: 1}, + {generation: 3, level: 70, pokeball: "pokeball"}, + {generation: 3, level: 50}, + {generation: 4, level: 60, shiny: 1}, + {generation: 4, level: 50, shiny: 1}, + {generation: 6, level: 70}, + {generation: 6, level: 70, isHidden: true, pokeball: "cherishball"}, + {generation: 7, level: 60, shiny: 1}, + {generation: 8, level: 70, shiny: 1}, ], encounters: [ {generation: 1, level: 50}, @@ -22500,8 +22500,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wingattack: ["2L1"], }, eventData: [ - {generation: 8, level: 70, moves: ["2L1"]}, - {generation: 8, level: 70, shiny: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 8, level: 70}, + {generation: 8, level: 70, shiny: true, pokeball: "cherishball"}, ], eventOnly: false, }, @@ -22836,16 +22836,16 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zapcannon: ["2L1"], }, eventData: [ - {generation: 3, level: 70, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 55, moves: ["2L1"]}, - {generation: 4, level: 50, gender: "M", nature: "Mild", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 100, gender: "M", isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 55, gender: "M", isHidden: true, moves: ["2L1"]}, - {generation: 5, level: 55, gender: "M", isHidden: true, moves: ["2L1"]}, - {generation: 5, level: 50, gender: "M", nature: "Brave", ivs: {hp: 30, atk: 30, def: 30, spa: 30, spd: 30, spe: 30}, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 55, gender: "M", isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 62, gender: "M", ivs: {hp: 31, def: 31, spa: 31, spd: 31}, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 80, gender: "F", nature: "Jolly", abilities: ["2L1"], ivs: {hp: 30, atk: 31, def: 30, spa: 30, spd: 31, spe: 31}, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 70, pokeball: "pokeball"}, + {generation: 3, level: 55}, + {generation: 4, level: 50, gender: "M", nature: "Mild", pokeball: "cherishball"}, + {generation: 5, level: 100, gender: "M", isHidden: true, pokeball: "cherishball"}, + {generation: 5, level: 55, gender: "M", isHidden: true}, + {generation: 5, level: 55, gender: "M", isHidden: true}, + {generation: 5, level: 50, gender: "M", nature: "Brave", ivs: {hp: 30, atk: 30, def: 30, spa: 30, spd: 30, spe: 30}, pokeball: "cherishball"}, + {generation: 6, level: 55, gender: "M", isHidden: true, pokeball: "cherishball"}, + {generation: 6, level: 62, gender: "M", ivs: {hp: 31, def: 31, spa: 31, spd: 31}, pokeball: "cherishball"}, + {generation: 8, level: 80, gender: "F", nature: "Jolly", ivs: {hp: 30, atk: 31, def: 30, spa: 30, spd: 31, spe: 31}, pokeball: "pokeball"}, ], encounters: [ {generation: 5, level: 50}, @@ -23024,15 +23024,15 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 70, shiny: 1, moves: ["2L1"]}, - {generation: 4, level: 70, shiny: 1, moves: ["2L1"]}, - {generation: 5, level: 70, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 100, nature: "Timid", ivs: {spa: 31, spe: 31}, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 70, moves: ["2L1"]}, - {generation: 6, level: 100, shiny: true, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, - {generation: 9, level: 100, nature: "Modest", perfectIVs: 6, isHidden: true, moves: ["2L1"]}, + {generation: 3, level: 70, shiny: 1}, + {generation: 4, level: 70, shiny: 1}, + {generation: 5, level: 70, pokeball: "cherishball"}, + {generation: 5, level: 100, nature: "Timid", ivs: {spa: 31, spe: 31}, isHidden: true, pokeball: "cherishball"}, + {generation: 6, level: 70}, + {generation: 6, level: 100, shiny: true, isHidden: true, pokeball: "cherishball"}, + {generation: 7, level: 60, shiny: 1}, + {generation: 8, level: 70, shiny: 1}, + {generation: 9, level: 100, nature: "Modest", perfectIVs: 6, isHidden: true}, ], encounters: [ {generation: 1, level: 70}, @@ -23418,33 +23418,33 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 30, shiny: 1, moves: ["2L1"]}, - {generation: 3, level: 10, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 30, shiny: 1, moves: ["2L1"]}, - {generation: 3, level: 10, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 30, shiny: 1, moves: ["2L1"]}, - {generation: 3, level: 10, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 30, shiny: 1, moves: ["2L1"]}, - {generation: 3, level: 10, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 30, shiny: 1, moves: ["2L1"]}, - {generation: 3, level: 10, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 30, shiny: 1, moves: ["2L1"]}, - {generation: 3, level: 10, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 30, shiny: 1, moves: ["2L1"]}, - {generation: 3, level: 10, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 4, level: 50, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 4, level: 50, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 4, level: 50, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 4, level: 50, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 4, level: 50, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 4, level: 50, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 4, level: 50, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 4, level: 5, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 5, perfectIVs: 5, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 7, level: 50, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 1, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 9, level: 5, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 30, shiny: 1}, + {generation: 3, level: 10, pokeball: "pokeball"}, + {generation: 3, level: 30, shiny: 1}, + {generation: 3, level: 10, pokeball: "pokeball"}, + {generation: 3, level: 30, shiny: 1}, + {generation: 3, level: 10, pokeball: "pokeball"}, + {generation: 3, level: 30, shiny: 1}, + {generation: 3, level: 10, pokeball: "pokeball"}, + {generation: 3, level: 30, shiny: 1}, + {generation: 3, level: 10, pokeball: "pokeball"}, + {generation: 3, level: 30, shiny: 1}, + {generation: 3, level: 10, pokeball: "pokeball"}, + {generation: 3, level: 30, shiny: 1}, + {generation: 3, level: 10, pokeball: "pokeball"}, + {generation: 4, level: 50, pokeball: "cherishball"}, + {generation: 4, level: 50, pokeball: "cherishball"}, + {generation: 4, level: 50, pokeball: "cherishball"}, + {generation: 4, level: 50, pokeball: "cherishball"}, + {generation: 4, level: 50, pokeball: "cherishball"}, + {generation: 4, level: 50, pokeball: "cherishball"}, + {generation: 4, level: 50, pokeball: "cherishball"}, + {generation: 4, level: 5, pokeball: "cherishball"}, + {generation: 6, level: 100, pokeball: "cherishball"}, + {generation: 7, level: 5, perfectIVs: 5, pokeball: "pokeball"}, + {generation: 7, level: 50, pokeball: "cherishball"}, + {generation: 8, level: 1, pokeball: "pokeball"}, + {generation: 9, level: 5, pokeball: "pokeball"}, ], eventOnly: false, }, @@ -23529,9 +23529,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wringout: ["2L1"], }, eventData: [ - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 5, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 6, level: 5, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, + {generation: 3, level: 5, pokeball: "pokeball"}, + {generation: 6, level: 5, pokeball: "cherishball"}, ], }, bayleef: { @@ -23704,7 +23704,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 6, level: 50, isHidden: true, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 6, level: 50, isHidden: true, pokeball: "pokeball"}, ], }, cyndaquil: { @@ -23789,9 +23789,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 5, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 6, level: 5, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, + {generation: 3, level: 5, pokeball: "pokeball"}, + {generation: 6, level: 5, pokeball: "cherishball"}, ], }, quilava: { @@ -23978,8 +23978,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 70, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 6, level: 50, isHidden: true, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 70, pokeball: "pokeball"}, + {generation: 6, level: 50, isHidden: true, pokeball: "pokeball"}, ], }, typhlosionhisui: { @@ -24158,9 +24158,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 5, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 6, level: 5, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, + {generation: 3, level: 5, pokeball: "pokeball"}, + {generation: 6, level: 5, pokeball: "cherishball"}, ], }, croconaw: { @@ -24384,7 +24384,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 6, level: 50, isHidden: true, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 6, level: 50, isHidden: true, pokeball: "pokeball"}, ], }, sentret: { @@ -24697,7 +24697,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, ], encounters: [ {generation: 2, level: 2}, @@ -24883,7 +24883,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { uturn: ["2L1"], }, eventData: [ - {generation: 3, level: 10, moves: ["2L1"]}, + {generation: 3, level: 10}, ], encounters: [ {generation: 2, level: 3}, @@ -25055,7 +25055,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { xscissor: ["2L1"], }, eventData: [ - {generation: 3, level: 14, moves: ["2L1"]}, + {generation: 3, level: 14}, ], encounters: [ {generation: 2, level: 3}, @@ -25146,7 +25146,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { xscissor: ["2L1"], }, eventData: [ - {generation: 9, level: 65, gender: "M", nature: "Hardy", abilities: ["2L1"], ivs: {hp: 20, atk: 20, def: 20, spa: 20, spd: 20, spe: 20}, moves: ["2L1"]}, + {generation: 9, level: 65, gender: "M", nature: "Hardy", ivs: {hp: 20, atk: 20, def: 20, spa: 20, spd: 20, spe: 20}}, ], encounters: [ {generation: 2, level: 7}, @@ -25431,8 +25431,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 20, gender: "F", abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 25, moves: ["2L1"]}, + {generation: 3, level: 20, gender: "F", pokeball: "pokeball"}, + {generation: 3, level: 25}, ], }, togetic: { @@ -25672,7 +25672,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 5, level: 10, gender: "M", isHidden: true, moves: ["2L1"]}, + {generation: 5, level: 10, gender: "M", isHidden: true}, ], }, natu: { @@ -25772,7 +25772,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 22, moves: ["2L1"]}, + {generation: 3, level: 22}, ], }, xatu: { @@ -25871,7 +25871,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { }, encounters: [ {generation: 2, level: 15}, - {generation: 4, level: 16, gender: "M", nature: "Modest", ivs: {hp: 15, atk: 20, def: 15, spa: 20, spd: 20, spe: 20}, abilities: ["2L1"], pokeball: "pokeball"}, + {generation: 4, level: 16, gender: "M", nature: "Modest", ivs: {hp: 15, atk: 20, def: 15, spa: 20, spd: 20, spe: 20}, pokeball: "pokeball"}, {generation: 6, level: 24, maxEggMoves: 1}, {generation: 7, level: 21}, ], @@ -25952,10 +25952,10 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zapcannon: ["2L1"], }, eventData: [ - {generation: 3, level: 37, gender: "F", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 17, moves: ["2L1"]}, - {generation: 6, level: 10, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 37, gender: "F", pokeball: "pokeball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, + {generation: 3, level: 17}, + {generation: 6, level: 10, pokeball: "cherishball"}, ], }, flaaffy: { @@ -26887,7 +26887,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { worryseed: ["2L1"], }, eventData: [ - {generation: 5, level: 27, gender: "M", isHidden: true, moves: ["2L1"]}, + {generation: 5, level: 27, gender: "M", isHidden: true}, ], }, aipom: { @@ -27007,7 +27007,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zapcannon: ["2L1"], }, eventData: [ - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, ], }, ambipom: { @@ -27178,7 +27178,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { worryseed: ["2L1"], }, eventData: [ - {generation: 3, level: 10, gender: "M", abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, ], }, sunflora: { @@ -27844,7 +27844,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wingattack: ["2L1"], }, eventData: [ - {generation: 3, level: 10, gender: "M", abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, ], }, honchkrow: { @@ -27937,7 +27937,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wingattack: ["2L1"], }, eventData: [ - {generation: 7, level: 65, gender: "M", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 7, level: 65, gender: "M", pokeball: "cherishball"}, ], }, misdreavus: { @@ -28051,7 +28051,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zapcannon: ["2L1"], }, eventData: [ - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, ], }, mismagius: { @@ -28178,7 +28178,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { tickle: ["2L1"], }, eventData: [ - {generation: 3, level: 5, shiny: 1, moves: ["2L1"], pokeball: "pokeball", emeraldEventEgg: true}, + {generation: 3, level: 5, shiny: 1, pokeball: "pokeball", emeraldEventEgg: true}, ], }, wobbuffet: { @@ -28193,10 +28193,10 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { splash: ["2L1"], }, eventData: [ - {generation: 3, level: 5, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 6, level: 10, gender: "M", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 15, gender: "M", moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 5, pokeball: "pokeball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, + {generation: 6, level: 10, gender: "M", pokeball: "cherishball"}, + {generation: 6, level: 15, gender: "M", pokeball: "cherishball"}, ], encounters: [ {generation: 2, level: 5}, @@ -28401,8 +28401,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { venoshock: ["2L1"], }, eventData: [ - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 20, moves: ["2L1"]}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, + {generation: 3, level: 20}, ], }, forretress: { @@ -28834,7 +28834,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { xscissor: ["2L1"], }, eventData: [ - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, ], }, gliscor: { @@ -29058,7 +29058,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zapcannon: ["2L1"], }, eventData: [ - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, ], }, granbull: { @@ -29288,7 +29288,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { whirlpool: ["2L1"], }, eventData: [ - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, ], }, qwilfishhisui: { @@ -29516,8 +29516,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wrap: ["2L1"], }, eventData: [ - {generation: 3, level: 10, gender: "M", abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 20, abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, + {generation: 3, level: 20, pokeball: "pokeball"}, ], }, heracross: { @@ -29622,8 +29622,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 6, level: 50, gender: "F", nature: "Adamant", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 50, nature: "Adamant", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 6, level: 50, gender: "F", nature: "Adamant", pokeball: "cherishball"}, + {generation: 6, level: 50, nature: "Adamant", pokeball: "cherishball"}, ], }, sneasel: { @@ -29747,7 +29747,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { xscissor: ["2L1"], }, eventData: [ - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, ], }, sneaselhisui: { @@ -29932,8 +29932,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { xscissor: ["2L1"], }, eventData: [ - {generation: 4, level: 30, gender: "M", nature: "Jolly", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 48, gender: "M", perfectIVs: 2, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 4, level: 30, gender: "M", nature: "Jolly", pokeball: "cherishball"}, + {generation: 6, level: 48, gender: "M", perfectIVs: 2, pokeball: "cherishball"}, ], }, sneasler: { @@ -30111,8 +30111,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zapcannon: ["2L1"], }, eventData: [ - {generation: 3, level: 10, gender: "M", abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 11, abilities: ["2L1"], moves: ["2L1"]}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, + {generation: 3, level: 11}, ], encounters: [ {generation: 2, level: 2}, @@ -30390,7 +30390,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { yawn: ["2L1"], }, eventData: [ - {generation: 9, level: 70, nature: "Hardy", perfectIVs: 3, moves: ["2L1"]}, + {generation: 9, level: 70, nature: "Hardy", perfectIVs: 3}, ], eventOnly: false, }, @@ -30567,7 +30567,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { yawn: ["2L1"], }, eventData: [ - {generation: 3, level: 38, moves: ["2L1"]}, + {generation: 3, level: 38}, ], encounters: [ {generation: 3, level: 25}, @@ -30656,7 +30656,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { trailblaze: ["2L1"], }, eventData: [ - {generation: 3, level: 22, abilities: ["2L1"], moves: ["2L1"]}, + {generation: 3, level: 22}, ], }, piloswine: { @@ -30839,8 +30839,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { trailblaze: ["2L1"], }, eventData: [ - {generation: 5, level: 34, gender: "M", isHidden: true, moves: ["2L1"]}, - {generation: 6, level: 50, shiny: true, gender: "M", nature: "Adamant", isHidden: true, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 5, level: 34, gender: "M", isHidden: true}, + {generation: 6, level: 50, shiny: true, gender: "M", nature: "Adamant", isHidden: true, pokeball: "pokeball"}, ], }, corsola: { @@ -30942,8 +30942,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { whirlpool: ["2L1"], }, eventData: [ - {generation: 3, level: 5, shiny: 1, moves: ["2L1"], pokeball: "pokeball", emeraldEventEgg: true}, - {generation: 7, level: 50, gender: "F", nature: "Serious", abilities: ["2L1"], moves: ["2L1"], pokeball: "ultraball"}, + {generation: 3, level: 5, shiny: 1, pokeball: "pokeball", emeraldEventEgg: true}, + {generation: 7, level: 50, gender: "F", nature: "Serious", pokeball: "ultraball"}, ], }, corsolagalar: { @@ -31017,7 +31017,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { willowisp: ["2L1"], }, eventData: [ - {generation: 8, level: 15, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 8, level: 15, isHidden: true, pokeball: "cherishball"}, ], }, cursola: { @@ -31252,7 +31252,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wringout: ["2L1"], }, eventData: [ - {generation: 4, level: 50, gender: "F", nature: "Serious", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 4, level: 50, gender: "F", nature: "Serious", pokeball: "cherishball"}, ], encounters: [ {generation: 4, level: 19}, @@ -31365,8 +31365,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { weatherball: ["2L1"], }, eventData: [ - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 6, level: 10, abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, + {generation: 6, level: 10, pokeball: "cherishball"}, ], }, mantyke: { @@ -31528,7 +31528,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wingattack: ["2L1"], }, eventData: [ - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, ], }, skarmory: { @@ -31724,8 +31724,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { willowisp: ["2L1"], }, eventData: [ - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 17, moves: ["2L1"]}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, + {generation: 3, level: 17}, ], }, houndoom: { @@ -31827,7 +31827,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { willowisp: ["2L1"], }, eventData: [ - {generation: 6, level: 50, nature: "Timid", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 6, level: 50, nature: "Timid", pokeball: "cherishball"}, ], encounters: [ {generation: 4, level: 20}, @@ -32122,7 +32122,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 10, gender: "M", abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, ], }, wyrdeer: { @@ -32209,9 +32209,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { spore: ["2L1"], }, eventData: [ - {generation: 3, level: 10, gender: "M", abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, - {generation: 5, level: 50, gender: "F", nature: "Jolly", ivs: {atk: 31, spe: 31}, abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 40, gender: "M", nature: "Jolly", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, + {generation: 5, level: 50, gender: "F", nature: "Jolly", ivs: {atk: 31, spe: 31}, pokeball: "cherishball"}, + {generation: 6, level: 40, gender: "M", nature: "Jolly", pokeball: "cherishball"}, ], }, miltank: { @@ -32317,7 +32317,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 6, level: 20, perfectIVs: 3, abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 6, level: 20, perfectIVs: 3, pokeball: "cherishball"}, ], }, raikou: { @@ -32410,15 +32410,15 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zapcannon: ["2L1"], }, eventData: [ - {generation: 3, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 3, level: 70, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 4, level: 40, shiny: 1, moves: ["2L1"]}, - {generation: 4, level: 30, shiny: true, nature: "Rash", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 7, level: 60, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 3, level: 50, shiny: 1}, + {generation: 3, level: 70, pokeball: "pokeball"}, + {generation: 4, level: 40, shiny: 1}, + {generation: 4, level: 30, shiny: true, nature: "Rash", pokeball: "cherishball"}, + {generation: 6, level: 50, shiny: 1}, + {generation: 7, level: 60, shiny: 1}, + {generation: 7, level: 60, pokeball: "cherishball"}, + {generation: 7, level: 100, pokeball: "cherishball"}, + {generation: 8, level: 70, shiny: 1}, ], encounters: [ {generation: 2, level: 40}, @@ -32513,15 +32513,15 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { willowisp: ["2L1"], }, eventData: [ - {generation: 3, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 3, level: 70, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 4, level: 40, shiny: 1, moves: ["2L1"]}, - {generation: 4, level: 30, shiny: true, nature: "Adamant", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 7, level: 60, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 3, level: 50, shiny: 1}, + {generation: 3, level: 70, pokeball: "pokeball"}, + {generation: 4, level: 40, shiny: 1}, + {generation: 4, level: 30, shiny: true, nature: "Adamant", pokeball: "cherishball"}, + {generation: 6, level: 50, shiny: 1}, + {generation: 7, level: 60, shiny: 1}, + {generation: 7, level: 60, pokeball: "cherishball"}, + {generation: 7, level: 100, pokeball: "cherishball"}, + {generation: 8, level: 70, shiny: 1}, ], encounters: [ {generation: 2, level: 40}, @@ -32618,13 +32618,13 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { whirlpool: ["2L1"], }, eventData: [ - {generation: 3, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 3, level: 70, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 4, level: 40, shiny: 1, moves: ["2L1"]}, - {generation: 4, level: 30, shiny: true, nature: "Relaxed", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 3, level: 50, shiny: 1}, + {generation: 3, level: 70, pokeball: "pokeball"}, + {generation: 4, level: 40, shiny: 1}, + {generation: 4, level: 30, shiny: true, nature: "Relaxed", pokeball: "cherishball"}, + {generation: 6, level: 50, shiny: 1}, + {generation: 7, level: 60, shiny: 1}, + {generation: 8, level: 70, shiny: 1}, ], encounters: [ {generation: 2, level: 40}, @@ -32716,8 +32716,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { uproar: ["2L1"], }, eventData: [ - {generation: 3, level: 20, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 5, level: 5, shiny: true, gender: "M", moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 20, pokeball: "pokeball"}, + {generation: 5, level: 5, shiny: true, gender: "M", pokeball: "cherishball"}, ], }, pupitar: { @@ -32943,13 +32943,13 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { whirlpool: ["2L1"], }, eventData: [ - {generation: 3, level: 70, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 5, level: 100, gender: "M", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 55, gender: "M", isHidden: true, moves: ["2L1"]}, - {generation: 6, level: 50, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 50, nature: "Jolly", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 55, shiny: true, nature: "Adamant", ivs: {hp: 31, atk: 31, def: 31, spa: 14, spd: 31, spe: 0}, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 100, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 70, pokeball: "pokeball"}, + {generation: 5, level: 100, gender: "M", pokeball: "cherishball"}, + {generation: 5, level: 55, gender: "M", isHidden: true}, + {generation: 6, level: 50, pokeball: "cherishball"}, + {generation: 6, level: 50, nature: "Jolly", pokeball: "cherishball"}, + {generation: 6, level: 55, shiny: true, nature: "Adamant", ivs: {hp: 31, atk: 31, def: 31, spa: 14, spd: 31, spe: 0}, pokeball: "cherishball"}, + {generation: 6, level: 100, pokeball: "cherishball"}, ], encounters: [ {generation: 5, level: 50}, @@ -33078,18 +33078,18 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 70, shiny: 1, moves: ["2L1"]}, - {generation: 3, level: 50, moves: ["2L1"]}, - {generation: 4, level: 45, shiny: 1, moves: ["2L1"]}, - {generation: 4, level: 70, shiny: 1, moves: ["2L1"]}, - {generation: 5, level: 5, isHidden: true, moves: ["2L1"], pokeball: "dreamball"}, - {generation: 6, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 6, level: 50, nature: "Timid", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 7, level: 100, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 60, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 3, level: 70, shiny: 1}, + {generation: 3, level: 50}, + {generation: 4, level: 45, shiny: 1}, + {generation: 4, level: 70, shiny: 1}, + {generation: 5, level: 5, isHidden: true, pokeball: "dreamball"}, + {generation: 6, level: 50, shiny: 1}, + {generation: 6, level: 50, nature: "Timid", pokeball: "cherishball"}, + {generation: 7, level: 60, shiny: 1}, + {generation: 7, level: 100, isHidden: true, pokeball: "cherishball"}, + {generation: 7, level: 60, pokeball: "cherishball"}, + {generation: 7, level: 100, pokeball: "cherishball"}, + {generation: 8, level: 70, shiny: 1}, ], encounters: [ {generation: 2, level: 40}, @@ -33203,17 +33203,17 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 70, shiny: 1, moves: ["2L1"]}, - {generation: 4, level: 45, shiny: 1, moves: ["2L1"]}, - {generation: 4, level: 70, shiny: 1, moves: ["2L1"]}, - {generation: 5, level: 5, isHidden: true, moves: ["2L1"], pokeball: "dreamball"}, - {generation: 6, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 6, level: 50, shiny: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 7, level: 60, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 3, level: 70, shiny: 1}, + {generation: 4, level: 45, shiny: 1}, + {generation: 4, level: 70, shiny: 1}, + {generation: 5, level: 5, isHidden: true, pokeball: "dreamball"}, + {generation: 6, level: 50, shiny: 1}, + {generation: 6, level: 50, shiny: true, pokeball: "cherishball"}, + {generation: 7, level: 100, pokeball: "cherishball"}, + {generation: 7, level: 60, shiny: 1}, + {generation: 7, level: 60, pokeball: "cherishball"}, + {generation: 7, level: 100, pokeball: "cherishball"}, + {generation: 8, level: 70, shiny: 1}, ], encounters: [ {generation: 2, level: 40}, @@ -33329,15 +33329,15 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 10, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 70, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 10, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 30, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 4, level: 50, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 10, moves: ["2L1"], pokeball: "luxuryball"}, - {generation: 6, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 30, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 60, shiny: true, nature: "Quirky", moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 10, pokeball: "pokeball"}, + {generation: 3, level: 70, pokeball: "pokeball"}, + {generation: 3, level: 10, pokeball: "pokeball"}, + {generation: 3, level: 30, pokeball: "pokeball"}, + {generation: 4, level: 50, pokeball: "cherishball"}, + {generation: 6, level: 10, pokeball: "luxuryball"}, + {generation: 6, level: 100, pokeball: "cherishball"}, + {generation: 7, level: 30, pokeball: "cherishball"}, + {generation: 8, level: 60, shiny: true, nature: "Quirky", pokeball: "cherishball"}, ], encounters: [ {generation: 2, level: 30}, @@ -33446,8 +33446,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { worryseed: ["2L1"], }, eventData: [ - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 5, level: 10, gender: "M", isHidden: true, moves: ["2L1"]}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, + {generation: 5, level: 10, gender: "M", isHidden: true}, ], }, grovyle: { @@ -33670,7 +33670,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { xscissor: ["2L1"], }, eventData: [ - {generation: 5, level: 50, shiny: 1, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 50, shiny: 1, pokeball: "cherishball"}, ], }, torchic: { @@ -33759,9 +33759,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 5, level: 10, gender: "M", isHidden: true, moves: ["2L1"]}, - {generation: 6, level: 10, gender: "M", isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, + {generation: 5, level: 10, gender: "M", isHidden: true}, + {generation: 6, level: 10, gender: "M", isHidden: true, pokeball: "cherishball"}, ], }, combusken: { @@ -33989,8 +33989,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 3, level: 70, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 5, level: 50, shiny: 1, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 70, pokeball: "pokeball"}, + {generation: 5, level: 50, shiny: 1, pokeball: "cherishball"}, ], }, mudkip: { @@ -34082,8 +34082,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { yawn: ["2L1"], }, eventData: [ - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 5, level: 10, gender: "M", isHidden: true, moves: ["2L1"]}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, + {generation: 5, level: 10, gender: "M", isHidden: true}, ], }, marshtomp: { @@ -34294,7 +34294,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 5, level: 50, shiny: 1, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 50, shiny: 1, pokeball: "cherishball"}, ], }, poochyena: { @@ -34378,7 +34378,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { yawn: ["2L1"], }, eventData: [ - {generation: 3, level: 10, abilities: ["2L1"], moves: ["2L1"]}, + {generation: 3, level: 10}, ], encounters: [ {generation: 3, level: 2}, @@ -34466,7 +34466,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { yawn: ["2L1"], }, eventData: [ - {generation: 7, level: 64, gender: "M", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 7, level: 64, gender: "M", pokeball: "cherishball"}, ], }, zigzagoon: { @@ -34554,8 +34554,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 3, level: 5, shiny: true, abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: 1, abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball", emeraldEventEgg: true}, + {generation: 3, level: 5, shiny: true, pokeball: "pokeball"}, + {generation: 3, level: 5, shiny: 1, pokeball: "pokeball", emeraldEventEgg: true}, ], encounters: [ {generation: 3, level: 2}, @@ -34714,7 +34714,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 6, level: 50, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 6, level: 50, pokeball: "cherishball"}, ], encounters: [ {generation: 4, level: 3}, @@ -35118,7 +35118,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, ], encounters: [ {generation: 3, level: 3}, @@ -35329,8 +35329,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 5, level: 50, shiny: 1, abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 30, gender: "M", nature: "Calm", abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, + {generation: 5, level: 50, shiny: 1, pokeball: "cherishball"}, + {generation: 5, level: 30, gender: "M", nature: "Calm", pokeball: "pokeball"}, ], }, seedot: { @@ -35412,8 +35412,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { worryseed: ["2L1"], }, eventData: [ - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 17, moves: ["2L1"]}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, + {generation: 3, level: 17}, ], encounters: [ {generation: 3, level: 3}, @@ -35734,7 +35734,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 3, level: 5, shiny: 1, moves: ["2L1"], pokeball: "pokeball", emeraldEventEgg: true}, + {generation: 3, level: 5, shiny: 1, pokeball: "pokeball", emeraldEventEgg: true}, ], encounters: [ {generation: 3, level: 4}, @@ -35801,7 +35801,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 3, level: 43, moves: ["2L1"]}, + {generation: 3, level: 43}, ], encounters: [ {generation: 4, level: 20}, @@ -36096,10 +36096,10 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 5, shiny: 1, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: 1, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 20, moves: ["2L1"]}, - {generation: 6, level: 1, isHidden: true, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 5, shiny: 1, pokeball: "pokeball"}, + {generation: 3, level: 5, shiny: 1, pokeball: "pokeball"}, + {generation: 3, level: 20}, + {generation: 6, level: 1, isHidden: true, pokeball: "pokeball"}, ], encounters: [ {generation: 3, level: 4}, @@ -36328,8 +36328,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 5, level: 50, shiny: 1, abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 50, shiny: true, gender: "F", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 50, shiny: 1, pokeball: "cherishball"}, + {generation: 6, level: 50, shiny: true, gender: "F", pokeball: "cherishball"}, ], }, gallade: { @@ -36561,8 +36561,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { watersport: ["2L1"], }, eventData: [ - {generation: 3, level: 5, shiny: 1, moves: ["2L1"], pokeball: "pokeball", emeraldEventEgg: true}, - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 5, shiny: 1, pokeball: "pokeball", emeraldEventEgg: true}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, ], encounters: [ {generation: 3, level: 3}, @@ -36731,7 +36731,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 15, abilities: ["2L1"], moves: ["2L1"]}, + {generation: 3, level: 15}, ], }, breloom: { @@ -37183,7 +37183,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 4, level: 50, gender: "M", nature: "Adamant", moves: ["2L1"], pokeball: "cherishball"}, + {generation: 4, level: 50, gender: "M", nature: "Adamant", pokeball: "cherishball"}, ], }, nincada: { @@ -37391,7 +37391,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { xscissor: ["2L1"], }, eventData: [ - {generation: 3, level: 50, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 50, pokeball: "pokeball"}, ], }, whismur: { @@ -37471,7 +37471,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 5, shiny: 1, moves: ["2L1"], pokeball: "pokeball", emeraldEventEgg: true}, + {generation: 3, level: 5, shiny: 1, pokeball: "pokeball", emeraldEventEgg: true}, ], }, loudred: { @@ -37658,8 +37658,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 100, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 50, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 100, pokeball: "pokeball"}, + {generation: 3, level: 50, pokeball: "pokeball"}, ], }, makuhita: { @@ -37766,7 +37766,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 18, moves: ["2L1"]}, + {generation: 3, level: 18}, ], }, hariyama: { @@ -37965,7 +37965,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zapcannon: ["2L1"], }, eventData: [ - {generation: 3, level: 26, moves: ["2L1"]}, + {generation: 3, level: 26}, ], }, probopass: { @@ -38146,12 +38146,12 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 5, shiny: 1, abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball", emeraldEventEgg: true}, - {generation: 3, level: 5, shiny: 1, abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball", emeraldEventEgg: true}, - {generation: 3, level: 10, gender: "M", abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 5, shiny: 1, pokeball: "pokeball", emeraldEventEgg: true}, + {generation: 3, level: 5, shiny: 1, pokeball: "pokeball", emeraldEventEgg: true}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, ], encounters: [ - {generation: 3, level: 3, gender: "F", ivs: {hp: 5, atk: 4, def: 4, spa: 5, spd: 4, spe: 4}, abilities: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 3, gender: "F", ivs: {hp: 5, atk: 4, def: 4, spa: 5, spd: 4, spe: 4}, pokeball: "pokeball"}, ], }, delcatty: { @@ -38230,7 +38230,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 18, abilities: ["2L1"], moves: ["2L1"]}, + {generation: 3, level: 18}, ], }, sableye: { @@ -38374,11 +38374,11 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 10, gender: "M", abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 33, abilities: ["2L1"], moves: ["2L1"]}, - {generation: 5, level: 50, gender: "M", isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 50, nature: "Relaxed", ivs: {hp: 31, spa: 31}, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 100, nature: "Bold", isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, + {generation: 3, level: 33}, + {generation: 5, level: 50, gender: "M", isHidden: true, pokeball: "cherishball"}, + {generation: 6, level: 50, nature: "Relaxed", ivs: {hp: 31, spa: 31}, isHidden: true, pokeball: "cherishball"}, + {generation: 6, level: 100, nature: "Bold", isHidden: true, pokeball: "cherishball"}, ], }, mawile: { @@ -38494,10 +38494,10 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { visegrip: ["2L1"], }, eventData: [ - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 22, moves: ["2L1"]}, - {generation: 6, level: 50, abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 100, abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, + {generation: 3, level: 22}, + {generation: 6, level: 50, pokeball: "cherishball"}, + {generation: 6, level: 100, pokeball: "cherishball"}, ], }, aron: { @@ -38781,9 +38781,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { whirlpool: ["2L1"], }, eventData: [ - {generation: 3, level: 100, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 50, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 6, level: 50, nature: "Brave", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 100, pokeball: "pokeball"}, + {generation: 3, level: 50, pokeball: "pokeball"}, + {generation: 6, level: 50, nature: "Brave", pokeball: "cherishball"}, ], }, meditite: { @@ -38899,8 +38899,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 20, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, + {generation: 3, level: 20, pokeball: "pokeball"}, ], }, medicham: { @@ -39162,8 +39162,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wildcharge: ["2L1"], }, eventData: [ - {generation: 3, level: 44, moves: ["2L1"]}, - {generation: 6, level: 50, nature: "Timid", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 44}, + {generation: 6, level: 50, nature: "Timid", pokeball: "cherishball"}, ], }, plusle: { @@ -39258,8 +39258,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wish: ["2L1"], }, eventData: [ - {generation: 3, level: 5, shiny: 1, moves: ["2L1"], pokeball: "pokeball", emeraldEventEgg: true}, - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 5, shiny: 1, pokeball: "pokeball", emeraldEventEgg: true}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, ], }, minun: { @@ -39352,8 +39352,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wish: ["2L1"], }, eventData: [ - {generation: 3, level: 5, shiny: 1, moves: ["2L1"], pokeball: "pokeball", emeraldEventEgg: true}, - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 5, shiny: 1, pokeball: "pokeball", emeraldEventEgg: true}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, ], }, volbeat: { @@ -39689,8 +39689,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { worryseed: ["2L1"], }, eventData: [ - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 22, moves: ["2L1"]}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, + {generation: 3, level: 22}, ], }, roserade: { @@ -39856,7 +39856,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { yawn: ["2L1"], }, eventData: [ - {generation: 3, level: 17, moves: ["2L1"]}, + {generation: 3, level: 17}, ], }, swalot: { @@ -40027,8 +40027,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 15, moves: ["2L1"]}, - {generation: 6, level: 1, isHidden: true, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 15}, + {generation: 6, level: 1, isHidden: true, pokeball: "pokeball"}, ], }, sharpedo: { @@ -40118,8 +40118,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 6, level: 50, nature: "Adamant", isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 43, gender: "M", perfectIVs: 2, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 6, level: 50, nature: "Adamant", isHidden: true, pokeball: "cherishball"}, + {generation: 6, level: 43, gender: "M", perfectIVs: 2, pokeball: "cherishball"}, ], encounters: [ {generation: 7, level: 10}, @@ -40269,8 +40269,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 100, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 50, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 100, pokeball: "pokeball"}, + {generation: 3, level: 50, pokeball: "pokeball"}, ], encounters: [ {generation: 3, level: 25}, @@ -40372,8 +40372,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 14, abilities: ["2L1"], moves: ["2L1"]}, - {generation: 6, level: 1, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 14}, + {generation: 6, level: 1, pokeball: "pokeball"}, ], }, camerupt: { @@ -40470,7 +40470,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 6, level: 43, gender: "M", perfectIVs: 2, abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 6, level: 43, gender: "M", perfectIVs: 2, pokeball: "cherishball"}, ], encounters: [ {generation: 6, level: 30}, @@ -40568,7 +40568,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 8, level: 50, gender: "M", nature: "Bold", abilities: ["2L1"], ivs: {hp: 31, atk: 12, def: 31, spa: 31, spd: 31, spe: 0}, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 8, level: 50, gender: "M", nature: "Bold", ivs: {hp: 31, atk: 12, def: 31, spa: 31, spd: 31, spe: 0}, pokeball: "cherishball"}, ], }, spoink: { @@ -40667,7 +40667,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 5, shiny: 1, abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball", emeraldEventEgg: true}, + {generation: 3, level: 5, shiny: 1, pokeball: "pokeball", emeraldEventEgg: true}, ], }, grumpig: { @@ -40903,7 +40903,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 5, shiny: 1, moves: ["2L1"], pokeball: "pokeball", emeraldEventEgg: true}, + {generation: 3, level: 5, shiny: 1, pokeball: "pokeball", emeraldEventEgg: true}, ], }, trapinch: { @@ -40973,7 +40973,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { toxic: ["2L1"], }, eventData: [ - {generation: 5, level: 1, shiny: true, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 5, level: 1, shiny: true, pokeball: "pokeball"}, ], }, vibrava: { @@ -41182,8 +41182,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { vacuumwave: ["2L1"], }, eventData: [ - {generation: 3, level: 45, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 4, level: 50, gender: "M", nature: "Naive", moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 45, pokeball: "pokeball"}, + {generation: 4, level: 50, gender: "M", nature: "Naive", pokeball: "cherishball"}, ], }, cacnea: { @@ -41293,7 +41293,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { worryseed: ["2L1"], }, eventData: [ - {generation: 3, level: 5, shiny: 1, moves: ["2L1"], pokeball: "pokeball", emeraldEventEgg: true}, + {generation: 3, level: 5, shiny: 1, pokeball: "pokeball", emeraldEventEgg: true}, ], }, cacturne: { @@ -41411,7 +41411,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 45, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 45, pokeball: "pokeball"}, ], encounters: [ {generation: 6, level: 30}, @@ -41504,9 +41504,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { uproar: ["2L1"], }, eventData: [ - {generation: 3, level: 5, shiny: 1, moves: ["2L1"], pokeball: "pokeball", emeraldEventEgg: true}, - {generation: 5, level: 1, shiny: true, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 6, level: 1, isHidden: true, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 5, shiny: 1, pokeball: "pokeball", emeraldEventEgg: true}, + {generation: 5, level: 1, shiny: true, pokeball: "pokeball"}, + {generation: 6, level: 1, isHidden: true, pokeball: "pokeball"}, ], }, altaria: { @@ -41613,10 +41613,10 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wonderroom: ["2L1"], }, eventData: [ - {generation: 3, level: 45, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 36, moves: ["2L1"]}, - {generation: 5, level: 35, gender: "M", isHidden: true, moves: ["2L1"]}, - {generation: 6, level: 100, nature: "Modest", isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 45, pokeball: "pokeball"}, + {generation: 3, level: 36}, + {generation: 5, level: 35, gender: "M", isHidden: true}, + {generation: 6, level: 100, nature: "Modest", isHidden: true, pokeball: "cherishball"}, ], }, zangoose: { @@ -41747,9 +41747,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 18, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 28, moves: ["2L1"]}, + {generation: 3, level: 18, pokeball: "pokeball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, + {generation: 3, level: 28}, ], }, seviper: { @@ -41860,9 +41860,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 18, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 30, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 18, pokeball: "pokeball"}, + {generation: 3, level: 30, pokeball: "pokeball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, ], }, lunatone: { @@ -41963,9 +41963,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 10, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 25, moves: ["2L1"]}, - {generation: 7, level: 30, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 10, pokeball: "pokeball"}, + {generation: 3, level: 25}, + {generation: 7, level: 30, pokeball: "cherishball"}, ], }, solrock: { @@ -42070,9 +42070,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 10, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 41, moves: ["2L1"]}, - {generation: 7, level: 30, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 10, pokeball: "pokeball"}, + {generation: 3, level: 41}, + {generation: 7, level: 30, pokeball: "cherishball"}, ], }, barboach: { @@ -42234,7 +42234,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 4, level: 51, gender: "F", nature: "Gentle", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 4, level: 51, gender: "F", nature: "Gentle", pokeball: "cherishball"}, ], encounters: [ {generation: 4, level: 10}, @@ -42331,7 +42331,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { xscissor: ["2L1"], }, eventData: [ - {generation: 3, level: 5, shiny: 1, moves: ["2L1"], pokeball: "pokeball", emeraldEventEgg: true}, + {generation: 3, level: 5, shiny: 1, pokeball: "pokeball", emeraldEventEgg: true}, ], }, crawdaunt: { @@ -42433,8 +42433,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { xscissor: ["2L1"], }, eventData: [ - {generation: 3, level: 100, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 50, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 100, pokeball: "pokeball"}, + {generation: 3, level: 50, pokeball: "pokeball"}, ], encounters: [ {generation: 7, level: 10}, @@ -42528,7 +42528,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 17, moves: ["2L1"]}, + {generation: 3, level: 17}, ], }, claydol: { @@ -42703,7 +42703,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wringout: ["2L1"], }, eventData: [ - {generation: 5, level: 15, gender: "M", moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 15, gender: "M", pokeball: "cherishball"}, ], }, cradily: { @@ -42859,7 +42859,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { xscissor: ["2L1"], }, eventData: [ - {generation: 5, level: 15, gender: "M", moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 15, gender: "M", pokeball: "cherishball"}, ], }, armaldo: { @@ -43002,7 +43002,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { whirlpool: ["2L1"], }, eventData: [ - {generation: 4, level: 5, gender: "F", nature: "Calm", moves: ["2L1"], pokeball: "cherishball"}, + {generation: 4, level: 5, gender: "F", nature: "Calm", pokeball: "cherishball"}, ], }, milotic: { @@ -43095,11 +43095,11 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wrap: ["2L1"], }, eventData: [ - {generation: 3, level: 35, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 4, level: 50, gender: "F", nature: "Bold", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 4, level: 50, shiny: true, gender: "M", nature: "Timid", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 50, shiny: 1, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 58, gender: "M", nature: "Lax", ivs: {hp: 30, atk: 30, def: 30, spa: 30, spd: 30, spe: 30}, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 35, pokeball: "pokeball"}, + {generation: 4, level: 50, gender: "F", nature: "Bold", pokeball: "cherishball"}, + {generation: 4, level: 50, shiny: true, gender: "M", nature: "Timid", pokeball: "cherishball"}, + {generation: 5, level: 50, shiny: 1, pokeball: "cherishball"}, + {generation: 5, level: 58, gender: "M", nature: "Lax", ivs: {hp: 30, atk: 30, def: 30, spa: 30, spd: 30, spe: 30}, pokeball: "cherishball"}, ], }, castform: { @@ -43383,7 +43383,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { willowisp: ["2L1"], }, eventData: [ - {generation: 3, level: 45, abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 45, pokeball: "pokeball"}, ], }, banette: { @@ -43484,8 +43484,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { willowisp: ["2L1"], }, eventData: [ - {generation: 3, level: 37, abilities: ["2L1"], moves: ["2L1"]}, - {generation: 5, level: 37, gender: "F", isHidden: true, moves: ["2L1"]}, + {generation: 3, level: 37}, + {generation: 5, level: 37, gender: "F", isHidden: true}, ], encounters: [ {generation: 5, level: 32}, @@ -43577,8 +43577,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wonderroom: ["2L1"], }, eventData: [ - {generation: 3, level: 45, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 19, moves: ["2L1"]}, + {generation: 3, level: 45, pokeball: "pokeball"}, + {generation: 3, level: 19}, ], }, dusclops: { @@ -43895,7 +43895,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 4, level: 53, gender: "F", nature: "Jolly", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 4, level: 53, gender: "F", nature: "Jolly", pokeball: "cherishball"}, ], }, chingling: { @@ -44085,7 +44085,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 10, gender: "M", moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 10, gender: "M", pokeball: "pokeball"}, ], }, absol: { @@ -44205,10 +44205,10 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 5, shiny: 1, abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: 1, abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 35, abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 70, abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 5, shiny: 1, pokeball: "pokeball"}, + {generation: 3, level: 5, shiny: 1, pokeball: "pokeball"}, + {generation: 3, level: 35, pokeball: "pokeball"}, + {generation: 3, level: 70, pokeball: "pokeball"}, ], }, snorunt: { @@ -44277,7 +44277,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { weatherball: ["2L1"], }, eventData: [ - {generation: 3, level: 20, abilities: ["2L1"], moves: ["2L1"]}, + {generation: 3, level: 20}, ], }, glalie: { @@ -44532,7 +44532,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { yawn: ["2L1"], }, eventData: [ - {generation: 3, level: 17, abilities: ["2L1"], moves: ["2L1"]}, + {generation: 3, level: 17}, ], }, sealeo: { @@ -44679,7 +44679,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { whirlpool: ["2L1"], }, eventData: [ - {generation: 5, level: 50, abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 50, pokeball: "cherishball"}, ], encounters: [ {generation: 5, level: 30}, @@ -45080,10 +45080,10 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 5, shiny: 1, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: 1, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 5, level: 1, shiny: true, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 6, level: 1, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 5, shiny: 1, pokeball: "pokeball"}, + {generation: 3, level: 5, shiny: 1, pokeball: "pokeball"}, + {generation: 5, level: 1, shiny: true, pokeball: "pokeball"}, + {generation: 6, level: 1, pokeball: "pokeball"}, ], }, shelgon: { @@ -45261,10 +45261,10 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 50, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 50, moves: ["2L1"]}, - {generation: 4, level: 50, gender: "M", nature: "Naughty", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 50, shiny: 1, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 50, pokeball: "pokeball"}, + {generation: 3, level: 50}, + {generation: 4, level: 50, gender: "M", nature: "Naughty", pokeball: "cherishball"}, + {generation: 5, level: 50, shiny: 1, pokeball: "cherishball"}, ], encounters: [ {generation: 7, level: 9}, @@ -45283,7 +45283,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 6, level: 5, shiny: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 6, level: 5, shiny: true, pokeball: "cherishball"}, ], }, metang: { @@ -45384,7 +45384,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 30, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 3, level: 30, pokeball: "pokeball"}, ], }, metagross: { @@ -45494,14 +45494,14 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 4, level: 62, nature: "Brave", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 50, shiny: 1, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 45, shiny: true, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 5, level: 45, isHidden: true, moves: ["2L1"]}, - {generation: 5, level: 45, isHidden: true, moves: ["2L1"]}, - {generation: 5, level: 58, nature: "Serious", ivs: {hp: 30, atk: 30, def: 30, spa: 30, spd: 30, spe: 30}, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 50, nature: "Jolly", ivs: {hp: 31, atk: 31, def: 31, spa: 31, spd: 31, spe: 31}, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 4, level: 62, nature: "Brave", pokeball: "cherishball"}, + {generation: 5, level: 50, shiny: 1, pokeball: "cherishball"}, + {generation: 5, level: 100, pokeball: "cherishball"}, + {generation: 5, level: 45, shiny: true, pokeball: "pokeball"}, + {generation: 5, level: 45, isHidden: true}, + {generation: 5, level: 45, isHidden: true}, + {generation: 5, level: 58, nature: "Serious", ivs: {hp: 30, atk: 30, def: 30, spa: 30, spd: 30, spe: 30}, pokeball: "cherishball"}, + {generation: 7, level: 50, nature: "Jolly", ivs: {hp: 31, atk: 31, def: 31, spa: 31, spd: 31, spe: 31}, pokeball: "cherishball"}, ], }, regirock: { @@ -45595,14 +45595,14 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zapcannon: ["2L1"], }, eventData: [ - {generation: 3, level: 40, shiny: 1, moves: ["2L1"]}, - {generation: 3, level: 40, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 4, level: 30, shiny: 1, moves: ["2L1"]}, - {generation: 5, level: 65, shiny: 1, moves: ["2L1"]}, - {generation: 6, level: 40, shiny: 1, moves: ["2L1"]}, - {generation: 6, level: 50, isHidden: true, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 3, level: 40, shiny: 1}, + {generation: 3, level: 40, pokeball: "pokeball"}, + {generation: 4, level: 30, shiny: 1}, + {generation: 5, level: 65, shiny: 1}, + {generation: 6, level: 40, shiny: 1}, + {generation: 6, level: 50, isHidden: true, pokeball: "pokeball"}, + {generation: 7, level: 60, shiny: 1}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -45693,14 +45693,14 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zapcannon: ["2L1"], }, eventData: [ - {generation: 3, level: 40, shiny: 1, moves: ["2L1"]}, - {generation: 3, level: 40, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 4, level: 30, shiny: 1, moves: ["2L1"]}, - {generation: 5, level: 65, shiny: 1, moves: ["2L1"]}, - {generation: 6, level: 40, shiny: 1, moves: ["2L1"]}, - {generation: 6, level: 50, isHidden: true, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 3, level: 40, shiny: 1}, + {generation: 3, level: 40, pokeball: "pokeball"}, + {generation: 4, level: 30, shiny: 1}, + {generation: 5, level: 65, shiny: 1}, + {generation: 6, level: 40, shiny: 1}, + {generation: 6, level: 50, isHidden: true, pokeball: "pokeball"}, + {generation: 7, level: 60, shiny: 1}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -45797,14 +45797,14 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zapcannon: ["2L1"], }, eventData: [ - {generation: 3, level: 40, shiny: 1, moves: ["2L1"]}, - {generation: 3, level: 40, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 4, level: 30, shiny: 1, moves: ["2L1"]}, - {generation: 5, level: 65, shiny: 1, moves: ["2L1"]}, - {generation: 6, level: 40, shiny: 1, moves: ["2L1"]}, - {generation: 6, level: 50, isHidden: true, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 3, level: 40, shiny: 1}, + {generation: 3, level: 40, pokeball: "pokeball"}, + {generation: 4, level: 30, shiny: 1}, + {generation: 5, level: 65, shiny: 1}, + {generation: 6, level: 40, shiny: 1}, + {generation: 6, level: 50, isHidden: true, pokeball: "pokeball"}, + {generation: 7, level: 60, shiny: 1}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -45935,18 +45935,18 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 40, shiny: 1, moves: ["2L1"]}, - {generation: 3, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 3, level: 70, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 4, level: 35, shiny: 1, moves: ["2L1"]}, - {generation: 4, level: 40, shiny: 1, moves: ["2L1"]}, - {generation: 5, level: 68, shiny: 1, moves: ["2L1"]}, - {generation: 6, level: 30, shiny: 1, moves: ["2L1"]}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 7, level: 60, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, - {generation: 8, level: 70, nature: "Bashful", moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 40, shiny: 1}, + {generation: 3, level: 50, shiny: 1}, + {generation: 3, level: 70, pokeball: "pokeball"}, + {generation: 4, level: 35, shiny: 1}, + {generation: 4, level: 40, shiny: 1}, + {generation: 5, level: 68, shiny: 1}, + {generation: 6, level: 30, shiny: 1}, + {generation: 7, level: 60, shiny: 1}, + {generation: 7, level: 60, pokeball: "cherishball"}, + {generation: 7, level: 100, pokeball: "cherishball"}, + {generation: 8, level: 70, shiny: 1}, + {generation: 8, level: 70, nature: "Bashful", pokeball: "cherishball"}, ], eventOnly: false, }, @@ -46070,18 +46070,18 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 40, shiny: 1, moves: ["2L1"]}, - {generation: 3, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 3, level: 70, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 4, level: 35, shiny: 1, moves: ["2L1"]}, - {generation: 4, level: 40, shiny: 1, moves: ["2L1"]}, - {generation: 5, level: 68, shiny: 1, moves: ["2L1"]}, - {generation: 6, level: 30, shiny: 1, moves: ["2L1"]}, - {generation: 6, level: 50, nature: "Modest", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 7, level: 60, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 3, level: 40, shiny: 1}, + {generation: 3, level: 50, shiny: 1}, + {generation: 3, level: 70, pokeball: "pokeball"}, + {generation: 4, level: 35, shiny: 1}, + {generation: 4, level: 40, shiny: 1}, + {generation: 5, level: 68, shiny: 1}, + {generation: 6, level: 30, shiny: 1}, + {generation: 6, level: 50, nature: "Modest", pokeball: "cherishball"}, + {generation: 7, level: 60, shiny: 1}, + {generation: 7, level: 60, pokeball: "cherishball"}, + {generation: 7, level: 100, pokeball: "cherishball"}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -46162,18 +46162,18 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { whirlpool: ["2L1"], }, eventData: [ - {generation: 3, level: 45, shiny: 1, moves: ["2L1"]}, - {generation: 3, level: 70, shiny: 1, moves: ["2L1"]}, - {generation: 4, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 5, level: 80, shiny: 1, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 45, moves: ["2L1"]}, - {generation: 6, level: 100, nature: "Timid", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 7, level: 60, shiny: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 60, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 3, level: 45, shiny: 1}, + {generation: 3, level: 70, shiny: 1}, + {generation: 4, level: 50, shiny: 1}, + {generation: 5, level: 80, shiny: 1, pokeball: "cherishball"}, + {generation: 5, level: 100, pokeball: "cherishball"}, + {generation: 6, level: 45}, + {generation: 6, level: 100, nature: "Timid", pokeball: "cherishball"}, + {generation: 7, level: 60, shiny: 1}, + {generation: 7, level: 60, shiny: true, pokeball: "cherishball"}, + {generation: 7, level: 60, pokeball: "cherishball"}, + {generation: 7, level: 100, pokeball: "cherishball"}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -46289,18 +46289,18 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 45, shiny: 1, moves: ["2L1"]}, - {generation: 3, level: 70, shiny: 1, moves: ["2L1"]}, - {generation: 4, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 5, level: 80, shiny: 1, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 45, moves: ["2L1"]}, - {generation: 6, level: 100, nature: "Adamant", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 7, level: 60, shiny: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 60, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 3, level: 45, shiny: 1}, + {generation: 3, level: 70, shiny: 1}, + {generation: 4, level: 50, shiny: 1}, + {generation: 5, level: 80, shiny: 1, pokeball: "cherishball"}, + {generation: 5, level: 100, pokeball: "cherishball"}, + {generation: 6, level: 45}, + {generation: 6, level: 100, nature: "Adamant", pokeball: "cherishball"}, + {generation: 7, level: 60, shiny: 1}, + {generation: 7, level: 60, shiny: true, pokeball: "cherishball"}, + {generation: 7, level: 60, pokeball: "cherishball"}, + {generation: 7, level: 100, pokeball: "cherishball"}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -46415,16 +46415,16 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wildcharge: ["2L1"], }, eventData: [ - {generation: 3, level: 70, shiny: 1, moves: ["2L1"]}, - {generation: 4, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 5, level: 70, shiny: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 70, moves: ["2L1"]}, - {generation: 6, level: 70, shiny: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 70, shiny: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 100, shiny: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 3, level: 70, shiny: 1}, + {generation: 4, level: 50, shiny: 1}, + {generation: 5, level: 70, shiny: true, pokeball: "cherishball"}, + {generation: 5, level: 100, pokeball: "cherishball"}, + {generation: 6, level: 70}, + {generation: 6, level: 70, shiny: true, pokeball: "cherishball"}, + {generation: 6, level: 70, shiny: true, pokeball: "cherishball"}, + {generation: 6, level: 100, shiny: true, pokeball: "cherishball"}, + {generation: 7, level: 60, shiny: 1}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -46545,30 +46545,30 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 5, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Bashful", ivs: {hp: 24, atk: 3, def: 30, spa: 12, spd: 16, spe: 11}, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Careful", ivs: {hp: 10, atk: 0, def: 10, spa: 10, spd: 26, spe: 12}, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Docile", ivs: {hp: 19, atk: 7, def: 10, spa: 19, spd: 10, spe: 16}, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Hasty", ivs: {hp: 3, atk: 12, def: 12, spa: 7, spd: 11, spe: 9}, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Jolly", ivs: {hp: 11, atk: 8, def: 6, spa: 14, spd: 5, spe: 20}, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Lonely", ivs: {hp: 31, atk: 23, def: 26, spa: 29, spd: 18, spe: 5}, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Naughty", ivs: {hp: 21, atk: 31, def: 31, spa: 18, spd: 24, spe: 19}, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Serious", ivs: {hp: 29, atk: 10, def: 31, spa: 25, spd: 23, spe: 21}, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Timid", ivs: {hp: 15, atk: 28, def: 29, spa: 3, spd: 0, spe: 7}, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 3, level: 30, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 4, level: 5, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 4, level: 5, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 50, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 50, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 50, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 50, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 10, shiny: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 15, shiny: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 25, shiny: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 15, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 70, nature: "Timid", moves: ["2L1"], pokeball: "cherishball"}, + {generation: 3, level: 5, pokeball: "pokeball"}, + {generation: 3, level: 5, shiny: true, nature: "Bashful", ivs: {hp: 24, atk: 3, def: 30, spa: 12, spd: 16, spe: 11}, pokeball: "pokeball"}, + {generation: 3, level: 5, shiny: true, nature: "Careful", ivs: {hp: 10, atk: 0, def: 10, spa: 10, spd: 26, spe: 12}, pokeball: "pokeball"}, + {generation: 3, level: 5, shiny: true, nature: "Docile", ivs: {hp: 19, atk: 7, def: 10, spa: 19, spd: 10, spe: 16}, pokeball: "pokeball"}, + {generation: 3, level: 5, shiny: true, nature: "Hasty", ivs: {hp: 3, atk: 12, def: 12, spa: 7, spd: 11, spe: 9}, pokeball: "pokeball"}, + {generation: 3, level: 5, shiny: true, nature: "Jolly", ivs: {hp: 11, atk: 8, def: 6, spa: 14, spd: 5, spe: 20}, pokeball: "pokeball"}, + {generation: 3, level: 5, shiny: true, nature: "Lonely", ivs: {hp: 31, atk: 23, def: 26, spa: 29, spd: 18, spe: 5}, pokeball: "pokeball"}, + {generation: 3, level: 5, shiny: true, nature: "Naughty", ivs: {hp: 21, atk: 31, def: 31, spa: 18, spd: 24, spe: 19}, pokeball: "pokeball"}, + {generation: 3, level: 5, shiny: true, nature: "Serious", ivs: {hp: 29, atk: 10, def: 31, spa: 25, spd: 23, spe: 21}, pokeball: "pokeball"}, + {generation: 3, level: 5, shiny: true, nature: "Timid", ivs: {hp: 15, atk: 28, def: 29, spa: 3, spd: 0, spe: 7}, pokeball: "pokeball"}, + {generation: 3, level: 30, pokeball: "pokeball"}, + {generation: 4, level: 5, pokeball: "cherishball"}, + {generation: 4, level: 5, pokeball: "cherishball"}, + {generation: 5, level: 50, pokeball: "cherishball"}, + {generation: 5, level: 50, pokeball: "cherishball"}, + {generation: 5, level: 50, pokeball: "cherishball"}, + {generation: 5, level: 50, pokeball: "cherishball"}, + {generation: 6, level: 10, shiny: true, pokeball: "cherishball"}, + {generation: 6, level: 15, shiny: true, pokeball: "cherishball"}, + {generation: 6, level: 100, pokeball: "cherishball"}, + {generation: 6, level: 25, shiny: true, pokeball: "cherishball"}, + {generation: 6, level: 100, pokeball: "cherishball"}, + {generation: 7, level: 15, pokeball: "cherishball"}, + {generation: 8, level: 70, nature: "Timid", pokeball: "cherishball"}, ], eventOnly: false, }, @@ -46705,17 +46705,17 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 3, level: 30, shiny: 1, moves: ["2L1"]}, - {generation: 3, level: 30, shiny: 1, moves: ["2L1"]}, - {generation: 3, level: 30, shiny: 1, moves: ["2L1"]}, - {generation: 3, level: 70, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 4, level: 50, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 4, level: 50, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 4, level: 50, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 4, level: 50, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 4, level: 50, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 5, level: 100, moves: ["2L1"], pokeball: "duskball"}, - {generation: 6, level: 80, moves: ["2L1"]}, + {generation: 3, level: 30, shiny: 1}, + {generation: 3, level: 30, shiny: 1}, + {generation: 3, level: 30, shiny: 1}, + {generation: 3, level: 70, pokeball: "pokeball"}, + {generation: 4, level: 50, pokeball: "cherishball"}, + {generation: 4, level: 50, pokeball: "pokeball"}, + {generation: 4, level: 50, pokeball: "pokeball"}, + {generation: 4, level: 50, pokeball: "pokeball"}, + {generation: 4, level: 50, pokeball: "pokeball"}, + {generation: 5, level: 100, pokeball: "duskball"}, + {generation: 6, level: 80}, ], eventOnly: false, }, @@ -46813,9 +46813,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 5, level: 10, gender: "M", isHidden: true, moves: ["2L1"]}, - {generation: 5, level: 10, gender: "M", isHidden: true, moves: ["2L1"]}, - {generation: 9, level: 1, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 5, level: 10, gender: "M", isHidden: true}, + {generation: 5, level: 10, gender: "M", isHidden: true}, + {generation: 9, level: 1, pokeball: "pokeball"}, ], }, grotle: { @@ -46994,7 +46994,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 5, level: 100, gender: "M", moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 100, gender: "M", pokeball: "cherishball"}, ], }, chimchar: { @@ -47100,11 +47100,11 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 4, level: 40, gender: "M", nature: "Mild", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 10, gender: "M", isHidden: true, moves: ["2L1"]}, - {generation: 4, level: 40, gender: "M", nature: "Hardy", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 10, gender: "M", isHidden: true, moves: ["2L1"]}, - {generation: 9, level: 1, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 4, level: 40, gender: "M", nature: "Mild", pokeball: "cherishball"}, + {generation: 5, level: 10, gender: "M", isHidden: true}, + {generation: 4, level: 40, gender: "M", nature: "Hardy", pokeball: "cherishball"}, + {generation: 5, level: 10, gender: "M", isHidden: true}, + {generation: 9, level: 1, pokeball: "pokeball"}, ], }, monferno: { @@ -47335,8 +47335,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 5, level: 100, gender: "M", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 88, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 100, gender: "M", pokeball: "cherishball"}, + {generation: 6, level: 88, isHidden: true, pokeball: "cherishball"}, ], }, piplup: { @@ -47429,13 +47429,13 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { yawn: ["2L1"], }, eventData: [ - {generation: 5, level: 10, gender: "M", isHidden: true, moves: ["2L1"]}, - {generation: 5, level: 15, shiny: 1, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 15, gender: "M", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 10, gender: "M", isHidden: true, moves: ["2L1"]}, - {generation: 6, level: 7, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 30, gender: "M", nature: "Hardy", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 9, level: 1, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 5, level: 10, gender: "M", isHidden: true}, + {generation: 5, level: 15, shiny: 1, pokeball: "cherishball"}, + {generation: 5, level: 15, gender: "M", pokeball: "cherishball"}, + {generation: 5, level: 10, gender: "M", isHidden: true}, + {generation: 6, level: 7, pokeball: "cherishball"}, + {generation: 7, level: 30, gender: "M", nature: "Hardy", pokeball: "pokeball"}, + {generation: 9, level: 1, pokeball: "pokeball"}, ], }, prinplup: { @@ -47642,7 +47642,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 5, level: 100, gender: "M", moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 100, gender: "M", pokeball: "cherishball"}, ], }, starly: { @@ -47714,7 +47714,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 4, level: 1, gender: "M", nature: "Mild", moves: ["2L1"], pokeball: "pokeball"}, + {generation: 4, level: 1, gender: "M", nature: "Mild", pokeball: "pokeball"}, ], }, staravia: { @@ -47924,7 +47924,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { yawn: ["2L1"], }, eventData: [ - {generation: 4, level: 1, gender: "M", nature: "Lonely", abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, + {generation: 4, level: 1, gender: "M", nature: "Lonely", pokeball: "pokeball"}, ], }, bibarel: { @@ -48423,7 +48423,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 5, level: 15, gender: "M", moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 15, gender: "M", pokeball: "cherishball"}, ], }, rampardos: { @@ -48610,7 +48610,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wideguard: ["2L1"], }, eventData: [ - {generation: 5, level: 15, gender: "M", moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 15, gender: "M", pokeball: "cherishball"}, ], }, bastiodon: { @@ -49183,7 +49183,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wildcharge: ["2L1"], }, eventData: [ - {generation: 6, level: 50, nature: "Impish", ivs: {hp: 31, atk: 31, def: 31, spa: 14, spd: 31, spe: 31}, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 6, level: 50, nature: "Impish", ivs: {hp: 31, atk: 31, def: 31, spa: 14, spd: 31, spe: 31}, isHidden: true, pokeball: "cherishball"}, ], }, buizel: { @@ -49654,7 +49654,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { whirlpool: ["2L1"], }, eventData: [ - {generation: 7, level: 50, gender: "F", nature: "Modest", abilities: ["2L1"], ivs: {hp: 31, atk: 0, def: 31, spa: 31, spd: 31, spe: 31}, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 7, level: 50, gender: "F", nature: "Modest", ivs: {hp: 31, atk: 0, def: 31, spa: 31, spd: 31, spe: 31}, pokeball: "cherishball"}, ], encounters: [ {generation: 4, level: 20}, @@ -49670,10 +49670,10 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { yawn: ["2L1"], }, eventData: [ - {generation: 8, level: 50, gender: "F", nature: "Quiet", abilities: ["2L1"], ivs: {hp: 31, atk: 2, def: 31, spa: 31, spd: 31, spe: 0}, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 50, gender: "F", nature: "Sassy", abilities: ["2L1"], ivs: {hp: 31, atk: 0, def: 31, spa: 31, spd: 31, spe: 0}, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 9, level: 50, gender: "M", nature: "Bold", abilities: ["2L1"], ivs: {hp: 31, atk: 0, def: 31, spa: 31, spd: 31, spe: 8}, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 9, level: 50, gender: "F", nature: "Calm", abilities: ["2L1"], ivs: {hp: 31, atk: 0, def: 31, spa: 31, spd: 31, spe: 8}, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 8, level: 50, gender: "F", nature: "Quiet", ivs: {hp: 31, atk: 2, def: 31, spa: 31, spd: 31, spe: 0}, pokeball: "cherishball"}, + {generation: 8, level: 50, gender: "F", nature: "Sassy", ivs: {hp: 31, atk: 0, def: 31, spa: 31, spd: 31, spe: 0}, pokeball: "cherishball"}, + {generation: 9, level: 50, gender: "M", nature: "Bold", ivs: {hp: 31, atk: 0, def: 31, spa: 31, spd: 31, spe: 8}, pokeball: "cherishball"}, + {generation: 9, level: 50, gender: "F", nature: "Calm", ivs: {hp: 31, atk: 0, def: 31, spa: 31, spd: 31, spe: 8}, pokeball: "cherishball"}, ], encounters: [ {generation: 4, level: 20}, @@ -50621,8 +50621,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 9, level: 50, nature: "Relaxed", ivs: {hp: 31, atk: 31, def: 31, spa: 22, spd: 31, spe: 0}, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 9, level: 50, nature: "Modest", moves: ["2L1"], pokeball: "cherishball"}, + {generation: 9, level: 50, nature: "Relaxed", ivs: {hp: 31, atk: 31, def: 31, spa: 22, spd: 31, spe: 0}, pokeball: "cherishball"}, + {generation: 9, level: 50, nature: "Modest", pokeball: "cherishball"}, ], encounters: [ {generation: 6, level: 30}, @@ -50691,7 +50691,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 4, level: 25, gender: "M", nature: "Jolly", abilities: ["2L1"], moves: ["2L1"]}, + {generation: 4, level: 25, gender: "M", nature: "Jolly"}, ], }, spiritomb: { @@ -50783,7 +50783,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wonderroom: ["2L1"], }, eventData: [ - {generation: 5, level: 61, gender: "F", nature: "Quiet", ivs: {hp: 30, atk: 30, def: 30, spa: 30, spd: 30, spe: 30}, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 61, gender: "F", nature: "Quiet", ivs: {hp: 30, atk: 30, def: 30, spa: 30, spd: 30, spe: 30}, pokeball: "cherishball"}, ], }, gible: { @@ -51049,11 +51049,11 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { whirlpool: ["2L1"], }, eventData: [ - {generation: 5, level: 100, gender: "M", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 48, gender: "M", isHidden: true, moves: ["2L1"]}, - {generation: 6, level: 48, gender: "M", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 50, gender: "M", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 66, gender: "F", perfectIVs: 3, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 100, gender: "M", pokeball: "cherishball"}, + {generation: 5, level: 48, gender: "M", isHidden: true}, + {generation: 6, level: 48, gender: "M", pokeball: "cherishball"}, + {generation: 6, level: 50, gender: "M", pokeball: "cherishball"}, + {generation: 6, level: 66, gender: "F", perfectIVs: 3, pokeball: "cherishball"}, ], }, riolu: { @@ -51157,7 +51157,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 4, level: 30, gender: "M", nature: "Serious", abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, + {generation: 4, level: 30, gender: "M", nature: "Serious", pokeball: "pokeball"}, ], }, lucario: { @@ -51278,14 +51278,14 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 4, level: 50, gender: "M", nature: "Modest", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, - {generation: 4, level: 30, gender: "M", nature: "Adamant", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 10, gender: "M", isHidden: true, moves: ["2L1"]}, - {generation: 5, level: 50, gender: "M", nature: "Naughty", ivs: {atk: 31}, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 100, nature: "Jolly", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 40, gender: "M", nature: "Serious", abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, - {generation: 8, level: 80, gender: "M", nature: "Serious", abilities: ["2L1"], ivs: {hp: 31, atk: 30, def: 30, spa: 31, spd: 30, spe: 31}, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 9, level: 75, shiny: true, gender: "M", nature: "Naive", abilities: ["2L1"], ivs: {hp: 31, atk: 31, def: 20, spa: 31, spd: 20, spe: 31}, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 4, level: 50, gender: "M", nature: "Modest", pokeball: "cherishball"}, + {generation: 4, level: 30, gender: "M", nature: "Adamant", pokeball: "cherishball"}, + {generation: 5, level: 10, gender: "M", isHidden: true}, + {generation: 5, level: 50, gender: "M", nature: "Naughty", ivs: {atk: 31}, isHidden: true, pokeball: "cherishball"}, + {generation: 6, level: 100, nature: "Jolly", pokeball: "cherishball"}, + {generation: 7, level: 40, gender: "M", nature: "Serious", pokeball: "pokeball"}, + {generation: 8, level: 80, gender: "M", nature: "Serious", ivs: {hp: 31, atk: 30, def: 30, spa: 31, spd: 30, spe: 31}, pokeball: "pokeball"}, + {generation: 9, level: 75, shiny: true, gender: "M", nature: "Naive", ivs: {hp: 31, atk: 31, def: 20, spa: 31, spd: 20, spe: 31}, pokeball: "cherishball"}, ], }, hippopotas: { @@ -51725,8 +51725,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { xscissor: ["2L1"], }, eventData: [ - {generation: 5, level: 10, gender: "M", isHidden: true, moves: ["2L1"]}, - {generation: 5, level: 10, gender: "M", isHidden: true, moves: ["2L1"]}, + {generation: 5, level: 10, gender: "M", isHidden: true}, + {generation: 5, level: 10, gender: "M", isHidden: true}, ], }, toxicroak: { @@ -52319,9 +52319,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { willowisp: ["2L1"], }, eventData: [ - {generation: 5, level: 10, nature: "Naughty", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 10, nature: "Quirky", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 10, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 10, nature: "Naughty", pokeball: "cherishball"}, + {generation: 6, level: 10, nature: "Quirky", pokeball: "cherishball"}, + {generation: 7, level: 10, pokeball: "cherishball"}, ], }, rotomheat: { @@ -52450,12 +52450,12 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 4, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 4, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 5, level: 65, shiny: 1, moves: ["2L1"]}, - {generation: 6, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 4, level: 50, shiny: 1}, + {generation: 4, level: 50, shiny: 1}, + {generation: 5, level: 65, shiny: 1}, + {generation: 6, level: 50, shiny: 1}, + {generation: 7, level: 60, shiny: 1}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -52560,12 +52560,12 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 4, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 4, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 5, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 6, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 4, level: 50, shiny: 1}, + {generation: 4, level: 50, shiny: 1}, + {generation: 5, level: 50, shiny: 1}, + {generation: 6, level: 50, shiny: 1}, + {generation: 7, level: 60, shiny: 1}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -52673,12 +52673,12 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 4, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 4, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 5, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 6, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 4, level: 50, shiny: 1}, + {generation: 4, level: 50, shiny: 1}, + {generation: 5, level: 50, shiny: 1}, + {generation: 6, level: 50, shiny: 1}, + {generation: 7, level: 60, shiny: 1}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -52778,20 +52778,20 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { twister: ["2L1"], }, eventData: [ - {generation: 4, level: 47, shiny: 1, moves: ["2L1"]}, - {generation: 4, level: 70, shiny: 1, moves: ["2L1"]}, - {generation: 4, level: 1, shiny: 1, moves: ["2L1"]}, - {generation: 5, level: 5, isHidden: true, moves: ["2L1"], pokeball: "dreamball"}, - {generation: 5, level: 100, shiny: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 6, level: 100, nature: "Modest", isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 7, level: 60, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 50, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, - {generation: 8, level: 70, nature: "Bold", isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 9, level: 75, nature: "Quiet", isHidden: true, perfectIVs: 4, moves: ["2L1"]}, + {generation: 4, level: 47, shiny: 1}, + {generation: 4, level: 70, shiny: 1}, + {generation: 4, level: 1, shiny: 1}, + {generation: 5, level: 5, isHidden: true, pokeball: "dreamball"}, + {generation: 5, level: 100, shiny: true, pokeball: "cherishball"}, + {generation: 6, level: 50, shiny: 1}, + {generation: 6, level: 100, nature: "Modest", isHidden: true, pokeball: "cherishball"}, + {generation: 7, level: 60, shiny: 1}, + {generation: 7, level: 60, pokeball: "cherishball"}, + {generation: 7, level: 100, pokeball: "cherishball"}, + {generation: 7, level: 50, pokeball: "cherishball"}, + {generation: 8, level: 70, shiny: 1}, + {generation: 8, level: 70, nature: "Bold", isHidden: true, pokeball: "cherishball"}, + {generation: 9, level: 75, nature: "Quiet", isHidden: true, perfectIVs: 4}, ], eventOnly: false, }, @@ -52900,20 +52900,20 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { whirlpool: ["2L1"], }, eventData: [ - {generation: 4, level: 47, shiny: 1, moves: ["2L1"]}, - {generation: 4, level: 70, shiny: 1, moves: ["2L1"]}, - {generation: 4, level: 1, shiny: 1, moves: ["2L1"]}, - {generation: 5, level: 5, isHidden: true, moves: ["2L1"], pokeball: "dreamball"}, - {generation: 5, level: 100, shiny: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 6, level: 100, nature: "Timid", isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 7, level: 60, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 50, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, - {generation: 8, level: 70, nature: "Hasty", isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 9, level: 75, nature: "Modest", isHidden: true, perfectIVs: 4, moves: ["2L1"]}, + {generation: 4, level: 47, shiny: 1}, + {generation: 4, level: 70, shiny: 1}, + {generation: 4, level: 1, shiny: 1}, + {generation: 5, level: 5, isHidden: true, pokeball: "dreamball"}, + {generation: 5, level: 100, shiny: true, pokeball: "cherishball"}, + {generation: 6, level: 50, shiny: 1}, + {generation: 6, level: 100, nature: "Timid", isHidden: true, pokeball: "cherishball"}, + {generation: 7, level: 60, shiny: 1}, + {generation: 7, level: 60, pokeball: "cherishball"}, + {generation: 7, level: 100, pokeball: "cherishball"}, + {generation: 7, level: 50, pokeball: "cherishball"}, + {generation: 8, level: 70, shiny: 1}, + {generation: 8, level: 70, nature: "Hasty", isHidden: true, pokeball: "cherishball"}, + {generation: 9, level: 75, nature: "Modest", isHidden: true, perfectIVs: 4}, ], eventOnly: false, }, @@ -53010,15 +53010,15 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { willowisp: ["2L1"], }, eventData: [ - {generation: 4, level: 70, shiny: 1, moves: ["2L1"]}, - {generation: 4, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 4, level: 50, gender: "M", nature: "Quiet", moves: ["2L1"], pokeball: "pokeball"}, - {generation: 5, level: 68, shiny: 1, moves: ["2L1"]}, - {generation: 6, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 7, level: 60, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 4, level: 70, shiny: 1}, + {generation: 4, level: 50, shiny: 1}, + {generation: 4, level: 50, gender: "M", nature: "Quiet", pokeball: "pokeball"}, + {generation: 5, level: 68, shiny: 1}, + {generation: 6, level: 50, shiny: 1}, + {generation: 7, level: 60, shiny: 1}, + {generation: 7, level: 60, pokeball: "cherishball"}, + {generation: 7, level: 100, pokeball: "cherishball"}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -53110,15 +53110,15 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 4, level: 70, shiny: 1, moves: ["2L1"]}, - {generation: 4, level: 1, shiny: 1, moves: ["2L1"]}, - {generation: 4, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 68, shiny: 1, moves: ["2L1"]}, - {generation: 6, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 7, level: 60, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 100, shiny: 1, moves: ["2L1"]}, + {generation: 4, level: 70, shiny: 1}, + {generation: 4, level: 1, shiny: 1}, + {generation: 4, level: 100, pokeball: "cherishball"}, + {generation: 5, level: 68, shiny: 1}, + {generation: 6, level: 50, shiny: 1}, + {generation: 7, level: 60, shiny: 1}, + {generation: 7, level: 60, pokeball: "cherishball"}, + {generation: 7, level: 100, pokeball: "cherishball"}, + {generation: 8, level: 100, shiny: 1}, ], eventOnly: false, }, @@ -53223,15 +53223,15 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { willowisp: ["2L1"], }, eventData: [ - {generation: 4, level: 70, shiny: 1, moves: ["2L1"]}, - {generation: 4, level: 47, shiny: 1, moves: ["2L1"]}, - {generation: 4, level: 1, shiny: 1, moves: ["2L1"]}, - {generation: 5, level: 5, isHidden: true, moves: ["2L1"], pokeball: "dreamball"}, - {generation: 5, level: 100, shiny: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 6, level: 100, nature: "Brave", isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 4, level: 70, shiny: 1}, + {generation: 4, level: 47, shiny: 1}, + {generation: 4, level: 1, shiny: 1}, + {generation: 5, level: 5, isHidden: true, pokeball: "dreamball"}, + {generation: 5, level: 100, shiny: true, pokeball: "cherishball"}, + {generation: 6, level: 50, shiny: 1}, + {generation: 6, level: 100, nature: "Brave", isHidden: true, pokeball: "cherishball"}, + {generation: 7, level: 60, shiny: 1}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -53322,12 +53322,12 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 4, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 5, level: 68, shiny: 1, moves: ["2L1"]}, - {generation: 5, level: 68, nature: "Modest", moves: ["2L1"]}, - {generation: 6, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 4, level: 50, shiny: 1}, + {generation: 5, level: 68, shiny: 1}, + {generation: 5, level: 68, nature: "Modest"}, + {generation: 6, level: 50, shiny: 1}, + {generation: 7, level: 60, shiny: 1}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -53401,7 +53401,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 4, level: 50, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 4, level: 50, pokeball: "cherishball"}, ], }, manaphy: { @@ -53489,13 +53489,13 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 4, level: 5, moves: ["2L1"]}, - {generation: 4, level: 1, shiny: 1, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 4, level: 50, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 4, level: 50, nature: "Impish", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 1, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 15, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 4, level: 5}, + {generation: 4, level: 1, shiny: 1, pokeball: "pokeball"}, + {generation: 4, level: 50, pokeball: "cherishball"}, + {generation: 4, level: 50, nature: "Impish", pokeball: "cherishball"}, + {generation: 6, level: 1, pokeball: "cherishball"}, + {generation: 6, level: 100, pokeball: "cherishball"}, + {generation: 7, level: 15, pokeball: "cherishball"}, ], eventOnly: false, }, @@ -53599,15 +53599,15 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { xscissor: ["2L1"], }, eventData: [ - {generation: 4, level: 40, shiny: 1, moves: ["2L1"]}, - {generation: 4, level: 50, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 4, level: 50, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 4, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 5, level: 50, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 50, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 50, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 9, level: 50, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 4, level: 40, shiny: 1}, + {generation: 4, level: 50, pokeball: "cherishball"}, + {generation: 4, level: 50, pokeball: "pokeball"}, + {generation: 4, level: 50, shiny: 1}, + {generation: 5, level: 50, pokeball: "cherishball"}, + {generation: 6, level: 50, pokeball: "cherishball"}, + {generation: 6, level: 100, pokeball: "cherishball"}, + {generation: 7, level: 50, pokeball: "cherishball"}, + {generation: 9, level: 50, pokeball: "cherishball"}, ], eventOnly: false, }, @@ -53687,12 +53687,12 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 4, level: 50, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 4, level: 30, shiny: 1, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 5, level: 50, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 15, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 20, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 4, level: 50, pokeball: "cherishball"}, + {generation: 4, level: 30, shiny: 1, pokeball: "pokeball"}, + {generation: 5, level: 50, pokeball: "cherishball"}, + {generation: 6, level: 15, pokeball: "cherishball"}, + {generation: 6, level: 100, pokeball: "cherishball"}, + {generation: 7, level: 20, pokeball: "cherishball"}, ], eventOnly: false, }, @@ -53878,11 +53878,11 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 4, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 100, moves: ["2L1"]}, - {generation: 6, level: 100, shiny: 1, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 100, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 4, level: 100, pokeball: "cherishball"}, + {generation: 5, level: 100}, + {generation: 6, level: 100, shiny: 1, pokeball: "cherishball"}, + {generation: 6, level: 100, pokeball: "cherishball"}, + {generation: 7, level: 100, pokeball: "cherishball"}, ], eventOnly: false, }, @@ -54041,14 +54041,14 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 5, level: 15, moves: ["2L1"]}, - {generation: 5, level: 50, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 15, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 15, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 15, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 50, nature: "Brave", perfectIVs: 6, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 15}, + {generation: 5, level: 50, pokeball: "cherishball"}, + {generation: 5, level: 100, pokeball: "cherishball"}, + {generation: 6, level: 15, pokeball: "cherishball"}, + {generation: 6, level: 100, pokeball: "cherishball"}, + {generation: 6, level: 15, pokeball: "cherishball"}, + {generation: 7, level: 15, pokeball: "cherishball"}, + {generation: 8, level: 50, nature: "Brave", perfectIVs: 6, pokeball: "cherishball"}, ], eventOnly: false, }, @@ -54134,7 +54134,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wringout: ["2L1"], }, eventData: [ - {generation: 5, level: 5, gender: "M", nature: "Hardy", moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 5, gender: "M", nature: "Hardy", pokeball: "cherishball"}, ], }, servine: { @@ -54297,8 +54297,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wringout: ["2L1"], }, eventData: [ - {generation: 5, level: 100, gender: "M", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 50, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 100, gender: "M", pokeball: "cherishball"}, + {generation: 6, level: 50, isHidden: true, pokeball: "cherishball"}, ], }, tepig: { @@ -54573,8 +54573,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 5, level: 100, gender: "M", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 50, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 100, gender: "M", pokeball: "cherishball"}, + {generation: 6, level: 50, isHidden: true, pokeball: "cherishball"}, ], }, oshawott: { @@ -54822,8 +54822,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { xscissor: ["2L1"], }, eventData: [ - {generation: 5, level: 100, gender: "M", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 50, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 100, gender: "M", pokeball: "cherishball"}, + {generation: 6, level: 50, isHidden: true, pokeball: "cherishball"}, ], }, samurotthisui: { @@ -55397,7 +55397,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { uturn: ["2L1"], }, eventData: [ - {generation: 5, level: 20, gender: "F", nature: "Jolly", isHidden: true, moves: ["2L1"]}, + {generation: 5, level: 20, gender: "F", nature: "Jolly", isHidden: true}, ], }, pansage: { @@ -55476,9 +55476,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { worryseed: ["2L1"], }, eventData: [ - {generation: 5, level: 1, shiny: 1, gender: "M", nature: "Brave", ivs: {spa: 31}, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 5, level: 10, gender: "M", isHidden: true, moves: ["2L1"]}, - {generation: 5, level: 30, gender: "M", nature: "Serious", moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 1, shiny: 1, gender: "M", nature: "Brave", ivs: {spa: 31}, pokeball: "pokeball"}, + {generation: 5, level: 10, gender: "M", isHidden: true}, + {generation: 5, level: 30, gender: "M", nature: "Serious", pokeball: "cherishball"}, ], }, simisage: { @@ -55625,7 +55625,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { yawn: ["2L1"], }, eventData: [ - {generation: 5, level: 10, gender: "M", isHidden: true, moves: ["2L1"]}, + {generation: 5, level: 10, gender: "M", isHidden: true}, ], }, simisear: { @@ -55698,7 +55698,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 6, level: 5, perfectIVs: 2, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 6, level: 5, perfectIVs: 2, pokeball: "cherishball"}, ], }, panpour: { @@ -55779,7 +55779,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 5, level: 10, gender: "M", isHidden: true, moves: ["2L1"]}, + {generation: 5, level: 10, gender: "M", isHidden: true}, ], }, simipour: { @@ -55932,7 +55932,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 7, level: 39, nature: "Mild", isHidden: true, moves: ["2L1"], pokeball: "dreamball"}, + {generation: 7, level: 39, nature: "Mild", isHidden: true, pokeball: "dreamball"}, ], }, musharna: { @@ -56010,7 +56010,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 5, level: 50, isHidden: true, moves: ["2L1"]}, + {generation: 5, level: 50, isHidden: true}, ], }, pidove: { @@ -56069,7 +56069,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 5, level: 1, shiny: 1, gender: "F", nature: "Hardy", ivs: {atk: 31}, abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, + {generation: 5, level: 1, shiny: 1, gender: "F", nature: "Hardy", ivs: {atk: 31}, pokeball: "pokeball"}, ], }, tranquill: { @@ -56939,10 +56939,10 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 5, level: 30, gender: "F", nature: "Calm", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 30, gender: "F", nature: "Serious", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 30, gender: "F", nature: "Jolly", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 100, nature: "Relaxed", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 30, gender: "F", nature: "Calm", pokeball: "cherishball"}, + {generation: 5, level: 30, gender: "F", nature: "Serious", pokeball: "cherishball"}, + {generation: 5, level: 30, gender: "F", nature: "Jolly", pokeball: "cherishball"}, + {generation: 6, level: 100, nature: "Relaxed", pokeball: "cherishball"}, ], }, timburr: { @@ -58078,7 +58078,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { worryseed: ["2L1"], }, eventData: [ - {generation: 5, level: 50, gender: "F", nature: "Timid", ivs: {spe: 31}, abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 50, gender: "F", nature: "Timid", ivs: {spe: 31}, pokeball: "cherishball"}, ], }, petilil: { @@ -59046,8 +59046,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 5, level: 35, isHidden: true, moves: ["2L1"]}, - {generation: 6, level: 35, gender: "M", nature: "Calm", ivs: {hp: 30, atk: 30, def: 30, spa: 30, spd: 30, spe: 30}, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 35, isHidden: true}, + {generation: 6, level: 35, gender: "M", nature: "Calm", ivs: {hp: 30, atk: 30, def: 30, spa: 30, spd: 30, spe: 30}, isHidden: true, pokeball: "cherishball"}, ], encounters: [ {generation: 6, level: 32, maxEggMoves: 1}, @@ -59432,7 +59432,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 5, level: 1, gender: "M", nature: "Adamant", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 1, gender: "M", nature: "Adamant", pokeball: "cherishball"}, ], }, scrafty: { @@ -59543,7 +59543,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 5, level: 50, gender: "M", nature: "Brave", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 50, gender: "M", nature: "Brave", pokeball: "cherishball"}, ], }, sigilyph: { @@ -59842,7 +59842,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 7, level: 66, gender: "M", moves: ["2L1"], pokeball: "cherishball"}, + {generation: 7, level: 66, gender: "M", pokeball: "cherishball"}, ], encounters: [ {generation: 6, level: 32, maxEggMoves: 1}, @@ -59992,7 +59992,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 5, level: 15, gender: "M", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 15, gender: "M", pokeball: "cherishball"}, ], }, carracosta: { @@ -60151,7 +60151,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 5, level: 15, gender: "M", moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 15, gender: "M", pokeball: "cherishball"}, ], }, archeops: { @@ -60620,9 +60620,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { uturn: ["2L1"], }, eventData: [ - {generation: 5, level: 50, gender: "M", nature: "Quirky", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 50, moves: ["2L1"], pokeball: "ultraball"}, - {generation: 6, level: 45, gender: "M", nature: "Naughty", moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 50, gender: "M", nature: "Quirky", pokeball: "cherishball"}, + {generation: 6, level: 50, pokeball: "ultraball"}, + {generation: 6, level: 45, gender: "M", nature: "Naughty", pokeball: "cherishball"}, ], encounters: [ {generation: 5, level: 25}, @@ -60701,7 +60701,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { willowisp: ["2L1"], }, eventData: [ - {generation: 9, level: 50, perfectIVs: 3, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 9, level: 50, perfectIVs: 3, pokeball: "cherishball"}, ], }, minccino: { @@ -61042,8 +61042,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 5, level: 32, gender: "M", isHidden: true, moves: ["2L1"]}, - {generation: 5, level: 32, gender: "M", isHidden: true, moves: ["2L1"]}, + {generation: 5, level: 32, gender: "M", isHidden: true}, + {generation: 5, level: 32, gender: "M", isHidden: true}, ], encounters: [ {generation: 5, level: 31}, @@ -61792,7 +61792,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 5, level: 30, gender: "F", isHidden: true, moves: ["2L1"]}, + {generation: 5, level: 30, gender: "F", isHidden: true}, ], }, sawsbuck: { @@ -62010,8 +62010,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { xscissor: ["2L1"], }, eventData: [ - {generation: 5, level: 30, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 50, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 30, pokeball: "cherishball"}, + {generation: 5, level: 50, pokeball: "cherishball"}, ], }, escavalier: { @@ -62207,7 +62207,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { worryseed: ["2L1"], }, eventData: [ - {generation: 8, level: 50, shiny: true, gender: "F", nature: "Sassy", ivs: {hp: 31, atk: 0, def: 31, spa: 31, spd: 31, spe: 0}, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 8, level: 50, shiny: true, gender: "F", nature: "Sassy", ivs: {hp: 31, atk: 0, def: 31, spa: 31, spd: 31, spe: 0}, isHidden: true, pokeball: "cherishball"}, ], encounters: [ {generation: 5, level: 37}, @@ -62363,7 +62363,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wringout: ["2L1"], }, eventData: [ - {generation: 5, level: 40, isHidden: true, moves: ["2L1"]}, + {generation: 5, level: 40, isHidden: true}, ], encounters: [ {generation: 5, level: 5}, @@ -63500,7 +63500,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { willowisp: ["2L1"], }, eventData: [ - {generation: 5, level: 50, gender: "F", nature: "Modest", ivs: {spa: 31}, abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 50, gender: "F", nature: "Modest", ivs: {spa: 31}, pokeball: "cherishball"}, ], }, axew: { @@ -63587,9 +63587,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { xscissor: ["2L1"], }, eventData: [ - {generation: 5, level: 1, shiny: 1, gender: "M", nature: "Naive", ivs: {spe: 31}, abilities: ["2L1"], moves: ["2L1"], pokeball: "pokeball"}, - {generation: 5, level: 10, gender: "F", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 30, gender: "M", nature: "Naive", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 1, shiny: 1, gender: "M", nature: "Naive", ivs: {spe: 31}, pokeball: "pokeball"}, + {generation: 5, level: 10, gender: "F", pokeball: "cherishball"}, + {generation: 5, level: 30, gender: "M", nature: "Naive", pokeball: "cherishball"}, ], }, fraxure: { @@ -63765,7 +63765,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { xscissor: ["2L1"], }, eventData: [ - {generation: 5, level: 59, gender: "F", nature: "Naive", ivs: {hp: 30, atk: 30, def: 30, spa: 30, spd: 30, spe: 30}, abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 59, gender: "F", nature: "Naive", ivs: {hp: 30, atk: 30, def: 30, spa: 30, spd: 30, spe: 30}, pokeball: "cherishball"}, ], }, cubchoo: { @@ -63855,7 +63855,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { yawn: ["2L1"], }, eventData: [ - {generation: 5, level: 15, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 15, pokeball: "cherishball"}, ], }, beartic: { @@ -64091,8 +64091,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { yawn: ["2L1"], }, eventData: [ - {generation: 5, level: 30, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 50, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 30, pokeball: "cherishball"}, + {generation: 5, level: 50, pokeball: "cherishball"}, ], }, accelgor: { @@ -64481,7 +64481,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 7, level: 65, gender: "M", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 7, level: 65, gender: "M", pokeball: "cherishball"}, ], }, druddigon: { @@ -64579,7 +64579,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { toxic: ["2L1"], }, eventData: [ - {generation: 5, level: 1, shiny: true, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 5, level: 1, shiny: true, pokeball: "pokeball"}, ], }, golett: { @@ -64784,7 +64784,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 5, level: 70, shiny: true, abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 70, shiny: true, pokeball: "cherishball"}, ], encounters: [ {generation: 6, level: 30}, @@ -65109,7 +65109,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 6, level: 50, nature: "Adamant", ivs: {hp: 31, atk: 31}, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 6, level: 50, nature: "Adamant", ivs: {hp: 31, atk: 31}, isHidden: true, pokeball: "cherishball"}, ], }, rufflet: { @@ -65259,7 +65259,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 5, level: 25, gender: "M", isHidden: true, moves: ["2L1"]}, + {generation: 5, level: 25, gender: "M", isHidden: true}, ], encounters: [ {generation: 6, level: 45}, @@ -65497,7 +65497,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { whirlwind: ["2L1"], }, eventData: [ - {generation: 5, level: 25, gender: "F", isHidden: true, moves: ["2L1"]}, + {generation: 5, level: 25, gender: "F", isHidden: true}, ], }, heatmor: { @@ -65724,7 +65724,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 5, level: 1, shiny: true, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 5, level: 1, shiny: true, pokeball: "pokeball"}, ], }, zweilous: { @@ -65910,8 +65910,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 5, level: 70, shiny: true, gender: "M", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 52, gender: "M", perfectIVs: 2, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 70, shiny: true, gender: "M", pokeball: "cherishball"}, + {generation: 6, level: 52, gender: "M", perfectIVs: 2, pokeball: "cherishball"}, ], encounters: [ {generation: 6, level: 59}, @@ -66064,8 +66064,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 5, level: 35, moves: ["2L1"]}, - {generation: 5, level: 77, gender: "M", nature: "Calm", ivs: {hp: 30, atk: 30, def: 30, spa: 30, spd: 30, spe: 30}, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 35}, + {generation: 5, level: 77, gender: "M", nature: "Calm", ivs: {hp: 30, atk: 30, def: 30, spa: 30, spd: 30, spe: 30}, pokeball: "cherishball"}, ], encounters: [ {generation: 7, level: 41}, @@ -66157,12 +66157,12 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 5, level: 42, shiny: 1, moves: ["2L1"]}, - {generation: 5, level: 45, shiny: 1, moves: ["2L1"]}, - {generation: 5, level: 65, shiny: 1, moves: ["2L1"]}, - {generation: 6, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 5, level: 42, shiny: 1}, + {generation: 5, level: 45, shiny: 1}, + {generation: 5, level: 65, shiny: 1}, + {generation: 6, level: 50, shiny: 1}, + {generation: 7, level: 60, shiny: 1}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -66245,12 +66245,12 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 5, level: 42, shiny: 1, moves: ["2L1"]}, - {generation: 5, level: 45, shiny: 1, moves: ["2L1"]}, - {generation: 5, level: 65, shiny: 1, moves: ["2L1"]}, - {generation: 6, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 5, level: 42, shiny: 1}, + {generation: 5, level: 45, shiny: 1}, + {generation: 5, level: 65, shiny: 1}, + {generation: 6, level: 50, shiny: 1}, + {generation: 7, level: 60, shiny: 1}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -66339,12 +66339,12 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 5, level: 42, shiny: 1, moves: ["2L1"]}, - {generation: 5, level: 45, shiny: 1, moves: ["2L1"]}, - {generation: 5, level: 65, shiny: 1, moves: ["2L1"]}, - {generation: 6, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 5, level: 42, shiny: 1}, + {generation: 5, level: 45, shiny: 1}, + {generation: 5, level: 65, shiny: 1}, + {generation: 6, level: 50, shiny: 1}, + {generation: 7, level: 60, shiny: 1}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -66434,14 +66434,14 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { weatherball: ["2L1"], }, eventData: [ - {generation: 5, level: 40, shiny: 1, moves: ["2L1"]}, - {generation: 5, level: 5, isHidden: true, moves: ["2L1"], pokeball: "dreamball"}, - {generation: 5, level: 70, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 7, level: 60, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 5, level: 40, shiny: 1}, + {generation: 5, level: 5, isHidden: true, pokeball: "dreamball"}, + {generation: 5, level: 70, pokeball: "cherishball"}, + {generation: 6, level: 50, shiny: 1}, + {generation: 7, level: 60, shiny: 1}, + {generation: 7, level: 60, pokeball: "cherishball"}, + {generation: 7, level: 100, pokeball: "cherishball"}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -66542,14 +66542,14 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 5, level: 40, shiny: 1, moves: ["2L1"]}, - {generation: 5, level: 5, isHidden: true, moves: ["2L1"], pokeball: "dreamball"}, - {generation: 5, level: 70, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 7, level: 60, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 5, level: 40, shiny: 1}, + {generation: 5, level: 5, isHidden: true, pokeball: "dreamball"}, + {generation: 5, level: 70, pokeball: "cherishball"}, + {generation: 6, level: 50, shiny: 1}, + {generation: 7, level: 60, shiny: 1}, + {generation: 7, level: 60, pokeball: "cherishball"}, + {generation: 7, level: 100, pokeball: "cherishball"}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -66652,14 +66652,14 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 5, level: 50, moves: ["2L1"]}, - {generation: 5, level: 70, moves: ["2L1"]}, - {generation: 5, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 7, level: 60, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 5, level: 50}, + {generation: 5, level: 70}, + {generation: 5, level: 100, pokeball: "cherishball"}, + {generation: 6, level: 50, shiny: 1}, + {generation: 7, level: 60, shiny: 1}, + {generation: 7, level: 60, pokeball: "cherishball"}, + {generation: 7, level: 100, pokeball: "cherishball"}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -66765,14 +66765,14 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 5, level: 50, moves: ["2L1"]}, - {generation: 5, level: 70, moves: ["2L1"]}, - {generation: 5, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 7, level: 60, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 5, level: 50}, + {generation: 5, level: 70}, + {generation: 5, level: 100, pokeball: "cherishball"}, + {generation: 6, level: 50, shiny: 1}, + {generation: 7, level: 60, shiny: 1}, + {generation: 7, level: 60, pokeball: "cherishball"}, + {generation: 7, level: 100, pokeball: "cherishball"}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -66859,12 +66859,12 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { weatherball: ["2L1"], }, eventData: [ - {generation: 5, level: 70, shiny: 1, moves: ["2L1"]}, - {generation: 5, level: 5, isHidden: true, moves: ["2L1"], pokeball: "dreamball"}, - {generation: 6, level: 65, shiny: 1, moves: ["2L1"]}, - {generation: 6, level: 50, nature: "Adamant", ivs: {hp: 31, atk: 31, def: 31, spa: 1, spd: 31, spe: 24}, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 5, level: 70, shiny: 1}, + {generation: 5, level: 5, isHidden: true, pokeball: "dreamball"}, + {generation: 6, level: 65, shiny: 1}, + {generation: 6, level: 50, nature: "Adamant", ivs: {hp: 31, atk: 31, def: 31, spa: 1, spd: 31, spe: 24}, pokeball: "cherishball"}, + {generation: 7, level: 60, shiny: 1}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -66961,12 +66961,12 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 5, level: 75, shiny: 1, moves: ["2L1"]}, - {generation: 5, level: 70, shiny: 1, moves: ["2L1"]}, - {generation: 6, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 6, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 5, level: 75, shiny: 1}, + {generation: 5, level: 70, shiny: 1}, + {generation: 6, level: 50, shiny: 1}, + {generation: 6, level: 100, pokeball: "cherishball"}, + {generation: 7, level: 60, shiny: 1}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -67061,12 +67061,12 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 5, level: 75, shiny: 1, moves: ["2L1"]}, - {generation: 5, level: 70, shiny: 1, moves: ["2L1"]}, - {generation: 6, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 6, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 5, level: 75, shiny: 1}, + {generation: 5, level: 70, shiny: 1}, + {generation: 6, level: 50, shiny: 1}, + {generation: 6, level: 100, pokeball: "cherishball"}, + {generation: 7, level: 60, shiny: 1}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -67161,12 +67161,12 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 5, level: 75, shiny: 1, moves: ["2L1"]}, - {generation: 5, level: 70, shiny: 1, moves: ["2L1"]}, - {generation: 6, level: 50, shiny: 1, moves: ["2L1"]}, - {generation: 6, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 5, level: 75, shiny: 1}, + {generation: 5, level: 70, shiny: 1}, + {generation: 6, level: 50, shiny: 1}, + {generation: 6, level: 100, pokeball: "cherishball"}, + {generation: 7, level: 60, shiny: 1}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -67255,11 +67255,11 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { xscissor: ["2L1"], }, eventData: [ - {generation: 5, level: 15, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 50, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 15, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 65, moves: ["2L1"]}, + {generation: 5, level: 15, pokeball: "cherishball"}, + {generation: 5, level: 50, pokeball: "cherishball"}, + {generation: 6, level: 15, pokeball: "cherishball"}, + {generation: 6, level: 100, pokeball: "cherishball"}, + {generation: 8, level: 65}, ], eventOnly: false, }, @@ -67376,10 +67376,10 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 5, level: 15, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 50, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 15, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 50, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 15, pokeball: "cherishball"}, + {generation: 5, level: 50, pokeball: "cherishball"}, + {generation: 7, level: 15, pokeball: "cherishball"}, + {generation: 7, level: 50, pokeball: "cherishball"}, ], eventOnly: false, }, @@ -67469,11 +67469,11 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 5, level: 50, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 15, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 5, level: 100, shiny: true, nature: "Hasty", ivs: {atk: 31, spe: 31}, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 60, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 5, level: 50, pokeball: "cherishball"}, + {generation: 5, level: 15, pokeball: "cherishball"}, + {generation: 5, level: 100, shiny: true, nature: "Hasty", ivs: {atk: 31, spe: 31}, pokeball: "cherishball"}, + {generation: 6, level: 100, pokeball: "cherishball"}, + {generation: 8, level: 60, pokeball: "cherishball"}, ], eventOnly: false, }, @@ -67884,7 +67884,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 6, level: 15, gender: "F", nature: "Hardy", moves: ["2L1"], pokeball: "cherishball"}, + {generation: 6, level: 15, gender: "F", nature: "Hardy", pokeball: "cherishball"}, ], }, braixen: { @@ -68161,7 +68161,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 6, level: 7, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 6, level: 7, pokeball: "cherishball"}, ], }, frogadier: { @@ -68337,8 +68337,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 6, level: 36, ivs: {spe: 31}, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 100, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 6, level: 36, ivs: {spe: 31}, isHidden: true, pokeball: "cherishball"}, + {generation: 6, level: 100, isHidden: true, pokeball: "cherishball"}, ], }, greninjabond: { @@ -68432,7 +68432,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 7, level: 36, ivs: {hp: 20, atk: 31, def: 20, spa: 31, spd: 20, spe: 31}, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 7, level: 36, ivs: {hp: 20, atk: 31, def: 20, spa: 31, spd: 20, spe: 31}, pokeball: "pokeball"}, ], eventOnly: false, }, @@ -68968,7 +68968,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { uturn: ["2L1"], }, eventData: [ - {generation: 6, level: 12, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 6, level: 12, pokeball: "cherishball"}, ], }, vivillonpokeball: { @@ -69040,7 +69040,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { uturn: ["2L1"], }, eventData: [ - {generation: 6, level: 12, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 6, level: 12, pokeball: "pokeball"}, ], eventOnly: false, }, @@ -69189,7 +69189,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 6, level: 49, gender: "M", perfectIVs: 2, abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 6, level: 49, gender: "M", perfectIVs: 2, pokeball: "cherishball"}, ], encounters: [ {generation: 6, level: 30}, @@ -69722,7 +69722,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 6, level: 30, gender: "M", nature: "Adamant", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 6, level: 30, gender: "M", nature: "Adamant", pokeball: "cherishball"}, ], }, pangoro: { @@ -70360,7 +70360,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wideguard: ["2L1"], }, eventData: [ - {generation: 6, level: 50, gender: "F", nature: "Quiet", moves: ["2L1"], pokeball: "cherishball"}, + {generation: 6, level: 50, gender: "F", nature: "Quiet", pokeball: "cherishball"}, ], }, spritzee: { @@ -70502,7 +70502,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { trickroom: ["2L1"], }, eventData: [ - {generation: 6, level: 50, nature: "Relaxed", isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 6, level: 50, nature: "Relaxed", isHidden: true, pokeball: "cherishball"}, ], }, swirlix: { @@ -70721,7 +70721,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wrap: ["2L1"], }, eventData: [ - {generation: 6, level: 10, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 6, level: 10, pokeball: "cherishball"}, ], }, malamar: { @@ -70816,7 +70816,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wrap: ["2L1"], }, eventData: [ - {generation: 6, level: 50, nature: "Adamant", ivs: {hp: 31, atk: 31}, abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 6, level: 50, nature: "Adamant", ivs: {hp: 31, atk: 31}, pokeball: "cherishball"}, ], }, binacle: { @@ -71544,7 +71544,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 6, level: 10, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 6, level: 10, isHidden: true, pokeball: "cherishball"}, ], }, tyrantrum: { @@ -71711,7 +71711,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 6, level: 10, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 6, level: 10, isHidden: true, pokeball: "cherishball"}, ], }, aurorus: { @@ -71881,9 +71881,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 6, level: 10, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 10, gender: "F", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 50, gender: "F", isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 6, level: 10, pokeball: "cherishball"}, + {generation: 6, level: 10, gender: "F", pokeball: "cherishball"}, + {generation: 7, level: 50, gender: "F", isHidden: true, pokeball: "cherishball"}, ], }, hawlucha: { @@ -72214,7 +72214,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { waterpulse: ["2L1"], }, eventData: [ - {generation: 7, level: 1, shiny: 1, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 7, level: 1, shiny: 1, isHidden: true, pokeball: "cherishball"}, ], }, sliggoo: { @@ -72826,7 +72826,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { trickortreat: ["2L1"], }, eventData: [ - {generation: 6, level: 50, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 6, level: 50, pokeball: "cherishball"}, ], }, gourgeist: { @@ -73348,12 +73348,12 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 6, level: 50, moves: ["2L1"]}, - {generation: 6, level: 100, shiny: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 7, level: 60, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 6, level: 50}, + {generation: 6, level: 100, shiny: true, pokeball: "cherishball"}, + {generation: 7, level: 60, shiny: 1}, + {generation: 7, level: 60, pokeball: "cherishball"}, + {generation: 7, level: 100, pokeball: "cherishball"}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -73427,12 +73427,12 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 6, level: 50, moves: ["2L1"]}, - {generation: 6, level: 100, shiny: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 7, level: 60, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 6, level: 50}, + {generation: 6, level: 100, shiny: true, pokeball: "cherishball"}, + {generation: 7, level: 60, shiny: 1}, + {generation: 7, level: 60, pokeball: "cherishball"}, + {generation: 7, level: 100, pokeball: "cherishball"}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -73510,16 +73510,16 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 6, level: 70, moves: ["2L1"]}, - {generation: 6, level: 100, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 30, moves: ["2L1"]}, - {generation: 7, level: 50, moves: ["2L1"]}, - {generation: 7, level: 50, isHidden: true, moves: ["2L1"]}, - {generation: 7, level: 60, shiny: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 60, shiny: true, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 100, shiny: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 100, shiny: true, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 70, shiny: 1, isHidden: true, moves: ["2L1"]}, + {generation: 6, level: 70}, + {generation: 6, level: 100, pokeball: "cherishball"}, + {generation: 7, level: 30}, + {generation: 7, level: 50}, + {generation: 7, level: 50, isHidden: true}, + {generation: 7, level: 60, shiny: true, pokeball: "cherishball"}, + {generation: 7, level: 60, shiny: true, isHidden: true, pokeball: "cherishball"}, + {generation: 7, level: 100, shiny: true, pokeball: "cherishball"}, + {generation: 7, level: 100, shiny: true, isHidden: true, pokeball: "cherishball"}, + {generation: 8, level: 70, shiny: 1, isHidden: true}, ], eventOnly: false, }, @@ -73540,12 +73540,12 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { thousandarrows: ["2L1"], }, eventData: [ - {generation: 7, level: 30, moves: ["2L1"]}, - {generation: 7, level: 50, isHidden: true, moves: ["2L1"]}, - {generation: 7, level: 50, isHidden: true, moves: ["2L1"]}, - {generation: 7, level: 60, shiny: true, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 100, shiny: true, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 70, shiny: 1, isHidden: true, moves: ["2L1"]}, + {generation: 7, level: 30}, + {generation: 7, level: 50, isHidden: true}, + {generation: 7, level: 50, isHidden: true}, + {generation: 7, level: 60, shiny: true, isHidden: true, pokeball: "cherishball"}, + {generation: 7, level: 100, shiny: true, isHidden: true, pokeball: "cherishball"}, + {generation: 8, level: 70, shiny: 1, isHidden: true}, ], eventOnly: false, }, @@ -73643,8 +73643,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wonderroom: ["2L1"], }, eventData: [ - {generation: 6, level: 50, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 50, shiny: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 6, level: 50, pokeball: "cherishball"}, + {generation: 6, level: 50, shiny: true, pokeball: "cherishball"}, ], eventOnly: false, }, @@ -73749,8 +73749,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 6, level: 50, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 15, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 6, level: 50, pokeball: "cherishball"}, + {generation: 7, level: 15, pokeball: "cherishball"}, ], eventOnly: false, }, @@ -73843,9 +73843,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { willowisp: ["2L1"], }, eventData: [ - {generation: 6, level: 70, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 6, level: 70, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 60, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 6, level: 70, pokeball: "cherishball"}, + {generation: 6, level: 70, pokeball: "cherishball"}, + {generation: 8, level: 60, pokeball: "cherishball"}, ], eventOnly: false, }, @@ -74107,7 +74107,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { worryseed: ["2L1"], }, eventData: [ - {generation: 7, level: 50, isHidden: true, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 7, level: 50, isHidden: true, pokeball: "pokeball"}, ], }, decidueyehisui: { @@ -74427,7 +74427,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 7, level: 50, isHidden: true, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 7, level: 50, isHidden: true, pokeball: "pokeball"}, ], }, popplio: { @@ -74659,7 +74659,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 7, level: 50, isHidden: true, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 7, level: 50, isHidden: true, pokeball: "pokeball"}, ], }, pikipek: { @@ -75080,7 +75080,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 7, level: 20, perfectIVs: 3, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 7, level: 20, perfectIVs: 3, pokeball: "pokeball"}, ], eventOnly: false, }, @@ -75333,7 +75333,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zapcannon: ["2L1"], }, eventData: [ - {generation: 7, level: 35, perfectIVs: 3, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 7, level: 35, perfectIVs: 3, pokeball: "pokeball"}, ], eventOnly: false, }, @@ -75803,7 +75803,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wonderroom: ["2L1"], }, eventData: [ - {generation: 7, level: 50, perfectIVs: 3, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 7, level: 50, perfectIVs: 3, pokeball: "pokeball"}, ], eventOnly: false, }, @@ -75944,8 +75944,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 7, level: 10, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 10, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 7, level: 10, pokeball: "cherishball"}, + {generation: 7, level: 10, pokeball: "cherishball"}, ], }, lycanroc: { @@ -76121,7 +76121,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 7, level: 50, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 7, level: 50, isHidden: true, pokeball: "cherishball"}, ], }, lycanrocdusk: { @@ -76334,7 +76334,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wideguard: ["2L1"], }, eventData: [ - {generation: 7, level: 1, shiny: 1, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 7, level: 1, shiny: 1, isHidden: true, pokeball: "cherishball"}, ], }, toxapex: { @@ -76735,7 +76735,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { xscissor: ["2L1"], }, eventData: [ - {generation: 7, level: 25, perfectIVs: 3, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 7, level: 25, perfectIVs: 3, pokeball: "pokeball"}, ], eventOnly: false, }, @@ -76935,7 +76935,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { xscissor: ["2L1"], }, eventData: [ - {generation: 7, level: 30, perfectIVs: 3, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 7, level: 30, perfectIVs: 3, pokeball: "pokeball"}, ], eventOnly: false, }, @@ -77239,7 +77239,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { willowisp: ["2L1"], }, eventData: [ - {generation: 7, level: 50, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 7, level: 50, pokeball: "cherishball"}, ], encounters: [ {generation: 7, level: 16}, @@ -77306,7 +77306,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { willowisp: ["2L1"], }, eventData: [ - {generation: 7, level: 30, perfectIVs: 3, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 7, level: 30, perfectIVs: 3, pokeball: "pokeball"}, ], eventOnly: false, }, @@ -77450,7 +77450,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 7, level: 50, gender: "F", isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 7, level: 50, gender: "F", isHidden: true, pokeball: "cherishball"}, ], }, bounsweet: { @@ -77583,7 +77583,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 7, level: 20, nature: "Naive", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 7, level: 20, nature: "Naive", pokeball: "cherishball"}, ], }, tsareena: { @@ -77754,7 +77754,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wrap: ["2L1"], }, eventData: [ - {generation: 7, level: 10, nature: "Jolly", moves: ["2L1"], pokeball: "cherishball"}, + {generation: 7, level: 10, nature: "Jolly", pokeball: "cherishball"}, ], }, oranguru: { @@ -77852,8 +77852,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 7, level: 1, shiny: 1, abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 50, isHidden: true, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 7, level: 1, shiny: 1, pokeball: "cherishball"}, + {generation: 7, level: 50, isHidden: true, pokeball: "pokeball"}, ], }, passimian: { @@ -77951,8 +77951,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 7, level: 1, shiny: 1, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 50, isHidden: true, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 7, level: 1, shiny: 1, pokeball: "cherishball"}, + {generation: 7, level: 50, isHidden: true, pokeball: "pokeball"}, ], }, wimpod: { @@ -78339,9 +78339,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { xscissor: ["2L1"], }, eventData: [ - {generation: 7, level: 40, shiny: 1, perfectIVs: 3, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 7, level: 60, shiny: 1, perfectIVs: 3, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 8, level: 50, shiny: 1, perfectIVs: 3, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 7, level: 40, shiny: 1, perfectIVs: 3, pokeball: "pokeball"}, + {generation: 7, level: 60, shiny: 1, perfectIVs: 3, pokeball: "pokeball"}, + {generation: 8, level: 50, shiny: 1, perfectIVs: 3, pokeball: "pokeball"}, ], eventOnly: false, }, @@ -78435,7 +78435,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 7, level: 100, shiny: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 7, level: 100, shiny: true, pokeball: "cherishball"}, ], }, minior: { @@ -78667,8 +78667,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 7, level: 1, shiny: 1, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 30, gender: "M", nature: "Brave", moves: ["2L1"], pokeball: "cherishball"}, + {generation: 7, level: 1, shiny: 1, pokeball: "cherishball"}, + {generation: 7, level: 30, gender: "M", nature: "Brave", pokeball: "cherishball"}, ], }, togedemaru: { @@ -78816,7 +78816,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zingzap: ["2L1"], }, eventData: [ - {generation: 7, level: 30, perfectIVs: 3, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 7, level: 30, perfectIVs: 3, pokeball: "pokeball"}, ], eventOnly: false, }, @@ -78911,10 +78911,10 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { xscissor: ["2L1"], }, eventData: [ - {generation: 7, level: 10, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 10, shiny: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 50, shiny: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 9, level: 25, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 7, level: 10, pokeball: "cherishball"}, + {generation: 7, level: 10, shiny: true, pokeball: "cherishball"}, + {generation: 7, level: 50, shiny: true, pokeball: "cherishball"}, + {generation: 9, level: 25, pokeball: "cherishball"}, ], }, mimikyutotem: { @@ -78987,7 +78987,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { xscissor: ["2L1"], }, eventData: [ - {generation: 7, level: 40, perfectIVs: 3, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 7, level: 40, perfectIVs: 3, pokeball: "pokeball"}, ], eventOnly: false, }, @@ -79171,7 +79171,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 7, level: 1, shiny: 1, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 7, level: 1, shiny: 1, isHidden: true, pokeball: "cherishball"}, ], }, dhelmise: { @@ -79602,7 +79602,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { xscissor: ["2L1"], }, eventData: [ - {generation: 7, level: 50, perfectIVs: 3, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 7, level: 50, perfectIVs: 3, pokeball: "pokeball"}, ], eventOnly: false, }, @@ -79684,10 +79684,10 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 7, level: 60, moves: ["2L1"]}, - {generation: 7, level: 60, shiny: true, nature: "Timid", moves: ["2L1"], pokeball: "cherishball"}, - {generation: 7, level: 60, shiny: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 7, level: 60}, + {generation: 7, level: 60, shiny: true, nature: "Timid", pokeball: "cherishball"}, + {generation: 7, level: 60, shiny: true, pokeball: "cherishball"}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -79766,9 +79766,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wonderroom: ["2L1"], }, eventData: [ - {generation: 7, level: 60, moves: ["2L1"]}, - {generation: 7, level: 60, shiny: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 7, level: 60}, + {generation: 7, level: 60, shiny: true, pokeball: "cherishball"}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -79857,9 +79857,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 7, level: 60, moves: ["2L1"]}, - {generation: 7, level: 60, shiny: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 7, level: 60}, + {generation: 7, level: 60, shiny: true, pokeball: "cherishball"}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -79938,9 +79938,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wonderroom: ["2L1"], }, eventData: [ - {generation: 7, level: 60, moves: ["2L1"]}, - {generation: 7, level: 60, shiny: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 7, level: 60}, + {generation: 7, level: 60, shiny: true, pokeball: "cherishball"}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -79950,8 +79950,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { teleport: ["2L1"], }, eventData: [ - {generation: 7, level: 5, moves: ["2L1"]}, - {generation: 8, level: 5, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 7, level: 5}, + {generation: 8, level: 5, pokeball: "pokeball"}, ], eventOnly: false, }, @@ -80052,10 +80052,10 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 7, level: 55, moves: ["2L1"]}, - {generation: 7, level: 60, moves: ["2L1"]}, - {generation: 7, level: 60, shiny: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 7, level: 55}, + {generation: 7, level: 60}, + {generation: 7, level: 60, shiny: true, pokeball: "cherishball"}, + {generation: 8, level: 70, shiny: 1}, ], }, lunala: { @@ -80147,10 +80147,10 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 7, level: 55, moves: ["2L1"]}, - {generation: 7, level: 60, moves: ["2L1"]}, - {generation: 7, level: 60, shiny: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 7, level: 55}, + {generation: 7, level: 60}, + {generation: 7, level: 60, shiny: true, pokeball: "cherishball"}, + {generation: 8, level: 70, shiny: 1}, ], }, nihilego: { @@ -80229,9 +80229,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 7, level: 55, moves: ["2L1"]}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 7, level: 55}, + {generation: 7, level: 60, shiny: 1}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -80304,9 +80304,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 7, level: 65, moves: ["2L1"]}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 7, level: 65}, + {generation: 7, level: 60, shiny: 1}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -80380,9 +80380,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { uturn: ["2L1"], }, eventData: [ - {generation: 7, level: 60, moves: ["2L1"]}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 7, level: 60}, + {generation: 7, level: 60, shiny: 1}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -80448,9 +80448,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zapcannon: ["2L1"], }, eventData: [ - {generation: 7, level: 65, moves: ["2L1"]}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 7, level: 65}, + {generation: 7, level: 60, shiny: 1}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -80523,9 +80523,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 7, level: 65, moves: ["2L1"]}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 7, level: 65}, + {generation: 7, level: 60, shiny: 1}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -80578,9 +80578,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { xscissor: ["2L1"], }, eventData: [ - {generation: 7, level: 60, moves: ["2L1"]}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 7, level: 60}, + {generation: 7, level: 60, shiny: 1}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -80664,9 +80664,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wringout: ["2L1"], }, eventData: [ - {generation: 7, level: 70, moves: ["2L1"]}, - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 7, level: 70}, + {generation: 7, level: 60, shiny: 1}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -80764,10 +80764,10 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { xscissor: ["2L1"], }, eventData: [ - {generation: 7, level: 75, moves: ["2L1"]}, - {generation: 7, level: 65, moves: ["2L1"]}, - {generation: 7, level: 75, shiny: true, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 7, level: 75}, + {generation: 7, level: 65}, + {generation: 7, level: 75, shiny: true, pokeball: "cherishball"}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -80897,7 +80897,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 7, level: 50, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 7, level: 50, pokeball: "cherishball"}, ], eventOnly: false, }, @@ -80988,7 +80988,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 8, level: 50, nature: "Mild", ivs: {hp: 31, atk: 30, def: 30, spa: 31, spd: 31, spe: 0}, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 8, level: 50, nature: "Mild", ivs: {hp: 31, atk: 30, def: 30, spa: 31, spd: 31, spe: 0}, pokeball: "cherishball"}, ], eventOnly: false, }, @@ -81080,8 +81080,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 7, level: 50, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 60, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 7, level: 50, pokeball: "cherishball"}, + {generation: 8, level: 60, pokeball: "cherishball"}, ], eventOnly: false, }, @@ -81126,9 +81126,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { venoshock: ["2L1"], }, eventData: [ - {generation: 7, level: 40, shiny: 1, perfectIVs: 3, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 7, level: 40, shiny: true, nature: "Modest", perfectIVs: 3, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 20, moves: ["2L1"], pokeball: "beastball"}, + {generation: 7, level: 40, shiny: 1, perfectIVs: 3, pokeball: "pokeball"}, + {generation: 7, level: 40, shiny: true, nature: "Modest", perfectIVs: 3, pokeball: "cherishball"}, + {generation: 8, level: 20, pokeball: "beastball"}, ], eventOnly: false, }, @@ -81283,8 +81283,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 7, level: 60, shiny: 1}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -81358,8 +81358,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 7, level: 60, shiny: 1, moves: ["2L1"]}, - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 7, level: 60, shiny: 1}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -81450,8 +81450,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 7, level: 50, moves: ["2L1"], pokeball: "cherishball"}, - {generation: 8, level: 100, shiny: true, nature: "Hasty", ivs: {hp: 31, atk: 31, def: 30, spa: 31, spd: 31, spe: 31}, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 7, level: 50, pokeball: "cherishball"}, + {generation: 8, level: 100, shiny: true, nature: "Hasty", ivs: {hp: 31, atk: 31, def: 30, spa: 31, spd: 31, spe: 31}, pokeball: "cherishball"}, ], eventOnly: false, }, @@ -81530,7 +81530,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { toxic: ["2L1"], }, eventData: [ - {generation: 8, level: 100, nature: "Brave", ivs: {hp: 31, atk: 31, def: 31, spa: 31, spd: 31, spe: 0}, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 8, level: 100, nature: "Brave", ivs: {hp: 31, atk: 31, def: 31, spa: 31, spd: 31, spe: 0}, pokeball: "cherishball"}, ], }, grookey: { @@ -83558,7 +83558,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { terablast: ["2L1"], }, eventData: [ - {generation: 8, level: 1, isHidden: true, moves: ["2L1"], pokeball: "luxuryball"}, + {generation: 8, level: 1, isHidden: true, pokeball: "luxuryball"}, ], }, toxtricity: { @@ -83645,7 +83645,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wildcharge: ["2L1"], }, eventData: [ - {generation: 8, level: 50, shiny: true, nature: "Rash", abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 8, level: 50, shiny: true, nature: "Rash", pokeball: "cherishball"}, ], }, toxtricitylowkey: { @@ -84021,7 +84021,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { withdraw: ["2L1"], }, eventData: [ - {generation: 8, level: 50, isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 8, level: 50, isHidden: true, pokeball: "cherishball"}, ], }, polteageist: { @@ -84449,7 +84449,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wonderroom: ["2L1"], }, eventData: [ - {generation: 9, level: 50, nature: "Calm", shiny: true, abilities: ["2L1"], ivs: {hp: 31, atk: 0, def: 31, spa: 31, spd: 31, spe: 31}, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 9, level: 50, nature: "Calm", shiny: true, ivs: {hp: 31, atk: 0, def: 31, spa: 31, spd: 31, spe: 31}, pokeball: "cherishball"}, ], }, milcery: { @@ -84484,7 +84484,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { terablast: ["2L1"], }, eventData: [ - {generation: 8, level: 5, nature: "Hardy", isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 8, level: 5, nature: "Hardy", isHidden: true, pokeball: "cherishball"}, ], }, alcremie: { @@ -84994,7 +84994,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 9, level: 75, shiny: 1, perfectIVs: 4, moves: ["2L1"]}, + {generation: 9, level: 75, shiny: 1, perfectIVs: 4}, ], }, morpeko: { @@ -85266,7 +85266,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wildcharge: ["2L1"], }, eventData: [ - {generation: 8, level: 10, shiny: 1, perfectIVs: 3, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 8, level: 10, shiny: 1, perfectIVs: 3, pokeball: "pokeball"}, ], eventOnly: false, }, @@ -85328,7 +85328,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wildcharge: ["2L1"], }, eventData: [ - {generation: 8, level: 10, shiny: 1, perfectIVs: 3, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 8, level: 10, shiny: 1, perfectIVs: 3, pokeball: "pokeball"}, ], eventOnly: false, }, @@ -85386,8 +85386,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 8, level: 10, shiny: 1, perfectIVs: 3, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 8, level: 80, nature: "Naive", abilities: ["2L1"], ivs: {hp: 30, atk: 31, def: 31, spa: 30, spd: 30, spe: 31}, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 8, level: 10, shiny: 1, perfectIVs: 3, pokeball: "pokeball"}, + {generation: 8, level: 80, nature: "Naive", ivs: {hp: 30, atk: 31, def: 31, spa: 30, spd: 30, spe: 31}, pokeball: "pokeball"}, ], eventOnly: false, }, @@ -85440,7 +85440,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 8, level: 10, shiny: 1, perfectIVs: 3, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 8, level: 10, shiny: 1, perfectIVs: 3, pokeball: "pokeball"}, ], eventOnly: false, }, @@ -85676,7 +85676,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { willowisp: ["2L1"], }, eventData: [ - {generation: 9, level: 50, gender: "M", nature: "Jolly", perfectIVs: 6, abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 9, level: 50, gender: "M", nature: "Jolly", perfectIVs: 6, pokeball: "cherishball"}, ], }, zacian: { @@ -85746,8 +85746,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 8, level: 70, perfectIVs: 3, moves: ["2L1"]}, - {generation: 8, level: 100, shiny: true, nature: "Adamant", ivs: {hp: 31, atk: 31, def: 31, spa: 30, spd: 31, spe: 31}, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 8, level: 70, perfectIVs: 3}, + {generation: 8, level: 100, shiny: true, nature: "Adamant", ivs: {hp: 31, atk: 31, def: 31, spa: 30, spd: 31, spe: 31}, pokeball: "cherishball"}, ], eventOnly: false, }, @@ -85829,8 +85829,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 8, level: 70, perfectIVs: 3, moves: ["2L1"]}, - {generation: 8, level: 100, shiny: true, nature: "Adamant", ivs: {hp: 31, atk: 31, def: 31, spa: 30, spd: 31, spe: 31}, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 8, level: 70, perfectIVs: 3}, + {generation: 8, level: 100, shiny: true, nature: "Adamant", ivs: {hp: 31, atk: 31, def: 31, spa: 30, spd: 31, spe: 31}, pokeball: "cherishball"}, ], eventOnly: false, }, @@ -85897,8 +85897,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { venoshock: ["2L1"], }, eventData: [ - {generation: 8, level: 60, perfectIVs: 3, moves: ["2L1"]}, - {generation: 8, level: 100, shiny: true, nature: "Timid", perfectIVs: 6, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 8, level: 60, perfectIVs: 3}, + {generation: 8, level: 100, shiny: true, nature: "Timid", perfectIVs: 6, pokeball: "cherishball"}, ], eventOnly: false, }, @@ -85954,7 +85954,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 8, level: 10, perfectIVs: 3, moves: ["2L1"]}, + {generation: 8, level: 10, perfectIVs: 3}, ], eventOnly: false, }, @@ -86199,7 +86199,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { vinewhip: ["2L1"], }, eventData: [ - {generation: 8, level: 60, nature: "Sassy", moves: ["2L1"], pokeball: "cherishball"}, + {generation: 8, level: 60, nature: "Sassy", pokeball: "cherishball"}, ], eventOnly: false, }, @@ -86289,7 +86289,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { vinewhip: ["2L1"], }, eventData: [ - {generation: 8, level: 70, nature: "Adamant", moves: ["2L1"], pokeball: "cherishball"}, + {generation: 8, level: 70, nature: "Adamant", pokeball: "cherishball"}, ], eventOnly: false, }, @@ -86344,7 +86344,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zapcannon: ["2L1"], }, eventData: [ - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -86395,7 +86395,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { visegrip: ["2L1"], }, eventData: [ - {generation: 8, level: 70, shiny: 1, moves: ["2L1"]}, + {generation: 8, level: 70, shiny: 1}, ], eventOnly: false, }, @@ -86458,7 +86458,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 8, level: 75, moves: ["2L1"]}, + {generation: 8, level: 75}, ], eventOnly: false, }, @@ -86516,7 +86516,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { willowisp: ["2L1"], }, eventData: [ - {generation: 8, level: 75, moves: ["2L1"]}, + {generation: 8, level: 75}, ], eventOnly: false, }, @@ -86593,7 +86593,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 8, level: 80, moves: ["2L1"]}, + {generation: 8, level: 80}, ], eventOnly: false, }, @@ -86709,7 +86709,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 8, level: 80, moves: ["2L1"]}, + {generation: 8, level: 80}, ], eventOnly: false, }, @@ -86815,7 +86815,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 8, level: 80, moves: ["2L1"]}, + {generation: 8, level: 80}, ], eventOnly: false, }, @@ -87475,7 +87475,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 9, level: 15, gender: "M", isHidden: true, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 9, level: 15, gender: "M", isHidden: true, pokeball: "cherishball"}, ], }, oinkologne: { @@ -88492,7 +88492,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 9, level: 50, gender: "F", nature: "Adamant", ivs: {hp: 31, atk: 31, def: 31, spa: 17, spd: 31, spe: 31}, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 9, level: 50, gender: "F", nature: "Adamant", ivs: {hp: 31, atk: 31, def: 31, spa: 17, spd: 31, spe: 31}, pokeball: "cherishball"}, ], }, smoliv: { @@ -88920,7 +88920,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 9, level: 50, gender: "F", nature: "Naughty", abilities: ["2L1"], ivs: {hp: 20, atk: 31, def: 20, spa: 20, spd: 20, spe: 20}, moves: ["2L1"], pokeball: "healball"}, + {generation: 9, level: 50, gender: "F", nature: "Naughty", ivs: {hp: 20, atk: 31, def: 20, spa: 20, spd: 20, spe: 20}, pokeball: "healball"}, ], }, orthworm: { @@ -88972,7 +88972,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wrap: ["2L1"], }, eventData: [ - {generation: 9, level: 29, gender: "M", nature: "Quirky", ivs: {hp: 30, atk: 30, def: 30, spa: 30, spd: 30, spe: 30}, moves: ["2L1"]}, + {generation: 9, level: 29, gender: "M", nature: "Quirky", ivs: {hp: 30, atk: 30, def: 30, spa: 30, spd: 30, spe: 30}}, ], }, tandemaus: { @@ -89184,7 +89184,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { waterpulse: ["2L1"], }, eventData: [ - {generation: 9, moves: ["2L1"]}, + {generation: 9}, ], }, frigibax: { @@ -89363,7 +89363,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { whirlpool: ["2L1"], }, eventData: [ - {generation: 9, level: 57, gender: "M", nature: "Quiet", ivs: {hp: 30, atk: 30, def: 30, spa: 30, spd: 30, spe: 30}, moves: ["2L1"]}, + {generation: 9, level: 57, gender: "M", nature: "Quiet", ivs: {hp: 30, atk: 30, def: 30, spa: 30, spd: 30, spe: 30}}, ], }, tatsugiristretchy: { @@ -89374,7 +89374,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { muddywater: ["2L1"], }, eventData: [ - {generation: 9, level: 50, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 9, level: 50, pokeball: "cherishball"}, ], }, cyclizar: { @@ -89491,7 +89491,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wish: ["2L1"], }, eventData: [ - {generation: 9, level: 5, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 9, level: 5, pokeball: "cherishball"}, ], }, pawmo: { @@ -89792,7 +89792,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wingattack: ["2L1"], }, eventData: [ - {generation: 9, level: 20, gender: "F", nature: "Jolly", ivs: {hp: 30, atk: 30, def: 30, spa: 30, spd: 30, spe: 30}, isHidden: true, moves: ["2L1"]}, + {generation: 9, level: 20, gender: "F", nature: "Jolly", ivs: {hp: 30, atk: 30, def: 30, spa: 30, spd: 30, spe: 30}, isHidden: true}, ], }, squawkabilly: { @@ -89963,7 +89963,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { xscissor: ["2L1"], }, eventData: [ - {generation: 9, level: 16, gender: "F", nature: "Gentle", ivs: {hp: 30, atk: 30, def: 30, spa: 30, spd: 30, spe: 30}, abilities: ["2L1"], moves: ["2L1"]}, + {generation: 9, level: 16, gender: "F", nature: "Gentle", ivs: {hp: 30, atk: 30, def: 30, spa: 30, spd: 30, spe: 30}}, ], }, nacli: { @@ -90116,7 +90116,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 9, level: 50, gender: "M", nature: "Careful", ivs: {hp: 31, atk: 31, def: 31, spa: 22, spd: 31, spe: 31}, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 9, level: 50, gender: "M", nature: "Careful", ivs: {hp: 31, atk: 31, def: 31, spa: 22, spd: 31, spe: 31}, pokeball: "cherishball"}, ], }, glimmet: { @@ -90384,7 +90384,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { yawn: ["2L1"], }, eventData: [ - {generation: 9, level: 5, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 9, level: 5, pokeball: "cherishball"}, ], }, dachsbun: { @@ -90656,9 +90656,9 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { thief: ["2L1"], }, eventData: [ - {generation: 9, level: 5, moves: ["2L1"]}, - {generation: 9, level: 75, shiny: 1, perfectIVs: 4, moves: ["2L1"]}, - {generation: 9, level: 5, nature: "Timid", ivs: {hp: 0, atk: 0, def: 0, spa: 0, spd: 0, spe: 31}, moves: ["2L1"]}, + {generation: 9, level: 5}, + {generation: 9, level: 75, shiny: 1, perfectIVs: 4}, + {generation: 9, level: 5, nature: "Timid", ivs: {hp: 0, atk: 0, def: 0, spa: 0, spd: 0, spe: 31}}, ], eventOnly: false, }, @@ -90773,8 +90773,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 9, level: 45, nature: "Naughty", ivs: {hp: 30, atk: 30, def: 30, spa: 30, spd: 30, spe: 30}, moves: ["2L1"]}, - {generation: 9, level: 57, shiny: 1, moves: ["2L1"]}, + {generation: 9, level: 45, nature: "Naughty", ivs: {hp: 30, atk: 30, def: 30, spa: 30, spd: 30, spe: 30}}, + {generation: 9, level: 57, shiny: 1}, ], eventOnly: false, }, @@ -90833,7 +90833,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 9, level: 52, shiny: 1, moves: ["2L1"]}, + {generation: 9, level: 52, shiny: 1}, ], eventOnly: false, }, @@ -90895,7 +90895,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zapcannon: ["2L1"], }, eventData: [ - {generation: 9, level: 52, shiny: 1, moves: ["2L1"]}, + {generation: 9, level: 52, shiny: 1}, ], eventOnly: false, }, @@ -90983,7 +90983,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 9, level: 52, shiny: 1, moves: ["2L1"]}, + {generation: 9, level: 52, shiny: 1}, ], eventOnly: false, }, @@ -91040,7 +91040,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wish: ["2L1"], }, eventData: [ - {generation: 9, level: 52, shiny: 1, moves: ["2L1"]}, + {generation: 9, level: 52, shiny: 1}, ], eventOnly: false, }, @@ -91105,7 +91105,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 9, level: 52, shiny: 1, moves: ["2L1"]}, + {generation: 9, level: 52, shiny: 1}, ], eventOnly: false, }, @@ -91181,7 +91181,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 9, level: 52, shiny: 1, moves: ["2L1"]}, + {generation: 9, level: 52, shiny: 1}, ], eventOnly: false, }, @@ -91241,8 +91241,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 9, level: 45, nature: "Naughty", ivs: {hp: 30, atk: 30, def: 30, spa: 30, spd: 30, spe: 30}, moves: ["2L1"]}, - {generation: 9, level: 57, shiny: 1, moves: ["2L1"]}, + {generation: 9, level: 45, nature: "Naughty", ivs: {hp: 30, atk: 30, def: 30, spa: 30, spd: 30, spe: 30}}, + {generation: 9, level: 57, shiny: 1}, ], }, ironmoth: { @@ -91301,7 +91301,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { whirlwind: ["2L1"], }, eventData: [ - {generation: 9, level: 52, shiny: 1, moves: ["2L1"]}, + {generation: 9, level: 52, shiny: 1}, ], eventOnly: false, }, @@ -91365,7 +91365,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wildcharge: ["2L1"], }, eventData: [ - {generation: 9, level: 52, shiny: 1, moves: ["2L1"]}, + {generation: 9, level: 52, shiny: 1}, ], eventOnly: false, }, @@ -91429,7 +91429,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 9, level: 52, shiny: 1, moves: ["2L1"]}, + {generation: 9, level: 52, shiny: 1}, ], eventOnly: false, }, @@ -91513,7 +91513,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wildcharge: ["2L1"], }, eventData: [ - {generation: 9, level: 52, shiny: 1, moves: ["2L1"]}, + {generation: 9, level: 52, shiny: 1}, ], eventOnly: false, }, @@ -91562,7 +91562,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { whirlpool: ["2L1"], }, eventData: [ - {generation: 9, level: 52, shiny: 1, moves: ["2L1"]}, + {generation: 9, level: 52, shiny: 1}, ], eventOnly: false, }, @@ -91650,7 +91650,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 9, level: 52, shiny: 1, moves: ["2L1"]}, + {generation: 9, level: 52, shiny: 1}, ], eventOnly: false, }, @@ -91704,7 +91704,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 9, level: 60, moves: ["2L1"]}, + {generation: 9, level: 60}, ], eventOnly: false, }, @@ -91757,7 +91757,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { throatchop: ["2L1"], }, eventData: [ - {generation: 9, level: 60, moves: ["2L1"]}, + {generation: 9, level: 60}, ], eventOnly: false, }, @@ -91817,7 +91817,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 9, level: 60, moves: ["2L1"]}, + {generation: 9, level: 60}, ], eventOnly: false, }, @@ -91871,7 +91871,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 9, level: 60, moves: ["2L1"]}, + {generation: 9, level: 60}, ], eventOnly: false, }, @@ -91951,8 +91951,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 9, level: 68, nature: "Quirky", ivs: {hp: 31, atk: 31, def: 28, spa: 31, spd: 28, spe: 31}, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 9, level: 72, nature: "Adamant", ivs: {hp: 25, atk: 31, def: 25, spa: 31, spd: 25, spe: 31}, moves: ["2L1"]}, + {generation: 9, level: 68, nature: "Quirky", ivs: {hp: 31, atk: 31, def: 28, spa: 31, spd: 28, spe: 31}, pokeball: "pokeball"}, + {generation: 9, level: 72, nature: "Adamant", ivs: {hp: 25, atk: 31, def: 25, spa: 31, spd: 25, spe: 31}}, ], eventOnly: false, }, @@ -92016,8 +92016,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 9, level: 68, nature: "Quirky", ivs: {hp: 31, atk: 31, def: 28, spa: 31, spd: 28, spe: 31}, moves: ["2L1"], pokeball: "pokeball"}, - {generation: 9, level: 72, nature: "Modest", ivs: {hp: 25, atk: 31, def: 25, spa: 31, spd: 25, spe: 31}, moves: ["2L1"]}, + {generation: 9, level: 68, nature: "Quirky", ivs: {hp: 31, atk: 31, def: 28, spa: 31, spd: 28, spe: 31}, pokeball: "pokeball"}, + {generation: 9, level: 72, nature: "Modest", ivs: {hp: 25, atk: 31, def: 25, spa: 31, spd: 25, spe: 31}}, ], eventOnly: false, }, @@ -92206,7 +92206,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { willowisp: ["2L1"], }, eventData: [ - {generation: 9, level: 5, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 9, level: 5, pokeball: "cherishball"}, ], }, armarouge: { @@ -92512,7 +92512,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { whirlpool: ["2L1"], }, eventData: [ - {generation: 9, level: 75, perfectIVs: 3, moves: ["2L1"]}, + {generation: 9, level: 75, perfectIVs: 3}, ], eventOnly: false, }, @@ -92577,7 +92577,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { xscissor: ["2L1"], }, eventData: [ - {generation: 9, level: 75, perfectIVs: 3, moves: ["2L1"]}, + {generation: 9, level: 75, perfectIVs: 3}, ], eventOnly: false, }, @@ -92866,7 +92866,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { uproar: ["2L1"], }, eventData: [ - {generation: 9, level: 70, moves: ["2L1"]}, + {generation: 9, level: 70}, ], eventOnly: false, }, @@ -92930,7 +92930,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { venoshock: ["2L1"], }, eventData: [ - {generation: 9, level: 70, moves: ["2L1"]}, + {generation: 9, level: 70}, ], eventOnly: false, }, @@ -93001,7 +93001,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wingattack: ["2L1"], }, eventData: [ - {generation: 9, level: 70, moves: ["2L1"]}, + {generation: 9, level: 70}, ], eventOnly: false, }, @@ -93071,8 +93071,8 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zenheadbutt: ["2L1"], }, eventData: [ - {generation: 9, level: 20, nature: "Lonely", ivs: {hp: 31, atk: 31, def: 20, spa: 20, spd: 20, spe: 31}, moves: ["2L1"]}, - {generation: 9, level: 70, nature: "Lonely", ivs: {hp: 31, atk: 31, def: 20, spa: 20, spd: 20, spe: 31}, moves: ["2L1"]}, + {generation: 9, level: 20, nature: "Lonely", ivs: {hp: 31, atk: 31, def: 20, spa: 20, spd: 20, spe: 31}}, + {generation: 9, level: 70, nature: "Lonely", ivs: {hp: 31, atk: 31, def: 20, spa: 20, spd: 20, spe: 31}}, ], eventOnly: false, }, @@ -95515,7 +95515,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wildcharge: ["2L1"], }, eventData: [ - {generation: 9, level: 50, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 9, level: 50, pokeball: "pokeball"}, ], }, voodoll: { @@ -97470,7 +97470,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { yawn: ["2L1"], }, eventData: [ - {generation: 6, level: 16, abilities: ["2L1"], moves: ["2L1"], pokeball: "cherishball"}, + {generation: 6, level: 16, pokeball: "cherishball"}, ], }, pajantom: { @@ -97951,7 +97951,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { zapcannon: ["2L1"], }, eventData: [ - {generation: 7, level: 50, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 7, level: 50, pokeball: "cherishball"}, ], }, smogecko: { @@ -98195,7 +98195,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 7, level: 50, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 7, level: 50, pokeball: "cherishball"}, ], }, swirlpool: { @@ -98462,7 +98462,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { xscissor: ["2L1"], }, eventData: [ - {generation: 7, level: 50, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 7, level: 50, pokeball: "cherishball"}, ], }, justyke: { @@ -98600,7 +98600,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { workup: ["2L1"], }, eventData: [ - {generation: 9, level: 50, moves: ["2L1"], pokeball: "pokeball"}, + {generation: 9, level: 50, pokeball: "pokeball"}, ], }, solotl: { @@ -98959,7 +98959,7 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { wideguard: ["2L1"], }, eventData: [ - {generation: 8, level: 50, moves: ["2L1"], pokeball: "cherishball"}, + {generation: 8, level: 50, pokeball: "cherishball"}, ], }, venomicon: { diff --git a/data/mods/moderngen2/pokedex.ts b/data/mods/moderngen2/pokedex.ts index 40bd57158fd5..20cd5ff6af8e 100644 --- a/data/mods/moderngen2/pokedex.ts +++ b/data/mods/moderngen2/pokedex.ts @@ -1,4 +1,4 @@ -export const Pokedex: {[k: string]: ModdedSpeciesData} = { +export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable = { treecko: { inherit: true, gen: 2, diff --git a/data/mods/moderngen2/rulesets.ts b/data/mods/moderngen2/rulesets.ts index 3a9ff6b70a66..683d4a894aff 100644 --- a/data/mods/moderngen2/rulesets.ts +++ b/data/mods/moderngen2/rulesets.ts @@ -1,4 +1,4 @@ -export const Rulesets: {[k: string]: ModdedFormatData} = { +export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable = { standard: { effectType: 'ValidatorRule', name: 'Standard', diff --git a/data/mods/partnersincrime/abilities.ts b/data/mods/partnersincrime/abilities.ts index c8c348ad2464..72b17c7736e2 100644 --- a/data/mods/partnersincrime/abilities.ts +++ b/data/mods/partnersincrime/abilities.ts @@ -1,4 +1,4 @@ -export const Abilities: {[k: string]: ModdedAbilityData} = { +export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = { neutralizinggas: { inherit: true, // Ability suppression implemented in sim/pokemon.ts:Pokemon#ignoringAbility diff --git a/data/mods/partnersincrime/items.ts b/data/mods/partnersincrime/items.ts index eead07f923aa..f82827da2ea2 100644 --- a/data/mods/partnersincrime/items.ts +++ b/data/mods/partnersincrime/items.ts @@ -1,4 +1,4 @@ -export const Items: {[k: string]: ModdedItemData} = { +export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { leppaberry: { inherit: true, onEat(pokemon) { diff --git a/data/mods/partnersincrime/moves.ts b/data/mods/partnersincrime/moves.ts index ae6687f0633d..aef86678d043 100644 --- a/data/mods/partnersincrime/moves.ts +++ b/data/mods/partnersincrime/moves.ts @@ -1,4 +1,4 @@ -export const Moves: {[k: string]: ModdedMoveData} = { +export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { gastroacid: { inherit: true, condition: { diff --git a/data/mods/pokebilities/abilities.ts b/data/mods/pokebilities/abilities.ts index 2a404d94fcf3..de3ba4e4d1eb 100644 --- a/data/mods/pokebilities/abilities.ts +++ b/data/mods/pokebilities/abilities.ts @@ -1,4 +1,4 @@ -export const Abilities: {[k: string]: ModdedAbilityData} = { +export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = { mummy: { inherit: true, onDamagingHit(damage, target, source, move) { diff --git a/data/mods/pokebilities/moves.ts b/data/mods/pokebilities/moves.ts index 8fd18a791128..c473cb8bba8d 100644 --- a/data/mods/pokebilities/moves.ts +++ b/data/mods/pokebilities/moves.ts @@ -1,4 +1,4 @@ -export const Moves: {[k: string]: ModdedMoveData} = { +export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { gastroacid: { inherit: true, condition: { diff --git a/data/mods/sharedpower/abilities.ts b/data/mods/sharedpower/abilities.ts index 53a0e365d961..8d815709d741 100644 --- a/data/mods/sharedpower/abilities.ts +++ b/data/mods/sharedpower/abilities.ts @@ -1,4 +1,4 @@ -export const Abilities: {[k: string]: ModdedAbilityData} = { +export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = { neutralizinggas: { inherit: true, // Ability suppression implemented in sim/pokemon.ts:Pokemon#ignoringAbility diff --git a/data/mods/sharedpower/moves.ts b/data/mods/sharedpower/moves.ts index b0d980560b5f..a883f0fa81f0 100644 --- a/data/mods/sharedpower/moves.ts +++ b/data/mods/sharedpower/moves.ts @@ -1,4 +1,4 @@ -export const Moves: {[k: string]: ModdedMoveData} = { +export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { gastroacid: { inherit: true, condition: { diff --git a/data/mods/sharingiscaring/conditions.ts b/data/mods/sharingiscaring/conditions.ts index 555778b6ea54..1a5bef5f3c23 100644 --- a/data/mods/sharingiscaring/conditions.ts +++ b/data/mods/sharingiscaring/conditions.ts @@ -1,4 +1,4 @@ -export const Conditions: {[k: string]: ModdedConditionData} = { +export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDataTable = { choicelock: { inherit: true, onBeforeMove(pokemon, target, move) { diff --git a/data/mods/sharingiscaring/items.ts b/data/mods/sharingiscaring/items.ts index 3cfb04a29af8..ebf65b471007 100644 --- a/data/mods/sharingiscaring/items.ts +++ b/data/mods/sharingiscaring/items.ts @@ -1,4 +1,4 @@ -export const Items: {[k: string]: ModdedItemData} = { +export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { airballoon: { inherit: true, // airborneness implemented in sim/pokemon.js:Pokemon#isGrounded diff --git a/data/mods/sharingiscaring/moves.ts b/data/mods/sharingiscaring/moves.ts index 509193c201f9..311112585582 100644 --- a/data/mods/sharingiscaring/moves.ts +++ b/data/mods/sharingiscaring/moves.ts @@ -1,4 +1,4 @@ -export const Moves: {[k: string]: ModdedMoveData} = { +export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { poltergeist: { inherit: true, onTry(source, target) { diff --git a/data/mods/thecardgame/abilities.ts b/data/mods/thecardgame/abilities.ts index 5c9af8011c37..5dcf9c71d947 100644 --- a/data/mods/thecardgame/abilities.ts +++ b/data/mods/thecardgame/abilities.ts @@ -1,4 +1,4 @@ -export const Abilities: {[k: string]: ModdedAbilityData} = { +export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = { aerilate: { inherit: true, onModifyType(move, pokemon) { diff --git a/data/mods/thecardgame/conditions.ts b/data/mods/thecardgame/conditions.ts index 8a47e300630f..f56bbc9811f0 100644 --- a/data/mods/thecardgame/conditions.ts +++ b/data/mods/thecardgame/conditions.ts @@ -1,4 +1,4 @@ -export const Conditions: {[k: string]: ModdedConditionData} = { +export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDataTable = { deltastream: { inherit: true, onEffectiveness(typeMod, target, type, move) { diff --git a/data/mods/thecardgame/items.ts b/data/mods/thecardgame/items.ts index 9d47db5e5976..b7bbed8f4b9e 100644 --- a/data/mods/thecardgame/items.ts +++ b/data/mods/thecardgame/items.ts @@ -1,4 +1,4 @@ -export const Items: {[k: string]: ModdedItemData} = { +export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { buggem: { inherit: true, onSourceTryPrimaryHit(target, source, move) { diff --git a/data/mods/thecardgame/moves.ts b/data/mods/thecardgame/moves.ts index af378a54c3f6..3be0468d7699 100644 --- a/data/mods/thecardgame/moves.ts +++ b/data/mods/thecardgame/moves.ts @@ -1,4 +1,4 @@ -export const Moves: {[k: string]: ModdedMoveData} = { +export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { camouflage: { inherit: true, onHit(target) { diff --git a/data/mods/thecardgame/typechart.ts b/data/mods/thecardgame/typechart.ts index 61e7d0fe950b..9b1f9a7371c7 100644 --- a/data/mods/thecardgame/typechart.ts +++ b/data/mods/thecardgame/typechart.ts @@ -1,4 +1,4 @@ -export const TypeChart: {[k: string]: ModdedTypeData} = { +export const TypeChart: import('../../../sim/dex-data').ModdedTypeDataTable = { dark: { inherit: true, damageTaken: { diff --git a/data/moves.ts b/data/moves.ts index 6108a806c43a..6dec857bac96 100644 --- a/data/moves.ts +++ b/data/moves.ts @@ -1,6 +1,6 @@ // List of flags and their descriptions can be found in sim/dex-moves.ts -export const Moves: {[moveid: string]: MoveData} = { +export const Moves: import('../sim/dex-moves').MoveDataTable = { "10000000voltthunderbolt": { num: 719, accuracy: true, diff --git a/data/natures.ts b/data/natures.ts index 0f44111dd866..d7fc4a80a705 100644 --- a/data/natures.ts +++ b/data/natures.ts @@ -1,4 +1,4 @@ -export const Natures: {[k: string]: NatureData} = { +export const Natures: import('../sim/dex-data').NatureDataTable = { adamant: { name: "Adamant", plus: 'atk', diff --git a/data/pokedex.ts b/data/pokedex.ts index 5d69d46a946a..4a4db1eb4c79 100644 --- a/data/pokedex.ts +++ b/data/pokedex.ts @@ -1,4 +1,4 @@ -export const Pokedex: {[speciesid: string]: SpeciesData} = { +export const Pokedex: import('../sim/dex-species').SpeciesDataTable = { bulbasaur: { num: 1, name: "Bulbasaur", diff --git a/data/pokemongo.ts b/data/pokemongo.ts index e56aaa272d7a..3c45b5b83663 100644 --- a/data/pokemongo.ts +++ b/data/pokemongo.ts @@ -26,7 +26,7 @@ * - Shadow Pokemon: most can also be obtained from the wild, and those that can't are from defeating Giovanni, which * is handled as as its own encounter */ -export const PokemonGoData: {[source: string]: PokemonGoData} = { +export const PokemonGoData: import('../sim/dex-species').PokemonGoDataTable = { bulbasaur: {encounters: ['wild']}, ivysaur: {encounters: ['wild']}, venusaur: {encounters: ['wild']}, diff --git a/data/random-battles/gen1/teams.ts b/data/random-battles/gen1/teams.ts index 0b2d16b1d798..2ce6a27ef455 100644 --- a/data/random-battles/gen1/teams.ts +++ b/data/random-battles/gen1/teams.ts @@ -15,7 +15,7 @@ interface Gen1RandomBattleSpecies { } export class RandomGen1Teams extends RandomGen2Teams { - randomData: {[species: string]: Gen1RandomBattleSpecies} = require('./data.json'); + randomData: {[species: IDEntry]: Gen1RandomBattleSpecies} = require('./data.json'); // Challenge Cup or CC teams are basically fully random teams. randomCCTeam() { diff --git a/data/random-battles/gen2/teams.ts b/data/random-battles/gen2/teams.ts index b8660a3965b3..1a292712cc52 100644 --- a/data/random-battles/gen2/teams.ts +++ b/data/random-battles/gen2/teams.ts @@ -26,7 +26,7 @@ const MOVE_PAIRS = [ ]; export class RandomGen2Teams extends RandomGen3Teams { - randomSets: {[species: string]: RandomTeamsTypes.RandomSpeciesData} = require('./sets.json'); + randomSets: {[species: IDEntry]: RandomTeamsTypes.RandomSpeciesData} = require('./sets.json'); constructor(format: string | Format, prng: PRNG | PRNGSeed | null) { super(format, prng); diff --git a/data/random-battles/gen8/teams.ts b/data/random-battles/gen8/teams.ts index 7a20cf2c2a77..8532c06ec3a1 100644 --- a/data/random-battles/gen8/teams.ts +++ b/data/random-battles/gen8/teams.ts @@ -571,7 +571,7 @@ export class RandomGen8Teams { let tagBlacklisted = false; for (const ruleid of ruleTable.tagRules) { if (ruleid.startsWith('*')) continue; - const tagid = ruleid.slice(12); + const tagid = ruleid.slice(12) as ID; const tag = Tags[tagid]; if ((tag.speciesFilter || tag.genericFilter)!(species)) { const existenceTag = EXISTENCE_TAG.includes(tagid); diff --git a/data/random-battles/gen9/teams.ts b/data/random-battles/gen9/teams.ts index 5efc3688580a..fc13bf3a509b 100644 --- a/data/random-battles/gen9/teams.ts +++ b/data/random-battles/gen9/teams.ts @@ -2178,7 +2178,7 @@ export class RandomTeams { let tagBlacklisted = false; for (const ruleid of ruleTable.tagRules) { if (ruleid.startsWith('*')) continue; - const tagid = ruleid.slice(12); + const tagid = ruleid.slice(12) as ID; const tag = Tags[tagid]; if ((tag.speciesFilter || tag.genericFilter)!(species)) { const existenceTag = EXISTENCE_TAG.includes(tagid); diff --git a/data/rulesets.ts b/data/rulesets.ts index 246599155cdf..a81e83615f78 100644 --- a/data/rulesets.ts +++ b/data/rulesets.ts @@ -3,7 +3,7 @@ import type {Learnset} from "../sim/dex-species"; // The list of formats is stored in config/formats.js -export const Rulesets: {[k: string]: FormatData} = { +export const Rulesets: import('../sim/dex-formats').FormatDataTable = { // Rulesets /////////////////////////////////////////////////////////////////// diff --git a/data/tags.ts b/data/tags.ts index 5db562b90a6d..8ea337c19384 100644 --- a/data/tags.ts +++ b/data/tags.ts @@ -9,7 +9,7 @@ interface TagData { genericNumCol?: (thing: Species | Move | Item | Ability) => number; } -export const Tags: {[id: string]: TagData} = { +export const Tags: {[id: IDEntry]: TagData} = { // Categories // ---------- physical: { diff --git a/data/text/abilities.ts b/data/text/abilities.ts index 4f1bcf4628d6..e30148a84bbf 100644 --- a/data/text/abilities.ts +++ b/data/text/abilities.ts @@ -1,4 +1,4 @@ -export const AbilitiesText: {[k: string]: AbilityText} = { +export const AbilitiesText: {[id: IDEntry]: AbilityText} = { noability: { name: "No Ability", shortDesc: "Does nothing.", diff --git a/data/text/default.ts b/data/text/default.ts index 6054a6de1b0a..d71689cd597d 100644 --- a/data/text/default.ts +++ b/data/text/default.ts @@ -1,4 +1,4 @@ -export const DefaultText: {[k: string]: DefaultText} = { +export const DefaultText: {[id: IDEntry]: DefaultText} = { default: { startBattle: "Battle started between [TRAINER] and [TRAINER]!", winBattle: "**[TRAINER]** won the battle!", diff --git a/data/text/items.ts b/data/text/items.ts index 643acf47ec12..4d0ee356c0a2 100644 --- a/data/text/items.ts +++ b/data/text/items.ts @@ -1,4 +1,4 @@ -export const ItemsText: {[k: string]: ItemText} = { +export const ItemsText: {[id: IDEntry]: ItemText} = { abilityshield: { name: "Ability Shield", desc: "Holder's Ability cannot be changed by any effect.", diff --git a/data/text/moves.ts b/data/text/moves.ts index 83ae831134f0..8004ccca2c9d 100644 --- a/data/text/moves.ts +++ b/data/text/moves.ts @@ -1,4 +1,4 @@ -export const MovesText: {[k: string]: MoveText} = { +export const MovesText: {[id: IDEntry]: MoveText} = { "10000000voltthunderbolt": { name: "10,000,000 Volt Thunderbolt", desc: "Has a very high chance for a critical hit.", diff --git a/data/text/pokedex.ts b/data/text/pokedex.ts index 532978d0b684..c12211f6deed 100644 --- a/data/text/pokedex.ts +++ b/data/text/pokedex.ts @@ -1,4 +1,4 @@ -export const PokedexText: {[k: string]: PokedexText} = { +export const PokedexText: {[id: IDEntry]: PokedexText} = { bulbasaur: { name: "Bulbasaur", }, diff --git a/data/typechart.ts b/data/typechart.ts index fb4ebc08a63f..fa3833470954 100644 --- a/data/typechart.ts +++ b/data/typechart.ts @@ -1,4 +1,4 @@ -export const TypeChart: {[k: string]: TypeData} = { +export const TypeChart: import('../sim/dex-data').TypeDataTable = { bug: { damageTaken: { Bug: 0, diff --git a/server/global-types.ts b/server/global-types.ts index 2ab3c4cb2594..d03b45680294 100644 --- a/server/global-types.ts +++ b/server/global-types.ts @@ -37,7 +37,7 @@ type RoomGame = Rooms.RoomGame; type MinorActivity = Rooms.MinorActivity; type RoomBattle = Rooms.RoomBattle; type Room = Rooms.Room; -type RoomID = "" | "lobby" | "staff" | "upperstaff" | "development" | string & {__isRoomID: true}; +type RoomID = "" | "lobby" | "staff" | "upperstaff" | "development" | Lowercase & {__isRoomID: true}; namespace Rooms { export type GlobalRoomState = import('./rooms').GlobalRoomState; export type ChatRoom = import('./rooms').ChatRoom; diff --git a/server/room-battle.ts b/server/room-battle.ts index d151b5c3c3ba..7dc5fb835fc0 100644 --- a/server/room-battle.ts +++ b/server/room-battle.ts @@ -18,6 +18,7 @@ import {RoomGamePlayer, RoomGame} from "./room-game"; import type {Tournament} from './tournaments/index'; import type {RoomSettings} from './rooms'; import type {BestOfGame} from './room-battle-bestof'; +import type {GameTimerSettings} from '../sim/dex-formats'; type ChannelIndex = 0 | 1 | 2 | 3 | 4; export type PlayerIndex = 1 | 2 | 3 | 4; diff --git a/sim/battle-actions.ts b/sim/battle-actions.ts index 9da6173cc418..b2fe1f440574 100644 --- a/sim/battle-actions.ts +++ b/sim/battle-actions.ts @@ -790,7 +790,7 @@ export class BattleActions { boosts[statName2] = 0; } target.setBoost(boosts); - if (move.id === "Spectral Thief") { + if (move.id === "spectralthief") { this.battle.addMove('-anim', pokemon, "Spectral Thief", target); } } diff --git a/sim/dex-abilities.ts b/sim/dex-abilities.ts index ed49ffd0d90a..1de3c5b4f181 100644 --- a/sim/dex-abilities.ts +++ b/sim/dex-abilities.ts @@ -1,4 +1,4 @@ -import {PokemonEventMethods} from './dex-conditions'; +import type {PokemonEventMethods, ConditionData} from './dex-conditions'; import {BasicEffect, toID} from './dex-data'; interface AbilityEventMethods { @@ -25,6 +25,8 @@ export interface AbilityData extends Partial, AbilityEventMethods, Poke } export type ModdedAbilityData = AbilityData | Partial & {inherit: true}; +export interface AbilityDataTable {[abilityid: IDEntry]: AbilityData} +export interface ModdedAbilityDataTable {[abilityid: IDEntry]: ModdedAbilityData} export class Ability extends BasicEffect implements Readonly { declare readonly effectType: 'Ability'; diff --git a/sim/dex-conditions.ts b/sim/dex-conditions.ts index 6cf73e5b6858..ac0f2f856cea 100644 --- a/sim/dex-conditions.ts +++ b/sim/dex-conditions.ts @@ -607,6 +607,8 @@ export interface FieldConditionData extends export type ConditionData = PokemonConditionData | SideConditionData | FieldConditionData; export type ModdedConditionData = ConditionData & {inherit?: true}; +export interface ConditionDataTable {[id: IDEntry]: ConditionData} +export interface ModdedConditionDataTable {[id: IDEntry]: ModdedConditionData} export class Condition extends BasicEffect implements Readonly { diff --git a/sim/dex-data.ts b/sim/dex-data.ts index fc9cd8c2160b..2a61a3189459 100644 --- a/sim/dex-data.ts +++ b/sim/dex-data.ts @@ -145,6 +145,17 @@ export class Nature extends BasicEffect implements Readonly> & {inherit: true}; + +export interface NatureDataTable {[natureid: IDEntry]: NatureData} + + export class DexNatures { readonly dex: ModdedDex; readonly natureCache = new Map(); @@ -193,6 +204,17 @@ export class DexNatures { } } +export interface TypeData { + damageTaken: {[attackingTypeNameOrEffectid: string]: number}; + HPdvs?: SparseStatsTable; + HPivs?: SparseStatsTable; + isNonstandard?: Nonstandard | null; +} + +export type ModdedTypeData = TypeData | Partial> & {inherit: true}; +export interface TypeDataTable {[typeid: IDEntry]: TypeData} +export interface ModdedTypeDataTable {[typeid: IDEntry]: ModdedTypeData} + type TypeInfoEffectType = 'Type' | 'EffectType'; export class TypeInfo implements Readonly { @@ -308,7 +330,7 @@ export class DexTypes { } const idsCache: readonly StatID[] = ['hp', 'atk', 'def', 'spa', 'spd', 'spe']; -const reverseCache: {readonly [k: string]: StatID} = { +const reverseCache: {readonly [k: IDEntry]: StatID} = { __proto: null as any, "hitpoints": 'hp', "attack": 'atk', diff --git a/sim/dex-formats.ts b/sim/dex-formats.ts index df7baaf03a65..e0bdcb44e673 100644 --- a/sim/dex-formats.ts +++ b/sim/dex-formats.ts @@ -11,6 +11,8 @@ export interface FormatData extends Partial, EventMethods { export type FormatList = (FormatData | {section: string, column?: number})[]; export type ModdedFormatData = FormatData | Omit & {inherit: true}; +export interface FormatDataTable {[id: IDEntry]: FormatData} +export interface ModdedFormatDataTable {[id: IDEntry]: ModdedFormatData} type FormatEffectType = 'Format' | 'Ruleset' | 'Rule' | 'ValidatorRule'; @@ -18,6 +20,18 @@ type FormatEffectType = 'Format' | 'Ruleset' | 'Rule' | 'ValidatorRule'; export type ComplexBan = [string, string, number, string[]]; export type ComplexTeamBan = ComplexBan; +export interface GameTimerSettings { + dcTimer: boolean; + dcTimerBank: boolean; + starting: number; + grace: number; + addPerTurn: number; + maxPerTurn: number; + maxFirstTurn: number; + timeoutAutoChoose: boolean; + accelerate: boolean; +} + /** * A RuleTable keeps track of the rules that a format has. The key can be: * - '[ruleid]' the ID of a rule in effect @@ -69,13 +83,13 @@ export class RuleTable extends Map { if (this.has(`+basepokemon:${toID(species.baseSpecies)}`)) return false; if (this.has(`-basepokemon:${toID(species.baseSpecies)}`)) return true; for (const tagid in Tags) { - const tag = Tags[tagid]; + const tag = Tags[tagid as ID]; if (this.has(`-pokemontag:${tagid}`)) { if ((tag.speciesFilter || tag.genericFilter)!(species)) return true; } } for (const tagid in Tags) { - const tag = Tags[tagid]; + const tag = Tags[tagid as ID]; if (this.has(`+pokemontag:${tagid}`)) { if ((tag.speciesFilter || tag.genericFilter)!(species)) return false; } @@ -94,13 +108,13 @@ export class RuleTable extends Map { if (this.has(`+basepokemon:${toID(species.baseSpecies)}`)) return false; if (this.has(`*basepokemon:${toID(species.baseSpecies)}`)) return true; for (const tagid in Tags) { - const tag = Tags[tagid]; + const tag = Tags[tagid as ID]; if (this.has(`*pokemontag:${tagid}`)) { if ((tag.speciesFilter || tag.genericFilter)!(species)) return true; } } for (const tagid in Tags) { - const tag = Tags[tagid]; + const tag = Tags[tagid as ID]; if (this.has(`+pokemontag:${tagid}`)) { if ((tag.speciesFilter || tag.genericFilter)!(species)) return false; } diff --git a/sim/dex-items.ts b/sim/dex-items.ts index 6e67352ebd98..5a1b1c172fbb 100644 --- a/sim/dex-items.ts +++ b/sim/dex-items.ts @@ -1,4 +1,4 @@ -import {PokemonEventMethods} from './dex-conditions'; +import type {PokemonEventMethods, ConditionData} from './dex-conditions'; import {BasicEffect, toID} from './dex-data'; interface FlingData { @@ -17,6 +17,9 @@ export type ModdedItemData = ItemData | Partial> & { onCustap?: (this: Battle, pokemon: Pokemon) => void, }; +export interface ItemDataTable {[itemid: IDEntry]: ItemData} +export interface ModdedItemDataTable {[itemid: IDEntry]: ModdedItemData} + export class Item extends BasicEffect implements Readonly { declare readonly effectType: 'Item'; diff --git a/sim/dex-moves.ts b/sim/dex-moves.ts index bfcb3946f569..f274dc3c8914 100644 --- a/sim/dex-moves.ts +++ b/sim/dex-moves.ts @@ -1,4 +1,5 @@ import {Utils} from '../lib'; +import type {ConditionData} from './dex-conditions'; import {BasicEffect, toID} from './dex-data'; /** @@ -171,10 +172,10 @@ export interface MoveData extends EffectData, MoveEventMethods, HitEffect { * ID of the Z-Crystal that calls the move. * `true` for Z-Powered status moves like Z-Encore. */ - isZ?: boolean | string; + isZ?: boolean | IDEntry; zMove?: { basePower?: number, - effect?: string, + effect?: IDEntry, boost?: SparseBoostsTable, }; @@ -182,7 +183,7 @@ export interface MoveData extends EffectData, MoveEventMethods, HitEffect { // ------------- /** * `true` for Max moves like Max Airstream. If its a G-Max moves, this is - * the species ID of the Gigantamax Pokemon that can use this G-Max move. + * the species name of the Gigantamax Pokemon that can use this G-Max move. */ isMax?: boolean | string; maxMove?: { @@ -191,7 +192,7 @@ export interface MoveData extends EffectData, MoveEventMethods, HitEffect { // Hit effects // ----------- - ohko?: boolean | string; + ohko?: boolean | 'Ice'; thawsTarget?: boolean; heal?: number[] | null; forceSwitch?: boolean; @@ -243,17 +244,17 @@ export interface MoveData extends EffectData, MoveEventMethods, HitEffect { ignoreAccuracy?: boolean; ignoreDefensive?: boolean; ignoreEvasion?: boolean; - ignoreImmunity?: boolean | {[k: string]: boolean}; + ignoreImmunity?: boolean | {[typeName: string]: boolean}; ignoreNegativeOffensive?: boolean; ignoreOffensive?: boolean; ignorePositiveDefensive?: boolean; ignorePositiveEvasion?: boolean; multiaccuracy?: boolean; multihit?: number | number[]; - multihitType?: string; + multihitType?: 'parentalbond'; noDamageVariance?: boolean; - nonGhostTarget?: string; - pressureTarget?: string; + nonGhostTarget?: MoveTarget; + pressureTarget?: MoveTarget; spreadModifier?: number; sleepUsable?: boolean; /** @@ -274,7 +275,7 @@ export interface MoveData extends EffectData, MoveEventMethods, HitEffect { isConfusionSelfHit?: boolean; noSketch?: boolean; stallingMove?: boolean; - baseMove?: string; + baseMove?: ID; } export type ModdedMoveData = MoveData | Partial> & { @@ -286,6 +287,9 @@ export type ModdedMoveData = MoveData | Partial> & { gen?: number, }; +export interface MoveDataTable {[moveid: IDEntry]: MoveData} +export interface ModdedMoveDataTable {[moveid: IDEntry]: ModdedMoveData} + export interface Move extends Readonly { readonly effectType: 'Move'; } @@ -305,8 +309,7 @@ interface MoveHitData { } type MutableMove = BasicEffect & MoveData; -type RuinableMove = {[k in `ruined${'Atk' | 'Def' | 'SpA' | 'SpD'}`]?: Pokemon;}; -export interface ActiveMove extends MutableMove, RuinableMove { +export interface ActiveMove extends MutableMove { readonly name: string; readonly effectType: 'Move'; readonly id: ID; @@ -339,6 +342,10 @@ export interface ActiveMove extends MutableMove, RuinableMove { typeChangerBoosted?: Effect; willChangeForme?: boolean; infiltrates?: boolean; + ruinedAtk?: Pokemon; + ruinedDef?: Pokemon; + ruinedSpA?: Pokemon; + ruinedSpD?: Pokemon; /** * Has this move been boosted by a Z-crystal or used by a Dynamax Pokemon? Usually the same as @@ -364,7 +371,7 @@ export class DataMove extends BasicEffect implements Readonly { declare readonly effectType: 'Pokemon'; /** @@ -407,7 +443,7 @@ export class DexSpecies { if (!this.dex.data.Pokedex.hasOwnProperty(id)) { let aliasTo = ''; - const formeNames: {[k: string]: string[]} = { + const formeNames: {[k: IDEntry]: IDEntry[]} = { alola: ['a', 'alola', 'alolan'], galar: ['g', 'galar', 'galarian'], hisui: ['h', 'hisui', 'hisuian'], @@ -417,7 +453,7 @@ export class DexSpecies { }; for (const forme in formeNames) { let pokeName = ''; - for (const i of formeNames[forme]) { + for (const i of formeNames[forme as ID]) { if (id.startsWith(i)) { pokeName = id.slice(i.length); } else if (id.endsWith(i)) { @@ -449,9 +485,10 @@ export class DexSpecies { // Inherit any statuses from the base species (Arceus, Silvally). const baseSpeciesStatuses = this.dex.data.Conditions[toID(species.baseSpecies)]; if (baseSpeciesStatuses !== undefined) { - let key: keyof EffectData; - for (key in baseSpeciesStatuses) { - if (!(key in species)) (species as any)[key] = baseSpeciesStatuses[key]; + for (const key in baseSpeciesStatuses) { + if (!(key in species)) { + (species as any)[key] = (baseSpeciesStatuses as any)[key]; + } } } if (!species.tier && !species.doublesTier && !species.natDexTier && species.baseSpecies !== species.name) { diff --git a/sim/dex.ts b/sim/dex.ts index 0afa9ee67bd0..4f529f2721e8 100644 --- a/sim/dex.ts +++ b/sim/dex.ts @@ -68,24 +68,24 @@ const DATA_FILES = { TypeChart: 'typechart', }; -interface DexTable { - [key: string]: T; -} +/** Unfortunately we do for..in too much to want to deal with the casts */ +export interface DexTable {[id: string]: T} +export interface AliasesTable {[id: IDEntry]: string} interface DexTableData { - Abilities: DexTable; - Aliases: {[id: string]: string}; - Rulesets: DexTable; - FormatsData: DexTable; - Items: DexTable; - Learnsets: DexTable; - Moves: DexTable; - Natures: DexTable; - Pokedex: DexTable; - PokemonGoData: DexTable; + Abilities: DexTable; + Aliases: DexTable; + Rulesets: DexTable; + Items: DexTable; + Learnsets: DexTable; + Moves: DexTable; + Natures: DexTable; + Pokedex: DexTable; + FormatsData: DexTable; + PokemonGoData: DexTable; Scripts: DexTable; - Conditions: DexTable; - TypeChart: DexTable; + Conditions: DexTable; + TypeChart: DexTable; } interface TextTableData { Abilities: DexTable; @@ -317,7 +317,7 @@ export class ModdedDex { return moveCopy; } - getHiddenPower(ivs: AnyObject) { + getHiddenPower(ivs: StatsTable) { const hpTypes = [ 'Fighting', 'Flying', 'Poison', 'Ground', 'Rock', 'Bug', 'Ghost', 'Steel', 'Fire', 'Water', 'Grass', 'Electric', 'Psychic', 'Ice', 'Dragon', 'Dark', @@ -342,8 +342,8 @@ export class ModdedDex { let hpPowerX = 0; let i = 1; for (const s in stats) { - hpTypeX += i * (ivs[s] % 2); - hpPowerX += i * (tr(ivs[s] / 2) % 2); + hpTypeX += i * (ivs[s as StatID] % 2); + hpPowerX += i * (tr(ivs[s as StatID] / 2) % 2); i *= 2; } return { @@ -378,7 +378,7 @@ export class ModdedDex { } as const; let searchResults: AnyObject[] | null = []; for (const table of searchIn) { - const res: AnyObject = this[searchObjects[table]].get(target); + const res = this[searchObjects[table]].get(target); if (res.exists && res.gen <= this.gen) { searchResults.push({ isInexact, @@ -400,14 +400,14 @@ export class ModdedDex { maxLd = 2; } searchResults = null; - for (const table of [...searchIn, 'Aliases'] as DataType[]) { - const searchObj = this.data[table]; + for (const table of [...searchIn, 'Aliases'] as const) { + const searchObj = this.data[table] as DexTable; if (!searchObj) continue; for (const j in searchObj) { const ld = Utils.levenshtein(cmpTarget, j, maxLd); if (ld <= maxLd) { - const word = (searchObj[j] as DexTable).name || (searchObj[j] as DexTable).species || j; + const word = searchObj[j].name || j; const results = this.dataSearch(word, searchIn, word); if (results) { searchResults = results; diff --git a/sim/global-types.ts b/sim/global-types.ts index 6e2503cad5bf..8a0fb292fdb6 100644 --- a/sim/global-types.ts +++ b/sim/global-types.ts @@ -19,8 +19,10 @@ type TeamValidator = import('./team-validator').TeamValidator; type PokemonSources = import('./team-validator').PokemonSources; /** An ID must be lowercase alphanumeric. */ -type ID = '' | string & {__isID: true}; -type PokemonSlot = '' | string & {__isSlot: true}; +type ID = '' | Lowercase & {__isID: true}; +/** Like ID, but doesn't require you to type `as ID` to define it. For data files and object keys. */ +type IDEntry = Lowercase; +type PokemonSlot = '' | IDEntry & {__isSlot: true}; interface AnyObject {[k: string]: any} type GenderName = 'M' | 'F' | 'N' | ''; @@ -36,30 +38,6 @@ type Nonstandard = 'Past' | 'Future' | 'Unobtainable' | 'CAP' | 'LGPE' | 'Custom type PokemonSet = import('./teams').PokemonSet; -/** - * Describes a possible way to get a move onto a pokemon. - * - * First character is a generation number, 1-7. - * Second character is a source ID, one of: - * - * - M = TM/HM - * - T = tutor - * - L = start or level-up, 3rd char+ is the level - * - R = restricted (special moves like Rotom moves) - * - E = egg - * - D = Dream World, only 5D is valid - * - S = event, 3rd char+ is the index in .eventData - * - V = Virtual Console or Let's Go transfer, only 7V/8V is valid - * - C = NOT A REAL SOURCE, see note, only 3C/4C is valid - * - * C marks certain moves learned by a pokemon's prevo. It's used to - * work around the chainbreeding checker's shortcuts for performance; - * it lets the pokemon be a valid father for teaching the move, but - * is otherwise ignored by the learnset checker (which will actually - * check prevos for compatibility). - */ -type MoveSource = string; - namespace TierTypes { export type Singles = "AG" | "Uber" | "(Uber)" | "OU" | "(OU)" | "UUBL" | "UU" | "RUBL" | "RU" | "NUBL" | "NU" | "(NU)" | "PUBL" | "PU" | "(PU)" | "ZUBL" | "ZU" | "NFE" | "LC"; @@ -78,10 +56,10 @@ interface EventInfo { perfectIVs?: number; /** true: has hidden ability, false | undefined: never has hidden ability */ isHidden?: boolean; - abilities?: string[]; + abilities?: IDEntry[]; maxEggMoves?: number; - moves?: string[]; - pokeball?: string; + moves?: IDEntry[]; + pokeball?: IDEntry; from?: string; /** Japan-only events can't be transferred to international games in Gen 1 */ japan?: boolean; @@ -145,63 +123,25 @@ interface BasicEffect extends EffectData { toString: () => string; } -type ConditionData = import('./dex-conditions').ConditionData; -type ModdedConditionData = import('./dex-conditions').ModdedConditionData; type Condition = import('./dex-conditions').Condition; -type MoveData = import('./dex-moves').MoveData; -type ModdedMoveData = import('./dex-moves').ModdedMoveData; type ActiveMove = import('./dex-moves').ActiveMove; type Move = import('./dex-moves').Move; type MoveTarget = import('./dex-moves').MoveTarget; -type ItemData = import('./dex-items').ItemData; -type ModdedItemData = import('./dex-items').ModdedItemData; type Item = import('./dex-items').Item; -type AbilityData = import('./dex-abilities').AbilityData; -type ModdedAbilityData = import('./dex-abilities').ModdedAbilityData; type Ability = import('./dex-abilities').Ability; -type SpeciesData = import('./dex-species').SpeciesData; -type ModdedSpeciesData = import('./dex-species').ModdedSpeciesData; -type SpeciesFormatsData = import('./dex-species').SpeciesFormatsData; -type ModdedSpeciesFormatsData = import('./dex-species').ModdedSpeciesFormatsData; -type LearnsetData = import('./dex-species').LearnsetData; -type ModdedLearnsetData = import('./dex-species').ModdedLearnsetData; type Species = import('./dex-species').Species; -type PokemonGoData = import('./dex-species').PokemonGoData; -type FormatData = import('./dex-formats').FormatData; -type FormatList = import('./dex-formats').FormatList; -type ModdedFormatData = import('./dex-formats').ModdedFormatData; type Format = import('./dex-formats').Format; -interface NatureData { - name: string; - plus?: StatIDExceptHP; - minus?: StatIDExceptHP; -} - -type ModdedNatureData = NatureData | Partial> & {inherit: true}; - type Nature = import('./dex-data').Nature; type GameType = 'singles' | 'doubles' | 'triples' | 'rotation' | 'multi' | 'freeforall'; type SideID = 'p1' | 'p2' | 'p3' | 'p4'; -interface GameTimerSettings { - dcTimer: boolean; - dcTimerBank: boolean; - starting: number; - grace: number; - addPerTurn: number; - maxPerTurn: number; - maxFirstTurn: number; - timeoutAutoChoose: boolean; - accelerate: boolean; -} - type SpreadMoveTargets = (Pokemon | false | null)[]; type SpreadMoveDamage = (number | boolean | undefined)[]; type ZMoveOptions = ({move: string, target: MoveTarget} | null)[]; @@ -422,15 +362,6 @@ interface ModdedBattleScriptsData extends Partial { checkWin?: (this: Battle, faintQueue?: Battle['faintQueue'][0]) => true | undefined; } -interface TypeData { - damageTaken: {[attackingTypeNameOrEffectid: string]: number}; - HPdvs?: SparseStatsTable; - HPivs?: SparseStatsTable; - isNonstandard?: Nonstandard | null; -} - -type ModdedTypeData = TypeData | Partial> & {inherit: true}; - type TypeInfo = import('./dex-data').TypeInfo; interface PlayerOptions { @@ -441,11 +372,11 @@ interface PlayerOptions { seed?: PRNGSeed; } -interface TextObject { +interface BasicTextData { desc?: string; shortDesc?: string; } -interface Plines { +interface ConditionTextData extends BasicTextData { activate?: string; addItem?: string; block?: string; @@ -460,19 +391,7 @@ interface Plines { transform?: string; } -interface TextFile extends TextObject { - name: string; - gen1?: ModdedTextObject; - gen2?: ModdedTextObject; - gen3?: ModdedTextObject; - gen4?: ModdedTextObject; - gen5?: ModdedTextObject; - gen6?: ModdedTextObject; - gen7?: ModdedTextObject; - gen8?: ModdedTextObject; -} - -interface MovePlines extends Plines { +interface MoveTextData extends ConditionTextData { alreadyStarted?: string; blockSelf?: string; clearBoost?: string; @@ -492,24 +411,28 @@ interface MovePlines extends Plines { upkeep?: string; } -interface AbilityText extends TextFile, Plines { - activateFromItem?: string; - activateNoTarget?: string; - copyBoost?: string; - transformEnd?: string; -} - -/* eslint-disable @typescript-eslint/no-empty-interface */ -interface MoveText extends TextFile, MovePlines {} - -interface ItemText extends TextFile, Plines {} - -interface PokedexText extends TextFile {} - -interface DefaultText extends AnyObject {} +type TextFile = T & { + name: string, + gen1?: T, + gen2?: T, + gen3?: T, + gen4?: T, + gen5?: T, + gen6?: T, + gen7?: T, + gen8?: T, +}; -interface ModdedTextObject extends TextObject, Plines {} -/* eslint-enable @typescript-eslint/no-empty-interface */ +type AbilityText = TextFile; +type MoveText = TextFile; +type ItemText = TextFile; +type PokedexText = TextFile; +type DefaultText = AnyObject; namespace RandomTeamsTypes { export interface TeamDetails { diff --git a/sim/team-validator.ts b/sim/team-validator.ts index 76abc43f9d1f..1b2eb840df70 100644 --- a/sim/team-validator.ts +++ b/sim/team-validator.ts @@ -8,6 +8,7 @@ */ import {Dex, toID} from './dex'; +import type {MoveSource} from './dex-species'; import {Utils} from '../lib'; import {Tags} from '../data/tags'; import {Teams} from './teams'; @@ -1746,7 +1747,7 @@ export class TeamValidator { for (const ruleid of ruleTable.tagRules) { if (ruleid.startsWith('*')) continue; - const tagid = ruleid.slice(12); + const tagid = ruleid.slice(12) as ID; const tag = Tags[tagid]; if ((tag.speciesFilter || tag.genericFilter)!(tierSpecies)) { const existenceTag = EXISTENCE_TAG.includes(tagid); @@ -2064,7 +2065,7 @@ export class TeamValidator { if (canBottleCap) { // IVs can be overridden but Hidden Power type can't if (Object.keys(eventData.ivs).length >= 6) { - const requiredHpType = dex.getHiddenPower(eventData.ivs).type; + const requiredHpType = dex.getHiddenPower(eventData.ivs as StatsTable).type; if (set.hpType && set.hpType !== requiredHpType) { if (fastReturn) return true; problems.push(`${name} can only have Hidden Power ${requiredHpType}${etc}.`); @@ -2536,7 +2537,7 @@ export class TeamValidator { // falls through to LMT check below } else if (level >= 5 && learnedGen === 3 && species.canHatch) { // Pomeg Glitch - learned = learnedGen + 'Epomeg'; + learned = learnedGen + 'Epomeg' as MoveSource; } else if (species.gender !== 'N' && learnedGen >= 2 && species.canHatch && !setSources.isFromPokemonGo) { // available as egg move @@ -2545,7 +2546,7 @@ export class TeamValidator { cantLearnReason = `is learned at level ${parseInt(learned.substr(2))}.`; continue; } - learned = learnedGen + 'Eany'; + learned = learnedGen + 'Eany' as MoveSource; // falls through to E check below } else { // this move is unavailable, skip it @@ -2595,7 +2596,7 @@ export class TeamValidator { } else if (learnedGen < 6 || (species.mother && !this.motherCanLearn(toID(species.mother), moveid))) { limitedEggMove = move.id; } - learned = learnedGen + 'E' + (species.prevo ? species.id : ''); + learned = learnedGen + 'E' + (species.prevo ? species.id : '') as MoveSource; if (tradebackEligible && learnedGen === 2 && move.gen <= 1) { // can tradeback moveSources.add('1ET' + learned.slice(2), limitedEggMove); From 8e8390536341a580c7448936a8a2662c5de06a85 Mon Sep 17 00:00:00 2001 From: Guangcong Luo Date: Mon, 1 Jul 2024 17:08:08 -0700 Subject: [PATCH 103/139] Improve code readability (#10374) This is just a bunch of random changes to improve code readability. The biggest change is `battle#go` -> `battle#turnLoop`. --- data/mods/gen9ssb/moves.ts | 2 +- data/mods/mixandmega/scripts.ts | 2 +- data/mods/partnersincrime/scripts.ts | 2 +- data/mods/randomroulette/scripts.ts | 2 +- data/mods/trademarked/scripts.ts | 2 +- sim/battle.ts | 78 +++++++++++++++------------- sim/global-types.ts | 2 +- test/sim/decisions.js | 14 ++--- test/sim/misc/endlessbattleclause.js | 2 +- 9 files changed, 57 insertions(+), 49 deletions(-) diff --git a/data/mods/gen9ssb/moves.ts b/data/mods/gen9ssb/moves.ts index 987368248015..d5e47d8f1e48 100644 --- a/data/mods/gen9ssb/moves.ts +++ b/data/mods/gen9ssb/moves.ts @@ -3830,7 +3830,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.add('-sideend', pokemon.side, this.dex.conditions.get(condition).name, '[from] move: Time Skip', '[of] ' + pokemon); } } - // 9 turn addition so the +1 from nextTurn totals to 10 turns + // 9 turn addition so the +1 from endTurn totals to 10 turns this.turn += 9; }, boosts: { diff --git a/data/mods/mixandmega/scripts.ts b/data/mods/mixandmega/scripts.ts index 7fb9f4d494d3..1fa80f393364 100644 --- a/data/mods/mixandmega/scripts.ts +++ b/data/mods/mixandmega/scripts.ts @@ -92,7 +92,7 @@ export const Scripts: ModdedBattleScriptsData = { this.queue.addChoice({choice: 'start'}); this.midTurn = true; - if (!this.requestState) this.go(); + if (!this.requestState) this.turnLoop(); }, runAction(action) { const pokemonOriginalHP = action.pokemon?.hp; diff --git a/data/mods/partnersincrime/scripts.ts b/data/mods/partnersincrime/scripts.ts index f167a02470e3..14d63565d953 100644 --- a/data/mods/partnersincrime/scripts.ts +++ b/data/mods/partnersincrime/scripts.ts @@ -1,7 +1,7 @@ export const Scripts: ModdedBattleScriptsData = { gen: 9, inherit: 'gen9', - nextTurn() { + endTurn() { this.turn++; this.lastSuccessfulMoveThisTurn = null; diff --git a/data/mods/randomroulette/scripts.ts b/data/mods/randomroulette/scripts.ts index cb848cf50982..7832aab0fe22 100644 --- a/data/mods/randomroulette/scripts.ts +++ b/data/mods/randomroulette/scripts.ts @@ -116,6 +116,6 @@ export const Scripts: ModdedBattleScriptsData = { this.queue.addChoice({choice: 'start'}); this.midTurn = true; - if (!this.requestState) this.go(); + if (!this.requestState) this.turnLoop(); }, }; diff --git a/data/mods/trademarked/scripts.ts b/data/mods/trademarked/scripts.ts index b3b334f92516..573590df3810 100644 --- a/data/mods/trademarked/scripts.ts +++ b/data/mods/trademarked/scripts.ts @@ -1,7 +1,7 @@ export const Scripts: ModdedBattleScriptsData = { gen: 9, inherit: 'gen9', - nextTurn() { + endTurn() { this.turn++; this.lastSuccessfulMoveThisTurn = null; diff --git a/sim/battle.ts b/sim/battle.ts index 99c1286addbf..a6897f6cb747 100644 --- a/sim/battle.ts +++ b/sim/battle.ts @@ -1377,7 +1377,7 @@ export class Battle { if (!this.ended && side.requestState) { side.emitRequest({wait: true, side: side.getRequestData()}); side.clearChoice(); - if (this.allChoicesDone()) this.commitDecisions(); + if (this.allChoicesDone()) this.commitChoices(); } return true; } @@ -1439,7 +1439,7 @@ export class Battle { pokemon.faint(source, effect); } - nextTurn() { + endTurn() { this.turn++; this.lastSuccessfulMoveThisTurn = null; @@ -1774,11 +1774,11 @@ export class Battle { this.add('rated', typeof this.rated === 'string' ? this.rated : ''); } - if (format.onBegin) format.onBegin.call(this); + format.onBegin?.call(this); for (const rule of this.ruleTable.keys()) { if ('+*-!'.includes(rule.charAt(0))) continue; const subFormat = this.dex.formats.get(rule); - if (subFormat.onBegin) subFormat.onBegin.call(this); + subFormat.onBegin?.call(this); } if (this.sides.some(side => !side.pokemon[0])) { @@ -1789,16 +1789,16 @@ export class Battle { this.checkEVBalance(); } - if (format.onTeamPreview) format.onTeamPreview.call(this); + format.onTeamPreview?.call(this); for (const rule of this.ruleTable.keys()) { if ('+*-!'.includes(rule.charAt(0))) continue; const subFormat = this.dex.formats.get(rule); - if (subFormat.onTeamPreview) subFormat.onTeamPreview.call(this); + subFormat.onTeamPreview?.call(this); } this.queue.addChoice({choice: 'start'}); this.midTurn = true; - if (!this.requestState) this.go(); + if (!this.requestState) this.turnLoop(); } restart(send?: (type: string, data: string | string[]) => void) { @@ -1826,9 +1826,9 @@ export class Battle { effect: Effect | null = null, isSecondary = false, isSelf = false ) { if (this.event) { - if (!target) target = this.event.target; - if (!source) source = this.event.source; - if (!effect) effect = this.effect; + target ||= this.event.target; + source ||= this.event.source; + effect ||= this.effect; } if (!target?.hp) return 0; if (!target.isActive) return false; @@ -2017,18 +2017,18 @@ export class Battle { effect: 'drain' | 'recoil' | Effect | null = null, instafaint = false ) { if (this.event) { - if (!target) target = this.event.target; - if (!source) source = this.event.source; - if (!effect) effect = this.effect; + target ||= this.event.target; + source ||= this.event.source; + effect ||= this.effect; } return this.spreadDamage([damage], [target], source, effect, instafaint)[0]; } directDamage(damage: number, target?: Pokemon, source: Pokemon | null = null, effect: Effect | null = null) { if (this.event) { - if (!target) target = this.event.target; - if (!source) source = this.event.source; - if (!effect) effect = this.effect; + target ||= this.event.target; + source ||= this.event.source; + effect ||= this.effect; } if (!target?.hp) return 0; if (!damage) return 0; @@ -2078,9 +2078,9 @@ export class Battle { heal(damage: number, target?: Pokemon, source: Pokemon | null = null, effect: 'drain' | Effect | null = null) { if (this.event) { - if (!target) target = this.event.target; - if (!source) source = this.event.source; - if (!effect) effect = this.effect; + target ||= this.event.target; + source ||= this.event.source; + effect ||= this.effect; } if (effect === 'drain') effect = this.dex.conditions.getByID(effect as ID); if (damage && damage <= 1) damage = 1; @@ -2136,22 +2136,21 @@ export class Battle { return ((previousMod * nextMod + 2048) >> 12) / 4096; // M'' = ((M * M') + 0x800) >> 12 } - chainModify(numerator: number | number[], denominator?: number) { + chainModify(numerator: number | number[], denominator = 1) { const previousMod = this.trunc(this.event.modifier * 4096); if (Array.isArray(numerator)) { denominator = numerator[1]; numerator = numerator[0]; } - const nextMod = this.trunc(numerator * 4096 / (denominator || 1)); + const nextMod = this.trunc(numerator * 4096 / denominator); this.event.modifier = ((previousMod * nextMod + 2048) >> 12) / 4096; } - modify(value: number, numerator: number | number[], denominator?: number) { + modify(value: number, numerator: number | number[], denominator = 1) { // You can also use: // modify(value, [numerator, denominator]) // modify(value, fraction) - assuming you trust JavaScript's floating-point handler - if (!denominator) denominator = 1; if (Array.isArray(numerator)) { denominator = numerator[1]; numerator = numerator[0]; @@ -2413,14 +2412,10 @@ export class Battle { } checkWin(faintData?: Battle['faintQueue'][0]) { - let team1PokemonLeft = this.sides[0].pokemonLeft; - let team2PokemonLeft = this.sides[1].pokemonLeft; + const team1PokemonLeft = this.sides[0].pokemonLeft + (this.sides[0].allySide?.pokemonLeft || 0); + const team2PokemonLeft = this.sides[1].pokemonLeft + (this.sides[1].allySide?.pokemonLeft || 0); const team3PokemonLeft = this.gameType === 'freeforall' && this.sides[2]!.pokemonLeft; const team4PokemonLeft = this.gameType === 'freeforall' && this.sides[3]!.pokemonLeft; - if (this.gameType === 'multi') { - team1PokemonLeft += this.sides[2]!.pokemonLeft; - team2PokemonLeft += this.sides[3]!.pokemonLeft; - } if (!team1PokemonLeft && !team2PokemonLeft && !team3PokemonLeft && !team4PokemonLeft) { this.win(faintData && this.gen > 4 ? faintData.target.side : null); return true; @@ -2777,7 +2772,14 @@ export class Battle { return false; } - go() { + /** + * Generally called at the beginning of a turn, to go through the + * turn one action at a time. + * + * If there is a mid-turn decision (like U-Turn), this will return + * and be called again later to resume the turn. + */ + turnLoop() { this.add(''); this.add('t:', Math.floor(Date.now() / 1000)); if (this.requestState) this.requestState = ''; @@ -2794,7 +2796,7 @@ export class Battle { if (this.requestState || this.ended) return; } - this.nextTurn(); + this.endTurn(); this.midTurn = false; this.queue.clear(); } @@ -2812,7 +2814,7 @@ export class Battle { side.emitChoiceError(`Incomplete choice: ${input} - missing other pokemon`); return false; } - if (this.allChoicesDone()) this.commitDecisions(); + if (this.allChoicesDone()) this.commitChoices(); return true; } @@ -2829,12 +2831,16 @@ export class Battle { side.autoChoose(); } } - this.commitDecisions(); + this.commitChoices(); } - commitDecisions() { + commitChoices() { this.updateSpeed(); + // Sometimes you need to make switch choices mid-turn (e.g. U-turn, + // fainting). When this happens, the rest of the turn is saved (and not + // re-sorted), but the new switch choices are sorted and inserted before + // the rest of the turn. const oldQueue = this.queue.list; this.queue.clear(); if (!this.allChoicesDone()) throw new Error("Not all choices done"); @@ -2856,7 +2862,9 @@ export class Battle { side.activeRequest = null; } - this.go(); + this.turnLoop(); + + // workaround for tests if (this.log.length - this.sentLogPos > 500) this.sendUpdates(); } diff --git a/sim/global-types.ts b/sim/global-types.ts index 8a0fb292fdb6..76e322cfbccf 100644 --- a/sim/global-types.ts +++ b/sim/global-types.ts @@ -347,7 +347,7 @@ interface ModdedBattleScriptsData extends Partial { this: Battle, trappedBySide: boolean[], stalenessBySide: ('internal' | 'external' | undefined)[] ) => boolean | undefined; natureModify?: (this: Battle, stats: StatsTable, set: PokemonSet) => StatsTable; - nextTurn?: (this: Battle) => void; + endTurn?: (this: Battle) => void; runAction?: (this: Battle, action: Action) => void; spreadModify?: (this: Battle, baseStats: StatsTable, set: PokemonSet) => StatsTable; start?: (this: Battle) => void; diff --git a/test/sim/decisions.js b/test/sim/decisions.js index ce9f4d43b161..0c650e5d4cec 100644 --- a/test/sim/decisions.js +++ b/test/sim/decisions.js @@ -1239,7 +1239,7 @@ describe('Choice internals', function () { p1.chooseMove(1); p2.chooseMove(1); p2.chooseMove(1); - battle.commitDecisions(); + battle.commitChoices(); assert.equal(battle.turn, 2); assert.statStage(p2.active[0], 'atk', -1); @@ -1248,7 +1248,7 @@ describe('Choice internals', function () { p1.chooseMove('synthesis'); p2.chooseMove('surf'); p2.chooseMove('calmmind'); - battle.commitDecisions(); + battle.commitChoices(); assert.equal(battle.turn, 3); assert.fullHP(p1.active[1]); @@ -1257,7 +1257,7 @@ describe('Choice internals', function () { p1.chooseMove('2'); p2.chooseMove('1'); p2.chooseMove('calmmind'); - battle.commitDecisions(); + battle.commitChoices(); assert.equal(battle.turn, 4); assert.fullHP(p1.active[1]); @@ -1282,13 +1282,13 @@ describe('Choice internals', function () { p1.chooseMove('selfdestruct'); p2.chooseMove('recover'); p2.chooseMove('recover'); - battle.commitDecisions(); + battle.commitChoices(); assert.fainted(p1.active[0]); assert.fainted(p1.active[1]); p1.chooseSwitch(4); p1.chooseSwitch(3); - battle.commitDecisions(); + battle.commitChoices(); assert.equal(battle.turn, 2); assert.equal(p1.active[0].name, 'Ekans'); assert.equal(p1.active[1].name, 'Koffing'); @@ -1316,7 +1316,7 @@ describe('Choice internals', function () { `Expected switch to fail` ); p2.choose('move recover, move recover'); - battle.commitDecisions(); + battle.commitChoices(); assert.equal(battle.turn, 2); assert.equal(p1.active[0].name, 'Mew'); @@ -1329,7 +1329,7 @@ describe('Choice internals', function () { `Expected switch to fail` ); p2.choose('move recover, move recover'); - battle.commitDecisions(); + battle.commitChoices(); assert.equal(battle.turn, 3); assert.equal(p1.active[0].name, 'Bulbasaur'); diff --git a/test/sim/misc/endlessbattleclause.js b/test/sim/misc/endlessbattleclause.js index 5bf58477860b..10cb747a1402 100644 --- a/test/sim/misc/endlessbattleclause.js +++ b/test/sim/misc/endlessbattleclause.js @@ -206,5 +206,5 @@ describe('Endless Battle Clause (slow)', () => { // Endless Battle Clause doesn't take effect for 100 turns, so we artificially skip turns // to get the turn counter to be in the range which could possibly trigger the clause function skipTurns(battle, turns) { - for (let i = 0; i < turns; i++) battle.nextTurn(); + for (let i = 0; i < turns; i++) battle.endTurn(); } From 1eaddf9f8ae0d6d78638d6b39276ae5d691b5ad3 Mon Sep 17 00:00:00 2001 From: shrianshChari <30420527+shrianshChari@users.noreply.github.com> Date: Mon, 1 Jul 2024 18:56:27 -0600 Subject: [PATCH 104/139] [Gen 5] BW1 OU: Update bans (#10384) https://www.smogon.com/forums/threads/bw1-overused.3744853/ In the original version of the OP, Baton Pass was completely unrestricted. However, since then, Baton Pass Stat Clause has since been implemented, but was never done on my fork. King's Rock and Razor Fang have never been banned in BW1 OU. --- config/formats.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/formats.ts b/config/formats.ts index d88d06187159..49d876bc9538 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -3171,8 +3171,8 @@ export const Formats: import('../sim/dex-formats').FormatList = [ ], mod: 'gen5bw1', - ruleset: ['Standard', 'Sleep Clause Mod', 'Swagger Clause'], - banlist: ['Uber', 'Drizzle ++ Swift Swim', 'King\'s Rock', 'Razor Fang', 'Soul Dew', 'Acupressure', 'Assist'], + ruleset: ['Standard', 'Sleep Clause Mod', 'Swagger Clause', 'Baton Pass Stat Clause'], + banlist: ['Uber', 'Drizzle ++ Swift Swim', 'Soul Dew', 'Acupressure', 'Assist'], }, { name: "[Gen 1] ZU", From 62a9115d5c6a2f97c4fe568023ccd750d9b8c9fe Mon Sep 17 00:00:00 2001 From: Karthik <32044378+Karthik99999@users.noreply.github.com> Date: Mon, 1 Jul 2024 22:15:13 -0400 Subject: [PATCH 105/139] Remove option to select target for Tera Starstorm when Terastallized (#10385) --- sim/pokemon.ts | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/sim/pokemon.ts b/sim/pokemon.ts index b85d19b630a5..58cf436e7335 100644 --- a/sim/pokemon.ts +++ b/sim/pokemon.ts @@ -951,13 +951,23 @@ export class Pokemon { moveName += ' ' + basePowerCallback(this); } let target = moveSlot.target; - if (moveSlot.id === 'curse') { + switch (moveSlot.id) { + case 'curse': if (!this.hasType('Ghost')) { - target = this.battle.dex.moves.get('curse').nonGhostTarget || moveSlot.target; + target = this.battle.dex.moves.get('curse').nonGhostTarget; } - // Heal Block only prevents Pollen Puff from targeting an ally when the user has Heal Block - } else if (moveSlot.id === 'pollenpuff' && this.volatiles['healblock']) { - target = 'adjacentFoe'; + break; + case 'pollenpuff': + // Heal Block only prevents Pollen Puff from targeting an ally when the user has Heal Block + if (this.volatiles['healblock']) { + target = 'adjacentFoe'; + } + break; + case 'terastarstorm': + if (this.species.name === 'Terapagos-Stellar') { + target = 'allAdjacentFoes'; + } + break; } let disabled = moveSlot.disabled; if (this.volatiles['dynamax']) { From 6c46ab9924aac84fc9fbab5139d3eac5118fa71f Mon Sep 17 00:00:00 2001 From: Karthik <32044378+Karthik99999@users.noreply.github.com> Date: Mon, 1 Jul 2024 23:19:38 -0400 Subject: [PATCH 106/139] Prefer `shortDesc` for item descriptions (#10386) --- data/text/items.ts | 1170 ++++++++++++++++++++++---------------------- 1 file changed, 585 insertions(+), 585 deletions(-) diff --git a/data/text/items.ts b/data/text/items.ts index 4d0ee356c0a2..fd8ee76fb71b 100644 --- a/data/text/items.ts +++ b/data/text/items.ts @@ -1,349 +1,349 @@ export const ItemsText: {[id: IDEntry]: ItemText} = { abilityshield: { name: "Ability Shield", - desc: "Holder's Ability cannot be changed by any effect.", + shortDesc: "Holder's Ability cannot be changed by any effect.", block: " [POKEMON]'s Ability is protected by the effects of its Ability Shield!", }, abomasite: { name: "Abomasite", - desc: "If held by an Abomasnow, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by an Abomasnow, this item allows it to Mega Evolve in battle.", }, absolite: { name: "Absolite", - desc: "If held by an Absol, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by an Absol, this item allows it to Mega Evolve in battle.", }, absorbbulb: { name: "Absorb Bulb", - desc: "Raises holder's Sp. Atk by 1 stage if hit by a Water-type attack. Single use.", + shortDesc: "Raises holder's Sp. Atk by 1 stage if hit by a Water-type attack. Single use.", }, adamantcrystal: { name: "Adamant Crystal", - desc: "If held by a Dialga, its Steel- and Dragon-type attacks have 1.2x power.", + shortDesc: "If held by a Dialga, its Steel- and Dragon-type attacks have 1.2x power.", }, adamantorb: { name: "Adamant Orb", - desc: "If held by a Dialga, its Steel- and Dragon-type attacks have 1.2x power.", + shortDesc: "If held by a Dialga, its Steel- and Dragon-type attacks have 1.2x power.", }, adrenalineorb: { name: "Adrenaline Orb", - desc: "Raises holder's Speed by 1 stage if it gets affected by Intimidate. Single use.", + shortDesc: "Raises holder's Speed by 1 stage if it gets affected by Intimidate. Single use.", }, aerodactylite: { name: "Aerodactylite", - desc: "If held by an Aerodactyl, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by an Aerodactyl, this item allows it to Mega Evolve in battle.", }, aggronite: { name: "Aggronite", - desc: "If held by an Aggron, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by an Aggron, this item allows it to Mega Evolve in battle.", }, aguavberry: { name: "Aguav Berry", - desc: "Restores 1/3 max HP at 1/4 max HP or less; confuses if -SpD Nature. Single use.", + shortDesc: "Restores 1/3 max HP at 1/4 max HP or less; confuses if -SpD Nature. Single use.", gen7: { - desc: "Restores 1/2 max HP at 1/4 max HP or less; confuses if -SpD Nature. Single use.", + shortDesc: "Restores 1/2 max HP at 1/4 max HP or less; confuses if -SpD Nature. Single use.", }, gen6: { - desc: "Restores 1/8 max HP at 1/2 max HP or less; confuses if -SpD Nature. Single use.", + shortDesc: "Restores 1/8 max HP at 1/2 max HP or less; confuses if -SpD Nature. Single use.", }, }, airballoon: { name: "Air Balloon", - desc: "Holder is immune to Ground-type attacks. Pops when holder is hit.", + shortDesc: "Holder is immune to Ground-type attacks. Pops when holder is hit.", start: " [POKEMON] floats in the air with its Air Balloon!", end: " [POKEMON]'s Air Balloon popped!", }, alakazite: { name: "Alakazite", - desc: "If held by an Alakazam, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by an Alakazam, this item allows it to Mega Evolve in battle.", }, aloraichiumz: { name: "Aloraichium Z", - desc: "If held by an Alolan Raichu with Thunderbolt, it can use Stoked Sparksurfer.", + shortDesc: "If held by an Alolan Raichu with Thunderbolt, it can use Stoked Sparksurfer.", }, altarianite: { name: "Altarianite", - desc: "If held by an Altaria, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by an Altaria, this item allows it to Mega Evolve in battle.", }, ampharosite: { name: "Ampharosite", - desc: "If held by an Ampharos, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by an Ampharos, this item allows it to Mega Evolve in battle.", }, apicotberry: { name: "Apicot Berry", - desc: "Raises holder's Sp. Def by 1 stage when at 1/4 max HP or less. Single use.", + shortDesc: "Raises holder's Sp. Def by 1 stage when at 1/4 max HP or less. Single use.", }, armorfossil: { name: "Armor Fossil", - desc: "Can be revived into Shieldon.", + shortDesc: "Can be revived into Shieldon.", }, aspearberry: { name: "Aspear Berry", - desc: "Holder is cured if it is frozen. Single use.", + shortDesc: "Holder is cured if it is frozen. Single use.", }, assaultvest: { name: "Assault Vest", - desc: "Holder's Sp. Def is 1.5x, but it can only select damaging moves.", + shortDesc: "Holder's Sp. Def is 1.5x, but it can only select damaging moves.", }, audinite: { name: "Audinite", - desc: "If held by an Audino, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by an Audino, this item allows it to Mega Evolve in battle.", }, auspiciousarmor: { name: "Auspicious Armor", - desc: "Evolves Charcadet into Armarouge when used.", + shortDesc: "Evolves Charcadet into Armarouge when used.", }, babiriberry: { name: "Babiri Berry", - desc: "Halves damage taken from a supereffective Steel-type attack. Single use.", + shortDesc: "Halves damage taken from a supereffective Steel-type attack. Single use.", }, banettite: { name: "Banettite", - desc: "If held by a Banette, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Banette, this item allows it to Mega Evolve in battle.", }, beastball: { name: "Beast Ball", - desc: "A special Poke Ball designed to catch Ultra Beasts.", + shortDesc: "A special Poke Ball designed to catch Ultra Beasts.", }, beedrillite: { name: "Beedrillite", - desc: "If held by a Beedrill, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Beedrill, this item allows it to Mega Evolve in battle.", }, belueberry: { name: "Belue Berry", - desc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", + shortDesc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", }, berryjuice: { name: "Berry Juice", - desc: "Restores 20 HP when at 1/2 max HP or less. Single use.", + shortDesc: "Restores 20 HP when at 1/2 max HP or less. Single use.", }, berrysweet: { name: "Berry Sweet", - desc: "Evolves Milcery into Alcremie when held and spun around.", + shortDesc: "Evolves Milcery into Alcremie when held and spun around.", }, bignugget: { name: "Big Nugget", - desc: "A big nugget of pure gold that gives off a lustrous gleam.", + shortDesc: "A big nugget of pure gold that gives off a lustrous gleam.", }, bigroot: { name: "Big Root", - desc: "Holder gains 1.3x HP from draining/Aqua Ring/Ingrain/Leech Seed/Strength Sap.", + shortDesc: "Holder gains 1.3x HP from draining/Aqua Ring/Ingrain/Leech Seed/Strength Sap.", gen6: { - desc: "Holder gains 1.3x HP from draining moves, Aqua Ring, Ingrain, and Leech Seed.", + shortDesc: "Holder gains 1.3x HP from draining moves, Aqua Ring, Ingrain, and Leech Seed.", }, }, bindingband: { name: "Binding Band", - desc: "Holder's partial-trapping moves deal 1/6 max HP per turn instead of 1/8.", + shortDesc: "Holder's partial-trapping moves deal 1/6 max HP per turn instead of 1/8.", }, blackbelt: { name: "Black Belt", - desc: "Holder's Fighting-type attacks have 1.2x power.", + shortDesc: "Holder's Fighting-type attacks have 1.2x power.", gen3: { - desc: "Holder's Fighting-type attacks have 1.1x power.", + shortDesc: "Holder's Fighting-type attacks have 1.1x power.", }, }, blacksludge: { name: "Black Sludge", - desc: "Each turn, if holder is a Poison type, restores 1/16 max HP; loses 1/8 if not.", + shortDesc: "Each turn, if holder is a Poison type, restores 1/16 max HP; loses 1/8 if not.", heal: " [POKEMON] restored a little HP using its Black Sludge!", }, blackglasses: { name: "Black Glasses", - desc: "Holder's Dark-type attacks have 1.2x power.", + shortDesc: "Holder's Dark-type attacks have 1.2x power.", gen3: { - desc: "Holder's Dark-type attacks have 1.1x power.", + shortDesc: "Holder's Dark-type attacks have 1.1x power.", }, }, blastoisinite: { name: "Blastoisinite", - desc: "If held by a Blastoise, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Blastoise, this item allows it to Mega Evolve in battle.", }, blazikenite: { name: "Blazikenite", - desc: "If held by a Blaziken, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Blaziken, this item allows it to Mega Evolve in battle.", }, blueorb: { name: "Blue Orb", - desc: "If held by a Kyogre, this item triggers its Primal Reversion in battle.", + shortDesc: "If held by a Kyogre, this item triggers its Primal Reversion in battle.", }, blukberry: { name: "Bluk Berry", - desc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", + shortDesc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", }, blunderpolicy: { name: "Blunder Policy", - desc: "If the holder misses due to accuracy, its Speed is raised by 2 stages. Single use.", + shortDesc: "If the holder misses due to accuracy, its Speed is raised by 2 stages. Single use.", }, boosterenergy: { name: "Booster Energy", - desc: "Activates the Protosynthesis or Quark Drive Abilities. Single use.", + shortDesc: "Activates the Protosynthesis or Quark Drive Abilities. Single use.", }, bottlecap: { name: "Bottle Cap", - desc: "Used for Hyper Training. One of a Pokemon's stats is calculated with an IV of 31.", + shortDesc: "Used for Hyper Training. One of a Pokemon's stats is calculated with an IV of 31.", }, brightpowder: { name: "Bright Powder", - desc: "The accuracy of attacks against the holder is 0.9x.", + shortDesc: "The accuracy of attacks against the holder is 0.9x.", gen2: { - desc: "An attack against the holder has its accuracy out of 255 lowered by 20.", + shortDesc: "An attack against the holder has its accuracy out of 255 lowered by 20.", }, }, buggem: { name: "Bug Gem", - desc: "Holder's first successful Bug-type attack will have 1.3x power. Single use.", + shortDesc: "Holder's first successful Bug-type attack will have 1.3x power. Single use.", gen5: { - desc: "Holder's first successful Bug-type attack will have 1.5x power. Single use.", + shortDesc: "Holder's first successful Bug-type attack will have 1.5x power. Single use.", }, }, bugmemory: { name: "Bug Memory", - desc: "Holder's Multi-Attack is Bug type.", + shortDesc: "Holder's Multi-Attack is Bug type.", }, buginiumz: { name: "Buginium Z", - desc: "If holder has a Bug move, this item allows it to use a Bug Z-Move.", + shortDesc: "If holder has a Bug move, this item allows it to use a Bug Z-Move.", }, burndrive: { name: "Burn Drive", - desc: "Holder's Techno Blast is Fire type.", + shortDesc: "Holder's Techno Blast is Fire type.", }, cameruptite: { name: "Cameruptite", - desc: "If held by a Camerupt, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Camerupt, this item allows it to Mega Evolve in battle.", }, cellbattery: { name: "Cell Battery", - desc: "Raises holder's Attack by 1 if hit by an Electric-type attack. Single use.", + shortDesc: "Raises holder's Attack by 1 if hit by an Electric-type attack. Single use.", }, charcoal: { name: "Charcoal", - desc: "Holder's Fire-type attacks have 1.2x power.", + shortDesc: "Holder's Fire-type attacks have 1.2x power.", gen3: { - desc: "Holder's Fire-type attacks have 1.1x power.", + shortDesc: "Holder's Fire-type attacks have 1.1x power.", }, }, charizarditex: { name: "Charizardite X", - desc: "If held by a Charizard, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Charizard, this item allows it to Mega Evolve in battle.", }, charizarditey: { name: "Charizardite Y", - desc: "If held by a Charizard, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Charizard, this item allows it to Mega Evolve in battle.", }, chartiberry: { name: "Charti Berry", - desc: "Halves damage taken from a supereffective Rock-type attack. Single use.", + shortDesc: "Halves damage taken from a supereffective Rock-type attack. Single use.", }, cheriberry: { name: "Cheri Berry", - desc: "Holder cures itself if it is paralyzed. Single use.", + shortDesc: "Holder cures itself if it is paralyzed. Single use.", }, cherishball: { name: "Cherish Ball", - desc: "A rare Poke Ball that has been crafted to commemorate an occasion.", + shortDesc: "A rare Poke Ball that has been crafted to commemorate an occasion.", }, chestoberry: { name: "Chesto Berry", - desc: "Holder wakes up if it is asleep. Single use.", + shortDesc: "Holder wakes up if it is asleep. Single use.", }, chilanberry: { name: "Chilan Berry", - desc: "Halves damage taken from a Normal-type attack. Single use.", + shortDesc: "Halves damage taken from a Normal-type attack. Single use.", }, chilldrive: { name: "Chill Drive", - desc: "Holder's Techno Blast is Ice type.", + shortDesc: "Holder's Techno Blast is Ice type.", }, chippedpot: { name: "Chipped Pot", - desc: "Evolves Sinistea-Antique into Polteageist-Antique when used.", + shortDesc: "Evolves Sinistea-Antique into Polteageist-Antique when used.", }, choiceband: { name: "Choice Band", - desc: "Holder's Attack is 1.5x, but it can only select the first move it executes.", + shortDesc: "Holder's Attack is 1.5x, but it can only select the first move it executes.", }, choicescarf: { name: "Choice Scarf", - desc: "Holder's Speed is 1.5x, but it can only select the first move it executes.", + shortDesc: "Holder's Speed is 1.5x, but it can only select the first move it executes.", }, choicespecs: { name: "Choice Specs", - desc: "Holder's Sp. Atk is 1.5x, but it can only select the first move it executes.", + shortDesc: "Holder's Sp. Atk is 1.5x, but it can only select the first move it executes.", }, chopleberry: { name: "Chople Berry", - desc: "Halves damage taken from a supereffective Fighting-type attack. Single use.", + shortDesc: "Halves damage taken from a supereffective Fighting-type attack. Single use.", }, clawfossil: { name: "Claw Fossil", - desc: "Can be revived into Anorith.", + shortDesc: "Can be revived into Anorith.", }, clearamulet: { name: "Clear Amulet", - desc: "Prevents other Pokemon from lowering the holder's stat stages.", + shortDesc: "Prevents other Pokemon from lowering the holder's stat stages.", block: " The effects of [POKEMON]'s Clear Amulet prevent its stats from being lowered!", }, cloversweet: { name: "Clover Sweet", - desc: "Evolves Milcery into Alcremie when held and spun around.", + shortDesc: "Evolves Milcery into Alcremie when held and spun around.", }, cobaberry: { name: "Coba Berry", - desc: "Halves damage taken from a supereffective Flying-type attack. Single use.", + shortDesc: "Halves damage taken from a supereffective Flying-type attack. Single use.", }, colburberry: { name: "Colbur Berry", - desc: "Halves damage taken from a supereffective Dark-type attack. Single use.", + shortDesc: "Halves damage taken from a supereffective Dark-type attack. Single use.", }, cornerstonemask: { name: "Cornerstone Mask", - desc: "Ogerpon-Cornerstone: 1.2x power attacks; Terastallize to gain Embody Aspect.", + shortDesc: "Ogerpon-Cornerstone: 1.2x power attacks; Terastallize to gain Embody Aspect.", }, cornnberry: { name: "Cornn Berry", - desc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", + shortDesc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", }, coverfossil: { name: "Cover Fossil", - desc: "Can be revived into Tirtouga.", + shortDesc: "Can be revived into Tirtouga.", }, covertcloak: { name: "Covert Cloak", - desc: "Holder is not affected by the secondary effect of another Pokemon's attack.", + shortDesc: "Holder is not affected by the secondary effect of another Pokemon's attack.", }, crackedpot: { name: "Cracked Pot", - desc: "Evolves Sinistea into Polteageist when used.", + shortDesc: "Evolves Sinistea into Polteageist when used.", }, custapberry: { name: "Custap Berry", - desc: "Holder moves first in its priority bracket when at 1/4 max HP or less. Single use.", + shortDesc: "Holder moves first in its priority bracket when at 1/4 max HP or less. Single use.", activate: " [POKEMON] can act faster than normal, thanks to its Custap Berry!", }, damprock: { name: "Damp Rock", - desc: "Holder's use of Rain Dance lasts 8 turns instead of 5.", + shortDesc: "Holder's use of Rain Dance lasts 8 turns instead of 5.", }, darkgem: { name: "Dark Gem", - desc: "Holder's first successful Dark-type attack will have 1.3x power. Single use.", + shortDesc: "Holder's first successful Dark-type attack will have 1.3x power. Single use.", gen5: { - desc: "Holder's first successful Dark-type attack will have 1.5x power. Single use.", + shortDesc: "Holder's first successful Dark-type attack will have 1.5x power. Single use.", }, }, darkmemory: { name: "Dark Memory", - desc: "Holder's Multi-Attack is Dark type.", + shortDesc: "Holder's Multi-Attack is Dark type.", }, darkiniumz: { name: "Darkinium Z", - desc: "If holder has a Dark move, this item allows it to use a Dark Z-Move.", + shortDesc: "If holder has a Dark move, this item allows it to use a Dark Z-Move.", }, dawnstone: { name: "Dawn Stone", @@ -352,7 +352,7 @@ export const ItemsText: {[id: IDEntry]: ItemText} = { }, decidiumz: { name: "Decidium Z", - desc: "If held by a Decidueye with Spirit Shackle, it can use Sinister Arrow Raid.", + shortDesc: "If held by a Decidueye with Spirit Shackle, it can use Sinister Arrow Raid.", }, deepseascale: { name: "Deep Sea Scale", @@ -366,82 +366,82 @@ export const ItemsText: {[id: IDEntry]: ItemText} = { }, destinyknot: { name: "Destiny Knot", - desc: "If holder becomes infatuated, the other Pokemon also becomes infatuated.", + shortDesc: "If holder becomes infatuated, the other Pokemon also becomes infatuated.", }, diancite: { name: "Diancite", - desc: "If held by a Diancie, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Diancie, this item allows it to Mega Evolve in battle.", }, diveball: { name: "Dive Ball", - desc: "A Poke Ball that works especially well on Pokemon that live underwater.", + shortDesc: "A Poke Ball that works especially well on Pokemon that live underwater.", }, domefossil: { name: "Dome Fossil", - desc: "Can be revived into Kabuto.", + shortDesc: "Can be revived into Kabuto.", }, dousedrive: { name: "Douse Drive", - desc: "Holder's Techno Blast is Water type.", + shortDesc: "Holder's Techno Blast is Water type.", }, dracoplate: { name: "Draco Plate", - desc: "Holder's Dragon-type attacks have 1.2x power. Judgment is Dragon type.", + shortDesc: "Holder's Dragon-type attacks have 1.2x power. Judgment is Dragon type.", }, dragonfang: { name: "Dragon Fang", - desc: "Holder's Dragon-type attacks have 1.2x power.", + shortDesc: "Holder's Dragon-type attacks have 1.2x power.", gen3: { - desc: "Holder's Dragon-type attacks have 1.1x power.", + shortDesc: "Holder's Dragon-type attacks have 1.1x power.", }, gen2: { - desc: "No competitive use.", + shortDesc: "No competitive use.", }, }, dragongem: { name: "Dragon Gem", - desc: "Holder's first successful Dragon-type attack will have 1.3x power. Single use.", + shortDesc: "Holder's first successful Dragon-type attack will have 1.3x power. Single use.", gen5: { - desc: "Holder's first successful Dragon-type attack will have 1.5x power. Single use.", + shortDesc: "Holder's first successful Dragon-type attack will have 1.5x power. Single use.", }, }, dragonmemory: { name: "Dragon Memory", - desc: "Holder's Multi-Attack is Dragon type.", + shortDesc: "Holder's Multi-Attack is Dragon type.", }, dragonscale: { name: "Dragon Scale", - desc: "Evolves Seadra into Kingdra when traded.", + shortDesc: "Evolves Seadra into Kingdra when traded.", gen2: { - desc: "Holder's Dragon-type attacks have 1.1x power. Evolves Seadra (trade).", + shortDesc: "Holder's Dragon-type attacks have 1.1x power. Evolves Seadra (trade).", }, }, dragoniumz: { name: "Dragonium Z", - desc: "If holder has a Dragon move, this item allows it to use a Dragon Z-Move.", + shortDesc: "If holder has a Dragon move, this item allows it to use a Dragon Z-Move.", }, dreadplate: { name: "Dread Plate", - desc: "Holder's Dark-type attacks have 1.2x power. Judgment is Dark type.", + shortDesc: "Holder's Dark-type attacks have 1.2x power. Judgment is Dark type.", }, dreamball: { name: "Dream Ball", - desc: "A Poke Ball that makes it easier to catch wild Pokémon while they're asleep.", + shortDesc: "A Poke Ball that makes it easier to catch wild Pokémon while they're asleep.", gen7: { - desc: "A special Poke Ball that appears out of nowhere in a bag at the Entree Forest.", + shortDesc: "A special Poke Ball that appears out of nowhere in a bag at the Entree Forest.", }, }, dubiousdisc: { name: "Dubious Disc", - desc: "Evolves Porygon2 into Porygon-Z when traded.", + shortDesc: "Evolves Porygon2 into Porygon-Z when traded.", }, durinberry: { name: "Durin Berry", - desc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", + shortDesc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", }, duskball: { name: "Dusk Ball", - desc: "A Poke Ball that makes it easier to catch wild Pokemon at night or in caves.", + shortDesc: "A Poke Ball that makes it easier to catch wild Pokemon at night or in caves.", }, duskstone: { name: "Dusk Stone", @@ -450,117 +450,117 @@ export const ItemsText: {[id: IDEntry]: ItemText} = { }, earthplate: { name: "Earth Plate", - desc: "Holder's Ground-type attacks have 1.2x power. Judgment is Ground type.", + shortDesc: "Holder's Ground-type attacks have 1.2x power. Judgment is Ground type.", }, eeviumz: { name: "Eevium Z", - desc: "If held by an Eevee with Last Resort, it can use Extreme Evoboost.", + shortDesc: "If held by an Eevee with Last Resort, it can use Extreme Evoboost.", }, ejectbutton: { name: "Eject Button", - desc: "If holder survives a hit, it immediately switches out to a chosen ally. Single use.", + shortDesc: "If holder survives a hit, it immediately switches out to a chosen ally. Single use.", end: " [POKEMON] is switched out with the Eject Button!", }, ejectpack: { name: "Eject Pack", - desc: "If the holder's stat stages are lowered, it switches to a chosen ally. Single use.", + shortDesc: "If the holder's stat stages are lowered, it switches to a chosen ally. Single use.", end: " [POKEMON] is switched out by the Eject Pack!", }, electirizer: { name: "Electirizer", - desc: "Evolves Electabuzz into Electivire when traded.", + shortDesc: "Evolves Electabuzz into Electivire when traded.", }, electricgem: { name: "Electric Gem", - desc: "Holder's first successful Electric-type attack will have 1.3x power. Single use.", + shortDesc: "Holder's first successful Electric-type attack will have 1.3x power. Single use.", gen5: { - desc: "Holder's first successful Electric-type attack will have 1.5x power. Single use.", + shortDesc: "Holder's first successful Electric-type attack will have 1.5x power. Single use.", }, }, electricmemory: { name: "Electric Memory", - desc: "Holder's Multi-Attack is Electric type.", + shortDesc: "Holder's Multi-Attack is Electric type.", }, electricseed: { name: "Electric Seed", - desc: "If the terrain is Electric Terrain, raises holder's Defense by 1 stage. Single use.", + shortDesc: "If the terrain is Electric Terrain, raises holder's Defense by 1 stage. Single use.", }, electriumz: { name: "Electrium Z", - desc: "If holder has an Electric move, this item allows it to use an Electric Z-Move.", + shortDesc: "If holder has an Electric move, this item allows it to use an Electric Z-Move.", }, enigmaberry: { name: "Enigma Berry", - desc: "Restores 1/4 max HP after holder is hit by a supereffective move. Single use.", + shortDesc: "Restores 1/4 max HP after holder is hit by a supereffective move. Single use.", gen3: { - desc: "No competitive use.", + shortDesc: "No competitive use.", }, }, eviolite: { name: "Eviolite", - desc: "If holder's species can evolve, its Defense and Sp. Def are 1.5x.", + shortDesc: "If holder's species can evolve, its Defense and Sp. Def are 1.5x.", }, expertbelt: { name: "Expert Belt", - desc: "Holder's attacks that are super effective against the target do 1.2x damage.", + shortDesc: "Holder's attacks that are super effective against the target do 1.2x damage.", }, fairiumz: { name: "Fairium Z", - desc: "If holder has a Fairy move, this item allows it to use a Fairy Z-Move.", + shortDesc: "If holder has a Fairy move, this item allows it to use a Fairy Z-Move.", }, fairyfeather: { name: "Fairy Feather", - desc: "Holder's Fairy-type attacks have 1.2x power.", + shortDesc: "Holder's Fairy-type attacks have 1.2x power.", }, fairygem: { name: "Fairy Gem", - desc: "Holder's first successful Fairy-type attack will have 1.3x power. Single use.", + shortDesc: "Holder's first successful Fairy-type attack will have 1.3x power. Single use.", }, fairymemory: { name: "Fairy Memory", - desc: "Holder's Multi-Attack is Fairy type.", + shortDesc: "Holder's Multi-Attack is Fairy type.", }, fastball: { name: "Fast Ball", - desc: "A Poke Ball that makes it easier to catch Pokemon which are quick to run away.", + shortDesc: "A Poke Ball that makes it easier to catch Pokemon which are quick to run away.", }, fightinggem: { name: "Fighting Gem", - desc: "Holder's first successful Fighting-type attack will have 1.3x power. Single use.", + shortDesc: "Holder's first successful Fighting-type attack will have 1.3x power. Single use.", gen5: { - desc: "Holder's first successful Fighting-type attack will have 1.5x power. Single use.", + shortDesc: "Holder's first successful Fighting-type attack will have 1.5x power. Single use.", }, }, fightingmemory: { name: "Fighting Memory", - desc: "Holder's Multi-Attack is Fighting type.", + shortDesc: "Holder's Multi-Attack is Fighting type.", }, fightiniumz: { name: "Fightinium Z", - desc: "If holder has a Fighting move, this item allows it to use a Fighting Z-Move.", + shortDesc: "If holder has a Fighting move, this item allows it to use a Fighting Z-Move.", }, figyberry: { name: "Figy Berry", - desc: "Restores 1/3 max HP at 1/4 max HP or less; confuses if -Atk Nature. Single use.", + shortDesc: "Restores 1/3 max HP at 1/4 max HP or less; confuses if -Atk Nature. Single use.", gen7: { - desc: "Restores 1/2 max HP at 1/4 max HP or less; confuses if -Atk Nature. Single use.", + shortDesc: "Restores 1/2 max HP at 1/4 max HP or less; confuses if -Atk Nature. Single use.", }, gen6: { - desc: "Restores 1/8 max HP at 1/2 max HP or less; confuses if -Atk Nature. Single use.", + shortDesc: "Restores 1/8 max HP at 1/2 max HP or less; confuses if -Atk Nature. Single use.", }, }, firegem: { name: "Fire Gem", - desc: "Holder's first successful Fire-type attack will have 1.3x power. Single use.", + shortDesc: "Holder's first successful Fire-type attack will have 1.3x power. Single use.", gen5: { - desc: "Holder's first successful Fire-type attack will have 1.5x power. Single use.", + shortDesc: "Holder's first successful Fire-type attack will have 1.5x power. Single use.", }, }, firememory: { name: "Fire Memory", - desc: "Holder's Multi-Attack is Fire type.", + shortDesc: "Holder's Multi-Attack is Fire type.", }, firestone: { name: "Fire Stone", @@ -569,264 +569,264 @@ export const ItemsText: {[id: IDEntry]: ItemText} = { }, firiumz: { name: "Firium Z", - desc: "If holder has a Fire move, this item allows it to use a Fire Z-Move.", + shortDesc: "If holder has a Fire move, this item allows it to use a Fire Z-Move.", }, fistplate: { name: "Fist Plate", - desc: "Holder's Fighting-type attacks have 1.2x power. Judgment is Fighting type.", + shortDesc: "Holder's Fighting-type attacks have 1.2x power. Judgment is Fighting type.", }, flameorb: { name: "Flame Orb", - desc: "At the end of every turn, this item attempts to burn the holder.", + shortDesc: "At the end of every turn, this item attempts to burn the holder.", }, flameplate: { name: "Flame Plate", - desc: "Holder's Fire-type attacks have 1.2x power. Judgment is Fire type.", + shortDesc: "Holder's Fire-type attacks have 1.2x power. Judgment is Fire type.", }, floatstone: { name: "Float Stone", - desc: "Holder's weight is halved.", + shortDesc: "Holder's weight is halved.", }, flowersweet: { name: "Flower Sweet", - desc: "Evolves Milcery into Alcremie when held and spun around.", + shortDesc: "Evolves Milcery into Alcremie when held and spun around.", }, flyinggem: { name: "Flying Gem", - desc: "Holder's first successful Flying-type attack will have 1.3x power. Single use.", + shortDesc: "Holder's first successful Flying-type attack will have 1.3x power. Single use.", gen5: { - desc: "Holder's first successful Flying-type attack will have 1.5x power. Single use.", + shortDesc: "Holder's first successful Flying-type attack will have 1.5x power. Single use.", }, }, flyingmemory: { name: "Flying Memory", - desc: "Holder's Multi-Attack is Flying type.", + shortDesc: "Holder's Multi-Attack is Flying type.", }, flyiniumz: { name: "Flyinium Z", - desc: "If holder has a Flying move, this item allows it to use a Flying Z-Move.", + shortDesc: "If holder has a Flying move, this item allows it to use a Flying Z-Move.", }, focusband: { name: "Focus Band", - desc: "Holder has a 10% chance to survive an attack that would KO it with 1 HP.", + shortDesc: "Holder has a 10% chance to survive an attack that would KO it with 1 HP.", gen2: { - desc: "Holder has a ~11.7% chance to survive an attack that would KO it with 1 HP.", + shortDesc: "Holder has a ~11.7% chance to survive an attack that would KO it with 1 HP.", }, activate: " [POKEMON] hung on using its Focus Band!", }, focussash: { name: "Focus Sash", - desc: "If holder's HP is full, will survive an attack that would KO it with 1 HP. Single use.", + shortDesc: "If holder's HP is full, will survive an attack that would KO it with 1 HP. Single use.", gen4: { - desc: "If holder's HP is full, survives all hits of one attack with at least 1 HP. Single use.", + shortDesc: "If holder's HP is full, survives all hits of one attack with at least 1 HP. Single use.", }, end: " [POKEMON] hung on using its Focus Sash!", }, fossilizedbird: { name: "Fossilized Bird", - desc: "Can revive into Dracozolt with Fossilized Drake or Arctozolt with Fossilized Dino.", + shortDesc: "Can revive into Dracozolt with Fossilized Drake or Arctozolt with Fossilized Dino.", }, fossilizeddino: { name: "Fossilized Dino", - desc: "Can revive into Arctovish with Fossilized Fish or Arctozolt with Fossilized Bird.", + shortDesc: "Can revive into Arctovish with Fossilized Fish or Arctozolt with Fossilized Bird.", }, fossilizeddrake: { name: "Fossilized Drake", - desc: "Can revive into Dracozolt with Fossilized Bird or Dracovish with Fossilized Fish.", + shortDesc: "Can revive into Dracozolt with Fossilized Bird or Dracovish with Fossilized Fish.", }, fossilizedfish: { name: "Fossilized Fish", - desc: "Can revive into Dracovish with Fossilized Drake or Arctovish with Fossilized Dino.", + shortDesc: "Can revive into Dracovish with Fossilized Drake or Arctovish with Fossilized Dino.", }, friendball: { name: "Friend Ball", - desc: "A Poke Ball that makes caught Pokemon more friendly.", + shortDesc: "A Poke Ball that makes caught Pokemon more friendly.", }, fullincense: { name: "Full Incense", - desc: "Holder moves last in its priority bracket.", + shortDesc: "Holder moves last in its priority bracket.", }, galaricacuff: { name: "Galarica Cuff", - desc: "Evolves Galarian Slowpoke into Galarian Slowbro when used.", + shortDesc: "Evolves Galarian Slowpoke into Galarian Slowbro when used.", }, galaricawreath: { name: "Galarica Wreath", - desc: "Evolves Galarian Slowpoke into Galarian Slowking when used.", + shortDesc: "Evolves Galarian Slowpoke into Galarian Slowking when used.", }, galladite: { name: "Galladite", - desc: "If held by a Gallade, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Gallade, this item allows it to Mega Evolve in battle.", }, ganlonberry: { name: "Ganlon Berry", - desc: "Raises holder's Defense by 1 stage when at 1/4 max HP or less. Single use.", + shortDesc: "Raises holder's Defense by 1 stage when at 1/4 max HP or less. Single use.", }, garchompite: { name: "Garchompite", - desc: "If held by a Garchomp, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Garchomp, this item allows it to Mega Evolve in battle.", }, gardevoirite: { name: "Gardevoirite", - desc: "If held by a Gardevoir, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Gardevoir, this item allows it to Mega Evolve in battle.", }, gengarite: { name: "Gengarite", - desc: "If held by a Gengar, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Gengar, this item allows it to Mega Evolve in battle.", }, ghostgem: { name: "Ghost Gem", - desc: "Holder's first successful Ghost-type attack will have 1.3x power. Single use.", + shortDesc: "Holder's first successful Ghost-type attack will have 1.3x power. Single use.", gen5: { - desc: "Holder's first successful Ghost-type attack will have 1.5x power. Single use.", + shortDesc: "Holder's first successful Ghost-type attack will have 1.5x power. Single use.", }, }, ghostmemory: { name: "Ghost Memory", - desc: "Holder's Multi-Attack is Ghost type.", + shortDesc: "Holder's Multi-Attack is Ghost type.", }, ghostiumz: { name: "Ghostium Z", - desc: "If holder has a Ghost move, this item allows it to use a Ghost Z-Move.", + shortDesc: "If holder has a Ghost move, this item allows it to use a Ghost Z-Move.", }, glalitite: { name: "Glalitite", - desc: "If held by a Glalie, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Glalie, this item allows it to Mega Evolve in battle.", }, goldbottlecap: { name: "Gold Bottle Cap", - desc: "Used for Hyper Training. All of a Pokemon's stats are calculated with an IV of 31.", + shortDesc: "Used for Hyper Training. All of a Pokemon's stats are calculated with an IV of 31.", }, grassgem: { name: "Grass Gem", - desc: "Holder's first successful Grass-type attack will have 1.3x power. Single use.", + shortDesc: "Holder's first successful Grass-type attack will have 1.3x power. Single use.", gen5: { - desc: "Holder's first successful Grass-type attack will have 1.5x power. Single use.", + shortDesc: "Holder's first successful Grass-type attack will have 1.5x power. Single use.", }, }, grassmemory: { name: "Grass Memory", - desc: "Holder's Multi-Attack is Grass type.", + shortDesc: "Holder's Multi-Attack is Grass type.", }, grassiumz: { name: "Grassium Z", - desc: "If holder has a Grass move, this item allows it to use a Grass Z-Move.", + shortDesc: "If holder has a Grass move, this item allows it to use a Grass Z-Move.", }, grassyseed: { name: "Grassy Seed", - desc: "If the terrain is Grassy Terrain, raises holder's Defense by 1 stage. Single use.", + shortDesc: "If the terrain is Grassy Terrain, raises holder's Defense by 1 stage. Single use.", }, greatball: { name: "Great Ball", - desc: "A high-performance Ball that provides a higher catch rate than a Poke Ball.", + shortDesc: "A high-performance Ball that provides a higher catch rate than a Poke Ball.", }, grepaberry: { name: "Grepa Berry", - desc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", + shortDesc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", }, gripclaw: { name: "Grip Claw", - desc: "Holder's partial-trapping moves always last 7 turns.", + shortDesc: "Holder's partial-trapping moves always last 7 turns.", }, griseouscore: { name: "Griseous Core", - desc: "If held by a Giratina, its Ghost- and Dragon-type attacks have 1.2x power.", + shortDesc: "If held by a Giratina, its Ghost- and Dragon-type attacks have 1.2x power.", }, griseousorb: { name: "Griseous Orb", - desc: "If held by a Giratina, its Ghost- and Dragon-type attacks have 1.2x power.", + shortDesc: "If held by a Giratina, its Ghost- and Dragon-type attacks have 1.2x power.", gen4: { - desc: "Can only be held by Giratina. Its Ghost- & Dragon-type attacks have 1.2x power.", + shortDesc: "Can only be held by Giratina. Its Ghost- & Dragon-type attacks have 1.2x power.", }, }, groundgem: { name: "Ground Gem", - desc: "Holder's first successful Ground-type attack will have 1.3x power. Single use.", + shortDesc: "Holder's first successful Ground-type attack will have 1.3x power. Single use.", gen5: { - desc: "Holder's first successful Ground-type attack will have 1.5x power. Single use.", + shortDesc: "Holder's first successful Ground-type attack will have 1.5x power. Single use.", }, }, groundmemory: { name: "Ground Memory", - desc: "Holder's Multi-Attack is Ground type.", + shortDesc: "Holder's Multi-Attack is Ground type.", }, groundiumz: { name: "Groundium Z", - desc: "If holder has a Ground move, this item allows it to use a Ground Z-Move.", + shortDesc: "If holder has a Ground move, this item allows it to use a Ground Z-Move.", }, gyaradosite: { name: "Gyaradosite", - desc: "If held by a Gyarados, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Gyarados, this item allows it to Mega Evolve in battle.", }, habanberry: { name: "Haban Berry", - desc: "Halves damage taken from a supereffective Dragon-type attack. Single use.", + shortDesc: "Halves damage taken from a supereffective Dragon-type attack. Single use.", }, hardstone: { name: "Hard Stone", - desc: "Holder's Rock-type attacks have 1.2x power.", + shortDesc: "Holder's Rock-type attacks have 1.2x power.", gen3: { - desc: "Holder's Rock-type attacks have 1.1x power.", + shortDesc: "Holder's Rock-type attacks have 1.1x power.", }, }, healball: { name: "Heal Ball", - desc: "A remedial Poke Ball that restores the caught Pokemon's HP and status problem.", + shortDesc: "A remedial Poke Ball that restores the caught Pokemon's HP and status problem.", }, hearthflamemask: { name: "Hearthflame Mask", - desc: "Ogerpon-Hearthflame: 1.2x power attacks; Terastallize to gain Embody Aspect.", + shortDesc: "Ogerpon-Hearthflame: 1.2x power attacks; Terastallize to gain Embody Aspect.", }, heatrock: { name: "Heat Rock", - desc: "Holder's use of Sunny Day lasts 8 turns instead of 5.", + shortDesc: "Holder's use of Sunny Day lasts 8 turns instead of 5.", }, heavyball: { name: "Heavy Ball", - desc: "A Poke Ball for catching very heavy Pokemon.", + shortDesc: "A Poke Ball for catching very heavy Pokemon.", }, heavydutyboots: { name: "Heavy-Duty Boots", - desc: "When switching in, the holder is unaffected by hazards on its side of the field.", + shortDesc: "When switching in, the holder is unaffected by hazards on its side of the field.", }, helixfossil: { name: "Helix Fossil", - desc: "Can be revived into Omanyte.", + shortDesc: "Can be revived into Omanyte.", }, heracronite: { name: "Heracronite", - desc: "If held by a Heracross, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Heracross, this item allows it to Mega Evolve in battle.", }, hondewberry: { name: "Hondew Berry", - desc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", + shortDesc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", }, houndoominite: { name: "Houndoominite", - desc: "If held by a Houndoom, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Houndoom, this item allows it to Mega Evolve in battle.", }, iapapaberry: { name: "Iapapa Berry", - desc: "Restores 1/3 max HP at 1/4 max HP or less; confuses if -Def Nature. Single use.", + shortDesc: "Restores 1/3 max HP at 1/4 max HP or less; confuses if -Def Nature. Single use.", gen7: { - desc: "Restores 1/2 max HP at 1/4 max HP or less; confuses if -Def Nature. Single use.", + shortDesc: "Restores 1/2 max HP at 1/4 max HP or less; confuses if -Def Nature. Single use.", }, gen6: { - desc: "Restores 1/8 max HP at 1/2 max HP or less; confuses if -Def Nature. Single use.", + shortDesc: "Restores 1/8 max HP at 1/2 max HP or less; confuses if -Def Nature. Single use.", }, }, icegem: { name: "Ice Gem", - desc: "Holder's first successful Ice-type attack will have 1.3x power. Single use.", + shortDesc: "Holder's first successful Ice-type attack will have 1.3x power. Single use.", gen5: { - desc: "Holder's first successful Ice-type attack will have 1.5x power. Single use.", + shortDesc: "Holder's first successful Ice-type attack will have 1.5x power. Single use.", }, }, icememory: { name: "Ice Memory", - desc: "Holder's Multi-Attack is Ice type.", + shortDesc: "Holder's Multi-Attack is Ice type.", }, icestone: { name: "Ice Stone", @@ -838,62 +838,62 @@ export const ItemsText: {[id: IDEntry]: ItemText} = { }, icicleplate: { name: "Icicle Plate", - desc: "Holder's Ice-type attacks have 1.2x power. Judgment is Ice type.", + shortDesc: "Holder's Ice-type attacks have 1.2x power. Judgment is Ice type.", }, iciumz: { name: "Icium Z", - desc: "If holder has an Ice move, this item allows it to use an Ice Z-Move.", + shortDesc: "If holder has an Ice move, this item allows it to use an Ice Z-Move.", }, icyrock: { name: "Icy Rock", - desc: "Holder's use of Hail lasts 8 turns instead of 5.", + shortDesc: "Holder's use of Hail lasts 8 turns instead of 5.", }, inciniumz: { name: "Incinium Z", - desc: "If held by an Incineroar with Darkest Lariat, it can use Malicious Moonsault.", + shortDesc: "If held by an Incineroar with Darkest Lariat, it can use Malicious Moonsault.", }, insectplate: { name: "Insect Plate", - desc: "Holder's Bug-type attacks have 1.2x power. Judgment is Bug type.", + shortDesc: "Holder's Bug-type attacks have 1.2x power. Judgment is Bug type.", }, ironball: { name: "Iron Ball", - desc: "Holder is grounded, Speed halved. If Flying type, takes neutral Ground damage.", + shortDesc: "Holder is grounded, Speed halved. If Flying type, takes neutral Ground damage.", gen4: { - desc: "Holder's Speed is halved and it becomes grounded.", + shortDesc: "Holder's Speed is halved and it becomes grounded.", }, }, ironplate: { name: "Iron Plate", - desc: "Holder's Steel-type attacks have 1.2x power. Judgment is Steel type.", + shortDesc: "Holder's Steel-type attacks have 1.2x power. Judgment is Steel type.", }, jabocaberry: { name: "Jaboca Berry", - desc: "If holder is hit by a physical move, attacker loses 1/8 of its max HP. Single use.", + shortDesc: "If holder is hit by a physical move, attacker loses 1/8 of its max HP. Single use.", }, jawfossil: { name: "Jaw Fossil", - desc: "Can be revived into Tyrunt.", + shortDesc: "Can be revived into Tyrunt.", }, kasibberry: { name: "Kasib Berry", - desc: "Halves damage taken from a supereffective Ghost-type attack. Single use.", + shortDesc: "Halves damage taken from a supereffective Ghost-type attack. Single use.", }, kebiaberry: { name: "Kebia Berry", - desc: "Halves damage taken from a supereffective Poison-type attack. Single use.", + shortDesc: "Halves damage taken from a supereffective Poison-type attack. Single use.", }, keeberry: { name: "Kee Berry", - desc: "Raises holder's Defense by 1 stage after it is hit by a physical attack. Single use.", + shortDesc: "Raises holder's Defense by 1 stage after it is hit by a physical attack. Single use.", }, kelpsyberry: { name: "Kelpsy Berry", - desc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", + shortDesc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", }, kangaskhanite: { name: "Kangaskhanite", - desc: "If held by a Kangaskhan, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Kangaskhan, this item allows it to Mega Evolve in battle.", }, kingsrock: { name: "King's Rock", @@ -902,29 +902,29 @@ export const ItemsText: {[id: IDEntry]: ItemText} = { }, kommoniumz: { name: "Kommonium Z", - desc: "If held by a Kommo-o with Clanging Scales, it can use Clangorous Soulblaze.", + shortDesc: "If held by a Kommo-o with Clanging Scales, it can use Clangorous Soulblaze.", }, laggingtail: { name: "Lagging Tail", - desc: "Holder moves last in its priority bracket.", + shortDesc: "Holder moves last in its priority bracket.", }, lansatberry: { name: "Lansat Berry", - desc: "Holder gains the Focus Energy effect when at 1/4 max HP or less. Single use.", + shortDesc: "Holder gains the Focus Energy effect when at 1/4 max HP or less. Single use.", }, latiasite: { name: "Latiasite", - desc: "If held by a Latias, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Latias, this item allows it to Mega Evolve in battle.", }, latiosite: { name: "Latiosite", - desc: "If held by a Latios, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Latios, this item allows it to Mega Evolve in battle.", }, laxincense: { name: "Lax Incense", - desc: "The accuracy of attacks against the holder is 0.9x.", + shortDesc: "The accuracy of attacks against the holder is 0.9x.", gen3: { - desc: "The accuracy of attacks against the holder is 0.95x.", + shortDesc: "The accuracy of attacks against the holder is 0.95x.", }, }, leafstone: { @@ -937,193 +937,193 @@ export const ItemsText: {[id: IDEntry]: ItemText} = { }, leek: { name: "Leek", - desc: "If held by a Farfetch’d or Sirfetch’d, its critical hit ratio is raised by 2 stages.", + shortDesc: "If held by a Farfetch’d or Sirfetch’d, its critical hit ratio is raised by 2 stages.", }, leftovers: { name: "Leftovers", - desc: "At the end of every turn, holder restores 1/16 of its max HP.", + shortDesc: "At the end of every turn, holder restores 1/16 of its max HP.", heal: " [POKEMON] restored a little HP using its Leftovers!", }, leppaberry: { name: "Leppa Berry", - desc: "Restores 10 PP to the first of the holder's moves to reach 0 PP. Single use.", + shortDesc: "Restores 10 PP to the first of the holder's moves to reach 0 PP. Single use.", activate: " [POKEMON] restored PP to its move [MOVE] using its Leppa Berry!", }, levelball: { name: "Level Ball", - desc: "A Poke Ball for catching Pokemon that are a lower level than your own.", + shortDesc: "A Poke Ball for catching Pokemon that are a lower level than your own.", }, liechiberry: { name: "Liechi Berry", - desc: "Raises holder's Attack by 1 stage when at 1/4 max HP or less. Single use.", + shortDesc: "Raises holder's Attack by 1 stage when at 1/4 max HP or less. Single use.", }, lifeorb: { name: "Life Orb", - desc: "Holder's attacks do 1.3x damage, and it loses 1/10 its max HP after the attack.", + shortDesc: "Holder's attacks do 1.3x damage, and it loses 1/10 its max HP after the attack.", damage: " [POKEMON] lost some of its HP!", }, lightball: { name: "Light Ball", - desc: "If held by a Pikachu, its Attack and Sp. Atk are doubled.", + shortDesc: "If held by a Pikachu, its Attack and Sp. Atk are doubled.", gen4: { - desc: "If held by a Pikachu, its attacks have their power doubled.", + shortDesc: "If held by a Pikachu, its attacks have their power doubled.", }, gen3: { - desc: "If held by a Pikachu, its Special Attack is doubled.", + shortDesc: "If held by a Pikachu, its Special Attack is doubled.", }, }, lightclay: { name: "Light Clay", - desc: "Holder's use of Aurora Veil, Light Screen, or Reflect lasts 8 turns instead of 5.", + shortDesc: "Holder's use of Aurora Veil, Light Screen, or Reflect lasts 8 turns instead of 5.", gen6: { - desc: "Holder's use of Light Screen or Reflect lasts 8 turns instead of 5.", + shortDesc: "Holder's use of Light Screen or Reflect lasts 8 turns instead of 5.", }, }, loadeddice: { name: "Loaded Dice", - desc: "Holder's moves that hit 2-5 times hit 4-5 times; Population Bomb hits 4-10 times.", + shortDesc: "Holder's moves that hit 2-5 times hit 4-5 times; Population Bomb hits 4-10 times.", }, lopunnite: { name: "Lopunnite", - desc: "If held by a Lopunny, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Lopunny, this item allows it to Mega Evolve in battle.", }, loveball: { name: "Love Ball", - desc: "Poke Ball for catching Pokemon that are the opposite gender of your Pokemon.", + shortDesc: "Poke Ball for catching Pokemon that are the opposite gender of your Pokemon.", }, lovesweet: { name: "Love Sweet", - desc: "Evolves Milcery into Alcremie when held and spun around.", + shortDesc: "Evolves Milcery into Alcremie when held and spun around.", }, lucarionite: { name: "Lucarionite", - desc: "If held by a Lucario, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Lucario, this item allows it to Mega Evolve in battle.", }, luckypunch: { name: "Lucky Punch", - desc: "If held by a Chansey, its critical hit ratio is raised by 2 stages.", + shortDesc: "If held by a Chansey, its critical hit ratio is raised by 2 stages.", gen2: { - desc: "If held by a Chansey, its critical hit ratio is always at stage 2. (25% crit rate)", + shortDesc: "If held by a Chansey, its critical hit ratio is always at stage 2. (25% crit rate)", }, }, lumberry: { name: "Lum Berry", - desc: "Holder cures itself if it has a non-volatile status or is confused. Single use.", + shortDesc: "Holder cures itself if it has a non-volatile status or is confused. Single use.", }, luminousmoss: { name: "Luminous Moss", - desc: "Raises holder's Sp. Def by 1 stage if hit by a Water-type attack. Single use.", + shortDesc: "Raises holder's Sp. Def by 1 stage if hit by a Water-type attack. Single use.", }, lunaliumz: { name: "Lunalium Z", - desc: "Lunala or Dawn Wings Necrozma with Moongeist Beam can use a special Z-Move.", + shortDesc: "Lunala or Dawn Wings Necrozma with Moongeist Beam can use a special Z-Move.", }, lureball: { name: "Lure Ball", - desc: "A Poke Ball for catching Pokemon hooked by a Rod when fishing.", + shortDesc: "A Poke Ball for catching Pokemon hooked by a Rod when fishing.", }, lustrousglobe: { name: "Lustrous Globe", - desc: "If held by a Palkia, its Water- and Dragon-type attacks have 1.2x power.", + shortDesc: "If held by a Palkia, its Water- and Dragon-type attacks have 1.2x power.", }, lustrousorb: { name: "Lustrous Orb", - desc: "If held by a Palkia, its Water- and Dragon-type attacks have 1.2x power.", + shortDesc: "If held by a Palkia, its Water- and Dragon-type attacks have 1.2x power.", }, luxuryball: { name: "Luxury Ball", - desc: "A comfortable Poke Ball that makes a caught wild Pokemon quickly grow friendly.", + shortDesc: "A comfortable Poke Ball that makes a caught wild Pokemon quickly grow friendly.", }, lycaniumz: { name: "Lycanium Z", - desc: "If held by a Lycanroc forme with Stone Edge, it can use Splintered Stormshards.", + shortDesc: "If held by a Lycanroc forme with Stone Edge, it can use Splintered Stormshards.", }, machobrace: { name: "Macho Brace", - desc: "Holder's Speed is halved. The Klutz Ability does not ignore this effect.", + shortDesc: "Holder's Speed is halved. The Klutz Ability does not ignore this effect.", }, magmarizer: { name: "Magmarizer", - desc: "Evolves Magmar into Magmortar when traded.", + shortDesc: "Evolves Magmar into Magmortar when traded.", }, magnet: { name: "Magnet", - desc: "Holder's Electric-type attacks have 1.2x power.", + shortDesc: "Holder's Electric-type attacks have 1.2x power.", gen3: { - desc: "Holder's Electric-type attacks have 1.1x power.", + shortDesc: "Holder's Electric-type attacks have 1.1x power.", }, }, magoberry: { name: "Mago Berry", - desc: "Restores 1/3 max HP at 1/4 max HP or less; confuses if -Spe Nature. Single use.", + shortDesc: "Restores 1/3 max HP at 1/4 max HP or less; confuses if -Spe Nature. Single use.", gen7: { - desc: "Restores 1/2 max HP at 1/4 max HP or less; confuses if -Spe Nature. Single use.", + shortDesc: "Restores 1/2 max HP at 1/4 max HP or less; confuses if -Spe Nature. Single use.", }, gen6: { - desc: "Restores 1/8 max HP at 1/2 max HP or less; confuses if -Spe Nature. Single use.", + shortDesc: "Restores 1/8 max HP at 1/2 max HP or less; confuses if -Spe Nature. Single use.", }, }, magostberry: { name: "Magost Berry", - desc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", + shortDesc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", }, mail: { name: "Mail", - desc: "Cannot be given to or taken from a Pokemon, except by Covet/Knock Off/Thief.", + shortDesc: "Cannot be given to or taken from a Pokemon, except by Covet/Knock Off/Thief.", }, maliciousarmor: { name: "Malicious Armor", - desc: "Evolves Charcadet into Ceruledge when used.", + shortDesc: "Evolves Charcadet into Ceruledge when used.", }, manectite: { name: "Manectite", - desc: "If held by a Manectric, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Manectric, this item allows it to Mega Evolve in battle.", }, marangaberry: { name: "Maranga Berry", - desc: "Raises holder's Sp. Def by 1 stage after it is hit by a special attack. Single use.", + shortDesc: "Raises holder's Sp. Def by 1 stage after it is hit by a special attack. Single use.", }, marshadiumz: { name: "Marshadium Z", - desc: "If held by Marshadow with Spectral Thief, it can use Soul-Stealing 7-Star Strike.", + shortDesc: "If held by Marshadow with Spectral Thief, it can use Soul-Stealing 7-Star Strike.", }, masterball: { name: "Master Ball", - desc: "The best Ball with the ultimate performance. It will catch any wild Pokemon.", + shortDesc: "The best Ball with the ultimate performance. It will catch any wild Pokemon.", }, masterpieceteacup: { name: "Masterpiece Teacup", - desc: "Evolves Poltchageist-Artisan into Sinistcha-Masterpiece when used.", + shortDesc: "Evolves Poltchageist-Artisan into Sinistcha-Masterpiece when used.", }, mawilite: { name: "Mawilite", - desc: "If held by a Mawile, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Mawile, this item allows it to Mega Evolve in battle.", }, meadowplate: { name: "Meadow Plate", - desc: "Holder's Grass-type attacks have 1.2x power. Judgment is Grass type.", + shortDesc: "Holder's Grass-type attacks have 1.2x power. Judgment is Grass type.", }, medichamite: { name: "Medichamite", - desc: "If held by a Medicham, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Medicham, this item allows it to Mega Evolve in battle.", }, mentalherb: { name: "Mental Herb", - desc: "Cures holder of Attract, Disable, Encore, Heal Block, Taunt, Torment. Single use.", + shortDesc: "Cures holder of Attract, Disable, Encore, Heal Block, Taunt, Torment. Single use.", gen4: { - desc: "Holder is cured if it is infatuated. Single use.", + shortDesc: "Holder is cured if it is infatuated. Single use.", }, }, metagrossite: { name: "Metagrossite", - desc: "If held by a Metagross, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Metagross, this item allows it to Mega Evolve in battle.", }, metalalloy: { name: "Metal Alloy", - desc: "Evolves Duraludon into Archaludon when used.", + shortDesc: "Evolves Duraludon into Archaludon when used.", }, metalcoat: { name: "Metal Coat", @@ -1136,62 +1136,62 @@ export const ItemsText: {[id: IDEntry]: ItemText} = { }, metalpowder: { name: "Metal Powder", - desc: "If held by a Ditto that hasn't Transformed, its Defense is doubled.", + shortDesc: "If held by a Ditto that hasn't Transformed, its Defense is doubled.", gen2: { - desc: "If held by a Ditto, its Defense and Sp. Def are 1.5x, even while Transformed.", + shortDesc: "If held by a Ditto, its Defense and Sp. Def are 1.5x, even while Transformed.", }, }, metronome: { name: "Metronome", - desc: "Damage of moves used on consecutive turns is increased. Max 2x after 5 turns.", + shortDesc: "Damage of moves used on consecutive turns is increased. Max 2x after 5 turns.", gen4: { - desc: "Damage of moves used on consecutive turns is increased. Max 2x after 10 turns.", + shortDesc: "Damage of moves used on consecutive turns is increased. Max 2x after 10 turns.", }, }, mewniumz: { name: "Mewnium Z", - desc: "If held by a Mew with Psychic, it can use Genesis Supernova.", + shortDesc: "If held by a Mew with Psychic, it can use Genesis Supernova.", }, mewtwonitex: { name: "Mewtwonite X", - desc: "If held by a Mewtwo, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Mewtwo, this item allows it to Mega Evolve in battle.", }, mewtwonitey: { name: "Mewtwonite Y", - desc: "If held by a Mewtwo, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Mewtwo, this item allows it to Mega Evolve in battle.", }, micleberry: { name: "Micle Berry", - desc: "Holder's next move has 1.2x accuracy when at 1/4 max HP or less. Single use.", + shortDesc: "Holder's next move has 1.2x accuracy when at 1/4 max HP or less. Single use.", }, mimikiumz: { name: "Mimikium Z", - desc: "If held by a Mimikyu with Play Rough, it can use Let's Snuggle Forever.", + shortDesc: "If held by a Mimikyu with Play Rough, it can use Let's Snuggle Forever.", }, mindplate: { name: "Mind Plate", - desc: "Holder's Psychic-type attacks have 1.2x power. Judgment is Psychic type.", + shortDesc: "Holder's Psychic-type attacks have 1.2x power. Judgment is Psychic type.", }, miracleseed: { name: "Miracle Seed", - desc: "Holder's Grass-type attacks have 1.2x power.", + shortDesc: "Holder's Grass-type attacks have 1.2x power.", gen3: { - desc: "Holder's Grass-type attacks have 1.1x power.", + shortDesc: "Holder's Grass-type attacks have 1.1x power.", }, }, mirrorherb: { name: "Mirror Herb", - desc: "When an opposing Pokemon raises a stat stage, the holder copies it. Single use.", + shortDesc: "When an opposing Pokemon raises a stat stage, the holder copies it. Single use.", activate: " [POKEMON] used its Mirror Herb to mirror its opponent's stat changes!", }, mistyseed: { name: "Misty Seed", - desc: "If the terrain is Misty Terrain, raises holder's Sp. Def by 1 stage. Single use.", + shortDesc: "If the terrain is Misty Terrain, raises holder's Sp. Def by 1 stage. Single use.", }, moonball: { name: "Moon Ball", - desc: "A Poke Ball for catching Pokemon that evolve using the Moon Stone.", + shortDesc: "A Poke Ball for catching Pokemon that evolve using the Moon Stone.", }, moonstone: { name: "Moon Stone", @@ -1200,262 +1200,262 @@ export const ItemsText: {[id: IDEntry]: ItemText} = { }, muscleband: { name: "Muscle Band", - desc: "Holder's physical attacks have 1.1x power.", + shortDesc: "Holder's physical attacks have 1.1x power.", }, mysticwater: { name: "Mystic Water", - desc: "Holder's Water-type attacks have 1.2x power.", + shortDesc: "Holder's Water-type attacks have 1.2x power.", gen3: { - desc: "Holder's Water-type attacks have 1.1x power.", + shortDesc: "Holder's Water-type attacks have 1.1x power.", }, }, nanabberry: { name: "Nanab Berry", - desc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", + shortDesc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", }, nestball: { name: "Nest Ball", - desc: "A Poke Ball that works especially well on weaker Pokemon in the wild.", + shortDesc: "A Poke Ball that works especially well on weaker Pokemon in the wild.", }, netball: { name: "Net Ball", - desc: "A Poke Ball that works especially well on Water- and Bug-type Pokemon.", + shortDesc: "A Poke Ball that works especially well on Water- and Bug-type Pokemon.", }, nevermeltice: { name: "Never-Melt Ice", - desc: "Holder's Ice-type attacks have 1.2x power.", + shortDesc: "Holder's Ice-type attacks have 1.2x power.", gen3: { - desc: "Holder's Ice-type attacks have 1.1x power.", + shortDesc: "Holder's Ice-type attacks have 1.1x power.", }, }, nomelberry: { name: "Nomel Berry", - desc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", + shortDesc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", }, normalgem: { name: "Normal Gem", - desc: "Holder's first successful Normal-type attack will have 1.3x power. Single use.", + shortDesc: "Holder's first successful Normal-type attack will have 1.3x power. Single use.", gen5: { - desc: "Holder's first successful Normal-type attack will have 1.5x power. Single use.", + shortDesc: "Holder's first successful Normal-type attack will have 1.5x power. Single use.", }, }, normaliumz: { name: "Normalium Z", - desc: "If holder has a Normal move, this item allows it to use a Normal Z-Move.", + shortDesc: "If holder has a Normal move, this item allows it to use a Normal Z-Move.", }, occaberry: { name: "Occa Berry", - desc: "Halves damage taken from a supereffective Fire-type attack. Single use.", + shortDesc: "Halves damage taken from a supereffective Fire-type attack. Single use.", }, oddincense: { name: "Odd Incense", - desc: "Holder's Psychic-type attacks have 1.2x power.", + shortDesc: "Holder's Psychic-type attacks have 1.2x power.", }, oldamber: { name: "Old Amber", - desc: "Can be revived into Aerodactyl.", + shortDesc: "Can be revived into Aerodactyl.", }, oranberry: { name: "Oran Berry", - desc: "Restores 10 HP when at 1/2 max HP or less. Single use.", + shortDesc: "Restores 10 HP when at 1/2 max HP or less. Single use.", }, ovalstone: { name: "Oval Stone", - desc: "Evolves Happiny into Chansey when held and leveled up during the day.", + shortDesc: "Evolves Happiny into Chansey when held and leveled up during the day.", }, pamtreberry: { name: "Pamtre Berry", - desc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", + shortDesc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", }, parkball: { name: "Park Ball", - desc: "A special Poke Ball for the Pal Park.", + shortDesc: "A special Poke Ball for the Pal Park.", }, passhoberry: { name: "Passho Berry", - desc: "Halves damage taken from a supereffective Water-type attack. Single use.", + shortDesc: "Halves damage taken from a supereffective Water-type attack. Single use.", }, payapaberry: { name: "Payapa Berry", - desc: "Halves damage taken from a supereffective Psychic-type attack. Single use.", + shortDesc: "Halves damage taken from a supereffective Psychic-type attack. Single use.", }, pechaberry: { name: "Pecha Berry", - desc: "Holder is cured if it is poisoned. Single use.", + shortDesc: "Holder is cured if it is poisoned. Single use.", }, persimberry: { name: "Persim Berry", - desc: "Holder is cured if it is confused. Single use.", + shortDesc: "Holder is cured if it is confused. Single use.", }, petayaberry: { name: "Petaya Berry", - desc: "Raises holder's Sp. Atk by 1 stage when at 1/4 max HP or less. Single use.", + shortDesc: "Raises holder's Sp. Atk by 1 stage when at 1/4 max HP or less. Single use.", }, pidgeotite: { name: "Pidgeotite", - desc: "If held by a Pidgeot, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Pidgeot, this item allows it to Mega Evolve in battle.", }, pikaniumz: { name: "Pikanium Z", - desc: "If held by a Pikachu with Volt Tackle, it can use Catastropika.", + shortDesc: "If held by a Pikachu with Volt Tackle, it can use Catastropika.", }, pikashuniumz: { name: "Pikashunium Z", - desc: "If held by cap Pikachu with Thunderbolt, it can use 10,000,000 Volt Thunderbolt.", + shortDesc: "If held by cap Pikachu with Thunderbolt, it can use 10,000,000 Volt Thunderbolt.", }, pinapberry: { name: "Pinap Berry", - desc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", + shortDesc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", }, pinsirite: { name: "Pinsirite", - desc: "If held by a Pinsir, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Pinsir, this item allows it to Mega Evolve in battle.", }, pixieplate: { name: "Pixie Plate", - desc: "Holder's Fairy-type attacks have 1.2x power. Judgment is Fairy type.", + shortDesc: "Holder's Fairy-type attacks have 1.2x power. Judgment is Fairy type.", }, plumefossil: { name: "Plume Fossil", - desc: "Can be revived into Archen.", + shortDesc: "Can be revived into Archen.", }, poisonbarb: { name: "Poison Barb", - desc: "Holder's Poison-type attacks have 1.2x power.", + shortDesc: "Holder's Poison-type attacks have 1.2x power.", gen3: { - desc: "Holder's Poison-type attacks have 1.1x power.", + shortDesc: "Holder's Poison-type attacks have 1.1x power.", }, }, poisongem: { name: "Poison Gem", - desc: "Holder's first successful Poison-type attack will have 1.3x power. Single use.", + shortDesc: "Holder's first successful Poison-type attack will have 1.3x power. Single use.", gen5: { - desc: "Holder's first successful Poison-type attack will have 1.5x power. Single use.", + shortDesc: "Holder's first successful Poison-type attack will have 1.5x power. Single use.", }, }, poisonmemory: { name: "Poison Memory", - desc: "Holder's Multi-Attack is Poison type.", + shortDesc: "Holder's Multi-Attack is Poison type.", }, poisoniumz: { name: "Poisonium Z", - desc: "If holder has a Poison move, this item allows it to use a Poison Z-Move.", + shortDesc: "If holder has a Poison move, this item allows it to use a Poison Z-Move.", }, pokeball: { name: "Poke Ball", - desc: "A device for catching wild Pokemon. It is designed as a capsule system.", + shortDesc: "A device for catching wild Pokemon. It is designed as a capsule system.", }, pomegberry: { name: "Pomeg Berry", - desc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", + shortDesc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", }, poweranklet: { name: "Power Anklet", - desc: "Holder's Speed is halved. The Klutz Ability does not ignore this effect.", + shortDesc: "Holder's Speed is halved. The Klutz Ability does not ignore this effect.", }, powerband: { name: "Power Band", - desc: "Holder's Speed is halved. The Klutz Ability does not ignore this effect.", + shortDesc: "Holder's Speed is halved. The Klutz Ability does not ignore this effect.", }, powerbelt: { name: "Power Belt", - desc: "Holder's Speed is halved. The Klutz Ability does not ignore this effect.", + shortDesc: "Holder's Speed is halved. The Klutz Ability does not ignore this effect.", }, powerbracer: { name: "Power Bracer", - desc: "Holder's Speed is halved. The Klutz Ability does not ignore this effect.", + shortDesc: "Holder's Speed is halved. The Klutz Ability does not ignore this effect.", }, powerherb: { name: "Power Herb", - desc: "Holder's two-turn moves complete in one turn (except Sky Drop). Single use.", + shortDesc: "Holder's two-turn moves complete in one turn (except Sky Drop). Single use.", end: " [POKEMON] became fully charged due to its Power Herb!", }, powerlens: { name: "Power Lens", - desc: "Holder's Speed is halved. The Klutz Ability does not ignore this effect.", + shortDesc: "Holder's Speed is halved. The Klutz Ability does not ignore this effect.", }, powerweight: { name: "Power Weight", - desc: "Holder's Speed is halved. The Klutz Ability does not ignore this effect.", + shortDesc: "Holder's Speed is halved. The Klutz Ability does not ignore this effect.", }, premierball: { name: "Premier Ball", - desc: "A rare Poke Ball that has been crafted to commemorate an event.", + shortDesc: "A rare Poke Ball that has been crafted to commemorate an event.", }, primariumz: { name: "Primarium Z", - desc: "If held by a Primarina with Sparkling Aria, it can use Oceanic Operetta.", + shortDesc: "If held by a Primarina with Sparkling Aria, it can use Oceanic Operetta.", }, prismscale: { name: "Prism Scale", - desc: "Evolves Feebas into Milotic when traded.", + shortDesc: "Evolves Feebas into Milotic when traded.", }, protectivepads: { name: "Protective Pads", - desc: "Holder's moves are protected from adverse contact effects, except Pickpocket.", + shortDesc: "Holder's moves are protected from adverse contact effects, except Pickpocket.", block: " [POKEMON] protected itself with its Protective Pads!", }, protector: { name: "Protector", - desc: "Evolves Rhydon into Rhyperior when traded.", + shortDesc: "Evolves Rhydon into Rhyperior when traded.", }, psychicgem: { name: "Psychic Gem", - desc: "Holder's first successful Psychic-type attack will have 1.3x power. Single use.", + shortDesc: "Holder's first successful Psychic-type attack will have 1.3x power. Single use.", gen5: { - desc: "Holder's first successful Psychic-type attack will have 1.5x power. Single use.", + shortDesc: "Holder's first successful Psychic-type attack will have 1.5x power. Single use.", }, }, psychicmemory: { name: "Psychic Memory", - desc: "Holder's Multi-Attack is Psychic type.", + shortDesc: "Holder's Multi-Attack is Psychic type.", }, psychicseed: { name: "Psychic Seed", - desc: "If the terrain is Psychic Terrain, raises holder's Sp. Def by 1 stage. Single use.", + shortDesc: "If the terrain is Psychic Terrain, raises holder's Sp. Def by 1 stage. Single use.", }, psychiumz: { name: "Psychium Z", - desc: "If holder has a Psychic move, this item allows it to use a Psychic Z-Move.", + shortDesc: "If holder has a Psychic move, this item allows it to use a Psychic Z-Move.", }, punchingglove: { name: "Punching Glove", - desc: "Holder's punch-based attacks have 1.1x power and do not make contact.", + shortDesc: "Holder's punch-based attacks have 1.1x power and do not make contact.", }, qualotberry: { name: "Qualot Berry", - desc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", + shortDesc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", }, quickball: { name: "Quick Ball", - desc: "A Poke Ball that provides a better catch rate at the start of a wild encounter.", + shortDesc: "A Poke Ball that provides a better catch rate at the start of a wild encounter.", }, quickclaw: { name: "Quick Claw", - desc: "Each turn, holder has a 20% chance to move first in its priority bracket.", + shortDesc: "Each turn, holder has a 20% chance to move first in its priority bracket.", gen2: { - desc: "Each turn, holder has a ~23.4% chance to move first in its priority bracket.", + shortDesc: "Each turn, holder has a ~23.4% chance to move first in its priority bracket.", }, activate: " [POKEMON] can act faster than normal, thanks to its Quick Claw!", }, quickpowder: { name: "Quick Powder", - desc: "If held by a Ditto that hasn't Transformed, its Speed is doubled.", + shortDesc: "If held by a Ditto that hasn't Transformed, its Speed is doubled.", }, rabutaberry: { name: "Rabuta Berry", - desc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", + shortDesc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", }, rarebone: { name: "Rare Bone", - desc: "No competitive use other than when used with Fling.", + shortDesc: "No competitive use other than when used with Fling.", }, rawstberry: { name: "Rawst Berry", - desc: "Holder is cured if it is burned. Single use.", + shortDesc: "Holder is cured if it is burned. Single use.", }, razorclaw: { name: "Razor Claw", @@ -1469,158 +1469,158 @@ export const ItemsText: {[id: IDEntry]: ItemText} = { }, razzberry: { name: "Razz Berry", - desc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", + shortDesc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", }, reapercloth: { name: "Reaper Cloth", - desc: "Evolves Dusclops into Dusknoir when traded.", + shortDesc: "Evolves Dusclops into Dusknoir when traded.", }, redcard: { name: "Red Card", - desc: "If holder survives a hit, attacker is forced to switch to a random ally. Single use.", + shortDesc: "If holder survives a hit, attacker is forced to switch to a random ally. Single use.", end: " [POKEMON] held up its Red Card against [TARGET]!", }, redorb: { name: "Red Orb", - desc: "If held by a Groudon, this item triggers its Primal Reversion in battle.", + shortDesc: "If held by a Groudon, this item triggers its Primal Reversion in battle.", }, repeatball: { name: "Repeat Ball", - desc: "A Poke Ball that works well on Pokemon species that were previously caught.", + shortDesc: "A Poke Ball that works well on Pokemon species that were previously caught.", }, ribbonsweet: { name: "Ribbon Sweet", - desc: "Evolves Milcery into Alcremie when held and spun around.", + shortDesc: "Evolves Milcery into Alcremie when held and spun around.", }, rindoberry: { name: "Rindo Berry", - desc: "Halves damage taken from a supereffective Grass-type attack. Single use.", + shortDesc: "Halves damage taken from a supereffective Grass-type attack. Single use.", }, ringtarget: { name: "Ring Target", - desc: "The holder's type immunities granted solely by its typing are negated.", + shortDesc: "The holder's type immunities granted solely by its typing are negated.", }, rockgem: { name: "Rock Gem", - desc: "Holder's first successful Rock-type attack will have 1.3x power. Single use.", + shortDesc: "Holder's first successful Rock-type attack will have 1.3x power. Single use.", gen5: { - desc: "Holder's first successful Rock-type attack will have 1.5x power. Single use.", + shortDesc: "Holder's first successful Rock-type attack will have 1.5x power. Single use.", }, }, rockincense: { name: "Rock Incense", - desc: "Holder's Rock-type attacks have 1.2x power.", + shortDesc: "Holder's Rock-type attacks have 1.2x power.", }, rockmemory: { name: "Rock Memory", - desc: "Holder's Multi-Attack is Rock type.", + shortDesc: "Holder's Multi-Attack is Rock type.", }, rockiumz: { name: "Rockium Z", - desc: "If holder has a Rock move, this item allows it to use a Rock Z-Move.", + shortDesc: "If holder has a Rock move, this item allows it to use a Rock Z-Move.", }, rockyhelmet: { name: "Rocky Helmet", - desc: "If holder is hit by a contact move, the attacker loses 1/6 of its max HP.", + shortDesc: "If holder is hit by a contact move, the attacker loses 1/6 of its max HP.", damage: " [POKEMON] was hurt by the Rocky Helmet!", }, roomservice: { name: "Room Service", - desc: "If Trick Room is active, the holder's Speed is lowered by 1 stage. Single use.", + shortDesc: "If Trick Room is active, the holder's Speed is lowered by 1 stage. Single use.", }, rootfossil: { name: "Root Fossil", - desc: "Can be revived into Lileep.", + shortDesc: "Can be revived into Lileep.", }, roseincense: { name: "Rose Incense", - desc: "Holder's Grass-type attacks have 1.2x power.", + shortDesc: "Holder's Grass-type attacks have 1.2x power.", }, roseliberry: { name: "Roseli Berry", - desc: "Halves damage taken from a supereffective Fairy-type attack. Single use.", + shortDesc: "Halves damage taken from a supereffective Fairy-type attack. Single use.", }, rowapberry: { name: "Rowap Berry", - desc: "If holder is hit by a special move, attacker loses 1/8 of its max HP. Single use.", + shortDesc: "If holder is hit by a special move, attacker loses 1/8 of its max HP. Single use.", }, rustedshield: { name: "Rusted Shield", - desc: "If held by a Zamazenta, this item changes its forme to Crowned Shield.", + shortDesc: "If held by a Zamazenta, this item changes its forme to Crowned Shield.", }, rustedsword: { name: "Rusted Sword", - desc: "If held by a Zacian, this item changes its forme to Crowned Sword.", + shortDesc: "If held by a Zacian, this item changes its forme to Crowned Sword.", }, sablenite: { name: "Sablenite", - desc: "If held by a Sableye, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Sableye, this item allows it to Mega Evolve in battle.", }, sachet: { name: "Sachet", - desc: "Evolves Spritzee into Aromatisse when traded.", + shortDesc: "Evolves Spritzee into Aromatisse when traded.", }, safariball: { name: "Safari Ball", - desc: "A special Poke Ball that is used only in the Safari Zone and Great Marsh.", + shortDesc: "A special Poke Ball that is used only in the Safari Zone and Great Marsh.", }, safetygoggles: { name: "Safety Goggles", - desc: "Holder is immune to powder moves and damage from Sandstorm or Hail.", + shortDesc: "Holder is immune to powder moves and damage from Sandstorm or Hail.", block: " [POKEMON] is not affected by [MOVE] thanks to its Safety Goggles!", }, sailfossil: { name: "Sail Fossil", - desc: "Can be revived into Amaura.", + shortDesc: "Can be revived into Amaura.", }, salacberry: { name: "Salac Berry", - desc: "Raises holder's Speed by 1 stage when at 1/4 max HP or less. Single use.", + shortDesc: "Raises holder's Speed by 1 stage when at 1/4 max HP or less. Single use.", }, salamencite: { name: "Salamencite", - desc: "If held by a Salamence, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Salamence, this item allows it to Mega Evolve in battle.", }, sceptilite: { name: "Sceptilite", - desc: "If held by a Sceptile, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Sceptile, this item allows it to Mega Evolve in battle.", }, scizorite: { name: "Scizorite", - desc: "If held by a Scizor, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Scizor, this item allows it to Mega Evolve in battle.", }, scopelens: { name: "Scope Lens", - desc: "Holder's critical hit ratio is raised by 1 stage.", + shortDesc: "Holder's critical hit ratio is raised by 1 stage.", }, seaincense: { name: "Sea Incense", - desc: "Holder's Water-type attacks have 1.2x power.", + shortDesc: "Holder's Water-type attacks have 1.2x power.", gen3: { - desc: "Holder's Water-type attacks have 1.05x power.", + shortDesc: "Holder's Water-type attacks have 1.05x power.", }, }, sharpbeak: { name: "Sharp Beak", - desc: "Holder's Flying-type attacks have 1.2x power.", + shortDesc: "Holder's Flying-type attacks have 1.2x power.", gen3: { - desc: "Holder's Flying-type attacks have 1.1x power.", + shortDesc: "Holder's Flying-type attacks have 1.1x power.", }, }, sharpedonite: { name: "Sharpedonite", - desc: "If held by a Sharpedo, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Sharpedo, this item allows it to Mega Evolve in battle.", }, shedshell: { name: "Shed Shell", - desc: "Holder may switch out even when trapped by another Pokemon, or by Ingrain.", + shortDesc: "Holder may switch out even when trapped by another Pokemon, or by Ingrain.", }, shellbell: { name: "Shell Bell", - desc: "After an attack, holder gains 1/8 of the damage in HP dealt to other Pokemon.", + shortDesc: "After an attack, holder gains 1/8 of the damage in HP dealt to other Pokemon.", heal: " [POKEMON] restored a little HP using its Shell Bell!", }, @@ -1631,143 +1631,143 @@ export const ItemsText: {[id: IDEntry]: ItemText} = { }, shockdrive: { name: "Shock Drive", - desc: "Holder's Techno Blast is Electric type.", + shortDesc: "Holder's Techno Blast is Electric type.", }, shucaberry: { name: "Shuca Berry", - desc: "Halves damage taken from a supereffective Ground-type attack. Single use.", + shortDesc: "Halves damage taken from a supereffective Ground-type attack. Single use.", }, silkscarf: { name: "Silk Scarf", - desc: "Holder's Normal-type attacks have 1.2x power.", + shortDesc: "Holder's Normal-type attacks have 1.2x power.", gen3: { - desc: "Holder's Normal-type attacks have 1.1x power.", + shortDesc: "Holder's Normal-type attacks have 1.1x power.", }, }, silverpowder: { name: "Silver Powder", - desc: "Holder's Bug-type attacks have 1.2x power.", + shortDesc: "Holder's Bug-type attacks have 1.2x power.", gen3: { - desc: "Holder's Bug-type attacks have 1.1x power.", + shortDesc: "Holder's Bug-type attacks have 1.1x power.", }, }, sitrusberry: { name: "Sitrus Berry", - desc: "Restores 1/4 max HP when at 1/2 max HP or less. Single use.", + shortDesc: "Restores 1/4 max HP when at 1/2 max HP or less. Single use.", gen3: { - desc: "Restores 30 HP when at 1/2 max HP or less. Single use.", + shortDesc: "Restores 30 HP when at 1/2 max HP or less. Single use.", }, }, skullfossil: { name: "Skull Fossil", - desc: "Can be revived into Cranidos.", + shortDesc: "Can be revived into Cranidos.", }, skyplate: { name: "Sky Plate", - desc: "Holder's Flying-type attacks have 1.2x power. Judgment is Flying type.", + shortDesc: "Holder's Flying-type attacks have 1.2x power. Judgment is Flying type.", }, slowbronite: { name: "Slowbronite", - desc: "If held by a Slowbro, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Slowbro, this item allows it to Mega Evolve in battle.", }, smoothrock: { name: "Smooth Rock", - desc: "Holder's use of Sandstorm lasts 8 turns instead of 5.", + shortDesc: "Holder's use of Sandstorm lasts 8 turns instead of 5.", }, snorliumz: { name: "Snorlium Z", - desc: "If held by a Snorlax with Giga Impact, it can use Pulverizing Pancake.", + shortDesc: "If held by a Snorlax with Giga Impact, it can use Pulverizing Pancake.", }, snowball: { name: "Snowball", - desc: "Raises holder's Attack by 1 if hit by an Ice-type attack. Single use.", + shortDesc: "Raises holder's Attack by 1 if hit by an Ice-type attack. Single use.", }, softsand: { name: "Soft Sand", - desc: "Holder's Ground-type attacks have 1.2x power.", + shortDesc: "Holder's Ground-type attacks have 1.2x power.", gen3: { - desc: "Holder's Ground-type attacks have 1.1x power.", + shortDesc: "Holder's Ground-type attacks have 1.1x power.", }, }, solganiumz: { name: "Solganium Z", - desc: "Solgaleo or Dusk Mane Necrozma with Sunsteel Strike can use a special Z-Move.", + shortDesc: "Solgaleo or Dusk Mane Necrozma with Sunsteel Strike can use a special Z-Move.", }, souldew: { name: "Soul Dew", - desc: "If held by a Latias/Latios, its Dragon- and Psychic-type moves have 1.2x power.", + shortDesc: "If held by a Latias/Latios, its Dragon- and Psychic-type moves have 1.2x power.", gen6: { - desc: "If held by a Latias or a Latios, its Sp. Atk and Sp. Def are 1.5x.", + shortDesc: "If held by a Latias or a Latios, its Sp. Atk and Sp. Def are 1.5x.", }, }, spelltag: { name: "Spell Tag", - desc: "Holder's Ghost-type attacks have 1.2x power.", + shortDesc: "Holder's Ghost-type attacks have 1.2x power.", gen3: { - desc: "Holder's Ghost-type attacks have 1.1x power.", + shortDesc: "Holder's Ghost-type attacks have 1.1x power.", }, }, spelonberry: { name: "Spelon Berry", - desc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", + shortDesc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", }, splashplate: { name: "Splash Plate", - desc: "Holder's Water-type attacks have 1.2x power. Judgment is Water type.", + shortDesc: "Holder's Water-type attacks have 1.2x power. Judgment is Water type.", }, spookyplate: { name: "Spooky Plate", - desc: "Holder's Ghost-type attacks have 1.2x power. Judgment is Ghost type.", + shortDesc: "Holder's Ghost-type attacks have 1.2x power. Judgment is Ghost type.", }, sportball: { name: "Sport Ball", - desc: "A special Poke Ball for the Bug-Catching Contest.", + shortDesc: "A special Poke Ball for the Bug-Catching Contest.", }, starfberry: { name: "Starf Berry", - desc: "Raises a random stat by 2 when at 1/4 max HP or less (not acc/eva). Single use.", + shortDesc: "Raises a random stat by 2 when at 1/4 max HP or less (not acc/eva). Single use.", }, starsweet: { name: "Star Sweet", - desc: "Evolves Milcery into Alcremie when held and spun around.", + shortDesc: "Evolves Milcery into Alcremie when held and spun around.", }, steelixite: { name: "Steelixite", - desc: "If held by a Steelix, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Steelix, this item allows it to Mega Evolve in battle.", }, steelgem: { name: "Steel Gem", - desc: "Holder's first successful Steel-type attack will have 1.3x power. Single use.", + shortDesc: "Holder's first successful Steel-type attack will have 1.3x power. Single use.", gen5: { - desc: "Holder's first successful Steel-type attack will have 1.5x power. Single use.", + shortDesc: "Holder's first successful Steel-type attack will have 1.5x power. Single use.", }, }, steelmemory: { name: "Steel Memory", - desc: "Holder's Multi-Attack is Steel type.", + shortDesc: "Holder's Multi-Attack is Steel type.", }, steeliumz: { name: "Steelium Z", - desc: "If holder has a Steel move, this item allows it to use a Steel Z-Move.", + shortDesc: "If holder has a Steel move, this item allows it to use a Steel Z-Move.", }, stick: { name: "Stick", - desc: "If held by a Farfetch’d, its critical hit ratio is raised by 2 stages.", + shortDesc: "If held by a Farfetch’d, its critical hit ratio is raised by 2 stages.", gen2: { - desc: "If held by a Farfetch’d, its critical hit ratio is always at stage 2. (25% crit rate)", + shortDesc: "If held by a Farfetch’d, its critical hit ratio is always at stage 2. (25% crit rate)", }, }, stickybarb: { name: "Sticky Barb", - desc: "Each turn, holder loses 1/8 max HP. An attacker making contact can receive it.", + shortDesc: "Each turn, holder loses 1/8 max HP. An attacker making contact can receive it.", }, stoneplate: { name: "Stone Plate", - desc: "Holder's Rock-type attacks have 1.2x power. Judgment is Rock type.", + shortDesc: "Holder's Rock-type attacks have 1.2x power. Judgment is Rock type.", }, strawberrysweet: { name: "Strawberry Sweet", - desc: "Evolves Milcery into Alcremie when held and spun around.", + shortDesc: "Evolves Milcery into Alcremie when held and spun around.", }, sunstone: { name: "Sun Stone", @@ -1776,43 +1776,43 @@ export const ItemsText: {[id: IDEntry]: ItemText} = { }, swampertite: { name: "Swampertite", - desc: "If held by a Swampert, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Swampert, this item allows it to Mega Evolve in battle.", }, sweetapple: { name: "Sweet Apple", - desc: "Evolves Applin into Appletun when used.", + shortDesc: "Evolves Applin into Appletun when used.", }, syrupyapple: { name: "Syrupy Apple", - desc: "Evolves Applin into Dipplin when used.", + shortDesc: "Evolves Applin into Dipplin when used.", }, tamatoberry: { name: "Tamato Berry", - desc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", + shortDesc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", }, tangaberry: { name: "Tanga Berry", - desc: "Halves damage taken from a supereffective Bug-type attack. Single use.", + shortDesc: "Halves damage taken from a supereffective Bug-type attack. Single use.", }, tapuniumz: { name: "Tapunium Z", - desc: "If held by a Tapu with Nature's Madness, it can use Guardian of Alola.", + shortDesc: "If held by a Tapu with Nature's Madness, it can use Guardian of Alola.", }, tartapple: { name: "Tart Apple", - desc: "Evolves Applin into Flapple when used.", + shortDesc: "Evolves Applin into Flapple when used.", }, terrainextender: { name: "Terrain Extender", - desc: "Holder's use of Electric/Grassy/Misty/Psychic Terrain lasts 8 turns instead of 5.", + shortDesc: "Holder's use of Electric/Grassy/Misty/Psychic Terrain lasts 8 turns instead of 5.", }, thickclub: { name: "Thick Club", - desc: "If held by a Cubone or a Marowak, its Attack is doubled.", + shortDesc: "If held by a Cubone or a Marowak, its Attack is doubled.", }, throatspray: { name: "Throat Spray", - desc: "Raises holder's Special Attack by 1 stage after it uses a sound move. Single use.", + shortDesc: "Raises holder's Special Attack by 1 stage after it uses a sound move. Single use.", }, thunderstone: { name: "Thunder Stone", @@ -1824,445 +1824,445 @@ export const ItemsText: {[id: IDEntry]: ItemText} = { }, timerball: { name: "Timer Ball", - desc: "A Poke Ball that becomes better the more turns there are in a battle.", + shortDesc: "A Poke Ball that becomes better the more turns there are in a battle.", }, toxicorb: { name: "Toxic Orb", - desc: "At the end of every turn, this item attempts to badly poison the holder.", + shortDesc: "At the end of every turn, this item attempts to badly poison the holder.", }, toxicplate: { name: "Toxic Plate", - desc: "Holder's Poison-type attacks have 1.2x power. Judgment is Poison type.", + shortDesc: "Holder's Poison-type attacks have 1.2x power. Judgment is Poison type.", }, tr00: { name: "TR00", - desc: "Teaches certain Pokemon the move Swords Dance. One use.", + shortDesc: "Teaches certain Pokemon the move Swords Dance. One use.", }, tr01: { name: "TR01", - desc: "Teaches certain Pokemon the move Body Slam. One use.", + shortDesc: "Teaches certain Pokemon the move Body Slam. One use.", }, tr02: { name: "TR02", - desc: "Teaches certain Pokemon the move Flamethrower. One use.", + shortDesc: "Teaches certain Pokemon the move Flamethrower. One use.", }, tr03: { name: "TR03", - desc: "Teaches certain Pokemon the move Hydro Pump. One use.", + shortDesc: "Teaches certain Pokemon the move Hydro Pump. One use.", }, tr04: { name: "TR04", - desc: "Teaches certain Pokemon the move Surf. One use.", + shortDesc: "Teaches certain Pokemon the move Surf. One use.", }, tr05: { name: "TR05", - desc: "Teaches certain Pokemon the move Ice Beam. One use.", + shortDesc: "Teaches certain Pokemon the move Ice Beam. One use.", }, tr06: { name: "TR06", - desc: "Teaches certain Pokemon the move Blizzard. One use.", + shortDesc: "Teaches certain Pokemon the move Blizzard. One use.", }, tr07: { name: "TR07", - desc: "Teaches certain Pokemon the move Low Kick. One use.", + shortDesc: "Teaches certain Pokemon the move Low Kick. One use.", }, tr08: { name: "TR08", - desc: "Teaches certain Pokemon the move Thunderbolt. One use.", + shortDesc: "Teaches certain Pokemon the move Thunderbolt. One use.", }, tr09: { name: "TR09", - desc: "Teaches certain Pokemon the move Thunder. One use.", + shortDesc: "Teaches certain Pokemon the move Thunder. One use.", }, tr10: { name: "TR10", - desc: "Teaches certain Pokemon the move Earthquake. One use.", + shortDesc: "Teaches certain Pokemon the move Earthquake. One use.", }, tr11: { name: "TR11", - desc: "Teaches certain Pokemon the move Psychic. One use.", + shortDesc: "Teaches certain Pokemon the move Psychic. One use.", }, tr12: { name: "TR12", - desc: "Teaches certain Pokemon the move Agility. One use.", + shortDesc: "Teaches certain Pokemon the move Agility. One use.", }, tr13: { name: "TR13", - desc: "Teaches certain Pokemon the move Focus Energy. One use.", + shortDesc: "Teaches certain Pokemon the move Focus Energy. One use.", }, tr14: { name: "TR14", - desc: "Teaches certain Pokemon the move Metronome. One use.", + shortDesc: "Teaches certain Pokemon the move Metronome. One use.", }, tr15: { name: "TR15", - desc: "Teaches certain Pokemon the move Fire Blast. One use.", + shortDesc: "Teaches certain Pokemon the move Fire Blast. One use.", }, tr16: { name: "TR16", - desc: "Teaches certain Pokemon the move Waterfall. One use.", + shortDesc: "Teaches certain Pokemon the move Waterfall. One use.", }, tr17: { name: "TR17", - desc: "Teaches certain Pokemon the move Amnesia. One use.", + shortDesc: "Teaches certain Pokemon the move Amnesia. One use.", }, tr18: { name: "TR18", - desc: "Teaches certain Pokemon the move Leech Life. One use.", + shortDesc: "Teaches certain Pokemon the move Leech Life. One use.", }, tr19: { name: "TR19", - desc: "Teaches certain Pokemon the move Tri Attack. One use.", + shortDesc: "Teaches certain Pokemon the move Tri Attack. One use.", }, tr20: { name: "TR20", - desc: "Teaches certain Pokemon the move Substitute. One use.", + shortDesc: "Teaches certain Pokemon the move Substitute. One use.", }, tr21: { name: "TR21", - desc: "Teaches certain Pokemon the move Reversal. One use.", + shortDesc: "Teaches certain Pokemon the move Reversal. One use.", }, tr22: { name: "TR22", - desc: "Teaches certain Pokemon the move Sludge Bomb. One use.", + shortDesc: "Teaches certain Pokemon the move Sludge Bomb. One use.", }, tr23: { name: "TR23", - desc: "Teaches certain Pokemon the move Spikes. One use.", + shortDesc: "Teaches certain Pokemon the move Spikes. One use.", }, tr24: { name: "TR24", - desc: "Teaches certain Pokemon the move Outrage. One use.", + shortDesc: "Teaches certain Pokemon the move Outrage. One use.", }, tr25: { name: "TR25", - desc: "Teaches certain Pokemon the move Psyshock. One use.", + shortDesc: "Teaches certain Pokemon the move Psyshock. One use.", }, tr26: { name: "TR26", - desc: "Teaches certain Pokemon the move Endure. One use.", + shortDesc: "Teaches certain Pokemon the move Endure. One use.", }, tr27: { name: "TR27", - desc: "Teaches certain Pokemon the move Sleep Talk. One use.", + shortDesc: "Teaches certain Pokemon the move Sleep Talk. One use.", }, tr28: { name: "TR28", - desc: "Teaches certain Pokemon the move Megahorn. One use.", + shortDesc: "Teaches certain Pokemon the move Megahorn. One use.", }, tr29: { name: "TR29", - desc: "Teaches certain Pokemon the move Baton Pass. One use.", + shortDesc: "Teaches certain Pokemon the move Baton Pass. One use.", }, tr30: { name: "TR30", - desc: "Teaches certain Pokemon the move Encore. One use.", + shortDesc: "Teaches certain Pokemon the move Encore. One use.", }, tr31: { name: "TR31", - desc: "Teaches certain Pokemon the move Iron Tail. One use.", + shortDesc: "Teaches certain Pokemon the move Iron Tail. One use.", }, tr32: { name: "TR32", - desc: "Teaches certain Pokemon the move Crunch. One use.", + shortDesc: "Teaches certain Pokemon the move Crunch. One use.", }, tr33: { name: "TR33", - desc: "Teaches certain Pokemon the move Shadow Ball. One use.", + shortDesc: "Teaches certain Pokemon the move Shadow Ball. One use.", }, tr34: { name: "TR34", - desc: "Teaches certain Pokemon the move Future Sight. One use.", + shortDesc: "Teaches certain Pokemon the move Future Sight. One use.", }, tr35: { name: "TR35", - desc: "Teaches certain Pokemon the move Uproar. One use.", + shortDesc: "Teaches certain Pokemon the move Uproar. One use.", }, tr36: { name: "TR36", - desc: "Teaches certain Pokemon the move Heat Wave. One use.", + shortDesc: "Teaches certain Pokemon the move Heat Wave. One use.", }, tr37: { name: "TR37", - desc: "Teaches certain Pokemon the move Taunt. One use.", + shortDesc: "Teaches certain Pokemon the move Taunt. One use.", }, tr38: { name: "TR38", - desc: "Teaches certain Pokemon the move Trick. One use.", + shortDesc: "Teaches certain Pokemon the move Trick. One use.", }, tr39: { name: "TR39", - desc: "Teaches certain Pokemon the move Superpower. One use.", + shortDesc: "Teaches certain Pokemon the move Superpower. One use.", }, tr40: { name: "TR40", - desc: "Teaches certain Pokemon the move Skill Swap. One use.", + shortDesc: "Teaches certain Pokemon the move Skill Swap. One use.", }, tr41: { name: "TR41", - desc: "Teaches certain Pokemon the move Blaze Kick. One use.", + shortDesc: "Teaches certain Pokemon the move Blaze Kick. One use.", }, tr42: { name: "TR42", - desc: "Teaches certain Pokemon the move Hyper Voice. One use.", + shortDesc: "Teaches certain Pokemon the move Hyper Voice. One use.", }, tr43: { name: "TR43", - desc: "Teaches certain Pokemon the move Overheat. One use.", + shortDesc: "Teaches certain Pokemon the move Overheat. One use.", }, tr44: { name: "TR44", - desc: "Teaches certain Pokemon the move Cosmic Power. One use.", + shortDesc: "Teaches certain Pokemon the move Cosmic Power. One use.", }, tr45: { name: "TR45", - desc: "Teaches certain Pokemon the move Muddy Water. One use.", + shortDesc: "Teaches certain Pokemon the move Muddy Water. One use.", }, tr46: { name: "TR46", - desc: "Teaches certain Pokemon the move Iron Defense. One use.", + shortDesc: "Teaches certain Pokemon the move Iron Defense. One use.", }, tr47: { name: "TR47", - desc: "Teaches certain Pokemon the move Dragon Claw. One use.", + shortDesc: "Teaches certain Pokemon the move Dragon Claw. One use.", }, tr48: { name: "TR48", - desc: "Teaches certain Pokemon the move Bulk Up. One use.", + shortDesc: "Teaches certain Pokemon the move Bulk Up. One use.", }, tr49: { name: "TR49", - desc: "Teaches certain Pokemon the move Calm Mind. One use.", + shortDesc: "Teaches certain Pokemon the move Calm Mind. One use.", }, tr50: { name: "TR50", - desc: "Teaches certain Pokemon the move Leaf Blade. One use.", + shortDesc: "Teaches certain Pokemon the move Leaf Blade. One use.", }, tr51: { name: "TR51", - desc: "Teaches certain Pokemon the move Dragon Dance. One use.", + shortDesc: "Teaches certain Pokemon the move Dragon Dance. One use.", }, tr52: { name: "TR52", - desc: "Teaches certain Pokemon the move Gyro Ball. One use.", + shortDesc: "Teaches certain Pokemon the move Gyro Ball. One use.", }, tr53: { name: "TR53", - desc: "Teaches certain Pokemon the move Close Combat. One use.", + shortDesc: "Teaches certain Pokemon the move Close Combat. One use.", }, tr54: { name: "TR54", - desc: "Teaches certain Pokemon the move Toxic Spikes. One use.", + shortDesc: "Teaches certain Pokemon the move Toxic Spikes. One use.", }, tr55: { name: "TR55", - desc: "Teaches certain Pokemon the move Flare Blitz. One use.", + shortDesc: "Teaches certain Pokemon the move Flare Blitz. One use.", }, tr56: { name: "TR56", - desc: "Teaches certain Pokemon the move Aura Sphere. One use.", + shortDesc: "Teaches certain Pokemon the move Aura Sphere. One use.", }, tr57: { name: "TR57", - desc: "Teaches certain Pokemon the move Poison Jab. One use.", + shortDesc: "Teaches certain Pokemon the move Poison Jab. One use.", }, tr58: { name: "TR58", - desc: "Teaches certain Pokemon the move Dark Pulse. One use.", + shortDesc: "Teaches certain Pokemon the move Dark Pulse. One use.", }, tr59: { name: "TR59", - desc: "Teaches certain Pokemon the move Seed Bomb. One use.", + shortDesc: "Teaches certain Pokemon the move Seed Bomb. One use.", }, tr60: { name: "TR60", - desc: "Teaches certain Pokemon the move X-Scissor. One use.", + shortDesc: "Teaches certain Pokemon the move X-Scissor. One use.", }, tr61: { name: "TR61", - desc: "Teaches certain Pokemon the move Bug Buzz. One use.", + shortDesc: "Teaches certain Pokemon the move Bug Buzz. One use.", }, tr62: { name: "TR62", - desc: "Teaches certain Pokemon the move Dragon Pulse. One use.", + shortDesc: "Teaches certain Pokemon the move Dragon Pulse. One use.", }, tr63: { name: "TR63", - desc: "Teaches certain Pokemon the move Power Gem. One use.", + shortDesc: "Teaches certain Pokemon the move Power Gem. One use.", }, tr64: { name: "TR64", - desc: "Teaches certain Pokemon the move Focus Blast. One use.", + shortDesc: "Teaches certain Pokemon the move Focus Blast. One use.", }, tr65: { name: "TR65", - desc: "Teaches certain Pokemon the move Energy Ball. One use.", + shortDesc: "Teaches certain Pokemon the move Energy Ball. One use.", }, tr66: { name: "TR66", - desc: "Teaches certain Pokemon the move Brave Bird. One use.", + shortDesc: "Teaches certain Pokemon the move Brave Bird. One use.", }, tr67: { name: "TR67", - desc: "Teaches certain Pokemon the move Earth Power. One use.", + shortDesc: "Teaches certain Pokemon the move Earth Power. One use.", }, tr68: { name: "TR68", - desc: "Teaches certain Pokemon the move Nasty Plot. One use.", + shortDesc: "Teaches certain Pokemon the move Nasty Plot. One use.", }, tr69: { name: "TR69", - desc: "Teaches certain Pokemon the move Zen Headbutt. One use.", + shortDesc: "Teaches certain Pokemon the move Zen Headbutt. One use.", }, tr70: { name: "TR70", - desc: "Teaches certain Pokemon the move Flash Cannon. One use.", + shortDesc: "Teaches certain Pokemon the move Flash Cannon. One use.", }, tr71: { name: "TR71", - desc: "Teaches certain Pokemon the move Leaf Storm. One use.", + shortDesc: "Teaches certain Pokemon the move Leaf Storm. One use.", }, tr72: { name: "TR72", - desc: "Teaches certain Pokemon the move Power Whip. One use.", + shortDesc: "Teaches certain Pokemon the move Power Whip. One use.", }, tr73: { name: "TR73", - desc: "Teaches certain Pokemon the move Gunk Shot. One use.", + shortDesc: "Teaches certain Pokemon the move Gunk Shot. One use.", }, tr74: { name: "TR74", - desc: "Teaches certain Pokemon the move Iron Head. One use.", + shortDesc: "Teaches certain Pokemon the move Iron Head. One use.", }, tr75: { name: "TR75", - desc: "Teaches certain Pokemon the move Stone Edge. One use.", + shortDesc: "Teaches certain Pokemon the move Stone Edge. One use.", }, tr76: { name: "TR76", - desc: "Teaches certain Pokemon the move Stealth Rock. One use.", + shortDesc: "Teaches certain Pokemon the move Stealth Rock. One use.", }, tr77: { name: "TR77", - desc: "Teaches certain Pokemon the move Grass Knot. One use.", + shortDesc: "Teaches certain Pokemon the move Grass Knot. One use.", }, tr78: { name: "TR78", - desc: "Teaches certain Pokemon the move Sludge Wave. One use.", + shortDesc: "Teaches certain Pokemon the move Sludge Wave. One use.", }, tr79: { name: "TR79", - desc: "Teaches certain Pokemon the move Heavy Slam. One use.", + shortDesc: "Teaches certain Pokemon the move Heavy Slam. One use.", }, tr80: { name: "TR80", - desc: "Teaches certain Pokemon the move Electro Ball. One use.", + shortDesc: "Teaches certain Pokemon the move Electro Ball. One use.", }, tr81: { name: "TR81", - desc: "Teaches certain Pokemon the move Foul Play. One use.", + shortDesc: "Teaches certain Pokemon the move Foul Play. One use.", }, tr82: { name: "TR82", - desc: "Teaches certain Pokemon the move Stored Power. One use.", + shortDesc: "Teaches certain Pokemon the move Stored Power. One use.", }, tr83: { name: "TR83", - desc: "Teaches certain Pokemon the move Ally Switch. One use.", + shortDesc: "Teaches certain Pokemon the move Ally Switch. One use.", }, tr84: { name: "TR84", - desc: "Teaches certain Pokemon the move Scald. One use.", + shortDesc: "Teaches certain Pokemon the move Scald. One use.", }, tr85: { name: "TR85", - desc: "Teaches certain Pokemon the move Work Up. One use.", + shortDesc: "Teaches certain Pokemon the move Work Up. One use.", }, tr86: { name: "TR86", - desc: "Teaches certain Pokemon the move Wild Charge. One use.", + shortDesc: "Teaches certain Pokemon the move Wild Charge. One use.", }, tr87: { name: "TR87", - desc: "Teaches certain Pokemon the move Drill Run. One use.", + shortDesc: "Teaches certain Pokemon the move Drill Run. One use.", }, tr88: { name: "TR88", - desc: "Teaches certain Pokemon the move Heat Crash. One use.", + shortDesc: "Teaches certain Pokemon the move Heat Crash. One use.", }, tr89: { name: "TR89", - desc: "Teaches certain Pokemon the move Hurricane. One use.", + shortDesc: "Teaches certain Pokemon the move Hurricane. One use.", }, tr90: { name: "TR90", - desc: "Teaches certain Pokemon the move Play Rough. One use.", + shortDesc: "Teaches certain Pokemon the move Play Rough. One use.", }, tr91: { name: "TR91", - desc: "Teaches certain Pokemon the move Venom Drench. One use.", + shortDesc: "Teaches certain Pokemon the move Venom Drench. One use.", }, tr92: { name: "TR92", - desc: "Teaches certain Pokemon the move Dazzling Gleam. One use.", + shortDesc: "Teaches certain Pokemon the move Dazzling Gleam. One use.", }, tr93: { name: "TR93", - desc: "Teaches certain Pokemon the move Darkest Lariat. One use.", + shortDesc: "Teaches certain Pokemon the move Darkest Lariat. One use.", }, tr94: { name: "TR94", - desc: "Teaches certain Pokemon the move High Horsepower. One use.", + shortDesc: "Teaches certain Pokemon the move High Horsepower. One use.", }, tr95: { name: "TR95", - desc: "Teaches certain Pokemon the move Throat Chop. One use.", + shortDesc: "Teaches certain Pokemon the move Throat Chop. One use.", }, tr96: { name: "TR96", - desc: "Teaches certain Pokemon the move Pollen Puff. One use.", + shortDesc: "Teaches certain Pokemon the move Pollen Puff. One use.", }, tr97: { name: "TR97", - desc: "Teaches certain Pokemon the move Psychic Fangs. One use.", + shortDesc: "Teaches certain Pokemon the move Psychic Fangs. One use.", }, tr98: { name: "TR98", - desc: "Teaches certain Pokemon the move Liquidation. One use.", + shortDesc: "Teaches certain Pokemon the move Liquidation. One use.", }, tr99: { name: "TR99", - desc: "Teaches certain Pokemon the move Body Press. One use.", + shortDesc: "Teaches certain Pokemon the move Body Press. One use.", }, twistedspoon: { name: "Twisted Spoon", - desc: "Holder's Psychic-type attacks have 1.2x power.", + shortDesc: "Holder's Psychic-type attacks have 1.2x power.", gen3: { - desc: "Holder's Psychic-type attacks have 1.1x power.", + shortDesc: "Holder's Psychic-type attacks have 1.1x power.", }, }, tyranitarite: { name: "Tyranitarite", - desc: "If held by a Tyranitar, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Tyranitar, this item allows it to Mega Evolve in battle.", }, ultraball: { name: "Ultra Ball", - desc: "An ultra-performance Ball that provides a higher catch rate than a Great Ball.", + shortDesc: "An ultra-performance Ball that provides a higher catch rate than a Great Ball.", }, ultranecroziumz: { name: "Ultranecrozium Z", - desc: "Dusk Mane/Dawn Wings Necrozma: Ultra Burst, then Z-Move w/ Photon Geyser.", + shortDesc: "Dusk Mane/Dawn Wings Necrozma: Ultra Burst, then Z-Move w/ Photon Geyser.", transform: " Bright light is about to burst out of [POKEMON]!", activate: "[POKEMON] regained its true power through Ultra Burst!", }, unremarkableteacup: { name: "Unremarkable Teacup", - desc: "Evolves Poltchageist into Sinistcha when used.", + shortDesc: "Evolves Poltchageist into Sinistcha when used.", }, upgrade: { name: "Up-Grade", - desc: "Evolves Porygon into Porygon2 when traded.", + shortDesc: "Evolves Porygon into Porygon2 when traded.", }, utilityumbrella: { name: "Utility Umbrella", @@ -2271,22 +2271,22 @@ export const ItemsText: {[id: IDEntry]: ItemText} = { }, venusaurite: { name: "Venusaurite", - desc: "If held by a Venusaur, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Venusaur, this item allows it to Mega Evolve in battle.", }, wacanberry: { name: "Wacan Berry", - desc: "Halves damage taken from a supereffective Electric-type attack. Single use.", + shortDesc: "Halves damage taken from a supereffective Electric-type attack. Single use.", }, watergem: { name: "Water Gem", - desc: "Holder's first successful Water-type attack will have 1.3x power. Single use.", + shortDesc: "Holder's first successful Water-type attack will have 1.3x power. Single use.", gen5: { - desc: "Holder's first successful Water-type attack will have 1.5x power. Single use.", + shortDesc: "Holder's first successful Water-type attack will have 1.5x power. Single use.", }, }, watermemory: { name: "Water Memory", - desc: "Holder's Multi-Attack is Water type.", + shortDesc: "Holder's Multi-Attack is Water type.", }, waterstone: { name: "Water Stone", @@ -2295,134 +2295,134 @@ export const ItemsText: {[id: IDEntry]: ItemText} = { }, wateriumz: { name: "Waterium Z", - desc: "If holder has a Water move, this item allows it to use a Water Z-Move.", + shortDesc: "If holder has a Water move, this item allows it to use a Water Z-Move.", }, watmelberry: { name: "Watmel Berry", - desc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", + shortDesc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", }, waveincense: { name: "Wave Incense", - desc: "Holder's Water-type attacks have 1.2x power.", + shortDesc: "Holder's Water-type attacks have 1.2x power.", }, weaknesspolicy: { name: "Weakness Policy", - desc: "If holder is hit super effectively, raises Attack, Sp. Atk by 2 stages. Single use.", + shortDesc: "If holder is hit super effectively, raises Attack, Sp. Atk by 2 stages. Single use.", }, wellspringmask: { name: "Wellspring Mask", - desc: "Ogerpon-Wellspring: 1.2x power attacks; Terastallize to gain Embody Aspect.", + shortDesc: "Ogerpon-Wellspring: 1.2x power attacks; Terastallize to gain Embody Aspect.", }, wepearberry: { name: "Wepear Berry", - desc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", + shortDesc: "Cannot be eaten by the holder. No effect when eaten with Bug Bite or Pluck.", }, whippeddream: { name: "Whipped Dream", - desc: "Evolves Swirlix into Slurpuff when traded.", + shortDesc: "Evolves Swirlix into Slurpuff when traded.", }, whiteherb: { name: "White Herb", - desc: "Restores all lowered stat stages to 0 when one is less than 0. Single use.", + shortDesc: "Restores all lowered stat stages to 0 when one is less than 0. Single use.", end: " [POKEMON] returned its stats to normal using its White Herb!", }, widelens: { name: "Wide Lens", - desc: "The accuracy of attacks by the holder is 1.1x.", + shortDesc: "The accuracy of attacks by the holder is 1.1x.", }, wikiberry: { name: "Wiki Berry", - desc: "Restores 1/3 max HP at 1/4 max HP or less; confuses if -SpA Nature. Single use.", + shortDesc: "Restores 1/3 max HP at 1/4 max HP or less; confuses if -SpA Nature. Single use.", gen7: { - desc: "Restores 1/2 max HP at 1/4 max HP or less; confuses if -SpA Nature. Single use.", + shortDesc: "Restores 1/2 max HP at 1/4 max HP or less; confuses if -SpA Nature. Single use.", }, gen6: { - desc: "Restores 1/8 max HP at 1/2 max HP or less; confuses if -SpA Nature. Single use.", + shortDesc: "Restores 1/8 max HP at 1/2 max HP or less; confuses if -SpA Nature. Single use.", }, }, wiseglasses: { name: "Wise Glasses", - desc: "Holder's special attacks have 1.1x power.", + shortDesc: "Holder's special attacks have 1.1x power.", }, yacheberry: { name: "Yache Berry", - desc: "Halves damage taken from a supereffective Ice-type attack. Single use.", + shortDesc: "Halves damage taken from a supereffective Ice-type attack. Single use.", }, zapplate: { name: "Zap Plate", - desc: "Holder's Electric-type attacks have 1.2x power. Judgment is Electric type.", + shortDesc: "Holder's Electric-type attacks have 1.2x power. Judgment is Electric type.", }, zoomlens: { name: "Zoom Lens", - desc: "The accuracy of attacks by the holder is 1.2x if it moves after its target.", + shortDesc: "The accuracy of attacks by the holder is 1.2x if it moves after its target.", }, // Gen 2 items berserkgene: { name: "Berserk Gene", - desc: "(Gen 2) On switch-in, raises holder's Attack by 2 and confuses it. Single use.", + shortDesc: "(Gen 2) On switch-in, raises holder's Attack by 2 and confuses it. Single use.", }, berry: { name: "Berry", - desc: "(Gen 2) Restores 10 HP when at 1/2 max HP or less. Single use.", + shortDesc: "(Gen 2) Restores 10 HP when at 1/2 max HP or less. Single use.", }, bitterberry: { name: "Bitter Berry", - desc: "(Gen 2) Holder is cured if it is confused. Single use.", + shortDesc: "(Gen 2) Holder is cured if it is confused. Single use.", }, burntberry: { name: "Burnt Berry", - desc: "(Gen 2) Holder is cured if it is frozen. Single use.", + shortDesc: "(Gen 2) Holder is cured if it is frozen. Single use.", }, goldberry: { name: "Gold Berry", - desc: "(Gen 2) Restores 30 HP when at 1/2 max HP or less. Single use.", + shortDesc: "(Gen 2) Restores 30 HP when at 1/2 max HP or less. Single use.", }, iceberry: { name: "Ice Berry", - desc: "(Gen 2) Holder is cured if it is burned. Single use.", + shortDesc: "(Gen 2) Holder is cured if it is burned. Single use.", }, mintberry: { name: "Mint Berry", - desc: "(Gen 2) Holder wakes up if it is asleep. Single use.", + shortDesc: "(Gen 2) Holder wakes up if it is asleep. Single use.", }, miracleberry: { name: "Miracle Berry", - desc: "(Gen 2) Holder cures itself if it is confused or has a status condition. Single use.", + shortDesc: "(Gen 2) Holder cures itself if it is confused or has a status condition. Single use.", }, mysteryberry: { name: "Mystery Berry", - desc: "(Gen 2) Restores 5 PP to the first of the holder's moves to reach 0 PP. Single use.", + shortDesc: "(Gen 2) Restores 5 PP to the first of the holder's moves to reach 0 PP. Single use.", activate: " [POKEMON] restored PP to its [MOVE] move using Mystery Berry!", }, pinkbow: { name: "Pink Bow", - desc: "(Gen 2) Holder's Normal-type attacks have 1.1x power.", + shortDesc: "(Gen 2) Holder's Normal-type attacks have 1.1x power.", }, polkadotbow: { name: "Polkadot Bow", - desc: "(Gen 2) Holder's Normal-type attacks have 1.1x power.", + shortDesc: "(Gen 2) Holder's Normal-type attacks have 1.1x power.", }, przcureberry: { name: "PRZ Cure Berry", - desc: "(Gen 2) Holder cures itself if it is paralyzed. Single use.", + shortDesc: "(Gen 2) Holder cures itself if it is paralyzed. Single use.", }, psncureberry: { name: "PSN Cure Berry", - desc: "(Gen 2) Holder is cured if it is poisoned. Single use.", + shortDesc: "(Gen 2) Holder is cured if it is poisoned. Single use.", }, // CAP items crucibellite: { name: "Crucibellite", - desc: "If held by a Crucibelle, this item allows it to Mega Evolve in battle.", + shortDesc: "If held by a Crucibelle, this item allows it to Mega Evolve in battle.", }, vilevial: { name: "Vile Vial", - desc: "If held by a Venomicon, its Poison- and Flying-type attacks have 1.2x power.", + shortDesc: "If held by a Venomicon, its Poison- and Flying-type attacks have 1.2x power.", }, }; From c9acbfd260b03aebd053d28d1b0d0f2c487440e7 Mon Sep 17 00:00:00 2001 From: Guangcong Luo Date: Tue, 2 Jul 2024 17:57:29 -0700 Subject: [PATCH 107/139] Fix crash in SSB In general you should not be deleting statuses in an End handler; it happens automatically. But I can imagine some obscure reasons why it could happen (perhaps you call `clearVolatile` or something), and so I've also made it so that no longer causes a crash. --- data/mods/gen9ssb/abilities.ts | 3 --- sim/pokemon.ts | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/data/mods/gen9ssb/abilities.ts b/data/mods/gen9ssb/abilities.ts index 582ce8e4bd3b..901db31a37f4 100644 --- a/data/mods/gen9ssb/abilities.ts +++ b/data/mods/gen9ssb/abilities.ts @@ -2866,9 +2866,6 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa pokemon.m.bag = ['Blast Seed', 'Oran Berry', 'Petrify Orb', 'Luminous Orb', 'Reviver Seed']; } }, - onEnd(target) { - delete target.volatiles['treasurebag']; - }, onResidual(pokemon, source, effect) { if (!pokemon.m.bag) { pokemon.m.bag = ['Blast Seed', 'Oran Berry', 'Petrify Orb', 'Luminous Orb', 'Reviver Seed']; diff --git a/sim/pokemon.ts b/sim/pokemon.ts index 58cf436e7335..359fc01d78cd 100644 --- a/sim/pokemon.ts +++ b/sim/pokemon.ts @@ -1952,9 +1952,9 @@ export class Pokemon { if (!this.hp) return false; status = this.battle.dex.conditions.get(status) as Effect; if (!this.volatiles[status.id]) return false; - this.battle.singleEvent('End', status, this.volatiles[status.id], this); const linkedPokemon = this.volatiles[status.id].linkedPokemon; const linkedStatus = this.volatiles[status.id].linkedStatus; + this.battle.singleEvent('End', status, this.volatiles[status.id], this); delete this.volatiles[status.id]; if (linkedPokemon) { this.removeLinkedVolatiles(linkedStatus, linkedPokemon); From 369e25120f5ad15c652fe88565fd3ec4d6016fb7 Mon Sep 17 00:00:00 2001 From: Guangcong Luo Date: Wed, 3 Jul 2024 04:37:27 -0700 Subject: [PATCH 108/139] Fix Roomlogs logging game rooms This is a minor refactor to make Roomlogs more reliable about when it does or doesn't log, by using the same approach for `roomlogTable` as for `roomlogStream`. This also simplifies `setupRoomlogStream` to be sync. It's already got sync FS access, so this shouldn't make it any worse. And Main is using the database instead, so perf here isn't particularly critical anyway. --- server/roomlogs.ts | 54 +++++++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/server/roomlogs.ts b/server/roomlogs.ts index 735cb1ddf6cd..15c99dae71b2 100644 --- a/server/roomlogs.ts +++ b/server/roomlogs.ts @@ -17,7 +17,6 @@ interface RoomlogOptions { noLogTimes?: boolean; } - interface RoomlogRow { type: string; roomid: string; @@ -81,6 +80,10 @@ export class Roomlog { * null = disabled */ roomlogStream?: Streams.WriteStream | null; + /** + * Takes precedence over roomlogStream if it exists. + */ + roomlogTable: typeof roomlogTable; roomlogFilename: string; numTruncatedLines: number; @@ -99,9 +102,7 @@ export class Roomlog { this.numTruncatedLines = 0; - if (!roomlogTable) { - void this.setupRoomlogStream(true); - } + this.setupRoomlogStream(); } getScrollback(channel = 0) { let log = this.log; @@ -124,9 +125,14 @@ export class Roomlog { } return log.join('\n') + '\n'; } - async setupRoomlogStream(sync = false) { - if (this.roomlogStream === null || roomlogTable) return; - if (!Config.logchat || this.roomid.startsWith('battle-')) { + setupRoomlogStream() { + if (this.roomlogStream === null) return; + if (!Config.logchat || this.roomid.startsWith('battle-') || this.roomid.startsWith('game-')) { + this.roomlogStream = null; + return; + } + if (roomlogTable) { + this.roomlogTable = roomlogTable; this.roomlogStream = null; return; } @@ -138,12 +144,7 @@ export class Roomlog { if (relpath === this.roomlogFilename) return; - if (sync) { - Monitor.logPath(basepath + monthString).mkdirpSync(); - } else { - await Monitor.logPath(basepath + monthString).mkdirp(); - if (this.roomlogStream === null) return; - } + Monitor.logPath(basepath + monthString).mkdirpSync(); this.roomlogFilename = relpath; if (this.roomlogStream) void this.roomlogStream.writeEnd(); this.roomlogStream = Monitor.logPath(basepath + relpath).createAppendStream(); @@ -156,7 +157,7 @@ export class Roomlog { Monitor.logPath(link0).symlinkToSync(relpath); // intentionally a relative link Monitor.logPath(link0).renameSync(basepath + 'today.txt'); } catch {} // OS might not support symlinks or atomic rename - if (!Roomlogs.rollLogTimer) void Roomlogs.rollLogs(); + if (!Roomlogs.rollLogTimer) Roomlogs.rollLogs(); } add(message: string) { this.roomlog(message); @@ -199,7 +200,8 @@ export class Roomlog { const userid = toID(parsed.user); if (userids.includes(userid)) { if (!cleared.includes(userid)) cleared.push(userid); - if (this.roomid.startsWith('battle-')) return true; // Don't remove messages in battle rooms to preserve evidence + // Don't remove messages in battle rooms to preserve evidence + if (!this.roomlogStream && !this.roomlogTable) return true; if (clearAll) return false; if (lineCount > 0) { lineCount--; @@ -249,8 +251,9 @@ export class Roomlog { } } roomlog(message: string, date = new Date()) { - message = message.replace(/]* src="data:image\/png;base64,[^">]+"[^>]*>/g, ''); - if (roomlogTable && !(!Config.logchat || this.roomid.startsWith('battle-'))) { + if (!Config.logchat) return; + message = message.replace(/]* src="data:image\/png;base64,[^">]+"[^>]*>/g, '[img]'); + if (this.roomlogTable) { const chatData = this.parseChatLine(message); const type = message.split('|')[1] || ""; void this.insertLog(SQL`INSERT INTO roomlogs (${{ @@ -273,9 +276,8 @@ export class Roomlog { } } private async insertLog(query: SQLStatement, ignoreFailure = false): Promise { - if (!roomlogTable) return; try { - await roomlogTable.query(query); + await this.roomlogTable?.query(query); } catch (e: any) { if (e?.code === '42P01') { // table not found await roomlogDB!._query(FS('databases/schemas/roomlogs.sql').readSync(), []); @@ -294,10 +296,8 @@ export class Roomlog { await Rooms.Modlog.rename(this.roomid, newID); const roomlogStreamExisted = this.roomlogStream !== null; await this.destroy(); - if (roomlogTable) { - if (!(!Config.logchat || this.roomid.startsWith('battle-'))) { - await roomlogTable.updateAll({roomid: newID})`WHERE roomid = ${this.roomid}`; - } + if (this.roomlogTable) { + await this.roomlogTable.updateAll({roomid: newID})`WHERE roomid = ${this.roomid}`; } else { const roomlogPath = `chat`; const [roomlogExists, newRoomlogExists] = await Promise.all([ @@ -310,26 +310,26 @@ export class Roomlog { if (roomlogStreamExisted) { this.roomlogStream = undefined; this.roomlogFilename = ""; - await this.setupRoomlogStream(true); + this.setupRoomlogStream(); } } Roomlogs.roomlogs.set(newID, this); this.roomid = newID; return true; } - static async rollLogs() { + static rollLogs() { if (Roomlogs.rollLogTimer === true) return; if (Roomlogs.rollLogTimer) { clearTimeout(Roomlogs.rollLogTimer); } Roomlogs.rollLogTimer = true; for (const log of Roomlogs.roomlogs.values()) { - await log.setupRoomlogStream(); + log.setupRoomlogStream(); } const time = Date.now(); const nextMidnight = new Date(time + 24 * 60 * 60 * 1000); nextMidnight.setHours(0, 0, 1); - Roomlogs.rollLogTimer = setTimeout(() => void Roomlog.rollLogs(), nextMidnight.getTime() - time); + Roomlogs.rollLogTimer = setTimeout(() => Roomlog.rollLogs(), nextMidnight.getTime() - time); } truncate() { if (this.noAutoTruncate) return; From 2196c9b64e07bd46aacb7e4949ed5b4475629da8 Mon Sep 17 00:00:00 2001 From: TomOfTomKat <73961857+TomOfTomKat@users.noreply.github.com> Date: Wed, 3 Jul 2024 15:13:38 -0500 Subject: [PATCH 109/139] Category Swap: Update bans (#10387) * Category Swap: Multiple Bans Terapagos, Volcarona, Kyurem, and Deoxys-Speed banned here: https://www.smogon.com/forums/threads/category-swap-lcotm-ladder-is-up.3711668/post-10175281 Also Eternatus was missing from the original banlist: https://www.smogon.com/forums/threads/category-swap-lcotm-ladder-is-up.3711668/ * Fixing typo * Update formats.ts --------- Co-authored-by: Kris Johnson <11083252+KrisXV@users.noreply.github.com> --- config/formats.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/config/formats.ts b/config/formats.ts index 49d876bc9538..a4ad40ef4f2d 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -651,10 +651,11 @@ export const Formats: import('../sim/dex-formats').FormatList = [ mod: 'gen9', ruleset: ['Standard OMs', 'Sleep Clause Mod', 'Category Swap Mod'], banlist: [ - 'Arceus', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Darkrai', 'Deoxys-Base', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', 'Giratina', 'Giratina-Origin', 'Groudon', - 'Ho-Oh', 'Iron Valiant', 'Koraidon', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lunala', 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', - 'Necrozma-Dusk-Mane', 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Regieleki', 'Reshiram', 'Solgaleo', 'Spectrier', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', - 'Arena Trap', 'Moody', 'Shadow Tag', 'King\'s Rock', 'Razor Fang', 'Baton Pass', 'Draco Meteor', 'Last Respects', 'Overheat', 'Shed Tail', + 'Arceus', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Darkrai', 'Deoxys-Base', 'Deoxys-Attack', 'Deoxys-Speed', 'Dialga', 'Dialga-Origin', 'Eternatus', 'Giratina', + 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Iron Valiant', 'Koraidon', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Lunala', 'Magearna', 'Mewtwo', + 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Regieleki', 'Reshiram', 'Solgaleo', 'Spectrier', 'Terapagos', 'Volcarona', + 'Zacian', 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', 'Arena Trap', 'Moody', 'Shadow Tag', 'King\'s Rock', 'Razor Fang', 'Baton Pass', 'Draco Meteor', 'Last Respects', + 'Overheat', 'Shed Tail', ], }, { From 7979816b5bd258ff06869241e5c278f062332bbd Mon Sep 17 00:00:00 2001 From: shrianshChari <30420527+shrianshChari@users.noreply.github.com> Date: Wed, 3 Jul 2024 13:13:53 -0700 Subject: [PATCH 110/139] [Gen 5] BW1 OU: Unban Acupressure and Assist (#10388) --- config/formats.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/formats.ts b/config/formats.ts index a4ad40ef4f2d..1c7d6f9d783d 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -3173,7 +3173,7 @@ export const Formats: import('../sim/dex-formats').FormatList = [ mod: 'gen5bw1', ruleset: ['Standard', 'Sleep Clause Mod', 'Swagger Clause', 'Baton Pass Stat Clause'], - banlist: ['Uber', 'Drizzle ++ Swift Swim', 'Soul Dew', 'Acupressure', 'Assist'], + banlist: ['Uber', 'Drizzle ++ Swift Swim', 'Soul Dew'], }, { name: "[Gen 1] ZU", From 617592f4103fe5eb19786ab7b5076d519f035837 Mon Sep 17 00:00:00 2001 From: Marty-D Date: Thu, 4 Jul 2024 09:56:27 -0400 Subject: [PATCH 111/139] Gen 5 OU: Drop Hydreigon and Toxicroak into OU by technicality https://www.smogon.com/forums/posts/10176703/ --- data/mods/gen5/formats-data.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/mods/gen5/formats-data.ts b/data/mods/gen5/formats-data.ts index d057636dd927..2354f267e290 100644 --- a/data/mods/gen5/formats-data.ts +++ b/data/mods/gen5/formats-data.ts @@ -1707,7 +1707,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat tier: "LC", }, toxicroak: { - tier: "OU", + tier: "(OU)", doublesTier: "DOU", }, carnivine: { @@ -2347,7 +2347,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat tier: "NFE", }, hydreigon: { - tier: "OU", + tier: "(OU)", doublesTier: "DOU", }, larvesta: { From dad092f06c7b3b6af0e405b2a56d8bbd7830daed Mon Sep 17 00:00:00 2001 From: Leonard Craft III Date: Thu, 4 Jul 2024 16:40:44 -0500 Subject: [PATCH 112/139] Add skipped test for interaction of Life Dew and Psychic Noise --- test/sim/moves/psychicnoise.js | 39 ++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 test/sim/moves/psychicnoise.js diff --git a/test/sim/moves/psychicnoise.js b/test/sim/moves/psychicnoise.js new file mode 100644 index 000000000000..ece6cdf204f4 --- /dev/null +++ b/test/sim/moves/psychicnoise.js @@ -0,0 +1,39 @@ +'use strict'; + +const assert = require('./../../assert'); +const common = require('./../../common'); + +let battle; + +describe('Psychic Noise', function () { + afterEach(function () { + battle.destroy(); + }); + + it(`should prevent the target from healing, like Heal Block`, function () { + battle = common.createBattle([[ + {species: 'Wynaut', ability: 'battlearmor', moves: ['softboiled', 'sleeptalk']}, + ], [ + {species: 'Regieleki', moves: ['psychicnoise']}, + ]]); + const wynaut = battle.p1.active[0]; + battle.makeChoices(); + assert.false.fullHP(wynaut); + assert.cantMove(() => battle.choose('p1', 'move softboiled')); + }); + + it.skip(`should prevent the target's ally from healing it with Life Dew`, function () { + battle = common.createBattle({gameType: 'doubles'}, [[ + {species: 'Wynaut', ability: 'battlearmor', moves: ['sleeptalk']}, + {species: 'Blissey', ability: 'battlearmor', moves: ['lifedew']}, + ], [ + {species: 'Regieleki', moves: ['psychicnoise']}, + {species: 'Mew', moves: ['watergun']}, + ]]); + const wynaut = battle.p1.active[0]; + const blissey = battle.p1.active[1]; + battle.makeChoices('auto', 'move psychicnoise 1, move watergun 2'); + assert.false.fullHP(wynaut, `Wynaut should not be healed, because it is affected by Psychic Noise`); + assert.fullHP(blissey, `Blissey should be healed, because it is not affected by Psychic Noise`); + }); +}); From 249042831b6c351333d6d4b843b980e99677482c Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Fri, 5 Jul 2024 10:35:55 -0600 Subject: [PATCH 113/139] Remove National Dex LC ladder --- config/formats.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/config/formats.ts b/config/formats.ts index 1c7d6f9d783d..c2509ebb4114 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -2350,6 +2350,7 @@ export const Formats: import('../sim/dex-formats').FormatList = [ ], 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', From f7836430ed767f21c4c29b07c045b4a8df9f65a0 Mon Sep 17 00:00:00 2001 From: Isaiah <78443243+Thinkerino@users.noreply.github.com> Date: Fri, 5 Jul 2024 11:36:18 -0500 Subject: [PATCH 114/139] Update formats.ts (#10390) --- config/formats.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/config/formats.ts b/config/formats.ts index c2509ebb4114..e484638e5ad7 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -1152,12 +1152,12 @@ export const Formats: import('../sim/dex-formats').FormatList = [ mod: 'gen9', ruleset: ['Standard OMs', 'STABmons Move Legality', 'Sleep Moves Clause', 'Terastal Clause'], banlist: [ - 'Araquanid', 'Arceus', 'Azumarill', 'Basculegion', 'Basculegion-F', 'Baxcalibur', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Deoxys-Base', - 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', 'Dragapult', 'Dragonite', 'Enamorus-Base', 'Eternatus', 'Flutter Mane', 'Garchomp', 'Giratina', 'Giratina-Origin', - 'Groudon', 'Ho-Oh', 'Iron Bundle', 'Komala', 'Koraidon', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Latios', 'Lugia', 'Lunala', 'Magearna', - 'Manaphy', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Ogerpon-Wellspring', 'Palkia', 'Palkia-Origin', 'Pecharunt', 'Porygon-Z', - 'Rayquaza', 'Reshiram', 'Roaring Moon', 'Shaymin-Sky', 'Solgaleo', 'Spectrier', 'Terapagos', 'Ursaluna', 'Ursaluna-Bloodmoon', 'Urshifu-Base', 'Zacian', - 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', 'Zoroark-Hisui', 'Arena Trap', 'Moody', 'Shadow Tag', 'King\'s Rock', 'Razor Fang', 'Baton Pass', 'Shed Tail', + 'Araquanid', 'Arceus', 'Azumarill', 'Basculegion', 'Basculegion-F', 'Baxcalibur', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Deoxys-Base', 'Deoxys-Attack', + 'Dialga', 'Dialga-Origin', 'Dragapult', 'Dragonite', 'Enamorus-Base', 'Eternatus', 'Flutter Mane', 'Garchomp', 'Giratina', 'Giratina-Origin', 'Gouging Fire', 'Groudon', + 'Ho-Oh', 'Iron Bundle', 'Komala', 'Koraidon', 'Kyogre', 'Kyurem-Base', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Base', 'Latios', 'Lilligant-Hisui', 'Lugia', 'Lunala', + 'Magearna', 'Manaphy', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Ogerpon-Wellspring', 'Palkia', 'Palkia-Origin', 'Pecharunt', 'Porygon-Z', + 'Rayquaza', 'Reshiram', 'Roaring Moon', 'Shaymin-Sky', 'Solgaleo', 'Spectrier', 'Terapagos', 'Ursaluna', 'Ursaluna-Bloodmoon', 'Urshifu-Base', 'Zacian', 'Zacian-Crowned', + 'Zamazenta-Crowned', 'Zekrom', 'Zoroark-Hisui', 'Arena Trap', 'Moody', 'Shadow Tag', 'King\'s Rock', 'Razor Fang', 'Baton Pass', 'Shed Tail', ], restricted: [ 'Acupressure', 'Belly Drum', 'Clangorous Soul', 'Dire Claw', 'Extreme Speed', 'Fillet Away', 'Gigaton Hammer', 'Last Respects', 'No Retreat', From 4ff1f2430e0142136497c86c502cf3516ba9ea6f Mon Sep 17 00:00:00 2001 From: ACakeWearingAHat <45981036+ACakeWearingAHat@users.noreply.github.com> Date: Fri, 5 Jul 2024 11:39:19 -0500 Subject: [PATCH 115/139] Update aliases (#10378) * Update aliases Adds a LOT of new aliases. This doesn't seem to have been thoroughly updated since sometime in Gen 7. Adds regional formes, things from Gen 8 and Gen 9, a new section for Paradox Pokemon, and various other miscellaneous metagame abbreviations on consultation with room staff from various tiers. I will remove anything when asked. * lint * more aliases * finish up regional formes * some move aliases too! * add ZU aliases * Address Kris's review * add tealpon * implement #9805 + more * add train * more, while we wait as usual, just let me know if any of them need removin' * add a couple ability aliases for OU * sure i'll add grasspon too thanks jet * Update data/aliases.ts --------- Co-authored-by: Kris Johnson <11083252+KrisXV@users.noreply.github.com> --- data/aliases.ts | 281 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 277 insertions(+), 4 deletions(-) diff --git a/data/aliases.ts b/data/aliases.ts index 0e33254ae42b..f289a35e3915 100644 --- a/data/aliases.ts +++ b/data/aliases.ts @@ -60,9 +60,11 @@ export const Aliases: import('../sim/dex').AliasesTable = { gen6hackmons: "[Gen 6] Pure Hackmons", cc1v1: "[Gen 9] Challenge Cup 1v1", cc2v2: "[Gen 9] Challenge Cup 2v2", + cgt: "[Gen 9] Computer-Generated Teams", + compgen: "[Gen 9] Computer-Generated Teams", hc: "[Gen 9] Hackmons Cup", monorandom: "[Gen 8] Monotype Random Battle", - bf: "[Gen 7] Battle Factory", + bf: "[Gen 8] Battle Factory", bssf: "[Gen 9] BSS Factory", ssb: "[Gen 9] Super Staff Bros Ultimate", ssbu: "[Gen 9] Super Staff Bros Ultimate", @@ -70,6 +72,7 @@ export const Aliases: import('../sim/dex').AliasesTable = { gen6bf: "[Gen 6] Battle Factory", gen7mono: "[Gen 7] Monotype", gen7ag: "[Gen 7] Anything Goes", + gen7bf: "[Gen 7] Battle Factory", gen7bss: "[Gen 7] Battle Spot Singles", gen7bssf: "[Gen 7] BSS Factory", gen8bssf: "[Gen 8] BSS Factory", @@ -109,6 +112,8 @@ export const Aliases: import('../sim/dex').AliasesTable = { megamewtwo: "Mewtwo-Mega-Y", megamewtwox: "Mewtwo-Mega-X", megamewtwoy: "Mewtwo-Mega-Y", + mewtwox: "Mewtwo-Mega-X", + mewtwoy: "Mewtwo-Mega-Y", megasnow: "Abomasnow-Mega", megashark: "Sharpedo-Mega", megasaur: "Venusaur-Mega", @@ -174,6 +179,9 @@ export const Aliases: import('../sim/dex').AliasesTable = { basculinb: "Basculin-Blue-Striped", basculinblue: "Basculin-Blue-Striped", basculinbluestripe: "Basculin-Blue-Striped", + basculinw: "Basculin-White-Striped", + basculinwhite: "Basculin-White-Striped", + basculinwhitestripe: "Basculin-White-Striped", castformh: "Castform-Snowy", castformice: "Castform-Snowy", castformr: "Castform-Rainy", @@ -220,10 +228,12 @@ export const Aliases: import('../sim/dex').AliasesTable = { rotomc: "Rotom-Mow", rotomcut: "Rotom-Mow", rotomf: "Rotom-Frost", + fridge: "Rotom-Frost", rotomh: "Rotom-Heat", rotoms: "Rotom-Fan", rotomspin: "Rotom-Fan", rotomw: "Rotom-Wash", + wash: "Rotom-Wash", shaymins: "Shaymin-Sky", skymin: "Shaymin-Sky", thundurust: "Thundurus-Therian", @@ -264,9 +274,19 @@ export const Aliases: import('../sim/dex').AliasesTable = { oricoriopsychic: "Oricorio-Pa'u", lycanrocmidday: "Lycanroc", lycanrocday: "Lycanroc", + lycanm: "Lycanroc-Midnight", lycanrocn: "Lycanroc-Midnight", lycanrocnight: "Lycanroc-Midnight", + lycand: "Lycanroc-Dusk", lycanrocd: "Lycanroc-Dusk", + alomuk: "Muk-Alola", + alowak: "Marowak-Alola", + snowslash: "Sandslash-Alola", + alotales: "Ninetales-Alola", + alolatales: "Ninetales-Alola", + alolem: "Golem-Alola", + neckboy: "Exeggutor-Alola", + alosian: "Persian-Alola", ndm: "Necrozma-Dusk-Mane", ndw: "Necrozma-Dawn-Wings", necrozmadm: "Necrozma-Dusk-Mane", @@ -284,18 +304,75 @@ export const Aliases: import('../sim/dex').AliasesTable = { ufopsychic: "Pokestar UFO-2", goon: "Obstagoon", rime: "Mr. Rime", + gweez: "Weezing-Galar", + gorse: "Rapidash-Galar", + galardash: "Rapidash-Galar", + nddf: "Indeedee-F", zacianc: "Zacian-Crowned", zamazentac: "Zamazenta-Crowned", + glowbro: "Slowbro-Galar", + gbro: "Slowbro-Galar", + glowking: "Slowking-Galar", + gking: "Slowking-Galar", + gapdos: "Zapdos-Galar", + goltres: "Moltres-Galar", + gmolt: "Moltres-Galar", urshifuss: "Urshifu", urshifusingle: "Urshifu", urshifusinglestrike: "Urshifu", urshifurs: "Urshifu-Rapid-Strike", urshifurapid: "Urshifu-Rapid-Strike", + calyrexicerider: "Calyrex-Ice", calyrexir: "Calyrex-Ice", + calyi: "Calyrex-Ice", + calyice: "Calyrex-Ice", + calyrexshadowrider: "Calyrex-Shadow", calyrexsr: "Calyrex-Shadow", + calys: "Calyrex-Shadow", + calyshadow: "Calyrex-Shadow", taurospaldea: "Tauros-Paldea-Combat", taurospaldeafire: "Tauros-Paldea-Blaze", taurospaldeawater: "Tauros-Paldea-Aqua", + redbull: "Tauros-Paldea-Blaze", + wetbull: "Tauros-Paldea-Aqua", + ham: "Samurott-Hisui", + hamurott: "Samurott-Hisui", + decidh: "Decidueye-Hisui", + typhh: "Typhlosion-Hisui", + hqwil: "Qwilfish-Hisui", + hlil: "Lilligant-Hisui", + hisuigant: "Lilligant-Hisui", + hoodra: "Goodra-Hisui", + hzoro: "Zoroark-Hisui", + harc: "Arcanine-Hisui", + palkiao: "Palkia-Origin", + horsepalkia: "Palkia-Origin", + dialgao: "Dialga-Origin", + enamorust: "Enamorus-Therian", + enamt: "Enamorus-Therian", + squawkabillyb: "Squawkabilly-Blue", + squawkabillyw: "Squawkabilly-White", + squawkabillyy: "Squawkabilly-Yellow", + ursalunab: "Ursaluna-Bloodmoon", + woger: "Ogerpon-Wellspring", + cornerpon: "Ogerpon-Cornerstone", + waterpon: "Ogerpon-Wellspring", + rockpon: "Ogerpon-Cornerstone", + firepon: "Ogerpon-Hearthflame", + ogerw: "Ogerpon-Wellspring", + ogerc: "Ogerpon-Cornerstone", + ogerh: "Ogerpon-Hearthflame", + ogerponw: "Ogerpon-Wellspring", + ogerponc: "Ogerpon-Cornerstone", + ogerponh: "Ogerpon-Hearthflame", + ogerponwater: "Ogerpon-Wellspring", + ogerponrock: "Ogerpon-Cornerstone", + ogerponfire: "Ogerpon-Hearthflame", + ogerponwellspringmask: "Ogerpon-Wellspring", + ogerponcornerstonemask: "Ogerpon-Cornerstone", + ogerponhearthflamemask: "Ogerpon-Hearthflame", + terapagoss: "Terapagos-Stellar", + terapagost: "Terapagos-Terastal", // base formes nidoranfemale: "Nidoran-F", @@ -349,6 +426,17 @@ export const Aliases: import('../sim/dex').AliasesTable = { ufof: "Pokestar UFO", ufoflying: "Pokestar UFO", vivillonmeadow: "Vivillon", + enamorusi: "Enamorus", + enamorusincarnate: "Enamorus", + enamorusincarnation: "Enamorus", + squawkabillygreen: "Squawkabilly", + squawkabillyg: "Squawkabilly", + tealpon: "Ogerpon", + grasspon: "Ogerpon", + ogerpont: "Ogerpon", + ogerponteal: "Ogerpon", + ogerpontealmask: "Ogerpon", + terapagosbaby: "Terapagos", // event formes rockruffdusk: "Rockruff", @@ -381,6 +469,46 @@ export const Aliases: import('../sim/dex').AliasesTable = { kommoot: "Kommo-o-Totem", totemkommoo: "Kommo-o-Totem", + // Paradox Pokemon + grusk: "Great Tusk", + gtusk: "Great Tusk", + tusk: "Great Tusk", + stail: "Scream Tail", + flutter: "Flutter Mane", + fmane: "Flutter Mane", + slither: "Slither Wing", + swing: "Slither Wing", + sandy: "Sandy Shocks", + shocks: "Sandy Shocks", + bonnet: "Brute Bonnet", + rmoon: "Roaring Moon", + moon: "Roaring Moon", + wake: "Walking Wake", + ww: "Walking Wake", + bolt: "Raging Bolt", + greatneck: "Raging Bolt", + neck: "Raging Bolt", + raging: "Raging Bolt", + gfire: "Gouging Fire", + goug: "Gouging Fire", + gouging: "Gouging Fire", + treads: "Iron Treads", + moth: "Iron Moth", + hands: "Iron Hands", + thorns: "Iron Thorns", + jug: "Iron Jugulis", + jugulis: "Iron Jugulis", + bundle: "Iron Bundle", + bundlechan: "Iron Bundle", + val: "Iron Valiant", + ival: "Iron Valiant", + valiant: "Iron Valiant", + ileaves: "Iron Leaves", + leaves: "Iron Leaves", + boulder: "Iron Boulder", + crown: "Iron Crown", + icrown: "Iron Crown", + // cosmetic formes alcremierubycream: "Alcremie", alcremiematchacream: "Alcremie", @@ -563,18 +691,29 @@ export const Aliases: import('../sim/dex').AliasesTable = { propk1: "Pokestar Black Belt", // abilities + emorph: "Electromorphosis", + hadron: "Hadron Engine", + intim: "Intimidate", + mg: "Magic Guard", ngas: "Neutralizing Gas", pheal: "Poison Heal", + proto: "Protosynthesis", regen: "Regenerator", + sf: "Sheer Force", + so: "Supreme Overlord", stag: "Shadow Tag", // items + amulet: "Clear Amulet", assvest: "Assault Vest", av: "Assault Vest", balloon: "Air Balloon", band: "Choice Band", + booster: "Booster Energy", boots: "Heavy-Duty Boots", cb: "Choice Band", + cloak: "Covert Cloak", + dice: "Loaded Dice", ebelt: "Expert Belt", fightgem: "Fighting Gem", flightgem: "Flying Gem", @@ -584,6 +723,7 @@ export const Aliases: import('../sim/dex').AliasesTable = { lefties: "Leftovers", lo: "Life Orb", lorb: "Life Orb", + nmi: "Never-Melt Ice", sash: "Focus Sash", scarf: "Choice Scarf", specs: "Choice Specs", @@ -692,115 +832,178 @@ export const Aliases: import('../sim/dex').AliasesTable = { // pokemon aboma: "Abomasnow", + ace: "Cinderace", aegi: "Aegislash", aegiblade: "Aegislash-Blade", aegis: "Aegislash", aero: "Aerodactyl", + alo: "Alomomola", + amoon: "Amoonguss", amph: "Ampharos", + araq: "Araquanid", arc: "Arceus", arceusnormal: "Arceus", + arch: "Archaludon", ashgren: "Greninja-Ash", azu: "Azumarill", + bax: "Baxcalibur", bdrill: "Beedrill", bee: "Beedrill", + belli: "Bellibolt", bigsharp: "Kingambit", + billy: "Squawkabilly", birdjesus: "Pidgeot", bish: "Bisharp", blace: "Blacephalon", bliss: "Blissey", + bomb: "Bombirdier", + bramble: "Brambleghast", bull: "Tauros", bulu: "Tapu Bulu", - bundlechan: "Iron Bundle", camel: "Camerupt", cathy: "Trevenant", chandy: "Chandelure", chomp: "Garchomp", + cind: "Cinderace", clanger: "Kommo-o", clef: "Clefable", + clod: "Clodsire", + cloy: "Cloyster", coba: "Cobalion", cofag: "Cofagrigus", conk: "Conkeldurr", + copper: "Copperajah", + corv: "Corviknight", cress: "Cresselia", + croak: "Toxicroak", cruel: "Tentacruel", cube: "Kyurem-Black", cune: "Suicune", + cuno: "Articuno", darm: "Darmanitan", + dirge: "Skeledirge", dnite: "Dragonite", dogars: "Koffing", don: "Groudon", + doom: "Houndoom", + dozo: "Dondozo", drill: "Excadrill", driller: "Excadrill", + dudun: "Dudunsparce", dug: "Dugtrio", duggy: "Dugtrio", ekiller: "Arceus", + empo: "Empoleon", + enam: "Enamorus", esca: "Escavalier", ferro: "Ferrothorn", + fez: "Fezandipiti", fini: "Tapu Fini", + florg: "Florges", forry: "Forretress", fug: "Rayquaza", + galv: "Galvantula", + gambit: "Kingambit", gar: "Gengar", garde: "Gardevoir", + garg: "Garganacl", + gastro: "Gastrodon", gatr: "Feraligatr", gene: "Genesect", + ghold: "Gholdengo", gira: "Giratina", + glimm: "Glimmora", + glisc: "Gliscor", gren: "Greninja", gross: "Metagross", gyara: "Gyarados", + hatt: "Hatterene", hera: "Heracross", hippo: "Hippowdon", honch: "Honchkrow", + honse: "Spectrier", + incin: "Incineroar", + intel: "Inteleon", kanga: "Kangaskhan", karp: "Magikarp", kart: "Kartana", keld: "Keldeo", + keys: "Klefki", + kix: "Lokix", klef: "Klefki", koko: "Tapu Koko", + kommo: "Kommo-o", kou: "Raikou", krook: "Krookodile", + kyu: "Kyurem", kyub: "Kyurem-Black", kyuw: "Kyurem-White", lando: "Landorus", landoi: "Landorus", landot: "Landorus-Therian", + legion: "Basculegion", + legionf: "Basculegion-F", lego: "Nihilego", lele: "Tapu Lele", linda: "Fletchinder", + luc: "Lucario", luke: "Lucario", lurk: "Golurk", + lycan: "Lycanroc", m2: "Mewtwo", mage: "Magearna", mamo: "Mamoswine", mandi: "Mandibuzz", + maus: "Maushold", mence: "Salamence", + meow: "Meowscarada", milo: "Milotic", + mmq: "Mimikyu", + mola: "Alomomola", + molt: "Moltres", morfentshusbando: "Gengar", + munki: "Munkidori", naga: "Naganadel", nape: "Infernape", + ndd: "Indeedee", nebby: "Cosmog", - neckboy: "Exeggutor-Alola", nidok: "Nidoking", nidoq: "Nidoqueen", obama: "Abomasnow", + oger: "Ogerpon", ogre: "Kyogre", - ohmagod: "Plasmanta", p2: "Porygon2", + pao: "Chien-Pao", pato: "Psyduck", + peli: "Pelipper", pert: "Swampert", pex: "Toxapex", phero: "Pheromosa", pika: "Pikachu", + pikablu: "Marill", + plume: "Vileplume", pory2: "Porygon2", poryz: "Porygon-Z", + prim: "Primarina", + pult: "Dragapult", pyuku: "Pyukumuku", pz: "Porygon-Z", + quag: "Quagsire", + quaq: "Quaquaval", queen: "Nidoqueen", rachi: "Jirachi", + rai: "Darkrai", + raj: "Copperajah", rank: "Reuniclus", ray: "Rayquaza", reuni: "Reuniclus", + rhyp: "Rhyperior", + ribo: "Ribombee", + rilla: "Rillaboom", sab: "Sableye", sable: "Sableye", scept: "Sceptile", + sciz: "Scizor", scoli: "Scolipede", seejong: "Sealeo", serp: "Serperior", @@ -809,28 +1012,41 @@ export const Aliases: import('../sim/dex').AliasesTable = { smogon: "Koffing", smogonbird: "Talonflame", snips: "Drapion", + squawk: "Squawkabilly", staka: "Stakataka", steela: "Celesteela", sui: "Suicune", swole: "Buzzwole", + sylv: "Sylveon", talon: "Talonflame", tang: "Tangrowth", + tent: "Tentacruel", terra: "Terrakion", tflame: "Talonflame", thundy: "Thundurus", + ting: "Ting-Lu", toed: "Politoed", + tomb: "Spiritomb", torn: "Tornadus", tran: "Heatran", + tsar: "Tsareena", ttar: "Tyranitar", + typh: "Typhlosion", venu: "Venusaur", viriz: "Virizion", watershifu: "Urshifu-Rapid-Strike", + weav: "Weavile", whimsi: "Whimsicott", + worm: "Orthworm", xern: "Xerneas", xurk: "Xurkitree", ygod: "Yveltal", + zac: "Zacian", + zaci: "Zacian", zam: "Alakazam", + zama: "Zamazenta", zard: "Charizard", + zone: "Magnezone", zong: "Bronzong", zor: "Scizor", zyg: "Zygarde", @@ -851,17 +1067,25 @@ export const Aliases: import('../sim/dex').AliasesTable = { bb: "Brave Bird", bd: "Belly Drum", bde: "Baby-Doll Eyes", + blades: "Precipice Blades", bpass: "Baton Pass", + bpress: "Body Press", bp: "Baton Pass", + cane: "Hurricane", cc: "Close Combat", cm: "Calm Mind", dbond: "Destiny Bond", dd: "Dragon Dance", + dib: "Double Iron Bash", dv: "Dark Void", + dw: "Dual Wingbeat", + dwb: "Dual Wingbeat", + edge: "Stone Edge", eq: "Earthquake", espeed: "ExtremeSpeed", eterrain: "Electric Terrain", faintattack: "Feint Attack", + glance: "Glacial Lance", glowpunch: "Power-up Punch", gterrain: "Grassy Terrain", hhp: "High Horsepower", @@ -884,10 +1108,18 @@ export const Aliases: import('../sim/dex').AliasesTable = { hpwater: "Hidden Power Water", hjk: "High Jump Kick", hijumpkick: "High Jump Kick", + knock: "Knock Off", + lr: "Last Respects", + mir: "Make It Rain", mterrain: "Misty Terrain", np: "Nasty Plot", + pblades: "Precipice Blades", pfists: "Plasma Fists", playaround: "Play Rough", + polter: "Poltergeist", + popbomb: "Population Bomb", + press: "Body Press", + psynoise: "Psychic Noise", pterrain: "Psychic Terrain", pup: "Power-up Punch", qd: "Quiver Dance", @@ -899,13 +1131,18 @@ export const Aliases: import('../sim/dex').AliasesTable = { sr: "Stealth Rock", ssa: "Shell Side Arm", sub: "Substitute", + tarrows: "Thousand Arrows", + taxel: "Triple Axel", tr: "Trick Room", troom: "Trick Room", tbolt: "Thunderbolt", tspikes: "Toxic Spikes", twave: "Thunder Wave", + twaves: "Thousand Waves", vicegrip: "Vise Grip", web: "Sticky Web", + webs: "Sticky Web", + wisp: "Will-O-Wisp", wow: "Will-O-Wisp", // z-moves @@ -1859,4 +2096,40 @@ export const Aliases: import('../sim/dex').AliasesTable = { zugadoon: "Blacephalon", merutan: "Meltan", merumetaru: "Melmetal", + + // CAP + arg: "Arghonaut", + astro: "Astrolotl", + auru: "Aurumoth", + cari: "Caribolt", + cawm: "Cawmodore", + colo: "Colossoil", + chrom: "Chromera", + chugg: "Chuggalong", + clohm: "Cyclohm", + cruci: "Crucibelle", + ebook: "Venomicon-Epilogue", + hemo: "Hemogoblin", + kerf: "Kerfluffle", + kit: "Kitsunoh", + krilo: "Krilowatt", + libra: "Equilibra", + mala: "Malaconda", + maw: "Miasmaw", + megacruci: "Crucibelle-Mega", + navi: "Naviathan", + nect: "Necturna", + ohmagod: "Plasmanta", + plas: "Plasmanta", + raja: "Saharaja", + rev: "Revenankh", + roak: "pyroak", + smoko: "Smokomodo", + snael: "Snaelstrom", + strata: "Stratagem", + train: "Chuggalong", + venomicone: "Venomicon-Epilogue", + venomiconp: "Venomicon", + venomiconprologue: "Venomicon", + volk: "Volkraken", }; From 2f1418d104ab2e56ef92b3edf27f8d745b0d97f4 Mon Sep 17 00:00:00 2001 From: shrianshChari <30420527+shrianshChari@users.noreply.github.com> Date: Fri, 5 Jul 2024 12:29:45 -0700 Subject: [PATCH 116/139] Ban King's Rock (#10391) --- config/formats.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/formats.ts b/config/formats.ts index e484638e5ad7..b715c035b339 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -3174,7 +3174,7 @@ export const Formats: import('../sim/dex-formats').FormatList = [ mod: 'gen5bw1', ruleset: ['Standard', 'Sleep Clause Mod', 'Swagger Clause', 'Baton Pass Stat Clause'], - banlist: ['Uber', 'Drizzle ++ Swift Swim', 'Soul Dew'], + banlist: ['Uber', 'Drizzle ++ Swift Swim', 'King\'s Rock', 'Soul Dew'], }, { name: "[Gen 1] ZU", From eb710f2373ad1e2d48c645954a0585531f8704e1 Mon Sep 17 00:00:00 2001 From: Leonard Craft III Date: Sat, 6 Jul 2024 12:14:13 -0500 Subject: [PATCH 117/139] Fix Tera Shell's interaction with Struggle --- data/abilities.ts | 2 +- test/sim/abilities/terashell.js | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/data/abilities.ts b/data/abilities.ts index 9ce3a1a33ce5..3fd16cdba3bc 100644 --- a/data/abilities.ts +++ b/data/abilities.ts @@ -4868,7 +4868,7 @@ export const Abilities: import('../sim/dex-abilities').AbilityDataTable = { onEffectiveness(typeMod, target, type, move) { if (!target || target.species.name !== 'Terapagos-Terastal') return; if (this.effectState.resisted) return -1; // all hits of multi-hit move should be not very effective - if (move.category === 'Status') return; + if (move.category === 'Status' || move.id === 'struggle') return; if (!target.runImmunity(move.type)) return; // immunity has priority if (target.hp < target.maxhp) return; diff --git a/test/sim/abilities/terashell.js b/test/sim/abilities/terashell.js index ab43a4eb9613..e8558d0da696 100644 --- a/test/sim/abilities/terashell.js +++ b/test/sim/abilities/terashell.js @@ -87,4 +87,18 @@ describe('Tera Shell', function () { damage = espeon.maxhp - espeon.hp; assert.bounded(damage, [33, 39], `Tera Shell should have activated because current species is Terapagos`); }); + + it(`should not weaken the damage from Struggle`, function () { + battle = common.createBattle([[ + {species: 'Terapagos', ability: 'terashift', moves: ['luckychant']}, + ], [ + {species: 'Slowking', item: 'assaultvest', moves: ['sleeptalk']}, + ]]); + + battle.makeChoices(); + + const terapagos = battle.p1.active[0]; + const damage = terapagos.maxhp - terapagos.hp; + assert.bounded(damage, [27, 32], `Tera Shell should not have reduced the damage Struggle dealt`); + }); }); From fd308db768997bc799f58d9623077d0331f0a79b Mon Sep 17 00:00:00 2001 From: Leonard Craft III Date: Sat, 6 Jul 2024 12:15:48 -0500 Subject: [PATCH 118/139] Add more skipped Tera Shell tests --- test/sim/abilities/terashell.js | 63 +++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/test/sim/abilities/terashell.js b/test/sim/abilities/terashell.js index e8558d0da696..6625ffee518c 100644 --- a/test/sim/abilities/terashell.js +++ b/test/sim/abilities/terashell.js @@ -101,4 +101,67 @@ describe('Tera Shell', function () { const damage = terapagos.maxhp - terapagos.hp; assert.bounded(damage, [27, 32], `Tera Shell should not have reduced the damage Struggle dealt`); }); + + it.skip(`should not continue to weaken attacks after taking damage from a Future attack`, function () { + battle = common.createBattle([[ + {species: 'Terapagos', ability: 'terashift', moves: ['sleeptalk']}, + {species: 'Espeon', moves: ['sleeptalk']}, + ], [ + {species: 'Slowking', moves: ['sleeptalk', 'wickedblow', 'futuresight']}, + ]]); + + battle.makeChoices('auto', 'move futuresight'); + battle.makeChoices(); + battle.makeChoices(); + + const terapagos = battle.p1.active[0]; + let damage = terapagos.maxhp - terapagos.hp; + assert.bounded(damage, [59, 70], `Tera Shell should have reduced the damage Future Sight dealt`); + + battle.makeChoices('switch 2', 'auto'); + battle.makeChoices('switch 2', 'move wickedblow'); + damage = terapagos.maxhp - terapagos.hp - damage; + assert.bounded(damage, [59, 70], `Tera Shell should not have reduced the damage Wicked Blow dealt`); + }); + + it.skip(`should activate, but not weaken, moves with fixed damage`, function () { + battle = common.createBattle([[ + {species: 'Terapagos', ability: 'terashift', evs: {hp: 252}, moves: ['recover', 'seismictoss']}, + {species: 'Magikarp', moves: ['sleeptalk']}, + ], [ + {species: 'Slowpoke', ability: 'noguard', moves: ['seismictoss', 'superfang', 'counter']}, + {species: 'Shuckle', moves: ['finalgambit']}, + {species: 'Wynaut', ability: 'noguard', moves: ['sheercold']}, + ]]); + + const terapagos = battle.p1.active[0]; + + battle.makeChoices('auto', 'move seismictoss'); + let damage = terapagos.maxhp - terapagos.hp; + assert.equal(damage, 100, `Tera Shell should not have reduced the damage Seismic Toss dealt`); + assert(battle.log[battle.lastMoveLine + 1].endsWith('Tera Shell'), `Tera Shell should have activated on Seismic Toss`); + + battle.makeChoices('auto', 'move superfang'); + damage = terapagos.maxhp - terapagos.hp; + assert.equal(damage, Math.floor(terapagos.maxhp / 2), `Tera Shell should not have reduced the damage Super Fang dealt`); + assert(battle.log[battle.lastMoveLine + 1].endsWith('Tera Shell'), `Tera Shell should have activated on Super Fang`); + + battle.makeChoices('auto', 'move counter'); + battle.makeChoices('move seismictoss', 'move counter'); + damage = terapagos.maxhp - terapagos.hp; + assert.equal(damage, 200, `Tera Shell should not have reduced the damage Counter dealt`); + assert(battle.log[battle.lastMoveLine + 1].endsWith('Tera Shell'), `Tera Shell should have activated on Counter`); + + battle.makeChoices('auto', 'switch 2'); + const shuckle = battle.p2.active[0]; + battle.makeChoices('auto', 'move finalgambit'); + damage = terapagos.maxhp - terapagos.hp; + assert.equal(damage, shuckle.maxhp, `Tera Shell should not have reduced the damage Final Gambit dealt`); + assert(battle.log[battle.lastMoveLine + 1].endsWith('Tera Shell'), `Tera Shell should have activated on Final Gambit`); + + battle.choose('p2', 'switch 3'); + battle.makeChoices('auto', 'move sheercold'); + assert.fainted(terapagos); + assert(battle.log[battle.lastMoveLine + 1].endsWith('Tera Shell'), `Tera Shell should have activated on Sheer Cold`); + }); }); From 3256c1e4107ed09193c60706df0b33e39c79a710 Mon Sep 17 00:00:00 2001 From: Leonard Craft III Date: Sat, 6 Jul 2024 16:03:20 -0500 Subject: [PATCH 119/139] Fix Computer-Generated Teams toID crash --- data/cg-teams.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/cg-teams.ts b/data/cg-teams.ts index 5037b46b74cf..5748bbbc2033 100644 --- a/data/cg-teams.ts +++ b/data/cg-teams.ts @@ -514,8 +514,8 @@ export default class TeamGenerator { if (move.category === 'Special' && hasPhysicalSetup) powerEstimate *= 0.7; const abilityBonus = ( - ((ABILITY_MOVE_BONUSES[toID(ability)] || {})[move.id] || 1) * - ((ABILITY_MOVE_TYPE_BONUSES[toID(ability)] || {})[moveType] || 1) + ((ABILITY_MOVE_BONUSES[this.dex.toID(ability)] || {})[move.id] || 1) * + ((ABILITY_MOVE_TYPE_BONUSES[this.dex.toID(ability)] || {})[moveType] || 1) ); let weight = powerEstimate * abilityBonus; From ed0d8bee2775522d856b9601a81c0acff1ecbc44 Mon Sep 17 00:00:00 2001 From: Karthik Bandagonda <32044378+Karthik99999@users.noreply.github.com> Date: Sat, 6 Jul 2024 17:24:16 -0400 Subject: [PATCH 120/139] Add auctions as a chat plugin (#10197) --- server/chat-plugins/auction.ts | 930 +++++++++++++++++++++++++++++++++ server/rooms.ts | 2 +- 2 files changed, 931 insertions(+), 1 deletion(-) create mode 100644 server/chat-plugins/auction.ts diff --git a/server/chat-plugins/auction.ts b/server/chat-plugins/auction.ts new file mode 100644 index 000000000000..cacb3309c8a6 --- /dev/null +++ b/server/chat-plugins/auction.ts @@ -0,0 +1,930 @@ +/** + * Chat plugin to run auctions for team tournaments. + * + * Based on the original Scrappie auction system + * https://github.com/Hidden50/Pokemon-Showdown-Node-Bot/blob/master/commands/base-auctions.js + * @author Karthik + */ +import {Net, Utils} from '../../lib'; + +interface Player { + id: ID; + name: string; + team?: Team; + price: number; + tiers?: string[]; +} + +class Team { + id: ID; + name: string; + credits: number; + managers: string[]; + suspended: boolean; + private auction: Auction; + constructor(name: string, auction: Auction) { + this.id = toID(name); + this.name = name; + this.credits = auction.startingCredits; + this.managers = []; + this.suspended = false; + this.auction = auction; + } + + getPlayers() { + const players = []; + for (const id in this.auction.playerList) { + const player = this.auction.playerList[id]; + if (player.team === this) players.push(player); + } + return players; + } + + isSuspended() { + return this.credits < this.auction.minBid || this.suspended; + } + + maxBid(credits = this.credits) { + return credits + this.auction.minBid * Math.min(0, this.getPlayers().length - this.auction.minPlayers + 1); + } +} + +export class Auction extends Rooms.SimpleRoomGame { + override readonly gameid = 'auction' as ID; + teams: {[k: string]: Team}; + playerList: {[k: string]: Player}; + owners: {[k: string]: string}; + + startingCredits: number; + minBid: number; + minPlayers: number; + blindMode: boolean; + + lastQueue: string[] | null = null; + queue: string[] = []; + currentTeam: Team; + bidTimer: NodeJS.Timer; + /** How many seconds have passed since the start of the timer */ + bidTimeElapsed: number; + /** Measured in seconds */ + bidTimeLimit: number; + currentNom: Player; + currentBid: number; + currentBidder: Team; + /** Used for blind mode */ + bidsPlaced: {[k: string]: number}; + state: 'setup' | 'nom' | 'bid' = 'setup'; + constructor(room: Room, startingCredits = 100000) { + super(room); + this.title = `Auction (${room.title})`; + this.teams = {}; + this.playerList = {}; + this.owners = {}; + + this.startingCredits = startingCredits; + this.minBid = 3000; + this.minPlayers = 10; + this.blindMode = false; + + this.currentTeam = null!; + this.bidTimer = null!; + this.bidTimeElapsed = 0; + this.bidTimeLimit = 10; + this.currentNom = null!; + this.currentBid = 0; + this.currentBidder = null!; + this.bidsPlaced = {}; + } + + sendMessage(message: string) { + this.room.add(`|c:|${Math.floor(Date.now() / 1000)}|&|${message}`).update(); + } + + sendHTML(message: string) { + this.room.add(`|html|${message}`).update(); + } + + checkOwner(user: User) { + if (!this.owners[user.id] && !Users.Auth.hasPermission(user, 'declare', null, this.room)) { + throw new Chat.ErrorMessage(`You must be an auction owner to use this command.`); + } + } + + addOwner(user: User) { + if (this.owners[user.id]) throw new Chat.ErrorMessage(`${user.name} is already an auction owner.`); + this.owners[user.id] = user.id; + } + + removeOwner(user: User) { + if (!this.owners[user.id]) throw new Chat.ErrorMessage(`${user.name} is not an auction owner.`); + delete this.owners[user.id]; + } + + generateUsernameList(players: (string | Player)[], max = players.length, clickable = false) { + let buf = ``; + buf += players.slice(0, max).map(p => { + if (typeof p === 'object') { + return `${Utils.escapeHTML(p.name)}`; + } + return `${Utils.escapeHTML(p)}`; + }).join(', '); + if (players.length > max) { + buf += ` (+${players.length - max})`; + } + buf += ``; + return buf; + } + + generatePriceList() { + const draftedPlayers = Object.values(this.playerList).filter(p => p.team).sort((a, b) => b.price - a.price); + let buf = `
      `; + for (const id in this.teams) { + const team = this.teams[id]; + buf += `
      ${Utils.escapeHTML(team.name)}`; + for (const player of draftedPlayers.filter(p => p.team === team)) { + buf += ``; + } + buf += `
      ${Utils.escapeHTML(player.name)}${player.price}

      `; + } + buf += `
      All`; + for (const player of draftedPlayers) { + buf += ``; + } + buf += `
      ${Utils.escapeHTML(player.name)}${player.price}
      `; + return buf; + } + + generateAuctionTable() { + let buf = `
      `; + const queue = this.queue.filter(id => !this.teams[id].isSuspended()); + buf += Object.values(this.teams).map(team => { + const players = team.getPlayers(); + let i1 = queue.indexOf(team.id) + 1; + let i2 = queue.lastIndexOf(team.id) + 1; + if (i1 > queue.length / 2) { + [i1, i2] = [i2, i1]; + } + let row = ``; + row += ``; + row += ``; + row += ``; + row += ``; + row += ``; + return row; + }).join(''); + buf += `
      OrderTeamsCreditsPlayers
      ${i1 > 0 ? i1 : '-'}${i2 > 0 ? i2 : '-'}${Utils.escapeHTML(team.name)}
      ${this.generateUsernameList(team.managers.map(id => Users.get(id)?.name || id), 2, true)}
      ${team.credits.toLocaleString()}${team.maxBid() >= this.minBid ? `
      Max bid: ${team.maxBid().toLocaleString()}` : ''}
      ${players.length}${this.generateUsernameList(players)}
      `; + + const remainingPlayers = Object.values(this.playerList).filter(p => !p.team); + const tierArrays: {[k: string]: Player[]} = {}; + for (const player of remainingPlayers) { + if (!player.tiers?.length) continue; + for (const tier of player.tiers) { + if (!tierArrays[tier]) tierArrays[tier] = []; + tierArrays[tier].push(player); + } + } + const sortedTiers = Object.keys(tierArrays).sort(); + if (sortedTiers.length) { + buf += `
      Remaining Players (${remainingPlayers.length})`; + buf += `
      All${this.generateUsernameList(remainingPlayers)}
      `; + buf += `
      Tiers
        `; + for (const tier of sortedTiers) { + buf += `
      • ${Utils.escapeHTML(tier)} (${tierArrays[tier].length})${this.generateUsernameList(tierArrays[tier])}
      • `; + } + buf += `
      `; + } else { + buf += `
      Remaining Players (${remainingPlayers.length})${this.generateUsernameList(remainingPlayers)}
      `; + } + buf += `
      `; + + return buf; + } + + setMinBid(amount: number) { + if (this.state !== 'setup') { + throw new Chat.ErrorMessage(`You cannot change the minimum bid after the auction has started.`); + } + if (amount < 500) amount *= 1000; + if (isNaN(amount) || amount < 500 || amount > 500000 || amount % 500 !== 0) { + throw new Chat.ErrorMessage(`The minimum bid must be a multiple of 500 between 500 and 500,000.`); + } + this.minBid = amount; + } + + setMinPlayers(amount: number) { + if (this.state !== 'setup') { + throw new Chat.ErrorMessage(`You cannot change the minimum number of players after the auction has started.`); + } + if (isNaN(amount) || amount < 1 || amount > 30) { + throw new Chat.ErrorMessage(`The minimum number of players must be between 1 and 30.`); + } + this.minPlayers = amount; + } + + setBlindMode(blind: boolean) { + if (this.state !== 'setup') { + throw new Chat.ErrorMessage(`You cannot toggle blind mode after the auction has started.`); + } + this.blindMode = blind; + if (blind) { + this.bidTimeLimit = 30; + } else { + this.bidTimeLimit = 10; + } + } + + importPlayers(data: string) { + if (this.state !== 'setup') { + throw new Chat.ErrorMessage(`You cannot import a player list after the auction has started.`); + } + const rows = data.replace('\r', '').split('\n'); + const tierNames = rows.shift()!.split('\t').slice(1); + const playerList: {[k: string]: Player} = {}; + for (const row of rows) { + const tiers = []; + const [name, ...tierData] = row.split('\t'); + for (let i = 0; i < tierData.length; i++) { + if (['y', 'Y', '\u2713', '\u2714'].includes(tierData[i].trim())) { + if (!tierNames[i]) throw new Chat.ErrorMessage(`Invalid tier data found in the pastebin.`); + if (tierNames[i].length > 30) throw new Chat.ErrorMessage(`Tier names must be 30 characters or less.`); + tiers.push(tierNames[i]); + } + } + if (name.length > 25) throw new Chat.ErrorMessage(`Player names must be 25 characters or less.`); + const player: Player = { + id: toID(name), + name, + price: 0, + }; + if (tiers.length) player.tiers = tiers; + playerList[player.id] = player; + } + this.playerList = playerList; + } + + addPlayerToAuction(name: string, tiers?: string[]) { + if (this.state !== 'setup' && this.state !== 'nom') { + throw new Chat.ErrorMessage(`You cannot add players to the auction right now.`); + } + if (name.length > 25) throw new Chat.ErrorMessage(`Player names must be 25 characters or less.`); + const player: Player = { + id: toID(name), + name, + price: 0, + }; + if (tiers?.length) { + if (tiers.some(tier => tier.length > 30)) { + throw new Chat.ErrorMessage(`Tier names must be 30 characters or less.`); + } + player.tiers = tiers; + } + this.playerList[player.id] = player; + return player; + } + + removePlayerFromAuction(name: string) { + if (this.state !== 'setup' && this.state !== 'nom') { + throw new Chat.ErrorMessage(`You cannot remove players from the auction right now.`); + } + const player = this.playerList[toID(name)]; + if (!player) throw new Chat.ErrorMessage(`Player "${name}" not found.`); + delete this.playerList[player.id]; + if (this.state !== 'setup' && !Object.values(this.playerList).filter(p => !p.team).length) { + this.end('The auction has ended because there are no players remaining in the draft pool.'); + } + return player; + } + + assignPlayer(name: string, teamName?: string) { + if (this.state !== 'setup' && this.state !== 'nom') { + throw new Chat.ErrorMessage(`You cannot assign players to a team right now.`); + } + const player = this.playerList[toID(name)]; + if (!player) throw new Chat.ErrorMessage(`Player "${name}" not found.`); + if (teamName) { + const team = this.teams[toID(teamName)]; + if (!team) throw new Chat.ErrorMessage(`Team "${teamName}" not found.`); + player.team = team; + if (!Object.values(this.playerList).filter(p => !p.team).length) { + return this.end('There are no players remaining in the draft pool, so the auction has ended.'); + } + } else { + delete player.team; + } + this.sendHTML(this.generateAuctionTable()); + } + + addTeam(name: string) { + if (this.state !== 'setup') throw new Chat.ErrorMessage(`You cannot add teams after the auction has started.`); + if (name.length > 40) throw new Chat.ErrorMessage(`Team names must be 40 characters or less.`); + const team = new Team(name, this); + this.teams[team.id] = team; + this.queue = Object.values(this.teams).map(toID).concat(Object.values(this.teams).map(toID).reverse()); + return team; + } + + removeTeam(name: string) { + if (this.state !== 'setup') throw new Chat.ErrorMessage(`You cannot remove teams after the auction has started.`); + const team = this.teams[toID(name)]; + if (!team) throw new Chat.ErrorMessage(`Team "${name}" not found.`); + this.queue = this.queue.filter(id => id !== team.id); + delete this.teams[team.id]; + return team; + } + + suspendTeam(name: string) { + if (this.state !== 'setup' && this.state !== 'nom') { + throw new Chat.ErrorMessage(`You cannot suspend teams right now.`); + } + const team = this.teams[toID(name)]; + if (!team) throw new Chat.ErrorMessage(`Team "${name}" not found.`); + if (team.suspended) throw new Chat.ErrorMessage(`Team ${name} is already suspended.`); + if (this.currentTeam === team) throw new Chat.ErrorMessage(`You cannot suspend the current nominating team.`); + team.suspended = true; + } + + unsuspendTeam(name: string) { + if (this.state !== 'setup' && this.state !== 'nom') { + throw new Chat.ErrorMessage(`You cannot unsuspend teams right now.`); + } + const team = this.teams[toID(name)]; + if (!team) throw new Chat.ErrorMessage(`Team "${name}" not found.`); + if (!team.suspended) throw new Chat.ErrorMessage(`Team ${name} is not suspended.`); + team.suspended = false; + } + + addManagers(teamName: string, managers: string[]) { + const team = this.teams[toID(teamName)]; + if (!team) throw new Chat.ErrorMessage(`Team "${teamName}" not found.`); + for (const manager of managers) { + const user = Users.get(manager); + if (!user) throw new Chat.ErrorMessage(`User "${manager}" not found.`); + team.managers.push(user.id); + } + } + + removeManagers(teamName: string, managers: string[]) { + const team = this.teams[toID(teamName)]; + if (!team) throw new Chat.ErrorMessage(`Team "${teamName}" not found.`); + for (const manager of managers) { + const managerIndex = team.managers.indexOf(toID(manager)); + if (managerIndex < 0) { + throw new Chat.ErrorMessage(`"${manager}" is not a manager of team ${team.name}.`); + } + team.managers.splice(managerIndex, 1); + } + } + + addCreditsToTeam(teamName: string, amount: number) { + if (this.state !== 'setup' && this.state !== 'nom') { + throw new Chat.ErrorMessage(`You cannot add credits to a team right now.`); + } + const team = this.teams[toID(teamName)]; + if (!team) throw new Chat.ErrorMessage(`Team "${teamName}" not found.`); + if (isNaN(amount) || amount % 500 !== 0) { + throw new Chat.ErrorMessage(`The amount of credits must be a multiple of 500.`); + } + const newCredits = team.credits + amount; + if (newCredits <= 0 || newCredits > 10000000) { + throw new Chat.ErrorMessage(`A team must have between 0 and 10,000,000 credits.`); + } + if (team.maxBid(newCredits) < this.minBid) { + throw new Chat.ErrorMessage(`A team must have enough credits to draft the minimum amount of players.`); + } + team.credits = newCredits; + } + + start() { + if (this.state !== 'setup') throw new Chat.ErrorMessage(`The auction has already been started.`); + if (Object.keys(this.teams).length < 2) throw new Chat.ErrorMessage(`The auction needs at least 2 teams to start.`); + const problemTeams = []; + for (const id in this.teams) { + const team = this.teams[id]; + if (team.maxBid() < this.minBid) problemTeams.push(team.name); + } + if (problemTeams.length) { + throw new Chat.ErrorMessage(`The following teams do not have enough credits to draft the minimum amount of players: ${problemTeams.join(', ')}`); + } + this.next(); + } + + reset() { + for (const id in this.teams) { + const team = this.teams[id]; + team.credits = this.startingCredits; + team.suspended = false; + for (const player of team.getPlayers()) { + delete player.team; + player.price = 0; + } + } + this.lastQueue = null; + this.queue = Object.values(this.teams).map(toID).concat(Object.values(this.teams).map(toID).reverse()); + this.clearTimer(); + this.state = 'setup'; + this.sendHTML(this.generateAuctionTable()); + } + + next() { + this.state = 'nom'; + if (!this.queue.filter(id => !this.teams[id].isSuspended()).length) { + return this.end('The auction has ended because there are no teams remaining that can draft players.'); + } + if (!Object.values(this.playerList).filter(p => !p.team).length) { + return this.end('The auction has ended because there are no players remaining in the draft pool.'); + } + do { + this.currentTeam = this.teams[this.queue.shift()!]; + this.queue.push(this.currentTeam.id); + } while (this.currentTeam.isSuspended()); + this.sendHTML(this.generateAuctionTable()); + this.sendMessage(`It is now **${this.currentTeam.name}**'s turn to nominate a player. Managers: ${this.currentTeam.managers.map(id => Users.get(id)?.name || id).join(', ')}`); + } + + nominate(user: User, target: string) { + if (this.state !== 'nom') throw new Chat.ErrorMessage(`You cannot nominate players right now.`); + if (!this.currentTeam.managers.includes(user.id)) this.checkOwner(user); + + // For undo + this.lastQueue = this.queue.slice(); + this.lastQueue.unshift(this.lastQueue.pop()!); + + const player = this.playerList[toID(target)]; + if (!player) throw new Chat.ErrorMessage(`${target} is not a valid player.`); + if (player.team) throw new Chat.ErrorMessage(`${player.name} has already been drafted.`); + this.currentNom = player; + this.state = 'bid'; + this.currentBid = this.minBid; + this.currentBidder = this.currentTeam; + this.sendMessage(`${user.name} from **${this.currentTeam.name}** has nominated **${player.name}** for auction. Use /bid to place a bid!`); + this.bidTimer = setInterval(() => this.pokeBidTimer(), 1000); + } + + bid(user: User, amount: number) { + if (this.state !== 'bid') throw new Chat.ErrorMessage(`There are no players up for auction right now.`); + const team = Object.values(this.teams).find(t => t.managers.includes(user.id)); + if (!team) throw new Chat.ErrorMessage(`Only managers can bid on players.`); + + if (amount < 500) amount *= 1000; + if (isNaN(amount) || amount % 500 !== 0) throw new Chat.ErrorMessage(`Your bid must be a multiple of 500.`); + if (amount > team.maxBid()) throw new Chat.ErrorMessage(`You cannot afford to bid that much.`); + + if (this.blindMode) { + if (this.bidsPlaced[team.id]) throw new Chat.ErrorMessage(`Your team has already placed a bid.`); + if (amount <= this.minBid) throw new Chat.ErrorMessage(`Your bid must be higher than the minimum bid.`); + this.bidsPlaced[team.id] = amount; + for (const manager of team.managers) { + Users.get(manager)?.sendTo(this.room, `Your team placed a bid of **${amount}** on **${this.currentNom}**.`); + } + if (amount > this.currentBid) { + this.currentBid = amount; + this.currentBidder = team; + } + if (Object.keys(this.bidsPlaced).length === Object.keys(this.teams).length) { + this.finishCurrentNom(); + } + } else { + if (amount <= this.currentBid) throw new Chat.ErrorMessage(`Your bid must be higher than the current bid.`); + this.currentBid = amount; + this.currentBidder = team; + this.sendMessage(`${user.name}[${team.name}]: **${amount}**`); + this.clearTimer(); + this.bidTimer = setInterval(() => this.pokeBidTimer(), 1000); + } + } + + finishCurrentNom() { + this.sendMessage(`**${this.currentBidder.name}** has bought **${this.currentNom.name}** for **${this.currentBid}** credits!`); + this.currentBidder.credits -= this.currentBid; + this.currentNom.team = this.currentBidder; + this.currentNom.price = this.currentBid; + this.clearTimer(); + this.next(); + } + + undoLastNom() { + if (this.state !== 'nom') throw new Chat.ErrorMessage(`You cannot undo a nomination right now.`); + if (!this.lastQueue) throw new Chat.ErrorMessage(`You cannot undo more than one nomination at a time.`); + this.queue = this.lastQueue; + this.lastQueue = null; + this.currentBidder.credits += this.currentBid; + delete this.currentNom.team; + this.next(); + } + + clearTimer() { + clearInterval(this.bidTimer); + this.bidTimeElapsed = 0; + } + + pokeBidTimer() { + this.bidTimeElapsed++; + const timeRemaining = this.bidTimeLimit - this.bidTimeElapsed; + if (timeRemaining === 0) { + this.finishCurrentNom(); + } else if (timeRemaining % 10 === 0 || timeRemaining === 5) { + this.sendMessage(`__${this.bidTimeLimit - this.bidTimeElapsed} seconds left!__`); + } + } + + end(message?: string) { + if (message) this.sendMessage(message); + this.sendHTML(this.generateAuctionTable()); + this.sendHTML(this.generatePriceList()); + this.destroy(); + } + + destroy() { + clearInterval(this.bidTimer); + super.destroy(); + } +} + +export const commands: Chat.ChatCommands = { + auction: { + create(target, room, user) { + room = this.requireRoom(); + this.checkCan('minigame', null, room); + if (room.game) return this.errorReply(`There is already a game of ${room.game.title} in progress in this room.`); + if (room.settings.auctionDisabled) return this.errorReply('Auctions are currently disabled in this room.'); + + let startingCredits; + if (target) { + startingCredits = parseInt(target); + if (startingCredits < 500) startingCredits *= 1000; + if ( + isNaN(startingCredits) || + startingCredits < 10000 || startingCredits > 10000000 || + startingCredits % 500 !== 0 + ) { + return this.errorReply(`Starting credits must be a multiple of 500 between 10,000 and 10,000,000.`); + } + } + this.addModAction(`An auction was created by ${user.name}.`); + this.modlog(`AUCTION CREATE`); + const auction = new Auction(room, startingCredits); + room.game = auction; + auction.addOwner(user); + }, + createhelp: [ + `/auction create [startingcredits] - Creates an auction. Requires: % @ # &`, + ], + start(target, room, user) { + room = this.requireRoom(); + const auction = this.requireGame(Auction); + auction.checkOwner(user); + + auction.start(); + this.addModAction(`The auction was started by ${user.name}.`); + this.modlog(`AUCTION START`); + }, + reset(target, room, user) { + room = this.requireRoom(); + const auction = this.requireGame(Auction); + auction.checkOwner(user); + + auction.reset(); + this.addModAction(`The auction was reset by ${user.name}.`); + this.modlog(`AUCTION RESET`); + }, + delete: 'end', + stop: 'end', + end(target, room, user) { + room = this.requireRoom(); + const auction = this.requireGame(Auction); + auction.checkOwner(user); + + auction.end('The auction was forcibly ended.'); + this.addModAction(`The auction was ended by ${user.name}.`); + this.modlog('AUCTION END'); + }, + info: 'display', + display(target, room, user) { + this.runBroadcast(); + const auction = this.requireGame(Auction); + this.sendReply(`|html|${auction.generateAuctionTable()}`); + }, + pricelist(target, room, user) { + this.runBroadcast(); + const auction = this.requireGame(Auction); + this.sendReply(`|html|${auction.generatePriceList()}`); + }, + minbid(target, room, user) { + room = this.requireRoom(); + const auction = this.requireGame(Auction); + auction.checkOwner(user); + + if (!target) return this.parse('/help auction minbid'); + const amount = parseInt(target); + auction.setMinBid(amount); + this.addModAction(`${user.name} set the minimum bid to ${amount}.`); + this.modlog('AUCTION MINBID', null, `${amount}`); + }, + minbidhelp: [ + `/auction minbid [amount] - Sets the minimum bid. Requires: # & auction owner`, + ], + minplayers(target, room, user) { + room = this.requireRoom(); + const auction = this.requireGame(Auction); + auction.checkOwner(user); + + if (!target) return this.parse('/help auction minplayers'); + const amount = parseInt(target); + auction.setMinPlayers(amount); + this.addModAction(`${user.name} set the minimum number of players to ${amount}.`); + }, + minplayershelp: [ + `/auction minplayers [amount] - Sets the minimum number of players. Requires: # & auction owner`, + ], + blindmode(target, room, user) { + room = this.requireRoom(); + const auction = this.requireGame(Auction); + auction.checkOwner(user); + + if (!target) return this.parse('/help auction blindmode'); + if (this.meansYes(target)) { + auction.setBlindMode(true); + this.addModAction(`${user.name} turned on blind mode.`); + } else if (this.meansNo(target)) { + auction.setBlindMode(false); + this.addModAction(`${user.name} turned off blind mode.`); + } + }, + blindmodehelp: [ + `/auction blindmode [on/off] - Enables or disables blind mode. Requires: # & auction owner`, + `When blind mode is enabled, teams may only place one bid per nomination and only the highest bid is revealed once the timer runs out or after all teams have placed a bid.`, + ], + async importplayers(target, room, user) { + room = this.requireRoom(); + const auction = this.requireGame(Auction); + auction.checkOwner(user); + + if (!target) return this.parse('/help auction importplayers'); + if (!/^https?:\/\/pastebin\.com\/[a-zA-Z0-9]+$/.test(target)) { + return this.errorReply('Invalid pastebin URL.'); + } + let data = ''; + try { + data = await Net(`https://pastebin.com/raw/${target.split('/').pop()}`).get(); + } catch {} + if (!data) return this.errorReply('Error fetching data from pastebin.'); + + auction.importPlayers(data); + this.addModAction(`${user.name} imported the player list from ${target}.`); + }, + importplayershelp: [ + `/auction importplayers [pastebin url] - Imports a list of players from a pastebin. Requires: # & auction owner`, + `The pastebin should be a list of tab-separated values with the first row containing tier names and subsequent rows containing the player names and a Y in the column corresponding to the tier.`, + `See https://pastebin.com/jPTbJBva for an example.`, + ], + addplayer(target, room, user) { + room = this.requireRoom(); + const auction = this.requireGame(Auction); + auction.checkOwner(user); + + if (!target) return this.parse('/help auction addplayer'); + const [name, ...tiers] = target.split(',').map(x => x.trim()); + const player = auction.addPlayerToAuction(name, tiers); + this.addModAction(`${user.name} added player ${player.name} to the auction.`); + }, + addplayerhelp: [ + `/auction addplayer [name], [tier1], [tier2], ... - Adds a player to the auction. Requires: # & auction owner`, + ], + removeplayer(target, room, user) { + room = this.requireRoom(); + const auction = this.requireGame(Auction); + auction.checkOwner(user); + + if (!target) return this.parse('/help auction removeplayer'); + const player = auction.removePlayerFromAuction(target); + this.addModAction(`${user.name} removed player ${player.name} from the auction.`); + }, + removeplayerhelp: [ + `/auction removeplayer [name] - Removes a player from the auction. Requires: # & auction owner`, + ], + assignplayer(target, room, user) { + if (!target) return this.parse('/help auction assignplayer'); + room = this.requireRoom(); + const auction = this.requireGame(Auction); + auction.checkOwner(user); + + const [player, team] = target.split(',').map(x => x.trim()); + if (team) { + auction.assignPlayer(player, team); + this.addModAction(`${user.name} assigned player ${player} to team ${team}.`); + } else { + auction.assignPlayer(player); + this.sendReply(`${user.name} returned player ${player} to draft pool.`); + } + }, + assignplayerhelp: [ + `/auction assignplayer [player], [team] - Assigns a player to a team. If team is blank, returns player to draft pool. Requires: # & auction owner`, + ], + addteam(target, room, user) { + room = this.requireRoom(); + const auction = this.requireGame(Auction); + auction.checkOwner(user); + + const [name, ...managers] = target.split(',').map(x => x.trim()); + if (!name) return this.parse('/help auction addteam'); + const team = auction.addTeam(name); + auction.addManagers(team.name, managers); + this.addModAction(`${user.name} added team ${team.name} to the auction.`); + }, + addteamhelp: [ + `/auction addteam [name], [manager1], [manager2], ... - Adds a team to the auction. Requires: # & auction owner`, + ], + removeteam(target, room, user) { + room = this.requireRoom(); + const auction = this.requireGame(Auction); + auction.checkOwner(user); + + if (!target) return this.parse('/help auction removeteam'); + const team = auction.removeTeam(target); + this.addModAction(`${user.name} removed team ${team.name} from the auction.`); + }, + removeteamhelp: [ + `/auction removeteam [team] - Removes a team from the auction. Requires: # & auction owner`, + ], + suspendteam(target, room, user) { + room = this.requireRoom(); + const auction = this.requireGame(Auction); + auction.checkOwner(user); + + if (!target) return this.parse('/help auction suspendteam'); + auction.suspendTeam(target); + const team = auction.teams[toID(target)]; + this.addModAction(`${user.name} suspended team ${team.name}.`); + }, + suspendteamhelp: [ + `/auction suspendteam [team] - Suspends a team from the auction. Requires: # & auction owner`, + ], + unsuspendteam(target, room, user) { + room = this.requireRoom(); + const auction = this.requireGame(Auction); + auction.checkOwner(user); + + if (!target) return this.parse('/help auction unsuspendteam'); + auction.unsuspendTeam(target); + const team = auction.teams[toID(target)]; + this.addModAction(`${user.name} unsuspended team ${team.name}.`); + }, + unsuspendteamhelp: [ + `/auction unsuspendteam [team] - Unsuspends a team from the auction. Requires: # & auction owner`, + ], + addmanager: 'addmanagers', + addmanagers(target, room, user) { + room = this.requireRoom(); + const auction = this.requireGame(Auction); + auction.checkOwner(user); + + const [teamName, ...managers] = target.split(',').map(x => x.trim()); + if (!teamName || !managers.length) return this.parse('/help auction addmanagers'); + auction.addManagers(teamName, managers); + const team = auction.teams[toID(teamName)]; + this.addModAction(`${user.name} added ${managers.map(id => Users.get(id)?.name || id).join(', ')} as managers to team ${team.name}.`); + }, + addmanagershelp: [ + `/auction addmanagers [team], [manager1], [manager2], ... - Adds managers to a team. Requires: # & auction owner`, + ], + removemanager: 'removemanagers', + removemanagers(target, room, user) { + room = this.requireRoom(); + const auction = this.requireGame(Auction); + auction.checkOwner(user); + + const [teamName, ...managers] = target.split(',').map(x => x.trim()); + if (!teamName || !managers.length) return this.parse('/help auction removemanagers'); + auction.removeManagers(teamName, managers); + const team = auction.teams[toID(teamName)]; + this.addModAction(`${user.name} removed ${managers.map(id => Users.get(id)?.name || id)} as managers from team ${team.name}.`); + }, + removemanagershelp: [ + `/auction removemanagers [team], [manager1], [manager2], ... - Removes managers from a team. Requires: # & auction owner`, + ], + addcredits(target, room, user) { + room = this.requireRoom(); + const auction = this.requireGame(Auction); + auction.checkOwner(user); + + const [teamName, amount] = target.split(',').map(x => x.trim()); + if (!teamName || !amount) return this.parse('/help auction addcredits'); + auction.addCreditsToTeam(teamName, parseInt(amount)); + const team = auction.teams[toID(teamName)]; + this.addModAction(`${user.name} added ${amount} credits to team ${team.name}.`); + }, + addcreditshelp: [ + `/auction addcredits [team], [amount] - Adds credits to a team. Requires: # & auction owner`, + ], + nom: 'nominate', + nominate(target, room, user) { + const auction = this.requireGame(Auction); + if (!target) return this.parse('/help auction nominate'); + auction.nominate(user, target); + }, + nominatehelp: [ + `/auction nominate OR /nom [player] - Nominates a player for auction.`, + ], + bid(target, room, user) { + const auction = this.requireGame(Auction); + if (!target) return this.parse('/help auction bid'); + auction.bid(user, parseFloat(target)); + }, + bidhelp: [ + `/auction bid OR /bid [amount] - Bids on a player for the specified amount. If the amount is less than 500, it will be multiplied by 1000.`, + ], + undo(target, room, user) { + room = this.requireRoom(); + const auction = this.requireGame(Auction); + auction.checkOwner(user); + + auction.undoLastNom(); + this.addModAction(`${user.name} undid the last nomination.`); + }, + disable(target, room, user) { + room = this.requireRoom(); + this.checkCan('gamemanagement', null, room); + if (room.settings.auctionDisabled) { + return this.errorReply('Auctions are already disabled.'); + } + room.settings.auctionDisabled = true; + room.saveSettings(); + this.sendReply('Auctions have been disabled for this room.'); + }, + enable(target, room, user) { + room = this.requireRoom(); + this.checkCan('gamemanagement', null, room); + if (!room.settings.auctionDisabled) { + return this.errorReply('Auctions are already enabled.'); + } + delete room.settings.auctionDisabled; + room.saveSettings(); + this.sendReply('Auctions have been enabled for this room.'); + }, + ongoing: 'running', + running(target, room, user) { + room = this.requireRoom(); + if (!this.runBroadcast()) return; + const runningAuctions = []; + for (const auctionRoom of Rooms.rooms.values()) { + const auction = auctionRoom.getGame(Auction); + if (!auction) continue; + runningAuctions.push(auctionRoom.title); + } + this.sendReply(`Running auctions: ${runningAuctions.join(', ') || 'None'}`); + }, + '': 'help', + help(target, room, user) { + this.parse('/help auction'); + }, + }, + auctionhelp(target, room, user) { + if (!this.runBroadcast()) return; + this.sendReplyBox( + `Auction commands
      ` + + `- create [startingcredits]: Creates an auction.
      ` + + `- start: Starts the auction.
      ` + + `- reset: Resets the auction.
      ` + + `- end: Ends the auction.
      ` + + `- running: Shows a list of rooms with running auctions.
      ` + + `- display: Displays the current state of the auction.
      ` + + `- pricelist: Displays the current prices of players by team.
      ` + + `- nom [player]: Nominates a player for auction.
      ` + + `- bid [amount]: Bids on a player for the specified amount. If the amount is less than 500, it will be multiplied by 1000.
      ` + + `You may use /bid and /nom directly without the /auction prefix.

      ` + + `
      Configuration Commands` + + `- minbid [amount]: Sets the minimum bid.
      ` + + `- minplayers [amount]: Sets the minimum number of players.
      ` + + `- blindmode [on/off]: Enables or disables blind mode.
      ` + + `- importplayers [pastebin url]: Imports a list of players from a pastebin.
      ` + + `- addplayer [name], [tier1], [tier2], ...: Adds a player to the auction.
      ` + + `- removeplayer [name]: Removes a player from the auction.
      ` + + `- assignplayer [player], [team]: Assigns a player to a team. If team is blank, returns player to draft pool.
      ` + + `- addteam [name], [manager1], [manager2], ...: Adds a team to the auction.
      ` + + `- removeteam [name]: Removes the given team from the auction.
      ` + + `- suspendteam [name]: Suspends the given team from the auction.
      ` + + `- unsuspendteam [name]: Unsuspends the given team from the auction.
      ` + + `- addmanagers [team], [manager1], [manager2], ...: Adds managers to a team.
      ` + + `- removemanagers [team], [manager1], [manager2], ...: Removes managers from a team.
      ` + + `- addcredits [team], [amount]: Adds credits to a team.
      ` + + `- undo: Undoes the last nomination.
      ` + + `- [enable/disable]: Enables or disables auctions from being started in a room.
      ` + + `
      ` + ); + }, + nom(target) { + this.parse(`/auction nominate ${target}`); + }, + bid(target) { + this.parse(`/auction bid ${target}`); + }, +}; + +export const roomSettings: Chat.SettingsHandler = room => ({ + label: "Auction", + permission: 'editroom', + options: [ + [`disabled`, room.settings.auctionDisabled || 'auction disable'], + [`enabled`, !room.settings.auctionDisabled || 'auction enable'], + ], +}); diff --git a/server/rooms.ts b/server/rooms.ts index 1914610df2ae..4b53568a4ca7 100644 --- a/server/rooms.ts +++ b/server/rooms.ts @@ -105,8 +105,8 @@ export interface RoomSettings { jeopardyDisabled?: boolean; mafiaDisabled?: boolean; unoDisabled?: boolean; - blackjackDisabled?: boolean; hangmanDisabled?: boolean; + auctionDisabled?: boolean; gameNumber?: number; highTraffic?: boolean; spotlight?: string; From 2a45189d240dea40eb2be79e8d5146e40dfc2366 Mon Sep 17 00:00:00 2001 From: gastlies Date: Sun, 7 Jul 2024 13:09:00 -0400 Subject: [PATCH 121/139] RBY: Move Ponyta, Tentacool, and Rhyhorn to ZU (#10394) https://www.smogon.com/forums/threads/rby-zu-hub.3732499/post-10076662 Ponyta, Tentacool, and Rhyhorn are all tiered B2 or higher on the ZU VR and should be tiered ZU as a result. --- data/mods/gen1/formats-data.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data/mods/gen1/formats-data.ts b/data/mods/gen1/formats-data.ts index 695af81fea49..1f32d735c070 100644 --- a/data/mods/gen1/formats-data.ts +++ b/data/mods/gen1/formats-data.ts @@ -213,7 +213,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat tier: "OU", }, tentacool: { - tier: "LC", + tier: "ZU", }, tentacruel: { tier: "UU", @@ -228,7 +228,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat tier: "UU", }, ponyta: { - tier: "LC", + tier: "ZU", }, rapidash: { tier: "PU", @@ -330,7 +330,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat tier: "ZU", }, rhyhorn: { - tier: "LC", + tier: "ZU", }, rhydon: { tier: "OU", From 6cca29573f3b354c9361cba3b2070ce07738155e Mon Sep 17 00:00:00 2001 From: shrianshChari <30420527+shrianshChari@users.noreply.github.com> Date: Sun, 7 Jul 2024 10:09:14 -0700 Subject: [PATCH 122/139] [Gen 5] BW1 OU: Ban Razor Fang (#10396) https://www.smogon.com/forums/threads/bw1-overused.3744853/ --- config/formats.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/formats.ts b/config/formats.ts index b715c035b339..b4da9b9b0716 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -3174,7 +3174,7 @@ export const Formats: import('../sim/dex-formats').FormatList = [ mod: 'gen5bw1', ruleset: ['Standard', 'Sleep Clause Mod', 'Swagger Clause', 'Baton Pass Stat Clause'], - banlist: ['Uber', 'Drizzle ++ Swift Swim', 'King\'s Rock', 'Soul Dew'], + banlist: ['Uber', 'Drizzle ++ Swift Swim', 'King\'s Rock', 'Razor Fang', 'Soul Dew'], }, { name: "[Gen 1] ZU", From 0a8051ff6fd305785d60a66551cb6447068daca6 Mon Sep 17 00:00:00 2001 From: shrianshChari <30420527+shrianshChari@users.noreply.github.com> Date: Sun, 7 Jul 2024 10:09:26 -0700 Subject: [PATCH 123/139] [Gen 5] BW1: Update tiers (#10393) Move Hydreigon and Toxicroak out of OU by technicality, since that is a distinction given to OU Pokemon after the generation had ended. --- data/mods/gen5bw1/formats-data.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/data/mods/gen5bw1/formats-data.ts b/data/mods/gen5bw1/formats-data.ts index bafde5f2109d..6b7fb16a1c21 100644 --- a/data/mods/gen5bw1/formats-data.ts +++ b/data/mods/gen5bw1/formats-data.ts @@ -41,6 +41,9 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat hippowdon: { tier: "UUBL", }, + toxicroak: { + tier: "OU", + }, snover: { tier: "UUBL", }, @@ -68,6 +71,9 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat mienshao: { tier: "OU", }, + hydreigon: { + tier: "OU", + }, virizion: { tier: "OU", }, From af772da565c298f7defb52ad404ceab59c4a1c7b Mon Sep 17 00:00:00 2001 From: Chessking345 <82059215+Chessking345@users.noreply.github.com> Date: Sun, 7 Jul 2024 13:11:29 -0400 Subject: [PATCH 124/139] National Dex BH: Ban Ceaseless Edge (#10395) * Update formats.ts * Update formats.ts --------- Co-authored-by: Kris Johnson <11083252+KrisXV@users.noreply.github.com> --- config/formats.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config/formats.ts b/config/formats.ts index b4da9b9b0716..f3363770347c 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -2437,9 +2437,9 @@ export const Formats: import('../sim/dex-formats').FormatList = [ 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', 'Arena Trap', - 'Contrary', 'Gorilla Tactics', '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', 'Chatter', 'Double Iron Bash', - 'Electrify', 'Last Respects', 'Octolock', 'Rage Fist', 'Revival Blessing', 'Shed Tail', 'Shell Smash', 'Comatose + Sleep Talk', 'Imprison + Transform', + 'Contrary', 'Gorilla Tactics', '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) { From 31a9206cfeb0e1bca5e2367ee2c66f4d3dcd533d Mon Sep 17 00:00:00 2001 From: shrianshChari <30420527+shrianshChari@users.noreply.github.com> Date: Mon, 8 Jul 2024 05:21:20 -0700 Subject: [PATCH 125/139] ZU: Update bans (#10400) https://www.smogon.com/forums/threads/np-zu-stage-10-down-with-the-king-alcremie-and-thwackey-banned-12.3745240/#post-10180512 --- data/formats-data.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/data/formats-data.ts b/data/formats-data.ts index 4a939b5daabd..f3bb6d294251 100644 --- a/data/formats-data.ts +++ b/data/formats-data.ts @@ -798,7 +798,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = tier: "LC", }, hitmonlee: { - tier: "ZUBL", + tier: "ZU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -1692,7 +1692,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = tier: "NFE", }, sceptile: { - tier: "ZUBL", + tier: "ZU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -4641,7 +4641,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = tier: "LC", }, thwackey: { - tier: "ZU", + tier: "ZUBL", doublesTier: "NFE", natDexTier: "NFE", }, @@ -4926,7 +4926,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = tier: "LC", }, alcremie: { - tier: "ZU", + tier: "ZUBL", doublesTier: "(DUU)", natDexTier: "RU", }, From 03d47f1af064f36c2bd9b46d8cecdab9804c91ed Mon Sep 17 00:00:00 2001 From: Bella <156557343+uhBella@users.noreply.github.com> Date: Mon, 8 Jul 2024 06:22:10 -0600 Subject: [PATCH 126/139] PU: Ban Raikou (#10401) Banned via council vote: https://www.smogon.com/forums/threads/pu-council-updates.3718204/post-10181057 --- data/formats-data.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/formats-data.ts b/data/formats-data.ts index f3bb6d294251..a227234d702b 100644 --- a/data/formats-data.ts +++ b/data/formats-data.ts @@ -1640,7 +1640,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = natDexTier: "RU", }, raikou: { - tier: "PU", + tier: "PUBL", doublesTier: "(DUU)", natDexTier: "RU", }, From 8aca3876523674e77b307fb1937b189c506bfacb Mon Sep 17 00:00:00 2001 From: Runo <105902454+Runoisch@users.noreply.github.com> Date: Mon, 8 Jul 2024 08:23:11 -0400 Subject: [PATCH 127/139] National Dex RU: Ban Haxorus (#10399) https://www.smogon.com/forums/threads/national-dex-ru-metagame-discussion.3713801/post-10180952 --- data/formats-data.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/formats-data.ts b/data/formats-data.ts index a227234d702b..9b6ea31be055 100644 --- a/data/formats-data.ts +++ b/data/formats-data.ts @@ -3470,7 +3470,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = haxorus: { tier: "RUBL", doublesTier: "(DUU)", - natDexTier: "RU", + natDexTier: "RUBL", }, cubchoo: { tier: "LC", From 708131a49d80c5074b5d7130220aa0cc60fe6fba Mon Sep 17 00:00:00 2001 From: Kaen <66154904+Seerd@users.noreply.github.com> Date: Mon, 8 Jul 2024 08:24:30 -0400 Subject: [PATCH 128/139] Shared Power: Update bans (#10398) https://www.smogon.com/forums/threads/shared-power-survey-post-461.3711011/page-19#post-10180866 --- config/formats.ts | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/config/formats.ts b/config/formats.ts index f3363770347c..e1e6ecaed00c 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -1083,12 +1083,11 @@ export const Formats: import('../sim/dex-formats').FormatList = [ mod: 'sharedpower', ruleset: ['Standard OMs', 'Evasion Abilities Clause', 'Evasion Items Clause', 'Sleep Moves Clause'], banlist: [ - 'Arceus', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Clefable', 'Deoxys-Base', 'Deoxys-Attack', 'Dondozo', 'Eternatus', 'Flutter Mane', 'Greninja', - 'Iron Crown', 'Kingambit', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Koraidon', 'Landorus-Base', 'Lunala', 'Magearna', 'Mewtwo', 'Miraidon', - 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Ogerpon-Hearthflame', 'Rayquaza', 'Regieleki', 'Reshiram', 'Shaymin-Sky', 'Spectrier', 'Terapagos', - 'Zacian', 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', 'Arena Trap', 'Chlorophyll', 'Moody', 'Neutralizing Gas', 'Regenerator', 'Shadow Tag', - 'Speed Boost', 'Stench', 'Swift Swim', 'Unburden', 'King\'s Rock', 'Leppa Berry', 'Razor Fang', 'Starf Berry', 'Baton Pass', 'Extreme Speed', - 'Last Respects', + 'Arceus', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Clefable', 'Deoxys-Base', 'Deoxys-Attack', 'Eternatus', 'Flutter Mane', 'Greninja', 'Iron Crown', + 'Kingambit', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Koraidon', 'Landorus-Base', 'Lunala', 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', + 'Necrozma-Dusk-Mane', 'Ogerpon-Hearthflame', 'Rayquaza', 'Regieleki', 'Reshiram', 'Shaymin-Sky', 'Spectrier', 'Terapagos', 'Zacian', 'Zacian-Crowned', + 'Zamazenta-Crowned', 'Zekrom', 'Arena Trap', 'Chlorophyll', 'Moody', 'Neutralizing Gas', 'Regenerator', 'Shadow Tag', 'Speed Boost', 'Stench', + 'Swift Swim', 'Unburden', '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: [ From f84b1515d0b157dad6119f9f66901591b3817a6a Mon Sep 17 00:00:00 2001 From: Leonard Craft III Date: Mon, 8 Jul 2024 18:18:39 -0500 Subject: [PATCH 129/139] Fix Aurora Veil's description --- data/text/moves.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/text/moves.ts b/data/text/moves.ts index 8004ccca2c9d..f0488ee7e26c 100644 --- a/data/text/moves.ts +++ b/data/text/moves.ts @@ -293,7 +293,7 @@ export const MovesText: {[id: IDEntry]: MoveText} = { }, auroraveil: { name: "Aurora Veil", - desc: "For 5 turns, the user and its party members take 0.5x damage from physical and special attacks, or 0.66x damage if in a Double Battle; does not reduce damage further with Reflect or Light Screen. Critical hits ignore this protection. It is removed from the user's side if the user or an ally is successfully hit by Brick Break, Psychic Fangs, or Defog. Brick Break and Psychic Fangs remove the effect before damage is calculated. Lasts for 8 turns if the user is holding Light Clay. Fails unless the weather is Hail.", + desc: "For 5 turns, the user and its party members take 0.5x damage from physical and special attacks, or 0.66x damage if in a Double Battle; does not reduce damage further with Reflect or Light Screen. Critical hits ignore this protection. It is removed from the user's side if the user or an ally is successfully hit by Brick Break, Psychic Fangs, or Defog. Brick Break and Psychic Fangs remove the effect before damage is calculated. Lasts for 8 turns if the user is holding Light Clay. Fails unless the weather is Snow.", shortDesc: "For 5 turns, damage to allies halved. Snow only.", gen8: { desc: "For 5 turns, the user and its party members take 0.5x damage from physical and special attacks, or 0.66x damage if in a Double Battle; does not reduce damage further with Reflect or Light Screen. Critical hits ignore this protection. It is removed from the user's side if the user or an ally is successfully hit by Brick Break, Psychic Fangs, or Defog. Brick Break and Psychic Fangs remove the effect before damage is calculated. Lasts for 8 turns if the user is holding Light Clay. Fails unless the weather is Hail.", From 29f3fa6b3c2b14dbf38c85ee17382be0e53126c8 Mon Sep 17 00:00:00 2001 From: shrianshChari <30420527+shrianshChari@users.noreply.github.com> Date: Mon, 8 Jul 2024 16:45:39 -0700 Subject: [PATCH 130/139] [Gen 5] BW1: Fix legality of Gen 2/4 cover legendary HAs (#10403) --- data/mods/gen5bw1/pokedex.ts | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/data/mods/gen5bw1/pokedex.ts b/data/mods/gen5bw1/pokedex.ts index af4fa84a0409..b574c05cccd2 100644 --- a/data/mods/gen5bw1/pokedex.ts +++ b/data/mods/gen5bw1/pokedex.ts @@ -63,6 +63,14 @@ export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable inherit: true, unreleasedHidden: true, }, + lugia: { + inherit: true, + unreleasedHidden: true, + }, + hooh: { + inherit: true, + unreleasedHidden: true, + }, wurmple: { inherit: true, unreleasedHidden: true, @@ -187,6 +195,18 @@ export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable inherit: true, unreleasedHidden: true, }, + dialga: { + inherit: true, + unreleasedHidden: true, + }, + palkia: { + inherit: true, + unreleasedHidden: true, + }, + giratina: { + inherit: true, + unreleasedHidden: true, + }, patrat: { inherit: true, unreleasedHidden: true, From dff9583500a12fe39371f0bea58e8398f80aa123 Mon Sep 17 00:00:00 2001 From: Karthik Bandagonda <32044378+Karthik99999@users.noreply.github.com> Date: Mon, 8 Jul 2024 20:12:01 -0400 Subject: [PATCH 131/139] Auctions: Formatting changes and QoL additions (#10397) --- server/chat-plugins/auction.ts | 135 +++++++++++++++++++++------------ 1 file changed, 86 insertions(+), 49 deletions(-) diff --git a/server/chat-plugins/auction.ts b/server/chat-plugins/auction.ts index cacb3309c8a6..aacea3998737 100644 --- a/server/chat-plugins/auction.ts +++ b/server/chat-plugins/auction.ts @@ -15,22 +15,39 @@ interface Player { tiers?: string[]; } +interface Manager { + id: ID; + team: Team; +} + class Team { id: ID; name: string; credits: number; - managers: string[]; suspended: boolean; private auction: Auction; constructor(name: string, auction: Auction) { this.id = toID(name); this.name = name; this.credits = auction.startingCredits; - this.managers = []; this.suspended = false; this.auction = auction; } + getManagerNames() { + const managers = []; + for (const id in this.auction.managers) { + if (this.auction.managers[id].team !== this) continue; + const user = Users.getExact(id); + if (user) { + managers.push(user.name); + } else { + managers.push(id); + } + } + return managers; + } + getPlayers() { const players = []; for (const id in this.auction.playerList) { @@ -51,9 +68,10 @@ class Team { export class Auction extends Rooms.SimpleRoomGame { override readonly gameid = 'auction' as ID; + owners: {[k: string]: string}; teams: {[k: string]: Team}; + managers: {[k: string]: Manager}; playerList: {[k: string]: Player}; - owners: {[k: string]: string}; startingCredits: number; minBid: number; @@ -77,9 +95,10 @@ export class Auction extends Rooms.SimpleRoomGame { constructor(room: Room, startingCredits = 100000) { super(room); this.title = `Auction (${room.title})`; + this.owners = {}; this.teams = {}; + this.managers = {}; this.playerList = {}; - this.owners = {}; this.startingCredits = startingCredits; this.minBid = 3000; @@ -97,11 +116,11 @@ export class Auction extends Rooms.SimpleRoomGame { } sendMessage(message: string) { - this.room.add(`|c:|${Math.floor(Date.now() / 1000)}|&|${message}`).update(); + this.room.add(`|c|&|${message}`).update(); } - sendHTML(message: string) { - this.room.add(`|html|${message}`).update(); + sendHTMLBox(htmlContent: string, uhtml?: string) { + this.room.add(`|${uhtml ? `uhtml|${uhtml}` : 'html'}|
      ${htmlContent}
      `).update(); } checkOwner(user: User) { @@ -136,26 +155,26 @@ export class Auction extends Rooms.SimpleRoomGame { } generatePriceList() { - const draftedPlayers = Object.values(this.playerList).filter(p => p.team).sort((a, b) => b.price - a.price); - let buf = `
      `; + const draftedPlayers = Utils.sortBy(Object.values(this.playerList).filter(p => p.team), p => -p.price); + let buf = ''; for (const id in this.teams) { const team = this.teams[id]; buf += `
      ${Utils.escapeHTML(team.name)}`; for (const player of draftedPlayers.filter(p => p.team === team)) { buf += ``; } - buf += `
      ${Utils.escapeHTML(player.name)}${player.price}

      `; + buf += `

    `; } buf += `
    All`; for (const player of draftedPlayers) { buf += ``; } - buf += `
    ${Utils.escapeHTML(player.name)}${player.price}
    `; + buf += ``; return buf; } generateAuctionTable() { - let buf = `
    `; + let buf = `
    OrderTeamsCreditsPlayers
    `; const queue = this.queue.filter(id => !this.teams[id].isSuspended()); buf += Object.values(this.teams).map(team => { const players = team.getPlayers(); @@ -166,15 +185,15 @@ export class Auction extends Rooms.SimpleRoomGame { } let row = ``; row += ``; - row += ``; - row += ``; + row += ``; + row += ``; row += ``; row += ``; return row; }).join(''); buf += `
    OrderTeamsCreditsPlayers
    ${i1 > 0 ? i1 : '-'}${i2 > 0 ? i2 : '-'}${Utils.escapeHTML(team.name)}
    ${this.generateUsernameList(team.managers.map(id => Users.get(id)?.name || id), 2, true)}
    ${team.credits.toLocaleString()}${team.maxBid() >= this.minBid ? `
    Max bid: ${team.maxBid().toLocaleString()}` : ''}
    ${Utils.escapeHTML(team.name)}
    ${this.generateUsernameList(team.getManagerNames(), 2, true)}
    ${team.credits.toLocaleString()}${team.maxBid() >= this.minBid ? `
    Max bid: ${team.maxBid().toLocaleString()}` : ''}
    ${players.length}${this.generateUsernameList(players)}
    `; - const remainingPlayers = Object.values(this.playerList).filter(p => !p.team); + const remainingPlayers = Utils.sortBy(Object.values(this.playerList).filter(p => !p.team), p => p.name); const tierArrays: {[k: string]: Player[]} = {}; for (const player of remainingPlayers) { if (!player.tiers?.length) continue; @@ -191,12 +210,23 @@ export class Auction extends Rooms.SimpleRoomGame { for (const tier of sortedTiers) { buf += `
  • ${Utils.escapeHTML(tier)} (${tierArrays[tier].length})${this.generateUsernameList(tierArrays[tier])}
  • `; } - buf += ``; + buf += ``; } else { buf += `
    Remaining Players (${remainingPlayers.length})${this.generateUsernameList(remainingPlayers)}
    `; } - buf += `
    `; + buf += `
    Auction Settings`; + buf += `- Minimum bid: ${this.minBid.toLocaleString()}
    `; + buf += `- Minimum players per team: ${this.minPlayers}
    `; + buf += `- Blind mode: ${this.blindMode ? 'On' : 'Off'}
    `; + buf += `
    `; + return buf; + } + generateBidInfo() { + let buf = `Player: ${Utils.escapeHTML(this.currentNom.name)} `; + buf += `Top bid: ${this.currentBid} `; + buf += `Top bidder: ${Utils.escapeHTML(this.currentBidder.name)} `; + buf += `Tiers: ${this.currentNom.tiers?.length ? `${Utils.escapeHTML(this.currentNom.tiers.join(', '))}` : 'N/A'}`; return buf; } @@ -311,7 +341,7 @@ export class Auction extends Rooms.SimpleRoomGame { } else { delete player.team; } - this.sendHTML(this.generateAuctionTable()); + this.sendHTMLBox(this.generateAuctionTable()); } addTeam(name: string) { @@ -357,21 +387,20 @@ export class Auction extends Rooms.SimpleRoomGame { const team = this.teams[toID(teamName)]; if (!team) throw new Chat.ErrorMessage(`Team "${teamName}" not found.`); for (const manager of managers) { - const user = Users.get(manager); + const user = Users.getExact(manager); if (!user) throw new Chat.ErrorMessage(`User "${manager}" not found.`); - team.managers.push(user.id); + if (!this.managers[user.id]) { + this.managers[user.id] = {id: user.id, team}; + } else { + this.managers[user.id].team = team; + } } } - removeManagers(teamName: string, managers: string[]) { - const team = this.teams[toID(teamName)]; - if (!team) throw new Chat.ErrorMessage(`Team "${teamName}" not found.`); + removeManagers(managers: string[]) { for (const manager of managers) { - const managerIndex = team.managers.indexOf(toID(manager)); - if (managerIndex < 0) { - throw new Chat.ErrorMessage(`"${manager}" is not a manager of team ${team.name}.`); - } - team.managers.splice(managerIndex, 1); + if (!this.managers[toID(manager)]) throw new Chat.ErrorMessage(`Manager "${manager}" not found`); + delete this.managers[toID(manager)]; } } @@ -422,7 +451,7 @@ export class Auction extends Rooms.SimpleRoomGame { this.queue = Object.values(this.teams).map(toID).concat(Object.values(this.teams).map(toID).reverse()); this.clearTimer(); this.state = 'setup'; - this.sendHTML(this.generateAuctionTable()); + this.sendHTMLBox(this.generateAuctionTable()); } next() { @@ -437,13 +466,13 @@ export class Auction extends Rooms.SimpleRoomGame { this.currentTeam = this.teams[this.queue.shift()!]; this.queue.push(this.currentTeam.id); } while (this.currentTeam.isSuspended()); - this.sendHTML(this.generateAuctionTable()); - this.sendMessage(`It is now **${this.currentTeam.name}**'s turn to nominate a player. Managers: ${this.currentTeam.managers.map(id => Users.get(id)?.name || id).join(', ')}`); + this.sendHTMLBox(this.generateAuctionTable()); + this.sendMessage(`It is now **${this.currentTeam.name}**'s turn to nominate a player. Managers: ${Chat.toListString(this.currentTeam.getManagerNames())}`); } nominate(user: User, target: string) { if (this.state !== 'nom') throw new Chat.ErrorMessage(`You cannot nominate players right now.`); - if (!this.currentTeam.managers.includes(user.id)) this.checkOwner(user); + if (!this.managers[user.id]) this.checkOwner(user); // For undo this.lastQueue = this.queue.slice(); @@ -456,13 +485,14 @@ export class Auction extends Rooms.SimpleRoomGame { this.state = 'bid'; this.currentBid = this.minBid; this.currentBidder = this.currentTeam; - this.sendMessage(`${user.name} from **${this.currentTeam.name}** has nominated **${player.name}** for auction. Use /bid to place a bid!`); + this.sendMessage(`${user.name}${this.managers[user.id]?.team === this.currentTeam ? ` from **${this.currentTeam.name}**` : ''} has nominated **${player.name}** for auction. Use /bid to place a bid!`); + if (!this.blindMode) this.sendHTMLBox(this.generateBidInfo(), 'bid'); this.bidTimer = setInterval(() => this.pokeBidTimer(), 1000); } bid(user: User, amount: number) { if (this.state !== 'bid') throw new Chat.ErrorMessage(`There are no players up for auction right now.`); - const team = Object.values(this.teams).find(t => t.managers.includes(user.id)); + const team = this.managers[user.id]?.team; if (!team) throw new Chat.ErrorMessage(`Only managers can bid on players.`); if (amount < 500) amount *= 1000; @@ -473,8 +503,10 @@ export class Auction extends Rooms.SimpleRoomGame { if (this.bidsPlaced[team.id]) throw new Chat.ErrorMessage(`Your team has already placed a bid.`); if (amount <= this.minBid) throw new Chat.ErrorMessage(`Your bid must be higher than the minimum bid.`); this.bidsPlaced[team.id] = amount; - for (const manager of team.managers) { - Users.get(manager)?.sendTo(this.room, `Your team placed a bid of **${amount}** on **${this.currentNom}**.`); + for (const id in this.managers) { + if (this.managers[id].team === team) { + Users.getExact(id)?.sendTo(this.room, `Your team placed a bid of **${amount}** on **${this.currentNom}**.`); + } } if (amount > this.currentBid) { this.currentBid = amount; @@ -488,6 +520,7 @@ export class Auction extends Rooms.SimpleRoomGame { this.currentBid = amount; this.currentBidder = team; this.sendMessage(`${user.name}[${team.name}]: **${amount}**`); + this.sendHTMLBox(this.generateBidInfo(), 'bid'); this.clearTimer(); this.bidTimer = setInterval(() => this.pokeBidTimer(), 1000); } @@ -509,6 +542,7 @@ export class Auction extends Rooms.SimpleRoomGame { this.lastQueue = null; this.currentBidder.credits += this.currentBid; delete this.currentNom.team; + this.currentNom.price = 0; this.next(); } @@ -528,9 +562,9 @@ export class Auction extends Rooms.SimpleRoomGame { } end(message?: string) { + this.sendHTMLBox(this.generateAuctionTable()); + this.sendHTMLBox(this.generatePriceList()); if (message) this.sendMessage(message); - this.sendHTML(this.generateAuctionTable()); - this.sendHTML(this.generatePriceList()); this.destroy(); } @@ -594,7 +628,7 @@ export const commands: Chat.ChatCommands = { const auction = this.requireGame(Auction); auction.checkOwner(user); - auction.end('The auction was forcibly ended.'); + auction.end(); this.addModAction(`The auction was ended by ${user.name}.`); this.modlog('AUCTION END'); }, @@ -602,12 +636,12 @@ export const commands: Chat.ChatCommands = { display(target, room, user) { this.runBroadcast(); const auction = this.requireGame(Auction); - this.sendReply(`|html|${auction.generateAuctionTable()}`); + this.sendReplyBox(auction.generateAuctionTable()); }, pricelist(target, room, user) { this.runBroadcast(); const auction = this.requireGame(Auction); - this.sendReply(`|html|${auction.generatePriceList()}`); + this.sendReplyBox(auction.generatePriceList()); }, minbid(target, room, user) { room = this.requireRoom(); @@ -782,7 +816,7 @@ export const commands: Chat.ChatCommands = { if (!teamName || !managers.length) return this.parse('/help auction addmanagers'); auction.addManagers(teamName, managers); const team = auction.teams[toID(teamName)]; - this.addModAction(`${user.name} added ${managers.map(id => Users.get(id)?.name || id).join(', ')} as managers to team ${team.name}.`); + this.addModAction(`${user.name} added ${Chat.toListString(managers.map(m => Users.getExact(m)!.name))} as manager${Chat.plural(managers.length)} for team ${team.name}.`); }, addmanagershelp: [ `/auction addmanagers [team], [manager1], [manager2], ... - Adds managers to a team. Requires: # & auction owner`, @@ -793,14 +827,13 @@ export const commands: Chat.ChatCommands = { const auction = this.requireGame(Auction); auction.checkOwner(user); - const [teamName, ...managers] = target.split(',').map(x => x.trim()); - if (!teamName || !managers.length) return this.parse('/help auction removemanagers'); - auction.removeManagers(teamName, managers); - const team = auction.teams[toID(teamName)]; - this.addModAction(`${user.name} removed ${managers.map(id => Users.get(id)?.name || id)} as managers from team ${team.name}.`); + const [...managers] = target.split(',').map(x => x.trim()); + if (!managers.length) return this.parse('/help auction removemanagers'); + auction.removeManagers(managers); + this.addModAction(`${user.name} removed ${Chat.toListString(managers.map(m => Users.getExact(m)!.name))} as manager${Chat.plural(managers.length)}.`); }, removemanagershelp: [ - `/auction removemanagers [team], [manager1], [manager2], ... - Removes managers from a team. Requires: # & auction owner`, + `/auction removemanagers [manager1], [manager2], ... - Removes managers. Requires: # & auction owner`, ], addcredits(target, room, user) { room = this.requireRoom(); @@ -905,7 +938,7 @@ export const commands: Chat.ChatCommands = { `- suspendteam [name]: Suspends the given team from the auction.
    ` + `- unsuspendteam [name]: Unsuspends the given team from the auction.
    ` + `- addmanagers [team], [manager1], [manager2], ...: Adds managers to a team.
    ` + - `- removemanagers [team], [manager1], [manager2], ...: Removes managers from a team.
    ` + + `- removemanagers [manager1], [manager2], ...: Removes managers.
    ` + `- addcredits [team], [amount]: Adds credits to a team.
    ` + `- undo: Undoes the last nomination.
    ` + `- [enable/disable]: Enables or disables auctions from being started in a room.
    ` + @@ -918,6 +951,10 @@ export const commands: Chat.ChatCommands = { bid(target) { this.parse(`/auction bid ${target}`); }, + overpay() { + this.requireGame(Auction); + return '/announce OVERPAY!'; + }, }; export const roomSettings: Chat.SettingsHandler = room => ({ From 8ed5f1f2ca1173bb4b222bc39bbda1446bfeea0e Mon Sep 17 00:00:00 2001 From: Leonard Craft III Date: Mon, 8 Jul 2024 19:20:26 -0500 Subject: [PATCH 132/139] Fix /statcalc with invalid levels --- server/chat-commands/info.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/server/chat-commands/info.ts b/server/chat-commands/info.ts index e7ca0c88790d..c460d718deb3 100644 --- a/server/chat-commands/info.ts +++ b/server/chat-commands/info.ts @@ -1316,8 +1316,11 @@ export const commands: Chat.ChatCommands = { } else if (lowercase.startsWith('lv') || lowercase.startsWith('level')) { level = parseInt(arg.replace(/\D/g, '')); lvlSet = true; + if (isNaN(level)) { + return this.sendReplyBox('Invalid value for level: ' + Utils.escapeHTML(arg)); + } if (level < 1 || level > 9999) { - return this.sendReplyBox('Invalid value for level: ' + level); + return this.sendReplyBox('Level should be between 1 and 9999.'); } continue; } From ce760e939c03b81d710634e3496b050f74047a4d Mon Sep 17 00:00:00 2001 From: dot-Comfey <84290266+dot-Comfey@users.noreply.github.com> Date: Tue, 9 Jul 2024 16:00:18 -0700 Subject: [PATCH 133/139] Fix crash in egg move sources (#10406) --- sim/team-validator.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/sim/team-validator.ts b/sim/team-validator.ts index 1b2eb840df70..cb535e52f415 100644 --- a/sim/team-validator.ts +++ b/sim/team-validator.ts @@ -2431,8 +2431,13 @@ export class TeamValidator { } } - const formeCantInherit = checkingPrevo && !originalSpecies.prevo && - (!originalSpecies.changesFrom || originalSpecies.name === "Greninja-Ash"); + let formeCantInherit = false; + let nextSpecies = dex.species.learnsetParent(baseSpecies); + while (nextSpecies) { + if (nextSpecies.name === species.name) break; + nextSpecies = dex.species.learnsetParent(nextSpecies); + } + if (checkingPrevo && !nextSpecies) formeCantInherit = true; if (formeCantInherit && dex.gen < 9) break; let sources = learnset[moveid] || []; From fc220959286db843c171182a8aecd9c112b0a32b Mon Sep 17 00:00:00 2001 From: Leonard Craft III Date: Tue, 9 Jul 2024 18:05:00 -0500 Subject: [PATCH 134/139] Crazyhouse: Properly escape usernames (#10404) --- data/mods/partnersincrime/scripts.ts | 4 +++- data/mods/trademarked/scripts.ts | 4 +++- sim/battle.ts | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/data/mods/partnersincrime/scripts.ts b/data/mods/partnersincrime/scripts.ts index 14d63565d953..60fbc2d305c9 100644 --- a/data/mods/partnersincrime/scripts.ts +++ b/data/mods/partnersincrime/scripts.ts @@ -1,3 +1,5 @@ +import {Utils} from '../../../lib'; + export const Scripts: ModdedBattleScriptsData = { gen: 9, inherit: 'gen9', @@ -201,7 +203,7 @@ export const Scripts: ModdedBattleScriptsData = { // Please remove me once there is client support. if (this.ruleTable.has('crazyhouserule')) { for (const side of this.sides) { - let buf = `raw|${side.name}'s team:
    `; + let buf = `raw|${Utils.escapeHTML(side.name)}'s team:
    `; for (const pokemon of side.pokemon) { if (!buf.endsWith('
    ')) buf += '/​'; if (pokemon.fainted) { diff --git a/data/mods/trademarked/scripts.ts b/data/mods/trademarked/scripts.ts index 573590df3810..c0533b79e71e 100644 --- a/data/mods/trademarked/scripts.ts +++ b/data/mods/trademarked/scripts.ts @@ -1,3 +1,5 @@ +import {Utils} from '../../../lib'; + export const Scripts: ModdedBattleScriptsData = { gen: 9, inherit: 'gen9', @@ -182,7 +184,7 @@ export const Scripts: ModdedBattleScriptsData = { // Please remove me once there is client support. if (this.ruleTable.has('crazyhouserule')) { for (const side of this.sides) { - let buf = `raw|${side.name}'s team:
    `; + let buf = `raw|${Utils.escapeHTML(side.name)}'s team:
    `; for (const pokemon of side.pokemon) { if (!buf.endsWith('
    ')) buf += '/​'; if (pokemon.fainted) { diff --git a/sim/battle.ts b/sim/battle.ts index a6897f6cb747..3a464b7d9252 100644 --- a/sim/battle.ts +++ b/sim/battle.ts @@ -1613,7 +1613,7 @@ export class Battle { // Please remove me once there is client support. if (this.ruleTable.has('crazyhouserule')) { for (const side of this.sides) { - let buf = `raw|${side.name}'s team:
    `; + let buf = `raw|${Utils.escapeHTML(side.name)}'s team:
    `; for (const pokemon of side.pokemon) { if (!buf.endsWith('
    ')) buf += '/​'; if (pokemon.fainted) { From f3d3ef5955f9cf6306c9ec5413a163a5498560bf Mon Sep 17 00:00:00 2001 From: Leonard Craft III Date: Tue, 9 Jul 2024 19:09:14 -0500 Subject: [PATCH 135/139] Remove underperforming ladders --- config/formats.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config/formats.ts b/config/formats.ts index e1e6ecaed00c..41ed7ddb2b05 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -467,6 +467,7 @@ export const Formats: import('../sim/dex-formats').FormatList = [ ], mod: 'gen9', + searchShow: false, ruleset: ['Standard NatDex', 'OHKO Clause', 'Evasion Moves Clause', 'Evasion Items Clause', 'Species Clause', 'Sleep Clause Mod', 'Terastal Clause', 'Z-Move Clause'], banlist: ['Dewpider', 'Diglett-Alola', 'Flittle', 'Nidoran-M', 'Smeargle', 'Wattrel', 'Wingull', 'Wishiwashi', 'Zigzagoon-Base', 'Arena Trap', 'Huge Power', 'Moody', 'Pure Power', 'Shadow Tag', 'Baton Pass'], onBegin() { @@ -490,6 +491,7 @@ export const Formats: import('../sim/dex-formats').FormatList = [ ], mod: 'moderngen2', + searchShow: false, ruleset: ['Standard', 'Useless Items Clause', 'Useless Moves Clause', 'MG2 Mod', 'Sleep Moves Clause', '+No Ability', '-All Abilities'], banlist: ['AG', 'Uber', 'Fake Out', 'Shell Smash', 'Last Respects', 'Baton Pass', 'Alakazite', 'Soul Dew'], }, From f94d6a3b4bde033bfda24c26de590ee75480b717 Mon Sep 17 00:00:00 2001 From: Mia <49593536+mia-pi-git@users.noreply.github.com> Date: Wed, 10 Jul 2024 10:49:21 -0500 Subject: [PATCH 136/139] Youtube: Add french/arcade rooms to groupwatch whitelist --- server/chat-plugins/youtube.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/server/chat-plugins/youtube.ts b/server/chat-plugins/youtube.ts index 78cf21258ede..91668b8777d6 100644 --- a/server/chat-plugins/youtube.ts +++ b/server/chat-plugins/youtube.ts @@ -10,7 +10,9 @@ import {Utils, FS, Net} from '../../lib'; const ROOT = 'https://www.googleapis.com/youtube/v3/'; const STORAGE_PATH = 'config/chat-plugins/youtube.json'; -const GROUPWATCH_ROOMS = ['youtube', 'pokemongames', 'videogames', 'smashbros', 'pokemongo', 'hindi']; +const GROUPWATCH_ROOMS = [ + 'youtube', 'pokemongames', 'videogames', 'smashbros', 'pokemongo', 'hindi', 'franais', 'arcade' +]; export const videoDataCache: Map = Chat.oldPlugins.youtube?.videoDataCache || new Map(); export const searchDataCache: Map = Chat.oldPlugins.youtube?.searchDataCache || new Map(); From 0f6bc1734704ec7343af1c8b711460d8e4b2663d Mon Sep 17 00:00:00 2001 From: Mia <49593536+mia-pi-git@users.noreply.github.com> Date: Wed, 10 Jul 2024 10:49:35 -0500 Subject: [PATCH 137/139] Fix typo Forgot to run git add again. --- server/chat-plugins/youtube.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/chat-plugins/youtube.ts b/server/chat-plugins/youtube.ts index 91668b8777d6..d92c9c17f36d 100644 --- a/server/chat-plugins/youtube.ts +++ b/server/chat-plugins/youtube.ts @@ -11,7 +11,7 @@ import {Utils, FS, Net} from '../../lib'; const ROOT = 'https://www.googleapis.com/youtube/v3/'; const STORAGE_PATH = 'config/chat-plugins/youtube.json'; const GROUPWATCH_ROOMS = [ - 'youtube', 'pokemongames', 'videogames', 'smashbros', 'pokemongo', 'hindi', 'franais', 'arcade' + 'youtube', 'pokemongames', 'videogames', 'smashbros', 'pokemongo', 'hindi', 'franais', 'arcade', ]; export const videoDataCache: Map = Chat.oldPlugins.youtube?.videoDataCache || new Map(); From 0b993892179d444323497360bf58edbaa0f2c851 Mon Sep 17 00:00:00 2001 From: Karthik Bandagonda <32044378+Karthik99999@users.noreply.github.com> Date: Thu, 11 Jul 2024 00:16:05 +0000 Subject: [PATCH 138/139] Auctions: Fix blind mode (#10411) --- server/chat-plugins/auction.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/server/chat-plugins/auction.ts b/server/chat-plugins/auction.ts index aacea3998737..fd4ce4d7f3db 100644 --- a/server/chat-plugins/auction.ts +++ b/server/chat-plugins/auction.ts @@ -90,7 +90,7 @@ export class Auction extends Rooms.SimpleRoomGame { currentBid: number; currentBidder: Team; /** Used for blind mode */ - bidsPlaced: {[k: string]: number}; + bidsPlaced: Set; state: 'setup' | 'nom' | 'bid' = 'setup'; constructor(room: Room, startingCredits = 100000) { super(room); @@ -112,7 +112,7 @@ export class Auction extends Rooms.SimpleRoomGame { this.currentNom = null!; this.currentBid = 0; this.currentBidder = null!; - this.bidsPlaced = {}; + this.bidsPlaced = new Set(); } sendMessage(message: string) { @@ -500,9 +500,9 @@ export class Auction extends Rooms.SimpleRoomGame { if (amount > team.maxBid()) throw new Chat.ErrorMessage(`You cannot afford to bid that much.`); if (this.blindMode) { - if (this.bidsPlaced[team.id]) throw new Chat.ErrorMessage(`Your team has already placed a bid.`); + if (this.bidsPlaced.has(team)) throw new Chat.ErrorMessage(`Your team has already placed a bid.`); if (amount <= this.minBid) throw new Chat.ErrorMessage(`Your bid must be higher than the minimum bid.`); - this.bidsPlaced[team.id] = amount; + this.bidsPlaced.add(team); for (const id in this.managers) { if (this.managers[id].team === team) { Users.getExact(id)?.sendTo(this.room, `Your team placed a bid of **${amount}** on **${this.currentNom}**.`); @@ -512,7 +512,7 @@ export class Auction extends Rooms.SimpleRoomGame { this.currentBid = amount; this.currentBidder = team; } - if (Object.keys(this.bidsPlaced).length === Object.keys(this.teams).length) { + if (this.bidsPlaced.size === Object.keys(this.teams).length) { this.finishCurrentNom(); } } else { @@ -531,6 +531,7 @@ export class Auction extends Rooms.SimpleRoomGame { this.currentBidder.credits -= this.currentBid; this.currentNom.team = this.currentBidder; this.currentNom.price = this.currentBid; + this.bidsPlaced.clear(); this.clearTimer(); this.next(); } From a87b63b59a807b7d33167aebb5e40ede76ddad49 Mon Sep 17 00:00:00 2001 From: Karthik Bandagonda <32044378+Karthik99999@users.noreply.github.com> Date: Thu, 11 Jul 2024 00:40:16 +0000 Subject: [PATCH 139/139] Replace shiny WISHMKR Jirachi events with Pokemon Channel event (#10408) --- data/learnsets.ts | 44 +++++++++++++------------------ data/mods/gen4pt/learnsets.ts | 14 +++++----- data/mods/gen5bw1/learnsets.ts | 22 ++++++++-------- data/mods/gen6xy/learnsets.ts | 28 ++++++++++---------- data/mods/gen7sm/learnsets.ts | 34 ++++++++++++------------ data/mods/gen8dlc1/learnsets.ts | 44 +++++++++++++------------------ data/mods/gen9dlc1/learnsets.ts | 44 +++++++++++++------------------ data/mods/gen9predlc/learnsets.ts | 44 +++++++++++++------------------ test/sim/team-validator/events.js | 12 --------- 9 files changed, 121 insertions(+), 165 deletions(-) diff --git a/data/learnsets.ts b/data/learnsets.ts index e22df88b18a0..b4812ca0aa26 100644 --- a/data/learnsets.ts +++ b/data/learnsets.ts @@ -46434,14 +46434,14 @@ export const Learnsets: import('../sim/dex-species').LearnsetDataTable = { charm: ["9M", "8M"], confide: ["7M", "6M"], confuseray: ["9M"], - confusion: ["9L1", "8L1", "7L1", "6L1", "6S18", "6S20", "6S21", "5L1", "4L1", "4S11", "4S12", "3L1", "3S0", "3S1", "3S2", "3S3", "3S4", "3S5", "3S6", "3S7", "3S8", "3S9"], - cosmicpower: ["9L84", "8M", "8L84", "7L60", "6L60", "6S19", "5L60", "5S15", "4L60", "3L45"], + confusion: ["9L1", "8L1", "7L1", "6L1", "6S10", "6S12", "6S13", "5L1", "4L1", "4S3", "4S4", "3L1", "3S0", "3S1"], + cosmicpower: ["9L84", "8M", "8L84", "7L60", "6L60", "6S11", "5L60", "5S7", "4L60", "3L45"], dazzlinggleam: ["9M", "8M", "7M", "6M"], defensecurl: ["3T"], doomdesire: ["9L98", "8L98", "7L70", "6L70", "5L70", "4L70", "3L50"], doubleedge: ["9M", "9L77", "8L77", "7L40", "6L40", "5L40", "4L40", "3T", "3L35"], doubleteam: ["7M", "6M", "5M", "4M", "3M"], - dracometeor: ["5S14", "4S12"], + dracometeor: ["5S6", "4S4"], drainpunch: ["9M", "8M", "7T", "6T", "5T", "4M"], dreameater: ["7M", "6M", "5M", "4M", "3T"], dynamicpunch: ["3T"], @@ -46455,17 +46455,17 @@ export const Learnsets: import('../sim/dex-species').LearnsetDataTable = { flash: ["6M", "5M", "4M", "3M"], flashcannon: ["9M", "8M", "7M", "6M", "5M", "4M"], fling: ["9M", "8M", "7M", "6M", "5M", "4M"], - followme: ["5S14"], + followme: ["5S6"], frustration: ["7M", "6M", "5M", "4M", "3M"], futuresight: ["9M", "9L70", "8M", "8L70", "7L55", "6L55", "5L55", "4L55", "3L40"], gigaimpact: ["9M", "8M", "7M", "6M", "5M", "4M"], grassknot: ["9M", "8M", "7M", "6M", "5M", "4M"], gravity: ["9M", "9L35", "8L35", "7T", "7L45", "6T", "6L45", "5T", "5L45", "4T", "4L45"], - happyhour: ["6S20"], + happyhour: ["6S12"], headbutt: ["4T"], - healingwish: ["9L56", "8L56", "7L50", "7S22", "6L50", "6S17", "5L50", "5S13", "5S15", "5S16", "4L50"], - heartstamp: ["6S19"], - helpinghand: ["9M", "8M", "8L14", "7T", "7L15", "6T", "6L15", "6S18", "5T", "5L15", "4T", "4L15", "3L15", "3S10"], + healingwish: ["9L56", "8L56", "7L50", "7S14", "6L50", "6S9", "5L50", "5S5", "5S7", "5S8", "4L50"], + heartstamp: ["6S11"], + helpinghand: ["9M", "8M", "8L14", "7T", "7L15", "6T", "6L15", "6S10", "5T", "5L15", "4T", "4L15", "3L15", "3S2"], hiddenpower: ["7M", "6M", "5M", "4M", "3M"], hyperbeam: ["9M", "8M", "7M", "6M", "5M", "4M", "3M"], icepunch: ["9M", "8M", "7T", "6T", "5T", "4T", "3T"], @@ -46483,27 +46483,27 @@ export const Learnsets: import('../sim/dex-species').LearnsetDataTable = { megapunch: ["8M"], metalsound: ["9M"], meteorbeam: ["9M", "8T"], - meteormash: ["9L49", "8L49", "8S23", "5S13", "5S14", "5S15"], + meteormash: ["9L49", "8L49", "8S15", "5S5", "5S6", "5S7"], metronome: ["9M", "8M", "3T"], mimic: ["3T"], - moonblast: ["6S17"], + moonblast: ["6S9"], mudslap: ["9M", "4T", "3T"], naturalgift: ["4M"], nightmare: ["3T"], - playrough: ["9M", "8M", "6S19"], + playrough: ["9M", "8M", "6S11"], poweruppunch: ["6M"], protect: ["9M", "8M", "7M", "6M", "5M", "4M", "3M"], psybeam: ["9M"], - psychic: ["9M", "9L42", "8M", "8L42", "8S23", "7M", "7L20", "6M", "6L20", "5M", "5L20", "5S13", "4M", "4L20", "3M", "3L20", "3S10"], + psychic: ["9M", "9L42", "8M", "8L42", "8S15", "7M", "7L20", "6M", "6L20", "5M", "5L20", "5S5", "4M", "4L20", "3M", "3L20", "3S2"], psychicnoise: ["9M"], psychup: ["9M", "7M", "6M", "5M", "4M", "3T"], psyshock: ["9M", "8M", "7M", "6M", "5M"], raindance: ["9M", "8M", "7M", "6M", "5M", "4M", "3M"], recycle: ["7T", "6T", "5T", "4M"], reflect: ["9M", "8M", "7M", "6M", "5M", "4M", "3M"], - refresh: ["7L25", "6L25", "5L25", "4L25", "3L25", "3S10"], - rest: ["9M", "9L63", "8M", "8L63", "8S23", "7M", "7L30", "7S22", "6M", "6L5", "6S21", "5M", "5L5", "4M", "4L5", "4S11", "4S12", "3M", "3L5", "3S0", "3S1", "3S2", "3S3", "3S4", "3S5", "3S6", "3S7", "3S8", "3S9", "3S10"], - return: ["7M", "6M", "6S18", "5M", "5S16", "4M", "3M"], + refresh: ["7L25", "6L25", "5L25", "4L25", "3L25", "3S2"], + rest: ["9M", "9L63", "8M", "8L63", "8S15", "7M", "7L30", "7S14", "6M", "6L5", "6S13", "5M", "5L5", "4M", "4L5", "4S3", "4S4", "3M", "3L5", "3S0", "3S1", "3S2"], + return: ["7M", "6M", "6S10", "5M", "5S8", "4M", "3M"], round: ["8M", "7M", "6M", "5M"], safeguard: ["8M", "7M", "6M", "5M", "4M", "3M"], sandstorm: ["9M", "8M", "7M", "6M", "5M", "4M", "3M"], @@ -46520,7 +46520,7 @@ export const Learnsets: import('../sim/dex-species').LearnsetDataTable = { substitute: ["9M", "8M", "7M", "6M", "5M", "4M", "3T"], sunnyday: ["9M", "8M", "7M", "6M", "5M", "4M", "3M"], swagger: ["7M", "6M", "5M", "4M", "3T"], - swift: ["9M", "9L7", "8M", "8L7", "7L10", "7S22", "6L10", "6S17", "6S20", "5L10", "5S13", "5S16", "4T", "4L10", "3T", "3L10"], + swift: ["9M", "9L7", "8M", "8L7", "7L10", "7S14", "6L10", "6S9", "6S12", "5L10", "5S5", "5S8", "4T", "4L10", "3T", "3L10"], telekinesis: ["7T", "5M"], terablast: ["9M"], thunder: ["9M", "8M", "7M", "6M", "5M", "4M", "3M"], @@ -46533,20 +46533,12 @@ export const Learnsets: import('../sim/dex-species').LearnsetDataTable = { uproar: ["8M", "7T", "6T", "5T", "4T"], uturn: ["9M", "8M", "7M", "6M", "5M", "4M"], waterpulse: ["9M", "7T", "6T", "4M", "3M"], - wish: ["9L1", "8L1", "8S23", "7L1", "7S22", "6L1", "6S17", "6S18", "6S19", "6S20", "6S21", "5L1", "5S14", "5S15", "5S16", "4L1", "4S11", "4S12", "3L1", "3S0", "3S1", "3S2", "3S3", "3S4", "3S5", "3S6", "3S7", "3S8", "3S9"], + wish: ["9L1", "8L1", "8S15", "7L1", "7S14", "6L1", "6S9", "6S10", "6S11", "6S12", "6S13", "5L1", "5S6", "5S7", "5S8", "4L1", "4S3", "4S4", "3L1", "3S0", "3S1"], zenheadbutt: ["9M", "9L28", "8M", "8L28", "7T", "7L35", "6T", "6L35", "5T", "5L35", "4T", "4L35"], }, eventData: [ {generation: 3, level: 5, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Bashful", ivs: {hp: 24, atk: 3, def: 30, spa: 12, spd: 16, spe: 11}, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Careful", ivs: {hp: 10, atk: 0, def: 10, spa: 10, spd: 26, spe: 12}, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Docile", ivs: {hp: 19, atk: 7, def: 10, spa: 19, spd: 10, spe: 16}, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Hasty", ivs: {hp: 3, atk: 12, def: 12, spa: 7, spd: 11, spe: 9}, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Jolly", ivs: {hp: 11, atk: 8, def: 6, spa: 14, spd: 5, spe: 20}, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Lonely", ivs: {hp: 31, atk: 23, def: 26, spa: 29, spd: 18, spe: 5}, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Naughty", ivs: {hp: 21, atk: 31, def: 31, spa: 18, spd: 24, spe: 19}, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Serious", ivs: {hp: 29, atk: 10, def: 31, spa: 25, spd: 23, spe: 21}, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Timid", ivs: {hp: 15, atk: 28, def: 29, spa: 3, spd: 0, spe: 7}, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, + {generation: 3, level: 5, shiny: 1, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, {generation: 3, level: 30, moves: ["helpinghand", "psychic", "refresh", "rest"], pokeball: "pokeball"}, {generation: 4, level: 5, moves: ["wish", "confusion", "rest"], pokeball: "cherishball"}, {generation: 4, level: 5, moves: ["wish", "confusion", "rest", "dracometeor"], pokeball: "cherishball"}, diff --git a/data/mods/gen4pt/learnsets.ts b/data/mods/gen4pt/learnsets.ts index bdf926055348..b0a69fbc204f 100644 --- a/data/mods/gen4pt/learnsets.ts +++ b/data/mods/gen4pt/learnsets.ts @@ -27204,13 +27204,13 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab bodyslam: ["3T"], calmmind: ["4M", "3M"], chargebeam: ["4M"], - confusion: ["4L1", "4S11", "4S12", "3L1", "3S0", "3S1", "3S2", "3S3", "3S4", "3S5", "3S6", "3S7", "3S8", "3S9"], + confusion: ["4L1", "4S3", "4S4", "3L1", "3S0", "3S1"], cosmicpower: ["4L60", "3L45"], defensecurl: ["3T"], doomdesire: ["4L70", "3L50"], doubleedge: ["4L40", "3T", "3L35"], doubleteam: ["4M", "3M"], - dracometeor: ["4S12"], + dracometeor: ["4S4"], drainpunch: ["4M"], dreameater: ["4M", "3T"], dynamicpunch: ["3T"], @@ -27227,7 +27227,7 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab grassknot: ["4M"], gravity: ["4L45"], healingwish: ["4L50"], - helpinghand: ["4T", "4L15", "3L15", "3S10"], + helpinghand: ["4T", "4L15", "3L15", "3S2"], hiddenpower: ["4M", "3M"], hyperbeam: ["4M", "3M"], icepunch: ["4T", "3T"], @@ -27242,13 +27242,13 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab naturalgift: ["4M"], nightmare: ["3T"], protect: ["4M", "3M"], - psychic: ["4M", "4L20", "3M", "3L20", "3S10"], + psychic: ["4M", "4L20", "3M", "3L20", "3S2"], psychup: ["4M", "3T"], raindance: ["4M", "3M"], recycle: ["4M"], reflect: ["4M", "3M"], - refresh: ["4L25", "3L25", "3S10"], - rest: ["4M", "4L5", "4S11", "4S12", "3M", "3L5", "3S0", "3S1", "3S2", "3S3", "3S4", "3S5", "3S6", "3S7", "3S8", "3S9", "3S10"], + refresh: ["4L25", "3L25", "3S2"], + rest: ["4M", "4L5", "4S3", "4S4", "3M", "3L5", "3S0", "3S1", "3S2"], return: ["4M", "3M"], safeguard: ["4M", "3M"], sandstorm: ["4M", "3M"], @@ -27274,7 +27274,7 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab uproar: ["4T"], uturn: ["4M"], waterpulse: ["4M", "3M"], - wish: ["4L1", "4S11", "4S12", "3L1", "3S0", "3S1", "3S2", "3S3", "3S4", "3S5", "3S6", "3S7", "3S8", "3S9"], + wish: ["4L1", "4S3", "4S4", "3L1", "3S0", "3S1"], zenheadbutt: ["4T", "4L35"], }, }, diff --git a/data/mods/gen5bw1/learnsets.ts b/data/mods/gen5bw1/learnsets.ts index cdbd72f8d822..da74e3059e2b 100644 --- a/data/mods/gen5bw1/learnsets.ts +++ b/data/mods/gen5bw1/learnsets.ts @@ -30363,13 +30363,13 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab bodyslam: ["3T"], calmmind: ["5M", "4M", "3M"], chargebeam: ["5M", "4M"], - confusion: ["5L1", "4L1", "4S11", "4S12", "3L1", "3S0", "3S1", "3S2", "3S3", "3S4", "3S5", "3S6", "3S7", "3S8", "3S9"], - cosmicpower: ["5L60", "5S15", "4L60", "3L45"], + confusion: ["5L1", "4L1", "4S3", "4S4", "3L1", "3S0", "3S1"], + cosmicpower: ["5L60", "5S7", "4L60", "3L45"], defensecurl: ["3T"], doomdesire: ["5L70", "4L70", "3L50"], doubleedge: ["5L40", "4L40", "3T", "3L35"], doubleteam: ["5M", "4M", "3M"], - dracometeor: ["5S14", "4S12"], + dracometeor: ["5S6", "4S4"], drainpunch: ["4M"], dreameater: ["5M", "4M", "3T"], dynamicpunch: ["3T"], @@ -30386,8 +30386,8 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab grassknot: ["5M", "4M"], gravity: ["5L45", "4T", "4L45"], headbutt: ["4T"], - healingwish: ["5L50", "5S13", "5S15", "5S16", "4L50"], - helpinghand: ["5L15", "4T", "4L15", "3L15", "3S10"], + healingwish: ["5L50", "5S5", "5S7", "5S8", "4L50"], + helpinghand: ["5L15", "4T", "4L15", "3L15", "3S2"], hiddenpower: ["5M", "4M", "3M"], hyperbeam: ["5M", "4M", "3M"], icepunch: ["4T", "3T"], @@ -30403,15 +30403,15 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab naturalgift: ["4M"], nightmare: ["3T"], protect: ["5M", "4M", "3M"], - psychic: ["5M", "5L20", "5S13", "4M", "4L20", "3M", "3L20", "3S10"], + psychic: ["5M", "5L20", "5S5", "4M", "4L20", "3M", "3L20", "3S2"], psychup: ["5M", "4M", "3T"], psyshock: ["5M"], raindance: ["5M", "4M", "3M"], recycle: ["4M"], reflect: ["5M", "4M", "3M"], - refresh: ["5L25", "4L25", "3L25", "3S10"], - rest: ["5M", "5L5", "4M", "4L5", "4S11", "4S12", "3M", "3L5", "3S0", "3S1", "3S2", "3S3", "3S4", "3S5", "3S6", "3S7", "3S8", "3S9", "3S10"], - return: ["5M", "5S16", "4M", "3M"], + refresh: ["5L25", "4L25", "3L25", "3S2"], + rest: ["5M", "5L5", "4M", "4L5", "4S3", "4S4", "3M", "3L5", "3S0", "3S1", "3S2"], + return: ["5M", "5S8", "4M", "3M"], round: ["5M"], safeguard: ["5M", "4M", "3M"], sandstorm: ["5M", "4M", "3M"], @@ -30426,7 +30426,7 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab substitute: ["5M", "4M", "3T"], sunnyday: ["5M", "4M", "3M"], swagger: ["5M", "4M", "3T"], - swift: ["5L10", "5S13", "5S16", "4T", "4L10", "3T", "3L10"], + swift: ["5L10", "5S5", "5S8", "4T", "4L10", "3T", "3L10"], telekinesis: ["5M"], thunder: ["5M", "4M", "3M"], thunderbolt: ["5M", "4M", "3M"], @@ -30438,7 +30438,7 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab uproar: ["4T"], uturn: ["5M", "4M"], waterpulse: ["4M", "3M"], - wish: ["5L1", "5S14", "5S15", "5S16", "4L1", "4S11", "4S12", "3L1", "3S0", "3S1", "3S2", "3S3", "3S4", "3S5", "3S6", "3S7", "3S8", "3S9"], + wish: ["5L1", "5S6", "5S7", "5S8", "4L1", "4S3", "4S4", "3L1", "3S0", "3S1"], zenheadbutt: ["5L35", "4T", "4L35"], }, }, diff --git a/data/mods/gen6xy/learnsets.ts b/data/mods/gen6xy/learnsets.ts index 9c7d54d47348..63b66371c538 100644 --- a/data/mods/gen6xy/learnsets.ts +++ b/data/mods/gen6xy/learnsets.ts @@ -31885,14 +31885,14 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab calmmind: ["6M", "5M", "4M", "3M"], chargebeam: ["6M", "5M", "4M"], confide: ["6M"], - confusion: ["6L1", "6S18", "6S20", "6S21", "5L1", "4L1", "4S11", "4S12", "3L1", "3S0", "3S1", "3S2", "3S3", "3S4", "3S5", "3S6", "3S7", "3S8", "3S9"], - cosmicpower: ["6L60", "6S19", "5L60", "5S15", "4L60", "3L45"], + confusion: ["6L1", "6S10", "6S12", "6S13", "5L1", "4L1", "4S3", "4S4", "3L1", "3S0", "3S1"], + cosmicpower: ["6L60", "6S11", "5L60", "5S7", "4L60", "3L45"], dazzlinggleam: ["6M"], defensecurl: ["3T"], doomdesire: ["6L70", "5L70", "4L70", "3L50"], doubleedge: ["6L40", "5L40", "4L40", "3T", "3L35"], doubleteam: ["6M", "5M", "4M", "3M"], - dracometeor: ["5S14", "4S12"], + dracometeor: ["5S6", "4S4"], drainpunch: ["5T", "4M"], dreameater: ["6M", "5M", "4M", "3T"], dynamicpunch: ["3T"], @@ -31903,15 +31903,15 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab flash: ["6M", "5M", "4M", "3M"], flashcannon: ["6M", "5M", "4M"], fling: ["6M", "5M", "4M"], - followme: ["5S14"], + followme: ["5S6"], frustration: ["6M", "5M", "4M", "3M"], futuresight: ["6L55", "5L55", "4L55", "3L40"], gigaimpact: ["6M", "5M", "4M"], grassknot: ["6M", "5M", "4M"], gravity: ["6L45", "5T", "5L45", "4T", "4L45"], headbutt: ["4T"], - healingwish: ["6L50", "6S17", "5L50", "5S13", "5S15", "5S16", "4L50"], - helpinghand: ["6L15", "6S18", "5T", "5L15", "4T", "4L15", "3L15", "3S10"], + healingwish: ["6L50", "6S9", "5L50", "5S5", "5S7", "5S8", "4L50"], + helpinghand: ["6L15", "6S10", "5T", "5L15", "4T", "4L15", "3L15", "3S2"], hiddenpower: ["6M", "5M", "4M", "3M"], hyperbeam: ["6M", "5M", "4M", "3M"], icepunch: ["5T", "4T", "3T"], @@ -31922,24 +31922,24 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab lightscreen: ["6M", "5M", "4M", "3M"], magiccoat: ["5T", "4T"], magicroom: ["5T"], - meteormash: ["5S13", "5S14", "5S15"], + meteormash: ["5S5", "5S6", "5S7"], metronome: ["3T"], mimic: ["3T"], - moonblast: ["6S17"], + moonblast: ["6S9"], mudslap: ["4T", "3T"], naturalgift: ["4M"], nightmare: ["3T"], poweruppunch: ["6M"], protect: ["6M", "5M", "4M", "3M"], - psychic: ["6M", "6L20", "5M", "5L20", "5S13", "4M", "4L20", "3M", "3L20", "3S10"], + psychic: ["6M", "6L20", "5M", "5L20", "5S5", "4M", "4L20", "3M", "3L20", "3S2"], psychup: ["6M", "5M", "4M", "3T"], psyshock: ["6M", "5M"], raindance: ["6M", "5M", "4M", "3M"], recycle: ["5T", "4M"], reflect: ["6M", "5M", "4M", "3M"], - refresh: ["6L25", "5L25", "4L25", "3L25", "3S10"], - rest: ["6M", "6L5", "6S21", "5M", "5L5", "4M", "4L5", "4S11", "4S12", "3M", "3L5", "3S0", "3S1", "3S2", "3S3", "3S4", "3S5", "3S6", "3S7", "3S8", "3S9", "3S10"], - return: ["6M", "6S18", "5M", "5S16", "4M", "3M"], + refresh: ["6L25", "5L25", "4L25", "3L25", "3S2"], + rest: ["6M", "6L5", "6S13", "5M", "5L5", "4M", "4L5", "4S3", "4S4", "3M", "3L5", "3S0", "3S1", "3S2"], + return: ["6M", "6S10", "5M", "5S8", "4M", "3M"], round: ["6M", "5M"], safeguard: ["6M", "5M", "4M", "3M"], sandstorm: ["6M", "5M", "4M", "3M"], @@ -31954,7 +31954,7 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab substitute: ["6M", "5M", "4M", "3T"], sunnyday: ["6M", "5M", "4M", "3M"], swagger: ["6M", "5M", "4M", "3T"], - swift: ["6L10", "6S17", "6S20", "5L10", "5S13", "5S16", "4T", "4L10", "3T", "3L10"], + swift: ["6L10", "6S9", "6S12", "5L10", "5S5", "5S8", "4T", "4L10", "3T", "3L10"], telekinesis: ["5M"], thunder: ["6M", "5M", "4M", "3M"], thunderbolt: ["6M", "5M", "4M", "3M"], @@ -31966,7 +31966,7 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab uproar: ["5T", "4T"], uturn: ["6M", "5M", "4M"], waterpulse: ["4M", "3M"], - wish: ["6L1", "6S17", "6S18", "6S19", "6S20", "6S21", "5L1", "5S14", "5S15", "5S16", "4L1", "4S11", "4S12", "3L1", "3S0", "3S1", "3S2", "3S3", "3S4", "3S5", "3S6", "3S7", "3S8", "3S9"], + wish: ["6L1", "6S9", "6S10", "6S11", "6S12", "6S13", "5L1", "5S6", "5S7", "5S8", "4L1", "4S3", "4S4", "3L1", "3S0", "3S1"], zenheadbutt: ["6L35", "5T", "5L35", "4T", "4L35"], }, }, diff --git a/data/mods/gen7sm/learnsets.ts b/data/mods/gen7sm/learnsets.ts index 8e65324c9d87..c29ff4ae3b72 100644 --- a/data/mods/gen7sm/learnsets.ts +++ b/data/mods/gen7sm/learnsets.ts @@ -34830,14 +34830,14 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab calmmind: ["7M", "6M", "5M", "4M", "3M"], chargebeam: ["7M", "6M", "5M", "4M"], confide: ["7M", "6M"], - confusion: ["7L1", "6L1", "6S18", "6S20", "6S21", "5L1", "4L1", "4S11", "4S12", "3L1", "3S0", "3S1", "3S2", "3S3", "3S4", "3S5", "3S6", "3S7", "3S8", "3S9"], - cosmicpower: ["7L60", "6L60", "6S19", "5L60", "5S15", "4L60", "3L45"], + confusion: ["7L1", "6L1", "6S10", "6S12", "6S13", "5L1", "4L1", "4S3", "4S4", "3L1", "3S0", "3S1"], + cosmicpower: ["7L60", "6L60", "6S11", "5L60", "5S7", "4L60", "3L45"], dazzlinggleam: ["7M", "6M"], defensecurl: ["3T"], doomdesire: ["7L70", "6L70", "5L70", "4L70", "3L50"], doubleedge: ["7L40", "6L40", "5L40", "4L40", "3T", "3L35"], doubleteam: ["7M", "6M", "5M", "4M", "3M"], - dracometeor: ["5S14", "4S12"], + dracometeor: ["5S6", "4S4"], drainpunch: ["6T", "5T", "4M"], dreameater: ["7M", "6M", "5M", "4M", "3T"], dynamicpunch: ["3T"], @@ -34848,17 +34848,17 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab flash: ["6M", "5M", "4M", "3M"], flashcannon: ["7M", "6M", "5M", "4M"], fling: ["7M", "6M", "5M", "4M"], - followme: ["5S14"], + followme: ["5S6"], frustration: ["7M", "6M", "5M", "4M", "3M"], futuresight: ["7L55", "6L55", "5L55", "4L55", "3L40"], gigaimpact: ["7M", "6M", "5M", "4M"], grassknot: ["7M", "6M", "5M", "4M"], gravity: ["7L45", "6T", "6L45", "5T", "5L45", "4T", "4L45"], - happyhour: ["6S20"], + happyhour: ["6S12"], headbutt: ["4T"], - healingwish: ["7L50", "7S22", "6L50", "6S17", "5L50", "5S13", "5S15", "5S16", "4L50"], - heartstamp: ["6S19"], - helpinghand: ["7L15", "6T", "6L15", "6S18", "5T", "5L15", "4T", "4L15", "3L15", "3S10"], + healingwish: ["7L50", "7S14", "6L50", "6S9", "5L50", "5S5", "5S7", "5S8", "4L50"], + heartstamp: ["6S11"], + helpinghand: ["7L15", "6T", "6L15", "6S10", "5T", "5L15", "4T", "4L15", "3L15", "3S2"], hiddenpower: ["7M", "6M", "5M", "4M", "3M"], hyperbeam: ["7M", "6M", "5M", "4M", "3M"], icepunch: ["6T", "5T", "4T", "3T"], @@ -34869,25 +34869,25 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab lightscreen: ["7M", "6M", "5M", "4M", "3M"], magiccoat: ["6T", "5T", "4T"], magicroom: ["6T", "5T"], - meteormash: ["5S13", "5S14", "5S15"], + meteormash: ["5S5", "5S6", "5S7"], metronome: ["3T"], mimic: ["3T"], - moonblast: ["6S17"], + moonblast: ["6S9"], mudslap: ["4T", "3T"], naturalgift: ["4M"], nightmare: ["3T"], - playrough: ["6S19"], + playrough: ["6S11"], poweruppunch: ["6M"], protect: ["7M", "6M", "5M", "4M", "3M"], - psychic: ["7M", "7L20", "6M", "6L20", "5M", "5L20", "5S13", "4M", "4L20", "3M", "3L20", "3S10"], + psychic: ["7M", "7L20", "6M", "6L20", "5M", "5L20", "5S5", "4M", "4L20", "3M", "3L20", "3S2"], psychup: ["7M", "6M", "5M", "4M", "3T"], psyshock: ["7M", "6M", "5M"], raindance: ["7M", "6M", "5M", "4M", "3M"], recycle: ["6T", "5T", "4M"], reflect: ["7M", "6M", "5M", "4M", "3M"], - refresh: ["7L25", "6L25", "5L25", "4L25", "3L25", "3S10"], - rest: ["7M", "7L30", "7L5", "7S22", "6M", "6L5", "6S21", "5M", "5L5", "4M", "4L5", "4S11", "4S12", "3M", "3L5", "3S0", "3S1", "3S2", "3S3", "3S4", "3S5", "3S6", "3S7", "3S8", "3S9", "3S10"], - return: ["7M", "6M", "6S18", "5M", "5S16", "4M", "3M"], + refresh: ["7L25", "6L25", "5L25", "4L25", "3L25", "3S2"], + rest: ["7M", "7L30", "7L5", "7S14", "6M", "6L5", "6S13", "5M", "5L5", "4M", "4L5", "4S3", "4S4", "3M", "3L5", "3S0", "3S1", "3S2"], + return: ["7M", "6M", "6S10", "5M", "5S8", "4M", "3M"], round: ["7M", "6M", "5M"], safeguard: ["7M", "6M", "5M", "4M", "3M"], sandstorm: ["7M", "6M", "5M", "4M", "3M"], @@ -34902,7 +34902,7 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab substitute: ["7M", "6M", "5M", "4M", "3T"], sunnyday: ["7M", "6M", "5M", "4M", "3M"], swagger: ["7M", "6M", "5M", "4M", "3T"], - swift: ["7L10", "7S22", "6L10", "6S17", "6S20", "5L10", "5S13", "5S16", "4T", "4L10", "3T", "3L10"], + swift: ["7L10", "7S14", "6L10", "6S9", "6S12", "5L10", "5S5", "5S8", "4T", "4L10", "3T", "3L10"], telekinesis: ["5M"], thunder: ["7M", "6M", "5M", "4M", "3M"], thunderbolt: ["7M", "6M", "5M", "4M", "3M"], @@ -34914,7 +34914,7 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab uproar: ["6T", "5T", "4T"], uturn: ["7M", "6M", "5M", "4M"], waterpulse: ["6T", "4M", "3M"], - wish: ["7L1", "7S22", "6L1", "6S17", "6S18", "6S19", "6S20", "6S21", "5L1", "5S14", "5S15", "5S16", "4L1", "4S11", "4S12", "3L1", "3S0", "3S1", "3S2", "3S3", "3S4", "3S5", "3S6", "3S7", "3S8", "3S9"], + wish: ["7L1", "7S14", "6L1", "6S9", "6S10", "6S11", "6S12", "6S13", "5L1", "5S6", "5S7", "5S8", "4L1", "4S3", "4S4", "3L1", "3S0", "3S1"], zenheadbutt: ["7L35", "6T", "6L35", "5T", "5L35", "4T", "4L35"], }, }, diff --git a/data/mods/gen8dlc1/learnsets.ts b/data/mods/gen8dlc1/learnsets.ts index 4cab77a12254..85bdd920dbb5 100644 --- a/data/mods/gen8dlc1/learnsets.ts +++ b/data/mods/gen8dlc1/learnsets.ts @@ -40891,14 +40891,14 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab chargebeam: ["7M", "6M", "5M", "4M"], charm: ["8M"], confide: ["7M", "6M"], - confusion: ["8L1", "7L1", "6L1", "6S18", "6S20", "6S21", "5L1", "4L1", "4S11", "4S12", "3L1", "3S0", "3S1", "3S2", "3S3", "3S4", "3S5", "3S6", "3S7", "3S8", "3S9"], - cosmicpower: ["8M", "8L84", "7L60", "6L60", "6S19", "5L60", "5S15", "4L60", "3L45"], + confusion: ["8L1", "7L1", "6L1", "6S10", "6S12", "6S13", "5L1", "4L1", "4S3", "4S4", "3L1", "3S0", "3S1"], + cosmicpower: ["8M", "8L84", "7L60", "6L60", "6S11", "5L60", "5S7", "4L60", "3L45"], dazzlinggleam: ["8M", "7M", "6M"], defensecurl: ["3T"], doomdesire: ["8L98", "7L70", "6L70", "5L70", "4L70", "3L50"], doubleedge: ["8L77", "7L40", "6L40", "5L40", "4L40", "3T", "3L35"], doubleteam: ["7M", "6M", "5M", "4M", "3M"], - dracometeor: ["5S14", "4S12"], + dracometeor: ["5S6", "4S4"], drainpunch: ["8M", "7T", "6T", "5T", "4M"], dreameater: ["7M", "6M", "5M", "4M", "3T"], dynamicpunch: ["3T"], @@ -40911,17 +40911,17 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab flash: ["6M", "5M", "4M", "3M"], flashcannon: ["8M", "7M", "6M", "5M", "4M"], fling: ["8M", "7M", "6M", "5M", "4M"], - followme: ["5S14"], + followme: ["5S6"], frustration: ["7M", "6M", "5M", "4M", "3M"], futuresight: ["8M", "8L70", "7L55", "6L55", "5L55", "4L55", "3L40"], gigaimpact: ["8M", "7M", "6M", "5M", "4M"], grassknot: ["8M", "7M", "6M", "5M", "4M"], gravity: ["8L35", "7T", "7L45", "6T", "6L45", "5T", "5L45", "4T", "4L45"], - happyhour: ["6S20"], + happyhour: ["6S12"], headbutt: ["4T"], - healingwish: ["8L56", "7L50", "7S22", "6L50", "6S17", "5L50", "5S13", "5S15", "5S16", "4L50"], - heartstamp: ["6S19"], - helpinghand: ["8M", "8L14", "7T", "7L15", "6T", "6L15", "6S18", "5T", "5L15", "4T", "4L15", "3L15", "3S10"], + healingwish: ["8L56", "7L50", "7S14", "6L50", "6S9", "5L50", "5S5", "5S7", "5S8", "4L50"], + heartstamp: ["6S11"], + helpinghand: ["8M", "8L14", "7T", "7L15", "6T", "6L15", "6S10", "5T", "5L15", "4T", "4L15", "3L15", "3S2"], hiddenpower: ["7M", "6M", "5M", "4M", "3M"], hyperbeam: ["8M", "7M", "6M", "5M", "4M", "3M"], icepunch: ["8M", "7T", "6T", "5T", "4T", "3T"], @@ -40938,25 +40938,25 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab megakick: ["8M"], megapunch: ["8M"], meteorbeam: ["8T"], - meteormash: ["8L49", "5S13", "5S14", "5S15"], + meteormash: ["8L49", "5S5", "5S6", "5S7"], metronome: ["8M", "3T"], mimic: ["3T"], - moonblast: ["6S17"], + moonblast: ["6S9"], mudslap: ["4T", "3T"], naturalgift: ["4M"], nightmare: ["3T"], - playrough: ["8M", "6S19"], + playrough: ["8M", "6S11"], poweruppunch: ["6M"], protect: ["8M", "7M", "6M", "5M", "4M", "3M"], - psychic: ["8M", "8L42", "7M", "7L20", "6M", "6L20", "5M", "5L20", "5S13", "4M", "4L20", "3M", "3L20", "3S10"], + psychic: ["8M", "8L42", "7M", "7L20", "6M", "6L20", "5M", "5L20", "5S5", "4M", "4L20", "3M", "3L20", "3S2"], psychup: ["7M", "6M", "5M", "4M", "3T"], psyshock: ["8M", "7M", "6M", "5M"], raindance: ["8M", "7M", "6M", "5M", "4M", "3M"], recycle: ["7T", "6T", "5T", "4M"], reflect: ["8M", "7M", "6M", "5M", "4M", "3M"], - refresh: ["7L25", "6L25", "5L25", "4L25", "3L25", "3S10"], - rest: ["8M", "8L63", "7M", "7L30", "7S22", "6M", "6L5", "6S21", "5M", "5L5", "4M", "4L5", "4S11", "4S12", "3M", "3L5", "3S0", "3S1", "3S2", "3S3", "3S4", "3S5", "3S6", "3S7", "3S8", "3S9", "3S10"], - return: ["7M", "6M", "6S18", "5M", "5S16", "4M", "3M"], + refresh: ["7L25", "6L25", "5L25", "4L25", "3L25", "3S2"], + rest: ["8M", "8L63", "7M", "7L30", "7S14", "6M", "6L5", "6S13", "5M", "5L5", "4M", "4L5", "4S3", "4S4", "3M", "3L5", "3S0", "3S1", "3S2"], + return: ["7M", "6M", "6S10", "5M", "5S8", "4M", "3M"], round: ["8M", "7M", "6M", "5M"], safeguard: ["8M", "7M", "6M", "5M", "4M", "3M"], sandstorm: ["8M", "7M", "6M", "5M", "4M", "3M"], @@ -40973,7 +40973,7 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab substitute: ["8M", "7M", "6M", "5M", "4M", "3T"], sunnyday: ["8M", "7M", "6M", "5M", "4M", "3M"], swagger: ["7M", "6M", "5M", "4M", "3T"], - swift: ["8M", "8L7", "7L10", "7S22", "6L10", "6S17", "6S20", "5L10", "5S13", "5S16", "4T", "4L10", "3T", "3L10"], + swift: ["8M", "8L7", "7L10", "7S14", "6L10", "6S9", "6S12", "5L10", "5S5", "5S8", "4T", "4L10", "3T", "3L10"], telekinesis: ["7T", "5M"], thunder: ["8M", "7M", "6M", "5M", "4M", "3M"], thunderbolt: ["8M", "7M", "6M", "5M", "4M", "3M"], @@ -40985,20 +40985,12 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab uproar: ["8M", "7T", "6T", "5T", "4T"], uturn: ["8M", "7M", "6M", "5M", "4M"], waterpulse: ["7T", "6T", "4M", "3M"], - wish: ["8L1", "7L1", "7S22", "6L1", "6S17", "6S18", "6S19", "6S20", "6S21", "5L1", "5S14", "5S15", "5S16", "4L1", "4S11", "4S12", "3L1", "3S0", "3S1", "3S2", "3S3", "3S4", "3S5", "3S6", "3S7", "3S8", "3S9"], + wish: ["8L1", "7L1", "7S14", "6L1", "6S9", "6S10", "6S11", "6S12", "6S13", "5L1", "5S6", "5S7", "5S8", "4L1", "4S3", "4S4", "3L1", "3S0", "3S1"], zenheadbutt: ["8M", "8L28", "7T", "7L35", "6T", "6L35", "5T", "5L35", "4T", "4L35"], }, eventData: [ {generation: 3, level: 5, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Bashful", ivs: {hp: 24, atk: 3, def: 30, spa: 12, spd: 16, spe: 11}, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Careful", ivs: {hp: 10, atk: 0, def: 10, spa: 10, spd: 26, spe: 12}, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Docile", ivs: {hp: 19, atk: 7, def: 10, spa: 19, spd: 10, spe: 16}, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Hasty", ivs: {hp: 3, atk: 12, def: 12, spa: 7, spd: 11, spe: 9}, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Jolly", ivs: {hp: 11, atk: 8, def: 6, spa: 14, spd: 5, spe: 20}, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Lonely", ivs: {hp: 31, atk: 23, def: 26, spa: 29, spd: 18, spe: 5}, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Naughty", ivs: {hp: 21, atk: 31, def: 31, spa: 18, spd: 24, spe: 19}, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Serious", ivs: {hp: 29, atk: 10, def: 31, spa: 25, spd: 23, spe: 21}, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Timid", ivs: {hp: 15, atk: 28, def: 29, spa: 3, spd: 0, spe: 7}, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, + {generation: 3, level: 5, shiny: 1, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, {generation: 3, level: 30, moves: ["helpinghand", "psychic", "refresh", "rest"], pokeball: "pokeball"}, {generation: 4, level: 5, moves: ["wish", "confusion", "rest"], pokeball: "cherishball"}, {generation: 4, level: 5, moves: ["wish", "confusion", "rest", "dracometeor"], pokeball: "cherishball"}, diff --git a/data/mods/gen9dlc1/learnsets.ts b/data/mods/gen9dlc1/learnsets.ts index c60ae7eee29d..d04f2dc841db 100644 --- a/data/mods/gen9dlc1/learnsets.ts +++ b/data/mods/gen9dlc1/learnsets.ts @@ -45364,14 +45364,14 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab charm: ["9M", "8M"], confide: ["7M", "6M"], confuseray: ["9M"], - confusion: ["9L1", "8L1", "7L1", "6L1", "6S18", "6S20", "6S21", "5L1", "4L1", "4S11", "4S12", "3L1", "3S0", "3S1", "3S2", "3S3", "3S4", "3S5", "3S6", "3S7", "3S8", "3S9"], - cosmicpower: ["9L84", "8M", "8L84", "7L60", "6L60", "6S19", "5L60", "5S15", "4L60", "3L45"], + confusion: ["9L1", "8L1", "7L1", "6L1", "6S10", "6S12", "6S13", "5L1", "4L1", "4S3", "4S4", "3L1", "3S0", "3S1"], + cosmicpower: ["9L84", "8M", "8L84", "7L60", "6L60", "6S11", "5L60", "5S7", "4L60", "3L45"], dazzlinggleam: ["9M", "8M", "7M", "6M"], defensecurl: ["3T"], doomdesire: ["9L98", "8L98", "7L70", "6L70", "5L70", "4L70", "3L50"], doubleedge: ["9L77", "8L77", "7L40", "6L40", "5L40", "4L40", "3T", "3L35"], doubleteam: ["7M", "6M", "5M", "4M", "3M"], - dracometeor: ["5S14", "4S12"], + dracometeor: ["5S6", "4S4"], drainpunch: ["9M", "8M", "7T", "6T", "5T", "4M"], dreameater: ["7M", "6M", "5M", "4M", "3T"], dynamicpunch: ["3T"], @@ -45385,17 +45385,17 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab flash: ["6M", "5M", "4M", "3M"], flashcannon: ["9M", "8M", "7M", "6M", "5M", "4M"], fling: ["9M", "8M", "7M", "6M", "5M", "4M"], - followme: ["5S14"], + followme: ["5S6"], frustration: ["7M", "6M", "5M", "4M", "3M"], futuresight: ["9L70", "8M", "8L70", "7L55", "6L55", "5L55", "4L55", "3L40"], gigaimpact: ["9M", "8M", "7M", "6M", "5M", "4M"], grassknot: ["9M", "8M", "7M", "6M", "5M", "4M"], gravity: ["9M", "9L35", "8L35", "7T", "7L45", "6T", "6L45", "5T", "5L45", "4T", "4L45"], - happyhour: ["6S20"], + happyhour: ["6S12"], headbutt: ["4T"], - healingwish: ["9L56", "8L56", "7L50", "7S22", "6L50", "6S17", "5L50", "5S13", "5S15", "5S16", "4L50"], - heartstamp: ["6S19"], - helpinghand: ["9M", "8M", "8L14", "7T", "7L15", "6T", "6L15", "6S18", "5T", "5L15", "4T", "4L15", "3L15", "3S10"], + healingwish: ["9L56", "8L56", "7L50", "7S14", "6L50", "6S9", "5L50", "5S5", "5S7", "5S8", "4L50"], + heartstamp: ["6S11"], + helpinghand: ["9M", "8M", "8L14", "7T", "7L15", "6T", "6L15", "6S10", "5T", "5L15", "4T", "4L15", "3L15", "3S2"], hiddenpower: ["7M", "6M", "5M", "4M", "3M"], hyperbeam: ["9M", "8M", "7M", "6M", "5M", "4M", "3M"], icepunch: ["9M", "8M", "7T", "6T", "5T", "4T", "3T"], @@ -45412,26 +45412,26 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab megakick: ["8M"], megapunch: ["8M"], meteorbeam: ["8T"], - meteormash: ["9L49", "8L49", "8S23", "5S13", "5S14", "5S15"], + meteormash: ["9L49", "8L49", "8S15", "5S5", "5S6", "5S7"], metronome: ["9M", "8M", "3T"], mimic: ["3T"], - moonblast: ["6S17"], + moonblast: ["6S9"], mudslap: ["9M", "4T", "3T"], naturalgift: ["4M"], nightmare: ["3T"], - playrough: ["9M", "8M", "6S19"], + playrough: ["9M", "8M", "6S11"], poweruppunch: ["6M"], protect: ["9M", "8M", "7M", "6M", "5M", "4M", "3M"], psybeam: ["9M"], - psychic: ["9M", "9L42", "8M", "8L42", "8S23", "7M", "7L20", "6M", "6L20", "5M", "5L20", "5S13", "4M", "4L20", "3M", "3L20", "3S10"], + psychic: ["9M", "9L42", "8M", "8L42", "8S15", "7M", "7L20", "6M", "6L20", "5M", "5L20", "5S5", "4M", "4L20", "3M", "3L20", "3S2"], psychup: ["7M", "6M", "5M", "4M", "3T"], psyshock: ["9M", "8M", "7M", "6M", "5M"], raindance: ["9M", "8M", "7M", "6M", "5M", "4M", "3M"], recycle: ["7T", "6T", "5T", "4M"], reflect: ["9M", "8M", "7M", "6M", "5M", "4M", "3M"], - refresh: ["7L25", "6L25", "5L25", "4L25", "3L25", "3S10"], - rest: ["9M", "9L63", "8M", "8L63", "8S23", "7M", "7L30", "7S22", "6M", "6L5", "6S21", "5M", "5L5", "4M", "4L5", "4S11", "4S12", "3M", "3L5", "3S0", "3S1", "3S2", "3S3", "3S4", "3S5", "3S6", "3S7", "3S8", "3S9", "3S10"], - return: ["7M", "6M", "6S18", "5M", "5S16", "4M", "3M"], + refresh: ["7L25", "6L25", "5L25", "4L25", "3L25", "3S2"], + rest: ["9M", "9L63", "8M", "8L63", "8S15", "7M", "7L30", "7S14", "6M", "6L5", "6S13", "5M", "5L5", "4M", "4L5", "4S3", "4S4", "3M", "3L5", "3S0", "3S1", "3S2"], + return: ["7M", "6M", "6S10", "5M", "5S8", "4M", "3M"], round: ["8M", "7M", "6M", "5M"], safeguard: ["8M", "7M", "6M", "5M", "4M", "3M"], sandstorm: ["9M", "8M", "7M", "6M", "5M", "4M", "3M"], @@ -45448,7 +45448,7 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab substitute: ["9M", "8M", "7M", "6M", "5M", "4M", "3T"], sunnyday: ["9M", "8M", "7M", "6M", "5M", "4M", "3M"], swagger: ["7M", "6M", "5M", "4M", "3T"], - swift: ["9M", "9L7", "8M", "8L7", "7L10", "7S22", "6L10", "6S17", "6S20", "5L10", "5S13", "5S16", "4T", "4L10", "3T", "3L10"], + swift: ["9M", "9L7", "8M", "8L7", "7L10", "7S14", "6L10", "6S9", "6S12", "5L10", "5S5", "5S8", "4T", "4L10", "3T", "3L10"], telekinesis: ["7T", "5M"], terablast: ["9M"], thunder: ["9M", "8M", "7M", "6M", "5M", "4M", "3M"], @@ -45461,20 +45461,12 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab uproar: ["8M", "7T", "6T", "5T", "4T"], uturn: ["9M", "8M", "7M", "6M", "5M", "4M"], waterpulse: ["9M", "7T", "6T", "4M", "3M"], - wish: ["9L1", "8L1", "8S23", "7L1", "7S22", "6L1", "6S17", "6S18", "6S19", "6S20", "6S21", "5L1", "5S14", "5S15", "5S16", "4L1", "4S11", "4S12", "3L1", "3S0", "3S1", "3S2", "3S3", "3S4", "3S5", "3S6", "3S7", "3S8", "3S9"], + wish: ["9L1", "8L1", "8S15", "7L1", "7S14", "6L1", "6S9", "6S10", "6S11", "6S12", "6S13", "5L1", "5S6", "5S7", "5S8", "4L1", "4S3", "4S4", "3L1", "3S0", "3S1"], zenheadbutt: ["9M", "9L28", "8M", "8L28", "7T", "7L35", "6T", "6L35", "5T", "5L35", "4T", "4L35"], }, eventData: [ {generation: 3, level: 5, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Bashful", ivs: {hp: 24, atk: 3, def: 30, spa: 12, spd: 16, spe: 11}, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Careful", ivs: {hp: 10, atk: 0, def: 10, spa: 10, spd: 26, spe: 12}, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Docile", ivs: {hp: 19, atk: 7, def: 10, spa: 19, spd: 10, spe: 16}, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Hasty", ivs: {hp: 3, atk: 12, def: 12, spa: 7, spd: 11, spe: 9}, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Jolly", ivs: {hp: 11, atk: 8, def: 6, spa: 14, spd: 5, spe: 20}, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Lonely", ivs: {hp: 31, atk: 23, def: 26, spa: 29, spd: 18, spe: 5}, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Naughty", ivs: {hp: 21, atk: 31, def: 31, spa: 18, spd: 24, spe: 19}, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Serious", ivs: {hp: 29, atk: 10, def: 31, spa: 25, spd: 23, spe: 21}, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Timid", ivs: {hp: 15, atk: 28, def: 29, spa: 3, spd: 0, spe: 7}, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, + {generation: 3, level: 5, shiny: 1, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, {generation: 3, level: 30, moves: ["helpinghand", "psychic", "refresh", "rest"], pokeball: "pokeball"}, {generation: 4, level: 5, moves: ["wish", "confusion", "rest"], pokeball: "cherishball"}, {generation: 4, level: 5, moves: ["wish", "confusion", "rest", "dracometeor"], pokeball: "cherishball"}, diff --git a/data/mods/gen9predlc/learnsets.ts b/data/mods/gen9predlc/learnsets.ts index d0744247f764..6285448247f6 100644 --- a/data/mods/gen9predlc/learnsets.ts +++ b/data/mods/gen9predlc/learnsets.ts @@ -44417,14 +44417,14 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab chargebeam: ["7M", "6M", "5M", "4M"], charm: ["8M"], confide: ["7M", "6M"], - confusion: ["8L1", "7L1", "6L1", "6S18", "6S20", "6S21", "5L1", "4L1", "4S11", "4S12", "3L1", "3S0", "3S1", "3S2", "3S3", "3S4", "3S5", "3S6", "3S7", "3S8", "3S9"], - cosmicpower: ["8M", "8L84", "7L60", "6L60", "6S19", "5L60", "5S15", "4L60", "3L45"], + confusion: ["8L1", "7L1", "6L1", "6S10", "6S12", "6S13", "5L1", "4L1", "4S3", "4S4", "3L1", "3S0", "3S1"], + cosmicpower: ["8M", "8L84", "7L60", "6L60", "6S11", "5L60", "5S7", "4L60", "3L45"], dazzlinggleam: ["8M", "7M", "6M"], defensecurl: ["3T"], doomdesire: ["8L98", "7L70", "6L70", "5L70", "4L70", "3L50"], doubleedge: ["8L77", "7L40", "6L40", "5L40", "4L40", "3T", "3L35"], doubleteam: ["7M", "6M", "5M", "4M", "3M"], - dracometeor: ["5S14", "4S12"], + dracometeor: ["5S6", "4S4"], drainpunch: ["8M", "7T", "6T", "5T", "4M"], dreameater: ["7M", "6M", "5M", "4M", "3T"], dynamicpunch: ["3T"], @@ -44437,17 +44437,17 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab flash: ["6M", "5M", "4M", "3M"], flashcannon: ["8M", "7M", "6M", "5M", "4M"], fling: ["8M", "7M", "6M", "5M", "4M"], - followme: ["5S14"], + followme: ["5S6"], frustration: ["7M", "6M", "5M", "4M", "3M"], futuresight: ["8M", "8L70", "7L55", "6L55", "5L55", "4L55", "3L40"], gigaimpact: ["8M", "7M", "6M", "5M", "4M"], grassknot: ["8M", "7M", "6M", "5M", "4M"], gravity: ["8L35", "7T", "7L45", "6T", "6L45", "5T", "5L45", "4T", "4L45"], - happyhour: ["6S20"], + happyhour: ["6S12"], headbutt: ["4T"], - healingwish: ["8L56", "7L50", "7S22", "6L50", "6S17", "5L50", "5S13", "5S15", "5S16", "4L50"], - heartstamp: ["6S19"], - helpinghand: ["8M", "8L14", "7T", "7L15", "6T", "6L15", "6S18", "5T", "5L15", "4T", "4L15", "3L15", "3S10"], + healingwish: ["8L56", "7L50", "7S14", "6L50", "6S9", "5L50", "5S5", "5S7", "5S8", "4L50"], + heartstamp: ["6S11"], + helpinghand: ["8M", "8L14", "7T", "7L15", "6T", "6L15", "6S10", "5T", "5L15", "4T", "4L15", "3L15", "3S2"], hiddenpower: ["7M", "6M", "5M", "4M", "3M"], hyperbeam: ["8M", "7M", "6M", "5M", "4M", "3M"], icepunch: ["8M", "7T", "6T", "5T", "4T", "3T"], @@ -44464,25 +44464,25 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab megakick: ["8M"], megapunch: ["8M"], meteorbeam: ["8T"], - meteormash: ["8L49", "8S23", "5S13", "5S14", "5S15"], + meteormash: ["8L49", "8S15", "5S5", "5S6", "5S7"], metronome: ["8M", "3T"], mimic: ["3T"], - moonblast: ["6S17"], + moonblast: ["6S9"], mudslap: ["4T", "3T"], naturalgift: ["4M"], nightmare: ["3T"], - playrough: ["8M", "6S19"], + playrough: ["8M", "6S11"], poweruppunch: ["6M"], protect: ["8M", "7M", "6M", "5M", "4M", "3M"], - psychic: ["8M", "8L42", "8S23", "7M", "7L20", "6M", "6L20", "5M", "5L20", "5S13", "4M", "4L20", "3M", "3L20", "3S10"], + psychic: ["8M", "8L42", "8S15", "7M", "7L20", "6M", "6L20", "5M", "5L20", "5S5", "4M", "4L20", "3M", "3L20", "3S2"], psychup: ["7M", "6M", "5M", "4M", "3T"], psyshock: ["8M", "7M", "6M", "5M"], raindance: ["8M", "7M", "6M", "5M", "4M", "3M"], recycle: ["7T", "6T", "5T", "4M"], reflect: ["8M", "7M", "6M", "5M", "4M", "3M"], - refresh: ["7L25", "6L25", "5L25", "4L25", "3L25", "3S10"], - rest: ["8M", "8L63", "8S23", "7M", "7L30", "7S22", "6M", "6L5", "6S21", "5M", "5L5", "4M", "4L5", "4S11", "4S12", "3M", "3L5", "3S0", "3S1", "3S2", "3S3", "3S4", "3S5", "3S6", "3S7", "3S8", "3S9", "3S10"], - return: ["7M", "6M", "6S18", "5M", "5S16", "4M", "3M"], + refresh: ["7L25", "6L25", "5L25", "4L25", "3L25", "3S2"], + rest: ["8M", "8L63", "8S15", "7M", "7L30", "7S14", "6M", "6L5", "6S13", "5M", "5L5", "4M", "4L5", "4S3", "4S4", "3M", "3L5", "3S0", "3S1", "3S2"], + return: ["7M", "6M", "6S10", "5M", "5S8", "4M", "3M"], round: ["8M", "7M", "6M", "5M"], safeguard: ["8M", "7M", "6M", "5M", "4M", "3M"], sandstorm: ["8M", "7M", "6M", "5M", "4M", "3M"], @@ -44499,7 +44499,7 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab substitute: ["8M", "7M", "6M", "5M", "4M", "3T"], sunnyday: ["8M", "7M", "6M", "5M", "4M", "3M"], swagger: ["7M", "6M", "5M", "4M", "3T"], - swift: ["8M", "8L7", "7L10", "7S22", "6L10", "6S17", "6S20", "5L10", "5S13", "5S16", "4T", "4L10", "3T", "3L10"], + swift: ["8M", "8L7", "7L10", "7S14", "6L10", "6S9", "6S12", "5L10", "5S5", "5S8", "4T", "4L10", "3T", "3L10"], telekinesis: ["7T", "5M"], thunder: ["8M", "7M", "6M", "5M", "4M", "3M"], thunderbolt: ["8M", "7M", "6M", "5M", "4M", "3M"], @@ -44511,20 +44511,12 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab uproar: ["8M", "7T", "6T", "5T", "4T"], uturn: ["8M", "7M", "6M", "5M", "4M"], waterpulse: ["7T", "6T", "4M", "3M"], - wish: ["8L1", "8S23", "7L1", "7S22", "6L1", "6S17", "6S18", "6S19", "6S20", "6S21", "5L1", "5S14", "5S15", "5S16", "4L1", "4S11", "4S12", "3L1", "3S0", "3S1", "3S2", "3S3", "3S4", "3S5", "3S6", "3S7", "3S8", "3S9"], + wish: ["8L1", "8S15", "7L1", "7S14", "6L1", "6S9", "6S10", "6S11", "6S12", "6S13", "5L1", "5S6", "5S7", "5S8", "4L1", "4S3", "4S4", "3L1", "3S0", "3S1"], zenheadbutt: ["8M", "8L28", "7T", "7L35", "6T", "6L35", "5T", "5L35", "4T", "4L35"], }, eventData: [ {generation: 3, level: 5, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Bashful", ivs: {hp: 24, atk: 3, def: 30, spa: 12, spd: 16, spe: 11}, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Careful", ivs: {hp: 10, atk: 0, def: 10, spa: 10, spd: 26, spe: 12}, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Docile", ivs: {hp: 19, atk: 7, def: 10, spa: 19, spd: 10, spe: 16}, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Hasty", ivs: {hp: 3, atk: 12, def: 12, spa: 7, spd: 11, spe: 9}, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Jolly", ivs: {hp: 11, atk: 8, def: 6, spa: 14, spd: 5, spe: 20}, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Lonely", ivs: {hp: 31, atk: 23, def: 26, spa: 29, spd: 18, spe: 5}, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Naughty", ivs: {hp: 21, atk: 31, def: 31, spa: 18, spd: 24, spe: 19}, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Serious", ivs: {hp: 29, atk: 10, def: 31, spa: 25, spd: 23, spe: 21}, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, - {generation: 3, level: 5, shiny: true, nature: "Timid", ivs: {hp: 15, atk: 28, def: 29, spa: 3, spd: 0, spe: 7}, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, + {generation: 3, level: 5, shiny: 1, moves: ["wish", "confusion", "rest"], pokeball: "pokeball"}, {generation: 3, level: 30, moves: ["helpinghand", "psychic", "refresh", "rest"], pokeball: "pokeball"}, {generation: 4, level: 5, moves: ["wish", "confusion", "rest"], pokeball: "cherishball"}, {generation: 4, level: 5, moves: ["wish", "confusion", "rest", "dracometeor"], pokeball: "cherishball"}, diff --git a/test/sim/team-validator/events.js b/test/sim/team-validator/events.js index 451811dd05ac..e3c1a75d322a 100644 --- a/test/sim/team-validator/events.js +++ b/test/sim/team-validator/events.js @@ -150,18 +150,6 @@ describe('Team Validator', function () { assert.false.legalTeam(team, 'gen7anythinggoes'); }); - it('should identify the minimum source gen of event-only Pokemon which haven\'t already been identified by its moves', function () { - let team = [ - {species: 'jirachi', ability: 'serenegrace', shiny: true, moves: ['aurasphere'], evs: {hp: 1}, ivs: {hp: 31, atk: 0, def: 31, spa: 31, spd: 31, spe: 31}}, - ]; - assert.legalTeam(team, 'gen9ou'); - - team = [ - {species: 'jirachi', ability: 'serenegrace', shiny: true, moves: ['hiddenpowerfighting'], nature: 'serious', evs: {hp: 1}, ivs: {hp: 31, atk: 0, def: 31, spa: 31, spd: 31, spe: 31}}, - ]; - assert.false.legalTeam(team, 'gen7ou'); - }); - it.skip('should allow evolved Pokemon obtainable from events at lower levels than they could otherwise be obtained', function () { const team = [ {species: 'dragonite', ability: 'innerfocus', moves: ['dracometeor'], evs: {hp: 1}, level: 50},