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/config/formats.ts b/config/formats.ts index e5e71644fe84..41ed7ddb2b05 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 /////////////////////////////////////////////////////////////////// @@ -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", @@ -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', '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', ], }, { @@ -468,8 +467,9 @@ export const 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', '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!`); @@ -491,6 +491,7 @@ export const 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'], }, @@ -621,379 +622,103 @@ 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] 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: [ - `• Cross Evolution`, + `• Frantic Fusions`, ], mod: 'gen9', // searchShow: false, - ruleset: ['Standard OMs', 'Sleep Moves Clause', 'Terastal Clause'], + ruleset: ['Standard OMs', '!Nickname Clause', '!Obtainable Abilities', 'Sleep Moves Clause', 'Frantic Fusions Mod', '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', + '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', ], - 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; - } - }, }, { - 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] Category Swap", + desc: `All Special moves become Physical, and all Physical moves become Special.`, threads: [ - `Physical types: `, - `Special types: `, - `Dependent on the user's higher attacking stat:
Type Split`, + `• Category Swap`, ], mod: 'gen9', - // searchShow: false, - ruleset: ['Standard OMs', 'Sleep Moves Clause', 'Evasion Abilities Clause'], + ruleset: ['Standard OMs', 'Sleep Clause Mod', 'Category Swap Mod'], 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', + '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', ], - 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 9] Partners in Crime", - desc: `Doubles-based metagame where both active ally Pokémon share abilities and moves.`, + name: "[Gen 9] Inheritance", + desc: `Pokémon may use the ability and moves of another, as long as they forfeit their own learnset.`, threads: [ - `• Partners in Crime`, + `• Inheritance`, ], - mod: 'partnersincrime', - gameType: 'doubles', - ruleset: ['Standard Doubles'], + mod: 'gen9', + ruleset: ['Standard OMs', 'Ability Clause = 1', 'Sleep Moves Clause', 'Terastal 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', + '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', ], - onBegin() { - for (const pokemon of this.getAllPokemon()) { - pokemon.m.trackPP = new Map(); + getEvoFamily(speciesid) { + let species = Dex.species.get(speciesid); + while (species.prevo) { + const prevoSpecies = Dex.species.get(species.prevo); + if (prevoSpecies.evos.length > 1) break; + species = prevoSpecies; } + return species.id; }, - 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; + validateSet(set, teamHas) { + if (!teamHas.abilityMap) { + teamHas.abilityMap = Object.create(null); + for (const pokemon of Dex.species.all()) { + if (pokemon.isNonstandard && !this.ruleTable.has(`+pokemontag:${this.toID(pokemon.isNonstandard)}`)) continue; + if (pokemon.battleOnly) continue; + if (this.ruleTable.isBannedSpecies(pokemon)) continue; + + for (const key of Object.values(pokemon.abilities)) { + const abilityId = this.dex.toID(key); + if (abilityId in teamHas.abilityMap) { + teamHas.abilityMap[abilityId][pokemon.evos ? 'push' : 'unshift'](pokemon.id); + } else { + teamHas.abilityMap[abilityId] = [pokemon.id]; + } } } } - }, - // Starting innate abilities in scripts#actions - onSwitchOut(pokemon) { - if (pokemon.m.innate) { - pokemon.removeVolatile(pokemon.m.innate); - delete pokemon.m.innate; + + const problem = this.validateForme(set); + if (problem.length) return problem; + + const species = this.dex.species.get(set.species); + if (!species.exists || species.num < 1) return [`The Pok\u00e9mon "${set.species}" does not exist.`]; + if (species.isNonstandard && !this.ruleTable.has(`+pokemontag:${this.toID(species.isNonstandard)}`)) { + return [`${species.name} is not obtainable in Generation ${this.dex.gen}.`]; } - const 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 - /////////////////////////////////////////////////////////////////// - - { - 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', '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.`, - threads: [ - `• Inheritance`, - ], - - 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', - ], - getEvoFamily(speciesid) { - let species = Dex.species.get(speciesid); - while (species.prevo) { - const prevoSpecies = Dex.species.get(species.prevo); - if (prevoSpecies.evos.length > 1) break; - species = prevoSpecies; - } - return species.id; - }, - validateSet(set, teamHas) { - if (!teamHas.abilityMap) { - teamHas.abilityMap = Object.create(null); - for (const pokemon of Dex.species.all()) { - if (pokemon.isNonstandard && !this.ruleTable.has(`+pokemontag:${this.toID(pokemon.isNonstandard)}`)) continue; - if (pokemon.battleOnly) continue; - if (this.ruleTable.isBannedSpecies(pokemon)) continue; - - for (const key of Object.values(pokemon.abilities)) { - const abilityId = this.dex.toID(key); - if (abilityId in teamHas.abilityMap) { - teamHas.abilityMap[abilityId][pokemon.evos ? 'push' : 'unshift'](pokemon.id); - } else { - teamHas.abilityMap[abilityId] = [pokemon.id]; - } - } - } - } - - const problem = this.validateForme(set); - if (problem.length) return problem; - - const species = this.dex.species.get(set.species); - if (!species.exists || species.num < 1) return [`The Pok\u00e9mon "${set.species}" does not exist.`]; - if (species.isNonstandard && !this.ruleTable.has(`+pokemontag:${this.toID(species.isNonstandard)}`)) { - return [`${species.name} is not obtainable in Generation ${this.dex.gen}.`]; - } - - const name = set.name; - if (this.ruleTable.isBannedSpecies(species)) { - return this.validateSet(set, teamHas); + + const name = set.name; + if (this.ruleTable.isBannedSpecies(species)) { + return this.validateSet(set, teamHas); } const ability = this.dex.abilities.get(set.ability); @@ -1047,7 +772,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', @@ -1073,13 +798,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); } } @@ -1130,6 +855,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.`, @@ -1142,13 +940,13 @@ 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', - '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', 'Solgaleo', 'Ursaluna-Bloodmoon', 'Urshifu-Base', 'Zacian', 'Zekrom', ], onValidateTeam(team) { const itemTable = new Set(); @@ -1203,6 +1001,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', 'Evasion Abilities Clause'], + banlist: [ + 'Annihilape', 'Arceus', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Cresselia', 'Darkrai', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', 'Eternatus', 'Flutter Mane', + 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Koraidon', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Miraidon', + 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Reshiram', 'Smeargle', 'Solgaleo', 'Terapagos', 'Urshifu', 'Urshifu-Rapid-Strike', + 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Contrary', 'Dancer', 'Huge Power', 'Moody', 'Pure Power', 'Serene Grace', 'Shadow Tag', + 'Stench', 'Bright Powder', 'King\'s Rock', 'Razor Fang', 'Ally Switch', 'Dragon Cheer', 'Last Respects', 'Revival Blessing', 'Swagger', + ], + onBegin() { + for (const pokemon of this.getAllPokemon()) { + pokemon.m.trackPP = 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.`, @@ -1213,12 +1085,11 @@ export const 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: [ @@ -1282,12 +1153,12 @@ export const 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', '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', + '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', @@ -1312,6 +1183,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.`, @@ -1319,38 +1202,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; + + 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 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', - ], + return mixedSpecies; + }, + onBegin() { + for (const pokemon of this.getAllPokemon()) { + pokemon.baseSpecies = pokemon.species; + } + }, }, { name: "[Gen 9] Fervent Impersonation", @@ -1607,28 +1627,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.`, @@ -1641,11 +1639,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', ], }, { @@ -2179,9 +2177,10 @@ 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.)`); + 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.)`); } } return problems; @@ -2220,11 +2219,43 @@ 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; }, }, + { + 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 +2289,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: [ @@ -2292,7 +2342,23 @@ 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", + threads: [ + `• National Dex Little Cup`, + ], + + mod: 'gen9', + searchShow: false, + ruleset: ['Standard NatDex', 'Little Cup', 'Species Clause', 'OHKO Clause', 'Evasion Clause', 'Sleep Clause Mod'], + banlist: [ + 'Aipom', 'Basculin-White-Striped', 'Clamperl', 'Corsola-Galar', 'Cutiefly', 'Drifloon', 'Dunsparce', 'Duraludon', 'Flittle', 'Girafarig', + 'Gligar', 'Meditite', 'Misdreavus', 'Murkrow', 'Porygon', 'Qwilfish-Hisui', 'Rufflet', 'Scraggy', 'Scyther', 'Sneasel', 'Sneasel-Hisui', + 'Stantler', 'Swirlix', 'Tangela', 'Vulpix-Alola', 'Woobat', 'Yanma', 'Zigzagoon-Base', 'Chlorophyll', 'Moody', 'Eevium Z', 'King\'s Rock', + 'Quick Claw', 'Razor Fang', 'Assist', 'Baton Pass', 'Dragon Rage', 'Sonic Boom', 'Sticky Web', + ], }, { name: "[Gen 9] National Dex Monotype", @@ -2340,6 +2406,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', @@ -2367,22 +2434,22 @@ 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', - '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', + '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', '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) { // 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) { @@ -2394,18 +2461,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: [ @@ -2447,22 +2502,12 @@ 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.", - - 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] Random Roulette", - desc: `Random Battles in a random generation! [Gen 1] Random Battle - [Gen 9] Random Battle.`, + 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: 'randomroulette', + mod: 'gen9', team: 'random', - searchShow: false, + ruleset: ['[Gen 9] Random Battle'], }, // Randomized Metas @@ -2472,6 +2517,14 @@ export const Formats: FormatList = [ section: "Randomized Metas", column: 3, }, + { + name: "[Gen 9] Random Roulette", + desc: `Random Battles in a random generation! [Gen 1] Random Battle - [Gen 9] Random Battle.`, + + mod: 'randomroulette', + team: 'random', + searchShow: false, + }, { 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.", @@ -2569,6 +2622,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. ` + @@ -3084,41 +3155,38 @@ export const Formats: FormatList = [ column: 4, }, { - name: "[Gen 6] UU", + name: "[Gen 8] UU", threads: [ - `• ORAS UU Banlist`, - `• ORAS UU Viability Rankings`, + `• UU Metagame Discussion`, + `• UU Sample Teams`, + `• UU Viability Rankings`, ], - mod: 'gen6', + mod: 'gen8', // searchShow: false, - ruleset: ['[Gen 6] OU'], - banlist: ['OU', 'UUBL', 'Drizzle', 'Drought'], + ruleset: ['[Gen 8] OU'], + banlist: ['OU', 'UUBL', 'Light Clay'], }, { - name: "[Gen 3] UUBL", + name: "[Gen 5] BW1 OU", threads: [ - `• ADV UUBL Metagame Discussion`, + `• BW1 OU`, ], - mod: 'gen3', - ruleset: ['Standard', 'One Boost Passer Clause'], - banlist: [ - 'Uber', 'OU', 'Smeargle + Baton Pass', 'Smeargle + Ingrain', 'Soundproof', 'Assist', - 'Baton Pass + Block', 'Baton Pass + Mean Look', 'Baton Pass + Spider Web', 'Swagger', - ], + mod: 'gen5bw1', + ruleset: ['Standard', 'Sleep Clause Mod', 'Swagger Clause', 'Baton Pass Stat Clause'], + banlist: ['Uber', 'Drizzle ++ Swift Swim', 'King\'s Rock', 'Razor Fang', 'Soul Dew'], }, { - name: "[Gen 7] RU", + name: "[Gen 1] ZU", threads: [ - `• USM RU Resources`, + `• RBY ZU Metagame Discussion & Resources`, ], - mod: 'gen7', + mod: 'gen1', // searchShow: false, - ruleset: ['[Gen 7] UU'], - banlist: ['UU', 'RUBL', 'Mimikyu', 'Aurora Veil'], - unbanlist: ['Drought'], + ruleset: ['[Gen 1] PU'], + banlist: ['PU', 'ZUBL'], }, // Past Gens OU @@ -3328,19 +3396,6 @@ export const Formats: FormatList = [ ruleset: ['Standard', 'Dynamax Clause'], banlist: ['AG', 'Shadow Tag', 'Baton Pass'], }, - { - name: "[Gen 8] UU", - threads: [ - `• UU Metagame Discussion`, - `• UU Sample Teams`, - `• UU Viability Rankings`, - ], - - mod: 'gen8', - searchShow: false, - ruleset: ['[Gen 8] OU'], - banlist: ['OU', 'UUBL', 'Light Clay'], - }, { name: "[Gen 8] RU", threads: [ @@ -3636,6 +3691,18 @@ export const Formats: FormatList = [ ruleset: ['[Gen 7] OU'], banlist: ['OU', 'UUBL', 'Drizzle', 'Drought', 'Kommonium Z', 'Mewnium Z'], }, + { + name: "[Gen 7] RU", + threads: [ + `• USM RU Resources`, + ], + + mod: 'gen7', + searchShow: false, + ruleset: ['[Gen 7] UU'], + banlist: ['UU', 'RUBL', 'Mimikyu', 'Aurora Veil'], + unbanlist: ['Drought'], + }, { name: "[Gen 7] NU", threads: [ @@ -3926,6 +3993,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: [ @@ -4665,7 +4744,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", @@ -4744,6 +4823,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/abilities.ts b/data/abilities.ts index 22a93e26b12e..3fd16cdba3bc 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: {}, @@ -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; }, @@ -2259,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; @@ -3403,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; @@ -4231,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); @@ -4851,7 +4868,7 @@ export const Abilities: {[abilityid: string]: AbilityData} = { 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/data/aliases.ts b/data/aliases.ts index 083913c30fca..f289a35e3915 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", @@ -60,18 +60,22 @@ export const Aliases: {[alias: string]: string} = { 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", - bssf: "[Gen 8] BSS 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", lgrandom: "[Gen 7] Let's Go Random Battle", 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", 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", @@ -85,8 +89,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] Frantic Fusions", + lcotm: "[Gen 9] Category Swap", // mega evos fabio: "Ampharos-Mega", @@ -108,6 +112,8 @@ export const Aliases: {[alias: string]: string} = { 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", @@ -173,6 +179,9 @@ export const Aliases: {[alias: string]: string} = { 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", @@ -219,10 +228,12 @@ export const Aliases: {[alias: string]: string} = { 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", @@ -263,9 +274,19 @@ export const Aliases: {[alias: string]: string} = { 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", @@ -283,18 +304,75 @@ export const Aliases: {[alias: string]: string} = { 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", @@ -348,6 +426,17 @@ export const Aliases: {[alias: string]: string} = { 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", @@ -380,6 +469,46 @@ export const Aliases: {[alias: string]: string} = { 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", @@ -562,18 +691,29 @@ export const Aliases: {[alias: string]: string} = { 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", @@ -583,6 +723,7 @@ export const Aliases: {[alias: string]: string} = { lefties: "Leftovers", lo: "Life Orb", lorb: "Life Orb", + nmi: "Never-Melt Ice", sash: "Focus Sash", scarf: "Choice Scarf", specs: "Choice Specs", @@ -691,115 +832,178 @@ export const Aliases: {[alias: string]: string} = { // 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", @@ -808,28 +1012,41 @@ export const Aliases: {[alias: string]: string} = { 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", @@ -850,19 +1067,28 @@ export const Aliases: {[alias: string]: string} = { 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", hp: "Hidden Power", hpbug: "Hidden Power Bug", hpdark: "Hidden Power Dark", @@ -882,10 +1108,18 @@ export const Aliases: {[alias: string]: string} = { 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", @@ -897,13 +1131,18 @@ export const Aliases: {[alias: string]: string} = { 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 @@ -1857,4 +2096,40 @@ export const Aliases: {[alias: string]: string} = { 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", }; 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..5748bbbc2033 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[this.dex.toID(ability)] || {})[move.id] || 1) * + ((ABILITY_MOVE_TYPE_BONUSES[this.dex.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 3870cc56b392..9b6ea31be055 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", }, @@ -320,6 +320,8 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { }, vulpix: { tier: "NFE", + doublesTier: "NFE", + natDexTier: "LC", }, vulpixalola: { tier: "NFE", @@ -467,7 +469,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { }, arcaninehisui: { tier: "UU", - doublesTier: "DOU", + doublesTier: "DUU", natDexTier: "RU", }, poliwag: { @@ -593,7 +595,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { tier: "LC", }, slowbro: { - tier: "NU", + tier: "RU", doublesTier: "(DUU)", natDexTier: "UU", }, @@ -626,7 +628,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { natDexTier: "NFE", }, magnezone: { - tier: "NU", + tier: "RU", doublesTier: "(DUU)", natDexTier: "UU", }, @@ -796,7 +798,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { tier: "LC", }, hitmonlee: { - tier: "ZUBL", + tier: "ZU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -829,7 +831,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { natDexTier: "RU", }, weezinggalar: { - tier: "UU", + tier: "RU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -842,7 +844,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { natDexTier: "NFE", }, rhyperior: { - tier: "NU", + tier: "UU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -862,7 +864,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { tangela: { isNonstandard: "Past", tier: "Illegal", - natDexTier: "LC", + natDexTier: "NFE", }, tangrowth: { isNonstandard: "Past", @@ -886,7 +888,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { tier: "NFE", }, kingdra: { - tier: "ZU", + tier: "ZUBL", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -1166,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: { @@ -1202,7 +1204,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { natDexTier: "Uber", }, mew: { - tier: "NU", + tier: "NUBL", doublesTier: "(DUU)", natDexTier: "RUBL", }, @@ -1455,7 +1457,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { }, gliscor: { tier: "OU", - doublesTier: "(DUU)", + doublesTier: "DUU", natDexTier: "OU", }, snubbull: { @@ -1561,7 +1563,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { corsolagalar: { isNonstandard: "Past", tier: "Illegal", - natDexTier: "LC", + natDexTier: "NFE", }, cursola: { isNonstandard: "Past", @@ -1638,7 +1640,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { natDexTier: "RU", }, raikou: { - tier: "NU", + tier: "PUBL", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -1666,7 +1668,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { tyranitarmega: { isNonstandard: "Past", tier: "Illegal", - natDexTier: "UU", + natDexTier: "OU", }, lugia: { tier: "Uber", @@ -1690,7 +1692,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { tier: "NFE", }, sceptile: { - tier: "ZUBL", + tier: "ZU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -1731,7 +1733,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { swampertmega: { isNonstandard: "Past", tier: "Illegal", - natDexTier: "UU", + natDexTier: "OU", }, poochyena: { tier: "LC", @@ -1744,7 +1746,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { zigzagoon: { isNonstandard: "Past", tier: "Illegal", - natDexTier: "LC", + natDexTier: "NFE", }, zigzagoongalar: { isNonstandard: "Past", @@ -1869,7 +1871,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { tier: "LC", }, breloom: { - tier: "RU", + tier: "NU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -2090,7 +2092,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { natDexTier: "RU", }, torkoal: { - tier: "OU", + tier: "UU", doublesTier: "DOU", natDexTier: "RU", }, @@ -2315,7 +2317,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { clamperl: { isNonstandard: "Past", tier: "Illegal", - natDexTier: "LC", + natDexTier: "NFE", }, huntail: { isNonstandard: "Past", @@ -2450,7 +2452,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { natDexTier: "Uber", }, deoxysdefense: { - tier: "RU", + tier: "NU", doublesTier: "(DUU)", natDexTier: "RUBL", }, @@ -2617,6 +2619,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { }, drifloon: { tier: "LC", + natDexTier: "NFE", }, drifblim: { tier: "ZU", @@ -2786,7 +2789,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { natDexTier: "RU", }, uxie: { - tier: "ZU", + tier: "ZUBL", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -2841,7 +2844,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { natDexTier: "Uber", }, cresselia: { - tier: "RU", + tier: "NU", doublesTier: "DOU", natDexTier: "RU", }, @@ -2887,7 +2890,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { tier: "NFE", }, serperior: { - tier: "OU", + tier: "UU", doublesTier: "(DUU)", natDexTier: "OU", }, @@ -2898,7 +2901,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { tier: "NFE", }, emboar: { - tier: "ZU", + tier: "ZUBL", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -3034,7 +3037,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { woobat: { isNonstandard: "Past", tier: "Illegal", - natDexTier: "LC", + natDexTier: "NFE", }, swoobat: { isNonstandard: "Past", @@ -3046,7 +3049,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { }, excadrill: { tier: "UU", - doublesTier: "DUU", + doublesTier: "(DUU)", natDexTier: "UU", }, audino: { @@ -3127,7 +3130,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { tier: "LC", }, whimsicott: { - tier: "PU", + tier: "ZU", doublesTier: "DOU", natDexTier: "RU", }, @@ -3141,7 +3144,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { }, lilliganthisui: { tier: "NUBL", - doublesTier: "DUU", + doublesTier: "(DUU)", natDexTier: "RUBL", }, basculin: { @@ -3166,7 +3169,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { tier: "NFE", }, krookodile: { - tier: "NU", + tier: "RU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -3298,7 +3301,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { tier: "LC", }, cinccino: { - tier: "RU", + tier: "NU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -3320,7 +3323,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { tier: "NFE", }, reuniclus: { - tier: "NU", + tier: "RU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -3467,7 +3470,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { haxorus: { tier: "RUBL", doublesTier: "(DUU)", - natDexTier: "UU", + natDexTier: "RUBL", }, cubchoo: { tier: "LC", @@ -3587,7 +3590,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { natDexTier: "OU", }, cobalion: { - tier: "RU", + tier: "UU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -3612,7 +3615,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { natDexTier: "UUBL", }, thundurus: { - tier: "NU", + tier: "RU", doublesTier: "DUU", natDexTier: "RU", }, @@ -3746,7 +3749,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { }, talonflame: { tier: "NU", - doublesTier: "DUU", + doublesTier: "(DUU)", natDexTier: "RU", }, scatterbug: { @@ -3845,7 +3848,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { swirlix: { isNonstandard: "Past", tier: "Illegal", - natDexTier: "LC", + natDexTier: "NFE", }, slurpuff: { isNonstandard: "Past", @@ -3946,7 +3949,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { natDexTier: "RU", }, goodrahisui: { - tier: "UU", + tier: "RU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -4008,7 +4011,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { tier: "LC", }, noivern: { - tier: "NU", + tier: "RU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -4052,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: { @@ -4174,7 +4177,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { tier: "NFE", }, ribombee: { - tier: "OU", + tier: "UU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -4231,7 +4234,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { tier: "LC", }, araquanid: { - tier: "RU", + tier: "NU", doublesTier: "DUU", natDexTier: "RU", }, @@ -4295,7 +4298,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { natDexTier: "RU", }, comfey: { - tier: "RUBL", + tier: "UU", doublesTier: "DUU", natDexTier: "RU", }, @@ -4486,7 +4489,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { tier: "NFE", }, kommoo: { - tier: "UU", + tier: "UUBL", doublesTier: "(DUU)", natDexTier: "UUBL", }, @@ -4538,7 +4541,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { buzzwole: { isNonstandard: "Past", tier: "Illegal", - natDexTier: "RUBL", + natDexTier: "UU", }, pheromosa: { isNonstandard: "Past", @@ -4638,7 +4641,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { tier: "LC", }, thwackey: { - tier: "ZU", + tier: "ZUBL", doublesTier: "NFE", natDexTier: "NFE", }, @@ -4923,7 +4926,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { tier: "LC", }, alcremie: { - tier: "ZU", + tier: "ZUBL", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -4960,7 +4963,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { natDexTier: "RU", }, indeedee: { - tier: "UU", + tier: "NU", doublesTier: "DUU", natDexTier: "RU", }, @@ -4978,7 +4981,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { tier: "LC", }, copperajah: { - tier: "NU", + tier: "PU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -4989,7 +4992,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { dracozolt: { isNonstandard: "Past", tier: "Illegal", - natDexTier: "UU", + natDexTier: "RU", }, arctozolt: { isNonstandard: "Past", @@ -5039,7 +5042,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { zamazenta: { tier: "OU", doublesTier: "DUber", - natDexTier: "OU", + natDexTier: "Uber", }, zamazentacrowned: { tier: "Uber", @@ -5083,7 +5086,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { }, regieleki: { tier: "Uber", - doublesTier: "DUU", + doublesTier: "(DUU)", natDexTier: "Uber", }, regidrago: { @@ -5337,7 +5340,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { natDexTier: "RU", }, bombirdier: { - tier: "ZU", + tier: "PU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -5381,7 +5384,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { tier: "LC", }, grafaiai: { - tier: "PU", + tier: "ZU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -5492,7 +5495,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { }, tinglu: { tier: "OU", - doublesTier: "DUU", + doublesTier: "DOU", natDexTier: "UU", }, chienpao: { @@ -5583,7 +5586,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { sinistcha: { tier: "UU", doublesTier: "DOU", - natDexTier: "UU", + natDexTier: "RU", }, okidogi: { tier: "RU", @@ -5646,7 +5649,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { natDexTier: "UU", }, ironcrown: { - tier: "UU", + tier: "OU", doublesTier: "DUU", natDexTier: "OU", }, @@ -5657,8 +5660,8 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { }, pecharunt: { tier: "UU", - doublesTier: "DUU", - natDexTier: "RU", + doublesTier: "(DUU)", + natDexTier: "RUBL", }, missingno: { isNonstandard: "Custom", diff --git a/data/items.ts b/data/items.ts index 60f77fd76ff1..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, @@ -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/learnsets.ts b/data/learnsets.ts index 35cb913b03f3..b4812ca0aa26 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"], @@ -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"]}, @@ -46443,14 +46434,14 @@ export const Learnsets: {[k: string]: LearnsetData} = { 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"], @@ -46464,17 +46455,17 @@ export const Learnsets: {[k: string]: LearnsetData} = { 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"], @@ -46492,27 +46483,27 @@ export const Learnsets: {[k: string]: LearnsetData} = { 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"], @@ -46529,7 +46520,7 @@ export const Learnsets: {[k: string]: LearnsetData} = { 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"], @@ -46542,20 +46533,12 @@ export const Learnsets: {[k: string]: LearnsetData} = { 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"}, @@ -68363,7 +68346,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 +68383,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 +68397,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 +68410,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"], @@ -99486,7 +99467,6 @@ export const Learnsets: {[k: string]: LearnsetData} = { destinybond: ["9L1"], dracometeor: ["9M"], dragontail: ["9M"], - drainingkiss: ["9M"], encore: ["9M"], endure: ["9M"], facade: ["9M"], 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..1f32d735c070 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", }, @@ -213,7 +213,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { tier: "OU", }, tentacool: { - tier: "LC", + tier: "ZU", }, tentacruel: { tier: "UU", @@ -228,7 +228,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { tier: "UU", }, ponyta: { - tier: "LC", + tier: "ZU", }, rapidash: { tier: "PU", @@ -330,7 +330,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { tier: "ZU", }, rhyhorn: { - tier: "LC", + tier: "ZU", }, rhydon: { tier: "OU", 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 c914865d28ad..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", }, @@ -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", 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 ba42dd09525b..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() {}, @@ -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/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 448e44caba69..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}, @@ -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); } }, 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 4095e0628697..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'], @@ -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/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..b0a69fbc204f 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: { @@ -27204,13 +27204,13 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { 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: {[k: string]: ModdedLearnsetData} = { 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: {[k: string]: ModdedLearnsetData} = { 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: {[k: string]: ModdedLearnsetData} = { 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/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..2354f267e290 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", }, @@ -1707,7 +1707,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { tier: "LC", }, toxicroak: { - tier: "OU", + tier: "(OU)", doublesTier: "DOU", }, carnivine: { @@ -2347,7 +2347,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { tier: "NFE", }, hydreigon: { - tier: "OU", + tier: "(OU)", doublesTier: "DOU", }, larvesta: { 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 818c368a608d..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: [ @@ -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/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 454df83921b6..6b7fb16a1c21 100644 --- a/data/mods/gen5bw1/formats-data.ts +++ b/data/mods/gen5bw1/formats-data.ts @@ -1,4 +1,85 @@ -export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { +export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormatsDataTable = { + 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", + }, + toxicroak: { + tier: "OU", + }, + 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", + }, + hydreigon: { + tier: "OU", + }, + virizion: { + tier: "OU", + }, + tornadus: { + tier: "OU", + }, tornadustherian: { isNonstandard: "Future", tier: "Illegal", @@ -7,6 +88,9 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = { isNonstandard: "Future", tier: "Illegal", }, + landorus: { + tier: "OU", + }, landorustherian: { isNonstandard: "Future", tier: "Illegal", 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..da74e3059e2b 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: { @@ -30363,13 +30363,13 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { 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: {[k: string]: ModdedLearnsetData} = { 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: {[k: string]: ModdedLearnsetData} = { 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: {[k: string]: ModdedLearnsetData} = { 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: {[k: string]: ModdedLearnsetData} = { 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/gen5bw1/pokedex.ts b/data/mods/gen5bw1/pokedex.ts index bbc0175826d5..b574c05cccd2 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, @@ -63,6 +63,14 @@ export const Pokedex: {[k: string]: ModdedSpeciesData} = { 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: {[k: string]: ModdedSpeciesData} = { inherit: true, unreleasedHidden: true, }, + dialga: { + inherit: true, + unreleasedHidden: true, + }, + palkia: { + inherit: true, + unreleasedHidden: true, + }, + giratina: { + inherit: true, + unreleasedHidden: true, + }, patrat: { 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..63b66371c538 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: { @@ -31885,14 +31885,14 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { 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: {[k: string]: ModdedLearnsetData} = { 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: {[k: string]: ModdedLearnsetData} = { 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: {[k: string]: ModdedLearnsetData} = { 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: {[k: string]: ModdedLearnsetData} = { 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/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 a823f0d178e9..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'], @@ -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'); 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..c29ff4ae3b72 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: { @@ -34830,14 +34830,14 @@ export const Learnsets: {[k: string]: ModdedLearnsetData} = { 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: {[k: string]: ModdedLearnsetData} = { 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: {[k: string]: ModdedLearnsetData} = { 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: {[k: string]: ModdedLearnsetData} = { 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: {[k: string]: ModdedLearnsetData} = { 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/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 3d343babdc72..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, @@ -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/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..85bdd920dbb5 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"], @@ -40891,14 +40891,14 @@ export const Learnsets: {[speciesid: string]: LearnsetData} = { 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: {[speciesid: string]: LearnsetData} = { 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: {[speciesid: string]: LearnsetData} = { 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: {[speciesid: string]: LearnsetData} = { 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: {[speciesid: string]: LearnsetData} = { 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/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..d04f2dc841db 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"], @@ -45364,14 +45364,14 @@ export const Learnsets: {[k: string]: LearnsetData} = { 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: {[k: string]: LearnsetData} = { 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: {[k: string]: LearnsetData} = { 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: {[k: string]: LearnsetData} = { 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: {[k: string]: LearnsetData} = { 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/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..6285448247f6 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"], @@ -44417,14 +44417,14 @@ export const Learnsets: {[speciesid: string]: LearnsetData} = { 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: {[speciesid: string]: LearnsetData} = { 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: {[speciesid: string]: LearnsetData} = { 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: {[speciesid: string]: LearnsetData} = { 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: {[speciesid: string]: LearnsetData} = { 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/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 73ff91f033b0..901db31a37f4 100644 --- a/data/mods/gen9ssb/abilities.ts +++ b/data/mods/gen9ssb/abilities.ts @@ -1,9 +1,9 @@ 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']; -export const Abilities: {[k: string]: ModdedAbilityData} = { +export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = { /* // Example abilityid: { @@ -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.", @@ -359,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.", @@ -472,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'); } } @@ -614,6 +648,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.", @@ -1034,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.", @@ -1111,14 +1217,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 +1384,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'); @@ -1472,7 +1576,7 @@ export const Abilities: {[k: string]: ModdedAbilityData} = { return this.chainModify(1.5); } }, - flags: {}, + flags: {cantsuppress: 1}, }, // maroon @@ -1502,6 +1606,77 @@ export const Abilities: {[k: string]: ModdedAbilityData} = { flags: {}, }, + // 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; + 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', 'ultramystik', + 'choicelock', 'stall', 'catstampofapproval', 'beefed', 'boiled', 'flipped', 'therollingspheal', 'treasurebag', + 'torisstori', 'anyonecanbekilled', 'sigilsstorm', 'wonderwing', 'riseabove', 'superrollout', 'meatgrinder', + 'risingsword', + ]; + 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'); + } + } + mon.clearBoosts(); + this.add('-clearboost', mon, '[from] ability: End Round', '[of] ' + pokemon); + } + }, + flags: {cantsuppress: 1}, + }, + + // Meteordash + tatsuglare: { + 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'; + }, + 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%.", @@ -1548,6 +1723,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.", @@ -1675,6 +1871,23 @@ export const Abilities: {[k: string]: ModdedAbilityData} = { }, }, + // Pastor Gigas + godsmercy: { + shortDesc: "Summons Grassy Terrain and cures the team's status conditions on switch-in.", + name: "God's Mercy", + onStart(source) { + this.field.setTerrain('grassyterrain'); + 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.", @@ -1768,11 +1981,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'); + } }, }, @@ -1843,7 +2056,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: { @@ -2524,7 +2738,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: {}, @@ -2635,6 +2849,121 @@ 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'); + }, + onResidual(target, source, effect) { + if (!target.volatiles['treasurebag']) 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']; + } + }, + 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; + } + } + }, + }, + }, + + // 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 8a77dc45afc6..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: { @@ -270,6 +271,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() { @@ -374,6 +387,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) { @@ -619,6 +644,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) { @@ -1056,6 +1092,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() { @@ -1125,7 +1173,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); @@ -1556,6 +1604,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() { @@ -1604,6 +1680,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() { @@ -1801,6 +1889,18 @@ 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`); + }, + }, peary: { noCopy: true, onStart() { @@ -2212,6 +2312,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() { @@ -2404,6 +2516,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) { @@ -2650,6 +2774,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() { @@ -2669,6 +2806,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) { @@ -2971,22 +3116,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 +3150,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/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 db5c63716c35..d5e47d8f1e48 100644 --- a/data/mods/gen9ssb/moves.ts +++ b/data/mods/gen9ssb/moves.ts @@ -1,8 +1,8 @@ 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} = { +export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { /* // Example moveid: { @@ -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); } } @@ -520,11 +520,6 @@ export const Moves: {[k: string]: ModdedMoveData} = { this.add('-anim', source, 'Earthquake', target); }, volatileStatus: 'flinch', - onHit(target, source, move) { - if (!source.getMoveHitData(move).crit) { - delete move.volatileStatus; - } - }, secondary: null, target: "normal", type: "???", @@ -623,6 +618,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, @@ -661,7 +686,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; @@ -885,6 +910,93 @@ export const Moves: {[k: string]: ModdedMoveData} = { type: "Water", }, + // Bert122 + shatterandscatter: { + accuracy: true, + 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, + 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, @@ -1445,6 +1557,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 +2124,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 +2138,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", }, @@ -2460,6 +2603,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, @@ -2946,7 +3114,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]'); }, @@ -2955,13 +3123,13 @@ 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; } }, - target: "self", + target: "normal", type: "Fairy", }, @@ -3548,6 +3716,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, @@ -3556,10 +3761,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'); @@ -3569,7 +3779,7 @@ 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'); @@ -3585,12 +3795,12 @@ 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.m.usedPlagiarism = true; }, noSketch: true, secondary: null, @@ -3620,7 +3830,7 @@ export const Moves: {[k: string]: ModdedMoveData} = { 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: { @@ -3719,6 +3929,62 @@ 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: 'qualitycontrolzoomies', + }, + condition: { + onSwap(target) { + if (!target.fainted) { + target.addVolatile('catstampofapproval'); + target.side.removeSlotCondition(target, 'qualitycontrolzoomies'); + } + }, + }, + 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, @@ -3837,7 +4103,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]'); }, @@ -3950,6 +4216,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, @@ -4390,7 +4687,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); } }, @@ -4942,6 +5239,52 @@ export const Moves: {[k: string]: ModdedMoveData} = { type: "Fire", }, + // Spiderz + shepherdofthemafiaroom: { + accuracy: 90, + basePower: 65, + 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, @@ -4950,16 +5293,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, @@ -5341,22 +5684,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 = "???"; @@ -5380,11 +5751,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: "???", }, @@ -5633,7 +6001,7 @@ export const Moves: {[k: string]: ModdedMoveData} = { type: "Grass", }, - // WarriorGallade - TODO: Fix animations + // WarriorGallade fruitfullongbow: { accuracy: 90, basePower: 160, @@ -5812,6 +6180,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, @@ -5842,6 +6292,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, @@ -6598,6 +7081,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..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: { @@ -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 @@ -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, @@ -139,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, @@ -239,6 +255,12 @@ export const Pokedex: {[k: string]: ModdedSpeciesData} = { abilities: {0: "Grassy Emperor"}, }, + // Daki + ragingbolt: { + inherit: true, + abilities: {0: "Astrothunder"}, + }, + // Dawn of Artemis necrozma: { inherit: true, @@ -408,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, @@ -603,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 @@ -631,6 +667,12 @@ export const Pokedex: {[k: string]: ModdedSpeciesData} = { abilities: {0: "Eon Call"}, }, + // Neko + chienpao: { + inherit: true, + abilities: {0: "Weatherproof"}, + }, + // Ney banette: { inherit: true, @@ -677,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, @@ -852,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, @@ -988,6 +1043,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, @@ -1082,12 +1143,23 @@ export const Pokedex: {[k: string]: ModdedSpeciesData} = { abilities: {0: "Panic"}, }, + // yeet dab xd + kecleon: { + inherit: true, + abilities: {0: "Treasure Bag"}, + }, + // Yellow Paint rotomfrost: { inherit: true, 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 fc41e2b746db..6d885cab0933 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'], @@ -180,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: [], @@ -288,6 +300,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'], @@ -445,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'], @@ -607,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', }, @@ -637,6 +667,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, spe: 252}, nature: 'Jolly', teraType: 'Fire', + }, Ney: { species: 'Banette', ability: 'Insomnia', item: 'Banettite', gender: 'M', moves: ['Destiny Bond', 'Will-O-Wisp', 'Parting Shot'], @@ -673,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'], @@ -836,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'], @@ -906,6 +954,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'], @@ -985,12 +1039,24 @@ 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'], 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/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/scripts.ts b/data/mods/gen9ssb/scripts.ts index e2a3523fd081..3695d72e3774 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 = '???'; @@ -702,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 @@ -854,6 +896,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; @@ -1355,7 +1398,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 +1519,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 +1540,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 +1554,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 +1588,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 +1721,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); } } 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/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/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 9f40194fe299..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, @@ -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, + }, }; 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/partnersincrime/scripts.ts b/data/mods/partnersincrime/scripts.ts index f167a02470e3..60fbc2d305c9 100644 --- a/data/mods/partnersincrime/scripts.ts +++ b/data/mods/partnersincrime/scripts.ts @@ -1,7 +1,9 @@ +import {Utils} from '../../../lib'; + export const Scripts: ModdedBattleScriptsData = { gen: 9, inherit: 'gen9', - nextTurn() { + endTurn() { this.turn++; this.lastSuccessfulMoveThisTurn = null; @@ -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/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/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/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/mods/trademarked/scripts.ts b/data/mods/trademarked/scripts.ts index b3b334f92516..c0533b79e71e 100644 --- a/data/mods/trademarked/scripts.ts +++ b/data/mods/trademarked/scripts.ts @@ -1,7 +1,9 @@ +import {Utils} from '../../../lib'; + export const Scripts: ModdedBattleScriptsData = { gen: 9, inherit: 'gen9', - nextTurn() { + endTurn() { this.turn++; this.lastSuccessfulMoveThisTurn = null; @@ -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/data/moves.ts b/data/moves.ts index 06c70b45a6cb..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, @@ -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/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 945d20647b55..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", @@ -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/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/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/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/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/gen2/teams.ts b/data/random-battles/gen2/teams.ts index 7810c2d9c711..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); @@ -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 db1e9ae3b45d..f5a7df1efdd3 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", @@ -513,11 +513,11 @@ "sets": [ { "role": "Bulky Setup", - "movepool": ["batonpass", "calmmind", "firepunch", "protect", "psychic", "wish"] + "movepool": ["batonpass", "calmmind", "firepunch", "psychic"] }, { "role": "Bulky Support", - "movepool": ["batonpass", "firepunch", "protect", "psychic", "wish"] + "movepool": ["firepunch", "protect", "psychic", "toxic", "wish"] }, { "role": "Staller", @@ -561,11 +561,15 @@ ] }, "marowak": { - "level": 82, + "level": 83, "sets": [ { "role": "Setup Sweeper", "movepool": ["doubleedge", "earthquake", "rockslide", "swordsdance"] + }, + { + "role": "Generalist", + "movepool": ["bonemerang", "doubleedge", "rockslide", "swordsdance"] } ] }, @@ -698,7 +702,7 @@ ] }, "jynx": { - "level": 81, + "level": 80, "sets": [ { "role": "Setup Sweeper", @@ -707,7 +711,7 @@ ] }, "electabuzz": { - "level": 83, + "level": 82, "sets": [ { "role": "Fast Attacker", @@ -722,7 +726,7 @@ ] }, "magmar": { - "level": 84, + "level": 85, "sets": [ { "role": "Fast Attacker", @@ -896,7 +900,7 @@ ] }, "zapdos": { - "level": 75, + "level": 74, "sets": [ { "role": "Staller", @@ -951,7 +955,7 @@ ] }, "mew": { - "level": 73, + "level": 72, "sets": [ { "role": "Bulky Support", @@ -1046,7 +1050,7 @@ ] }, "ariados": { - "level": 97, + "level": 98, "sets": [ { "role": "Setup Sweeper", @@ -1083,7 +1087,7 @@ ] }, "togetic": { - "level": 95, + "level": 96, "sets": [ { "role": "Staller", @@ -1152,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", @@ -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"] } ] }, @@ -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", @@ -2049,7 +2049,11 @@ }, { "role": "Generalist", - "movepool": ["batonpass", "bodyslam", "healbell", "protect", "wish"] + "movepool": ["bodyslam", "healbell", "protect", "wish"] + }, + { + "role": "Setup Sweeper", + "movepool": ["batonpass", "calmmind", "icebeam", "thunderbolt"] } ] }, @@ -2251,7 +2255,7 @@ ] }, "spinda": { - "level": 98, + "level": 99, "sets": [ { "role": "Staller", @@ -2309,7 +2313,7 @@ ] }, "zangoose": { - "level": 80, + "level": 79, "sets": [ { "role": "Fast Attacker", @@ -2644,7 +2648,7 @@ ] }, "latios": { - "level": 66, + "level": 67, "sets": [ { "role": "Bulky Setup", @@ -2683,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/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 f8109dabc2e0..7f0752073207 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"] } ] }, @@ -899,7 +903,7 @@ ] }, "crobat": { - "level": 82, + "level": 81, "sets": [ { "role": "Bulky Support", @@ -940,7 +944,7 @@ ] }, "bellossom": { - "level": 90, + "level": 91, "sets": [ { "role": "Bulky Support", @@ -953,7 +957,8 @@ "sets": [ { "role": "Bulky Attacker", - "movepool": ["aquajet", "doubleedge", "icepunch", "superpower", "waterfall"] + "movepool": ["aquajet", "doubleedge", "icepunch", "superpower", "waterfall"], + "preferredTypes": ["Ice"] }, { "role": "Bulky Setup", @@ -985,7 +990,7 @@ ] }, "jumpluff": { - "level": 91, + "level": 92, "sets": [ { "role": "Bulky Support", @@ -1093,7 +1098,7 @@ ] }, "dunsparce": { - "level": 92, + "level": 93, "sets": [ { "role": "Bulky Attacker", @@ -1253,7 +1258,7 @@ ] }, "kingdra": { - "level": 80, + "level": 79, "sets": [ { "role": "Bulky Setup", @@ -1322,7 +1327,7 @@ ] }, "miltank": { - "level": 82, + "level": 83, "sets": [ { "role": "Bulky Support", @@ -1348,7 +1353,7 @@ ] }, "raikou": { - "level": 76, + "level": 75, "sets": [ { "role": "Fast Attacker", @@ -1362,7 +1367,7 @@ ] }, "entei": { - "level": 81, + "level": 80, "sets": [ { "role": "Wallbreaker", @@ -1427,7 +1432,7 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["earthpower", "energyball", "hiddenpowerfire", "leafstorm", "nastyplot", "psychic", "uturn"], + "movepool": ["earthpower", "energyball", "leafstorm", "nastyplot", "psychic", "uturn"], "preferredTypes": ["Psychic"] }, { @@ -1546,11 +1551,15 @@ ] }, "swellow": { - "level": 82, + "level": 81, "sets": [ + { + "role": "Fast Attacker", + "movepool": ["bravebird", "facade", "protect", "uturn"] + }, { "role": "Wallbreaker", - "movepool": ["bravebird", "facade", "protect", "quickattack", "uturn"] + "movepool": ["bravebird", "facade", "quickattack", "uturn"] } ] }, @@ -1680,11 +1689,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 +1879,7 @@ "sets": [ { "role": "Staller", - "movepool": ["bodyslam", "encore", "shadowball", "teeterdance", "toxic"] + "movepool": ["encore", "protect", "seismictoss", "shadowball", "substitute", "toxic"] }, { "role": "Bulky Support", @@ -2086,7 +2099,7 @@ ] }, "absol": { - "level": 85, + "level": 84, "sets": [ { "role": "Bulky Attacker", @@ -2327,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"] } ] }, @@ -2337,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"] } ] }, @@ -2460,7 +2479,7 @@ ] }, "rampardos": { - "level": 89, + "level": 88, "sets": [ { "role": "Setup Sweeper", @@ -3163,17 +3182,13 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["dracometeor", "earthquake", "hiddenpowerfire", "outrage", "shadowball", "shadowsneak", "willowisp"] + "movepool": ["dracometeor", "earthquake", "outrage", "shadowball", "shadowsneak", "willowisp"] } ] }, "giratina": { - "level": 69, + "level": 68, "sets": [ - { - "role": "Fast Support", - "movepool": ["dragonpulse", "rest", "roar", "sleeptalk", "willowisp"] - }, { "role": "Bulky Setup", "movepool": ["calmmind", "dragonpulse", "rest", "sleeptalk"] @@ -3183,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 0c4410d7463b..1897c6fb7de1 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", @@ -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", @@ -195,7 +194,7 @@ ] }, "wigglytuff": { - "level": 95, + "level": 96, "sets": [ { "role": "Bulky Support", @@ -217,7 +216,7 @@ ] }, "parasect": { - "level": 97, + "level": 98, "sets": [ { "role": "Bulky Support", @@ -235,7 +234,7 @@ ] }, "venomoth": { - "level": 82, + "level": 81, "sets": [ { "role": "Bulky Setup", @@ -641,20 +640,15 @@ "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"] } ] }, "tauros": { - "level": 82, + "level": 81, "sets": [ { "role": "Wallbreaker", @@ -831,7 +825,7 @@ ] }, "dragonite": { - "level": 75, + "level": 74, "sets": [ { "role": "Wallbreaker", @@ -912,7 +906,8 @@ "sets": [ { "role": "Bulky Support", - "movepool": ["airslash", "heatwave", "hypervoice", "roost", "toxic", "whirlwind"] + "movepool": ["airslash", "heatwave", "hypervoice", "roost", "toxic", "whirlwind"], + "preferredTypes": ["Normal"] } ] }, @@ -979,7 +974,7 @@ ] }, "bellossom": { - "level": 93, + "level": 94, "sets": [ { "role": "Bulky Support", @@ -992,7 +987,8 @@ "sets": [ { "role": "Bulky Attacker", - "movepool": ["aquajet", "doubleedge", "icepunch", "superpower", "waterfall"] + "movepool": ["aquajet", "doubleedge", "icepunch", "superpower", "waterfall"], + "preferredTypes": ["Ice"] }, { "role": "Bulky Setup", @@ -1025,7 +1021,7 @@ ] }, "jumpluff": { - "level": 86, + "level": 85, "sets": [ { "role": "Fast Support", @@ -1051,7 +1047,7 @@ ] }, "quagsire": { - "level": 85, + "level": 86, "sets": [ { "role": "Bulky Attacker", @@ -1154,7 +1150,7 @@ ] }, "gligar": { - "level": 83, + "level": 82, "sets": [ { "role": "Staller", @@ -1433,7 +1429,7 @@ ] }, "suicune": { - "level": 81, + "level": 80, "sets": [ { "role": "Bulky Attacker", @@ -1485,7 +1481,7 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["earthpower", "gigadrain", "hiddenpowerfire", "leafstorm", "nastyplot", "psychic", "uturn"], + "movepool": ["earthpower", "gigadrain", "leafstorm", "nastyplot", "psychic", "uturn"], "preferredTypes": ["Psychic"] }, { @@ -1607,9 +1603,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"] } ] }, @@ -1669,7 +1669,7 @@ ] }, "slaking": { - "level": 83, + "level": 82, "sets": [ { "role": "Fast Attacker", @@ -1691,7 +1691,7 @@ ] }, "shedinja": { - "level": 90, + "level": 91, "sets": [ { "role": "Setup Sweeper", @@ -1700,7 +1700,7 @@ ] }, "exploud": { - "level": 91, + "level": 92, "sets": [ { "role": "Wallbreaker", @@ -1755,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"] } ] @@ -2297,7 +2302,7 @@ "movepool": ["icebeam", "surf", "thunder", "waterspout"] }, { - "role": "Bulky Support", + "role": "Bulky Setup", "movepool": ["calmmind", "icebeam", "rest", "sleeptalk", "surf", "thunder"] } ] @@ -2347,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"] } ] }, @@ -2357,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"] } ] }, @@ -2407,7 +2418,7 @@ ] }, "empoleon": { - "level": 81, + "level": 80, "sets": [ { "role": "Staller", @@ -2424,7 +2435,7 @@ ] }, "staraptor": { - "level": 80, + "level": 79, "sets": [ { "role": "Fast Attacker", @@ -2475,7 +2486,7 @@ ] }, "rampardos": { - "level": 89, + "level": 88, "sets": [ { "role": "Setup Sweeper", @@ -2550,7 +2561,7 @@ ] }, "pachirisu": { - "level": 92, + "level": 93, "sets": [ { "role": "Bulky Support", @@ -2684,7 +2695,7 @@ ] }, "chatot": { - "level": 92, + "level": 93, "sets": [ { "role": "Wallbreaker", @@ -2705,7 +2716,7 @@ }, { "role": "Bulky Attacker", - "movepool": ["foulplay", "painsplit", "pursuit", "suckerpunch", "willowisp"] + "movepool": ["darkpulse", "painsplit", "pursuit", "suckerpunch", "willowisp"] } ] }, @@ -2746,7 +2757,7 @@ ] }, "drapion": { - "level": 84, + "level": 85, "sets": [ { "role": "Fast Attacker", @@ -2787,6 +2798,10 @@ { "role": "Staller", "movepool": ["icebeam", "protect", "scald", "toxic", "uturn"] + }, + { + "role": "Bulky Attacker", + "movepool": ["hiddenpowergrass", "icebeam", "scald", "toxic"] } ] }, @@ -2841,7 +2856,7 @@ ] }, "tangrowth": { - "level": 85, + "level": 86, "sets": [ { "role": "Bulky Attacker", @@ -3061,7 +3076,7 @@ ] }, "uxie": { - "level": 81, + "level": 80, "sets": [ { "role": "Bulky Support", @@ -3144,7 +3159,7 @@ ] }, "giratina": { - "level": 72, + "level": 71, "sets": [ { "role": "Fast Support", @@ -3161,7 +3176,7 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["dracometeor", "earthquake", "hiddenpowerfire", "outrage", "shadowball", "shadowsneak", "willowisp"] + "movepool": ["dracometeor", "earthquake", "outrage", "shadowball", "shadowsneak", "willowisp"] } ] }, @@ -3170,7 +3185,7 @@ "sets": [ { "role": "Bulky Setup", - "movepool": ["calmmind", "hiddenpowerfighting", "moonlight", "psyshock", "substitute"] + "movepool": ["calmmind", "hiddenpowerfighting", "moonlight", "psyshock", "signalbeam"] }, { "role": "Bulky Support", @@ -3201,7 +3216,7 @@ ] }, "darkrai": { - "level": 71, + "level": 70, "sets": [ { "role": "Setup Sweeper", @@ -3536,7 +3551,7 @@ "sets": [ { "role": "Setup Sweeper", - "movepool": ["focusblast", "hiddenpowergrass", "hydropump", "icebeam", "nastyplot", "substitute"], + "movepool": ["grassknot", "hydropump", "icebeam", "nastyplot", "substitute"], "preferredTypes": ["Ice"] } ] @@ -3576,8 +3591,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"] } ] }, @@ -3863,7 +3879,7 @@ ] }, "swanna": { - "level": 86, + "level": 87, "sets": [ { "role": "Bulky Attacker", @@ -3945,7 +3961,7 @@ ] }, "galvantula": { - "level": 82, + "level": 81, "sets": [ { "role": "Wallbreaker", @@ -3955,7 +3971,7 @@ ] }, "ferrothorn": { - "level": 74, + "level": 73, "sets": [ { "role": "Bulky Attacker", @@ -3991,7 +4007,7 @@ ] }, "beheeyem": { - "level": 89, + "level": 90, "sets": [ { "role": "Wallbreaker", @@ -4097,7 +4113,7 @@ ] }, "bisharp": { - "level": 84, + "level": 83, "sets": [ { "role": "Fast Attacker", @@ -4158,7 +4174,7 @@ "level": 79, "sets": [ { - "role": "Fast Attacker", + "role": "Setup Sweeper", "movepool": ["honeclaws", "ironhead", "rockslide", "superpower", "xscissor"], "preferredTypes": ["Fighting"] } @@ -4183,7 +4199,7 @@ ] }, "cobalion": { - "level": 78, + "level": 77, "sets": [ { "role": "Bulky Attacker", @@ -4229,7 +4245,7 @@ ] }, "tornadustherian": { - "level": 76, + "level": 75, "sets": [ { "role": "Fast Attacker", @@ -4323,7 +4339,7 @@ ] }, "kyuremblack": { - "level": 75, + "level": 74, "sets": [ { "role": "Bulky Attacker", @@ -4344,12 +4360,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"] } ] }, @@ -4367,7 +4387,7 @@ ] }, "genesect": { - "level": 74, + "level": 73, "sets": [ { "role": "Setup Sweeper", 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/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 +} diff --git a/data/random-battles/gen6/sets.json b/data/random-battles/gen6/sets.json index 16c98b35d6d0..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"] } ] }, @@ -134,8 +134,7 @@ "sets": [ { "role": "Wallbreaker", - "movepool": ["doubleedge", "drillpeck", "drillrun", "pursuit", "return", "uturn"], - "preferredTypes": ["Normal"] + "movepool": ["doubleedge", "drillpeck", "drillrun", "return", "uturn"] } ] }, @@ -261,7 +260,7 @@ "sets": [ { "role": "Bulky Setup", - "movepool": ["bugbuzz", "quiverdance", "sleeppowder", "sludgebomb", "substitute"] + "movepool": ["bugbuzz", "quiverdance", "sleeppowder", "sludgebomb"] } ] }, @@ -284,7 +283,7 @@ }, { "role": "Setup Sweeper", - "movepool": ["hiddenpowerfighting", "hiddenpowerfire", "hypervoice", "nastyplot", "shadowball", "waterpulse"] + "movepool": ["hiddenpowerfighting", "hypervoice", "nastyplot", "shadowball"] } ] }, @@ -653,7 +652,7 @@ ] }, "seaking": { - "level": 91, + "level": 92, "sets": [ { "role": "Fast Attacker", @@ -663,7 +662,7 @@ ] }, "starmie": { - "level": 81, + "level": 82, "sets": [ { "role": "Wallbreaker", @@ -785,7 +784,7 @@ ] }, "vaporeon": { - "level": 83, + "level": 84, "sets": [ { "role": "Bulky Support", @@ -906,7 +905,7 @@ ] }, "dragonite": { - "level": 75, + "level": 74, "sets": [ { "role": "Setup Sweeper", @@ -960,7 +959,7 @@ ] }, "meganium": { - "level": 91, + "level": 92, "sets": [ { "role": "Staller", @@ -984,10 +983,6 @@ "role": "Setup Sweeper", "movepool": ["crunch", "dragondance", "earthquake", "icepunch", "waterfall"], "preferredTypes": ["Ice"] - }, - { - "role": "Bulky Setup", - "movepool": ["aquajet", "crunch", "icepunch", "swordsdance", "waterfall"] } ] }, @@ -1002,11 +997,12 @@ ] }, "noctowl": { - "level": 94, + "level": 95, "sets": [ { "role": "Bulky Support", - "movepool": ["airslash", "defog", "hypervoice", "roost", "toxic", "whirlwind"] + "movepool": ["airslash", "defog", "hypervoice", "roost", "toxic"], + "preferredTypes": ["Normal"] } ] }, @@ -1079,7 +1075,7 @@ ] }, "bellossom": { - "level": 93, + "level": 94, "sets": [ { "role": "Bulky Support", @@ -1374,7 +1370,7 @@ ] }, "magcargo": { - "level": 96, + "level": 97, "sets": [ { "role": "Staller", @@ -1427,7 +1423,7 @@ ] }, "skarmory": { - "level": 79, + "level": 78, "sets": [ { "role": "Bulky Support", @@ -1472,11 +1468,6 @@ { "role": "Bulky Support", "movepool": ["earthquake", "knockoff", "rapidspin", "stealthrock", "stoneedge", "toxic"] - }, - { - "role": "Bulky Attacker", - "movepool": ["earthquake", "gunkshot", "iceshard", "knockoff", "rapidspin", "stoneedge"], - "preferredTypes": ["Dark"] } ] }, @@ -1632,7 +1623,7 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["earthpower", "gigadrain", "hiddenpowerfire", "leafstorm", "nastyplot", "psychic", "uturn"], + "movepool": ["earthpower", "gigadrain", "leafstorm", "nastyplot", "psychic", "uturn"], "preferredTypes": ["Psychic"] }, { @@ -1663,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", @@ -1787,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"] } ] }, @@ -1835,7 +1830,7 @@ }, { "role": "Fast Support", - "movepool": ["airslash", "bugbuzz", "hydropump", "icebeam", "roost", "stickyweb", "stunspore", "uturn"] + "movepool": ["airslash", "bugbuzz", "roost", "scald", "stickyweb", "stunspore", "uturn"] } ] }, @@ -2004,7 +1999,7 @@ ] }, "manectricmega": { - "level": 80, + "level": 79, "sets": [ { "role": "Fast Attacker", @@ -2023,10 +2018,6 @@ { "role": "Setup Sweeper", "movepool": ["grassknot", "hiddenpowerice", "nastyplot", "thunderbolt"] - }, - { - "role": "Bulky Attacker", - "movepool": ["encore", "hiddenpowerice", "nuzzle", "thunderbolt", "toxic", "voltswitch"] } ] }, @@ -2041,10 +2032,6 @@ { "role": "Setup Sweeper", "movepool": ["grassknot", "hiddenpowerice", "nastyplot", "thunderbolt"] - }, - { - "role": "Bulky Attacker", - "movepool": ["encore", "hiddenpowerice", "nuzzle", "thunderbolt", "toxic", "voltswitch"] } ] }, @@ -2229,7 +2216,7 @@ ] }, "lunatone": { - "level": 93, + "level": 94, "sets": [ { "role": "Wallbreaker", @@ -2372,7 +2359,7 @@ "sets": [ { "role": "Staller", - "movepool": ["healbell", "knockoff", "psychic", "recover", "taunt", "toxic"] + "movepool": ["healbell", "knockoff", "psychic", "recover", "toxic"] }, { "role": "Bulky Setup", @@ -2406,7 +2393,7 @@ ] }, "glalie": { - "level": 88, + "level": 89, "sets": [ { "role": "Fast Support", @@ -2539,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", @@ -2579,7 +2567,7 @@ ] }, "latiasmega": { - "level": 78, + "level": 77, "sets": [ { "role": "Bulky Attacker", @@ -2694,8 +2682,11 @@ "sets": [ { "role": "Wallbreaker", - "movepool": ["extremespeed", "firepunch", "icebeam", "knockoff", "psychoboost", "stealthrock", "superpower"], - "preferredTypes": ["Fighting"] + "movepool": ["extremespeed", "knockoff", "psychoboost", "superpower"] + }, + { + "role": "Fast Attacker", + "movepool": ["icebeam", "knockoff", "psychoboost", "superpower"] } ] }, @@ -2704,8 +2695,11 @@ "sets": [ { "role": "Wallbreaker", - "movepool": ["extremespeed", "firepunch", "icebeam", "knockoff", "psychoboost", "superpower"], - "preferredTypes": ["Fighting"] + "movepool": ["extremespeed", "knockoff", "psychoboost", "superpower"] + }, + { + "role": "Fast Attacker", + "movepool": ["icebeam", "knockoff", "psychoboost", "superpower"] } ] }, @@ -2781,7 +2775,7 @@ ] }, "bibarel": { - "level": 93, + "level": 94, "sets": [ { "role": "Setup Sweeper", @@ -2822,7 +2816,7 @@ ] }, "rampardos": { - "level": 88, + "level": 87, "sets": [ { "role": "Setup Sweeper", @@ -2865,7 +2859,7 @@ "sets": [ { "role": "Staller", - "movepool": ["earthquake", "protect", "stealthrock", "suckerpunch", "toxic"] + "movepool": ["earthquake", "infestation", "protect", "stealthrock", "toxic"] } ] }, @@ -2874,7 +2868,7 @@ "sets": [ { "role": "Staller", - "movepool": ["flashcannon", "protect", "stealthrock", "suckerpunch", "toxic"] + "movepool": ["flashcannon", "infestation", "protect", "stealthrock", "toxic"] } ] }, @@ -3061,7 +3055,7 @@ }, { "role": "Bulky Attacker", - "movepool": ["foulplay", "painsplit", "pursuit", "suckerpunch", "willowisp"] + "movepool": ["darkpulse", "painsplit", "pursuit", "suckerpunch", "willowisp"] } ] }, @@ -3151,7 +3145,7 @@ ] }, "carnivine": { - "level": 97, + "level": 98, "sets": [ { "role": "Bulky Support", @@ -3169,7 +3163,7 @@ ] }, "abomasnow": { - "level": 86, + "level": 85, "sets": [ { "role": "Bulky Attacker", @@ -3304,10 +3298,6 @@ "leafeon": { "level": 88, "sets": [ - { - "role": "Bulky Attacker", - "movepool": ["healbell", "knockoff", "leafblade", "synthesis", "toxic"] - }, { "role": "Setup Sweeper", "movepool": ["doubleedge", "knockoff", "leafblade", "swordsdance", "synthesis", "xscissor"], @@ -3316,7 +3306,7 @@ ] }, "glaceon": { - "level": 89, + "level": 90, "sets": [ { "role": "Bulky Support", @@ -3329,7 +3319,7 @@ ] }, "gliscor": { - "level": 78, + "level": 77, "sets": [ { "role": "Staller", @@ -3383,7 +3373,7 @@ ] }, "probopass": { - "level": 90, + "level": 91, "sets": [ { "role": "Bulky Attacker", @@ -3581,7 +3571,7 @@ "sets": [ { "role": "Bulky Setup", - "movepool": ["calmmind", "moonblast", "moonlight", "psyshock", "substitute"] + "movepool": ["calmmind", "moonblast", "moonlight", "psyshock"] }, { "role": "Bulky Support", @@ -3844,7 +3834,7 @@ ] }, "victini": { - "level": 79, + "level": 78, "sets": [ { "role": "Fast Attacker", @@ -3952,7 +3942,7 @@ "sets": [ { "role": "Setup Sweeper", - "movepool": ["focusblast", "hydropump", "icebeam", "nastyplot", "substitute"], + "movepool": ["grassknot", "hydropump", "icebeam", "nastyplot", "substitute"], "preferredTypes": ["Ice"] } ] @@ -3992,8 +3982,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"] } ] }, @@ -4001,7 +3992,7 @@ "level": 86, "sets": [ { - "role": "Bulky Setup", + "role": "Bulky Attacker", "movepool": ["calmmind", "heatwave", "roost", "storedpower"] }, { @@ -4093,10 +4084,6 @@ "leavanny": { "level": 88, "sets": [ - { - "role": "Setup Sweeper", - "movepool": ["knockoff", "leafblade", "swordsdance", "xscissor"] - }, { "role": "Fast Support", "movepool": ["knockoff", "leafblade", "stickyweb", "toxic", "xscissor"] @@ -4166,7 +4153,7 @@ ] }, "maractus": { - "level": 95, + "level": 96, "sets": [ { "role": "Fast Support", @@ -4189,7 +4176,7 @@ ] }, "scrafty": { - "level": 84, + "level": 83, "sets": [ { "role": "Setup Sweeper", @@ -4237,7 +4224,7 @@ "sets": [ { "role": "Setup Sweeper", - "movepool": ["aquajet", "earthquake", "shellsmash", "stoneedge", "waterfall"] + "movepool": ["aquajet", "earthquake", "icebeam", "shellsmash", "stoneedge", "waterfall"] } ] }, @@ -4265,7 +4252,7 @@ ] }, "zoroark": { - "level": 84, + "level": 83, "sets": [ { "role": "Wallbreaker", @@ -4284,7 +4271,7 @@ ] }, "gothitelle": { - "level": 86, + "level": 87, "sets": [ { "role": "Bulky Attacker", @@ -4429,7 +4416,7 @@ "sets": [ { "role": "AV Pivot", - "movepool": ["flamethrower", "gigadrain", "hiddenpowerice", "knockoff", "superpower", "thunderbolt", "uturn"] + "movepool": ["discharge", "flamethrower", "gigadrain", "hiddenpowerice", "knockoff", "superpower", "uturn"] } ] }, @@ -4507,7 +4494,7 @@ ] }, "mienshao": { - "level": 82, + "level": 81, "sets": [ { "role": "Wallbreaker", @@ -4601,7 +4588,7 @@ "level": 79, "sets": [ { - "role": "Fast Attacker", + "role": "Setup Sweeper", "movepool": ["honeclaws", "ironhead", "rockslide", "superpower", "xscissor"], "preferredTypes": ["Fighting"] } @@ -4654,7 +4641,7 @@ ] }, "virizion": { - "level": 82, + "level": 81, "sets": [ { "role": "Fast Attacker", @@ -4663,7 +4650,7 @@ ] }, "tornadus": { - "level": 83, + "level": 82, "sets": [ { "role": "Fast Attacker", @@ -4775,7 +4762,7 @@ ] }, "kyuremblack": { - "level": 75, + "level": 76, "sets": [ { "role": "Bulky Attacker", @@ -4796,12 +4783,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"] + "movepool": ["calmmind", "scald", "secretsword", "substitute"] + }, + { + "role": "Fast Attacker", + "movepool": ["focusblast", "hydropump", "scald", "secretsword"] } ] }, @@ -4868,7 +4859,7 @@ ] }, "diggersby": { - "level": 82, + "level": 81, "sets": [ { "role": "Setup Sweeper", @@ -4913,7 +4904,7 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["darkpulse", "fireblast", "hypervoice", "solarbeam", "sunnyday", "willowisp"], + "movepool": ["darkpulse", "fireblast", "hypervoice", "solarbeam", "sunnyday", "willowisp", "workup"], "preferredTypes": ["Normal"] } ] @@ -5108,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"] } ] }, @@ -5236,7 +5229,7 @@ "sets": [ { "role": "Bulky Support", - "movepool": ["avalanche", "earthquake", "rapidspin", "recover", "roar", "toxic"] + "movepool": ["avalanche", "curse", "earthquake", "rapidspin", "recover"] } ] }, @@ -5254,7 +5247,7 @@ "sets": [ { "role": "Setup Sweeper", - "movepool": ["focusblast", "geomancy", "hiddenpowerfire", "moonblast", "psyshock", "thunder"] + "movepool": ["focusblast", "geomancy", "moonblast", "psyshock"] } ] }, @@ -5300,7 +5293,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..73df2e6f702b 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 @@ -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']; @@ -276,7 +281,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; } } @@ -620,7 +625,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 +781,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 1ef990360541..b8b9854a7ae1 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", @@ -84,7 +84,7 @@ "sets": [ { "role": "Setup Sweeper", - "movepool": ["airslash", "bugbuzz", "energyball", "quiverdance", "sleeppowder"] + "movepool": ["airslash", "bugbuzz", "quiverdance", "sleeppowder"] }, { "role": "Z-Move user", @@ -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", @@ -294,7 +293,7 @@ "sets": [ { "role": "Fast Support", - "movepool": ["auroraveil", "blizzard", "freezedry", "hiddenpowerground", "moonblast", "nastyplot"] + "movepool": ["auroraveil", "blizzard", "encore", "freezedry", "hiddenpowerground", "moonblast", "nastyplot"] } ] }, @@ -317,7 +316,7 @@ ] }, "parasect": { - "level": 97, + "level": 98, "sets": [ { "role": "Bulky Attacker", @@ -331,7 +330,7 @@ "sets": [ { "role": "Bulky Setup", - "movepool": ["bugbuzz", "quiverdance", "sleeppowder", "sludgebomb", "substitute"] + "movepool": ["bugbuzz", "quiverdance", "sleeppowder", "sludgebomb"] }, { "role": "Z-Move user", @@ -368,7 +367,7 @@ }, { "role": "Setup Sweeper", - "movepool": ["hiddenpowerfighting", "hiddenpowerfire", "hypervoice", "nastyplot", "shadowball", "waterpulse"] + "movepool": ["hiddenpowerfighting", "hypervoice", "nastyplot", "shadowball"] } ] }, @@ -438,7 +437,7 @@ ] }, "alakazam": { - "level": 82, + "level": 81, "sets": [ { "role": "Fast Attacker", @@ -520,7 +519,7 @@ ] }, "golemalola": { - "level": 89, + "level": 90, "sets": [ { "role": "Bulky Attacker", @@ -793,7 +792,7 @@ ] }, "kangaskhan": { - "level": 88, + "level": 87, "sets": [ { "role": "Bulky Support", @@ -830,7 +829,7 @@ ] }, "starmie": { - "level": 84, + "level": 85, "sets": [ { "role": "Wallbreaker", @@ -1116,7 +1115,7 @@ ] }, "mewtwomegax": { - "level": 71, + "level": 70, "sets": [ { "role": "Setup Sweeper", @@ -1125,7 +1124,7 @@ ] }, "mewtwomegay": { - "level": 71, + "level": 70, "sets": [ { "role": "Setup Sweeper", @@ -1156,7 +1155,7 @@ ] }, "typhlosion": { - "level": 86, + "level": 85, "sets": [ { "role": "Fast Attacker", @@ -1171,10 +1170,6 @@ "role": "Setup Sweeper", "movepool": ["crunch", "dragondance", "earthquake", "icepunch", "liquidation"], "preferredTypes": ["Ice"] - }, - { - "role": "Bulky Setup", - "movepool": ["aquajet", "crunch", "icepunch", "liquidation", "swordsdance"] } ] }, @@ -1197,7 +1192,7 @@ "sets": [ { "role": "Bulky Support", - "movepool": ["defog", "hurricane", "hypervoice", "roost", "toxic", "whirlwind"] + "movepool": ["defog", "hurricane", "hypervoice", "roost", "toxic"] } ] }, @@ -1251,7 +1246,7 @@ ] }, "ampharos": { - "level": 88, + "level": 87, "sets": [ { "role": "Bulky Attacker", @@ -1398,7 +1393,7 @@ ] }, "wobbuffet": { - "level": 87, + "level": 88, "sets": [ { "role": "Bulky Support", @@ -1411,8 +1406,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"] } ] }, @@ -1439,7 +1437,7 @@ ] }, "gligar": { - "level": 83, + "level": 82, "sets": [ { "role": "Staller", @@ -1484,7 +1482,7 @@ ] }, "qwilfish": { - "level": 88, + "level": 87, "sets": [ { "role": "Fast Support", @@ -1532,7 +1530,7 @@ ] }, "heracross": { - "level": 83, + "level": 82, "sets": [ { "role": "Wallbreaker", @@ -1578,7 +1576,7 @@ ] }, "corsola": { - "level": 93, + "level": 94, "sets": [ { "role": "Bulky Support", @@ -1587,7 +1585,7 @@ ] }, "octillery": { - "level": 94, + "level": 95, "sets": [ { "role": "Wallbreaker", @@ -1659,11 +1657,6 @@ { "role": "Bulky Support", "movepool": ["earthquake", "knockoff", "rapidspin", "stealthrock", "stoneedge", "toxic"] - }, - { - "role": "Bulky Attacker", - "movepool": ["earthquake", "gunkshot", "iceshard", "knockoff", "rapidspin", "stoneedge"], - "preferredTypes": ["Dark"] } ] }, @@ -1677,7 +1670,7 @@ ] }, "stantler": { - "level": 90, + "level": 91, "sets": [ { "role": "Wallbreaker", @@ -1745,7 +1738,7 @@ ] }, "entei": { - "level": 79, + "level": 78, "sets": [ { "role": "Wallbreaker", @@ -1788,7 +1781,7 @@ ] }, "tyranitarmega": { - "level": 78, + "level": 77, "sets": [ { "role": "Setup Sweeper", @@ -1819,7 +1812,7 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["earthpower", "gigadrain", "hiddenpowerfire", "leafstorm", "nastyplot", "psychic", "uturn"], + "movepool": ["earthpower", "gigadrain", "leafstorm", "nastyplot", "psychic", "uturn"], "preferredTypes": ["Psychic"] }, { @@ -1851,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", @@ -1932,7 +1925,7 @@ ] }, "dustox": { - "level": 94, + "level": 95, "sets": [ { "role": "Bulky Setup", @@ -2027,7 +2020,7 @@ }, { "role": "Fast Support", - "movepool": ["airslash", "bugbuzz", "hydropump", "icebeam", "roost", "stickyweb", "stunspore", "uturn"] + "movepool": ["airslash", "bugbuzz", "roost", "scald", "stickyweb", "stunspore", "uturn"] } ] }, @@ -2077,7 +2070,7 @@ ] }, "shedinja": { - "level": 92, + "level": 93, "sets": [ { "role": "Setup Sweeper", @@ -2543,7 +2536,7 @@ ] }, "banette": { - "level": 92, + "level": 93, "sets": [ { "role": "Wallbreaker", @@ -2574,7 +2567,7 @@ "sets": [ { "role": "Staller", - "movepool": ["defog", "healbell", "knockoff", "psychic", "recover", "taunt", "toxic"] + "movepool": ["defog", "healbell", "knockoff", "psychic", "recover", "toxic"] }, { "role": "Bulky Setup", @@ -2750,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", @@ -2827,7 +2821,7 @@ ] }, "kyogre": { - "level": 70, + "level": 69, "sets": [ { "role": "Fast Attacker", @@ -2875,7 +2869,7 @@ ] }, "rayquaza": { - "level": 72, + "level": 71, "sets": [ { "role": "Z-Move user", @@ -2921,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"] } ] }, @@ -2931,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"] } ] }, @@ -3084,7 +3084,7 @@ "sets": [ { "role": "Setup Sweeper", - "movepool": ["bugbuzz", "gigadrain", "hiddenpowerground", "hiddenpowerrock", "leafstorm", "quiverdance"] + "movepool": ["bugbuzz", "energyball", "gigadrain", "hiddenpowerground", "hiddenpowerrock", "quiverdance"] } ] }, @@ -3093,7 +3093,7 @@ "sets": [ { "role": "Staller", - "movepool": ["earthquake", "protect", "stealthrock", "suckerpunch", "toxic"] + "movepool": ["earthquake", "infestation", "protect", "stealthrock", "toxic"] } ] }, @@ -3102,12 +3102,12 @@ "sets": [ { "role": "Staller", - "movepool": ["flashcannon", "protect", "stealthrock", "suckerpunch", "toxic"] + "movepool": ["flashcannon", "infestation", "protect", "stealthrock", "toxic"] } ] }, "mothim": { - "level": 95, + "level": 94, "sets": [ { "role": "Setup Sweeper", @@ -3130,7 +3130,7 @@ ] }, "pachirisu": { - "level": 94, + "level": 95, "sets": [ { "role": "Bulky Support", @@ -3249,7 +3249,7 @@ ] }, "purugly": { - "level": 89, + "level": 90, "sets": [ { "role": "Fast Attacker", @@ -3304,7 +3304,7 @@ }, { "role": "Bulky Attacker", - "movepool": ["foulplay", "painsplit", "pursuit", "suckerpunch", "willowisp"] + "movepool": ["darkpulse", "painsplit", "pursuit", "suckerpunch", "willowisp"] } ] }, @@ -3354,7 +3354,7 @@ ] }, "lucariomega": { - "level": 76, + "level": 75, "sets": [ { "role": "Bulky Setup", @@ -3446,7 +3446,7 @@ ] }, "magnezone": { - "level": 83, + "level": 84, "sets": [ { "role": "Fast Attacker", @@ -3552,10 +3552,6 @@ "leafeon": { "level": 88, "sets": [ - { - "role": "Bulky Attacker", - "movepool": ["healbell", "knockoff", "leafblade", "synthesis", "toxic"] - }, { "role": "Setup Sweeper", "movepool": ["doubleedge", "knockoff", "leafblade", "swordsdance", "synthesis", "xscissor"], @@ -3844,7 +3840,7 @@ "sets": [ { "role": "Bulky Setup", - "movepool": ["calmmind", "moonblast", "moonlight", "psyshock", "substitute"] + "movepool": ["calmmind", "moonblast", "moonlight", "psyshock"] }, { "role": "Bulky Support", @@ -4185,7 +4181,7 @@ ] }, "watchog": { - "level": 94, + "level": 95, "sets": [ { "role": "Bulky Attacker", @@ -4232,7 +4228,7 @@ ] }, "simisear": { - "level": 89, + "level": 90, "sets": [ { "role": "Setup Sweeper", @@ -4245,7 +4241,7 @@ "sets": [ { "role": "Setup Sweeper", - "movepool": ["focusblast", "hydropump", "icebeam", "nastyplot", "substitute"], + "movepool": ["grassknot", "hydropump", "icebeam", "nastyplot", "substitute"], "preferredTypes": ["Ice"] } ] @@ -4285,8 +4281,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"] } ] }, @@ -4294,7 +4291,7 @@ "level": 87, "sets": [ { - "role": "Bulky Setup", + "role": "Bulky Attacker", "movepool": ["calmmind", "heatwave", "roost", "storedpower"] }, { @@ -4395,10 +4392,6 @@ "leavanny": { "level": 88, "sets": [ - { - "role": "Setup Sweeper", - "movepool": ["knockoff", "leafblade", "swordsdance", "xscissor"] - }, { "role": "Fast Support", "movepool": ["knockoff", "leafblade", "stickyweb", "toxic", "xscissor"] @@ -4535,7 +4528,7 @@ "sets": [ { "role": "Setup Sweeper", - "movepool": ["aquajet", "earthquake", "liquidation", "shellsmash", "stoneedge"] + "movepool": ["aquajet", "earthquake", "icebeam", "liquidation", "shellsmash", "stoneedge"] } ] }, @@ -4737,7 +4730,7 @@ "sets": [ { "role": "AV Pivot", - "movepool": ["flamethrower", "gigadrain", "hiddenpowerice", "knockoff", "superpower", "thunderbolt", "uturn"] + "movepool": ["discharge", "flamethrower", "gigadrain", "hiddenpowerice", "knockoff", "superpower", "uturn"] } ] }, @@ -4751,7 +4744,7 @@ ] }, "chandelure": { - "level": 83, + "level": 84, "sets": [ { "role": "Fast Attacker", @@ -4880,7 +4873,7 @@ ] }, "braviary": { - "level": 84, + "level": 83, "sets": [ { "role": "Bulky Attacker", @@ -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"] + "movepool": ["calmmind", "scald", "secretsword", "substitute"] + }, + { + "role": "Fast Attacker", + "movepool": ["focusblast", "hydropump", "scald", "secretsword"] } ] }, @@ -5175,7 +5172,7 @@ ] }, "genesect": { - "level": 75, + "level": 74, "sets": [ { "role": "Setup Sweeper", @@ -5279,8 +5276,7 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["darkpulse", "fireblast", "hypervoice", "solarbeam", "sunnyday", "willowisp"], - "preferredTypes": ["Normal"] + "movepool": ["darkpulse", "fireblast", "hypervoice", "solarbeam", "sunnyday", "willowisp", "workup"] }, { "role": "Z-Move user", @@ -5357,7 +5353,7 @@ ] }, "meowsticf": { - "level": 89, + "level": 90, "sets": [ { "role": "Fast Attacker", @@ -5421,7 +5417,7 @@ ] }, "barbaracle": { - "level": 82, + "level": 81, "sets": [ { "role": "Setup Sweeper", @@ -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", @@ -5485,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"] } ] }, @@ -5538,7 +5530,7 @@ ] }, "goodra": { - "level": 84, + "level": 85, "sets": [ { "role": "Bulky Attacker", @@ -5613,12 +5605,12 @@ "sets": [ { "role": "Bulky Support", - "movepool": ["avalanche", "earthquake", "rapidspin", "recover", "roar", "toxic"] + "movepool": ["avalanche", "curse", "earthquake", "rapidspin", "recover"] } ] }, "noivern": { - "level": 84, + "level": 83, "sets": [ { "role": "Fast Attacker", @@ -5635,7 +5627,7 @@ "sets": [ { "role": "Setup Sweeper", - "movepool": ["focusblast", "geomancy", "hiddenpowerfire", "moonblast", "psyshock", "thunder"] + "movepool": ["focusblast", "geomancy", "moonblast", "psyshock"] } ] }, @@ -5702,7 +5694,7 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["focusblast", "nastyplot", "psyshock", "shadowball", "trick"] + "movepool": ["focusblast", "nastyplot", "psychic", "psyshock", "shadowball", "trick"] } ] }, @@ -5762,7 +5754,7 @@ ] }, "toucannon": { - "level": 87, + "level": 88, "sets": [ { "role": "Wallbreaker", @@ -5926,11 +5918,12 @@ ] }, "mudsdale": { - "level": 84, + "level": 83, "sets": [ { - "role": "Bulky Support", - "movepool": ["closecombat", "earthquake", "heavyslam", "rockslide", "stealthrock"] + "role": "Bulky Attacker", + "movepool": ["closecombat", "earthquake", "heavyslam", "rockslide", "stealthrock", "toxic"], + "preferredTypes": ["Rock"] } ] }, @@ -6321,7 +6314,7 @@ ] }, "mimikyu": { - "level": 74, + "level": 73, "sets": [ { "role": "Setup Sweeper", @@ -6338,7 +6331,8 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["aquajet", "crunch", "icefang", "liquidation", "psychicfangs", "swordsdance"] + "movepool": ["aquajet", "crunch", "icefang", "liquidation", "psychicfangs", "swordsdance"], + "preferredTypes": ["Dark"] } ] }, @@ -6352,7 +6346,7 @@ }, { "role": "Bulky Attacker", - "movepool": ["defog", "dracometeor", "fireblast", "glare", "hypervoice", "roost"] + "movepool": ["dracometeor", "fireblast", "glare", "hypervoice", "roost"] } ] }, @@ -6502,7 +6496,7 @@ ] }, "celesteela": { - "level": 80, + "level": 79, "sets": [ { "role": "AV Pivot", @@ -6560,7 +6554,7 @@ ] }, "necrozmaduskmane": { - "level": 68, + "level": 69, "sets": [ { "role": "Bulky Setup", diff --git a/data/random-battles/gen7/teams.ts b/data/random-battles/gen7/teams.ts index b222f50c02bd..7d7068eec0f4 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') && ( @@ -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']; @@ -343,7 +348,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 +400,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; } } @@ -516,8 +521,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); @@ -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': @@ -829,7 +831,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 +1025,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'; @@ -1494,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 a7002196a1c1..73e97a6203dd 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"] @@ -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,14 +377,14 @@ "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"] }, "omastar": { "level": 82, - "moves": ["earthpower", "hydropump", "icebeam", "shellsmash", "spikes", "stealthrock"], + "moves": ["earthpower", "hydropump", "icebeam", "shellsmash"], "doublesLevel": 86, "doublesMoves": ["earthpower", "icebeam", "muddywater", "shellsmash"] }, @@ -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"] @@ -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"] }, @@ -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"] @@ -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"] }, @@ -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"] @@ -1389,12 +1389,12 @@ }, "crustle": { "level": 83, - "moves": ["earthquake", "shellsmash", "spikes", "stealthrock", "stoneedge", "xscissor"], + "moves": ["earthquake", "shellsmash", "stoneedge", "xscissor"], "doublesLevel": 84, "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,14 +1581,14 @@ "doublesMoves": ["closecombat", "headcharge", "lashout", "protect", "wildcharge"] }, "braviary": { - "level": 81, + "level": 80, "moves": ["bravebird", "bulkup", "closecombat", "roost"], "doublesLevel": 82, "doublesMoves": ["bravebird", "bulkup", "closecombat", "roost", "tailwind"] }, "mandibuzz": { "level": 82, - "moves": ["bravebird", "defog", "foulplay", "roost", "toxic"], + "moves": ["bravebird", "defog", "foulplay", "roost", "toxic", "uturn"], "doublesLevel": 88, "doublesMoves": ["foulplay", "roost", "snarl", "tailwind", "taunt"] }, @@ -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"] @@ -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"] }, @@ -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/gen8/teams.ts b/data/random-battles/gen8/teams.ts index 1cec6b38ed3e..8532c06ec3a1 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 = ( @@ -575,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/bss-factory-sets.json b/data/random-battles/gen9/bss-factory-sets.json new file mode 100644 index 000000000000..b095cace0479 --- /dev/null +++ b/data/random-battles/gen9/bss-factory-sets.json @@ -0,0 +1,6229 @@ +{ + "chienpao": { + "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": [ + ["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": "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": 2, + "moves": [ + ["Moonblast"], + ["Shadow Ball"], + ["Psyshock"], + ["Energy Ball"] + ], + "item": ["Assault Vest"], + "nature": "Modest", + "evs": {"hp": 164, "def": 28, "spa": 196, "spd": 4, "spe": 116}, + "ivs": {"atk": 0}, + "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"] + } + ] + }, + "urshifurapidstrike": { + "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": "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": "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": "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": [ + ["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": "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": [ + ["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": "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": [ + ["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": [ + ["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": "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": [ + ["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"], + ["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": "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": [ + ["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"], + "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 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": [ + ["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": "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": "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": "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": [ + ["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": [ + ["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": [ + ["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": 85, + "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": 15, + "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"] + } + ] + }, + "cresselia": { + "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"], + ["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": [ + ["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": [ + ["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": "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": [ + ["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": [ + ["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": [ + ["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"], + ["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": "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"], + ["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": [ + ["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": ["Toxic Orb"], + "nature": "Impish", + "evs": {"hp": 244, "def": 108, "spe": 156}, + "teraType": ["Water"], + "wantsTera": true, + "ability": ["Poison Heal"] + } + ] + }, + "ironmoth": { + "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": 10, + "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": ["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, + "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": [ + ["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": [ + ["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"], + ["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": [ + ["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": [ + ["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": "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"], + ["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", "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": [ + ["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": [ + ["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": "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": [ + ["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": "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": [ + ["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": [ + ["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": [ + ["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": [ + ["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": 13, + "moves": [ + ["Calm Mind"], + ["Soft-Boiled"], + ["Shadow Ball"], + ["Flamethrower"] + ], + "item": ["Leftovers"], + "nature": "Calm", + "evs": {"hp": 4, "def": 252, "spd": 252}, + "teraType": ["Dark", "Fire", "Ghost"], + "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": [ + ["Calm Mind"], + ["Soft-Boiled"], + ["Flamethrower", "Shadow Ball"], + ["Fling"] + ], + "item": ["Flame Orb", "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": [ + ["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": 70, + "moves": [ + ["Seismic Toss"], + ["Shadow Ball"], + ["Calm Mind"], + ["Soft-Boiled"] + ], + "item": ["Eviolite"], + "nature": "Bold", + "evs": {"hp": 12, "def": 252, "spd": 244}, + "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"] + } + ] + }, + "espathra": { + "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"], + ["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": "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": [ + ["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": 28, + "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": ["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": 5, + "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": ["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": 18, + "moves": [ + ["Stone Axe"], + ["U-turn"], + ["Night Slash"], + ["Close Combat", "X-Scissor"] + ], + "item": ["Choice Scarf"], + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "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"] + } + ] + }, + "screamtail": { + "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"], + ["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": 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": ["Leftovers", "Rocky Helmet"], + "nature": "Adamant", + "evs": {"hp": 252, "atk": 156, "spe": 100}, + "teraType": ["Flying", "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": "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": [ + ["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"], + ["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": [ + ["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": [ + ["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": [ + ["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": [ + ["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": [ + ["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": "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": "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"], + ["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"], + ["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": "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": "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": [ + ["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"], + ["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": [ + ["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": "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"], + ["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": [ + ["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": [ + ["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": "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": [ + ["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": [ + ["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"], + ["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": [ + ["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": [ + ["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": [ + ["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"], + ["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": [ + ["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": [ + ["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": [ + ["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": "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": [ + ["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": [ + ["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": "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": "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": "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": "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": "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"], + ["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": [ + ["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": [ + ["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": [ + ["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": "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": [ + ["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": [ + ["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"], + ["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/doubles-sets.json b/data/random-battles/gen9/doubles-sets.json index e1c5f692e28f..2b1935102825 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", @@ -325,7 +325,7 @@ { "role": "Doubles Wallbreaker", "movepool": ["Fire Punch", "High Horsepower", "Rock Slide", "Stone Edge"], - "teraTypes": ["Fire", "Grass"] + "teraTypes": ["Grass"] } ] }, @@ -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,12 +665,17 @@ ] }, "ditto": { - "level": 96, + "level": 97, "sets": [ { "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"] } ] }, @@ -765,7 +770,7 @@ ] }, "zapdosgalar": { - "level": 78, + "level": 77, "sets": [ { "role": "Doubles Fast Attacker", @@ -1019,7 +1024,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"] } ] @@ -1096,6 +1101,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"] } ] }, @@ -1210,7 +1220,7 @@ ] }, "houndoom": { - "level": 87, + "level": 86, "sets": [ { "role": "Doubles Fast Attacker", @@ -1290,7 +1300,7 @@ ] }, "blissey": { - "level": 95, + "level": 96, "sets": [ { "role": "Doubles Support", @@ -1300,7 +1310,7 @@ ] }, "raikou": { - "level": 82, + "level": 81, "sets": [ { "role": "Offensive Protect", @@ -1333,7 +1343,7 @@ "teraTypes": ["Dragon", "Grass"] }, { - "role": "Doubles Support", + "role": "Bulky Protect", "movepool": ["Calm Mind", "Ice Beam", "Protect", "Scald"], "teraTypes": ["Dragon", "Grass"] } @@ -1475,7 +1485,7 @@ ] }, "masquerain": { - "level": 88, + "level": 89, "sets": [ { "role": "Doubles Setup Sweeper", @@ -1704,7 +1714,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"] } ] @@ -1745,7 +1755,7 @@ ] }, "tropius": { - "level": 93, + "level": 94, "sets": [ { "role": "Doubles Support", @@ -1810,7 +1820,7 @@ ] }, "regirock": { - "level": 84, + "level": 83, "sets": [ { "role": "Doubles Bulky Setup", @@ -1835,7 +1845,7 @@ ] }, "registeel": { - "level": 79, + "level": 78, "sets": [ { "role": "Doubles Bulky Setup", @@ -1954,13 +1964,13 @@ "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"] } ] }, "deoxysspeed": { - "level": 83, + "level": 84, "sets": [ { "role": "Doubles Support", @@ -2353,9 +2363,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"] } ] }, @@ -2653,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"] } ] }, @@ -2925,7 +2935,7 @@ ] }, "serperior": { - "level": 82, + "level": 81, "sets": [ { "role": "Offensive Protect", @@ -2935,7 +2945,7 @@ { "role": "Tera Blast user", "movepool": ["Glare", "Leaf Storm", "Protect", "Tera Blast"], - "teraTypes": ["Stellar"] + "teraTypes": ["Fire", "Rock"] } ] }, @@ -3465,7 +3475,7 @@ ] }, "tornadustherian": { - "level": 78, + "level": 77, "sets": [ { "role": "Doubles Setup Sweeper", @@ -3480,7 +3490,7 @@ ] }, "thundurus": { - "level": 80, + "level": 79, "sets": [ { "role": "Doubles Setup Sweeper", @@ -3500,7 +3510,7 @@ ] }, "thundurustherian": { - "level": 79, + "level": 78, "sets": [ { "role": "Doubles Fast Attacker", @@ -3805,7 +3815,7 @@ ] }, "dedenne": { - "level": 87, + "level": 86, "sets": [ { "role": "Doubles Support", @@ -3815,7 +3825,7 @@ ] }, "carbink": { - "level": 89, + "level": 88, "sets": [ { "role": "Doubles Bulky Setup", @@ -4055,7 +4065,7 @@ ] }, "oricoriopau": { - "level": 88, + "level": 89, "sets": [ { "role": "Bulky Protect", @@ -4345,7 +4355,7 @@ ] }, "necrozmadawnwings": { - "level": 73, + "level": 74, "sets": [ { "role": "Doubles Wallbreaker", @@ -4415,7 +4425,7 @@ ] }, "inteleon": { - "level": 81, + "level": 80, "sets": [ { "role": "Choice Item user", @@ -4465,7 +4475,7 @@ ] }, "flapple": { - "level": 93, + "level": 94, "sets": [ { "role": "Doubles Bulky Attacker", @@ -4515,7 +4525,7 @@ ] }, "barraskewda": { - "level": 83, + "level": 84, "sets": [ { "role": "Doubles Wallbreaker", @@ -4650,7 +4660,7 @@ ] }, "stonjourner": { - "level": 89, + "level": 88, "sets": [ { "role": "Doubles Fast Attacker", @@ -5444,7 +5454,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"] } ] @@ -5590,7 +5600,7 @@ ] }, "brutebonnet": { - "level": 79, + "level": 80, "sets": [ { "role": "Doubles Bulky Attacker", @@ -5600,7 +5610,7 @@ ] }, "sandyshocks": { - "level": 80, + "level": 79, "sets": [ { "role": "Doubles Fast Attacker", @@ -5830,7 +5840,7 @@ ] }, "koraidon": { - "level": 67, + "level": 66, "sets": [ { "role": "Choice Item user", @@ -5880,7 +5890,7 @@ ] }, "dipplin": { - "level": 90, + "level": 91, "sets": [ { "role": "Doubles Bulky Attacker", @@ -6025,7 +6035,7 @@ ] }, "hydrapple": { - "level": 84, + "level": 85, "sets": [ { "role": "Doubles Wallbreaker", @@ -6045,7 +6055,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 04c9cb871b2f..eb1519087f0c 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"] } ] }, @@ -158,7 +153,7 @@ "level": 79, "sets": [ { - "role": "Fast Support", + "role": "Bulky Support", "movepool": ["Aurora Veil", "Blizzard", "Encore", "Moonblast"], "teraTypes": ["Steel", "Water"] }, @@ -168,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"] } ] }, @@ -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"] } ] @@ -209,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"] }, { @@ -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"] } ] }, @@ -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"] } ] @@ -449,7 +444,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"] }, { @@ -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"] } ] }, @@ -574,8 +569,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 +656,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"] } ] }, @@ -820,7 +820,7 @@ ] }, "articunogalar": { - "level": 83, + "level": 84, "sets": [ { "role": "Fast Bulky Setup", @@ -834,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"] } ] @@ -914,8 +914,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"] } ] }, @@ -960,11 +960,11 @@ ] }, "feraligatr": { - "level": 80, + "level": 79, "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"] }, { @@ -1000,7 +1000,7 @@ ] }, "ariados": { - "level": 94, + "level": 95, "sets": [ { "role": "Fast Support", @@ -1070,7 +1070,7 @@ ] }, "sudowoodo": { - "level": 93, + "level": 94, "sets": [ { "role": "Bulky Attacker", @@ -1132,14 +1132,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 +1263,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"] } ] }, @@ -1393,8 +1393,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"] } ] @@ -1626,6 +1626,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"] } ] }, @@ -1900,7 +1905,7 @@ { "role": "Setup Sweeper", "movepool": ["Drain Punch", "Knock Off", "Seed Bomb", "Sucker Punch", "Swords Dance"], - "teraTypes": ["Dark", "Fighting", "Poison"] + "teraTypes": ["Dark", "Poison"] } ] }, @@ -2065,7 +2070,7 @@ ] }, "regirock": { - "level": 84, + "level": 83, "sets": [ { "role": "Bulky Attacker", @@ -2379,7 +2384,7 @@ }, { "role": "Fast Support", - "movepool": ["Encore", "Super Fang", "Thunderbolt", "U-turn"], + "movepool": ["Discharge", "Encore", "Super Fang", "U-turn"], "teraTypes": ["Flying"] } ] @@ -2463,9 +2468,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"] } ] }, @@ -2514,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"] } ] }, @@ -2529,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"] } ] }, @@ -2608,9 +2618,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": ["Discharge", "Flash Cannon", "Mirror Coat", "Thunderbolt", "Volt Switch"], + "teraTypes": ["Flying", "Water"] + }, + { + "role": "Bulky Setup", + "movepool": ["Body Press", "Discharge", "Flash Cannon", "Iron Defense", "Thunderbolt"], + "teraTypes": ["Fighting"] } ] }, @@ -2688,9 +2708,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"] } ] }, @@ -2704,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"] } ] @@ -2729,7 +2754,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"] } ] @@ -2776,6 +2801,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"] } ] }, @@ -2810,7 +2840,7 @@ ] }, "rotomheat": { - "level": 82, + "level": 83, "sets": [ { "role": "Bulky Attacker", @@ -2835,7 +2865,7 @@ { "role": "Bulky Attacker", "movepool": ["Air Slash", "Nasty Plot", "Thunderbolt", "Volt Switch", "Will-O-Wisp"], - "teraTypes": ["Electric"] + "teraTypes": ["Electric", "Steel"] } ] }, @@ -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"] } ] @@ -3078,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"] } ] }, @@ -3150,12 +3190,17 @@ ] }, "arceusfighting": { - "level": 69, + "level": 70, "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"] } ] }, @@ -3190,7 +3235,7 @@ ] }, "arceusghost": { - "level": 70, + "level": 69, "sets": [ { "role": "Bulky Support", @@ -3250,7 +3295,7 @@ ] }, "arceuspoison": { - "level": 72, + "level": 71, "sets": [ { "role": "Setup Sweeper", @@ -3315,12 +3360,12 @@ ] }, "serperior": { - "level": 80, + "level": 79, "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", @@ -3370,7 +3415,7 @@ { "role": "Fast Attacker", "movepool": ["Ceaseless Edge", "Flip Turn", "Razor Shell", "Sacred Sword", "Sucker Punch", "Swords Dance"], - "teraTypes": ["Dark", "Water"] + "teraTypes": ["Dark", "Poison", "Water"] } ] }, @@ -3421,11 +3466,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"] } ] }, @@ -3449,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"] }, { @@ -3546,11 +3586,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 +3790,7 @@ { "role": "Fast Bulky Setup", "movepool": ["Brave Bird", "Bulk Up", "Close Combat", "Roost"], - "teraTypes": ["Fighting", "Flying"] + "teraTypes": ["Fighting", "Steel"] } ] }, @@ -3769,7 +3804,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"] } ] @@ -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"] } ] @@ -3805,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", @@ -3890,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", @@ -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"] }, { @@ -3940,7 +3980,7 @@ { "role": "Setup Sweeper", "movepool": ["Bolt Strike", "Dragon Dance", "Outrage", "Substitute"], - "teraTypes": ["Electric"] + "teraTypes": ["Electric", "Steel"] } ] }, @@ -4100,11 +4140,11 @@ ] }, "vivillon": { - "level": 85, + "level": 84, "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"] }, { @@ -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"] } ] }, @@ -4289,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"] }, { @@ -4405,12 +4445,12 @@ { "role": "Bulky Attacker", "movepool": ["Defog", "Knock Off", "Leaf Blade", "Roost", "Sucker Punch", "Swords Dance", "Triple Arrows", "U-turn"], - "teraTypes": ["Steel"] + "teraTypes": ["Steel", "Water"] } ] }, "incineroar": { - "level": 84, + "level": 83, "sets": [ { "role": "AV Pivot", @@ -4474,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"] } ] @@ -4484,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"] } ] @@ -4626,6 +4666,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"] } ] }, @@ -4709,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"] } ] }, @@ -4862,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"] } ] }, @@ -5089,7 +5144,7 @@ "sets": [ { "role": "Bulky Attacker", - "movepool": ["Discharge", "Recover", "Scald", "Spikes", "Toxic Spikes"], + "movepool": ["Discharge", "Recover", "Scald", "Spikes", "Thunderbolt", "Toxic Spikes"], "teraTypes": ["Water"] }, { @@ -5104,7 +5159,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"] }, { @@ -5373,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"] } ] }, @@ -5453,9 +5513,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", @@ -5500,7 +5560,7 @@ { "role": "Bulky Support", "movepool": ["Hex", "Slack Off", "Torch Song", "Will-O-Wisp"], - "teraTypes": ["Fairy", "Ghost", "Water"] + "teraTypes": ["Fairy", "Water"] } ] }, @@ -5594,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"] } ] @@ -5604,8 +5664,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", @@ -5630,7 +5690,7 @@ { "role": "Wallbreaker", "movepool": ["Brave Bird", "Double-Edge", "Foul Play", "Parting Shot", "Quick Attack"], - "teraTypes": ["Dark", "Flying", "Normal"] + "teraTypes": ["Flying", "Normal"] } ] }, @@ -5650,7 +5710,7 @@ { "role": "Wallbreaker", "movepool": ["Brave Bird", "Double-Edge", "Foul Play", "Parting Shot", "Quick Attack"], - "teraTypes": ["Dark", "Flying", "Normal"] + "teraTypes": ["Flying", "Normal"] } ] }, @@ -5675,7 +5735,7 @@ ] }, "armarouge": { - "level": 81, + "level": 80, "sets": [ { "role": "Wallbreaker", @@ -5715,7 +5775,7 @@ { "role": "Fast Support", "movepool": ["Hurricane", "Roost", "Thunder Wave", "Thunderbolt", "U-turn"], - "teraTypes": ["Electric", "Flying"] + "teraTypes": ["Electric", "Flying", "Steel", "Water"] } ] }, @@ -5908,19 +5968,24 @@ "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"] } ] }, "glimmora": { - "level": 76, + "level": 75, "sets": [ { "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"] } ] }, @@ -5929,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"] }, { @@ -5980,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", @@ -6035,7 +6100,7 @@ { "role": "Bulky Attacker", "movepool": ["Boomburst", "Calm Mind", "Earth Power", "Roost"], - "teraTypes": ["Ghost"] + "teraTypes": ["Fairy", "Ghost"] }, { "role": "Bulky Setup", @@ -6079,8 +6144,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"] } ] }, @@ -6184,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"] } ] @@ -6256,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"] } ] }, @@ -6293,13 +6368,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"] } ] @@ -6310,7 +6385,7 @@ { "role": "Bulky Support", "movepool": ["Earthquake", "Spikes", "Stealth Rock", "Throat Chop", "Whirlwind"], - "teraTypes": ["Ghost", "Ground", "Poison"] + "teraTypes": ["Ghost", "Poison"] }, { "role": "Bulky Attacker", @@ -6364,7 +6439,7 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["Collision Course", "Flare Blitz", "Outrage", "U-turn"], + "movepool": ["Close Combat", "Flare Blitz", "Outrage", "U-turn"], "teraTypes": ["Fire"] }, { @@ -6569,7 +6644,7 @@ "sets": [ { "role": "AV Pivot", - "movepool": ["Draco Meteor", "Thunderbolt", "Thunderclap", "Volt Switch"], + "movepool": ["Discharge", "Draco Meteor", "Thunderbolt", "Thunderclap", "Volt Switch"], "teraTypes": ["Electric"] }, { @@ -6601,11 +6676,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..fc13bf3a509b 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,19 @@ interface BattleFactorySet { evs?: Partial; ivs?: Partial; } +interface BSSFactorySet { + species: string; + weight: number; + item: string[]; + ability: string; + nature: string; + moves: string[][]; + teraType: string[]; + gender?: string; + wantsTera?: boolean; + evs: number[]; + ivs?: number[]; +} export class MoveCounter extends Utils.Multiset { damagingMoves: Set; ironFist: number; @@ -40,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 = ( @@ -66,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 = [ @@ -78,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', @@ -117,7 +127,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 +139,7 @@ const DOUBLES_NO_LEAD_POKEMON = [ ]; const DEFENSIVE_TERA_BLAST_USERS = [ - 'alcremie', 'bellossom', 'comfey', 'florges', + 'alcremie', 'bellossom', 'comfey', 'fezandipiti', 'florges', ]; function sereneGraceBenefits(move: Move) { @@ -180,9 +190,16 @@ 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) => !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'), @@ -209,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) => ( @@ -491,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 = [ @@ -548,11 +569,13 @@ export class RandomTeams { ['fireblast', ['fierydance', 'flamethrower']], ['lavaplume', 'magmastorm'], ['thunderpunch', 'wildcharge'], + ['thunderbolt', 'discharge'], ['gunkshot', ['direclaw', 'poisonjab', 'sludgebomb']], ['aurasphere', 'focusblast'], ['closecombat', 'drainpunch'], ['bugbite', 'pounce'], [['dragonpulse', 'spacialrend'], 'dracometeor'], + ['heavyslam', 'flashcannon'], ['alluringvoice', 'dazzlinggleam'], // These status moves are redundant with each other @@ -565,10 +588,6 @@ export class RandomTeams { ['nastyplot', ['rockslide', 'knockoff']], // Persian ['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 +1063,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 +1075,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': @@ -1083,10 +1102,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': @@ -1109,11 +1127,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'); - case 'Unaware': - return (species.id === 'clefable' && role !== 'Bulky Support'); + return (yanmegaCase || species.id === 'illumise'); case 'Unburden': return (abilities.has('Prankster') || !counter.get('setup') || species.id === 'sceptile'); case 'Vital Spirit': @@ -1153,6 +1168,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'; @@ -1167,6 +1183,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'; @@ -1176,6 +1195,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'; @@ -1193,9 +1213,10 @@ 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 === 'kingambit') return 'Defiant'; if (species.id === 'armarouge' && !moves.has('meteorbeam')) return 'Flash Fire'; if (species.id === 'talonflame') return 'Gale Wings'; if ( @@ -1215,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'; @@ -1317,8 +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' && moves.has('bodypress') && !isDoubles) + !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 +1368,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 +1445,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') && @@ -1509,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) ) || ( @@ -1518,11 +1537,11 @@ 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') && 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') && + 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 ( @@ -1925,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; } @@ -2158,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); @@ -2467,6 +2487,288 @@ 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)); + } + + return { + name: setData.set.species || species.baseSpecies, + species: setData.set.species, + 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: this.sampleIfArray(setData.set.ability), + shiny: this.randomChance(1, 1024), + level: 50, + happiness: 255, + 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, + }; + } + + + 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/data/random-battles/gen9baby/sets.json b/data/random-battles/gen9baby/sets.json new file mode 100644 index 000000000000..7aa5fd3985f2 --- /dev/null +++ b/data/random-battles/gen9baby/sets.json @@ -0,0 +1,2987 @@ +{ + "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": ["Power Whip", "Sludge Bomb", "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": ["Bullet Seed", "Crunch", "Leaf Storm", "Stomping Tantrum"], + "teraTypes": ["Dark", "Ground"] + }, + { + "role": "Fast Support", + "movepool": ["Giga Drain", "Leaf Storm", "Stomping Tantrum", "Super Fang", "Thief"], + "teraTypes": ["Poison", "Water"] + } + ] + }, + "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": "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", "Crabhammer", "Dragon Dance", "Knock Off"], + "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"] + } + ] + }, + "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": ["Crunch", "Outrage", "Roar", "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", "Thunderbolt"], + "teraTypes": ["Dragon", "Electric", "Fighting", "Steel"] + }, + { + "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", "Grass", "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": ["Clear Smog", "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": "Bulky Setup", + "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": ["Dragon", "Ground", "Steel"] + } + ] + }, + "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": ["Ghost", "Grass"] + } + ] + }, + "golett": { + "level": 7, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Dynamic Punch", "Earthquake", "Poltergeist", "Rock Tomb", "Stealth Rock"], + "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": "Wallbreaker", + "movepool": ["Drain Punch", "Grassy Glide", "Knock Off", "Swords Dance", "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 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": ["Draining Kiss", "Mystical Fire", "Nuzzle", "Psychic"], + "teraTypes": ["Electric", "Fairy"] + }, + { + "role": "Bulky Setup", + "movepool": ["Calm Mind", "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": ["Giga Drain", "Leech Life", "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", "Knock Off", "Stone Edge"], + "teraTypes": ["Dark", "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"] + }, + { + "role": "Tera Blast user", + "movepool": ["Agility", "Dazzling Gleam", "Tera Blast", "Thunderbolt"], + "teraTypes": ["Ice"] + } + ] + }, + "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": ["Double-Edge", "Fake Out", "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", "U-turn"], + "teraTypes": ["Fairy", "Water"] + } + ] + }, + "mienfoo": { + "level": 6, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["High Jump Kick", "Knock Off", "Poison Jab", "Stone Edge", "Swords Dance"], + "teraTypes": ["Dark", "Fighting", "Poison"] + }, + { + "role": "Fast Support", + "movepool": ["Fake Out", "High Jump Kick", "Knock Off", "U-turn"], + "teraTypes": ["Dark", "Steel"] + }, + { + "role": "Fast Attacker", + "movepool": ["High Jump Kick", "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": "Bulky Setup", + "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", "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"] + } + ] + }, + "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 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"] + } + ] + }, + "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": ["Dragon", "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": ["Dragon", "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"] + } + ] + }, + "rookidee": { + "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", "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": "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"] + } + ] + }, + "seedot": { + "level": 8, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Body Slam", "Bullet Seed", "Defog", "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", "Swords Dance", "Throat Chop", "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": ["Fire", "Rock"] + } + ] + }, + "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"] + } + ] + }, + "snubbull": { + "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": "Bulky Support", + "movepool": ["Flip Turn", "Ice Beam", "Rapid Spin", "Surf", "Yawn"], + "teraTypes": ["Poison", "Steel"] + }, + { + "role": "Tera Blast user", + "movepool": ["Ice Beam", "Shell Smash", "Surf", "Tera Blast"], + "teraTypes": ["Electric", "Grass"] + } + ] + }, + "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", "Switcheroo", "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"] + }, + { + "role": "Fast Support", + "movepool": ["Bulk Up", "Defog", "Drain Punch", "Knock Off", "Mach Punch"], + "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": "Bulky 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": "Wallbreaker", + "movepool": ["Flare Blitz", "Overheat", "Protect", "Rock Slide"], + "teraTypes": ["Dragon", "Fire", "Rock"] + }, + { + "role": "Tera Blast user", + "movepool": ["Flare Blitz", "Protect", "Swords Dance", "Tera Blast"], + "teraTypes": ["Fighting", "Grass", "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"] + } + ] + }, + "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..50f633d460bb --- /dev/null +++ b/data/random-battles/gen9baby/teams.ts @@ -0,0 +1,865 @@ +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) => ( + !counter.get('Bug') + ); + } + + + 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, ['destinybond', 'healingwish', 'switcheroo', 'trick']], + ['curse', 'rapidspin'], + + // These moves are redundant with each other + [ + ['alluringvoice', 'dazlinggleam', 'drainingkiss', 'moonblast'], + ['alluringvoice', 'dazlinggleam', 'drainingkiss', 'moonblast'], + ], + [['bulletseed', 'gigadrain', 'leafstorm', 'seedbomb'], ['bulletseed', 'gigadrain', 'leafstorm', 'seedbomb']], + [['hypnosis', 'thunderwave', 'toxic', 'willowisp', 'yawn'], ['hypnosis', 'thunderwave', 'toxic', 'willowisp', 'yawn']], + ['roar', 'yawn'], + ['dragonclaw', 'outrage'], + ['dracometeor', 'dragonpulse'], + ['toxic', 'toxicspikes'], + ['rockblast', 'stoneedge'], + ['bodyslam', 'doubleedge'], + ['gunkshot', 'poisonjab'], + [['hydropump', '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 === 'doduo') return 'Early Bird'; + 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'; + 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'; + + // 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 === 'nymble') return 'Silver Powder'; + + if (moves.has('focusenergy')) return 'Scope Lens'; + if (moves.has('thief')) return ''; + 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'; + + if (ability === 'Guts' && moves.has('facade')) return 'Flame Orb'; + if (ability === 'Quick Feet') return 'Toxic Orb'; + + 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'; + } + + 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 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") { + 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); + } + } + } + + // 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) >= 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) >= 3 * limitFactor) { + skip = true; + break; + } + } + if (this.dex.getEffectiveness(typeName, species) > 1) { + if (typeDoubleWeaknesses.get(typeName) >= 1 * limitFactor) { + skip = true; + break; + } + } + } + if (skip) continue; + + // Limit four weak to Freeze-Dry + if (weakToFreezeDry) { + if (typeWeaknesses.get('Freeze-Dry') >= 4 * limitFactor) continue; + } + } + + // Limit three of any type combination in Monotype + if (!this.forceMonotype && isMonotype && typeComboCount.get(typeCombo) >= 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/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/data/rulesets.ts b/data/rulesets.ts index 89f1a9f08f97..a81e83615f78 100644 --- a/data/rulesets.ts +++ b/data/rulesets.ts @@ -1,11 +1,9 @@ // Note: These are the rules that formats use -import {Utils} from "../lib"; 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} = { +export const Rulesets: import('../sim/dex-formats').FormatDataTable = { // Rulesets /////////////////////////////////////////////////////////////////// @@ -812,7 +810,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 +836,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 +1588,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); @@ -2070,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: { @@ -2697,7 +2679,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); @@ -2839,7 +2821,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( @@ -2854,6 +2836,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; }, }, }; 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..fd8ee76fb71b 100644 --- a/data/text/items.ts +++ b/data/text/items.ts @@ -1,349 +1,349 @@ -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.", + 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: {[k: string]: 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: {[k: string]: 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: {[k: string]: 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: {[k: string]: 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: {[k: string]: 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: {[k: string]: 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: {[k: string]: 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: {[k: string]: 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: {[k: string]: 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: {[k: string]: 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: {[k: string]: 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: {[k: string]: 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: {[k: string]: 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: {[k: string]: 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: {[k: string]: 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.", }, }; diff --git a/data/text/moves.ts b/data/text/moves.ts index 83ae831134f0..f0488ee7e26c 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.", @@ -293,7 +293,7 @@ export const MovesText: {[k: string]: 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.", 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/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-commands/info.ts b/server/chat-commands/info.ts index 5b312305a767..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; } @@ -1790,7 +1793,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 +1804,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-formatter.ts b/server/chat-formatter.ts index c3425eee1be1..0b6c12175548 100644 --- a/server/chat-formatter.ts +++ b/server/chat-formatter.ts @@ -60,7 +60,17 @@ 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; -type SpanType = '_' | '*' | '~' | '^' | '\\' | '|' | '<' | '[' | '`' | 'a' | 'spoiler' | '>' | '('; +/** + * 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' | 'u' | 'spoiler' | '>' | '('; type FormatSpan = [SpanType, number]; @@ -68,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, '&') @@ -84,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; @@ -110,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)}`); } @@ -122,6 +138,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 +180,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 @@ -181,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; @@ -203,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(``); @@ -230,9 +257,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; @@ -253,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) { @@ -268,12 +301,20 @@ 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 '[': + // 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; @@ -287,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) === '>') { // `>` @@ -295,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}`; @@ -314,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 = ''; @@ -334,28 +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': + 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; @@ -365,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) { @@ -375,7 +443,11 @@ 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. + // 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); } @@ -387,9 +459,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 +471,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 +482,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 +493,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 +504,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) { @@ -434,7 +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 converted link. this.runLookahead('a', i); if (i < this.offset) { i = this.offset - 1; @@ -444,6 +535,7 @@ class TextFormatter { break; case '\r': case '\n': + // End of the line. No spans span multiple lines. this.popAllSpans(i); if (this.replaceLinebreaks) { this.buffers.push(`
`); @@ -462,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(); } /** 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.`); diff --git a/server/chat-plugins/auction.ts b/server/chat-plugins/auction.ts new file mode 100644 index 000000000000..fd4ce4d7f3db --- /dev/null +++ b/server/chat-plugins/auction.ts @@ -0,0 +1,968 @@ +/** + * 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[]; +} + +interface Manager { + id: ID; + team: Team; +} + +class Team { + id: ID; + name: string; + credits: number; + suspended: boolean; + private auction: Auction; + constructor(name: string, auction: Auction) { + this.id = toID(name); + this.name = name; + this.credits = auction.startingCredits; + 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) { + 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; + owners: {[k: string]: string}; + teams: {[k: string]: Team}; + managers: {[k: string]: Manager}; + playerList: {[k: string]: Player}; + + 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: Set; + state: 'setup' | 'nom' | 'bid' = 'setup'; + constructor(room: Room, startingCredits = 100000) { + super(room); + this.title = `Auction (${room.title})`; + this.owners = {}; + this.teams = {}; + this.managers = {}; + this.playerList = {}; + + 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 = new Set(); + } + + sendMessage(message: string) { + this.room.add(`|c|&|${message}`).update(); + } + + sendHTMLBox(htmlContent: string, uhtml?: string) { + this.room.add(`|${uhtml ? `uhtml|${uhtml}` : 'html'}|
${htmlContent}
`).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 = 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 += `
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.getManagerNames(), 2, true)}
${team.credits.toLocaleString()}${team.maxBid() >= this.minBid ? `
Max bid: ${team.maxBid().toLocaleString()}` : ''}
${players.length}${this.generateUsernameList(players)}
`; + + 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; + 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 += `
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; + } + + 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.sendHTMLBox(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.getExact(manager); + if (!user) throw new Chat.ErrorMessage(`User "${manager}" not found.`); + if (!this.managers[user.id]) { + this.managers[user.id] = {id: user.id, team}; + } else { + this.managers[user.id].team = team; + } + } + } + + removeManagers(managers: string[]) { + for (const manager of managers) { + if (!this.managers[toID(manager)]) throw new Chat.ErrorMessage(`Manager "${manager}" not found`); + delete this.managers[toID(manager)]; + } + } + + 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.sendHTMLBox(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.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.managers[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}${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 = this.managers[user.id]?.team; + 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.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.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}**.`); + } + } + if (amount > this.currentBid) { + this.currentBid = amount; + this.currentBidder = team; + } + if (this.bidsPlaced.size === 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.sendHTMLBox(this.generateBidInfo(), 'bid'); + 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.bidsPlaced.clear(); + 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.currentNom.price = 0; + 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) { + this.sendHTMLBox(this.generateAuctionTable()); + this.sendHTMLBox(this.generatePriceList()); + if (message) this.sendMessage(message); + 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(); + 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.sendReplyBox(auction.generateAuctionTable()); + }, + pricelist(target, room, user) { + this.runBroadcast(); + const auction = this.requireGame(Auction); + this.sendReplyBox(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 ${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`, + ], + removemanager: 'removemanagers', + removemanagers(target, room, user) { + room = this.requireRoom(); + const auction = this.requireGame(Auction); + auction.checkOwner(user); + + 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 [manager1], [manager2], ... - Removes managers. 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 [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.
` + + `
` + ); + }, + nom(target) { + this.parse(`/auction nominate ${target}`); + }, + bid(target) { + this.parse(`/auction bid ${target}`); + }, + overpay() { + this.requireGame(Auction); + return '/announce OVERPAY!'; + }, +}; + +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/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/chatlog.ts b/server/chat-plugins/chatlog.ts index 2ceb33b09d9e..9783b7323510 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.'); 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}`; 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/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 5d86f13f24e2..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 */ @@ -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() @@ -155,8 +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'; + 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}/${isDoubles ? `doubles-` : ``}sets.json`) + FS(`data/random-battles/${folderName}/${isDoubles ? 'doubles-' : ''}sets.json`) .readIfExistsSync() || '{}' ); const data = setsFile[species.id]; @@ -316,41 +324,79 @@ 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: ${set.ability.map(formatAbility).join(" / ")}
    • `; + buf += `
    • Level: 50
    • `; + buf += `
    • Tera Type: ${set.teraType.map(formatType).join(' / ')}
    • `; + 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 += `
    • ${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: 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(" / ")}
    • `; } - 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; @@ -414,16 +460,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 +495,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; @@ -543,7 +595,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`); @@ -589,7 +641,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) { 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/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))) diff --git a/server/chat-plugins/seasons.ts b/server/chat-plugins/seasons.ts index 3f4ef88d5b5b..06a20e427145 100644 --- a/server/chat-plugins/seasons.ts +++ b/server/chat-plugins/seasons.ts @@ -62,6 +62,17 @@ 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) { + let formatType = format.split(/gen\d+/)[1]; + if (!['ou', 'randombattle'].includes(formatType)) formatType = 'rotating'; + return `` + buf; + } + return buf; +} + export function setFormatSchedule() { // guard heavily against this being overwritten if (data.current.formatsGeneratedAt === getYear()) return; @@ -346,10 +357,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(); } } 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 = ( 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 cba8b948c9e4..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 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'; @@ -449,7 +450,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 +469,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!` @@ -1024,7 +1025,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: { diff --git a/server/chat-plugins/youtube.ts b/server/chat-plugins/youtube.ts index 78cf21258ede..d92c9c17f36d 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(); 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/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/roomlogs.ts b/server/roomlogs.ts index 8aea6334e1f1..15c99dae71b2 100644 --- a/server/roomlogs.ts +++ b/server/roomlogs.ts @@ -17,7 +17,6 @@ interface RoomlogOptions { noLogTimes?: boolean; } - interface RoomlogRow { type: string; roomid: string; @@ -28,7 +27,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'); /** @@ -78,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; @@ -96,9 +102,7 @@ export class Roomlog { this.numTruncatedLines = 0; - if (!Config.replaysdb) { - void this.setupRoomlogStream(true); - } + this.setupRoomlogStream(); } getScrollback(channel = 0) { let log = this.log; @@ -121,13 +125,14 @@ export class Roomlog { } return log.join('\n') + '\n'; } - async setupRoomlogStream(sync = false) { - if (this.roomlogStream === null || roomlogTable) return; - if (!Config.logchat) { + setupRoomlogStream() { + if (this.roomlogStream === null) return; + if (!Config.logchat || this.roomid.startsWith('battle-') || this.roomid.startsWith('game-')) { this.roomlogStream = null; return; } - if (this.roomid.startsWith('battle-')) { + if (roomlogTable) { + this.roomlogTable = roomlogTable; this.roomlogStream = null; return; } @@ -139,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(); @@ -157,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); @@ -200,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--; @@ -250,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 (${{ @@ -274,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(), []); @@ -292,13 +293,13 @@ export class Roomlog { void Rooms.Modlog.write(this.roomid, entry, overrideID); } async rename(newID: RoomID): Promise { - if (roomlogTable) { - await roomlogTable.updateAll({roomid: this.roomid})`WHERE roomid = ${this.roomid}`; - return true; + await Rooms.Modlog.rename(this.roomid, newID); + const roomlogStreamExisted = this.roomlogStream !== null; + await this.destroy(); + if (this.roomlogTable) { + await this.roomlogTable.updateAll({roomid: newID})`WHERE roomid = ${this.roomid}`; } 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(), @@ -306,30 +307,29 @@ 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; this.roomlogFilename = ""; - await this.setupRoomlogStream(true); + this.setupRoomlogStream(); } - return true; } + 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; diff --git a/server/rooms.ts b/server/rooms.ts index 273b983ed018..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; @@ -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); 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; } } 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/battle.ts b/sim/battle.ts index 99c1286addbf..3a464b7d9252 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; @@ -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) { @@ -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/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 0bbc84bc81f0..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; /** @@ -266,6 +267,7 @@ export interface MoveData extends EffectData, MoveEventMethods, HitEffect { */ tracksTarget?: boolean; willCrit?: boolean; + callsMove?: boolean; // Mechanics flags // --------------- @@ -273,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> & { @@ -285,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'; } @@ -304,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; @@ -338,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 @@ -363,7 +371,7 @@ export class DataMove extends BasicEffect implements Readonly { declare readonly effectType: 'Pokemon'; /** @@ -175,6 +211,8 @@ export class Species extends BasicEffect implements Readonly