diff --git a/LICENSE b/LICENSE index f1bc80d370..118e1fe24a 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2011-2024 Guangcong Luo and other contributors http://pokemonshowdown.com/ +Copyright (c) 2011-2026 Guangcong Luo and other contributors http://pokemonshowdown.com/ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in diff --git a/config/config-example.js b/config/config-example.js index 58059876c2..8289fe3b6c 100644 --- a/config/config-example.js +++ b/config/config-example.js @@ -25,6 +25,15 @@ exports.bindaddress = '0.0.0.0'; */ exports.wsdeflate = null; +/** + * lazysockets - disables eager initialization of network services + * Turn this on if you'd prefer to manually connect Showdown to the network, + * or you intend to run it offline. + * + * @type {boolean} + */ +exports.lazysockets = false; + /* // example: exports.wsdeflate = { diff --git a/config/formats.ts b/config/formats.ts index 76a4178770..0817632f56 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -19,28 +19,6 @@ The column value will be ignored for repeat sections. export const Formats: import('../sim/dex-formats').FormatList = [ - // Likeshop Spotlight - /////////////////////////////////////////////////////////////////// - - { - section: "Likeshop Spotlight", - }, - { - name: "[Gen 9] OU + Solgaleo", - desc: `S/V OU but with Solgaleo.`, - threads: [`• THREAD COMING SOON™`], - mod: 'gen9', - ruleset: ['[Gen 9] OU', '+Solgaleo'], - }, - { - name: "[Gen 9] 1v1 Factory", - desc: `Randomized teams of Pokémon for a generated Smogon tier with sets that are competitively viable.`, - mod: 'gen9', - team: 'random1v1Factory', - bestOfDefault: true, - ruleset: ['[Gen 9] 1v1'], - }, - // S/V Singles /////////////////////////////////////////////////////////////////// @@ -161,7 +139,6 @@ export const Formats: import('../sim/dex-formats').FormatList = [ { name: "[Gen 9] BSS Reg I", mod: 'gen9', - searchShow: false, bestOfDefault: true, ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 9', 'VGC Timer', 'Limit Two Restricted'], restricted: ['Restricted Legendary'], @@ -169,6 +146,7 @@ export const Formats: import('../sim/dex-formats').FormatList = [ { name: "[Gen 9] BSS Reg J", mod: 'gen9', + searchShow: false, bestOfDefault: true, ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 9', 'VGC Timer', 'Limit Two Restricted'], restricted: ['Restricted Legendary', 'Mythical'], @@ -255,29 +233,12 @@ export const Formats: import('../sim/dex-formats').FormatList = [ restricted: ['Restricted Legendary'], }, { - name: "[Gen 9] VGC 2025 Reg I", - mod: 'gen9', - gameType: 'doubles', - searchShow: false, - bestOfDefault: true, - ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 9', 'VGC Timer', 'Open Team Sheets', 'Limit Two Restricted'], - restricted: ['Restricted Legendary'], - }, - { - name: "[Gen 9] VGC 2025 Reg J", + name: "[Gen 9] VGC 2026 Reg I", // Change back to 2025 after removing the ladder mod: 'gen9', gameType: 'doubles', bestOfDefault: true, ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 9', 'VGC Timer', 'Limit Two Restricted'], - restricted: ['Restricted Legendary', 'Mythical'], - }, - { - name: "[Gen 9] VGC 2025 Reg J (Bo3)", - mod: 'gen9', - gameType: 'doubles', - searchShow: false, - ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 9', 'VGC Timer', 'Force Open Team Sheets', 'Best of = 3', 'Limit Two Restricted'], - restricted: ['Restricted Legendary', 'Mythical'], + restricted: ['Restricted Legendary'], }, { name: "[Gen 9] VGC 2026 Reg F", @@ -325,7 +286,7 @@ export const Formats: import('../sim/dex-formats').FormatList = [ 'Koraidon', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Meloetta', 'Mew', 'Mewtwo', 'Mimikyu', 'Miraidon', 'Necrozma', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Ogerpon-Cornerstone', 'Ogerpon-Hearthflame', 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Regidrago', 'Reshiram', 'Scream Tail', 'Shaymin-Sky', 'Snorlax', 'Solgaleo', 'Terapagos', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Moody', - 'Focus Band', 'Focus Sash', 'King\'s Rock', 'Razor Fang', 'Quick Claw', 'Perish Song', + 'Custap Berry', 'Focus Band', 'Focus Sash', 'King\'s Rock', 'Razor Fang', 'Quick Claw', 'Perish Song', ], }, { @@ -349,21 +310,6 @@ export const Formats: import('../sim/dex-formats').FormatList = [ mod: 'gen9', ruleset: ['Standard AG'], }, - { - name: "[Gen 9] Ubers UU", - mod: 'gen9', - searchShow: false, - ruleset: ['[Gen 9] Ubers'], - banlist: [ - // Ubers OU - 'Arceus-Normal', 'Arceus-Fairy', 'Arceus-Ghost', 'Arceus-Ground', 'Arceus-Water', 'Calyrex-Ice', 'Chien-Pao', 'Deoxys-Attack', 'Deoxys-Speed', 'Ditto', - 'Dondozo', 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Glimmora', 'Gliscor', 'Grimmsnarl', 'Groudon', 'Hatterene', 'Ho-Oh', 'Kingambit', - 'Koraidon', 'Kyogre', 'Kyurem-Black', 'Landorus-Therian', 'Lunala', 'Necrozma-Dusk-Mane', 'Rayquaza', 'Regieleki', 'Ribombee', 'Skeledirge', 'Terapagos', - 'Ting-Lu', 'Zacian-Crowned', - // Ubers UUBL + Lunala, Arceus-Ghost, Arceus-Water - 'Arceus-Dragon', 'Arceus-Electric', 'Arceus-Fire', 'Arceus-Flying', 'Arceus-Steel', 'Necrozma-Dawn-Wings', 'Shaymin-Sky', 'Spectrier', 'Zacian', 'Zekrom', - ], - }, { name: "[Gen 9] ZU", mod: 'gen9', @@ -393,9 +339,9 @@ export const Formats: import('../sim/dex-formats').FormatList = [ searchShow: false, ruleset: ['[Gen 9] LC'], banlist: [ - 'Chinchou', 'Diglett-Alola', 'Drifloon', 'Elekid', 'Foongus', 'Glimmet', 'Gothita', 'Greavard', 'Grookey', 'Growlithe-Hisui', 'Koffing', 'Mareanie', - 'Mienfoo', 'Mudbray', 'Pawniard', 'Salandit', 'Sandshrew-Alola', 'Shellder', 'Shellos', 'Snover', 'Stunky', 'Timburr', 'Tinkatink', 'Toedscool', - 'Trapinch', 'Vullaby', 'Wingull', 'Zorua-Hisui', + 'Chinchou', 'Diglett-Alola', 'Drifloon', 'Elekid', 'Foongus', 'Glimmet', 'Gothita', 'Grookey', 'Growlithe-Hisui', 'Koffing', 'Mareanie', 'Mienfoo', 'Mudbray', + 'Pawniard', 'Salandit', 'Sandshrew-Alola', 'Shellder', 'Shellos', 'Snover', 'Stunky', 'Timburr', 'Tinkatink', 'Toedscool', 'Trapinch', 'Vullaby', 'Wingull', + 'Zorua-Hisui', // LC UUBL 'Deerling', 'Minccino', ], @@ -520,261 +466,284 @@ export const Formats: import('../sim/dex-formats').FormatList = [ ruleset: ['Standard Draft'], }, - // OM of the Month + // Ladder Spotlight /////////////////////////////////////////////////////////////////// { - section: "OM of the Month", + section: "Ladder Spotlight", column: 2, }, { - name: "[Gen 9] Tier Shift", - desc: `Pokémon below OU get their stats, excluding HP, boosted. UU/RUBL get +15, RU/NUBL get +20, NU/PUBL get +25, and PU or lower get +30.`, + name: "[Gen 9] BSS Factory (Bo3)", + desc: `Randomized 3v3 Singles featuring Pokémon and movesets popular in Battle Stadium Singles.`, mod: 'gen9', - // searchShow: false, - ruleset: ['Standard OMs', 'Sleep Moves Clause', 'Terastal Clause', 'Evasion Clause', 'Tier Shift Mod'], - banlist: [ - 'Arceus', 'Calyrex-Shadow', 'Koraidon', 'Kyogre', 'Medicham', 'Miraidon', 'Necrozma-Dusk-Mane', 'Zacian-Crowned', 'Drizzle', 'Moody', 'Arena Trap', 'Shadow Tag', - 'Baton Pass', 'Last Respects', 'Shed Tail', 'Heat Rock', 'King\'s Rock', 'Light Clay', 'Razor Fang', - ], - unbanlist: ['Arceus-Bug', 'Arceus-Grass', 'Arceus-Ice'], + team: 'randomBSSFactory', + ruleset: ['Flat Rules', 'VGC Timer', 'Best of = 3'], }, { - name: "[Gen 9] Bio Mech Mons", - desc: `Items, abilities, and moves a Pokémon has access to can be put in any item/move/ability slot.`, - mod: 'biomechmons', - // searchShow: false, - ruleset: ['Standard OMs', 'Sleep Moves Clause'], + name: "[Gen 9] Flipped", + desc: `All Pokémon have their base stats flipped. For example, Sylveon's HP and Speed stats, Attack and Special Defense stats, and Defense and Special Attack stats swap.`, + mod: 'gen9', + ruleset: ['Standard OMs', 'Sleep Clause Mod', 'Evasion Abilities Clause', 'Evasion Items Clause', 'Flipped Mod'], banlist: [ - 'Annihilape​', 'Arceus​', 'Archaludon​', 'Baxcalibur​', 'Calyrex-Ice​', 'Calyrex-Shadow​', 'Chien-Pao​', 'Chi-Yu​', 'Deoxys-Normal​', 'Deoxys-Attack​', 'Dialga​', 'Dialga-Origin​', - 'Espathra​', 'Eternatus​', 'Flutter Mane​', 'Giratina​', 'Giratina-Origin​', 'Gouging Fire​', 'Groudon​', 'Ho-Oh​', 'Iron Bundle​', 'Koraidon​', 'Kyogre​', 'Kyurem-Black​', 'Kyurem-White​', - 'Landorus-Incarnate', 'Lugia​', 'Lunala​', 'Magearna​', 'Mewtwo​', 'Miraidon​', 'Necrozma-Dawn-Wings​', 'Necrozma-Dusk-Mane​', 'Ogerpon-Hearthflame​', 'Palafin​', 'Palkia​', 'Palkia-Origin​', - 'Rayquaza​', 'Regieleki​', 'Regigigas​', 'Reshiram​', 'Roaring Moon​', 'Slaking​', 'Shaymin-Sky​', 'Sneasler​', 'Solgaleo​', 'Spectrier​', 'Terapagos​', 'Ursaluna-Bloodmoon​', 'Urshifu', - 'Urshifu-Rapid-Strike​', 'Volcarona​', 'Zacian​', 'Zacian-Crowned​', 'Zamazenta-Crowned', 'Zekrom​', 'Arena Trap​', 'Moody​', 'Sand Veil​', 'Shadow Tag​', 'Snow Cloak​', '​Bright Powder​', - 'Choice Band​', 'Choice Specs​', 'King\'s Rock​', 'Razor Fang​', 'Baton Pass​', 'Last Respects​', 'Shed Tail​', + 'Araquanid', 'Arceus', 'Azumarill', 'Blissey', 'Calyrex-Ice', 'Calyrex-Shadow', 'Cloyster', 'Cyclizar', 'Deoxys-Attack', 'Deoxys-Normal', 'Deoxys-Speed', + 'Dialga', 'Dialga-Origin', 'Eternatus', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Hoopa-Unbound', 'Koraidon', 'Kyogre', 'Kyurem-Black', + 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Miraidon', 'Mienshao', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Palkia-Origin', + 'Rayquaza', 'Regieleki', 'Reshiram', 'Shaymin-Sky', 'Snorlax', 'Solgaleo', 'Sylveon', 'Terapagos', 'Torkoal', 'Tornadus-Therian', 'Zacian', 'Zacian-Crowned', + 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Arena Trap', 'Moody', 'Shadow Tag', 'Damp Rock', 'King\'s Rock', 'Razor Fang', 'Baton Pass', 'Last Respects', + 'Shed Tail', ], - validateSet(set, teamHas) { - const dex = this.dex; - let species = dex.species.get(set.species); - let requiredItems: string[] = []; - let requiredMove = ''; - let requiredAbility = ''; - if (species.battleOnly) { - if (species.requiredItems) requiredItems = species.requiredItems; - if (species.requiredMove) requiredMove = species.requiredMove; - if (species.requiredAbility) requiredAbility = species.requiredAbility; - species = dex.species.get(species.battleOnly as string); - } - const effectFunctions = [dex.abilities, dex.items, dex.moves]; - if ( - !effectFunctions.some(f => f.get(set.ability).exists) && - !(set.item && effectFunctions.some(f => f.get(set.item).exists)) && - !set.moves.every(move => effectFunctions.some(f => f.get(move).exists)) - ) { - return this.validateSet(set, teamHas); - } - const allThings = [set.ability, set.item, ...set.moves] - .map(e => e.replace(/^(item|move|ability):?(?!\s*shield)/i, '')).filter(e => e.length); - for (const thing of allThings) { - if (!dex.moves.get(thing).exists && !dex.abilities.get(thing).exists && !dex.items.get(thing).exists) { - return [`${thing} does not exist.`]; + }, + { + name: "[Gen 9] The Loser's Game", + desc: `The first player to lose all of their Pokémon wins.`, + mod: 'gen9', + // searchShow: false, + ruleset: ['Standard OMs', 'Sleep Clause Mod', '!OHKO Clause', 'Picked Team Size = 6', 'Adjust Level = 100'], + banlist: ['Infiltrator', 'Choice Scarf', 'Explosion', 'Final Gambit', 'Healing Wish', 'Lunar Dance', 'Magic Room', 'Memento', 'Misty Explosion', 'Self-Destruct'], + onValidateTeam(team) { + const familyTable = new Set(); + for (const set of team) { + let species = this.dex.species.get(set.species); + while (species.prevo) { + species = this.dex.species.get(species.prevo); } - } - if ( - allThings.some(y => effectFunctions.some(x => x.get(y).isNonstandard && - !this.ruleTable.has(`+pokemontag:${this.toID(x.get(y).isNonstandard)}`))) - ) { - return this.validateSet(set, teamHas); - } - const moves = allThings.filter(thing => this.toID(thing) !== 'metronome' && dex.moves.get(thing).exists); - for (const m of moves) { - const moveName = this.dex.moves.get(m).name; - if (this.ruleTable.isBanned(`move:${this.toID(moveName)}`)) return [`${set.species}'s move ${moveName} is banned.`]; - } - const abilities = allThings.filter(thing => dex.abilities.get(thing).exists); - for (const a of abilities) { - const abilName = this.dex.abilities.get(a).name; - if (this.ruleTable.isBanned(`ability:${this.toID(abilName)}`)) { - return [`${set.species}'s ability ${abilName} is banned.`]; + if (familyTable.has(species.id)) { + return [ + `You are limited to one Pokémon from each family by the Family Clause.`, + `(You have more than one evolution of ${species.name}.)`, + ]; } + familyTable.add(species.id); } - const items = allThings.filter(thing => dex.items.get(thing).exists); - for (const i of items) { - const itemName = this.dex.items.get(i).name; - if (this.ruleTable.isBanned(`item:${this.toID(itemName)}`)) return [`${set.species}'s item ${itemName} is banned.`]; - } - const setHas: { [k: string]: true } = {}; - for (const thing of allThings) { - if (setHas[this.toID(thing)]) return [`${set.species} has multiple copies of ${thing}.`]; - setHas[this.toID(thing)] = true; - } - const normalAbility = set.ability; - if (!abilities.length) { - set.ability = 'noability'; - } else { - set.ability = this.toID(abilities[0]); - } - if (abilities.some(abil => !Object.values(species.abilities).map(this.toID).includes(this.toID(abil))) && - this.ruleTable.has('obtainableabilities') - ) { - if (set.ability !== 'noability') return [`${set.species} has illegal abilities.`]; - } - if (requiredAbility && !abilities.map(this.toID).includes(this.toID(requiredAbility))) { - return [`${set.species} requires ${requiredAbility} on its set.`]; - } - if (!moves.length) { - return [`${set.species} requires at least one move.`]; - } - if (set.moves.length > this.ruleTable.maxMoveCount) { - return [`${set.name} has ${set.moves.length} moves, which is more than the limit of ${this.ruleTable.maxMoveCount}.`]; - } - const normalMoves = set.moves; - set.moves = [moves[0]]; - if ( - moves.some(move => this.checkCanLearn(dex.moves.get(move), species)) && - this.ruleTable.has('obtainablemoves') - ) { - return [`${set.species} has illegal moves.`]; - } - if (requiredMove && !moves.map(this.toID).includes(this.toID(requiredMove))) { - return [`${set.species} requires ${requiredMove} on its set.`]; - } - if (!items.length && requiredItems.length) { - return [`${set.species} requires ${requiredItems.join(', ')} on its set.`]; - } - const normalItem = set.item; - if (items.length) { - set.item = items.find(i => dex.items.get(i).forcedForme || dex.items.get(i).itemUser) || items[0]; - } else { - set.item = ''; - } - if (!this.ruleTable.has('+ability:noability')) { - this.ruleTable.set('+ability:noability', ''); - } - let problems = this.validateSet(set, teamHas); - if (problems) problems = problems.filter(p => !p.endsWith('needs to have an ability.')); - if (problems?.length) return problems; - set.ability = normalAbility; - set.item = normalItem; - set.moves = normalMoves; - return null; }, - onBeforeSwitchIn(pokemon) { - let ngas = false; - for (const poke of this.getAllActive()) { - if (this.toID(poke.ability) === ('neutralizinggas' as ID)) { - ngas = true; - break; + battle: { + tiebreak() { + if (this.ended) return false; + + this.inputLog.push(`>tiebreak`); + this.add('message', "Time's up! Going to tiebreaker..."); + const notFainted = this.sides.map(side => ( + side.pokemon.filter(pokemon => !pokemon.fainted).length + )); + this.add('-message', this.sides.map((side, i) => ( + `${side.name}: ${notFainted[i]} Pokemon left` + )).join('; ')); + const maxNotFainted = Math.max(...notFainted); + let tiedSides = this.sides.filter((side, i) => notFainted[i] === maxNotFainted); + if (tiedSides.length <= 1) { + return this.win(tiedSides[1]); } - } - if (pokemon.hasItem('abilityshield') || - pokemon.m.scrambled.items.some((e: { thing: string }) => this.toID(e.thing) === 'abilityshield')) { - ngas = false; - } - for (const ability of pokemon.m.scrambled.abilities) { - if (this.field.getPseudoWeather('magicroom') && ability.inSlot === 'Item') continue; - const effect = 'ability:' + this.toID(ability.thing); - pokemon.volatiles[effect] = this.initEffectState({ id: effect, target: pokemon }); - pokemon.volatiles[effect].inSlot = ability.inSlot; - } - for (const item of pokemon.m.scrambled.items) { - if (ngas && item.inSlot === 'Ability') continue; - const effect = 'item:' + this.toID(item.thing); - pokemon.volatiles[effect] = this.initEffectState({ id: effect, target: pokemon }); - pokemon.volatiles[effect].inSlot = item.inSlot; - } - if (ngas) { - if ((pokemon.m.scrambled.moves as { inSlot: string }[]).findIndex(e => e.inSlot === 'Ability') >= 0) { - const isMove = (pokemon.m.scrambled.moves as { inSlot: string }[]).findIndex(e => e.inSlot === 'Ability'); - const indexOfMove = pokemon.moveSlots.findIndex(m => this.toID(pokemon.m.scrambled.moves[isMove].thing) === m.id); - if (indexOfMove >= 0) pokemon.moveSlots.splice(indexOfMove, 1); + + const hpPercentage = tiedSides.map(side => ( + side.pokemon.map(pokemon => pokemon.hp / pokemon.maxhp).reduce((a, b) => a + b) * 100 / 6 + )); + this.add('-message', tiedSides.map((side, i) => ( + `${side.name}: ${Math.round(hpPercentage[i])}% total HP left` + )).join('; ')); + const maxPercentage = Math.max(...hpPercentage); + tiedSides = tiedSides.filter((side, i) => hpPercentage[i] === maxPercentage); + if (tiedSides.length <= 1) { + return this.win(tiedSides[1]); } - } - if (this.field.getPseudoWeather('magicroom')) { - if ((pokemon.m.scrambled.moves as { inSlot: string }[]).findIndex(e => e.inSlot === 'Item') >= 0) { - const isMove = (pokemon.m.scrambled.moves as { inSlot: string }[]).findIndex(e => e.inSlot === 'Item'); - const indexOfMove = pokemon.moveSlots.findIndex(m => this.toID(pokemon.m.scrambled.moves[isMove].thing) === m.id); - if (indexOfMove >= 0) pokemon.moveSlots.splice(indexOfMove, 1); + + const hpTotal = tiedSides.map(side => ( + side.pokemon.map(pokemon => pokemon.hp).reduce((a, b) => a + b) + )); + this.add('-message', tiedSides.map((side, i) => ( + `${side.name}: ${Math.round(hpTotal[i])} total HP left` + )).join('; ')); + const maxTotal = Math.max(...hpTotal); + tiedSides = tiedSides.filter((side, i) => hpTotal[i] === maxTotal); + if (tiedSides.length <= 1) { + return this.win(tiedSides[1]); } + return this.tie(); + }, + checkWin(faintData) { + const team1PokemonLeft = this.sides[0].pokemonLeft; + const team2PokemonLeft = this.sides[1].pokemonLeft; + if (!team1PokemonLeft && !team2PokemonLeft) { + this.win(faintData?.target.side || null); + return true; + } + for (const side of this.sides) { + if (!side.pokemonLeft) { + this.win(side); + return true; + } + } + }, + }, + }, + { + name: "[Gen 9] STABmons Mix and Mega", + desc: `Mega evolve any Pokémon with any mega stone, or transform them with Genesect Drives, Primal orbs, Origin orbs, Rusted items, Ogerpon Masks, Arceus Plates, and Silvally Memories with no limit. Pokémon can use any move of their typing, in addition to the moves they can normally learn. Mega and Primal boosts based on form changes from gen 7.`, + mod: 'mixandmega', + ruleset: ['Standard OMs', 'STABmons Move Legality', 'Evasion Items Clause', 'Evasion Abilities Clause', 'Sleep Moves Clause', 'Terastal Clause'], + banlist: [ + 'Arceus', 'Calyrex-Shadow', 'Enamorus-Incarnate', 'Koraidon', 'Kyogre', 'Miraidon', 'Komala', 'Moody', 'Shadow Tag', + 'Beedrillite', 'Blazikenite', 'Gengarite', 'Kangaskhanite', 'Lucarionite Z', 'Malamarite', 'Mawilite', 'Medichamite', 'Pidgeotite', 'Red Orb', 'Zygardite', + 'King\'s Rock', 'Razor Fang', 'Baton Pass', 'Shed Tail', + ], + restricted: [ + 'Basculegion-M', 'Calyrex-Ice', 'Deoxys-Normal', 'Deoxys-Attack', 'Dialga', 'Dragapult', 'Eternatus', 'Flutter Mane', 'Gengar', 'Giratina', 'Gouging Fire', + 'Groudon', 'Ho-Oh', 'Iron Bundle', 'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Manaphy', 'Meloetta', 'Mewtwo', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', + 'Palkia', 'Rayquaza', 'Regigigas', 'Reshiram', 'Slaking', 'Sneasler', 'Solgaleo', 'Ursaluna', 'Ursaluna-Bloodmoon', 'Urshifu-Single-Strike', 'Walking Wake', + 'Zacian', 'Zekrom', 'Zoroark-Hisui', 'Acupressure', 'Astral Barrage', 'Belly Drum', 'Blood Moon', 'Boomburst', 'Ceaseless Edge', 'Clangorous Soul', 'Dire Claw', + 'Dragon Energy', 'Electro Shot', 'Extreme Speed', 'Fillet Away', 'Gigaton Hammer', 'Jet Punch', 'Last Respects', 'Lumina Crash', 'No Retreat', 'Power Trip', + 'Rage Fist', 'Revival Blessing', 'Shell Smash', 'Shift Gear', 'Surging Strikes', 'Torch Song', 'Triple Arrows', 'V-create', 'Victory Dance', 'Wicked Blow', + ], + onValidateTeam(team) { + const itemTable = new Set(); + for (const set of team) { + const item = this.dex.items.get(set.item); + if (!(item.forcedForme && !item.zMove) && !item.megaStone && + !item.isPrimalOrb && !item.name.startsWith('Rusted')) continue; + const natdex = this.ruleTable.has('natdexmod'); + if (natdex && item.id !== 'ultranecroziumz') continue; + const species = this.dex.species.get(set.species); + if (species.isNonstandard && !this.ruleTable.has(`+pokemontag:${this.toID(species.isNonstandard)}`)) { + return [`${species.baseSpecies} does not exist in gen 9.`]; + } + if (((item.itemUser?.includes(species.name) || item.forcedForme === species.name) && + !item.megaStone && !item.isPrimalOrb) || (natdex && species.name.startsWith('Necrozma-') && + item.id === 'ultranecroziumz')) { + continue; + } + if (this.ruleTable.isRestrictedSpecies(species) || this.toID(set.ability) === 'powerconstruct') { + return [`${species.name} is not allowed to hold ${item.name}.`]; + } + if (itemTable.has(item.id)) { + return [ + `You are limited to one of each Mega Stone/Primal Orb/Rusted item/Origin item/Ogerpon Mask/Arceus Plate/Silvally Memory.`, + `(You have more than one ${item.name})`, + ]; + } + itemTable.add(item.id); } }, onBegin() { for (const pokemon of this.getAllPokemon()) { - // for everything not in the correct slot - pokemon.m.scrambled = { - abilities: [] as object[], - items: [] as object[], - moves: [] as object[], - }; - - if (this.dex.items.get(pokemon.set.ability).exists) { - pokemon.m.scrambled.items.push({ thing: this.dex.items.get(pokemon.set.ability).name, inSlot: 'Ability' }); - } else if (this.dex.moves.get(pokemon.set.ability).exists) { - pokemon.m.scrambled.moves.push({ thing: this.dex.moves.get(pokemon.set.ability).name, inSlot: 'Ability' }); - } - - if (this.dex.abilities.get(pokemon.set.item).exists) { - pokemon.m.scrambled.abilities.push({ thing: this.dex.abilities.get(pokemon.set.item).name, inSlot: 'Item' }); - } else if (this.dex.moves.get(pokemon.set.item).exists) { - pokemon.m.scrambled.moves.push({ thing: this.dex.moves.get(pokemon.set.item).name, inSlot: 'Item' }); - } - - for (const move of pokemon.set.moves) { - if (this.dex.abilities.get(move).exists) { - pokemon.m.scrambled.abilities.push({ thing: this.dex.abilities.get(move).name, inSlot: 'Move' }); - } else if (this.dex.items.get(move).exists) { - pokemon.m.scrambled.items.push({ thing: this.dex.items.get(move).name, inSlot: 'Move' }); - } - } - - const newMoveSlots = []; - for (const moveSlot of pokemon.baseMoveSlots) { - if (!this.dex.moves.get(moveSlot.id).exists) continue; - newMoveSlots.push(moveSlot); - } - // Do not let these be pointed at the same thing. Causes bugs otherwise. - (pokemon as any).baseMoveSlots = newMoveSlots; - pokemon.moveSlots = this.dex.deepClone(newMoveSlots); - - for (const scrambledMove of pokemon.m.scrambled.moves) { - const move = this.dex.moves.get(scrambledMove.thing); - const newMove = { - move: move.name, - id: move.id, - pp: move.noPPBoosts ? move.pp : move.pp * 8 / 5, - maxpp: move.noPPBoosts ? move.pp : move.pp * 8 / 5, - target: move.target, - disabled: false, - used: false, - }; - pokemon.baseMoveSlots.push(newMove); - pokemon.moveSlots.push(newMove); + pokemon.m.originalSpecies = pokemon.baseSpecies.name; + } + }, + onSwitchIn(pokemon) { + const originalSpecies = this.dex.species.get((pokemon.species as any).originalSpecies); + if (originalSpecies.exists && pokemon.m.originalSpecies !== originalSpecies.baseSpecies) { + // Place volatiles on the Pokémon to show its mega-evolved condition and details + this.add('-start', pokemon, originalSpecies.requiredItems?.[0] || originalSpecies.requiredItem || originalSpecies.requiredMove, '[silent]'); + const oSpecies = this.dex.species.get(pokemon.m.originalSpecies); + if (oSpecies.types.join('/') !== pokemon.species.types.join('/')) { + this.add('-start', pokemon, 'typechange', pokemon.species.types.join('/'), '[silent]'); } } }, + onSwitchOut(pokemon) { + const originalSpecies = this.dex.species.get((pokemon.species as any).originalSpecies); + if (originalSpecies.exists && pokemon.m.originalSpecies !== originalSpecies.baseSpecies) { + this.add('-end', pokemon, originalSpecies.requiredItems?.[0] || originalSpecies.requiredItem || originalSpecies.requiredMove, '[silent]'); + } + }, }, { - name: "[Gen 9] NatDex Camove Chaos", - desc: `National Dex-based format where Pokemon can use almost any move in the game, and their first two move types determine their type.`, + name: "[Gen 9] Ubers UU", mod: 'gen9', - ruleset: ['Standard NatDex', 'Terastal Clause', '!Obtainable Moves', '!Team Preview', 'Camomons Mod', 'CFZ Clause', 'Sleep Moves Clause', 'Team Type Preview'], + // searchShow: false, + ruleset: ['[Gen 9] Ubers'], banlist: [ - 'Aerodactyl-Mega', 'Alakazam', 'Arceus', 'Beedrill-Mega', 'Blaziken-Mega', 'Calyrex-Ice', 'Calyrex-Shadow', 'Charizard-Mega-Y', 'Chi-Yu', - 'Chien-Pao', 'Comfey', 'Darmanitan', 'Darmanitan-Galar', 'Darmanitan-Galar-Zen', 'Deoxys-Normal', 'Deoxys-Attack', 'Dialga', 'Dondozo', 'Enamorus', - 'Eternatus', 'Flutter Mane', 'Genesect', 'Gengar-Mega', 'Giratina', 'Groudon', 'Ho-Oh', 'Hoopa-Unbound', 'Kangaskhan-Mega', 'Kartana', 'Komala', - 'Koraidon', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Incarnate', 'Lucario-Mega', 'Lugia', 'Lunala', 'Marshadow', 'Mawile-Mega', - 'Medicham-Mega', 'Melmetal', 'Metagross-Mega', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Necrozma-Ultra', 'Palafin', - 'Palkia', 'Pheromosa', 'Porygon-Z', 'Rayquaza', 'Regieleki', 'Reshiram', 'Salamence-Mega', 'Sceptile-Mega', 'Serperior', 'Shedinja', 'Sneasler', - 'Solgaleo', 'Spectrier', 'Tapu Koko', 'Ting-Lu', 'Ursaluna', 'Ursaluna-Bloodmoon', 'Xerneas', 'Xurkitree', 'Yveltal', 'Zacian', 'Zacian-Crowned', - 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Zoroark', 'Arena Trap', 'Moody', 'Magnet Pull', 'Regenerator > 2', 'Power Construct', 'Shadow Tag', - 'Damp Rock', 'Heat Rock', 'King\'s Rock', 'Quick Claw', 'Razor Fang', 'Smooth Rock', 'Assist', 'Astral Barrage', 'Baneful Bunker', 'Baton Pass', - 'Belly Drum', 'Bolt Beak', 'Boomburst', 'Burning Bulwark', 'Ceaseless Edge', 'Chatter', 'Clangorous Soul', 'Dire Claw', 'Double Iron Bash', - 'Dragon Energy', 'Eruption', 'Extreme Speed', 'Electrify', 'Electro Shot', 'Final Gambit', 'Fillet Away', 'Fishious Rend', 'Geomancy', 'Heal Order', - 'Jet Punch', 'Last Respects', 'Lumina Crash', 'No Retreat', 'Octolock', 'Population Bomb', 'Power Trip', 'Quiver Dance', 'Rage Fist', 'Revival Blessing', - 'Rising Voltage', 'Salt Cure', 'Shed Tail', 'Shell Smash', 'Shift Gear', 'Stored Power', 'Substitute', 'Surging Strikes', 'Tail Glow', 'Take Heart', - 'Thousand Arrows', 'Transform', 'Triple Arrows', 'V-create', 'Victory Dance', 'Water Spout', 'Wicked Blow', + // Ubers OU + 'Arceus-Normal', 'Arceus-Fairy', 'Arceus-Ghost', 'Arceus-Ground', 'Arceus-Water', 'Calyrex-Ice', 'Chien-Pao', 'Deoxys-Attack', 'Deoxys-Speed', 'Ditto', + 'Dondozo', 'Eternatus', 'Flutter Mane', 'Giratina-Origin', 'Glimmora', 'Gliscor', 'Grimmsnarl', 'Groudon', 'Hatterene', 'Ho-Oh', 'Kingambit', 'Koraidon', + 'Kyogre', 'Kyurem-Black', 'Landorus-Therian', 'Lunala', 'Necrozma-Dusk-Mane', 'Rayquaza', 'Ribombee', 'Skeledirge', 'Terapagos', 'Ting-Lu', 'Zacian-Crowned', + // Ubers UUBL + Lunala, Arceus-Ghost, Arceus-Water + 'Arceus-Dragon', 'Arceus-Electric', 'Arceus-Fire', 'Arceus-Flying', 'Arceus-Steel', 'Giratina', 'Necrozma-Dawn-Wings', 'Shaymin-Sky', 'Spectrier', 'Zacian', + 'Zekrom', ], - unbanlist: ['Blazing Torque', 'Combat Torque', 'Light of Ruin', 'Magical Torque', 'Noxious Torque', 'Wicked Torque'], + }, + { + name: "[Gen 9] National Dex Ubers UU", + mod: 'gen9', + // searchShow: false, + ruleset: ['[Gen 9] National Dex Ubers'], + banlist: [ + 'Alomomola', 'Arceus-Normal', 'Arceus-Dark', 'Arceus-Ground', 'Calyrex-Ice', 'Chansey', 'Deoxys-Attack', 'Ditto', 'Dondozo', 'Eternatus', 'Giratina-Origin', 'Groudon-Primal', + 'Hatterene', 'Ho-Oh', 'Kingambit', 'Kyogre-Primal', 'Lunala', 'Marshadow', 'Mewtwo-Mega-Y', 'Necrozma-Dusk-Mane', 'Necrozma-Ultra', 'Salamence-Mega', 'Smeargle', 'Yveltal', + 'Zacian-Crowned', 'Zygarde-50%', + // UUBL + 'Arceus-Dragon', 'Arceus-Fairy', 'Arceus-Fire', 'Arceus-Flying', 'Arceus-Ghost', 'Arceus-Water', 'Blaziken-Mega', 'Chi-Yu', 'Chien-Pao', 'Dracovish', 'Flutter Mane', 'Groudon', + 'Kyogre', 'Kyurem-Black', 'Rayquaza', 'Shaymin-Sky', 'Zacian', 'Zekrom', 'Power Construct', 'Light Clay', 'Ultranecrozium Z', 'Last Respects', + ], + }, + { + name: "[Gen 9] Six by Six Random Battle", + desc: `A Gen 9 micrometa featuring only 6 Pokemon with 6 forms each.`, + mod: 'sixbysix', + team: 'random6x6', + ruleset: [ + 'Species Clause', 'HP Percentage Mod', 'Cancel Mod', 'Sleep Clause Mod', 'Illusion Level Mod', + 'Terastal Clause', 'Data Preview', 'Sprite Viewer', + ], + onBegin() { + this.add('-message', `Welcome to Six by Six!`); + this.add('-message', `This is a micrometa featuring just 6 Pokemon, each with 6 forms each!`); + this.add('-message', `You can find our thread and metagame resources here:`); + this.add('-message', `https://www.smogon.com/forums/threads/3769141/`); + }, + onSwitchInPriority: 100, + onSwitchIn(pokemon) { + if ((pokemon.illusion || pokemon).getTypes(true, true).join('/') !== + this.dex.forGen(9).species.get((pokemon.illusion || pokemon).species.name).types.join('/') && + !pokemon.terastallized) { + this.add('-start', pokemon, 'typechange', (pokemon.illusion || pokemon).getTypes(true).join('/'), '[silent]'); + } + }, + }, + { + name: "[Gen 9] ChatBats", + desc: `A Random Battles Solomod made by the Pet Mods chatroom on Showdown.`, + mod: 'chatbats', + team: 'randomChatBats', + ruleset: ['Obtainable', 'Species Clause', 'HP Percentage Mod', 'Sleep Clause Mod', 'Data Preview', 'Cancel Mod'], + onSwitchIn(pokemon) { + this.add('-start', pokemon, 'typechange', pokemon.species.types.join('/'), '[silent]'); + }, + // Dachsbun causes Koraidon to generate on enemy team. Implemented here. + onBegin() { + this.add(`raw|
Need help with all of the new moves, abilities, and wacky sets?
Then make sure to check out the ChatBats Compendium or use /dt!
`); + this.add(`raw|Welcome to ChatBats!`); + this.add(`raw|ChatBats is a Random Battles format created by the Pet Mods room here on Showdown!`); + this.add(`raw|If you want to help create new sets, we will host events periodically in the Pet Mods room!`); + this.add(`raw|Anyone who is there can help create a new set for a random mon, changing moves, abilities, stats, and even custom formes.`); + }, + }, + { + name: "[Gen 3] Ubers", + mod: 'gen3', + // searchShow: false, + ruleset: ['Standard', 'Deoxys Camouflage Clause', 'One Baton Pass Clause'], + banlist: ['Wobbuffet + Leftovers', 'Wynaut + Leftovers', 'Baton Pass'], + }, + { + name: "[Gen 1] NC 1997", + mod: 'gen1jpn', + bestOfDefault: true, + // searchShow: false, + ruleset: [ + 'Picked Team Size = 3', 'Min Level = 50', 'Max Level = 55', 'Max Total Level = 155', + 'Obtainable', 'Team Preview', 'Stadium Sleep Clause', 'Species Clause', 'Nickname Clause', 'Cancel Mod', 'NC 1997 Move Legality', + ], + banlist: ['Uber'], + }, + { + name: "[Gen 7] VGC 2019", + mod: 'gen7', + gameType: 'doubles', + // searchShow: false, + bestOfDefault: true, + ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 7', 'VGC Timer', 'Limit Two Restricted'], + restricted: ['Restricted Legendary'], + banlist: ['Unown', 'Battle Bond'], }, // Other Metagames @@ -1095,6 +1064,234 @@ export const Formats: import('../sim/dex-formats').FormatList = [ side.sideConditions[sideCondition.id].duration = 0; }, }, + { + name: "[Gen 9] Bio Mech Mons", + desc: `Items, abilities, and moves a Pokémon has access to can be put in any item/move/ability slot.`, + mod: 'biomechmons', + searchShow: false, + ruleset: ['Standard OMs', 'Sleep Moves Clause'], + banlist: [ + 'Annihilape', 'Arceus', 'Archaludon', 'Baxcalibur', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chien-Pao', 'Chi-Yu', 'Deoxys-Normal', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', + 'Espathra', 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Gouging Fire', 'Groudon', 'Ho-Oh', 'Iron Bundle', 'Koraidon', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', + 'Landorus-Incarnate', 'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Ogerpon-Hearthflame', 'Palafin', 'Palkia', 'Palkia-Origin', + 'Rayquaza', 'Regieleki', 'Regigigas', 'Reshiram', 'Roaring Moon', 'Slaking', 'Shaymin-Sky', 'Sneasler', 'Solgaleo', 'Spectrier', 'Terapagos', 'Ursaluna-Bloodmoon', 'Urshifu', + 'Urshifu-Rapid-Strike', 'Volcarona', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', 'Arena Trap', 'Moody', 'Sand Veil', 'Shadow Tag', 'Snow Cloak', 'Bright Powder', + 'Choice Band', 'Choice Specs', 'King\'s Rock', 'Razor Fang', 'Baton Pass', 'Last Respects', 'Shed Tail', + ], + validateSet(set, teamHas) { + const dex = this.dex; + let species = dex.species.get(set.species); + let requiredItems: string[] = []; + let requiredMove = ''; + let requiredAbility = ''; + if (species.requiredItems) requiredItems = species.requiredItems; + if (species.requiredMove) requiredMove = species.requiredMove; + if (species.requiredAbility) requiredAbility = species.requiredAbility; + if (species.battleOnly) species = dex.species.get(species.battleOnly as string); + + const effectFunctions = [dex.abilities, dex.items, dex.moves]; + if ( + !effectFunctions.some(f => f.get(set.ability).exists) && + !(set.item && effectFunctions.some(f => f.get(set.item).exists)) && + !set.moves.every(move => effectFunctions.some(f => f.get(move).exists)) + ) { + return this.validateSet(set, teamHas); + } + const allThings = [set.ability, set.item, ...set.moves].filter(e => e.length); + for (const thing of allThings) { + if (this.toID(thing) === 'trace' || this.toID(thing) === 'neutralizinggas') { + return [`${thing} is currently bugged and is banned.`]; + } + if (!dex.moves.get(thing).exists && !dex.abilities.get(thing).exists && !dex.items.get(thing).exists) { + return [`${thing} does not exist.`]; + } + } + if ( + allThings.some(y => effectFunctions.some(x => x.get(y).isNonstandard && + !this.ruleTable.has(`+pokemontag:${this.toID(x.get(y).isNonstandard)}`))) + ) { + return this.validateSet(set, teamHas); + } + const moves = allThings.map(e => this.dex.moves.get(e)).filter(thing => thing.id !== 'metronome' && thing.exists); + for (const m of moves) { + if (this.ruleTable.isBanned(`move:${m.id}`)) return [`${set.species}'s move ${m.name} is banned.`]; + } + + const abilities = allThings.map(e => this.dex.abilities.get(e)).filter(thing => thing.exists); + for (const a of abilities) { + if (this.ruleTable.isBanned(`ability:${a.id}`)) return [`${set.species}'s ability ${a.name} is banned.`]; + } + + const items = allThings.map(e => this.dex.items.get(e)).filter(thing => thing.exists); + for (const i of items) { + if (this.ruleTable.isBanned(`item:${i.id}`)) return [`${set.species}'s item ${i.name} is banned.`]; + } + + const setHas: { [k: string]: true } = {}; + for (const thing of [...moves, ...items, ...abilities]) { + if (setHas[thing.id]) return [`${set.species} has multiple copies of ${thing.name}.`]; + setHas[thing.id] = true; + } + const normalAbility = set.ability; + if (!abilities.length) { + set.ability = 'noability'; + } else { + set.ability = abilities[0].id; + } + if (abilities.some(abil => !Object.values(species.abilities).map(this.toID).includes(abil.id)) && + this.ruleTable.has('obtainableabilities') + ) { + if (set.ability !== 'noability') return [`${set.species} has illegal abilities.`]; + } + if (requiredAbility && !abilities.map(a => a.id).includes(this.toID(requiredAbility))) { + return [`${set.species} requires ${requiredAbility} on its set.`]; + } + if (!moves.length) { + return [`${set.species} requires at least one move.`]; + } + if (set.moves.length > this.ruleTable.maxMoveCount) { + return [`${set.name} has ${set.moves.length} moves, which is more than the limit of ${this.ruleTable.maxMoveCount}.`]; + } + const normalMoves = set.moves; + set.moves = [moves[0].id]; + if (moves.some(move => this.checkCanLearn(move, species)) && this.ruleTable.has('obtainablemoves')) { + return [`${set.species} has illegal moves.`]; + } + if (requiredMove && !moves.map(m => m.id).includes(this.toID(requiredMove))) { + return [`${set.species} requires ${requiredMove} on its set.`]; + } + if (!items.length && requiredItems.length) { + return [`${set.species} requires ${requiredItems.join(', ')} on its set.`]; + } + const normalItem = set.item; + if (items.length) { + set.item = (items.find(i => i.forcedForme || i.itemUser) || items[0]).id; + } else { + set.item = ''; + } + if (!this.ruleTable.has('+ability:noability')) { + this.ruleTable.set('+ability:noability', ''); + } + for (const curMove of moves) { + set.moves = [curMove.id]; + if (requiredMove && moves.map(m => m.id).includes(curMove.id) && + curMove.id !== this.toID(requiredMove)) { + set.moves.push(requiredMove); + } + let problems = this.validateSet(set, teamHas); + if (problems) problems = problems.filter(p => !p.endsWith('needs to have an ability.')); + if (problems?.length) return problems; + } + set.ability = normalAbility; + set.item = normalItem; + set.moves = normalMoves; + return null; + }, + onBeforeSwitchIn(pokemon) { + let ngas = false; + for (const poke of this.getAllActive()) { + if (this.toID(poke.ability) === ('neutralizinggas' as ID)) { + ngas = true; + break; + } + } + if (pokemon.hasItem('abilityshield') || + pokemon.m.scrambled.items.some((e: { thing: string }) => this.toID(e.thing) === 'abilityshield')) { + ngas = false; + } + for (const ability of pokemon.m.scrambled.abilities) { + if (this.field.getPseudoWeather('magicroom') && ability.inSlot === 'Item') continue; + const effect = 'ability:' + this.toID(ability.thing); + pokemon.volatiles[effect] = this.initEffectState({ id: effect, target: pokemon }); + pokemon.volatiles[effect].inSlot = ability.inSlot; + } + for (const item of pokemon.m.scrambled.items) { + if (ngas && item.inSlot === 'Ability') continue; + const effect = 'item:' + this.toID(item.thing); + pokemon.volatiles[effect] = this.initEffectState({ id: effect, target: pokemon }); + pokemon.volatiles[effect].inSlot = item.inSlot; + } + if (ngas) { + if ((pokemon.m.scrambled.moves as { inSlot: string }[]).findIndex(e => e.inSlot === 'Ability') >= 0) { + const isMove = (pokemon.m.scrambled.moves as { inSlot: string }[]).findIndex(e => e.inSlot === 'Ability'); + const indexOfMove = pokemon.moveSlots.findIndex(m => this.toID(pokemon.m.scrambled.moves[isMove].thing) === m.id); + if (indexOfMove >= 0) pokemon.moveSlots.splice(indexOfMove, 1); + } + } + if (this.field.getPseudoWeather('magicroom')) { + if ((pokemon.m.scrambled.moves as { inSlot: string }[]).findIndex(e => e.inSlot === 'Item') >= 0) { + const isMove = (pokemon.m.scrambled.moves as { inSlot: string }[]).findIndex(e => e.inSlot === 'Item'); + const indexOfMove = pokemon.moveSlots.findIndex(m => this.toID(pokemon.m.scrambled.moves[isMove].thing) === m.id); + if (indexOfMove >= 0) pokemon.moveSlots.splice(indexOfMove, 1); + } + } + }, + onBegin() { + for (const pokemon of this.getAllPokemon()) { + // for everything not in the correct slot + pokemon.m.scrambled = { + abilities: [] as object[], + items: [] as object[], + moves: [] as object[], + }; + + if (this.dex.items.get(pokemon.set.ability).exists) { + pokemon.m.scrambled.items.push({ thing: this.dex.items.get(pokemon.set.ability).name, inSlot: 'Ability' }); + } else if (this.dex.moves.get(pokemon.set.ability).exists) { + pokemon.m.scrambled.moves.push({ thing: this.dex.moves.get(pokemon.set.ability).name, inSlot: 'Ability' }); + } + + if (this.dex.abilities.get(pokemon.set.item).exists) { + pokemon.m.scrambled.abilities.push({ thing: this.dex.abilities.get(pokemon.set.item).name, inSlot: 'Item' }); + } else if (this.dex.moves.get(pokemon.set.item).exists && this.dex.moves.get(pokemon.set.item).id !== 'metronome') { + pokemon.m.scrambled.moves.push({ thing: this.dex.moves.get(pokemon.set.item).name, inSlot: 'Item' }); + } + + for (const move of pokemon.set.moves) { + if (this.dex.moves.get(move).id === 'metronome') continue; + if (this.dex.abilities.get(move).exists) { + pokemon.m.scrambled.abilities.push({ thing: this.dex.abilities.get(move).name, inSlot: 'Move' }); + } else if (this.dex.items.get(move).exists) { + pokemon.m.scrambled.items.push({ thing: this.dex.items.get(move).name, inSlot: 'Move' }); + } + } + + const newMoveSlots = []; + for (const moveSlot of pokemon.baseMoveSlots) { + if (moveSlot.id === 'metronome') { + const TeamValidator: typeof import('../sim/team-validator').TeamValidator = + require('../sim/team-validator').TeamValidator; + const cantMetronome = TeamValidator.get(this.format).checkCanLearn(this.dex.moves.get('metronome'), pokemon.species); + if (!cantMetronome) { + newMoveSlots.push(moveSlot); + } else { + pokemon.m.scrambled.items.push({ thing: this.dex.items.get('metronome').name, inSlot: 'Move' }); + } + continue; + } + if (!this.dex.moves.get(moveSlot.id).exists) continue; + newMoveSlots.push(moveSlot); + } + + (pokemon as any).baseMoveSlots = newMoveSlots; + + for (const scrambledMove of pokemon.m.scrambled.moves) { + const move = this.dex.moves.get(scrambledMove.thing); + const newMove = { + move: move.name, + id: move.id, + pp: move.noPPBoosts ? move.pp : move.pp * 8 / 5, + maxpp: move.noPPBoosts ? move.pp : move.pp * 8 / 5, + target: move.target, + disabled: false, + used: false, + }; + pokemon.baseMoveSlots.push(newMove); + } + pokemon.moveSlots = pokemon.baseMoveSlots.slice(); + } + }, + }, { name: "[Gen 9] Camomons", desc: `Pokémon have their types set to match their first two moves.`, @@ -1397,7 +1594,7 @@ export const Formats: import('../sim/dex-formats').FormatList = [ set.item = ''; const problems = this.validateSet(set, teamHas) || []; set.item = item; - if (this.checkCanLearn(move, species, this.allSources(species), set)) { + if (this.ruleTable.has('obtainablemoves') && this.checkCanLearn(move, species, this.allSources(species), set)) { problems.push(`${species.name} can't learn ${move.name}.`); } if (set.moves.map(this.toID).includes(move.id)) { @@ -1830,9 +2027,10 @@ export const Formats: import('../sim/dex-formats').FormatList = [ 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', + 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Oricorio', 'Oricorio-Pa\'u', 'Oricorio-Pom-Pom', 'Oricorio-Sensu', 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Reshiram', + 'Smeargle', 'Solgaleo', 'Terapagos', 'Urshifu', 'Urshifu-Rapid-Strike', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Contrary', '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()) { @@ -2544,86 +2742,16 @@ export const Formats: import('../sim/dex-formats').FormatList = [ }, }, { - name: "[Gen 9] The Loser's Game", - desc: `The first player to lose all of their Pokémon wins.`, + name: "[Gen 9] Tier Shift", + desc: `Pokémon below OU get their stats, excluding HP, boosted. UU/RUBL get +15, RU/NUBL get +20, NU/PUBL get +25, and PU or lower get +30.`, mod: 'gen9', searchShow: false, - ruleset: ['Standard OMs', 'Sleep Clause Mod', '!OHKO Clause', 'Picked Team Size = 6', 'Adjust Level = 100'], - banlist: ['Infiltrator', 'Choice Scarf', 'Explosion', 'Final Gambit', 'Healing Wish', 'Lunar Dance', 'Magic Room', 'Memento', 'Misty Explosion', 'Self-Destruct'], - onValidateTeam(team) { - const familyTable = new Set(); - for (const set of team) { - let species = this.dex.species.get(set.species); - while (species.prevo) { - species = this.dex.species.get(species.prevo); - } - if (familyTable.has(species.id)) { - return [ - `You are limited to one Pokémon from each family by the Family Clause.`, - `(You have more than one evolution of ${species.name}.)`, - ]; - } - familyTable.add(species.id); - } - }, - battle: { - tiebreak() { - if (this.ended) return false; - - this.inputLog.push(`>tiebreak`); - this.add('message', "Time's up! Going to tiebreaker..."); - const notFainted = this.sides.map(side => ( - side.pokemon.filter(pokemon => !pokemon.fainted).length - )); - this.add('-message', this.sides.map((side, i) => ( - `${side.name}: ${notFainted[i]} Pokemon left` - )).join('; ')); - const maxNotFainted = Math.max(...notFainted); - let tiedSides = this.sides.filter((side, i) => notFainted[i] === maxNotFainted); - if (tiedSides.length <= 1) { - return this.win(tiedSides[1]); - } - - const hpPercentage = tiedSides.map(side => ( - side.pokemon.map(pokemon => pokemon.hp / pokemon.maxhp).reduce((a, b) => a + b) * 100 / 6 - )); - this.add('-message', tiedSides.map((side, i) => ( - `${side.name}: ${Math.round(hpPercentage[i])}% total HP left` - )).join('; ')); - const maxPercentage = Math.max(...hpPercentage); - tiedSides = tiedSides.filter((side, i) => hpPercentage[i] === maxPercentage); - if (tiedSides.length <= 1) { - return this.win(tiedSides[1]); - } - - const hpTotal = tiedSides.map(side => ( - side.pokemon.map(pokemon => pokemon.hp).reduce((a, b) => a + b) - )); - this.add('-message', tiedSides.map((side, i) => ( - `${side.name}: ${Math.round(hpTotal[i])} total HP left` - )).join('; ')); - const maxTotal = Math.max(...hpTotal); - tiedSides = tiedSides.filter((side, i) => hpTotal[i] === maxTotal); - if (tiedSides.length <= 1) { - return this.win(tiedSides[1]); - } - return this.tie(); - }, - checkWin(faintData) { - const team1PokemonLeft = this.sides[0].pokemonLeft; - const team2PokemonLeft = this.sides[1].pokemonLeft; - if (!team1PokemonLeft && !team2PokemonLeft) { - this.win(faintData?.target.side || null); - return true; - } - for (const side of this.sides) { - if (!side.pokemonLeft) { - this.win(side); - return true; - } - } - }, - }, + ruleset: ['Standard OMs', 'Sleep Moves Clause', 'Terastal Clause', 'Evasion Clause', 'Tier Shift Mod'], + banlist: [ + 'Arceus', 'Calyrex-Shadow', 'Koraidon', 'Kyogre', 'Medicham', 'Miraidon', 'Necrozma-Dusk-Mane', 'Zacian-Crowned', 'Drizzle', 'Moody', 'Arena Trap', 'Shadow Tag', + 'Baton Pass', 'Last Respects', 'Shed Tail', 'Heat Rock', 'King\'s Rock', 'Light Clay', 'Razor Fang', + ], + unbanlist: ['Arceus-Bug', 'Arceus-Grass', 'Arceus-Ice'], }, { name: "[Gen 9] Trademarked", @@ -2762,91 +2890,240 @@ export const Formats: import('../sim/dex-formats').FormatList = [ section: "Temporary Tour Metas", }, { - name: "[Gen 9] AAA Doubles", - desc: `Pokémon have access to almost any ability.`, - mod: 'gen9', + name: "[Gen 9] Mix and Mega LC", + desc: `Mega evolve any Pokémon with any mega stone, or transform them with Genesect Drives, Primal orbs, Origin orbs, Rusted items, Ogerpon Masks, Arceus Plates, and Silvally Memories with no limit. Mega and Primal boosts based on form changes from gen 7.`, + mod: 'mixandmega', searchShow: false, - gameType: 'doubles', - ruleset: ['Standard Doubles', 'Evasion Abilities Clause', 'Standard OMs', 'Sleep Moves Clause', '!Obtainable Abilities', 'Ability Clause = 2'], + ruleset: ['Standard OMs', 'Little Cup', 'Sleep Clause Mod', 'Terastal Clause'], banlist: [ - 'Annihilape', 'Arceus', 'Basculegion-M', 'Calyrex-Ice', 'Calyrex-Shadow', 'Dragonite', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', 'Eternatus', 'Flutter Mane', - 'Gholdengo', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kyurem-White', 'Kyurem-Black', 'Koraidon', 'Kyogre', 'Lugia', 'Lunala', 'Mewtwo', 'Miraidon', - 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Raging Bolt', 'Regigigas', 'Reshiram', 'Solgaleo', 'Slaking', 'Terapagos', - 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Anger Point', 'Arena Trap', 'Comatose', 'Commander', 'Contrary', 'Costar', 'Dancer', - 'Fur Coat', 'Gorilla Tactics', 'Huge Power', 'Ice Scales', 'Illusion', 'Imposter', 'Innards Out', 'Orichalcum Pulse', 'Moody', 'Neutralizing Gas', 'Parental Bond', - 'Prankster', 'Pure Power', 'Serene Grace', 'Shadow Tag', 'Simple', 'Soul-Heart', 'Stamina', 'Steam Engine', 'Water Bubble', 'Wonder Guard', 'King\'s Rock', 'Razor Fang', - 'Beat Up', + 'Basculin-White-Striped', 'Dunsparce', 'Duraludon', 'Meditite', 'Rufflet', 'Scyther', 'Sneasel', 'Sneasel-Hisui', 'Stantler', 'Moody', + 'Absolite Z', 'Beedrillite', 'Blazikenite', 'Gengarite', 'Kangaskhanite', 'Lucarionite', 'Lucarionite Z', 'Mawilite', 'Medichamite', 'Pidgeotite', 'Zygardite', + 'Baton Pass', 'Sticky Web', ], + restricted: [ + 'Aipom', 'Buizel', 'Cutiefly', 'Dratini', 'Elekid', 'Gastly', 'Girafarig', 'Gligar', 'Mienfoo', + 'Misdreavus', 'Murkrow', 'Pawniard', 'Qwilfish-Hisui', 'Voltorb-Hisui', 'Wattrel', 'Yanma', + ], + onValidateTeam(team) { + const itemTable = new Set(); + for (const set of team) { + const item = this.dex.items.get(set.item); + if (!(item.forcedForme && !item.zMove) && !item.megaStone && + !item.isPrimalOrb && !item.name.startsWith('Rusted')) continue; + const natdex = this.ruleTable.has('natdexmod'); + if (natdex && item.id !== 'ultranecroziumz') continue; + const species = this.dex.species.get(set.species); + if (species.isNonstandard && !this.ruleTable.has(`+pokemontag:${this.toID(species.isNonstandard)}`)) { + return [`${species.baseSpecies} does not exist in gen 9.`]; + } + if (((item.itemUser?.includes(species.name) || item.forcedForme === species.name) && + !item.megaStone && !item.isPrimalOrb) || (natdex && species.name.startsWith('Necrozma-') && + item.id === 'ultranecroziumz')) { + continue; + } + if (this.ruleTable.isRestrictedSpecies(species) || this.toID(set.ability) === 'powerconstruct') { + return [`${species.name} is not allowed to hold ${item.name}.`]; + } + if (itemTable.has(item.id)) { + return [ + `You are limited to one of each Mega Stone/Primal Orb/Rusted item/Origin item/Ogerpon Mask/Arceus Plate/Silvally Memory.`, + `(You have more than one ${item.name})`, + ]; + } + itemTable.add(item.id); + } + }, + onBegin() { + for (const pokemon of this.getAllPokemon()) { + pokemon.m.originalSpecies = pokemon.baseSpecies.name; + } + }, + onSwitchIn(pokemon) { + const originalSpecies = this.dex.species.get((pokemon.species as any).originalSpecies); + if (originalSpecies.exists && pokemon.m.originalSpecies !== originalSpecies.baseSpecies) { + // Place volatiles on the Pokémon to show its mega-evolved condition and details + this.add('-start', pokemon, originalSpecies.requiredItems?.[0] || originalSpecies.requiredItem || originalSpecies.requiredMove, '[silent]'); + const oSpecies = this.dex.species.get(pokemon.m.originalSpecies); + if (oSpecies.types.join('/') !== pokemon.species.types.join('/')) { + this.add('-start', pokemon, 'typechange', pokemon.species.types.join('/'), '[silent]'); + } + } + }, + onSwitchOut(pokemon) { + const originalSpecies = this.dex.species.get((pokemon.species as any).originalSpecies); + if (originalSpecies.exists && pokemon.m.originalSpecies !== originalSpecies.baseSpecies) { + this.add('-end', pokemon, originalSpecies.requiredItems?.[0] || originalSpecies.requiredItem || originalSpecies.requiredMove, '[silent]'); + } + }, }, { - name: "[Gen 9] AAA Ubers", - desc: `Pokémon have access to almost any ability.`, - mod: 'gen9', + name: "[Gen 8] Mix and Mega", + desc: `Mega evolve any Pokémon with any mega stone with no limit. Boosts based on mega evolution from gen 7.`, + mod: 'gen8mixandmega', searchShow: false, - ruleset: ['Standard OMs', 'Sleep Moves Clause', '!Obtainable Abilities', 'Terastal Clause'], + ruleset: ['Standard', 'Dynamax Clause', 'Overflow Stat Mod'], banlist: [ - 'Calyrex-Shadow', 'Slaking', 'Arena Trap', 'Comatose', 'Contrary', 'Gorilla Tactics', 'Huge Power', 'Illusion', 'Imposter', - 'Innards Out', 'Magnet Pull', 'Moody', 'Neutralizing Gas', 'Parental Bond', 'Pure Power', 'Shadow Tag', 'Simple', 'Stakeout', - 'Speed Boost', 'Water Bubble', 'Wonder Guard', 'Baton Pass', + 'Calyrex-Shadow', 'Eternatus', 'Kyogre', 'Zacian', 'Zacian-Crowned', 'Moody', 'Shadow Tag', 'Beedrillite', 'Blazikenite', + 'Gengarite', 'Kangaskhanite', 'Mawilite', 'Medichamite', 'Pidgeotite', 'Baton Pass', 'Electrify', ], + restricted: [ + 'Calyrex-Ice', 'Dialga', 'Gengar', 'Giratina', 'Groudon', 'Ho-Oh', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Marshadow', 'Melmetal', 'Mewtwo', + 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Regigigas', 'Reshiram', 'Urshifu', 'Urshifu-Rapid-Strike', 'Solgaleo', + 'Xerneas', 'Yveltal', 'Zekrom', 'Power Construct', + ], + onValidateTeam(team) { + const itemTable = new Set(); + for (const set of team) { + const item = this.dex.items.get(set.item); + if (!item.megaStone) continue; + const species = this.dex.species.get(set.species); + const ability = this.dex.abilities.get(set.ability); + if (this.ruleTable.isRestricted(`item:${item.id}`) || this.ruleTable.isRestricted(`ability:${ability.id}`)) { + return [`${species.name} is not allowed to hold ${item.name}.`]; + } + if (itemTable.has(item.id)) { + return [ + `You are limited to one of each Mega Stone.`, + `(You have more than one ${item.name})`, + ]; + } + itemTable.add(item.id); + } + }, + onBegin() { + for (const pokemon of this.getAllPokemon()) { + pokemon.m.originalSpecies = pokemon.baseSpecies.name; + } + }, + onSwitchIn(pokemon) { + const originalSpecies = this.dex.species.get((pokemon.species as any).originalSpecies); + if (originalSpecies.exists && pokemon.m.originalSpecies !== originalSpecies.baseSpecies) { + // Place volatiles on the Pokémon to show its mega-evolved condition and details + this.add('-start', pokemon, originalSpecies.requiredItem || originalSpecies.requiredMove, '[silent]'); + const oSpecies = this.dex.species.get(pokemon.m.originalSpecies); + if (oSpecies.types.join('/') !== pokemon.species.types.join('/')) { + this.add('-start', pokemon, 'typechange', pokemon.species.types.join('/'), '[silent]'); + } + } + }, + onSwitchOut(pokemon) { + const originalSpecies = this.dex.species.get((pokemon.species as any).originalSpecies); + if (originalSpecies.exists && pokemon.m.originalSpecies !== originalSpecies.baseSpecies) { + this.add('-end', pokemon, originalSpecies.requiredItem || originalSpecies.requiredMove, '[silent]'); + } + }, }, { - name: "[Gen 9] AAA UU", - desc: `Pokémon have access to almost any ability.`, - mod: 'gen9', + name: "[Gen 7] Mix and Mega", + desc: `Mega evolve any Pokémon with any mega stone, or transform them with Primal orbs, with no limit.`, + mod: 'gen7mixandmega', searchShow: false, - ruleset: ['[Gen 9] Almost Any Ability'], - banlist: [ - 'Archaludon', 'Brambleghast', 'Chien-Pao', 'Cinderace', 'Cobalion', 'Corviknight', 'Deoxys-Speed', 'Empoleon', 'Excadrill', 'Garchomp', 'Gholdengo', 'Gliscor', - 'Goodra-Hisui', 'Great Tusk', 'Heatran', 'Hydreigon', 'Iron Boulder', 'Iron Crown', 'Iron Hands', 'Iron Moth', 'Iron Treads', 'Kingambit', 'Landorus-Incarnate', - 'Landorus-Therian', 'Latios', 'Mamoswine', 'Manaphy', 'Meowscarada', 'Moltres-Base', 'Ogerpon-Cornerstone', 'Ogerpon-Hearthflame', 'Ogerpon-Wellspring', 'Pecharunt', - 'Primarina', 'Roaring Moon', 'Sandy Shocks', 'Scream Tail', 'Sinistcha', 'Skarmory', 'Slither Wing', 'Swampert', 'Thundurus-Incarnate', 'Thundurus-Therian', 'Ting-Lu', - 'Tinkaton', 'Ursaluna-Bloodmoon', 'Zamazenta-Hero', 'Zamazenta-Crowned', 'Zapdos-Base', 'Zapdos-Galar', 'Zarude', 'Light Clay', + ruleset: ['Standard', 'Mega Rayquaza Clause', 'Overflow Stat Mod'], + banlist: ['Shadow Tag', 'Gengarite', 'Baton Pass', 'Electrify'], + restricted: [ + 'Beedrillite', 'Blazikenite', 'Kangaskhanite', 'Mawilite', 'Medichamite', 'Pidgeotite', 'Ultranecrozium Z', 'Power Construct', + 'Arceus', 'Deoxys-Attack', 'Deoxys-Normal', 'Deoxys-Speed', 'Dialga', 'Dragonite', 'Giratina', 'Groudon', 'Ho-Oh', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', + 'Landorus-Therian', 'Lugia', 'Lunala', 'Marshadow', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', + 'Regigigas', 'Reshiram', 'Shuckle', 'Slaking', 'Solgaleo', 'Xerneas', 'Yveltal', 'Zekrom', ], + onValidateTeam(team) { + const itemTable = new Set(); + for (const set of team) { + const item = this.dex.items.get(set.item); + if (!item.megaStone && !item.isPrimalOrb && item.id !== 'ultranecroziumz') continue; + const species = this.dex.species.get(set.species); + const ability = this.dex.abilities.get(set.ability); + if ((this.ruleTable.isRestrictedSpecies(species) || this.ruleTable.isRestricted(`item:${item.id}`) || + this.ruleTable.isRestricted(`ability:${ability.id}`)) && + !(((item.megaStone || item.isPrimalOrb) && item.itemUser?.includes(species.baseSpecies) || + (item.id === 'ultranecroziumz' && species.name.startsWith('Necrozma-'))))) { + return [`${species.name} is not allowed to hold ${item.name}.`]; + } + if (itemTable.has(item.id)) { + return [ + `You are limited to one of each Mega Stone/Primal Orb.`, + `(You have more than one ${item.name})`, + ]; + } + itemTable.add(item.id); + } + }, + onBegin() { + for (const pokemon of this.getAllPokemon()) { + pokemon.m.originalSpecies = pokemon.baseSpecies.name; + } + }, + onSwitchIn(pokemon) { + const originalSpecies = this.dex.species.get((pokemon.species as any).originalSpecies); + if (originalSpecies.exists && pokemon.m.originalSpecies !== originalSpecies.baseSpecies) { + // Place volatiles on the Pokémon to show its mega-evolved condition and details + this.add('-start', pokemon, originalSpecies.requiredItem || originalSpecies.requiredMove, '[silent]'); + const oSpecies = this.dex.species.get(pokemon.m.originalSpecies); + if (oSpecies.types.join('/') !== pokemon.species.types.join('/')) { + this.add('-start', pokemon, 'typechange', pokemon.species.types.join('/'), '[silent]'); + } + } + }, + onSwitchOut(pokemon) { + const originalSpecies = this.dex.species.get((pokemon.species as any).originalSpecies); + if (originalSpecies.exists && pokemon.m.originalSpecies !== originalSpecies.baseSpecies) { + this.add('-end', pokemon, originalSpecies.requiredItem || originalSpecies.requiredMove, '[silent]'); + } + }, }, { - name: "[Gen 8] Almost Any Ability", - desc: `Pokémon have access to almost any ability.`, - mod: 'gen8', + name: "[Gen 6] Mix and Mega", + desc: `Mega evolve any Pokémon with any mega stone, or transform them with Primal orbs, with no limit.`, + mod: 'gen6mixandmega', searchShow: false, - ruleset: ['Standard OMs', 'Ability Clause = 2', '!Obtainable Abilities', 'Sleep Moves Clause'], - banlist: [ - 'Archeops', 'Blacephalon', 'Buzzwole', 'Calyrex-Ice', 'Calyrex-Shadow', 'Dialga', 'Dracovish', 'Dragapult', 'Dragonite', 'Eternatus', 'Genesect', 'Gengar', 'Giratina', - 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kartana', 'Keldeo', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Melmetal', - 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Noivern', 'Palkia', 'Pheromosa', 'Rayquaza', 'Regigigas', 'Reshiram', 'Shedinja', 'Solgaleo', - 'Spectrier', 'Urshifu', 'Urshifu-Rapid-Strike', 'Victini', 'Weavile', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Hero', 'Zekrom', 'Zeraora', 'Zygarde-50%', - 'Arena Trap', 'Comatose', 'Contrary', 'Fluffy', 'Fur Coat', 'Gorilla Tactics', 'Huge Power', 'Ice Scales', 'Illusion', 'Imposter', 'Innards Out', 'Intrepid Sword', - 'Libero', 'Magic Bounce', 'Magnet Pull', 'Moody', 'Neutralizing Gas', 'Parental Bond', 'Poison Heal', 'Protean', 'Pure Power', 'Shadow Tag', 'Simple', 'Speed Boost', - 'Stakeout', 'Unburden', 'Water Bubble', 'Wonder Guard', 'King\'s Rock', 'Baton Pass', 'Electrify', + ruleset: ['Standard', 'Swagger Clause', 'Mega Rayquaza Clause', 'Overflow Stat Mod', '!Sleep Clause Mod', 'Sleep Moves Clause'], + banlist: ['Shadow Tag', 'Baton Pass', 'Electrify'], + restricted: [ + 'Beedrillite', 'Gengarite', 'Kangaskhanite', 'Mawilite', 'Medichamite', + 'Arceus', 'Darkrai', 'Deoxys-Attack', 'Deoxys-Normal', 'Deoxys-Speed', 'Dialga', 'Dragonite', 'Genesect', 'Giratina', 'Groudon', 'Ho-Oh', 'Kyogre', 'Kyurem-Black', + 'Kyurem-White', 'Lugia', 'Manaphy', 'Mewtwo', 'Palkia', 'Rayquaza', 'Regigigas', 'Reshiram', 'Shaymin-Sky', 'Slaking', 'Xerneas', 'Yveltal', 'Zekrom', ], - }, - { - name: "[Gen 8] Balanced Hackmons", - desc: `Anything directly hackable onto a set (EVs, IVs, forme, ability, item, and move) and is usable in local battles is allowed.`, - mod: 'gen8', - searchShow: false, - ruleset: ['-Nonexistent', 'OHKO Clause', 'Evasion Moves Clause', 'Forme Clause', 'Team Preview', 'HP Percentage Mod', 'Cancel Mod', 'Dynamax Clause', 'Sleep Moves Clause', 'Endless Battle Clause'], - banlist: [ - 'Calyrex-Shadow', 'Cramorant-Gorging', 'Darmanitan-Galar-Zen', 'Eternatus-Eternamax', 'Shedinja', 'Zacian-Crowned', - 'Arena Trap', 'Contrary', 'Gorilla Tactics', 'Huge Power', 'Illusion', 'Innards Out', 'Intrepid Sword', 'Libero', - 'Magnet Pull', 'Moody', 'Neutralizing Gas', 'Parental Bond', 'Protean', 'Pure Power', 'Shadow Tag', 'Stakeout', - 'Water Bubble', 'Wonder Guard', 'Comatose + Sleep Talk', 'Rusted Sword', 'Belly Drum', 'Bolt Beak', 'Court Change', - 'Double Iron Bash', 'Octolock', 'Shell Smash', 'Transform', - ], - unbanlist: ['Acupressure'], - }, - { - name: "[Gen 7] Balanced Hackmons", - desc: `Anything directly hackable onto a set (EVs, IVs, forme, ability, item, and move) and is usable in local battles is allowed.`, - mod: 'gen7', - searchShow: false, - ruleset: ['-Nonexistent', 'Ability Clause = 2', 'CFZ Clause', 'OHKO Clause', 'Evasion Moves Clause', 'Forme Clause', 'Team Preview', 'HP Percentage Mod', 'Cancel Mod', 'Sleep Moves Clause', 'Endless Battle Clause'], - banlist: [ - 'Groudon-Primal', 'Rayquaza-Mega', 'Arena Trap', 'Contrary', 'Huge Power', 'Illusion', 'Innards Out', 'Magnet Pull', 'Moody', - 'Parental Bond', 'Protean', 'Psychic Surge', 'Pure Power', 'Shadow Tag', 'Stakeout', 'Water Bubble', 'Wonder Guard', 'Gengarite', - 'Baton Pass', 'Belly Drum', 'Chatter', 'Electrify', 'Shell Smash', - ], - unbanlist: ['Acupressure'], + onValidateTeam(team) { + const itemTable = new Set(); + for (const set of team) { + const item = this.dex.items.get(set.item); + if (!item.megaStone && !item.isPrimalOrb) continue; + const species = this.dex.species.get(set.species); + if ((this.ruleTable.isRestrictedSpecies(species) || this.ruleTable.isRestricted(`item:${item.id}`)) && + !((item.megaStone || item.isPrimalOrb) && item.itemUser?.includes(species.baseSpecies))) { + return [`${species.name} is not allowed to hold ${item.name}.`]; + } + if (itemTable.has(item.id)) { + return [ + `You are limited to one of each Mega Stone/Primal Orb.`, + `(You have more than one ${item.name})`, + ]; + } + itemTable.add(item.id); + } + }, + onBegin() { + for (const pokemon of this.getAllPokemon()) { + pokemon.m.originalSpecies = pokemon.baseSpecies.name; + } + }, + onSwitchIn(pokemon) { + const originalSpecies = this.dex.species.get((pokemon.species as any).originalSpecies); + if (originalSpecies.exists && pokemon.m.originalSpecies !== originalSpecies.baseSpecies) { + // Place volatiles on the Pokémon to show its mega-evolved condition and details + this.add('-start', pokemon, originalSpecies.requiredItem || originalSpecies.requiredMove, '[silent]'); + const oSpecies = this.dex.species.get(pokemon.m.originalSpecies); + if (oSpecies.types.join('/') !== pokemon.species.types.join('/')) { + this.add('-start', pokemon, 'typechange', pokemon.species.types.join('/'), '[silent]'); + } + } + }, + onSwitchOut(pokemon) { + const originalSpecies = this.dex.species.get((pokemon.species as any).originalSpecies); + if (originalSpecies.exists && pokemon.m.originalSpecies !== originalSpecies.baseSpecies) { + this.add('-end', pokemon, originalSpecies.requiredItem || originalSpecies.requiredMove, '[silent]'); + } + }, }, // National Dex @@ -2888,20 +3165,20 @@ export const Formats: import('../sim/dex-formats').FormatList = [ ], banlist: [ 'ND Uber', 'ND AG', 'ND OU', 'ND UUBL', 'ND UU', 'ND RUBL', 'ND RU', 'ND NFE', 'ND LC', - 'Battle Bond', 'Moody', 'Power Construct', 'Shadow Tag', 'Tangled Feet', 'Berserk Gene', 'King\'s Rock', 'Quick Claw', 'Razor Fang', - 'Last Respects', 'Shed Tail', 'Baton Pass + Contrary', 'Baton Pass + Rapid Spin', + 'Battle Bond', 'Moody', 'Power Construct', 'Shadow Tag', 'Tangled Feet', 'Berserk Gene', 'Booster Energy', 'King\'s Rock', 'Quick Claw', + 'Razor Fang', 'Last Respects', 'Shed Tail', 'Baton Pass + Contrary', 'Baton Pass + Rapid Spin', 'Baton Pass + Well-Baked Body', ], unbanlist: [ - 'Carracosta', 'Celebi', 'Cinccino', 'Cobalion', 'Cradily', 'Dedenne', 'Fezandipiti', 'Gabite', 'Granbull', 'Greedent', 'Hatterene', 'Heatmor', - 'Houndstone', 'Indeedee-M', 'Lilligant-Base', 'Medicham-Base', 'Orbeetle', 'Oricorio-Pom-Pom', 'Overqwil', 'Pincurchin', 'Pinsir-Base', 'Rotom-Wash', - 'Samurott-Base', 'Scovillain-Base', 'Sharpedo-Base', 'Shedinja', 'Shiftry', 'Steelix-Base', 'Tropius', 'Type: Null', 'Typhlosion-Hisui', 'Tyrantrum', - 'Veluza', 'Vivillon', 'Whimsicott', 'Ultranecrozium Z', 'Solganium Z', 'Lunalium Z', 'Mewnium Z', 'Marshadium Z', + 'Articuno-Galar', 'Aurorus', 'Bellossom', 'Bewear', 'Blastoise-Base', 'Dodrio', 'Entei', 'Falinks-Base', 'Flygon', 'Furret', 'Goodra-Hisui', + 'Gumshoos-Base', 'Heliolisk', 'Hydrapple', 'Indeedee-F', 'Iron Thorns', 'Leavanny', 'Lickilicky', 'Ludicolo', 'Maractus', 'Meganium-Base', + 'Polteageist', 'Probopass', 'Regieleki', 'Rhyperior', 'Seismitoad', 'Shiinotic', 'Slaking', 'Spidops', 'Spiritomb', 'Unfezant', 'Vanilluxe', + 'Victreebel-Base', 'Weezing-Galar', 'Wyrdeer', 'Ultranecrozium Z', 'Solganium Z', 'Lunalium Z', 'Mewnium Z', 'Marshadium Z', ], // Stupid hardcode onValidateSet(set, format, setHas, teamHas) { if (set.item) { const item = this.dex.items.get(set.item); - if (item.megaEvolves && !(this.ruleTable.has(`+item:${item.id}`) || this.ruleTable.has(`+pokemontag:mega`))) { + if (item.megaStone && !(this.ruleTable.has(`+item:${item.id}`) || this.ruleTable.has(`+pokemontag:mega`))) { return [`Mega Evolution is banned.`]; } if (item.zMove && !(this.ruleTable.has(`+item:${item.id}`))) { @@ -2983,20 +3260,6 @@ export const Formats: import('../sim/dex-formats').FormatList = [ ruleset: ['Standard Doubles', 'NatDex Mod', '!Gravity Sleep Clause'], banlist: ['Shedinja', 'Assist'], }, - { - name: "[Gen 9] National Dex Ubers UU", - mod: 'gen9', - searchShow: false, - ruleset: ['[Gen 9] National Dex Ubers'], - banlist: [ - 'Alomomola', 'Arceus-Normal', 'Arceus-Dark', 'Arceus-Ground', 'Calyrex-Ice', 'Chansey', 'Deoxys-Attack', 'Ditto', 'Dondozo', 'Eternatus', 'Giratina-Origin', 'Groudon-Primal', - 'Hatterene', 'Ho-Oh', 'Kingambit', 'Kyogre-Primal', 'Lunala', 'Marshadow', 'Mewtwo-Mega-Y', 'Necrozma-Dusk-Mane', 'Necrozma-Ultra', 'Salamence-Mega', 'Smeargle', 'Yveltal', - 'Zacian-Crowned', 'Zygarde-50%', - // UUBL - 'Arceus-Dragon', 'Arceus-Fairy', 'Arceus-Fire', 'Arceus-Flying', 'Arceus-Ghost', 'Arceus-Water', 'Blaziken-Mega', 'Chi-Yu', 'Chien-Pao', 'Dracovish', 'Flutter Mane', 'Groudon', - 'Kyogre', 'Kyurem-Black', 'Rayquaza', 'Shaymin-Sky', 'Zacian', 'Zekrom', 'Power Construct', 'Light Clay', 'Ultranecrozium Z', 'Last Respects', - ], - }, { name: "[Gen 9] National Dex 1v1", mod: 'gen9', @@ -3164,58 +3427,31 @@ export const Formats: import('../sim/dex-formats').FormatList = [ section: "Pet Mods", }, { - name: "[Gen 9] Scootopia Random Battle", - desc: `A Gen 9 Fakemon micrometa featuring the Super Types mechanic, granting 1 Pokemon per team an additional and powerful new typing.`, - mod: 'scootopiav2', - team: 'randomSC', - ruleset: [ - 'Species Clause', 'HP Percentage Mod', 'Cancel Mod', 'Sleep Clause Mod', 'Illusion Level Mod', - 'Terastal Clause', 'Super Type Moves Rule', 'Data Preview', 'Sprite Viewer', - ], - onBegin() { - this.add(`raw|
Need help with all of the new moves, abilities, and wacky stuff?
Then make sure to check out the Scootopia Spreadsheet or use /dt!
`); - this.add('-message', `Welcome to Scootopia!`); - this.add('-message', `This is a fakemon micrometa created by Scoopapa, featuring the Super Types mechanic!`); - this.add('-message', `Super Types are powerful additional types that a Pokemon can gain by holding a specific Super Type Orb!`); - this.add('-message', `You can find our thread and metagame resources here:`); - this.add('-message', `https://www.smogon.com/forums/threads/3742131/`); - }, - onSwitchInPriority: 100, - onSwitchIn(pokemon) { - if ((pokemon.illusion || pokemon).getTypes(true, true).join('/') !== - this.dex.forGen(9).species.get((pokemon.illusion || pokemon).species.name).types.join('/') && - !pokemon.terastallized) { - this.add('-start', pokemon, 'typechange', (pokemon.illusion || pokemon).getTypes(true).join('/'), '[silent]'); - } - }, - }, - { - name: "[Gen 9] Scootopia", // Roomtours - desc: `A Gen 9 Fakemon micrometa featuring the Super Types mechanic, granting 1 Pokemon per team an additional and powerful new typing.`, - mod: 'scootopiav2', + name: "[Gen 9] Six by Six", // Roomtours + desc: `A Gen 9 micrometa featuring only 6 Pokemon with 6 forms each.`, + mod: 'sixbysix', searchShow: false, - ruleset: ['Standard NatDex', 'Terastal Clause', 'Z-Move Clause', 'Super Type Moves Rule', 'Data Preview', 'Sprite Viewer'], + ruleset: ['Standard', 'Sleep Moves Clause', '!Sleep Clause Mod', 'Terastal Clause', 'Data Preview', 'Sprite Viewer'], banlist: [ - 'All Pokemon', 'Crystal Heart', 'Wild Heart', + 'All Pokemon', 'Last Respects', 'Shed Tail', 'King\'s Rock', 'Razor Fang', 'Baton Pass', ], unbanlist: [ - 'Arbrella', 'Krachiten', 'Scalaron', 'Rantler', 'Woolora', 'Albatrygon', 'Orchile', - 'Embuck', 'Cindoe', 'Cobracotta', 'Minillow', 'Crossont', 'Torgeist', 'Platypad', 'Lumoth', - 'Aurorowl', 'Carapex', 'Dojodo', 'Nunopod', 'Zeploom', 'Brawnkey', 'Salamalix', 'Cinnastar', - 'MuabBoa', 'Sturgard', 'Harzodia', 'Cyllindrake', 'Kodokai', 'Electangle', 'Dolphena', 'Soleron', - 'Soleron-Awakened', 'Jaegorm', 'Jaegorm-Collective', 'Elemadillo', 'Axolacred', 'Roscenti', - 'Blunderbusk', 'Barracoth', 'Jamborai', 'Dracoil', 'Celespirit', 'Noxtrice', 'Avastar', - 'Faerenheit', 'Cellsius', 'Kelven', 'Salaos', 'Morndos', 'Pythos', 'Corundell', 'Quadringo', - 'Saphor', 'Fenreil', 'Efflor', 'Flocura', 'Flocura-Nexus', + 'Kingdra-Classic', 'Kingdra-Brinepool', 'Kingdra-Druid', 'Kingdra-Bard', 'Kingdra-Gourmet', 'Kingdra-Ancient', + 'Nidoqueen-Classic', 'Nidoqueen-Erudite', 'Nidoqueen-Volcanic', + 'Nidoqueen-Rosegold', 'Nidoqueen-Shaman', 'Nidoqueen-Jasper', + 'Bisharp-Centurion', 'Bisharp-Savage', 'Bisharp-Ronin', 'Bisharp-Mantis', 'Bisharp-Revenant', 'Bisharp-Assassin', + 'Corviknight-Thunderbird', 'Corviknight-Genie', 'Corviknight-Yeti', + 'Corviknight-Analytical', 'Corviknight-Martian', 'Corviknight-Falcon', + 'Krookodile-Infernal', 'Krookodile-Abyssal', 'Krookodile-Wetlander', + 'Krookodile-Cave Dweller', 'Krookodile-Cliffside', 'Krookodile-Quantum', + 'Ogerpon-Muerta', 'Ogerpon-Easter', 'Ogerpon-Ankh', 'Ogerpon-Eid', 'Ogerpon-Vessel', 'Ogerpon-Kitsune', ], onBegin() { - this.add(`raw|
Need help with all of the new moves, abilities, and wacky stuff?
Then make sure to check out the Scootopia Spreadsheet or use /dt!
`); - this.add('-message', `Welcome to Scootopia!`); - this.add('-message', `This is a fakemon micrometa created by Scoopapa, featuring the Super Types mechanic!`); - this.add('-message', `Super Types are powerful additional types that a Pokemon can gain by holding a specific Super Type Orb!`); + this.add('-message', `Welcome to Six by Six!`); + this.add('-message', `This is a micrometa featuring just 6 Pokemon, each with 6 forms each!`); this.add('-message', `You can find our thread and metagame resources here:`); - this.add('-message', `https://www.smogon.com/forums/threads/3742131/`); + this.add('-message', `https://www.smogon.com/forums/threads/3769141/`); }, onSwitchInPriority: 100, onSwitchIn(pokemon) { @@ -3226,24 +3462,6 @@ export const Formats: import('../sim/dex-formats').FormatList = [ } }, }, - { - name: "[Gen 9] ChatBats", - desc: `A Random Battles Solomod made by the Pet Mods chatroom on Showdown.`, - mod: 'chatbats', - team: 'randomChatBats', - ruleset: ['Obtainable', 'Species Clause', 'HP Percentage Mod', 'Sleep Clause Mod', 'Data Preview', 'Cancel Mod'], - onSwitchIn(pokemon) { - this.add('-start', pokemon, 'typechange', pokemon.species.types.join('/'), '[silent]'); - }, - // Dachsbun causes Koraidon to generate on enemy team. Implemented here. - onBegin() { - this.add(`raw|
Need help with all of the new moves, abilities, and wacky sets?
Then make sure to check out the ChatBats Compendium or use /dt!
`); - this.add(`raw|Welcome to ChatBats!`); - this.add(`raw|ChatBats is a Random Battles format created by the Pet Mods room here on Showdown!`); - this.add(`raw|If you want to help create new sets, we will host events periodically in the Pet Mods room!`); - this.add(`raw|Anyone who is there can help create a new set for a random mon, changing moves, abilities, stats, and even custom formes.`); - }, - }, { name: "[Gen 9] Legends Z-A OU", desc: `Speculative turn-based metagame using Pokémon obtainable in Legends: Z-A, but with National Dex learnsets.`, @@ -3256,21 +3474,6 @@ export const Formats: import('../sim/dex-formats').FormatList = [ banlist: ['Uber', 'Arena Trap', 'Moody', 'Power Construct', 'Shadow Tag', 'King\'s Rock', 'Light Clay', 'Quick Claw', 'Razor Fang', 'Baton Pass', 'Last Respects', 'Shed Tail'], }, - // Randomized Format Spotlight - /////////////////////////////////////////////////////////////////// - - { - section: "Randomized Format Spotlight", - column: 3, - }, - { - name: "[Gen 9] BSS Factory (Bo3)", - desc: `Randomized 3v3 Singles featuring Pokémon and movesets popular in Battle Stadium Singles.`, - mod: 'gen9', - team: 'randomBSSFactory', - ruleset: ['Flat Rules', 'VGC Timer', 'Best of = 3'], - }, - // Randomized Metas /////////////////////////////////////////////////////////////////// @@ -3285,50 +3488,6 @@ export const Formats: import('../sim/dex-formats').FormatList = [ team: 'random', bestOfDefault: true, }, - { - name: "[Gen 9] Monkey's Paw Random Battle", - desc: `Every Pokemon can wish for something with the Monkey's Paw once.`, - mod: 'monkeyspaw', - team: 'random', - ruleset: ['[Gen 9] Random Battle'], - onBegin() { - for (const side of this.sides) { - // @ts-expect-error I hate references with all of my life force - side.wishes = { luck: 1, knowledge: 1, power: 1, life: 1 }; - // @ts-expect-error - side.wishesRemaining = 4; - } - let buf = `

What does which wish do?


`; - buf += `
What does which wish do?`; - buf += `• Mega Evolution: Wish for life – Revive one fainted Pokemon
`; - buf += `• Mega Evolution X: Wish for power – Gain a +2 boost in the current Pokemon's dominant attack and defense stat
`; - buf += `• Mega Evolution Y: Wish for luck – Give the current Pokemon innate Serene Grace + Focus Energy for the rest of the game
`; - buf += `• Terastallize: Wish for knowledge – Scout the active Pokemon for one of their moves
`; - buf += `
`; - this.add('message', `You've found a Monkey's Paw. You have 4 wishes.`); - this.add(`raw|${buf}`); - }, - onSwitchIn(pokemon) { - if (pokemon.m.revivedByMonkeysPaw) { - pokemon.addVolatile('slowstart', null, this.dex.conditions.get('monkeypaw')); - } - if (pokemon.m.monkeyPawLuck) { - pokemon.addVolatile('focusenergy'); - pokemon.addVolatile('confusion', null, this.dex.conditions.get('monkeypaw')); - } - }, - onModifyMovePriority: -2, - onModifyMove(move, pokemon) { - if (!pokemon.m.monkeyPawLuck) return; - if (move.secondaries) { - this.debug('doubling secondary chance'); - for (const secondary of move.secondaries) { - if (secondary.chance) secondary.chance *= 2; - } - } - if (move.self?.chance) move.self.chance *= 2; - }, - }, { 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.", @@ -3445,6 +3604,15 @@ export const Formats: import('../sim/dex-formats').FormatList = [ this.add(`raw|
Battle Factory Tier: ${this.teamGenerator.factoryTier}
`); }, }, + { + name: "[Gen 9] 1v1 Factory", + desc: `Randomized teams of Pokémon for a generated Smogon tier with sets that are competitively viable.`, + threads: [`• 1v1 Factory Set Discussion`], + mod: 'gen9', + team: 'random1v1Factory', + bestOfDefault: true, + ruleset: ['[Gen 9] 1v1'], + }, { name: "[Gen 9] BSS Factory", desc: `Randomized 3v3 Singles featuring Pokémon and movesets popular in Battle Stadium Singles.`, @@ -3680,8 +3848,8 @@ export const Formats: import('../sim/dex-formats').FormatList = [ } const item = this.dex.items.get(set.item); if (set.item && item.megaStone) { - const megaSpecies = this.dex.species.get(Array.isArray(item.megaStone) ? item.megaStone[0] : item.megaStone); - if (item.megaEvolves?.includes(species.baseSpecies) && megaSpecies.bst > 625) { + const megaSpecies = this.dex.species.get(item.megaStone[species.baseSpecies]); + if (megaSpecies.bst > 625) { return [ `${set.name || set.species}'s item ${item.name} is banned.`, `(Pok\u00e9mon with a BST higher than 625 are banned)`, ]; @@ -3917,42 +4085,6 @@ export const Formats: import('../sim/dex-formats').FormatList = [ }, }, - // RoA Spotlight - /////////////////////////////////////////////////////////////////// - - { - section: "RoA Spotlight", - column: 4, - }, - { - name: "[Gen 2] Ubers", - mod: 'gen2', - // searchShow: false, - ruleset: ['Standard'], - }, - { - name: "[Gen 5] LC", - mod: 'gen5', - // searchShow: false, - ruleset: ['Standard', 'Little Cup', 'Sleep Moves Clause'], - banlist: [ - 'Gligar', 'Meditite', 'Misdreavus', 'Murkrow', 'Scraggy', 'Scyther', 'Sneasel', 'Tangela', 'Vulpix', 'Yanma', - 'Sand Rush', 'Sand Veil', 'Berry Juice', 'Soul Dew', 'Baton Pass', 'Dragon Rage', 'Sonic Boom', 'Swagger', - ], - }, - { - name: "[Gen 7] VGC 2017", - mod: 'gen7sm', - gameType: 'doubles', - // searchShow: false, - bestOfDefault: true, - ruleset: [ - 'Flat Rules', 'Old Alola Pokedex', '!! Adjust Level = 50', 'Min Source Gen = 7', - 'VGC Timer', '!! Timer Starting = 900', - ], - banlist: ['Mega', 'Custap Berry', 'Enigma Berry', 'Jaboca Berry', 'Micle Berry', 'Rowap Berry'], - }, - // Past Gens OU /////////////////////////////////////////////////////////////////// @@ -3987,7 +4119,7 @@ export const Formats: import('../sim/dex-formats').FormatList = [ { name: "[Gen 4] OU", mod: 'gen4', - ruleset: ['Standard', 'Evasion Abilities Clause', 'Baton Pass Stat Trap Clause', 'Freeze Clause Mod'], + ruleset: ['Standard', 'Evasion Abilities Clause', 'Baton Pass Stat Trap Clause', 'Freeze Clause Mod', 'Sleep Moves Clause', '!Sleep Clause Mod'], banlist: ['AG', 'Uber', 'Arena Trap', 'Quick Claw', 'Soul Dew', 'Swagger'], }, { @@ -4420,16 +4552,6 @@ export const Formats: import('../sim/dex-formats').FormatList = [ ruleset: ['[Gen 7] Doubles OU'], banlist: ['DOU', 'DBL'], }, - { - name: "[Gen 7] VGC 2019", - mod: 'gen7', - gameType: 'doubles', - searchShow: false, - bestOfDefault: true, - ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 7', 'VGC Timer', 'Limit Two Restricted'], - restricted: ['Restricted Legendary'], - banlist: ['Unown', 'Battle Bond'], - }, { name: "[Gen 7] VGC 2018", mod: 'gen7', @@ -4439,6 +4561,18 @@ export const Formats: import('../sim/dex-formats').FormatList = [ ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 7', 'VGC Timer', '!! Timer Starting = 300'], banlist: ['Oranguru + Symbiosis', 'Passimian + Defiant', 'Unown', 'Custap Berry', 'Enigma Berry', 'Jaboca Berry', 'Micle Berry', 'Rowap Berry', 'Battle Bond'], }, + { + name: "[Gen 7] VGC 2017", + mod: 'gen7sm', + gameType: 'doubles', + searchShow: false, + bestOfDefault: true, + ruleset: [ + 'Flat Rules', 'Old Alola Pokedex', '!! Adjust Level = 50', 'Min Source Gen = 7', + 'VGC Timer', '!! Timer Starting = 900', + ], + banlist: ['Mega', 'Custap Berry', 'Enigma Berry', 'Jaboca Berry', 'Micle Berry', 'Rowap Berry'], + }, { name: "[Gen 7] Battle Spot Doubles", mod: 'gen7', @@ -4709,6 +4843,16 @@ export const Formats: import('../sim/dex-formats').FormatList = [ banlist: ['Latios'], unbanlist: ['Cloyster'], }, + { + name: "[Gen 5] LC", + mod: 'gen5', + searchShow: false, + ruleset: ['Standard', 'Little Cup', 'Sleep Moves Clause'], + banlist: [ + 'Gligar', 'Meditite', 'Misdreavus', 'Murkrow', 'Scraggy', 'Scyther', 'Sneasel', 'Tangela', 'Vulpix', 'Yanma', + 'Sand Rush', 'Sand Veil', 'Berry Juice', 'Soul Dew', 'Baton Pass', 'Dragon Rage', 'Sonic Boom', 'Swagger', + ], + }, { name: "[Gen 5] 1v1", desc: `Bring three Pokémon to Team Preview and choose one to battle.`, @@ -4849,7 +4993,7 @@ export const Formats: import('../sim/dex-formats').FormatList = [ name: "[Gen 4] UU", mod: 'gen4', searchShow: false, - ruleset: ['[Gen 4] OU', '!Baton Pass Stat Trap Clause', '!Freeze Clause Mod'], + ruleset: ['[Gen 4] OU', '!Baton Pass Stat Trap Clause', '!Freeze Clause Mod', '!Sleep Moves Clause', 'Sleep Clause Mod'], banlist: ['OU', 'UUBL', 'Baton Pass'], unbanlist: ['Arena Trap', 'Snow Cloak', 'Quick Claw', 'Swagger'], }, @@ -4875,7 +5019,7 @@ export const Formats: import('../sim/dex-formats').FormatList = [ name: "[Gen 4] Anything Goes", mod: 'gen4', searchShow: false, - ruleset: ['Obtainable', 'Arceus EV Limit', 'Endless Battle Clause', 'HP Percentage Mod', 'Cancel Mod'], + ruleset: ['Obtainable', 'Endless Battle Clause', 'HP Percentage Mod', 'Cancel Mod'], }, { name: "[Gen 4] 1v1", @@ -5017,13 +5161,6 @@ export const Formats: import('../sim/dex-formats').FormatList = [ section: "Past Generations", column: 4, }, - { - name: "[Gen 3] Ubers", - mod: 'gen3', - searchShow: false, - ruleset: ['Standard', 'Deoxys Camouflage Clause', 'One Baton Pass Clause'], - banlist: ['Wobbuffet + Leftovers', 'Wynaut + Leftovers', 'Baton Pass'], - }, { name: "[Gen 3] RU", mod: 'gen3', @@ -5106,7 +5243,6 @@ export const Formats: import('../sim/dex-formats').FormatList = [ searchShow: false, ruleset: ['Standard', '!Switch Priority Clause Mod'], banlist: ['Uber', 'Quick Claw', 'Soul Dew', 'Swagger'], - unbanlist: ['Wobbuffet', 'Wynaut'], }, { name: "[Gen 3] Orre Colosseum", @@ -5140,6 +5276,12 @@ export const Formats: import('../sim/dex-formats').FormatList = [ debug: true, ruleset: ['HP Percentage Mod', 'Cancel Mod', 'Max Team Size = 24', 'Max Move Count = 24', 'Max Level = 9999', 'Default Level = 100'], }, + { + name: "[Gen 2] Ubers", + mod: 'gen2', + searchShow: false, + ruleset: ['Standard'], + }, { name: "[Gen 2] UU", mod: 'gen2', @@ -5161,7 +5303,7 @@ export const Formats: import('../sim/dex-formats').FormatList = [ mod: 'gen2', searchShow: false, ruleset: ['[Gen 2] NU'], - banlist: ['NU', 'PUBL', 'Baton Pass + Mean Look', 'Baton Pass + Spider Web'], + banlist: ['NU', 'PUBL', 'Baton Pass'], unbanlist: ['Swagger'], }, { @@ -5288,17 +5430,6 @@ export const Formats: import('../sim/dex-formats').FormatList = [ searchShow: false, ruleset: ['[Gen 1] OU', 'Allow Tradeback'], }, - { - name: "[Gen 1] NC 1997", - mod: 'gen1jpn', - bestOfDefault: true, - searchShow: false, - ruleset: [ - 'Picked Team Size = 3', 'Min Level = 50', 'Max Level = 55', 'Max Total Level = 155', - 'Obtainable', 'Team Preview', 'Stadium Sleep Clause', 'Species Clause', 'Nickname Clause', 'Cancel Mod', 'NC 1997 Move Legality', - ], - banlist: ['Uber'], - }, { name: "[Gen 1] Custom Game", mod: 'gen1', diff --git a/data/abilities.ts b/data/abilities.ts index cbc7bf08b4..c54de73b98 100644 --- a/data/abilities.ts +++ b/data/abilities.ts @@ -2017,7 +2017,7 @@ export const Abilities: import('../sim/dex-abilities').AbilityDataTable = { } }, onEnd(pokemon) { - if (pokemon.illusion) { + if (pokemon.illusion && !pokemon.beingCalledBack) { this.debug('illusion cleared'); pokemon.illusion = null; const details = pokemon.getUpdatedDetails(); @@ -2333,10 +2333,7 @@ export const Abilities: import('../sim/dex-abilities').AbilityDataTable = { return; } if (this.checkMoveMakesContact(move, source, target, !source.isAlly(target))) { - const oldAbility = source.setAbility('lingeringaroma', target); - if (oldAbility) { - this.add('-activate', target, 'ability: Lingering Aroma', this.dex.abilities.get(oldAbility).name, `[of] ${source}`); - } + source.setAbility('lingeringaroma', target); } }, flags: {}, @@ -2714,10 +2711,7 @@ export const Abilities: import('../sim/dex-abilities').AbilityDataTable = { return; } if (this.checkMoveMakesContact(move, source, target, !source.isAlly(target))) { - const oldAbility = source.setAbility('mummy', target); - if (oldAbility) { - this.add('-activate', target, 'ability: Mummy', this.dex.abilities.get(oldAbility).name, `[of] ${source}`); - } + source.setAbility('mummy', target); } }, flags: {}, @@ -4255,6 +4249,10 @@ export const Abilities: import('../sim/dex-abilities').AbilityDataTable = { return this.chainModify(0.5); } }, + onEnd(pokemon) { + if (pokemon.beingCalledBack) return; + this.add('-end', pokemon, 'Slow Start', '[silent]'); + }, flags: {}, name: "Slow Start", rating: -1, @@ -5266,20 +5264,7 @@ export const Abilities: import('../sim/dex-abilities').AbilityDataTable = { }, wanderingspirit: { onDamagingHit(damage, target, source, move) { - if (source.getAbility().flags['failskillswap'] || target.volatiles['dynamax']) return; - - if (this.checkMoveMakesContact(move, source, target)) { - const targetCanBeSet = this.runEvent('SetAbility', target, source, this.effect, source.ability); - if (!targetCanBeSet) return targetCanBeSet; - const sourceAbility = source.setAbility('wanderingspirit', target); - if (!sourceAbility) return; - if (target.isAlly(source)) { - this.add('-activate', target, 'Skill Swap', '', '', `[of] ${source}`); - } else { - this.add('-activate', target, 'ability: Wandering Spirit', this.dex.abilities.get(sourceAbility).name, 'Wandering Spirit', `[of] ${source}`); - } - target.setAbility(sourceAbility); - } + if (this.checkMoveMakesContact(move, source, target)) this.skillSwap(source, target); }, flags: {}, name: "Wandering Spirit", diff --git a/data/aliases.ts b/data/aliases.ts index 23325f6096..72eb6bfa03 100644 --- a/data/aliases.ts +++ b/data/aliases.ts @@ -91,8 +91,10 @@ export const Aliases: import('../sim/dex').AliasesTable = { zaou: "[Gen 9] Legends Z-A OU", legendsou: "[Gen 9] Legends Z-A OU", plzaou: "[Gen 9] Legends Z-A OU", - omotm: "[Gen 9] Pokebilities", - lcotm: "[Gen 9] Tera Override", + omotm: "[Gen 9] Flipped", + lcotm: "[Gen 9] The Loser's Game", + ommotm: "[Gen 9] STABmons Mix and Mega", + ommspotlight: "[Gen 9] STABmons Mix and Mega", // mega evos --- 1st ordered alphabetically by species, 2nd by alias megasnow: "Abomasnow-Mega", diff --git a/data/items.ts b/data/items.ts index 1ffb717568..fa452c1c48 100644 --- a/data/items.ts +++ b/data/items.ts @@ -22,12 +22,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { abomasite: { name: "Abomasite", spritenum: 575, - megaStone: "Abomasnow-Mega", - megaEvolves: "Abomasnow", + megaStone: { "Abomasnow": "Abomasnow-Mega" }, itemUser: ["Abomasnow"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 674, gen: 6, @@ -36,12 +34,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { absolite: { name: "Absolite", spritenum: 576, - megaStone: "Absol-Mega", - megaEvolves: "Absol", + megaStone: { "Absol": "Absol-Mega" }, itemUser: ["Absol"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 677, gen: 6, @@ -50,12 +46,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { absolitez: { name: "Absolite Z", spritenum: 576, - megaStone: "Absol-Mega-Z", - megaEvolves: "Absol", + megaStone: { "Absol": "Absol-Mega-Z" }, itemUser: ["Absol"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2588, gen: 9, @@ -141,12 +135,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { aerodactylite: { name: "Aerodactylite", spritenum: 577, - megaStone: "Aerodactyl-Mega", - megaEvolves: "Aerodactyl", + megaStone: { "Aerodactyl": "Aerodactyl-Mega" }, itemUser: ["Aerodactyl"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 672, gen: 6, @@ -155,12 +147,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { aggronite: { name: "Aggronite", spritenum: 578, - megaStone: "Aggron-Mega", - megaEvolves: "Aggron", + megaStone: { "Aggron": "Aggron-Mega" }, itemUser: ["Aggron"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 667, gen: 6, @@ -225,12 +215,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { alakazite: { name: "Alakazite", spritenum: 579, - megaStone: "Alakazam-Mega", - megaEvolves: "Alakazam", + megaStone: { "Alakazam": "Alakazam-Mega" }, itemUser: ["Alakazam"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 679, gen: 6, @@ -250,12 +238,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { altarianite: { name: "Altarianite", spritenum: 615, - megaStone: "Altaria-Mega", - megaEvolves: "Altaria", + megaStone: { "Altaria": "Altaria-Mega" }, itemUser: ["Altaria"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 755, gen: 6, @@ -264,12 +250,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { ampharosite: { name: "Ampharosite", spritenum: 580, - megaStone: "Ampharos-Mega", - megaEvolves: "Ampharos", + megaStone: { "Ampharos": "Ampharos-Mega" }, itemUser: ["Ampharos"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 658, gen: 6, @@ -350,12 +334,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { audinite: { name: "Audinite", spritenum: 617, - megaStone: "Audino-Mega", - megaEvolves: "Audino", + megaStone: { "Audino": "Audino-Mega" }, itemUser: ["Audino"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 757, gen: 6, @@ -397,12 +379,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { banettite: { name: "Banettite", spritenum: 582, - megaStone: "Banette-Mega", - megaEvolves: "Banette", + megaStone: { "Banette": "Banette-Mega" }, itemUser: ["Banette"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 668, gen: 6, @@ -411,12 +391,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { barbaracite: { name: "Barbaracite", spritenum: 564, - megaStone: "Barbaracle-Mega", - megaEvolves: "Barbaracle", + megaStone: { "Barbaracle": "Barbaracle-Mega" }, itemUser: ["Barbaracle"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2581, gen: 9, @@ -425,12 +403,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { baxcalibrite: { name: "Baxcalibrite", spritenum: 0, - megaStone: "Baxcalibur-Mega", - megaEvolves: "Baxcalibur", + megaStone: { "Baxcalibur": "Baxcalibur-Mega" }, itemUser: ["Baxcalibur"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2601, gen: 9, @@ -446,12 +422,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { beedrillite: { name: "Beedrillite", spritenum: 628, - megaStone: "Beedrill-Mega", - megaEvolves: "Beedrill", + megaStone: { "Beedrill": "Beedrill-Mega" }, itemUser: ["Beedrill"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 770, gen: 6, @@ -582,12 +556,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { blastoisinite: { name: "Blastoisinite", spritenum: 583, - megaStone: "Blastoise-Mega", - megaEvolves: "Blastoise", + megaStone: { "Blastoise": "Blastoise-Mega" }, itemUser: ["Blastoise"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 661, gen: 6, @@ -596,12 +568,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { blazikenite: { name: "Blazikenite", spritenum: 584, - megaStone: "Blaziken-Mega", - megaEvolves: "Blaziken", + megaStone: { "Blaziken": "Blaziken-Mega" }, itemUser: ["Blaziken"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 664, gen: 6, @@ -762,12 +732,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { cameruptite: { name: "Cameruptite", spritenum: 625, - megaStone: "Camerupt-Mega", - megaEvolves: "Camerupt", + megaStone: { "Camerupt": "Camerupt-Mega" }, itemUser: ["Camerupt"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 767, gen: 6, @@ -793,12 +761,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { chandelurite: { name: "Chandelurite", spritenum: 557, - megaStone: "Chandelure-Mega", - megaEvolves: "Chandelure", + megaStone: { "Chandelure": "Chandelure-Mega" }, itemUser: ["Chandelure"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2574, gen: 9, @@ -822,12 +788,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { charizarditex: { name: "Charizardite X", spritenum: 585, - megaStone: "Charizard-Mega-X", - megaEvolves: "Charizard", + megaStone: { "Charizard": "Charizard-Mega-X" }, itemUser: ["Charizard"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 660, gen: 6, @@ -836,12 +800,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { charizarditey: { name: "Charizardite Y", spritenum: 586, - megaStone: "Charizard-Mega-Y", - megaEvolves: "Charizard", + megaStone: { "Charizard": "Charizard-Mega-Y" }, itemUser: ["Charizard"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 678, gen: 6, @@ -903,12 +865,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { chesnaughtite: { name: "Chesnaughtite", spritenum: 558, - megaStone: "Chesnaught-Mega", - megaEvolves: "Chesnaught", + megaStone: { "Chesnaught": "Chesnaught-Mega" }, itemUser: ["Chesnaught"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2575, gen: 9, @@ -978,12 +938,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { chimechite: { name: "Chimechite", spritenum: 0, - megaStone: "Chimecho-Mega", - megaEvolves: "Chimecho", + megaStone: { "Chimecho": "Chimecho-Mega" }, itemUser: ["Chimecho"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2587, gen: 9, @@ -1130,12 +1088,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { clefablite: { name: "Clefablite", spritenum: 544, - megaStone: "Clefable-Mega", - megaEvolves: "Clefable", + megaStone: { "Clefable": "Clefable-Mega" }, itemUser: ["Clefable"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2559, gen: 9, @@ -1258,12 +1214,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { crabominite: { name: "Crabominite", spritenum: 0, - megaStone: "Crabominable-Mega", - megaEvolves: "Crabominable", + megaStone: { "Crabominable": "Crabominable-Mega" }, itemUser: ["Crabominable"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2595, gen: 9, @@ -1357,12 +1311,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { darkranite: { name: "Darkranite", spritenum: 0, - megaStone: "Darkrai-Mega", - megaEvolves: "Darkrai", + megaStone: { "Darkrai": "Darkrai-Mega" }, itemUser: ["Darkrai"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2593, gen: 9, @@ -1425,12 +1377,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { delphoxite: { name: "Delphoxite", spritenum: 559, - megaStone: "Delphox-Mega", - megaEvolves: "Delphox", + megaStone: { "Delphox": "Delphox-Mega" }, itemUser: ["Delphox"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2576, gen: 9, @@ -1454,12 +1404,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { diancite: { name: "Diancite", spritenum: 624, - megaStone: "Diancie-Mega", - megaEvolves: "Diancie", + megaStone: { "Diancie": "Diancie-Mega" }, itemUser: ["Diancie"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 764, gen: 6, @@ -1521,12 +1469,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { dragalgite: { name: "Dragalgite", spritenum: 565, - megaStone: "Dragalge-Mega", - megaEvolves: "Dragalge", + megaStone: { "Dragalge": "Dragalge-Mega" }, itemUser: ["Dragalge"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2582, gen: 9, @@ -1564,12 +1510,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { dragoninite: { name: "Dragoninite", spritenum: 547, - megaStone: "Dragonite-Mega", - megaEvolves: "Dragonite", + megaStone: { "Dragonite": "Dragonite-Mega" }, itemUser: ["Dragonite"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2562, gen: 9, @@ -1615,12 +1559,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { drampanite: { name: "Drampanite", spritenum: 569, - megaStone: "Drampa-Mega", - megaEvolves: "Drampa", + megaStone: { "Drampa": "Drampa-Mega" }, itemUser: ["Drampa"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2585, gen: 9, @@ -1714,12 +1656,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { eelektrossite: { name: "Eelektrossite", spritenum: 556, - megaStone: "Eelektross-Mega", - megaEvolves: "Eelektross", + megaStone: { "Eelektross": "Eelektross-Mega" }, itemUser: ["Eelektross"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2573, gen: 9, @@ -1889,12 +1829,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { emboarite: { name: "Emboarite", spritenum: 552, - megaStone: "Emboar-Mega", - megaEvolves: "Emboar", + megaStone: { "Emboar": "Emboar-Mega" }, itemUser: ["Emboar"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2569, gen: 9, @@ -1946,12 +1884,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { excadrite: { name: "Excadrite", spritenum: 553, - megaStone: "Excadrill-Mega", - megaEvolves: "Excadrill", + megaStone: { "Excadrill": "Excadrill-Mega" }, itemUser: ["Excadrill"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2570, gen: 9, @@ -2031,12 +1967,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { falinksite: { name: "Falinksite", spritenum: 570, - megaStone: "Falinks-Mega", - megaEvolves: "Falinks", + megaStone: { "Falinks": "Falinks-Mega" }, itemUser: ["Falinks"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2586, gen: 9, @@ -2052,12 +1986,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { feraligite: { name: "Feraligite", spritenum: 549, - megaStone: "Feraligatr-Mega", - megaEvolves: "Feraligatr", + megaStone: { "Feraligatr": "Feraligatr-Mega" }, itemUser: ["Feraligatr"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2564, gen: 9, @@ -2252,12 +2184,11 @@ export const Items: import('../sim/dex-items').ItemDataTable = { floettite: { name: "Floettite", spritenum: 562, - megaStone: "Floette-Mega", - megaEvolves: "Floette-Eternal", + megaStone: { "Floette-Eternal": "Floette-Mega" }, itemUser: ["Floette-Eternal"], onTakeItem(item, source) { - if ([item.megaEvolves, item.megaStone].includes(source.baseSpecies.name)) return false; - return true; + return !item.megaStone || (!item.megaStone[source.baseSpecies.name] && + !Object.values(item.megaStone).includes(source.baseSpecies.name)); }, num: 2579, gen: 9, @@ -2397,12 +2328,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { froslassite: { name: "Froslassite", spritenum: 551, - megaStone: "Froslass-Mega", - megaEvolves: "Froslass", + megaStone: { "Froslass": "Froslass-Mega" }, itemUser: ["Froslass"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2566, gen: 9, @@ -2440,12 +2369,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { galladite: { name: "Galladite", spritenum: 616, - megaStone: "Gallade-Mega", - megaEvolves: "Gallade", + megaStone: { "Gallade": "Gallade-Mega" }, itemUser: ["Gallade"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 756, gen: 6, @@ -2474,12 +2401,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { garchompite: { name: "Garchompite", spritenum: 573, - megaStone: "Garchomp-Mega", - megaEvolves: "Garchomp", + megaStone: { "Garchomp": "Garchomp-Mega" }, itemUser: ["Garchomp"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 683, gen: 6, @@ -2488,12 +2413,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { garchompitez: { name: "Garchompite Z", spritenum: 573, - megaStone: "Garchomp-Mega-Z", - megaEvolves: "Garchomp", + megaStone: { "Garchomp": "Garchomp-Mega-Z" }, itemUser: ["Garchomp"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2590, gen: 9, @@ -2502,12 +2425,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { gardevoirite: { name: "Gardevoirite", spritenum: 587, - megaStone: "Gardevoir-Mega", - megaEvolves: "Gardevoir", + megaStone: { "Gardevoir": "Gardevoir-Mega" }, itemUser: ["Gardevoir"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 657, gen: 6, @@ -2516,12 +2437,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { gengarite: { name: "Gengarite", spritenum: 588, - megaStone: "Gengar-Mega", - megaEvolves: "Gengar", + megaStone: { "Gengar": "Gengar-Mega" }, itemUser: ["Gengar"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 656, gen: 6, @@ -2572,12 +2491,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { glalitite: { name: "Glalitite", spritenum: 623, - megaStone: "Glalie-Mega", - megaEvolves: "Glalie", + megaStone: { "Glalie": "Glalie-Mega" }, itemUser: ["Glalie"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 763, gen: 6, @@ -2586,12 +2503,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { glimmoranite: { name: "Glimmoranite", spritenum: 0, - megaStone: "Glimmora-Mega", - megaEvolves: "Glimmora", + megaStone: { "Glimmora": "Glimmora-Mega" }, itemUser: ["Glimmora"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2600, gen: 9, @@ -2609,12 +2524,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { golisopite: { name: "Golisopite", spritenum: 0, - megaStone: "Golisopod-Mega", - megaEvolves: "Golisopod", + megaStone: { "Golisopod": "Golisopod-Mega" }, itemUser: ["Golisopod"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2596, gen: 9, @@ -2623,12 +2536,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { golurkite: { name: "Golurkite", spritenum: 0, - megaStone: "Golurk-Mega", - megaEvolves: "Golurk", + megaStone: { "Golurk": "Golurk-Mega" }, itemUser: ["Golurk"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2594, gen: 9, @@ -2709,13 +2620,11 @@ export const Items: import('../sim/dex-items').ItemDataTable = { greninjite: { name: "Greninjite", spritenum: 560, - megaStone: "Greninja-Mega", - megaEvolves: "Greninja", + megaStone: { "Greninja": "Greninja-Mega" }, itemUser: ["Greninja"], onTakeItem(item, source) { // TODO: Figure out if this works on Greninja-Bond - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2577, gen: 9, @@ -2824,12 +2733,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { gyaradosite: { name: "Gyaradosite", spritenum: 589, - megaStone: "Gyarados-Mega", - megaEvolves: "Gyarados", + megaStone: { "Gyarados": "Gyarados-Mega" }, itemUser: ["Gyarados"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 676, gen: 6, @@ -2877,12 +2784,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { hawluchanite: { name: "Hawluchanite", spritenum: 566, - megaStone: "Hawlucha-Mega", - megaEvolves: "Hawlucha", + megaStone: { "Hawlucha": "Hawlucha-Mega" }, itemUser: ["Hawlucha"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2583, gen: 9, @@ -2919,12 +2824,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { heatranite: { name: "Heatranite", spritenum: 0, - megaStone: "Heatran-Mega", - megaEvolves: "Heatran", + megaStone: { "Heatran": "Heatran-Mega" }, itemUser: ["Heatran"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2592, gen: 9, @@ -2969,12 +2872,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { heracronite: { name: "Heracronite", spritenum: 590, - megaStone: "Heracross-Mega", - megaEvolves: "Heracross", + megaStone: { "Heracross": "Heracross-Mega" }, itemUser: ["Heracross"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 680, gen: 6, @@ -2995,12 +2896,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { houndoominite: { name: "Houndoominite", spritenum: 591, - megaStone: "Houndoom-Mega", - megaEvolves: "Houndoom", + megaStone: { "Houndoom": "Houndoom-Mega" }, itemUser: ["Houndoom"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 666, gen: 6, @@ -3213,12 +3112,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { kangaskhanite: { name: "Kangaskhanite", spritenum: 592, - megaStone: "Kangaskhan-Mega", - megaEvolves: "Kangaskhan", + megaStone: { "Kangaskhan": "Kangaskhan-Mega" }, itemUser: ["Kangaskhan"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 675, gen: 6, @@ -3371,12 +3268,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { latiasite: { name: "Latiasite", spritenum: 629, - megaStone: "Latias-Mega", - megaEvolves: "Latias", + megaStone: { "Latias": "Latias-Mega" }, itemUser: ["Latias"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 684, gen: 6, @@ -3385,12 +3280,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { latiosite: { name: "Latiosite", spritenum: 630, - megaStone: "Latios-Mega", - megaEvolves: "Latios", + megaStone: { "Latios": "Latios-Mega" }, itemUser: ["Latios"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 685, gen: 6, @@ -3571,12 +3464,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { lopunnite: { name: "Lopunnite", spritenum: 626, - megaStone: "Lopunny-Mega", - megaEvolves: "Lopunny", + megaStone: { "Lopunny": "Lopunny-Mega" }, itemUser: ["Lopunny"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 768, gen: 6, @@ -3601,12 +3492,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { lucarionite: { name: "Lucarionite", spritenum: 594, - megaStone: "Lucario-Mega", - megaEvolves: "Lucario", + megaStone: { "Lucario": "Lucario-Mega" }, itemUser: ["Lucario"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 673, gen: 6, @@ -3615,12 +3504,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { lucarionitez: { name: "Lucarionite Z", spritenum: 594, - megaStone: "Lucario-Mega-Z", - megaEvolves: "Lucario", + megaStone: { "Lucario": "Lucario-Mega-Z" }, itemUser: ["Lucario"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2591, gen: 9, @@ -3772,12 +3659,14 @@ export const Items: import('../sim/dex-items').ItemDataTable = { magearnite: { name: "Magearnite", spritenum: 0, - megaStone: ["Magearna-Mega", "Magearna-Original-Mega"], - megaEvolves: ["Magearna", "Magearna-Original"], + megaStone: { + "Magearna": "Magearna-Mega", + "Magearna-Original": "Magearna-Original-Mega", + }, itemUser: ["Magearna", "Magearna-Original"], onTakeItem(item, source) { - if (item.megaEvolves!.includes(source.baseSpecies.baseSpecies)) return false; - return true; + return !item.megaStone || (!item.megaStone[source.baseSpecies.name] && + !Object.values(item.megaStone).includes(source.baseSpecies.name)); }, num: 2597, gen: 9, @@ -3860,12 +3749,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { malamarite: { name: "Malamarite", spritenum: 563, - megaStone: "Malamar-Mega", - megaEvolves: "Malamar", + megaStone: { "Malamar": "Malamar-Mega" }, itemUser: ["Malamar"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2580, gen: 9, @@ -3883,12 +3770,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { manectite: { name: "Manectite", spritenum: 596, - megaStone: "Manectric-Mega", - megaEvolves: "Manectric", + megaStone: { "Manectric": "Manectric-Mega" }, itemUser: ["Manectric"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 682, gen: 6, @@ -3943,12 +3828,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { mawilite: { name: "Mawilite", spritenum: 598, - megaStone: "Mawile-Mega", - megaEvolves: "Mawile", + megaStone: { "Mawile": "Mawile-Mega" }, itemUser: ["Mawile"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 681, gen: 6, @@ -3977,12 +3860,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { medichamite: { name: "Medichamite", spritenum: 599, - megaStone: "Medicham-Mega", - megaEvolves: "Medicham", + megaStone: { "Medicham": "Medicham-Mega" }, itemUser: ["Medicham"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 665, gen: 6, @@ -3991,12 +3872,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { meganiumite: { name: "Meganiumite", spritenum: 548, - megaStone: "Meganium-Mega", - megaEvolves: "Meganium", + megaStone: { "Meganium": "Meganium-Mega" }, itemUser: ["Meganium"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2563, gen: 9, @@ -4043,12 +3922,14 @@ export const Items: import('../sim/dex-items').ItemDataTable = { meowsticite: { name: "Meowsticite", spritenum: 0, - megaStone: ["Meowstic-M-Mega", "Meowstic-F-Mega"], - megaEvolves: ["Meowstic", "Meowstic-F"], + megaStone: { + "Meowstic": "Meowstic-M-Mega", + "Meowstic-F": "Meowstic-F-Mega", + }, itemUser: ["Meowstic", "Meowstic-F"], onTakeItem(item, source) { - if (item.megaEvolves!.includes(source.baseSpecies.baseSpecies)) return false; - return true; + return !item.megaStone || (!item.megaStone[source.baseSpecies.name] && + !Object.values(item.megaStone).includes(source.baseSpecies.name)); }, num: 2594, gen: 9, @@ -4057,12 +3938,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { metagrossite: { name: "Metagrossite", spritenum: 618, - megaStone: "Metagross-Mega", - megaEvolves: "Metagross", + megaStone: { "Metagross": "Metagross-Mega" }, itemUser: ["Metagross"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 758, gen: 6, @@ -4164,12 +4043,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { mewtwonitex: { name: "Mewtwonite X", spritenum: 600, - megaStone: "Mewtwo-Mega-X", - megaEvolves: "Mewtwo", + megaStone: { "Mewtwo": "Mewtwo-Mega-X" }, itemUser: ["Mewtwo"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 662, gen: 6, @@ -4178,12 +4055,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { mewtwonitey: { name: "Mewtwonite Y", spritenum: 601, - megaStone: "Mewtwo-Mega-Y", - megaEvolves: "Mewtwo", + megaStone: { "Mewtwo": "Mewtwo-Mega-Y" }, itemUser: ["Mewtwo"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 663, gen: 6, @@ -4677,12 +4552,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { pidgeotite: { name: "Pidgeotite", spritenum: 622, - megaStone: "Pidgeot-Mega", - megaEvolves: "Pidgeot", + megaStone: { "Pidgeot": "Pidgeot-Mega" }, itemUser: ["Pidgeot"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 762, gen: 6, @@ -4726,12 +4599,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { pinsirite: { name: "Pinsirite", spritenum: 602, - megaStone: "Pinsir-Mega", - megaEvolves: "Pinsir", + megaStone: { "Pinsir": "Pinsir-Mega" }, itemUser: ["Pinsir"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 671, gen: 6, @@ -5082,12 +4953,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { pyroarite: { name: "Pyroarite", spritenum: 561, - megaStone: "Pyroar-Mega", - megaEvolves: "Pyroar", + megaStone: { "Pyroar": "Pyroar-Mega" }, itemUser: ["Pyroar"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2578, gen: 9, @@ -5161,13 +5030,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { raichunitex: { name: "Raichunite X", spritenum: 0, - megaStone: "Raichu-Mega-X", - megaEvolves: "Raichu", + megaStone: { "Raichu": "Raichu-Mega-X" }, itemUser: ["Raichu"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.name || - item.megaStone === source.baseSpecies.name) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2585, gen: 9, @@ -5176,13 +5042,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { raichunitey: { name: "Raichunite Y", spritenum: 0, - megaStone: "Raichu-Mega-Y", - megaEvolves: "Raichu", + megaStone: { "Raichu": "Raichu-Mega-Y" }, itemUser: ["Raichu"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.name || - item.megaStone === source.baseSpecies.name) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2586, gen: 9, @@ -5561,12 +5424,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { sablenite: { name: "Sablenite", spritenum: 614, - megaStone: "Sableye-Mega", - megaEvolves: "Sableye", + megaStone: { "Sableye": "Sableye-Mega" }, itemUser: ["Sableye"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 754, gen: 6, @@ -5640,12 +5501,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { salamencite: { name: "Salamencite", spritenum: 627, - megaStone: "Salamence-Mega", - megaEvolves: "Salamence", + megaStone: { "Salamence": "Salamence-Mega" }, itemUser: ["Salamence"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 769, gen: 6, @@ -5654,12 +5513,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { sceptilite: { name: "Sceptilite", spritenum: 613, - megaStone: "Sceptile-Mega", - megaEvolves: "Sceptile", + megaStone: { "Sceptile": "Sceptile-Mega" }, itemUser: ["Sceptile"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 753, gen: 6, @@ -5668,12 +5525,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { scizorite: { name: "Scizorite", spritenum: 605, - megaStone: "Scizor-Mega", - megaEvolves: "Scizor", + megaStone: { "Scizor": "Scizor-Mega" }, itemUser: ["Scizor"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 670, gen: 6, @@ -5682,12 +5537,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { scolipite: { name: "Scolipite", spritenum: 554, - megaStone: "Scolipede-Mega", - megaEvolves: "Scolipede", + megaStone: { "Scolipede": "Scolipede-Mega" }, itemUser: ["Scolipede"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2571, gen: 9, @@ -5708,12 +5561,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { scovillainite: { name: "Scovillainite", spritenum: 0, - megaStone: "Scovillain-Mega", - megaEvolves: "Scovillain", + megaStone: { "Scovillain": "Scovillain-Mega" }, itemUser: ["Scovillain"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2599, gen: 9, @@ -5722,12 +5573,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { scraftinite: { name: "Scraftinite", spritenum: 555, - megaStone: "Scrafty-Mega", - megaEvolves: "Scrafty", + megaStone: { "Scrafty": "Scrafty-Mega" }, itemUser: ["Scrafty"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2572, gen: 9, @@ -5767,12 +5616,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { sharpedonite: { name: "Sharpedonite", spritenum: 619, - megaStone: "Sharpedo-Mega", - megaEvolves: "Sharpedo", + megaStone: { "Sharpedo": "Sharpedo-Mega" }, itemUser: ["Sharpedo"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 759, gen: 6, @@ -5914,12 +5761,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { skarmorite: { name: "Skarmorite", spritenum: 550, - megaStone: "Skarmory-Mega", - megaEvolves: "Skarmory", + megaStone: { "Skarmory": "Skarmory-Mega" }, itemUser: ["Skarmory"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2565, gen: 9, @@ -5958,12 +5803,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { slowbronite: { name: "Slowbronite", spritenum: 620, - megaStone: "Slowbro-Mega", - megaEvolves: "Slowbro", + megaStone: { "Slowbro": "Slowbro-Mega" }, itemUser: ["Slowbro"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 760, gen: 6, @@ -6129,12 +5972,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { staraptite: { name: "Staraptite", spritenum: 0, - megaStone: "Staraptor-Mega", - megaEvolves: "Staraptor", + megaStone: { "Staraptor": "Staraptor-Mega" }, itemUser: ["Staraptor"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2589, gen: 9, @@ -6175,12 +6016,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { starminite: { name: "Starminite", spritenum: 546, - megaStone: "Starmie-Mega", - megaEvolves: "Starmie", + megaStone: { "Starmie": "Starmie-Mega" }, itemUser: ["Starmie"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2561, gen: 9, @@ -6224,12 +6063,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { steelixite: { name: "Steelixite", spritenum: 621, - megaStone: "Steelix-Mega", - megaEvolves: "Steelix", + megaStone: { "Steelix": "Steelix-Mega" }, itemUser: ["Steelix"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 761, gen: 6, @@ -6338,12 +6175,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { swampertite: { name: "Swampertite", spritenum: 612, - megaStone: "Swampert-Mega", - megaEvolves: "Swampert", + megaStone: { "Swampert": "Swampert-Mega" }, itemUser: ["Swampert"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 752, gen: 6, @@ -6426,12 +6261,15 @@ export const Items: import('../sim/dex-items').ItemDataTable = { tatsugirinite: { name: "Tatsugirinite", spritenum: 0, - megaStone: ["Tatsugiri-Curly-Mega", "Tatsugiri-Droopy-Mega", "Tatsugiri-Stretchy-Mega"], - megaEvolves: ["Tatsugiri", "Tatsugiri-Droopy", "Tatsugiri-Stretchy"], + megaStone: { + "Tatsugiri": "Tatsugiri-Curly-Mega", + "Tatsugiri-Droopy": "Tatsugiri-Droopy-Mega", + "Tatsugiri-Stretchy": "Tatsugiri-Stretchy-Mega", + }, itemUser: ["Tatsugiri", "Tatsugiri-Droopy", "Tatsugiri-Stretchy"], onTakeItem(item, source) { - if (item.megaEvolves!.includes(source.baseSpecies.baseSpecies)) return false; - return true; + return !item.megaStone || (!item.megaStone[source.baseSpecies.name] && + !Object.values(item.megaStone).includes(source.baseSpecies.name)); }, num: 2601, gen: 9, @@ -7549,12 +7387,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { tyranitarite: { name: "Tyranitarite", spritenum: 607, - megaStone: "Tyranitar-Mega", - megaEvolves: "Tyranitar", + megaStone: { "Tyranitar": "Tyranitar-Mega" }, itemUser: ["Tyranitar"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 669, gen: 6, @@ -7628,12 +7464,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { venusaurite: { name: "Venusaurite", spritenum: 608, - megaStone: "Venusaur-Mega", - megaEvolves: "Venusaur", + megaStone: { "Venusaur": "Venusaur-Mega" }, itemUser: ["Venusaur"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 659, gen: 6, @@ -7642,12 +7476,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { victreebelite: { name: "Victreebelite", spritenum: 545, - megaStone: "Victreebel-Mega", - megaEvolves: "Victreebel", + megaStone: { "Victreebel": "Victreebel-Mega" }, itemUser: ["Victreebel"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2560, gen: 9, @@ -7976,12 +7808,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { zeraorite: { name: "Zeraorite", spritenum: 0, - megaStone: "Zeraora-Mega", - megaEvolves: "Zeraora", + megaStone: { "Zeraora": "Zeraora-Mega" }, itemUser: ["Zeraora"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2598, gen: 9, @@ -8006,12 +7836,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { zygardite: { name: "Zygardite", spritenum: 568, - megaStone: "Zygarde-Mega", - megaEvolves: "Zygarde-Complete", + megaStone: { "Zygarde-Complete": "Zygarde-Mega" }, itemUser: ["Zygarde-Complete"], onTakeItem(item, source) { - if (source.baseSpecies.baseSpecies === 'Zygarde') return false; - return true; + return source.baseSpecies.baseSpecies !== 'Zygarde'; }, num: 2584, gen: 9, @@ -8303,12 +8131,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { crucibellite: { name: "Crucibellite", spritenum: 577, - megaStone: "Crucibelle-Mega", - megaEvolves: "Crucibelle", + megaStone: { "Crucibelle": "Crucibelle-Mega" }, itemUser: ["Crucibelle"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: -1, gen: 6, diff --git a/data/learnsets.ts b/data/learnsets.ts index f93d6231f6..5ae0ca4a50 100644 --- a/data/learnsets.ts +++ b/data/learnsets.ts @@ -32244,18 +32244,22 @@ export const Learnsets: import('../sim/dex-species').LearnsetDataTable = { smeargle: { learnset: { captivate: ["5D"], - falseswipe: ["5S1"], - flamethrower: ["6S2"], - furyswipes: ["6S2"], - meanlook: ["5S1"], - odorsleuth: ["5S1"], - seismictoss: ["6S2"], - sketch: ["9L1", "7L1", "7V", "6L1", "6S2", "5L1", "5D", "4L1", "3L1", "3S0"], + doubleslap: ["3S1"], + falseswipe: ["5S2"], + flamethrower: ["6S3"], + furyswipes: ["6S3"], + irontail: ["3S1"], + meanlook: ["5S2"], + odorsleuth: ["5S2"], + seismictoss: ["6S3"], + sketch: ["9L1", "7L1", "7V", "6L1", "6S3", "5L1", "5D", "4L1", "3L1", "3S1", "3S0"], sleeptalk: ["5D"], - spore: ["5S1"], + spore: ["5S2"], + tailwhip: ["3S1"], }, eventData: [ {generation: 3, level: 10, gender: "M", abilities: ["owntempo"], moves: ["sketch"], pokeball: "pokeball"}, + {generation: 3, level: 45, abilities: ["owntempo"], moves: ["sketch", "tailwhip", "doubleslap", "irontail"]}, {generation: 5, level: 50, gender: "F", nature: "Jolly", ivs: {atk: 31, spe: 31}, abilities: ["technician"], moves: ["falseswipe", "spore", "odorsleuth", "meanlook"], pokeball: "cherishball"}, {generation: 6, level: 40, gender: "M", nature: "Jolly", abilities: ["owntempo"], moves: ["sketch", "furyswipes", "seismictoss", "flamethrower"], pokeball: "cherishball"}, ], @@ -53582,7 +53586,7 @@ export const Learnsets: import('../sim/dex-species').LearnsetDataTable = { {generation: 6, level: 1, moves: ["tailglow", "bubble", "watersport", "heartswap"], pokeball: "cherishball"}, {generation: 6, level: 100, moves: ["tailglow", "bubble", "watersport"], pokeball: "cherishball"}, {generation: 7, level: 15, moves: ["tailglow", "waterpulse", "aquaring", "heartswap"], pokeball: "cherishball"}, - {generation: 8, moves: ['tailglow', 'watergun'], pokeball: 'pokeball', source: "gen8bdsp"}, + {generation: 8, level: 1, moves: ['tailglow', 'watergun'], pokeball: 'pokeball', source: "gen8bdsp"}, {generation: 8, level: 50, moves: ["waterpulse", "zenheadbutt", "moonblast", "bubble"], source: "gen8legends"}, {generation: 9, level: 50, shiny: true, nature: "Calm", ivs: {hp: 31, atk: 20, def: 31, spa: 20, spd: 31, spe: 20}, moves: ["bubblebeam", "acidarmor", "whirlpool", "waterpulse"], pokeball: "cherishball"}, ], @@ -89284,7 +89288,7 @@ export const Learnsets: import('../sim/dex-species').LearnsetDataTable = { waterpulse: ["9M"], }, eventData: [ - {generation: 9, moves: ["bodyslam", "amnesia", "icespinner", "doubleedge"]}, + {generation: 9, level: 50, moves: ["bodyslam", "amnesia", "icespinner", "doubleedge"]}, ], }, frigibax: { diff --git a/data/mods/biomechmons/moves.ts b/data/mods/biomechmons/moves.ts index a2b6665cda..1ab2c93520 100644 --- a/data/mods/biomechmons/moves.ts +++ b/data/mods/biomechmons/moves.ts @@ -223,6 +223,24 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, skillswap: { inherit: true, + onTryHit(target, source) { + const targetAbility = target.getAbility(); + const sourceAbility = source.getAbility(); + if (sourceAbility.flags['failskillswap'] || targetAbility.flags['failskillswap'] || target.volatiles['dynamax']) { + return false; + } + let sourceCanBeSet = this.runEvent('SetAbility', source, source, this.effect, targetAbility); + if (!this.dex.abilities.get(sourceAbility).exists && this.dex.items.get(sourceAbility.id).exists) { + sourceCanBeSet = this.runEvent('TakeItem', source, source, this.effect, this.dex.items.get(sourceAbility.id)); + } + + if (!sourceCanBeSet) return sourceCanBeSet; + let targetCanBeSet = this.runEvent('SetAbility', target, source, this.effect, sourceAbility); + if (!this.dex.abilities.get(targetAbility).exists && this.dex.items.get(targetAbility.id).exists) { + targetCanBeSet = this.runEvent('TakeItem', target, source, this.effect, this.dex.items.get(targetAbility.id)); + } + if (!targetCanBeSet) return targetCanBeSet; + }, onHit(target, source, move) { const targetAbility = target.getAbility(); const sourceAbility = source.getAbility(); diff --git a/data/mods/biomechmons/scripts.ts b/data/mods/biomechmons/scripts.ts index 34920e4fac..199d54b805 100644 --- a/data/mods/biomechmons/scripts.ts +++ b/data/mods/biomechmons/scripts.ts @@ -63,10 +63,16 @@ export const Scripts: ModdedBattleScriptsData = { ); }, setAbility(ability, source, sourceEffect, isFromFormeChange = false, isTransform = false) { + const allThings = new Set([ + ...(this.m.scrambled.abilities as { thing: string }[]).map(e => e.thing), + ...(this.m.scrambled.items as { thing: string }[]).map(e => e.thing), + ...(this.m.scrambled.moves as { thing: string }[]).map(e => e.thing), + this.ability, ...this.moveSlots.map(e => e.move), this.item, + ].map(this.battle.toID)); + let isBMMAbil = false; let isOldBMMAbil = false; if (!this.hp) return false; - if (!this.battle.dex.abilities.get(ability).exists) isBMMAbil = true; if (typeof ability === 'string') { if (this.battle.dex.abilities.get(ability).exists) { ability = this.battle.dex.abilities.get(ability); @@ -85,13 +91,18 @@ export const Scripts: ModdedBattleScriptsData = { } as Ability; } } + if (ability.name.length && !this.battle.dex.abilities.get(ability).exists) isBMMAbil = true; if (!sourceEffect && this.battle.effect) sourceEffect = this.battle.effect; let oldAbility; if (this.battle.dex.abilities.get(this.ability).exists) { oldAbility = this.battle.dex.abilities.get(this.ability); } else { let abil = this.battle.dex.items.getByID(this.ability) as Item | Move; - if (!abil.exists) abil = this.battle.dex.moves.getByID(this.ability); + if (!abil.exists) { + abil = this.battle.dex.moves.getByID(this.ability); + } else { + if (!this.battle.runEvent('TakeItem', this, source, null, abil as Item)) return false; + } oldAbility = { id: this.ability, name: abil.name || this.ability, @@ -103,6 +114,9 @@ export const Scripts: ModdedBattleScriptsData = { } as Ability; isOldBMMAbil = true; } + + if (allThings.has(ability.id)) return false; + if (!isFromFormeChange) { if (ability.flags['cantsuppress'] || this.getAbility().flags['cantsuppress']) return false; } @@ -195,14 +209,22 @@ export const Scripts: ModdedBattleScriptsData = { if (!source) source = this; if (this.battle.gen <= 4) { if (source.itemKnockedOff) return false; - if (this.battle.toID(this.ability) === 'multitype') return false; - if (this.battle.toID(source.ability) === 'multitype') return false; + if (this.battle.toID(this.ability) === 'multitype' || (this.m.scrambled.abilities as { thing: string }[]) + .findIndex(e => this.battle.toID(e.thing) === 'multitype') >= 0) { + return false; + } + if (this.battle.toID(source.ability) === 'multitype' || (source.m.scrambled.abilities as { thing: string }[]) + .findIndex(e => this.battle.toID(e.thing) === 'multitype') >= 0) { + return false; + } } const item = this.getItem(); if (this.battle.runEvent('TakeItem', this, source, null, item)) { this.item = ''; let wrongSlot = (this.m.scrambled.abilities as { inSlot: string }[]).findIndex(e => e.inSlot === 'Item'); if (wrongSlot >= 0) { + const dexAbil = this.battle.dex.abilities.get(this.m.scrambled.abilities[wrongSlot].thing); + if (dexAbil.flags['failskillswap']) return false; this.removeVolatile('ability:' + this.battle.toID(this.m.scrambled.abilities[wrongSlot].thing)); this.m.scrambled.abilities.splice(wrongSlot, 1); } else if ((this.m.scrambled.moves as { inSlot: string }[]).findIndex(e => e.inSlot === 'Item') >= 0) { @@ -225,17 +247,27 @@ export const Scripts: ModdedBattleScriptsData = { return false; }, setItem(item, source, effect) { + const allThings = new Set([ + ...(this.m.scrambled.abilities as { thing: string }[]).map(e => e.thing), + ...(this.m.scrambled.items as { thing: string }[]).map(e => e.thing), + ...(this.m.scrambled.moves as { thing: string }[]).map(e => e.thing), + this.ability, ...this.moveSlots.map(e => e.move), this.item, + ].map(this.battle.toID)); + let isBMMItem = false; let isOldBMMItem = false; if (!this.hp || !this.isActive) return false; - if (!this.battle.dex.items.get(item).exists) isBMMItem = true; if (typeof item === 'string') { - if (this.battle.dex.items.get(item).exists) { + if (!item.length || this.battle.dex.items.get(item).exists) { item = this.battle.dex.items.get(item); } else { const itemString = item; let newData = this.battle.dex.abilities.get(itemString) as Ability | Move; - if (!newData.exists) newData = this.battle.dex.moves.get(itemString); + if (!newData.exists) { + newData = this.battle.dex.moves.get(itemString); + } else { + if ((newData as Ability).flags['failskillswap']) return false; + } item = { id: newData.id || itemString, name: newData.name || itemString, @@ -246,6 +278,8 @@ export const Scripts: ModdedBattleScriptsData = { } as Item; } } + if (item.name.length && !this.battle.dex.items.get(item).exists) isBMMItem = true; + if (allThings.has(item.id)) return false; const effectid = this.battle.effect ? this.battle.effect.id : ''; if (RESTORATIVE_BERRIES.has('leppaberry' as ID)) { const inflicted = ['trick', 'switcheroo'].includes(effectid); @@ -340,9 +374,11 @@ export const Scripts: ModdedBattleScriptsData = { const isBMM = this.volatiles[item.id]?.inSlot; if (isBMM) { + const dexItem = this.battle.dex.items.get(item.name); this.removeVolatile(item.id); - this.m.scrambled.items.splice((this.m.scrambled.items as { thing: string, inSlot: string }[]).findIndex(e => - e.thing === this.battle.toID(item.name) && e.inSlot === isBMM), 1); + const itemIndex = (this.m.scrambled.items as { thing: string, inSlot: string }[]).findIndex(e => + this.battle.toID(e.thing) === dexItem.id && e.inSlot === isBMM); + if (itemIndex >= 0) this.m.scrambled.items.splice(itemIndex, 1); if (isBMM === 'Ability') this.setAbility('No Ability'); } else { this.lastItem = this.item; @@ -391,9 +427,11 @@ export const Scripts: ModdedBattleScriptsData = { const isBMM = this.volatiles[item.id]?.inSlot; if (isBMM) { + const dexItem = this.battle.dex.items.get(item.name); this.removeVolatile(item.id); - this.m.scrambled.items.splice((this.m.scrambled.items as { thing: string, inSlot: string }[]).findIndex(e => - e.thing === this.battle.toID(item.name) && e.inSlot === isBMM), 1); + const itemIndex = (this.m.scrambled.items as { thing: string, inSlot: string }[]).findIndex(e => + this.battle.toID(e.thing) === dexItem.id && e.inSlot === isBMM); + if (itemIndex >= 0) this.m.scrambled.items.splice(itemIndex, 1); if (isBMM === 'Ability') this.setAbility('No Ability'); } else { this.lastItem = this.item; diff --git a/data/mods/chatbats/abilities.ts b/data/mods/chatbats/abilities.ts index 5735325348..e2039820ce 100644 --- a/data/mods/chatbats/abilities.ts +++ b/data/mods/chatbats/abilities.ts @@ -953,4 +953,41 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa }, shortDesc: "This Pokemon can poison a Pokemon regardless of its typing and hit them with Poison moves.", }, + jellobody: { + onTryHit(pokemon, target, move) { + if (move.selfSwitch) { + this.add('-immune', pokemon, '[from] ability: Jello Body'); + this.heal(target.baseMaxhp / 2); + return null; + } + }, + onModifyMove(move, source, target) { + move.drain = [1, 2]; + }, + flags: { breakable: 1 }, + name: "Jello Body", + rating: 5, + num: -122, + shortDesc: "Immune to pivot moves, heals 50% HP when hit by one. All moves drain 50%.", + }, + nibblenibble: { + onPrepareHit(source, target, move) { + if (move.category === 'Status' || move.multihit || move.flags['noparentalbond'] || move.flags['charge'] || + move.flags['futuremove'] || move.spreadHit || move.isZ || move.isMax || !move.flags['bite']) return; + move.multihit = 2; + move.multihitType = 'parentalbond'; + }, + // Damage modifier implemented in BattleActions#modifyDamage() + onSourceModifySecondaries(secondaries, target, source, move) { + if (move.multihitType === 'parentalbond' && move.id === 'secretpower' && move.hit < 2) { + // hack to prevent accidentally suppressing King's Rock/Razor Fang + return secondaries.filter(effect => effect.volatileStatus === 'flinch'); + } + }, + flags: {}, + name: "Nibble Nibble", + rating: 5, + num: -123, + shortDesc: "Parental Bond but for Bite moves.", + }, }; diff --git a/data/mods/chatbats/items.ts b/data/mods/chatbats/items.ts index d665b92d55..a88b72957d 100644 --- a/data/mods/chatbats/items.ts +++ b/data/mods/chatbats/items.ts @@ -13,12 +13,10 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { masquerainite: { name: "Masquerainite", spritenum: 1, - megaStone: "Masquerain-Mega", - megaEvolves: "Masquerain", + megaStone: { "Masquerain": "Masquerain-Mega" }, itemUser: ["Masquerain"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: -1, gen: 9, @@ -59,12 +57,10 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { typhlosionite: { name: "Typhlosionite", spritenum: 1, - megaStone: "Typhlosion-Mega", - megaEvolves: "Typhlosion", + megaStone: { "Typhlosion": "Typhlosion-Mega" }, itemUser: ["Typhlosion"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: -2, gen: 9, @@ -127,14 +123,28 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, onDamagePriority: -40, onDamage(damage, target, source, effect) { - const chance = Math.max(Math.floor(target.hp / target.maxhp), 10); + const chance = Math.max(Math.floor(100 - (target.maxhp - target.hp)), 10); if (this.randomChance(chance, 100) && damage >= target.hp && effect && effect.effectType === 'Move') { this.add("-activate", target, "item: Focus Band"); return target.hp - 1; + } else { + return damage; } }, num: 230, gen: 2, desc: "Chance to survive attack equal to percentage of remaining HP, minimum 10%.", }, + raticite: { + name: "Raticite", + spritenum: 1, + megaStone: { "Raticate": "Raticate-Mega" }, + itemUser: ["Raticate"], + onTakeItem(item, source) { + return !item.megaStone?.[source.baseSpecies.baseSpecies]; + }, + num: -3, + gen: 9, + desc: "If held by a Raticate, this item allows it to Mega Evolve in battle.", + }, }; diff --git a/data/mods/chatbats/moves.ts b/data/mods/chatbats/moves.ts index a0b49c8ed8..ba238506fb 100644 --- a/data/mods/chatbats/moves.ts +++ b/data/mods/chatbats/moves.ts @@ -1311,10 +1311,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.add('-fail', source, 'move: Crowverload'); return this.NOT_FAIL; } - if (source.hp <= source.maxhp / 4) { - this.add('-fail', source, 'move: Substitute', '[weak]'); - return this.NOT_FAIL; - } }, onAfterMove(source, target, move) { this.actions.useMove('substitute', source, { }); @@ -1532,16 +1528,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { return false; } }, - onTryHeal(damage, target, source, effect) { - if (effect && (effect.id === 'zpower' || (effect as Move).isZ)) return damage; - if (source && target !== source && target.hp !== target.maxhp && effect.name === "Pollen Puff") { - this.attrLastMove('[still]'); - // FIXME: Wrong error message, correct one not supported yet - this.add('cant', source, 'move: Electric Terrain', effect); - return null; - } - return false; - }, onFieldResidualOrder: 27, onFieldResidualSubOrder: 7, onFieldEnd() { @@ -1635,6 +1621,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { target: "normal", type: "Normal", contestType: "Cute", + shortDesc: "Present but better.", }, sinisterarrows: { num: -1016, @@ -1712,9 +1699,54 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { target: "normal", type: "Ghost", contestType: "Clever", + shortDesc: "Hits for 4 turns, even if user switches out.", }, mortalspin: { inherit: true, category: "Special", }, + lastbreakfast: { + num: -1020, + accuracy: 100, + basePower: 80, + category: "Physical", + name: "Last Breakfast", + pp: 15, + priority: 0, + flags: { protect: 1, mirror: 1, metronome: 1, contact: 1, bite: 1 }, + onHit(target, source, move) { + const numberBerries = 0 + 1 * Number(source.side.totalFainted); + for (let i = 0; i < numberBerries; i++) { + const possibleBerries = ['aguavberry', 'apicotberry', 'enigmaberry', 'figyberry', 'ganlonberry', 'iapapaberry', + 'keeberry', 'lansatberry', 'leppaberry', 'liechiberry', 'lumberry', 'magoberry', + 'marangaberry', 'micleberry', + 'oranberry', 'petayaberry', 'salacberry', 'sitrusberry', 'starfberry', 'wikiberry', + 'aspearberry', 'cheriberry', 'chestoberry', 'lumberry', 'pechaberry', 'rawstberry', 'persimberry']; + const chosenBerry = this.sample(possibleBerries); + const berry = this.dex.items.get(chosenBerry); + if (source.hp && berry.isBerry) { + if (this.singleEvent('Eat', berry, null, source, source, move)) { + this.runEvent('EatItem', source, source, move, berry); + } + if (berry.onEat) source.ateBerry = true; + } + } + }, + onTryMove() { + this.attrLastMove('[still]'); + }, + onPrepareHit(target, source) { + this.add('-anim', source, 'Curse', target); + this.add('-anim', source, 'Bug Bite', target); + }, + secondary: null, + target: "normal", + type: "Ghost", + contestType: "Cute", + shortDesc: "Eats X random berries, where X is fainted teammates.", + }, + superfang: { + inherit: true, + flags: { contact: 1, protect: 1, mirror: 1, metronome: 1, bite: 1 }, + }, }; diff --git a/data/mods/chatbats/pokedex.ts b/data/mods/chatbats/pokedex.ts index 05bb622cb6..6d4f878feb 100644 --- a/data/mods/chatbats/pokedex.ts +++ b/data/mods/chatbats/pokedex.ts @@ -482,10 +482,33 @@ export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable ogerponcornerstone: { inherit: true, abilities: { 0: "Solid Rock" }, - types: ["Psychic", "Normal"], }, glimmora: { inherit: true, abilities: { 0: "Corrosion" }, }, + wobbuffet: { + inherit: true, + abilities: { 0: "Jello Body" }, + }, + raticate: { + inherit: true, + abilities: { 0: "Hustle" }, + baseStats: { hp: 90, atk: 81, def: 60, spa: 50, spd: 70, spe: 97 }, + }, + raticatemega: { + num: -977, + name: "Raticate-Mega", + baseSpecies: "Raticate", + forme: "Mega", + types: ["Normal", "Ghost"], + genderRatio: { M: 0.5, F: 0.5 }, + baseStats: { hp: 90, atk: 105, def: 60, spa: 50, spd: 70, spe: 173 }, + abilities: { 0: "Nibble Nibble" }, + heightm: 0.7, + weightkg: 5, + color: "Black", + eggGroups: ["Field"], + requiredItem: "Raticite", + }, }; diff --git a/data/mods/chatbats/scripts.ts b/data/mods/chatbats/scripts.ts index aec77f7f88..207d563386 100644 --- a/data/mods/chatbats/scripts.ts +++ b/data/mods/chatbats/scripts.ts @@ -294,5 +294,11 @@ export const Scripts: ModdedBattleScriptsData = { this.modData('Learnsets', 'glimmora').learnset.icebeam = ['9L1']; this.modData('Learnsets', 'glimmora').learnset.malignantchain = ['9L1']; + + this.modData('Learnsets', 'wobbuffet').learnset.nightshade = ['9L1']; + this.modData('Learnsets', 'wobbuffet').learnset.guillotine = ['9L1']; + this.modData('Learnsets', 'wobbuffet').learnset.shedtail = ['9L1']; + + this.modData('Learnsets', 'raticate').learnset.lastbreakfast = ['9L1']; }, }; diff --git a/data/mods/gen2/formats-data.ts b/data/mods/gen2/formats-data.ts index 29b2258e86..c0618e54e9 100644 --- a/data/mods/gen2/formats-data.ts +++ b/data/mods/gen2/formats-data.ts @@ -12,7 +12,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat tier: "LC", }, charmeleon: { - tier: "ZU", + tier: "ZUBL", }, charizard: { tier: "UUBL", @@ -57,7 +57,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat tier: "LC", }, raticate: { - tier: "NU", + tier: "PU", }, spearow: { tier: "LC", @@ -69,7 +69,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat tier: "LC", }, arbok: { - tier: "NU", + tier: "PU", }, pichu: { tier: "LC", @@ -267,7 +267,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat tier: "UU", }, farfetchd: { - tier: "NU", + tier: "PU", }, doduo: { tier: "ZU", @@ -345,10 +345,10 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat tier: "NU", }, hitmonchan: { - tier: "PUBL", + tier: "PU", }, hitmontop: { - tier: "PU", + tier: "NU", }, lickitung: { tier: "NU", @@ -540,7 +540,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat tier: "LC", }, furret: { - tier: "PUBL", + tier: "PU", }, hoothoot: { tier: "LC", @@ -558,7 +558,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat tier: "LC", }, ariados: { - tier: "ZU", + tier: "ZUBL", }, chinchou: { tier: "NU", @@ -591,7 +591,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat tier: "LC", }, azumarill: { - tier: "NU", + tier: "PU", }, sudowoodo: { tier: "NU", @@ -645,7 +645,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat tier: "OU", }, dunsparce: { - tier: "NU", + tier: "PU", }, gligar: { tier: "UU", @@ -705,7 +705,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat tier: "OU", }, houndour: { - tier: "NU", + tier: "PU", }, houndoom: { tier: "UUBL", diff --git a/data/mods/gen2/moves.ts b/data/mods/gen2/moves.ts index 1aadb96470..a93ee5c525 100644 --- a/data/mods/gen2/moves.ts +++ b/data/mods/gen2/moves.ts @@ -573,6 +573,15 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, pursuit: { inherit: true, + beforeTurnCallback(pokemon, target) { + if (pokemon.isAlly(target)) return; + target.addVolatile('pursuit'); + const data = target.volatiles['pursuit']; + if (!data.sources) { + data.sources = []; + } + data.sources.push(pokemon); + }, onModifyMove() {}, condition: { duration: 1, diff --git a/data/mods/gen3/formats-data.ts b/data/mods/gen3/formats-data.ts index d56a3693da..e87cfe3add 100644 --- a/data/mods/gen3/formats-data.ts +++ b/data/mods/gen3/formats-data.ts @@ -63,7 +63,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat tier: "LC", }, fearow: { - tier: "UU", + tier: "RUBL", }, ekans: { tier: "LC", @@ -312,7 +312,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat tier: "ZU", }, hypno: { - tier: "UU", + tier: "RU", }, krabby: { tier: "LC", @@ -930,7 +930,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat tier: "LC", }, manectric: { - tier: "UU", + tier: "RU", }, plusle: { tier: "NU", diff --git a/data/mods/gen3/moves.ts b/data/mods/gen3/moves.ts index 9764e11df8..191b050808 100644 --- a/data/mods/gen3/moves.ts +++ b/data/mods/gen3/moves.ts @@ -578,6 +578,20 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { inherit: true, basePower: 70, }, + pursuit: { + inherit: true, + beforeTurnCallback(pokemon, target) { + if (['frz', 'slp'].includes(pokemon.status) || + (pokemon.hasAbility('truant') && pokemon.truantTurn)) return; + if (pokemon.isAlly(target)) return; + target.addVolatile('pursuit'); + const data = target.volatiles['pursuit']; + if (!data.sources) { + data.sources = []; + } + data.sources.push(pokemon); + }, + }, recover: { inherit: true, pp: 20, diff --git a/data/mods/gen3rs/learnsets.ts b/data/mods/gen3rs/learnsets.ts index c5ff608de7..5176921faa 100644 --- a/data/mods/gen3rs/learnsets.ts +++ b/data/mods/gen3rs/learnsets.ts @@ -4356,6 +4356,7 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab toxic: ["3M"], uproar: ["3E"], waterpulse: ["3M"], + wish: ["3E"], }, }, delcatty: { @@ -4813,6 +4814,7 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab thunderbolt: ["3M"], thunderwave: ["3L4"], toxic: ["3M"], + wish: ["3E"], }, }, minun: { @@ -4846,6 +4848,7 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab thunderbolt: ["3M"], thunderwave: ["3L4"], toxic: ["3M"], + wish: ["3E"], }, }, volbeat: { @@ -5462,6 +5465,7 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab trick: ["3E"], uproar: ["3L5"], waterpulse: ["3M"], + wish: ["3E"], }, }, trapinch: { diff --git a/data/mods/gen4/moves.ts b/data/mods/gen4/moves.ts index d6ad9cf3c5..1e5db1ae5e 100644 --- a/data/mods/gen4/moves.ts +++ b/data/mods/gen4/moves.ts @@ -1332,6 +1332,18 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, pursuit: { inherit: true, + beforeTurnCallback(pokemon) { + if (['frz', 'slp'].includes(pokemon.status) || + (pokemon.hasAbility('truant') && pokemon.volatiles['truant'])) return; + for (const target of pokemon.foes()) { + target.addVolatile('pursuit'); + const data = target.volatiles['pursuit']; + if (!data.sources) { + data.sources = []; + } + data.sources.push(pokemon); + } + }, condition: { duration: 1, onBeforeSwitchOut(pokemon) { @@ -1354,7 +1366,11 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } } } - this.actions.runMove('pursuit', source, source.getLocOf(pokemon)); + const move = this.dex.getActiveMove('pursuit'); + source.moveUsed(move, pokemon.position); + if (this.actions.useMove(move, source, { target: pokemon }) && source.getItem().isChoice) { + source.addVolatile('choicelock'); + } } }, }, @@ -1538,19 +1554,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.add('-activate', source, 'move: Mimic', move.name); }, }, - skillswap: { - inherit: true, - onHit(target, source) { - const targetAbility = target.ability; - const sourceAbility = source.ability; - if (targetAbility === sourceAbility || source.hasItem('griseousorb') || target.hasItem('griseousorb')) { - return false; - } - this.add('-activate', source, 'move: Skill Swap'); - source.setAbility(targetAbility); - target.setAbility(sourceAbility); - }, - }, sleeptalk: { inherit: true, onTryHit(pokemon) { diff --git a/data/mods/gen4/scripts.ts b/data/mods/gen4/scripts.ts index 67f54d423d..b73128e018 100644 --- a/data/mods/gen4/scripts.ts +++ b/data/mods/gen4/scripts.ts @@ -55,10 +55,6 @@ export const Scripts: ModdedBattleScriptsData = { // Weather baseDamage = this.battle.runEvent('WeatherModifyDamage', pokemon, target, move, baseDamage); - if (this.battle.gen === 3 && move.category === 'Physical' && !Math.floor(baseDamage)) { - baseDamage = 1; - } - baseDamage += 2; const isCrit = target.getMoveHitData(move).crit; diff --git a/data/mods/gen5/moves.ts b/data/mods/gen5/moves.ts index ab4cc6060f..4328d70e1e 100644 --- a/data/mods/gen5/moves.ts +++ b/data/mods/gen5/moves.ts @@ -794,19 +794,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { inherit: true, flags: { protect: 1, reflectable: 1, mirror: 1, sound: 1, metronome: 1 }, }, - skillswap: { - inherit: true, - onHit(target, source) { - const targetAbility = target.ability; - const sourceAbility = source.ability; - if (targetAbility === sourceAbility) { - return false; - } - this.add('-activate', source, 'move: Skill Swap', this.dex.abilities.get(targetAbility), this.dex.abilities.get(sourceAbility), `[of] ${target}`); - source.setAbility(targetAbility); - target.setAbility(sourceAbility); - }, - }, skullbash: { inherit: true, basePower: 100, diff --git a/data/mods/gen6/formats-data.ts b/data/mods/gen6/formats-data.ts index 75ebb0da61..ae2091be52 100644 --- a/data/mods/gen6/formats-data.ts +++ b/data/mods/gen6/formats-data.ts @@ -1678,7 +1678,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat doublesTier: "DUber", }, jirachi: { - tier: "OU", + tier: "(OU)", doublesTier: "DUber", }, deoxys: { diff --git a/data/mods/gen6mixandmega/items.ts b/data/mods/gen6mixandmega/items.ts new file mode 100644 index 0000000000..f02eb9841b --- /dev/null +++ b/data/mods/gen6mixandmega/items.ts @@ -0,0 +1,46 @@ +export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { + blueorb: { + inherit: true, + onSwitchIn(pokemon) { + if (pokemon.isActive && !pokemon.species.isPrimal && !pokemon.transformed) { + // @ts-expect-error modded + const species: Species = this.actions.getMixedSpecies(pokemon.m.originalSpecies, 'Kyogre-Primal', pokemon); + if (pokemon.m.originalSpecies === 'Kyogre') { + pokemon.formeChange(species, this.effect, true); + } else { + pokemon.formeChange(species, this.effect, true); + pokemon.baseSpecies = species; + this.add('-start', pokemon, 'Blue Orb', '[silent]'); + } + } + }, + onTakeItem: false, + }, + redorb: { + inherit: true, + onSwitchIn(pokemon) { + if (pokemon.isActive && !pokemon.species.isPrimal && !pokemon.transformed) { + // @ts-expect-error modded + const species: Species = this.actions.getMixedSpecies(pokemon.m.originalSpecies, 'Groudon-Primal', pokemon); + if (pokemon.m.originalSpecies === 'Groudon') { + pokemon.formeChange(species, this.effect, true); + } else { + pokemon.formeChange(species, this.effect, true); + pokemon.baseSpecies = species; + this.add('-start', pokemon, 'Red Orb', '[silent]'); + const apparentSpecies = pokemon.illusion ? pokemon.illusion.species.name : pokemon.m.originalSpecies; + const oSpecies = this.dex.species.get(apparentSpecies); + if (pokemon.illusion) { + const types = oSpecies.types; + if (types.length > 1 || types[types.length - 1] !== 'Fire') { + this.add('-start', pokemon, 'typechange', (types[0] !== 'Fire' ? types[0] + '/' : '') + 'Fire', '[silent]'); + } + } else if (oSpecies.types.length !== pokemon.species.types.length || oSpecies.types[1] !== pokemon.species.types[1]) { + this.add('-start', pokemon, 'typechange', pokemon.species.types.join('/'), '[silent]'); + } + } + } + }, + onTakeItem: false, + }, +}; diff --git a/data/mods/gen6mixandmega/scripts.ts b/data/mods/gen6mixandmega/scripts.ts new file mode 100644 index 0000000000..e4b67ff9c7 --- /dev/null +++ b/data/mods/gen6mixandmega/scripts.ts @@ -0,0 +1,117 @@ +export const Scripts: ModdedBattleScriptsData = { + gen: 6, + inherit: 'gen6', + init() { + for (const i in this.data.Items) { + if (!this.data.Items[i].megaStone) continue; + this.modData('Items', i).onTakeItem = false; + } + }, + actions: { + canMegaEvo(pokemon) { + if (pokemon.species.isMega || pokemon.species.isPrimal) return null; + + const item = pokemon.getItem(); + if (item.megaStone) { + const values = Object.values(item.megaStone); + if (values.includes(pokemon.name)) return null; + return values[0]; + } else if (pokemon.baseMoves.includes('dragonascent')) { + return 'Rayquaza-Mega'; + } else { + return null; + } + }, + runMegaEvo(pokemon) { + if (pokemon.species.isMega || pokemon.species.isPrimal) return false; + + const species: Species = (this as any).getMixedSpecies(pokemon.m.originalSpecies, pokemon.canMegaEvo, pokemon); + + // Do we have a proper sprite for it? Code for when megas actually exist + if (this.dex.species.get(pokemon.canMegaEvo as any).baseSpecies === pokemon.m.originalSpecies) { + pokemon.formeChange(species, pokemon.getItem(), true); + } else { + const oSpecies = this.dex.species.get(pokemon.m.originalSpecies); + const oMegaSpecies = this.dex.species.get((species as any).originalSpecies); + pokemon.formeChange(species, pokemon.getItem(), true); + this.battle.add('-start', pokemon, oMegaSpecies.requiredItem, '[silent]'); + if (oSpecies.types.join('/') !== pokemon.species.types.join('/')) { + this.battle.add('-start', pokemon, 'typechange', pokemon.species.types.join('/'), '[silent]'); + } + } + + pokemon.canMegaEvo = false; + return true; + }, + getMixedSpecies(originalForme, formeChange, pokemon) { + const originalSpecies = this.dex.species.get(originalForme); + const formeChangeSpecies = this.dex.species.get(formeChange); + if (originalSpecies.baseSpecies === formeChangeSpecies.baseSpecies) { + return formeChangeSpecies; + } + const deltas = (this as any).getFormeChangeDeltas(formeChangeSpecies, pokemon); + const species = (this as any).mutateOriginalSpecies(originalSpecies, deltas); + return species; + }, + getFormeChangeDeltas(formeChangeSpecies, pokemon) { + // Should be fine as long as Necrozma-U doesn't get added or Game Freak makes me sad with some convoluted forme change + const baseSpecies = this.dex.species.get(formeChangeSpecies.isMega ? + formeChangeSpecies.battleOnly as string : formeChangeSpecies.baseSpecies); + const deltas: { + ability: string, + baseStats: SparseStatsTable, + weighthg: number, + heightm: number, + originalSpecies: string, + requiredItem: string | undefined, + type?: string, + formeType?: string, + isMega?: boolean, + } = { + ability: formeChangeSpecies.abilities['0'], + baseStats: {}, + weighthg: formeChangeSpecies.weighthg - baseSpecies.weighthg, + heightm: ((formeChangeSpecies.heightm * 10) - (baseSpecies.heightm * 10)) / 10, + originalSpecies: formeChangeSpecies.name, + requiredItem: formeChangeSpecies.requiredItem, + }; + let statId: StatID; + for (statId in formeChangeSpecies.baseStats) { + deltas.baseStats[statId] = formeChangeSpecies.baseStats[statId] - baseSpecies.baseStats[statId]; + } + let formeType: string | null = null; + if (formeChangeSpecies.types.length > baseSpecies.types.length) { + deltas.type = formeChangeSpecies.types[1]; + } else if (formeChangeSpecies.types.length < baseSpecies.types.length) { + deltas.type = baseSpecies.types[0]; + } else if (formeChangeSpecies.types[1] !== baseSpecies.types[1]) { + deltas.type = formeChangeSpecies.types[1]; + } + if (formeChangeSpecies.isMega && !formeType) formeType = 'Mega'; + if (formeChangeSpecies.isPrimal) formeType = 'Primal'; + if (formeType) deltas.formeType = formeType; + return deltas; + }, + mutateOriginalSpecies(speciesOrForme, deltas) { + if (!deltas) throw new TypeError("Must specify deltas!"); + const species = this.dex.deepClone(this.dex.species.get(speciesOrForme)); + species.abilities = { '0': deltas.ability }; + if (species.types[0] === deltas.type) { + species.types = [deltas.type]; + } else if (deltas.type) { + species.types = [species.types[0], deltas.type]; + } + const baseStats = species.baseStats; + for (const statName in baseStats) { + baseStats[statName] = this.battle.clampIntRange(baseStats[statName] + deltas.baseStats[statName], 1, 255); + } + species.weighthg = Math.max(1, species.weighthg + deltas.weighthg); + species.heightm = Math.max(0.1, ((species.heightm * 10) + (deltas.heightm * 10)) / 10); + species.originalSpecies = deltas.originalSpecies; + species.requiredItem = deltas.requiredItem; + if (deltas.formeType === 'Mega' || deltas.isMega) species.isMega = true; + if (deltas.formeType === 'Primal') species.isPrimal = true; + return species; + }, + }, +}; diff --git a/data/mods/gen7/formats-data.ts b/data/mods/gen7/formats-data.ts index 7af4a2c6ae..ada8df1394 100644 --- a/data/mods/gen7/formats-data.ts +++ b/data/mods/gen7/formats-data.ts @@ -592,7 +592,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat doublesTier: "NFE", }, tangrowth: { - tier: "OU", + tier: "(OU)", doublesTier: "(DUU)", }, kangaskhan: { diff --git a/data/mods/gen7mixandmega/items.ts b/data/mods/gen7mixandmega/items.ts new file mode 100644 index 0000000000..f02eb9841b --- /dev/null +++ b/data/mods/gen7mixandmega/items.ts @@ -0,0 +1,46 @@ +export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { + blueorb: { + inherit: true, + onSwitchIn(pokemon) { + if (pokemon.isActive && !pokemon.species.isPrimal && !pokemon.transformed) { + // @ts-expect-error modded + const species: Species = this.actions.getMixedSpecies(pokemon.m.originalSpecies, 'Kyogre-Primal', pokemon); + if (pokemon.m.originalSpecies === 'Kyogre') { + pokemon.formeChange(species, this.effect, true); + } else { + pokemon.formeChange(species, this.effect, true); + pokemon.baseSpecies = species; + this.add('-start', pokemon, 'Blue Orb', '[silent]'); + } + } + }, + onTakeItem: false, + }, + redorb: { + inherit: true, + onSwitchIn(pokemon) { + if (pokemon.isActive && !pokemon.species.isPrimal && !pokemon.transformed) { + // @ts-expect-error modded + const species: Species = this.actions.getMixedSpecies(pokemon.m.originalSpecies, 'Groudon-Primal', pokemon); + if (pokemon.m.originalSpecies === 'Groudon') { + pokemon.formeChange(species, this.effect, true); + } else { + pokemon.formeChange(species, this.effect, true); + pokemon.baseSpecies = species; + this.add('-start', pokemon, 'Red Orb', '[silent]'); + const apparentSpecies = pokemon.illusion ? pokemon.illusion.species.name : pokemon.m.originalSpecies; + const oSpecies = this.dex.species.get(apparentSpecies); + if (pokemon.illusion) { + const types = oSpecies.types; + if (types.length > 1 || types[types.length - 1] !== 'Fire') { + this.add('-start', pokemon, 'typechange', (types[0] !== 'Fire' ? types[0] + '/' : '') + 'Fire', '[silent]'); + } + } else if (oSpecies.types.length !== pokemon.species.types.length || oSpecies.types[1] !== pokemon.species.types[1]) { + this.add('-start', pokemon, 'typechange', pokemon.species.types.join('/'), '[silent]'); + } + } + } + }, + onTakeItem: false, + }, +}; diff --git a/data/mods/gen7mixandmega/scripts.ts b/data/mods/gen7mixandmega/scripts.ts new file mode 100644 index 0000000000..8f056ff19e --- /dev/null +++ b/data/mods/gen7mixandmega/scripts.ts @@ -0,0 +1,121 @@ +export const Scripts: ModdedBattleScriptsData = { + gen: 7, + inherit: 'gen7', + init() { + for (const i in this.data.Items) { + if (!this.data.Items[i].megaStone) continue; + this.modData('Items', i).onTakeItem = false; + } + }, + actions: { + canMegaEvo(pokemon) { + if (pokemon.species.isMega || pokemon.species.isPrimal) return null; + + const item = pokemon.getItem(); + if (item.megaStone) { + const values = Object.values(item.megaStone); + if (values.includes(pokemon.name)) return null; + return values[0]; + } else if (pokemon.baseMoves.includes('dragonascent')) { + return 'Rayquaza-Mega'; + } else { + return null; + } + }, + runMegaEvo(pokemon) { + if (pokemon.species.isMega || pokemon.species.isPrimal) return false; + + const isUltraBurst = !pokemon.canMegaEvo; + + const species: Species = (this as any).getMixedSpecies(pokemon.m.originalSpecies, + pokemon.canMegaEvo || pokemon.canUltraBurst, pokemon); + + // Do we have a proper sprite for it? Code for when megas actually exist + if (isUltraBurst || this.dex.species.get(pokemon.canMegaEvo as any).baseSpecies === pokemon.m.originalSpecies) { + pokemon.formeChange(species, pokemon.getItem(), true); + } else { + const oSpecies = this.dex.species.get(pokemon.m.originalSpecies); + const oMegaSpecies = this.dex.species.get((species as any).originalSpecies); + pokemon.formeChange(species, pokemon.getItem(), true); + this.battle.add('-start', pokemon, oMegaSpecies.requiredItem, '[silent]'); + if (oSpecies.types.join('/') !== pokemon.species.types.join('/')) { + this.battle.add('-start', pokemon, 'typechange', pokemon.species.types.join('/'), '[silent]'); + } + } + + pokemon.canMegaEvo = false; + if (isUltraBurst) pokemon.canUltraBurst = null; + return true; + }, + getMixedSpecies(originalForme, formeChange, pokemon) { + const originalSpecies = this.dex.species.get(originalForme); + const formeChangeSpecies = this.dex.species.get(formeChange); + if (originalSpecies.baseSpecies === formeChangeSpecies.baseSpecies) { + return formeChangeSpecies; + } + const deltas = (this as any).getFormeChangeDeltas(formeChangeSpecies, pokemon); + const species = (this as any).mutateOriginalSpecies(originalSpecies, deltas); + return species; + }, + getFormeChangeDeltas(formeChangeSpecies, pokemon) { + // Should be fine as long as Necrozma-U doesn't get added or Game Freak makes me sad with some convoluted forme change + const baseSpecies = this.dex.species.get(formeChangeSpecies.isMega ? + formeChangeSpecies.battleOnly as string : formeChangeSpecies.baseSpecies); + const deltas: { + ability: string, + baseStats: SparseStatsTable, + weighthg: number, + heightm: number, + originalSpecies: string, + requiredItem: string | undefined, + type?: string, + formeType?: string, + isMega?: boolean, + } = { + ability: formeChangeSpecies.abilities['0'], + baseStats: {}, + weighthg: formeChangeSpecies.weighthg - baseSpecies.weighthg, + heightm: ((formeChangeSpecies.heightm * 10) - (baseSpecies.heightm * 10)) / 10, + originalSpecies: formeChangeSpecies.name, + requiredItem: formeChangeSpecies.requiredItem, + }; + let statId: StatID; + for (statId in formeChangeSpecies.baseStats) { + deltas.baseStats[statId] = formeChangeSpecies.baseStats[statId] - baseSpecies.baseStats[statId]; + } + let formeType: string | null = null; + if (formeChangeSpecies.types.length > baseSpecies.types.length) { + deltas.type = formeChangeSpecies.types[1]; + } else if (formeChangeSpecies.types.length < baseSpecies.types.length) { + deltas.type = baseSpecies.types[0]; + } else if (formeChangeSpecies.types[1] !== baseSpecies.types[1]) { + deltas.type = formeChangeSpecies.types[1]; + } + if (formeChangeSpecies.isMega && !formeType) formeType = 'Mega'; + if (formeChangeSpecies.isPrimal) formeType = 'Primal'; + if (formeType) deltas.formeType = formeType; + return deltas; + }, + mutateOriginalSpecies(speciesOrForme, deltas) { + if (!deltas) throw new TypeError("Must specify deltas!"); + const species = this.dex.deepClone(this.dex.species.get(speciesOrForme)); + species.abilities = { '0': deltas.ability }; + if (species.types[0] === deltas.type) { + species.types = [deltas.type]; + } else if (deltas.type) { + species.types = [species.types[0], deltas.type]; + } + const baseStats = species.baseStats; + for (const statName in baseStats) { + baseStats[statName] = this.battle.clampIntRange(baseStats[statName] + deltas.baseStats[statName], 1, 255); + } + species.weighthg = Math.max(1, species.weighthg + deltas.weighthg); + species.heightm = Math.max(0.1, ((species.heightm * 10) + (deltas.heightm * 10)) / 10); + species.originalSpecies = deltas.originalSpecies; + species.requiredItem = deltas.requiredItem; + if (deltas.formeType === 'Mega' || deltas.isMega) species.isMega = true; + if (deltas.formeType === 'Primal') species.isPrimal = true; + return species; + }, + }, +}; diff --git a/data/mods/gen8/formats-data.ts b/data/mods/gen8/formats-data.ts index 373fb35bd0..774b525b8a 100644 --- a/data/mods/gen8/formats-data.ts +++ b/data/mods/gen8/formats-data.ts @@ -2922,7 +2922,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat isNonstandard: "Past", }, victini: { - tier: "OU", + tier: "(OU)", doublesTier: "DUU", natDexTier: "OU", }, diff --git a/data/mods/gen8/rulesets.ts b/data/mods/gen8/rulesets.ts index 7958555cca..866c2568da 100644 --- a/data/mods/gen8/rulesets.ts +++ b/data/mods/gen8/rulesets.ts @@ -92,10 +92,10 @@ export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable if (["Zacian", "Zamazenta"].includes(species.baseSpecies) && this.toID(set.item).startsWith('rusted')) { species = this.dex.species.get(set.species + "-Crowned"); } - if (set.item && this.dex.items.get(set.item).megaStone) { + if (set.item) { const item = this.dex.items.get(set.item); - if (item.megaEvolves === species.baseSpecies) { - species = this.dex.species.get(Array.isArray(item.megaStone) ? item.megaStone[0] : item.megaStone); + if (item.megaStone?.[species.baseSpecies]) { + species = this.dex.species.get(item.megaStone[species.baseSpecies]); } } if ( @@ -123,8 +123,8 @@ export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable } if (set.item) { const item = this.dex.items.get(set.item); - if (item.megaEvolves === set.species) { - godSpecies = this.dex.species.get(Array.isArray(item.megaStone) ? item.megaStone[0] : item.megaStone); + if (item.megaStone?.[set.species]) { + godSpecies = this.dex.species.get(item.megaStone[set.species]); } if (["Zacian", "Zamazenta"].includes(godSpecies.baseSpecies) && item.id.startsWith('rusted')) { godSpecies = this.dex.species.get(set.species + "-Crowned"); diff --git a/data/mods/gen8mixandmega/scripts.ts b/data/mods/gen8mixandmega/scripts.ts new file mode 100644 index 0000000000..e59a9f14ea --- /dev/null +++ b/data/mods/gen8mixandmega/scripts.ts @@ -0,0 +1,115 @@ +export const Scripts: ModdedBattleScriptsData = { + gen: 8, + inherit: 'gen8', + init() { + for (const i in this.data.Items) { + const item = this.data.Items[i]; + if (!item.megaStone || item.isNonstandard !== 'Past') continue; + this.modData('Items', i).onTakeItem = false; + this.modData('Items', i).isNonstandard = null; + if (item.megaStone) { + for (const megaEvo of Object.values(item.megaStone)) { + this.modData('FormatsData', this.toID(megaEvo)).isNonstandard = null; + } + } + } + }, + actions: { + canMegaEvo(pokemon) { + if (pokemon.species.isMega) return null; + + const item = pokemon.getItem(); + if (!item.megaStone) return null; + return Object.values(item.megaStone)[0]; + }, + runMegaEvo(pokemon) { + if (pokemon.species.isMega) return false; + + const species: Species = (this as any).getMixedSpecies(pokemon.m.originalSpecies, pokemon.canMegaEvo, pokemon); + + /* Do we have a proper sprite for it? Code for when megas actually exist + if (this.dex.species.get(pokemon.canMegaEvo!).baseSpecies === pokemon.m.originalSpecies) { + pokemon.formeChange(species, pokemon.getItem(), true); + } else { */ + const oSpecies = this.dex.species.get(pokemon.m.originalSpecies); + const oMegaSpecies = this.dex.species.get((species as any).originalSpecies); + pokemon.formeChange(species, pokemon.getItem(), true); + this.battle.add('-start', pokemon, oMegaSpecies.requiredItem, '[silent]'); + if (oSpecies.types.join('/') !== pokemon.species.types.join('/')) { + this.battle.add('-start', pokemon, 'typechange', pokemon.species.types.join('/'), '[silent]'); + } + // } + + pokemon.canMegaEvo = false; + return true; + }, + getMixedSpecies(originalForme, formeChange, pokemon) { + const originalSpecies = this.dex.species.get(originalForme); + const formeChangeSpecies = this.dex.species.get(formeChange); + const deltas = (this as any).getFormeChangeDeltas(formeChangeSpecies, pokemon); + const species = (this as any).mutateOriginalSpecies(originalSpecies, deltas); + return species; + }, + getFormeChangeDeltas(formeChangeSpecies, pokemon) { + // Should be fine as long as Necrozma-U doesn't get added or Game Freak makes me sad with some convoluted forme change + let baseSpecies = this.dex.species.get(formeChangeSpecies.isMega ? + formeChangeSpecies.battleOnly as string : formeChangeSpecies.baseSpecies); + if (formeChangeSpecies.name === 'Zygarde-Mega') { + baseSpecies = this.dex.species.get('Zygarde-Complete'); + } + const deltas: { + ability: string, + baseStats: SparseStatsTable, + weighthg: number, + heightm: number, + originalSpecies: string, + requiredItem: string | undefined, + type?: string, + formeType?: string, + isMega?: boolean, + } = { + ability: formeChangeSpecies.abilities['0'], + baseStats: {}, + weighthg: formeChangeSpecies.weighthg - baseSpecies.weighthg, + heightm: ((formeChangeSpecies.heightm * 10) - (baseSpecies.heightm * 10)) / 10, + originalSpecies: formeChangeSpecies.name, + requiredItem: formeChangeSpecies.requiredItem, + }; + let statId: StatID; + for (statId in formeChangeSpecies.baseStats) { + deltas.baseStats[statId] = formeChangeSpecies.baseStats[statId] - baseSpecies.baseStats[statId]; + } + if (formeChangeSpecies.types.length > baseSpecies.types.length) { + deltas.type = formeChangeSpecies.types[1]; + } else if (formeChangeSpecies.types.length < baseSpecies.types.length) { + deltas.type = 'mono'; + } else if (formeChangeSpecies.types[1] !== baseSpecies.types[1]) { + deltas.type = formeChangeSpecies.types[1]; + } + deltas.isMega = true; + return deltas; + }, + mutateOriginalSpecies(speciesOrForme, deltas) { + if (!deltas) throw new TypeError("Must specify deltas!"); + const species = this.dex.deepClone(this.dex.species.get(speciesOrForme)); + species.abilities = { '0': deltas.ability }; + if (species.types[0] === deltas.type) { + species.types = [deltas.type]; + } else if (deltas.type === 'mono') { + species.types = [species.types[0]]; + } else if (deltas.type) { + species.types = [species.types[0], deltas.type]; + } + const baseStats = species.baseStats; + for (const statName in baseStats) { + baseStats[statName] = this.battle.clampIntRange(baseStats[statName] + deltas.baseStats[statName], 1, 255); + } + species.weighthg = Math.max(1, species.weighthg + deltas.weighthg); + species.heightm = Math.max(0.1, ((species.heightm * 10) + (deltas.heightm * 10)) / 10); + species.originalSpecies = deltas.originalSpecies; + species.requiredItem = deltas.requiredItem; + if (deltas.isMega) species.isMega = true; + return species; + }, + }, +}; diff --git a/data/mods/gen9legendsou/items.ts b/data/mods/gen9legendsou/items.ts index 5a4e3fb9c0..9e71c2e5cb 100644 --- a/data/mods/gen9legendsou/items.ts +++ b/data/mods/gen9legendsou/items.ts @@ -2,15 +2,15 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { slowbronite: { inherit: true, onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.name || item.megaStone === source.baseSpecies.name) return false; - return true; + return !item.megaStone || (!item.megaStone[source.baseSpecies.name] && + !Object.values(item.megaStone).includes(source.baseSpecies.name)); }, }, greninjite: { inherit: true, onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.name || item.megaStone === source.baseSpecies.name) return false; - return true; + return !item.megaStone || (!item.megaStone[source.baseSpecies.name] && + !Object.values(item.megaStone).includes(source.baseSpecies.name)); }, }, zygardite: { diff --git a/data/mods/gen9legendsou/scripts.ts b/data/mods/gen9legendsou/scripts.ts index a71a40b244..ac0cdf8b94 100644 --- a/data/mods/gen9legendsou/scripts.ts +++ b/data/mods/gen9legendsou/scripts.ts @@ -57,23 +57,8 @@ export const Scripts: ModdedBattleScriptsData = { pokemon.baseMoves.includes(this.battle.toID(altForme.requiredMove)) && !item.zMove) { return altForme.name; } - if (Array.isArray(item.megaEvolves)) { - if (!Array.isArray(item.megaStone)) { - throw new Error(`${item.name}#megaEvolves and ${item.name}#megaStone type mismatch`); - } - if (item.megaEvolves.length !== item.megaStone.length) { - throw new Error(`${item.name}#megaEvolves and ${item.name}#megaStone length mismatch`); - } - const index = item.megaEvolves.indexOf(species.name); - if (index < 0) return null; - return item.megaStone[index]; - } else { - if (item.megaEvolves === species.name) { - if (Array.isArray(item.megaStone)) throw new Error(`${item.name}#megaEvolves and ${item.name}#megaStone type mismatch`); - return item.megaStone; - } - } - return null; + if (!item.megaStone) return null; + return item.megaStone[species.name]; }, runMegaEvo(pokemon) { const speciesid = pokemon.canMegaEvo || pokemon.canUltraBurst; diff --git a/data/mods/gen9ssb/items.ts b/data/mods/gen9ssb/items.ts index ba538d227f..754f73a283 100644 --- a/data/mods/gen9ssb/items.ts +++ b/data/mods/gen9ssb/items.ts @@ -14,11 +14,9 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { name: "Flygonite", spritenum: 111, itemUser: ["Flygon"], - megaEvolves: "Flygon", - megaStone: "Trapinch", + megaStone: { "Flygon": "Trapinch" }, onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, desc: "If held by a Flygon, this item allows it to Mega Evolve in battle.", }, @@ -36,7 +34,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { gardevoirite: { inherit: true, itemUser: ["Ralts"], - megaEvolves: "Ralts", + megaStone: { "Ralts": "Gardevoir-Mega" }, desc: "If held by a Ralts, this item allows it to Mega Evolve in battle.", }, // Peary diff --git a/data/mods/gen9ssb/scripts.ts b/data/mods/gen9ssb/scripts.ts index f1b3cbba00..6be6a31470 100644 --- a/data/mods/gen9ssb/scripts.ts +++ b/data/mods/gen9ssb/scripts.ts @@ -963,26 +963,11 @@ export const Scripts: ModdedBattleScriptsData = { pokemon.baseMoves.includes(this.battle.toID(altForme.requiredMove)) && !item.zMove) { return altForme.name; } + if (!item.megaStone) return null; // a hacked-in Megazard X can mega evolve into Megazard Y, but not into Megazard X - if (Array.isArray(item.megaEvolves)) { - if (!Array.isArray(item.megaStone)) { - throw new Error(`${item.name}#megaEvolves and ${item.name}#megaStone type mismatch`); - } - if (item.megaEvolves.length !== item.megaStone.length) { - throw new Error(`${item.name}#megaEvolves and ${item.name}#megaStone length mismatch`); - } - // FIXME: Change to species.name when champions comes - const index = item.megaEvolves.indexOf(species.baseSpecies); - if (index < 0) return null; - return item.megaStone[index]; - // FIXME: Change to species.name when champions comes - } else { - if (item.megaEvolves === species.baseSpecies) { - if (Array.isArray(item.megaStone)) throw new Error(`${item.name}#megaEvolves and ${item.name}#megaStone type mismatch`); - return item.megaStone; - } - } - return null; + // FIXME: Change to species.name when champions comes + const megaEvolution = item.megaStone[species.baseSpecies]; + return megaEvolution && megaEvolution !== species.name ? megaEvolution : null; }, // 1 Z per pokemon diff --git a/data/mods/mixandmega/scripts.ts b/data/mods/mixandmega/scripts.ts index 78d85cce0b..312f9bba8d 100644 --- a/data/mods/mixandmega/scripts.ts +++ b/data/mods/mixandmega/scripts.ts @@ -6,9 +6,11 @@ export const Scripts: ModdedBattleScriptsData = { if (!item.megaStone && !item.onDrive && !(item.onPlate && !item.zMove) && !item.onMemory) continue; this.modData('Items', i).onTakeItem = false; if (item.isNonstandard === "Past" || item.isNonstandard === "Future") this.modData('Items', i).isNonstandard = null; - /* if (item.megaStone) { - this.modData('FormatsData', this.toID(item.megaStone)).isNonstandard = null; - } */ + if (item.megaStone) { + for (const megaEvo of Object.values(item.megaStone)) { + this.modData('FormatsData', this.toID(megaEvo)).isNonstandard = null; + } + } } }, start() { @@ -385,12 +387,8 @@ export const Scripts: ModdedBattleScriptsData = { if (pokemon.species.isMega) return null; const item = pokemon.getItem(); - if (item.megaStone) { - if (item.megaStone.includes(pokemon.baseSpecies.name)) return null; - return Array.isArray(item.megaStone) ? item.megaStone[0] : item.megaStone; - } else { - return null; - } + if (!item.megaStone) return null; + return Object.values(item.megaStone)[0]; }, runMegaEvo(pokemon) { if (pokemon.species.isMega) return false; diff --git a/data/mods/scootopiav2/abilities.ts b/data/mods/scootopiav2/abilities.ts deleted file mode 100644 index 90d59ddb10..0000000000 --- a/data/mods/scootopiav2/abilities.ts +++ /dev/null @@ -1,135 +0,0 @@ -export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = { - mythicalpresence: { - name: "Mythical Presence", - shortDesc: "Lowers opposing Pokemon Special Attack by 1 stage when switching in.", - onStart(pokemon) { - let activated = false; - for (const target of pokemon.adjacentFoes()) { - if (!activated) { - this.add('-ability', pokemon, 'Mythical Presence', 'boost'); - activated = true; - } - if (target.volatiles['substitute']) { - this.add('-immune', target); - } else { - this.boost({ spa: -1 }, target, pokemon, null, true); - } - } - }, - }, - powerconstruct: { - onResidualOrder: 27, - onResidual(pokemon) { - if (pokemon.baseSpecies.baseSpecies !== 'Flocura' || pokemon.transformed || !pokemon.hp) return; - if (pokemon.species.id === 'flocuranexus' || pokemon.hp > pokemon.maxhp / 2) return; - this.add('-activate', pokemon, 'ability: Power Construct'); - pokemon.formeChange('Flocura-Nexus', this.effect, 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.volatiles['dynamax'] ? (2 * pokemon.baseMaxhp) : pokemon.baseMaxhp; - pokemon.hp = newMaxHP - (pokemon.maxhp - pokemon.hp); - pokemon.maxhp = newMaxHP; - this.add('-heal', pokemon, pokemon.getHealth, '[silent]'); - }, - flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, cantsuppress: 1 }, - name: "Power Construct", - rating: 5, - num: 211, - }, - battlebond: { - shortDesc: "Change to a stronger forme after getting a KO.", - onSourceAfterFaint(length, target, source, effect) { - if (effect?.effectType !== 'Move') { - return; - } - if (source.species.id === 'soleron' && source.hp && !source.transformed && source.side.foe.pokemonLeft) { - this.add('-activate', source, 'ability: Battle Bond'); - source.formeChange('Soleron-Awakened', this.effect, true); - } - }, - onModifyMovePriority: -1, - flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, cantsuppress: 1 }, - name: "Battle Bond", - rating: 4, - num: 210, - }, - crystalheart: { - shortDesc: "User becomes Crystal type. While Crystal type, 33% boost to Def and SpD", - onStart(pokemon) { - if (pokemon.hasType('Crystal')) return false; - if (!pokemon.addType('Crystal')) return false; - pokemon.setType(["Crystal"]); - this.add('-start', pokemon, 'typechange', 'Crystal', '[from] ability: Crystal Heart'); - }, - onModifyDefPriority: 6, - onModifyDef(def, pokemon) { - if (pokemon.hasType('Crystal')) return this.chainModify(1 + (1 / 3)); - }, - onModifySpDPriority: 6, - onModifySpD(spd, pokemon) { - if (pokemon.hasType('Crystal')) return this.chainModify(1 + (1 / 3)); - }, - name: "Crystal Heart", - }, - wildheart: { - onStart(pokemon) { - if (pokemon.hasType('Feral')) return false; - if (!pokemon.addType('Feral')) return false; - pokemon.setType(["Feral"]); - this.add('-start', pokemon, 'typechange', "Feral", '[from] ability: Wild Heart'); - }, - onModifyAtkPriority: 6, - onModifyAtk(atk, pokemon) { - if (pokemon.hasType('Feral')) return this.chainModify(1 + (1 / 3)); - }, - onModifySpAPriority: 6, - onModifySpA(spa, pokemon) { - if (pokemon.hasType('Feral')) return this.chainModify(1 + (1 / 3)); - }, - name: "Wild Heart", - shortDesc: "User becomes Feral type. While Feral type, 33% boost to Atk and SpA", - }, - schooling: { - onStart(pokemon) { - if (pokemon.baseSpecies.baseSpecies !== 'Jaegorm' || pokemon.transformed) return; - if (pokemon.hp > pokemon.maxhp / 4) { - if (pokemon.species.id === 'jaegorm') { - pokemon.formeChange('Jaegorm-Collective'); - } - } else { - if (pokemon.species.id === 'jaegormcollective') { - pokemon.formeChange('Jaegorm'); - } - } - }, - onResidualOrder: 27, - onResidual(pokemon) { - if ( - pokemon.baseSpecies.baseSpecies !== 'Jaegorm' || pokemon.transformed || !pokemon.hp - ) return; - if (pokemon.hp > pokemon.maxhp / 4) { - if (pokemon.species.id === 'jaegorm') { - pokemon.formeChange('Jaegorm-Collective'); - } - } else { - if (pokemon.species.id === 'jaegormcollective') { - pokemon.formeChange('Jaegorm'); - } - } - }, - flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, cantsuppress: 1 }, - name: "Schooling", - shortDesc: "If user is Jaegorm, changes to Collective Form if it has > 1/4 max HP, else Solo Form.", - rating: 3, - num: 208, - }, - shellbunker: { - onDamage(damage, target, source, effect) { - if (effect.effectType !== 'Move' || !target.hurtThisTurn) return damage; - return damage / 2; - }, - name: "Shell Bunker", - shortDesc: "After taking damage, Def and SpD are doubled for the rest of the turn.", - }, -}; diff --git a/data/mods/scootopiav2/conditions.ts b/data/mods/scootopiav2/conditions.ts deleted file mode 100644 index 7086193b90..0000000000 --- a/data/mods/scootopiav2/conditions.ts +++ /dev/null @@ -1,67 +0,0 @@ -export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDataTable = { - frz: { - name: 'frz', - /* - start: " [Pokemon] was chilled!", - alreadyStarted: " [POKEMON] is already chilled!", - end: " [POKEMON] warmed up!", - endFromItem: " [POKEMON]'s [ITEM] warmed it up!", - endFromMove: " [POKEMON]'s [MOVE] warmed it up!", - cant: "[POKEMON] is chilled!", - */ - effectType: 'Status', - onStart(target, source, sourceEffect) { - if (sourceEffect && sourceEffect.effectType === 'Ability') { - this.add('-status', target, 'frz', '[from] ability: ' + sourceEffect.name, `[of] ${source}`); - } else { - this.add('-status', target, 'frz'); - } - }, - onResidualOrder: 9, - onResidual(pokemon) { - this.damage(pokemon.baseMaxhp / 16); - }, - onModifySpA(spa, pokemon) { - return this.chainModify(0.5); - }, - }, - slp: { - name: 'slp', - effectType: 'Status', - onStart(target, source, sourceEffect) { - if (sourceEffect && sourceEffect.effectType === 'Ability') { - this.add('-status', target, 'slp', '[from] ability: ' + sourceEffect.name, `[of] ${source}`); - } else if (sourceEffect && sourceEffect.effectType === 'Move') { - this.add('-status', target, 'slp', '[from] move: ' + sourceEffect.name); - } else { - this.add('-status', target, 'slp'); - } - // 1-3 turns - this.effectState.startTime = 3; - const sleepMoves = ["sleeppowder", "spore", "grasswhistle", "darkvoid", "hypnosis"]; - if (sourceEffect && sourceEffect.effectType === 'Move') { - if (sleepMoves.includes(sourceEffect.id)) this.effectState.startTime = 2; - } - this.effectState.time = this.effectState.startTime; - }, - onBeforeMovePriority: 10, - onBeforeMove(pokemon, target, move) { - if (pokemon.hasAbility('earlybird')) { - pokemon.statusState.time--; - } - pokemon.statusState.time--; - if (pokemon.statusState.time <= 0) { - pokemon.cureStatus(); - return; - } - this.add('cant', pokemon, 'slp'); - if (move.sleepUsable) { - return; - } - return false; - }, - onModifySpe(spe, pokemon) { - return this.chainModify(0.5); - }, - }, -}; diff --git a/data/mods/scootopiav2/formats-data.ts b/data/mods/scootopiav2/formats-data.ts deleted file mode 100644 index a917f298fa..0000000000 --- a/data/mods/scootopiav2/formats-data.ts +++ /dev/null @@ -1,218 +0,0 @@ -export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormatsDataTable = { - arbrella: { - tier: "OU", - doublesTier: "DOU", - }, - krachiten: { - tier: "OU", - doublesTier: "DOU", - }, - scalaron: { - tier: "OU", - doublesTier: "DOU", - }, - rantler: { - tier: "OU", - doublesTier: "DOU", - }, - woolora: { - tier: "OU", - doublesTier: "DOU", - }, - albatrygon: { - tier: "OU", - doublesTier: "DOU", - }, - orchile: { - tier: "OU", - doublesTier: "DOU", - }, - embuck: { - tier: "OU", - doublesTier: "DOU", - }, - cindoe: { - tier: "OU", - doublesTier: "DOU", - }, - cobracotta: { - tier: "OU", - doublesTier: "DOU", - }, - minillow: { - tier: "OU", - doublesTier: "DOU", - }, - crossont: { - tier: "OU", - doublesTier: "DOU", - }, - torgeist: { - tier: "OU", - doublesTier: "DOU", - }, - platypad: { - tier: "OU", - doublesTier: "DOU", - }, - lumoth: { - tier: "OU", - doublesTier: "DOU", - }, - aurorowl: { - tier: "OU", - doublesTier: "DOU", - }, - carapex: { - tier: "OU", - doublesTier: "DOU", - }, - dojodo: { - tier: "OU", - doublesTier: "DOU", - }, - nunopod: { - tier: "OU", - doublesTier: "DOU", - }, - zeploom: { - tier: "OU", - doublesTier: "DOU", - }, - sturgard: { - tier: "OU", - doublesTier: "DOU", - }, - brawnkey: { - tier: "OU", - doublesTier: "DOU", - }, - salamalix: { - tier: "OU", - doublesTier: "DOU", - }, - cinnastar: { - tier: "OU", - doublesTier: "DOU", - }, - muabboa: { - tier: "OU", - doublesTier: "DOU", - }, - harzodia: { - tier: "OU", - doublesTier: "DOU", - }, - cyllindrake: { - tier: "OU", - doublesTier: "DOU", - }, - kodokai: { - tier: "OU", - doublesTier: "DOU", - }, - electangle: { - tier: "OU", - doublesTier: "DOU", - }, - dolphena: { - tier: "OU", - doublesTier: "DOU", - }, - soleron: { - tier: "OU", - doublesTier: "DOU", - }, - jaegorm: { - tier: "OU", - doublesTier: "DOU", - }, - elemadillo: { - tier: "OU", - doublesTier: "DOU", - }, - axolacred: { - tier: "OU", - doublesTier: "DOU", - }, - roscenti: { - tier: "OU", - doublesTier: "DOU", - }, - blunderbusk: { - tier: "OU", - doublesTier: "DOU", - }, - barracoth: { - tier: "OU", - doublesTier: "DOU", - }, - jamborai: { - tier: "OU", - doublesTier: "DOU", - }, - dracoil: { - tier: "OU", - doublesTier: "DOU", - }, - celespirit: { - tier: "OU", - doublesTier: "DOU", - }, - noxtrice: { - tier: "OU", - doublesTier: "DOU", - }, - avastar: { - tier: "OU", - doublesTier: "DOU", - }, - faerenheit: { - tier: "OU", - doublesTier: "DOU", - }, - cellsius: { - tier: "OU", - doublesTier: "DOU", - }, - kelven: { - tier: "OU", - doublesTier: "DOU", - }, - salaos: { - tier: "OU", - doublesTier: "DOU", - }, - morndos: { - tier: "OU", - doublesTier: "DOU", - }, - pythos: { - tier: "OU", - doublesTier: "DOU", - }, - corundell: { - tier: "OU", - doublesTier: "DOU", - }, - quadringo: { - tier: "OU", - doublesTier: "DOU", - }, - saphor: { - tier: "OU", - doublesTier: "DOU", - }, - fenreil: { - tier: "OU", - doublesTier: "DOU", - }, - efflor: { - tier: "OU", - doublesTier: "DOU", - }, - flocura: { - tier: "OU", - doublesTier: "DOU", - }, -}; diff --git a/data/mods/scootopiav2/items.ts b/data/mods/scootopiav2/items.ts deleted file mode 100644 index 5b340b51a1..0000000000 --- a/data/mods/scootopiav2/items.ts +++ /dev/null @@ -1,88 +0,0 @@ -export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { - crystalorb: { - name: "Crystal Orb", - num: 1001, - desc: "The holder's secondary type is replaced with Crystal. 20% boost to Crystal attacks.", - onBeforeSwitchIn(pokemon) { - if (this.effectState.usedSuperType && this.effectState.superTypeUser !== pokemon.fullname) return false; - if (pokemon.hasType('Crystal')) return false; - if (!pokemon.addType('Crystal')) return false; - pokemon.setType([pokemon.types[0], "Crystal"]); - this.effectState.usedSuperType = true; - this.effectState.superTypeUser = "first_switch"; - }, - onStart(pokemon) { - if (this.effectState.usedSuperType && this.effectState.superTypeUser === "first_switch") { - this.add('-message', pokemon.name + " is a Crystal type!"); - this.effectState.superTypeUser = pokemon.fullname; - } - if (this.effectState.usedSuperType && this.effectState.superTypeUser === pokemon.fullname) { - this.add('-start', pokemon, 'typechange', pokemon.getTypes(true).join('/'), '[silent]'); - } - }, - onUpdate(pokemon) { - if ( - this.effectState.usedSuperType && this.effectState.superTypeUser === pokemon.fullname && !pokemon.hasType('Crystal') - ) { - pokemon.setType([pokemon.types[0], "Crystal"]); - this.add('-start', pokemon, 'typechange', pokemon.getTypes(true).join('/'), '[silent]'); - } - }, - onTakeItem(item, pokemon, source) { - if (source?.hasType("Crystal")) { - return false; - } - return true; - }, - onBasePowerPriority: 15, - onBasePower(basePower, user, target, move) { - if (move && move.type === 'Crystal') { - return this.chainModify([0x1333, 0x1000]); - } - }, - gen: 9, - }, - feralorb: { - name: "Feral Orb", - num: 1002, - desc: "The holder's secondary type is replaced with Feral. 20% boost to Feral attacks.", - onBeforeSwitchIn(pokemon) { - if (this.effectState.usedSuperType && this.effectState.superTypeUser !== pokemon.fullname) return false; - if (pokemon.hasType('Feral')) return false; - if (!pokemon.addType('Feral')) return false; - pokemon.setType([pokemon.types[0], "Feral"]); - this.effectState.usedSuperType = true; - this.effectState.superTypeUser = "first_switch"; - }, - onStart(pokemon) { - if (this.effectState.usedSuperType && this.effectState.superTypeUser === "first_switch") { - this.add('-message', pokemon.name + " is a Feral type!"); - this.effectState.superTypeUser = pokemon.fullname; - } - if (this.effectState.usedSuperType && this.effectState.superTypeUser === pokemon.fullname) { - this.add('-start', pokemon, 'typechange', pokemon.getTypes(true).join('/'), '[silent]'); - } - }, - onUpdate(pokemon) { - if ( - this.effectState.usedSuperType && this.effectState.superTypeUser === pokemon.fullname && !pokemon.hasType('Feral') - ) { - pokemon.setType([pokemon.types[0], "Feral"]); - this.add('-start', pokemon, 'typechange', pokemon.getTypes(true).join('/'), '[silent]'); - } - }, - onTakeItem(item, pokemon, source) { - if (source?.hasType("Feral")) { - return false; - } - return true; - }, - onBasePowerPriority: 15, - onBasePower(basePower, user, target, move) { - if (move && move.type === 'Feral') { - return this.chainModify([0x1333, 0x1000]); - } - }, - gen: 9, - }, -}; diff --git a/data/mods/scootopiav2/learnsets.ts b/data/mods/scootopiav2/learnsets.ts deleted file mode 100644 index 3573141dfa..0000000000 --- a/data/mods/scootopiav2/learnsets.ts +++ /dev/null @@ -1,4473 +0,0 @@ -export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTable = { - arbrella: { - learnset: { - woodhammer: ["9L1"], - seedbomb: ["9L1"], - grassyglide: ["9L1"], - bulletseed: ["9L1"], - solarblade: ["9L1"], - razorleaf: ["9L1"], - vinewhip: ["9L1"], - earthquake: ["9L1"], - bulldoze: ["9L1"], - drillrun: ["9L1"], - stoneedge: ["9L1"], - rockslide: ["9L1"], - rocktomb: ["9L1"], - superpower: ["9L1"], - xscissor: ["9L1"], - lunge: ["9L1"], - skittersmack: ["9L1"], - nightslash: ["9L1"], - shadowclaw: ["9L1"], - slash: ["9L1"], - scratch: ["9L1"], - bodyslam: ["9L1"], - doubleedge: ["9L1"], - leafstorm: ["9L1"], - gigadrain: ["9L1"], - energyball: ["9L1"], - grassknot: ["9L1"], - grasspledge: ["9L1"], - frenzyplant: ["9L1"], - earthpower: ["9L1"], - scorchingsands: ["9L1"], - ancientpower: ["9L1"], - shadowball: ["9L1"], - shoreup: ["9L1"], - stealthrock: ["9L1"], - swordsdance: ["9L1"], - rockpolish: ["9L1"], - spikyshield: ["9L1"], - worryseed: ["9L1"], - lightscreen: ["9L1"], - reflect: ["9L1"], - safeguard: ["9L1"], - synthesis: ["9L1"], - substitute: ["9L1"], - facade: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - round: ["9L1"], - endure: ["9L1"], - helpinghand: ["9L1"], - crystalcutter: ["9L1"], - crystalbash: ["9L1"], - crystalbeam: ["9L1"], - crystalcage: ["9L1"], - crystalburst: ["9L1"], - crystalhealing: ["9L1"], - crystalfortification: ["9L1"], - crystalshard: ["9L1"], - feralshred: ["9L1"], - feralpower: ["9L1"], - feralresilience: ["9L1"], - feralhealing: ["9L1"], - }, - }, - krachiten: { - learnset: { - aquacutter: ["9L1"], - focusenergy: ["9L1"], - firstimpression: ["9L1"], - leechlife: ["9L1"], - lunge: ["9L1"], - uturn: ["9L1"], - liquidation: ["9L1"], - superpower: ["9L1"], - crunch: ["9L1"], - psychicfangs: ["9L1"], - rapidspin: ["9L1"], - toxicspikes: ["9L1"], - toxic: ["9L1"], - recover: ["9L1"], - taunt: ["9L1"], - switcheroo: ["9L1"], - calmmind: ["9L1"], - bugbuzz: ["9L1"], - xscissor: ["9L1"], - bugbite: ["9L1"], - skittersmack: ["9L1"], - strugglebug: ["9L1"], - waterfall: ["9L1"], - surf: ["9L1"], - hydropump: ["9L1"], - scald: ["9L1"], - dive: ["9L1"], - bubble: ["9L1"], - waterpulse: ["9L1"], - brine: ["9L1"], - bubblebeam: ["9L1"], - psychocut: ["9L1"], - zenheadbutt: ["9L1"], - psychic: ["9L1"], - poisonjab: ["9L1"], - sludgebomb: ["9L1"], - shadowball: ["9L1"], - shadowclaw: ["9L1"], - darkpulse: ["9L1"], - nightslash: ["9L1"], - bite: ["9L1"], - assurance: ["9L1"], - payback: ["9L1"], - slash: ["9L1"], - scratch: ["9L1"], - weatherball: ["9L1"], - terrainpulse: ["9L1"], - honeclaws: ["9L1"], - lightscreen: ["9L1"], - safeguard: ["9L1"], - aquaring: ["9L1"], - lifedew: ["9L1"], - raindance: ["9L1"], - sunnyday: ["9L1"], - substitute: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - round: ["9L1"], - endure: ["9L1"], - chillingwater: ["9L1"], - icespinner: ["9L1"], - helpinghand: ["9L1"], - quickguard: ["9L1"], - facade: ["9L1"], - haze: ["9L1"], - crystalcutter: ["9L1"], - crystalbeam: ["9L1"], - crystalcage: ["9L1"], - crystalburst: ["9L1"], - crystalshard: ["9L1"], - feralbite: ["9L1"], - feralshred: ["9L1"], - feralrush: ["9L1"], - feralpower: ["9L1"], - feralspray: ["9L1"], - feralresilience: ["9L1"], - feralhealing: ["9L1"], - }, - }, - scalaron: { - learnset: { - haze: ["9L1"], - whirlwind: ["9L1"], - roar: ["9L1"], - hurricane: ["9L1"], - fireblast: ["9L1"], - flamethrower: ["9L1"], - mysticalfire: ["9L1"], - uturn: ["9L1"], - dragontail: ["9L1"], - defog: ["9L1"], - roost: ["9L1"], - toxic: ["9L1"], - willowisp: ["9L1"], - taunt: ["9L1"], - airslash: ["9L1"], - aircutter: ["9L1"], - wingattack: ["9L1"], - gust: ["9L1"], - dualwingbeat: ["9L1"], - aerialace: ["9L1"], - fly: ["9L1"], - acrobatics: ["9L1"], - heatwave: ["9L1"], - flareblitz: ["9L1"], - flamecharge: ["9L1"], - inferno: ["9L1"], - incinerate: ["9L1"], - firefang: ["9L1"], - firespin: ["9L1"], - ember: ["9L1"], - dragonpulse: ["9L1"], - dragonclaw: ["9L1"], - scaleshot: ["9L1"], - darkpulse: ["9L1"], - snarl: ["9L1"], - crunch: ["9L1"], - bite: ["9L1"], - thunderfang: ["9L1"], - shockwave: ["9L1"], - irontail: ["9L1"], - doubleedge: ["9L1"], - crushclaw: ["9L1"], - hyperbeam: ["9L1"], - tailwind: ["9L1"], - dragondance: ["9L1"], - memento: ["9L1"], - meanlook: ["9L1"], - scaryface: ["9L1"], - torment: ["9L1"], - substitute: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - facade: ["9L1"], - sleeptalk: ["9L1"], - round: ["9L1"], - endure: ["9L1"], - helpinghand: ["9L1"], - crystalcutter: ["9L1"], - crystaltail: ["9L1"], - crystalbeam: ["9L1"], - crystalcage: ["9L1"], - crystalburst: ["9L1"], - crystalhealing: ["9L1"], - crystalfortification: ["9L1"], - crystalshard: ["9L1"], - feralbite: ["9L1"], - feralrush: ["9L1"], - feralpower: ["9L1"], - feralbreath: ["9L1"], - feralhealing: ["9L1"], - feralresilience: ["9L1"], - }, - }, - rantler: { - learnset: { - doubleedge: ["9L1"], - facade: ["9L1"], - hyperfang: ["9L1"], - bodyslam: ["9L1"], - quickattack: ["9L1"], - gigaimpact: ["9L1"], - headbutt: ["9L1"], - slash: ["9L1"], - fakeout: ["9L1"], - lastresort: ["9L1"], - retaliate: ["9L1"], - strength: ["9L1"], - scratch: ["9L1"], - iciclecrash: ["9L1"], - icefang: ["9L1"], - iceshard: ["9L1"], - earthquake: ["9L1"], - highhorsepower: ["9L1"], - stompingtantrum: ["9L1"], - superpower: ["9L1"], - brickbreak: ["9L1"], - revenge: ["9L1"], - rocksmash: ["9L1"], - crunch: ["9L1"], - bite: ["9L1"], - payback: ["9L1"], - haze: ["9L1"], - roar: ["9L1"], - assurance: ["9L1"], - thief: ["9L1"], - psychicfangs: ["9L1"], - wildcharge: ["9L1"], - thunderfang: ["9L1"], - megahorn: ["9L1"], - firstimpression: ["9L1"], - ironhead: ["9L1"], - hornleech: ["9L1"], - playrough: ["9L1"], - icebeam: ["9L1"], - blizzard: ["9L1"], - frostbreath: ["9L1"], - freezedry: ["9L1"], - aurorabeam: ["9L1"], - powdersnow: ["9L1"], - hypervoice: ["9L1"], - hyperbeam: ["9L1"], - snarl: ["9L1"], - darkpulse: ["9L1"], - surf: ["9L1"], - waterpulse: ["9L1"], - shockwave: ["9L1"], - mudslap: ["9L1"], - swordsdance: ["9L1"], - bulkup: ["9L1"], - taunt: ["9L1"], - nobleroar: ["9L1"], - workup: ["9L1"], - snowscape: ["9L1"], - sunnyday: ["9L1"], - raindance: ["9L1"], - auroraveil: ["9L1"], - grassyterrain: ["9L1"], - mistyterrain: ["9L1"], - yawn: ["9L1"], - babydolleyes: ["9L1"], - charm: ["9L1"], - focusenergy: ["9L1"], - howl: ["9L1"], - helpinghand: ["9L1"], - sheercold: ["9L1"], - honeclaws: ["9L1"], - substitute: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - round: ["9L1"], - endure: ["9L1"], - icespinner: ["9L1"], - crystalcutter: ["9L1"], - crystalbash: ["9L1"], - crystalbeam: ["9L1"], - crystalfortification: ["9L1"], - crystalshard: ["9L1"], - feralbite: ["9L1"], - feralshred: ["9L1"], - feralrush: ["9L1"], - feralshriek: ["9L1"], - feralpower: ["9L1"], - feralbreath: ["9L1"], - feralhealing: ["9L1"], - feralresilience: ["9L1"], - }, - }, - woolora: { - learnset: { - moonblast: ["9L1"], - wildcharge:["9L1"], - healingwish: ["9L1"], - drainingkiss: ["9L1"], - mistyexplosion: ["9L1"], - disarmingvoice: ["9L1"], - mysticalfire: ["9L1"], - facade: ["9L1"], - psychic: ["9L1"], - psyshock: ["9L1"], - storedpower: ["9L1"], - shadowball: ["9L1"], - energyball: ["9L1"], - playrough: ["9L1"], - highhorsepower: ["9L1"], - zenheadbutt: ["9L1"], - bodypress: ["9L1"], - megahorn: ["9L1"], - bounce: ["9L1"], - hyperbeam: ["9L1"], - gigaimpact: ["9L1"], - bodyslam: ["9L1"], - doubleedge: ["9L1"], - takedown: ["9L1"], - retaliate: ["9L1"], - headbutt: ["9L1"], - tackle: ["9L1"], - calmmind: ["9L1"], - moonlight: ["9L1"], - teleport: ["9L1"], - roar: ["9L1"], - wish: ["9L1"], - cottonguard: ["9L1"], - healbell: ["9L1"], - bulkup: ["9L1"], - mistyterrain: ["9L1"], - raindance: ["9L1"], - growl: ["9L1"], - babydolleyes: ["9L1"], - guardswap: ["9L1"], - helpinghand: ["9L1"], - batonpass: ["9L1"], - agility: ["9L1"], - substitute: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - round: ["9L1"], - endure: ["9L1"], - crystaltail: ["9L1"], - crystalbeam: ["9L1"], - crystalburst: ["9L1"], - crystalhealing: ["9L1"], - crystalfortification: ["9L1"], - feralrush: ["9L1"], - feralshriek: ["9L1"], - feralpower: ["9L1"], - feralbreath: ["9L1"], - feralhealing: ["9L1"], - feralresilience: ["9L1"], - }, - }, - albatrygon: { - learnset: { - encore: ["9L1"], - taunt: ["9L1"], - bravebird: ["9L1"], - helpinghand: ["9L1"], - acrobatics: ["9L1"], - beatup: ["9L1"], - drillpeck: ["9L1"], - dualwingbeat: ["9L1"], - fly: ["9L1"], - aerialace: ["9L1"], - pluck: ["9L1"], - peck: ["9L1"], - sacredsword: ["9L1"], - foulplay: ["9L1"], - darkestlariat: ["9L1"], - payback: ["9L1"], - assurance: ["9L1"], - brutalswing: ["9L1"], - thief: ["9L1"], - doubleedge: ["9L1"], - bodyslam: ["9L1"], - takedown: ["9L1"], - gigaimpact: ["9L1"], - spikes: ["9L1"], - switcheroo: ["9L1"], - partingshot: ["9L1"], - defog: ["9L1"], - memento: ["9L1"], - featherdance: ["9L1"], - workup: ["9L1"], - smartstrike: ["9L1"], - steelwing: ["9L1"], - growl: ["9L1"], - sunnyday: ["9L1"], - raindance: ["9L1"], - sandstorm: ["9L1"], - snowscape: ["9L1"], - mistyterrain: ["9L1"], - skillswap: ["9L1"], - screech: ["9L1"], - tailwind: ["9L1"], - wonderroom: ["9L1"], - magicroom: ["9L1"], - mimic: ["9L1"], - allyswitch: ["9L1"], - focusenergy: ["9L1"], - laserfocus: ["9L1"], - tidyup: ["9L1"], - substitute: ["9L1"], - protect: ["9L1"], - facade: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - round: ["9L1"], - whirlwind: ["9L1"], - endure: ["9L1"], - wideguard: ["9L1"], - quickguard: ["9L1"], - uturn: ["9L1"], - crystalcutter: ["9L1"], - crystalbeam: ["9L1"], - crystalburst: ["9L1"], - crystalfortification: ["9L1"], - crystalshard: ["9L1"], - feralbite: ["9L1"], - feralrush: ["9L1"], - feralshriek: ["9L1"], - feralpower: ["9L1"], - feralbreath: ["9L1"], - feralresilience: ["9L1"], - feralspray: ["9L1"], - }, - }, - orchile: { - learnset: { - moonblast: ["9L1"], - dazzlinggleam: ["9L1"], - drainingkiss: ["9L1"], - sleeppowder: ["9L1"], - ragepowder: ["9L1"], - beatup: ["9L1"], - sludgebomb: ["9L1"], - clearsmog: ["9L1"], - gigadrain: ["9L1"], - leafstorm: ["9L1"], - energyball: ["9L1"], - earthpower: ["9L1"], - facade: ["9L1"], - mysticalfire: ["9L1"], - psychic: ["9L1"], - shadowball: ["9L1"], - darkpulse: ["9L1"], - strengthsap: ["9L1"], - willowisp: ["9L1"], - spikes: ["9L1"], - toxicspikes: ["9L1"], - toxic: ["9L1"], - stunspore: ["9L1"], - leechseed: ["9L1"], - calmmind: ["9L1"], - aromatherapy: ["9L1"], - synthesis: ["9L1"], - trickroom: ["9L1"], - sludge: ["9L1"], - acid: ["9L1"], - venoshock: ["9L1"], - gunkshot: ["9L1"], - poisonjab: ["9L1"], - crosspoison: ["9L1"], - poisonsting: ["9L1"], - solarbeam: ["9L1"], - grassknot: ["9L1"], - petaldance: ["9L1"], - vinewhip: ["9L1"], - megadrain: ["9L1"], - petalblizzard: ["9L1"], - seedbomb: ["9L1"], - magicalleaf: ["9L1"], - absorb: ["9L1"], - grassyglide: ["9L1"], - razorleaf: ["9L1"], - mudslap: ["9L1"], - dreameater: ["9L1"], - psychocut: ["9L1"], - nightslash: ["9L1"], - payback: ["9L1"], - pollenpuff: ["9L1"], - cut: ["9L1"], - endeavor: ["9L1"], - slash: ["9L1"], - helpinghand: ["9L1"], - wrap: ["9L1"], - bodyslam: ["9L1"], - tackle: ["9L1"], - growth: ["9L1"], - worryseed: ["9L1"], - sweetscent: ["9L1"], - safeguard: ["9L1"], - corrosivegas: ["9L1"], - poisonpowder: ["9L1"], - venomdrench: ["9L1"], - disable: ["9L1"], - curse: ["9L1"], - sunnyday: ["9L1"], - raindance: ["9L1"], - grassyterrain: ["9L1"], - attract: ["9L1"], - protect: ["9L1"], - substitute: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - round: ["9L1"], - snore: ["9L1"], - endure: ["9L1"], - crystalcutter: ["9L1"], - crystalbeam: ["9L1"], - crystalcage: ["9L1"], - crystalburst: ["9L1"], - crystalhealing: ["9L1"], - crystalfortification: ["9L1"], - crystalshard: ["9L1"], - feralshred: ["9L1"], - feralshriek: ["9L1"], - feralpower: ["9L1"], - feralspray: ["9L1"], - feralresilience: ["9L1"], - feralhealing: ["9L1"], - }, - }, - embuck: { - learnset: { - flareblitz: ["9L1"], - beatup: ["9L1"], - blazekick: ["9L1"], - closecombat: ["9L1"], - highhorsepower: ["9L1"], - megahorn: ["9L1"], - uturn: ["9L1"], - morningsun: ["9L1"], - bulkup: ["9L1"], - willowisp: ["9L1"], - taunt: ["9L1"], - doublekick: ["9L1"], - tackle: ["9L1"], - growl: ["9L1"], - smokescreen: ["9L1"], - ember: ["9L1"], - sunnyday: ["9L1"], - flamecharge: ["9L1"], - snarl: ["9L1"], - agility: ["9L1"], - inferno: ["9L1"], - superpower: ["9L1"], - aerialace: ["9L1"], - assurance: ["9L1"], - attract: ["9L1"], - bounce: ["9L1"], - confide: ["9L1"], - darkpulse: ["9L1"], - doubleteam: ["9L1"], - echoedvoice: ["9L1"], - endure: ["9L1"], - energyball: ["9L1"], - facade: ["9L1"], - falseswipe: ["9L1"], - fly: ["9L1"], - focusblast: ["9L1"], - frustration: ["9L1"], - gigaimpact: ["9L1"], - heatwave: ["9L1"], - hyperbeam: ["9L1"], - incinerate: ["9L1"], - laserfocus: ["9L1"], - nastyplot: ["9L1"], - protect: ["9L1"], - raindance: ["9L1"], - rest: ["9L1"], - return: ["9L1"], - round: ["9L1"], - sleeptalk: ["9L1"], - snore: ["9L1"], - solarbeam: ["9L1"], - substitute: ["9L1"], - swagger: ["9L1"], - swordsdance: ["9L1"], - thief: ["9L1"], - throatchop: ["9L1"], - uproar: ["9L1"], - wildcharge:["9L1"], - workup: ["9L1"], - fireblast: ["9L1"], - flamethrower: ["9L1"], - helpinghand: ["9L1"], - aurasphere: ["9L1"], - vacuumwave: ["9L1"], - crystalbash: ["9L1"], - crystalcage: ["9L1"], - crystalhealing: ["9L1"], - crystalfortification: ["9L1"], - crystalshard: ["9L1"], - feralbite: ["9L1"], - feralrush: ["9L1"], - feralpower: ["9L1"], - feralbreath: ["9L1"], - feralresilience: ["9L1"], - feralhealing: ["9L1"], - }, - }, - cindoe: { - learnset: { - fierywrath: ["9L1"], - overheat: ["9L1"], - beatup: ["9L1"], - fireblast: ["9L1"], - flamethrower: ["9L1"], - mysticalfire: ["9L1"], - psychic: ["9L1"], - nastyplot: ["9L1"], - calmmind: ["9L1"], - morningsun: ["9L1"], - taunt: ["9L1"], - moonlight: ["9L1"], - tackle: ["9L1"], - growl: ["9L1"], - smokescreen: ["9L1"], - ember: ["9L1"], - agility: ["9L1"], - inferno: ["9L1"], - blazekick: ["9L1"], - darkpulse: ["9L1"], - partingshot: ["9L1"], - aerialace: ["9L1"], - assurance: ["9L1"], - attract: ["9L1"], - bounce: ["9L1"], - confide: ["9L1"], - doubleteam: ["9L1"], - echoedvoice: ["9L1"], - endure: ["9L1"], - energyball: ["9L1"], - facade: ["9L1"], - falseswipe: ["9L1"], - focusblast: ["9L1"], - frustration: ["9L1"], - gigaimpact: ["9L1"], - incinerate: ["9L1"], - heatwave: ["9L1"], - hyperbeam: ["9L1"], - laserfocus: ["9L1"], - protect: ["9L1"], - raindance: ["9L1"], - rest: ["9L1"], - return: ["9L1"], - round: ["9L1"], - sleeptalk: ["9L1"], - snarl: ["9L1"], - snore: ["9L1"], - solarbeam: ["9L1"], - substitute: ["9L1"], - sunnyday: ["9L1"], - swagger: ["9L1"], - swordsdance: ["9L1"], - thief: ["9L1"], - throatchop: ["9L1"], - uproar: ["9L1"], - helpinghand: ["9L1"], - uturn: ["9L1"], - wildcharge:["9L1"], - willowisp: ["9L1"], - workup: ["9L1"], - crystalbeam: ["9L1"], - crystalcage: ["9L1"], - crystalburst: ["9L1"], - crystalhealing: ["9L1"], - crystalfortification: ["9L1"], - crystalshard: ["9L1"], - feralbite: ["9L1"], - feralrush: ["9L1"], - feralpower: ["9L1"], - feralbreath: ["9L1"], - feralresilience: ["9L1"], - feralhealing: ["9L1"], - }, - }, - cobracotta: { - learnset: { - powerwhip: ["9L1"], - toxic: ["9L1"], - petalblizzard: ["9L1"], - seedbomb: ["9L1"], - bulletseed: ["9L1"], - grassyglide: ["9L1"], - razorleaf: ["9L1"], - gunkshot: ["9L1"], - poisonjab: ["9L1"], - poisonfang: ["9L1"], - poisonsting: ["9L1"], - earthquake: ["9L1"], - bulldoze: ["9L1"], - stoneedge: ["9L1"], - rockslide: ["9L1"], - rocktomb: ["9L1"], - rockblast: ["9L1"], - rollout: ["9L1"], - knockoff: ["9L1"], - suckerpunch: ["9L1"], - crunch: ["9L1"], - bite: ["9L1"], - brutalswing: ["9L1"], - payback: ["9L1"], - thief: ["9L1"], - psychicfangs: ["9L1"], - rocksmash: ["9L1"], - revenge: ["9L1"], - bodyslam: ["9L1"], - gigaimpact: ["9L1"], - wrap: ["9L1"], - gigadrain: ["9L1"], - energyball: ["9L1"], - leafstorm: ["9L1"], - grassknot: ["9L1"], - solarbeam: ["9L1"], - megadrain: ["9L1"], - petaldance: ["9L1"], - sludgebomb: ["9L1"], - venoshock: ["9L1"], - sludge: ["9L1"], - acid: ["9L1"], - acidspray: ["9L1"], - belch: ["9L1"], - darkpulse: ["9L1"], - earthpower: ["9L1"], - ancientpower: ["9L1"], - sweetscent: ["9L1"], - naturepower: ["9L1"], - hyperbeam: ["9L1"], - shellsmash: ["9L1"], - coil: ["9L1"], - glare: ["9L1"], - nastyplot: ["9L1"], - stealthrock: ["9L1"], - synthesis: ["9L1"], - leechseed: ["9L1"], - spitup: ["9L1"], - stockpile: ["9L1"], - swallow: ["9L1"], - focusenergy: ["9L1"], - sunnyday: ["9L1"], - raindance: ["9L1"], - sandstorm: ["9L1"], - grassyterrain: ["9L1"], - laserfocus: ["9L1"], - helpinghand: ["9L1"], - substitute: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - round: ["9L1"], - endure: ["9L1"], - facade: ["9L1"], - dragontail: ["9L1"], - crystaltail: ["9L1"], - crystalbash: ["9L1"], - crystalbeam: ["9L1"], - crystalcage: ["9L1"], - crystalhealing: ["9L1"], - crystalfortification: ["9L1"], - crystalshard: ["9L1"], - feralbite: ["9L1"], - feralpower: ["9L1"], - feralbreath: ["9L1"], - feralspray: ["9L1"], - feralresilience: ["9L1"], - feralhealing: ["9L1"], - }, - }, - minillow: { - learnset: { - haze: ["9L1"], - hydropump: ["9L1"], - surf: ["9L1"], - scald: ["9L1"], - chillingwater: ["9L1"], - moonblast: ["9L1"], - nastyplot: ["9L1"], - drainingkiss: ["9L1"], - mistyexplosion: ["9L1"], - icebeam: ["9L1"], - psychic: ["9L1"], - flipturn: ["9L1"], - moonlight: ["9L1"], - bubble: ["9L1"], - tailwhip: ["9L1"], - babydolleyes: ["9L1"], - aquajet: ["9L1"], - aquaring: ["9L1"], - bubblebeam: ["9L1"], - soak: ["9L1"], - waterfall: ["9L1"], - agility: ["9L1"], - dazzlinggleam: ["9L1"], - attract: ["9L1"], - blizzard: ["9L1"], - bodyslam: ["9L1"], - bounce: ["9L1"], - dive: ["9L1"], - doubleteam: ["9L1"], - drillrun: ["9L1"], - helpinghand: ["9L1"], - endure: ["9L1"], - facade: ["9L1"], - gigaimpact: ["9L1"], - snowscape: ["9L1"], - hyperbeam: ["9L1"], - icywind: ["9L1"], - muddywater: ["9L1"], - mudshot: ["9L1"], - poisonjab: ["9L1"], - protect: ["9L1"], - raindance: ["9L1"], - rest: ["9L1"], - round: ["9L1"], - scaleshot: ["9L1"], - shadowball: ["9L1"], - sleeptalk: ["9L1"], - snore: ["9L1"], - substitute: ["9L1"], - swagger: ["9L1"], - swift: ["9L1"], - waterpulse: ["9L1"], - whirlpool: ["9L1"], - zenheadbutt: ["9L1"], - crystaltail: ["9L1"], - crystalbeam: ["9L1"], - crystalburst: ["9L1"], - crystalhealing: ["9L1"], - feralbite: ["9L1"], - feralpower: ["9L1"], - feralspray: ["9L1"], - feralresilience: ["9L1"], - followme: ["9L1"], - }, - }, - crossont: { - learnset: { - recover: ["9L1"], - megahorn: ["9L1"], - pinmissile: ["9L1"], - attackorder: ["9L1"], - closecombat: ["9L1"], - superpower: ["9L1"], - rockblast: ["9L1"], - circlethrow: ["9L1"], - knockoff: ["9L1"], - earthquake: ["9L1"], - stoneedge: ["9L1"], - spiritshackle: ["9L1"], - spikes: ["9L1"], - bulkup: ["9L1"], - focusenergy: ["9L1"], - submission: ["9L1"], - astonish: ["9L1"], - defensecurl: ["9L1"], - strugglebug: ["9L1"], - fling: ["9L1"], - armthrust: ["9L1"], - lockon: ["9L1"], - bulletseed: ["9L1"], - dynamicpunch: ["9L1"], - laserfocus: ["9L1"], - crosschop: ["9L1"], - wideguard: ["9L1"], - finalgambit: ["9L1"], - aerialace: ["9L1"], - attract: ["9L1"], - brickbreak: ["9L1"], - bugbite: ["9L1"], - bugbuzz: ["9L1"], - bulldoze: ["9L1"], - confide: ["9L1"], - covet: ["9L1"], - doubleteam: ["9L1"], - endeavor: ["9L1"], - endure: ["9L1"], - facade: ["9L1"], - fakeout: ["9L1"], - firepunch: ["9L1"], - focusblast: ["9L1"], - focuspunch: ["9L1"], - frustration: ["9L1"], - gigaimpact: ["9L1"], - gunkshot: ["9L1"], - helpinghand: ["9L1"], - hyperbeam: ["9L1"], - icepunch: ["9L1"], - lowkick: ["9L1"], - lowsweep: ["9L1"], - outrage: ["9L1"], - payback: ["9L1"], - poweruppunch: ["9L1"], - protect: ["9L1"], - raindance: ["9L1"], - rest: ["9L1"], - return: ["9L1"], - rockclimb: ["9L1"], - rockslide: ["9L1"], - rocksmash: ["9L1"], - rocktomb: ["9L1"], - roleplay: ["9L1"], - round: ["9L1"], - seedbomb: ["9L1"], - sleeptalk: ["9L1"], - smackdown: ["9L1"], - snore: ["9L1"], - spite: ["9L1"], - stompingtantrum: ["9L1"], - strength: ["9L1"], - substitute: ["9L1"], - sunnyday: ["9L1"], - swagger: ["9L1"], - taunt: ["9L1"], - thief: ["9L1"], - throatchop: ["9L1"], - thunderpunch: ["9L1"], - uproar: ["9L1"], - workup: ["9L1"], - xscissor: ["9L1"], - axekick: ["9L1"], - crystalcutter: ["9L1"], - crystalbash: ["9L1"], - crystalcage: ["9L1"], - crystalfortification: ["9L1"], - crystalshard: ["9L1"], - feralrush: ["9L1"], - feralshriek: ["9L1"], - feralresilience: ["9L1"], - }, - }, - torgeist: { - learnset: { - shadowball: ["9L1"], - facade: ["9L1"], - hex: ["9L1"], - ominouswind: ["9L1"], - boomburst: ["9L1"], - hypervoice: ["9L1"], - triattack: ["9L1"], - hyperbeam: ["9L1"], - hurricane: ["9L1"], - airslash: ["9L1"], - weatherball: ["9L1"], - heatwave: ["9L1"], - icywind: ["9L1"], - darkpulse: ["9L1"], - shockwave: ["9L1"], - uturn: ["9L1"], - poltergeist: ["9L1"], - shadowsneak: ["9L1"], - phantomforce: ["9L1"], - astonish: ["9L1"], - dualwingbeat: ["9L1"], - acrobatics: ["9L1"], - suckerpunch: ["9L1"], - foulplay: ["9L1"], - thief: ["9L1"], - payback: ["9L1"], - headbutt: ["9L1"], - wrap: ["9L1"], - doubleedge: ["9L1"], - painsplit: ["9L1"], - trick: ["9L1"], - taunt: ["9L1"], - nastyplot: ["9L1"], - calmmind: ["9L1"], - willowisp: ["9L1"], - toxicthread: ["9L1"], - tailwind: ["9L1"], - defog: ["9L1"], - raindance: ["9L1"], - disable: ["9L1"], - workup: ["9L1"], - lightscreen: ["9L1"], - reflect: ["9L1"], - meanlook: ["9L1"], - perishsong: ["9L1"], - metalsound: ["9L1"], - gust: ["9L1"], - haze: ["9L1"], - screech: ["9L1"], - imprison: ["9L1"], - destinybond: ["9L1"], - memento: ["9L1"], - magiccoat: ["9L1"], - sunnyday: ["9L1"], - substitute: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - round: ["9L1"], - endure: ["9L1"], - crystalbeam: ["9L1"], - crystalcage: ["9L1"], - crystalburst: ["9L1"], - crystalhealing: ["9L1"], - crystalshard: ["9L1"], - feralrush: ["9L1"], - feralshriek: ["9L1"], - feralpower: ["9L1"], - feralhealing: ["9L1"], - }, - }, - platypad: { - learnset: { - revivalblessing: ["9L1"], - wavecrash: ["9L1"], - wish: ["9L1"], - gigadrain: ["9L1"], - leafstorm: ["9L1"], - sludgebomb: ["9L1"], - weatherball: ["9L1"], - hydropump: ["9L1"], - scald: ["9L1"], - shadowball: ["9L1"], - flipturn: ["9L1"], - dragontail: ["9L1"], - poisonjab: ["9L1"], - petalblizzard: ["9L1"], - earthquake: ["9L1"], - slackoff: ["9L1"], - spikes: ["9L1"], - toxicspikes: ["9L1"], - roar: ["9L1"], - toxic: ["9L1"], - aromatherapy: ["9L1"], - haze: ["9L1"], - leechseed: ["9L1"], - stunspore: ["9L1"], - bellydrum: ["9L1"], - venoshock: ["9L1"], - sludgewave: ["9L1"], - poisonsting: ["9L1"], - crosspoison: ["9L1"], - poisontail: ["9L1"], - solarbeam: ["9L1"], - energyball: ["9L1"], - grassknot: ["9L1"], - magicalleaf: ["9L1"], - seedbomb: ["9L1"], - bulletseed: ["9L1"], - grassyglide: ["9L1"], - megadrain: ["9L1"], - absorb: ["9L1"], - aquatail: ["9L1"], - liquidation: ["9L1"], - surf: ["9L1"], - whirlpool: ["9L1"], - icywind: ["9L1"], - zenheadbutt: ["9L1"], - extrasensory: ["9L1"], - bulldoze: ["9L1"], - stompingtantrum: ["9L1"], - rockslide: ["9L1"], - rollout: ["9L1"], - outrage: ["9L1"], - shockwave: ["9L1"], - drainingkiss: ["9L1"], - nightshade: ["9L1"], - shadowclaw: ["9L1"], - wildcharge: ["9L1"], - payback: ["9L1"], - assurance: ["9L1"], - fling: ["9L1"], - pollenpuff: ["9L1"], - doubleedge: ["9L1"], - hyperbeam: ["9L1"], - gigaimpact: ["9L1"], - bodyslam: ["9L1"], - covet: ["9L1"], - hypervoice: ["9L1"], - uproar: ["9L1"], - tackle: ["9L1"], - curse: ["9L1"], - moonlight: ["9L1"], - venomdrench: ["9L1"], - poisonpowder: ["9L1"], - yawn: ["9L1"], - defensecurl: ["9L1"], - attract: ["9L1"], - afteryou: ["9L1"], - charm: ["9L1"], - psychup: ["9L1"], - lifedew: ["9L1"], - amnesia: ["9L1"], - stockpile: ["9L1"], - swallow: ["9L1"], - spitup: ["9L1"], - sunnyday: ["9L1"], - raindance: ["9L1"], - snowscape: ["9L1"], - sandstorm: ["9L1"], - grassyterrain: ["9L1"], - safeguard: ["9L1"], - wideguard: ["9L1"], - block: ["9L1"], - helpinghand: ["9L1"], - substitute: ["9L1"], - protect: ["9L1"], - facade: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - round: ["9L1"], - endure: ["9L1"], - chillingwater: ["9L1"], - crystaltail: ["9L1"], - crystalbeam: ["9L1"], - crystalburst: ["9L1"], - crystalhealing: ["9L1"], - crystalfortification: ["9L1"], - crystalshard: ["9L1"], - feralbite: ["9L1"], - feralshriek: ["9L1"], - feralpower: ["9L1"], - feralbreath: ["9L1"], - feralhealing: ["9L1"], - feralspray: ["9L1"], - feralresilience: ["9L1"], - }, - }, - lumoth: { - learnset: { - shadowball: ["9L1"], - hex: ["9L1"], - psychic: ["9L1"], - psyshock: ["9L1"], - bugbuzz: ["9L1"], - energyball: ["9L1"], - gigadrain: ["9L1"], - thunderbolt: ["9L1"], - thunder: ["9L1"], - quiverdance: ["9L1"], - willowisp: ["9L1"], - sleeppowder: ["9L1"], - defog: ["9L1"], - astonish: ["9L1"], - leer: ["9L1"], - infestation: ["9L1"], - stringshot: ["9L1"], - silverwind: ["9L1"], - psybeam: ["9L1"], - ragepowder: ["9L1"], - calmmind: ["9L1"], - expandingforce: ["9L1"], - allyswitch: ["9L1"], - chargebeam: ["9L1"], - confide: ["9L1"], - covet: ["9L1"], - darkpulse: ["9L1"], - doubleteam: ["9L1"], - dreameater: ["9L1"], - embargo: ["9L1"], - facade: ["9L1"], - frustration: ["9L1"], - grassknot: ["9L1"], - gravity: ["9L1"], - hyperbeam: ["9L1"], - laserfocus: ["9L1"], - lastresort: ["9L1"], - lightscreen: ["9L1"], - magiccoat: ["9L1"], - magicroom: ["9L1"], - protect: ["9L1"], - psychup: ["9L1"], - raindance: ["9L1"], - reflect: ["9L1"], - rest: ["9L1"], - return: ["9L1"], - round: ["9L1"], - safeguard: ["9L1"], - shockwave: ["9L1"], - signalbeam: ["9L1"], - skillswap: ["9L1"], - sleeptalk: ["9L1"], - snatch: ["9L1"], - snore: ["9L1"], - strugglebug: ["9L1"], - substitute: ["9L1"], - sunnyday: ["9L1"], - swagger: ["9L1"], - haze: ["9L1"], - telekinesis: ["9L1"], - thunderwave: ["9L1"], - torment: ["9L1"], - helpinghand: ["9L1"], - trick: ["9L1"], - trickroom: ["9L1"], - uturn: ["9L1"], - wonderroom: ["9L1"], - zenheadbutt: ["9L1"], - silktrap: ["9L1"], - crystalbeam: ["9L1"], - crystalburst: ["9L1"], - crystalhealing: ["9L1"], - crystalfortification: ["9L1"], - feralshriek: ["9L1"], - feralpower: ["9L1"], - feralspray: ["9L1"], - }, - }, - aurorowl: { - learnset: { - haze: ["9L1"], - frostbreath: ["9L1"], - dualwingbeat: ["9L1"], - icebeam: ["9L1"], - aircutter: ["9L1"], - hurricane: ["9L1"], - airslash: ["9L1"], - focusblast: ["9L1"], - iceshard: ["9L1"], - tripleaxel: ["9L1"], - aerialace: ["9L1"], - bravebird: ["9L1"], - uturn: ["9L1"], - nastyplot: ["9L1"], - sheercold: ["9L1"], - roost: ["9L1"], - defog: ["9L1"], - icywind: ["9L1"], - tackle: ["9L1"], - sandattack: ["9L1"], - gust: ["9L1"], - quickattack: ["9L1"], - whirlwind: ["9L1"], - featherdance: ["9L1"], - aurorabeam: ["9L1"], - attract: ["9L1"], - blizzard: ["9L1"], - confide: ["9L1"], - doubleteam: ["9L1"], - endure: ["9L1"], - facade: ["9L1"], - fly: ["9L1"], - frustration: ["9L1"], - gigaimpact: ["9L1"], - snowscape: ["9L1"], - hyperbeam: ["9L1"], - laserfocus: ["9L1"], - pluck: ["9L1"], - protect: ["9L1"], - raindance: ["9L1"], - rest: ["9L1"], - return: ["9L1"], - round: ["9L1"], - skyattack: ["9L1"], - sleeptalk: ["9L1"], - snore: ["9L1"], - steelwing: ["9L1"], - substitute: ["9L1"], - sunnyday: ["9L1"], - swagger: ["9L1"], - tailwind: ["9L1"], - thief: ["9L1"], - uproar: ["9L1"], - workup: ["9L1"], - crystalcutter: ["9L1"], - crystalbeam: ["9L1"], - crystalcage: ["9L1"], - crystalburst: ["9L1"], - crystalhealing: ["9L1"], - crystalshard: ["9L1"], - feralbite: ["9L1"], - feralshred: ["9L1"], - feralrush: ["9L1"], - feralshriek: ["9L1"], - feralpower: ["9L1"], - }, - }, - carapex: { - learnset: { - acrobatics: ["9L1"], - tailwind: ["9L1"], - megahorn: ["9L1"], - uturn: ["9L1"], - dualwingbeat: ["9L1"], - bodypress: ["9L1"], - knockoff: ["9L1"], - earthquake: ["9L1"], - stoneedge: ["9L1"], - stealthrock: ["9L1"], - defog: ["9L1"], - roost: ["9L1"], - irondefense: ["9L1"], - whirlwind: ["9L1"], - tackle: ["9L1"], - defensecurl: ["9L1"], - endure: ["9L1"], - rollout: ["9L1"], - furycutter: ["9L1"], - batonpass: ["9L1"], - reversal: ["9L1"], - bugbuzz: ["9L1"], - aerialace: ["9L1"], - airslash: ["9L1"], - allyswitch: ["9L1"], - attract: ["9L1"], - brutalswing: ["9L1"], - cut: ["9L1"], - dig: ["9L1"], - doubleteam: ["9L1"], - echoedvoice: ["9L1"], - energyball: ["9L1"], - facade: ["9L1"], - fly: ["9L1"], - frustration: ["9L1"], - gigadrain: ["9L1"], - helpinghand: ["9L1"], - hurricane: ["9L1"], - lastresort: ["9L1"], - leechlife: ["9L1"], - protect: ["9L1"], - raindance: ["9L1"], - rest: ["9L1"], - return: ["9L1"], - round: ["9L1"], - shadowball: ["9L1"], - shadowclaw: ["9L1"], - sleeptalk: ["9L1"], - snore: ["9L1"], - substitute: ["9L1"], - sunnyday: ["9L1"], - swagger: ["9L1"], - thief: ["9L1"], - uproar: ["9L1"], - workup: ["9L1"], - crystalcutter: ["9L1"], - crystalbash: ["9L1"], - crystalcage: ["9L1"], - crystalhealing: ["9L1"], - crystalfortification: ["9L1"], - crystalshard: ["9L1"], - feralshred: ["9L1"], - feralrush: ["9L1"], - feralspray: ["9L1"], - feralresilience: ["9L1"], - wideguard: ["9L1"], - }, - }, - dojodo: { - learnset: { - highjumpkick: ["9L1"], - closecombat: ["9L1"], - drainpunch: ["9L1"], - bodypress: ["9L1"], - knockoff: ["9L1"], - icepunch: ["9L1"], - firepunch: ["9L1"], - thunderpunch: ["9L1"], - poisonjab: ["9L1"], - stompingtantrum: ["9L1"], - bravebird: ["9L1"], - bulkup: ["9L1"], - swordsdance: ["9L1"], - irondefense: ["9L1"], - taunt: ["9L1"], - coaching: ["9L1"], - peck: ["9L1"], - sandattack: ["9L1"], - armthrust: ["9L1"], - fakeout: ["9L1"], - forcepalm: ["9L1"], - whirlwind: ["9L1"], - brickbreak: ["9L1"], - batonpass: ["9L1"], - detect: ["9L1"], - jumpkick: ["9L1"], - drillpeck: ["9L1"], - matblock: ["9L1"], - reversal: ["9L1"], - gigaimpact: ["9L1"], - attract: ["9L1"], - confide: ["9L1"], - dig: ["9L1"], - dualwingbeat: ["9L1"], - doubleteam: ["9L1"], - endure: ["9L1"], - facade: ["9L1"], - featherdance: ["9L1"], - fling: ["9L1"], - focusblast: ["9L1"], - focuspunch: ["9L1"], - frustration: ["9L1"], - helpinghand: ["9L1"], - hyperbeam: ["9L1"], - ironhead: ["9L1"], - beatup: ["9L1"], - lowkick: ["9L1"], - lowsweep: ["9L1"], - payback: ["9L1"], - pluck: ["9L1"], - poweruppunch: ["9L1"], - protect: ["9L1"], - raindance: ["9L1"], - rest: ["9L1"], - return: ["9L1"], - rocksmash: ["9L1"], - roleplay: ["9L1"], - round: ["9L1"], - sleeptalk: ["9L1"], - snore: ["9L1"], - strength: ["9L1"], - substitute: ["9L1"], - sunnyday: ["9L1"], - superpower: ["9L1"], - swagger: ["9L1"], - throatchop: ["9L1"], - workup: ["9L1"], - jetpunch: ["9L1"], - quickguard: ["9L1"], - crystalbash: ["9L1"], - crystalbeam: ["9L1"], - crystalcage: ["9L1"], - crystalfortification: ["9L1"], - feralbite: ["9L1"], - feralshred: ["9L1"], - feralrush: ["9L1"], - feralhealing: ["9L1"], - feralbreath: ["9L1"], - feralresilience: ["9L1"], - }, - }, - nunopod: { - learnset: { - lunge: ["9L1"], - beatup: ["9L1"], - leechlife: ["9L1"], - firstimpression: ["9L1"], - xscissor: ["9L1"], - furycutter: ["9L1"], - bugbite: ["9L1"], - earthquake: ["9L1"], - highhorsepower: ["9L1"], - stompingtantrum: ["9L1"], - bulldoze: ["9L1"], - dig: ["9L1"], - tripleaxel: ["9L1"], - highjumpkick: ["9L1"], - bodypress: ["9L1"], - rollingkick: ["9L1"], - brickbreak: ["9L1"], - tropkick: ["9L1"], - flipturn: ["9L1"], - zenheadbutt: ["9L1"], - ironhead: ["9L1"], - brutalswing: ["9L1"], - payback: ["9L1"], - blazekick: ["9L1"], - acrobatics: ["9L1"], - rapidspin: ["9L1"], - megakick: ["9L1"], - doubleedge: ["9L1"], - bodyslam: ["9L1"], - headbutt: ["9L1"], - pound: ["9L1"], - bugbuzz: ["9L1"], - strugglebug: ["9L1"], - earthpower: ["9L1"], - scorchingsands: ["9L1"], - energyball: ["9L1"], - gigadrain: ["9L1"], - solarbeam: ["9L1"], - surf: ["9L1"], - shadowball: ["9L1"], - extrasensory: ["9L1"], - recover: ["9L1"], - stealthrock: ["9L1"], - workup: ["9L1"], - toxic: ["9L1"], - swordsdance: ["9L1"], - acidarmor: ["9L1"], - trickroom: ["9L1"], - rototiller: ["9L1"], - safeguard: ["9L1"], - sandstorm: ["9L1"], - sunnyday: ["9L1"], - raindance: ["9L1"], - grassyterrain: ["9L1"], - mistyterrain: ["9L1"], - psychicterrain: ["9L1"], - electricterrain: ["9L1"], - substitute: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - facade: ["9L1"], - sleeptalk: ["9L1"], - round: ["9L1"], - endure: ["9L1"], - helpinghand: ["9L1"], - crystalbash: ["9L1"], - crystalbeam: ["9L1"], - crystalburst: ["9L1"], - crystalhealing: ["9L1"], - crystalfortification: ["9L1"], - crystalshard: ["9L1"], - feralrush: ["9L1"], - feralpower: ["9L1"], - feralspray: ["9L1"], - feralresilience: ["9L1"], - feralhealing: ["9L1"], - }, - }, - zeploom: { - learnset: { - scorchingsands: ["9L1"], - facade: ["9L1"], - earthpower: ["9L1"], - mudslap: ["9L1"], - mudbomb: ["9L1"], - mudshot: ["9L1"], - energysiphon: ["9L1"], - gigadrain: ["9L1"], - energyball: ["9L1"], - leafstorm: ["9L1"], - grassknot: ["9L1"], - megadrain: ["9L1"], - nightshade: ["9L1"], - shadowball: ["9L1"], - hex: ["9L1"], - clearsmog: ["9L1"], - sludgebomb: ["9L1"], - acidspray: ["9L1"], - darkpulse: ["9L1"], - leafblade: ["9L1"], - seedbomb: ["9L1"], - bulletseed: ["9L1"], - earthquake: ["9L1"], - uturn: ["9L1"], - gunkshot: ["9L1"], - poisonjab: ["9L1"], - acrobatics: ["9L1"], - aerialace: ["9L1"], - bounce: ["9L1"], - wrap: ["9L1"], - bodyslam: ["9L1"], - doubleedge: ["9L1"], - explosion: ["9L1"], - selfdestruct: ["9L1"], - pound: ["9L1"], - spore: ["9L1"], - synthesis: ["9L1"], - stealthrock: ["9L1"], - defog: ["9L1"], - toxic: ["9L1"], - encore: ["9L1"], - stunspore: ["9L1"], - memento: ["9L1"], - workup: ["9L1"], - leechseed: ["9L1"], - toxicthread: ["9L1"], - sunnyday: ["9L1"], - raindance: ["9L1"], - sandstorm: ["9L1"], - grassyterrain: ["9L1"], - substitute: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - round: ["9L1"], - endure: ["9L1"], - ragepowder: ["9L1"], - crystalbash: ["9L1"], - crystalcage: ["9L1"], - crystalhealing: ["9L1"], - crystalfortification: ["9L1"], - feralshred: ["9L1"], - feralpower: ["9L1"], - feralspray: ["9L1"], - feralresilience: ["9L1"], - feralhealing: ["9L1"], - }, - }, - brawnkey: { - learnset: { - bodypress: ["9L1"], - facade: ["9L1"], - beatup: ["9L1"], - closecombat: ["9L1"], - drainpunch: ["9L1"], - rocksmash: ["9L1"], - submission: ["9L1"], - revenge: ["9L1"], - brickbreak: ["9L1"], - crosschop: ["9L1"], - karatechop: ["9L1"], - poweruppunch: ["9L1"], - vitalthrow: ["9L1"], - ironhead: ["9L1"], - heavyslam: ["9L1"], - steelroller: ["9L1"], - smartstrike: ["9L1"], - earthquake: ["9L1"], - highhorsepower: ["9L1"], - bulldoze: ["9L1"], - stompingtantrum: ["9L1"], - rockslide: ["9L1"], - rocktomb: ["9L1"], - payback: ["9L1"], - thief: ["9L1"], - assurance: ["9L1"], - doubleedge: ["9L1"], - bodyslam: ["9L1"], - megakick: ["9L1"], - slam: ["9L1"], - gigaimpact: ["9L1"], - bind: ["9L1"], - pound: ["9L1"], - aurasphere: ["9L1"], - focusblast: ["9L1"], - vacuumwave: ["9L1"], - flashcannon: ["9L1"], - mirrorshot: ["9L1"], - mirrorcoat: ["9L1"], - psychic: ["9L1"], - psyshock: ["9L1"], - storedpower: ["9L1"], - shadowball: ["9L1"], - darkpulse: ["9L1"], - hypervoice: ["9L1"], - hyperbeam: ["9L1"], - triattack: ["9L1"], - irondefense: ["9L1"], - bulkup: ["9L1"], - stealthrock: ["9L1"], - spikes: ["9L1"], - calmmind: ["9L1"], - magiccoat: ["9L1"], - coaching: ["9L1"], - wideguard: ["9L1"], - workup: ["9L1"], - sunnyday: ["9L1"], - raindance: ["9L1"], - sandstorm: ["9L1"], - snowscape: ["9L1"], - psychicterrain: ["9L1"], - substitute: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - round: ["9L1"], - endure: ["9L1"], - chillyreception: ["9L1"], - crystalcutter: ["9L1"], - crystalbash: ["9L1"], - crystalbeam: ["9L1"], - crystalcage: ["9L1"], - crystalburst: ["9L1"], - crystalfortification: ["9L1"], - crystalshard: ["9L1"], - feralshred: ["9L1"], - feralrush: ["9L1"], - feralpower: ["9L1"], - feralhealing: ["9L1"], - feralresilience: ["9L1"], - }, - }, - salamalix: { - learnset: { - accelerock: ["9L1"], - stoneedge: ["9L1"], - beatup: ["9L1"], - rockslide: ["9L1"], - rockblast: ["9L1"], - rocktomb: ["9L1"], - rockthrow: ["9L1"], - rockpolish: ["9L1"], - ironhead: ["9L1"], - bulletpunch: ["9L1"], - irontail: ["9L1"], - metalclaw: ["9L1"], - earthquake: ["9L1"], - stompingtantrum: ["9L1"], - bulldoze: ["9L1"], - closecombat: ["9L1"], - superpower: ["9L1"], - bodypress: ["9L1"], - rocksmash: ["9L1"], - poweruppunch: ["9L1"], - revenge: ["9L1"], - brickbreak: ["9L1"], - crunch: ["9L1"], - bite: ["9L1"], - payback: ["9L1"], - assurance: ["9L1"], - psychicfangs: ["9L1"], - zenheadbutt: ["9L1"], - firefang: ["9L1"], - thunderfang: ["9L1"], - outrage: ["9L1"], - dragonhammer: ["9L1"], - dragontail: ["9L1"], - acrobatics: ["9L1"], - aerialace: ["9L1"], - doubleedge: ["9L1"], - bodyslam: ["9L1"], - headbutt: ["9L1"], - retaliate: ["9L1"], - gigaimpact: ["9L1"], - stealthrock: ["9L1"], - spikes: ["9L1"], - swordsdance: ["9L1"], - bulkup: ["9L1"], - taunt: ["9L1"], - torment: ["9L1"], - scaryface: ["9L1"], - workup: ["9L1"], - irondefense: ["9L1"], - defensecurl: ["9L1"], - sandstorm: ["9L1"], - snowscape: ["9L1"], - sunnyday: ["9L1"], - raindance: ["9L1"], - focusenergy: ["9L1"], - laserfocus: ["9L1"], - honeclaws: ["9L1"], - substitute: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - round: ["9L1"], - endure: ["9L1"], - roar: ["9L1"], - wideguard: ["9L1"], - crystaltail: ["9L1"], - crystalbash: ["9L1"], - crystalcage: ["9L1"], - crystalburst: ["9L1"], - crystalfortification: ["9L1"], - crystalshard: ["9L1"], - feralbite: ["9L1"], - feralrush: ["9L1"], - feralshriek: ["9L1"], - feralbreath: ["9L1"], - feralhealing: ["9L1"], - feralresilience: ["9L1"], - }, - }, - cinnastar: { - learnset: { - sludgebomb: ["9L1"], - sludgewave: ["9L1"], - focusblast: ["9L1"], - clearsmog: ["9L1"], - poisonjab: ["9L1"], - powergem: ["9L1"], - stoneedge: ["9L1"], - rockblast: ["9L1"], - rockslide: ["9L1"], - earthquake: ["9L1"], - earthpower: ["9L1"], - toxic: ["9L1"], - recover: ["9L1"], - stealthrock: ["9L1"], - wish: ["9L1"], - haze: ["9L1"], - corrosivegas: ["9L1"], - sludge: ["9L1"], - acid: ["9L1"], - acidspray: ["9L1"], - venoshock: ["9L1"], - rocktomb: ["9L1"], - rollout: ["9L1"], - rockthrow: ["9L1"], - meteorbeam: ["9L1"], - ancientpower: ["9L1"], - sandtomb: ["9L1"], - magnitude: ["9L1"], - mudslap: ["9L1"], - dazzlinggleam: ["9L1"], - drainingkiss: ["9L1"], - psychic: ["9L1"], - psychocut: ["9L1"], - flashcannon: ["9L1"], - smartstrike: ["9L1"], - doubleedge: ["9L1"], - bodyslam: ["9L1"], - takedown: ["9L1"], - explosion: ["9L1"], - lightscreen: ["9L1"], - flash: ["9L1"], - afteryou: ["9L1"], - guardsplit: ["9L1"], - guardswap: ["9L1"], - skillswap: ["9L1"], - powertrick: ["9L1"], - harden: ["9L1"], - irondefense: ["9L1"], - acidarmor: ["9L1"], - safeguard: ["9L1"], - wonderroom: ["9L1"], - sandstorm: ["9L1"], - raindance: ["9L1"], - sunnyday: ["9L1"], - substitute: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - round: ["9L1"], - endure: ["9L1"], - crystalbash: ["9L1"], - crystalbeam: ["9L1"], - crystalhealing: ["9L1"], - crystalfortification: ["9L1"], - crystalshard: ["9L1"], - feralpower: ["9L1"], - feralspray: ["9L1"], - feralhealing: ["9L1"], - feralresilience: ["9L1"], - mortalspin: ["9L1"], - }, - }, - muabboa: { - learnset: { - earthquake: ["9L1"], - highhorsepower: ["9L1"], - stompingtantrum: ["9L1"], - bulldoze: ["9L1"], - closecombat: ["9L1"], - superpower: ["9L1"], - sacredsword: ["9L1"], - highjumpkick: ["9L1"], - machpunch: ["9L1"], - brickbreak: ["9L1"], - crosschop: ["9L1"], - karatechop: ["9L1"], - poweruppunch: ["9L1"], - rocksmash: ["9L1"], - submission: ["9L1"], - vitalthrow: ["9L1"], - revenge: ["9L1"], - uturn: ["9L1"], - xscissor: ["9L1"], - knockoff: ["9L1"], - nightslash: ["9L1"], - payback: ["9L1"], - assurance: ["9L1"], - thief: ["9L1"], - leafblade: ["9L1"], - rockslide: ["9L1"], - rocktomb: ["9L1"], - acrobatics: ["9L1"], - aerialace: ["9L1"], - doubleedge: ["9L1"], - bodyslam: ["9L1"], - slash: ["9L1"], - gigaimpact: ["9L1"], - quickattack: ["9L1"], - fakeout: ["9L1"], - smartstrike: ["9L1"], - zenheadbutt: ["9L1"], - aurasphere: ["9L1"], - focusblast: ["9L1"], - earthpower: ["9L1"], - scorchingsands: ["9L1"], - shadowball: ["9L1"], - hypervoice: ["9L1"], - hyperbeam: ["9L1"], - swordsdance: ["9L1"], - encore: ["9L1"], - switcheroo: ["9L1"], - sunnyday: ["9L1"], - raindance: ["9L1"], - sandstorm: ["9L1"], - grassyterrain: ["9L1"], - substitute: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - round: ["9L1"], - endure: ["9L1"], - quickguard: ["9L1"], - crystaltail: ["9L1"], - crystalhealing: ["9L1"], - crystalshard: ["9L1"], - feralbite: ["9L1"], - feralrush: ["9L1"], - feralshriek: ["9L1"], - feralpower: ["9L1"], - feralresilience: ["9L1"], - }, - }, - volvolpa: { - learnset: { - volttackle: ["9L1"], - wildcharge: ["9L1"], - helpinghand: ["9L1"], - thunderfang: ["9L1"], - spark: ["9L1"], - hyperfang: ["9L1"], - bodyslam: ["9L1"], - doubleedge: ["9L1"], - slash: ["9L1"], - scratch: ["9L1"], - quickattack: ["9L1"], - gigaimpact: ["9L1"], - icefang: ["9L1"], - crunch: ["9L1"], - uturn: ["9L1"], - acrobatics: ["9L1"], - aerialace: ["9L1"], - tackle: ["9L1"], - takedown: ["9L1"], - thunder: ["9L1"], - thunderbolt: ["9L1"], - voltswitch: ["9L1"], - chargebeam: ["9L1"], - discharge: ["9L1"], - risingvoltage: ["9L1"], - shockwave: ["9L1"], - electroweb: ["9L1"], - electroball: ["9L1"], - thundershock: ["9L1"], - hypervoice: ["9L1"], - triattack: ["9L1"], - hyperbeam: ["9L1"], - icebeam: ["9L1"], - blizzard: ["9L1"], - frostbreath: ["9L1"], - darkpulse: ["9L1"], - snarl: ["9L1"], - thunderwave: ["9L1"], - sheercold: ["9L1"], - agility: ["9L1"], - eerieimpulse: ["9L1"], - workup: ["9L1"], - sunnyday: ["9L1"], - raindance: ["9L1"], - snowscape: ["9L1"], - electricterrain: ["9L1"], - tailwhip: ["9L1"], - screech: ["9L1"], - magnetrise: ["9L1"], - substitute: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - round: ["9L1"], - endure: ["9L1"], - roar: ["9L1"], - icespinner: ["9L1"], - crystalcutter: ["9L1"], - crystaltail: ["9L1"], - crystalbeam: ["9L1"], - crystalcage: ["9L1"], - crystalshard: ["9L1"], - feralbite: ["9L1"], - feralshred: ["9L1"], - feralrush: ["9L1"], - feralshriek: ["9L1"], - feralpower: ["9L1"], - feralbreath: ["9L1"], - feralresilience: ["9L1"], - }, - }, - harzodia: { - learnset: { - allyswitch: ["9L1"], - solarbeam: ["9L1"], - helpinghand: ["9L1"], - psychic: ["9L1"], - psyshock: ["9L1"], - meteorbeam: ["9L1"], - shadowball: ["9L1"], - aurasphere: ["9L1"], - focusblast: ["9L1"], - dazzlinggleam: ["9L1"], - thunderbolt: ["9L1"], - calmmind: ["9L1"], - trick: ["9L1"], - agility: ["9L1"], - recover: ["9L1"], - thunderwave: ["9L1"], - healbell: ["9L1"], - futuresight: ["9L1"], - expandingforce: ["9L1"], - storedpower: ["9L1"], - dreameater: ["9L1"], - psybeam: ["9L1"], - confusion: ["9L1"], - zenheadbutt: ["9L1"], - thunder: ["9L1"], - chargebeam: ["9L1"], - shockwave: ["9L1"], - zapcannon: ["9L1"], - fling: ["9L1"], - hypervoice: ["9L1"], - bodyslam: ["9L1"], - headbutt: ["9L1"], - hyperbeam: ["9L1"], - teleport: ["9L1"], - reflect: ["9L1"], - lightscreen: ["9L1"], - disable: ["9L1"], - eerieimpulse: ["9L1"], - gravity: ["9L1"], - healpulse: ["9L1"], - imprison: ["9L1"], - laserfocus: ["9L1"], - magicroom: ["9L1"], - metronome: ["9L1"], - mimic: ["9L1"], - psychicterrain: ["9L1"], - psychoshift: ["9L1"], - psychup: ["9L1"], - recycle: ["9L1"], - safeguard: ["9L1"], - speedswap: ["9L1"], - swift: ["9L1"], - trickroom: ["9L1"], - wish: ["9L1"], - wonderroom: ["9L1"], - raindance: ["9L1"], - sunnyday: ["9L1"], - substitute: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - round: ["9L1"], - endure: ["9L1"], - quickguard: ["9L1"], - crystalbeam: ["9L1"], - crystalcage: ["9L1"], - crystalburst: ["9L1"], - crystalhealing: ["9L1"], - crystalfortification: ["9L1"], - feralrush: ["9L1"], - feralshriek: ["9L1"], - feralpower: ["9L1"], - feralhealing: ["9L1"], - }, - }, - cyllindrake: { - learnset: { - spinout: ["9L1"], - heavyslam: ["9L1"], - stealthrock: ["9L1"], - steelroller: ["9L1"], - ironhead: ["9L1"], - metalclaw: ["9L1"], - dragonclaw: ["9L1"], - outrage: ["9L1"], - scaleshot: ["9L1"], - dragontail: ["9L1"], - dragonrush: ["9L1"], - highhorsepower: ["9L1"], - bulldoze: ["9L1"], - stompingtantrum: ["9L1"], - rockslide: ["9L1"], - rocktomb: ["9L1"], - smackdown: ["9L1"], - rollout: ["9L1"], - superpower: ["9L1"], - bodypress: ["9L1"], - brickbreak: ["9L1"], - crunch: ["9L1"], - bite: ["9L1"], - payback: ["9L1"], - assurance: ["9L1"], - firstimpression: ["9L1"], - uturn: ["9L1"], - wildcharge: ["9L1"], - thunderfang: ["9L1"], - firefang: ["9L1"], - heatcrash: ["9L1"], - flareblitz: ["9L1"], - rapidspin: ["9L1"], - doubleedge: ["9L1"], - bodyslam: ["9L1"], - headbutt: ["9L1"], - gigaimpact: ["9L1"], - takedown: ["9L1"], - tackle: ["9L1"], - steelbeam: ["9L1"], - flashcannon: ["9L1"], - mirrorshot: ["9L1"], - dracometeor: ["9L1"], - dragonpulse: ["9L1"], - dragonbreath: ["9L1"], - twister: ["9L1"], - earthpower: ["9L1"], - mudshot: ["9L1"], - mudslap: ["9L1"], - flamethrower: ["9L1"], - fireblast: ["9L1"], - darkpulse: ["9L1"], - aurasphere: ["9L1"], - sludgebomb: ["9L1"], - clearsmog: ["9L1"], - boomburst: ["9L1"], - hypervoice: ["9L1"], - hyperbeam: ["9L1"], - shiftgear: ["9L1"], - toxic: ["9L1"], - morningsun: ["9L1"], - irondefense: ["9L1"], - roar: ["9L1"], - honeclaws: ["9L1"], - workup: ["9L1"], - sunnyday: ["9L1"], - raindance: ["9L1"], - sandstorm: ["9L1"], - snowscape: ["9L1"], - dragondance: ["9L1"], - curse: ["9L1"], - metalsound: ["9L1"], - screech: ["9L1"], - leer: ["9L1"], - haze: ["9L1"], - tarshot: ["9L1"], - substitute: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - round: ["9L1"], - endure: ["9L1"], - quickguard: ["9L1"], - helpinghand: ["9L1"], - crystaltail: ["9L1"], - crystalbash: ["9L1"], - crystalbeam: ["9L1"], - crystalcage: ["9L1"], - crystalburst: ["9L1"], - crystalfortification: ["9L1"], - crystalshard: ["9L1"], - feralrush: ["9L1"], - feralshriek: ["9L1"], - feralpower: ["9L1"], - feralbreath: ["9L1"], - feralhealing: ["9L1"], - feralresilience: ["9L1"], - feralspray: ["9L1"], - }, - }, - kodokai: { - learnset: { - haze: ["9L1"], - poltergeist: ["9L1"], - phantomforce: ["9L1"], - shadowpunch: ["9L1"], - astonish: ["9L1"], - firepunch: ["9L1"], - flamewheel: ["9L1"], - drainpunch: ["9L1"], - brickbreak: ["9L1"], - rocksmash: ["9L1"], - shadowball: ["9L1"], - hex: ["9L1"], - ominouswind: ["9L1"], - darkpulse: ["9L1"], - fireblast: ["9L1"], - flamethrower: ["9L1"], - flameburst: ["9L1"], - ember: ["9L1"], - firespin: ["9L1"], - heatwave: ["9L1"], - dazzlinggleam: ["9L1"], - drainingkiss: ["9L1"], - sludgebomb: ["9L1"], - clearsmog: ["9L1"], - hypervoice: ["9L1"], - hyperbeam: ["9L1"], - moonlight: ["9L1"], - trickroom: ["9L1"], - wish: ["9L1"], - aromatherapy: ["9L1"], - willowisp: ["9L1"], - encore: ["9L1"], - destinybond: ["9L1"], - disable: ["9L1"], - safeguard: ["9L1"], - lightscreen: ["9L1"], - smokescreen: ["9L1"], - grudge: ["9L1"], - facade: ["9L1"], - sunnyday: ["9L1"], - raindance: ["9L1"], - mistyterrain: ["9L1"], - sweetscent: ["9L1"], - sweetkiss: ["9L1"], - substitute: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - round: ["9L1"], - endure: ["9L1"], - helpinghand: ["9L1"], - crystalbeam: ["9L1"], - crystalcage: ["9L1"], - crystalburst: ["9L1"], - crystalhealing: ["9L1"], - crystalfortification: ["9L1"], - feralshriek: ["9L1"], - feralpower: ["9L1"], - feralresilience: ["9L1"], - feralhealing: ["9L1"], - }, - }, - electangle: { - learnset: { - wildcharge: ["9L1"], - gyroball: ["9L1"], - zingzap: ["9L1"], - powerwhip: ["9L1"], - earthquake: ["9L1"], - rockslide: ["9L1"], - heatcrash: ["9L1"], - superpower: ["9L1"], - bodypress: ["9L1"], - thunderbolt: ["9L1"], - discharge: ["9L1"], - voltswitch: ["9L1"], - energyball: ["9L1"], - gigadrain: ["9L1"], - overheat: ["9L1"], - dazzlinggleam: ["9L1"], - stealthrock: ["9L1"], - thunderwave: ["9L1"], - haze: ["9L1"], - aromatherapy: ["9L1"], - thunder: ["9L1"], - risingvoltage: ["9L1"], - spark: ["9L1"], - chargebeam: ["9L1"], - shockwave: ["9L1"], - electroball: ["9L1"], - electroweb: ["9L1"], - thundershock: ["9L1"], - grassknot: ["9L1"], - bulldoze: ["9L1"], - stompingtantrum: ["9L1"], - brickbreak: ["9L1"], - fling: ["9L1"], - payback: ["9L1"], - brutalswing: ["9L1"], - rocksmash: ["9L1"], - bodyslam: ["9L1"], - doubleedge: ["9L1"], - slam: ["9L1"], - tackle: ["9L1"], - takedown: ["9L1"], - swift: ["9L1"], - triattack: ["9L1"], - gigaimpact: ["9L1"], - hyperbeam: ["9L1"], - workup: ["9L1"], - helpinghand: ["9L1"], - agility: ["9L1"], - irondefense: ["9L1"], - electricterrain: ["9L1"], - eerieimpulse: ["9L1"], - magnetrise: ["9L1"], - magneticflux: ["9L1"], - lightscreen: ["9L1"], - sunnyday: ["9L1"], - raindance: ["9L1"], - substitute: ["9L1"], - protect: ["9L1"], - flashcannon: ["9L1"], - ironhead: ["9L1"], - steelbeam: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - round: ["9L1"], - endure: ["9L1"], - wideguard: ["9L1"], - crystalbash: ["9L1"], - crystalbeam: ["9L1"], - crystalcage: ["9L1"], - crystalburst: ["9L1"], - crystalhealing: ["9L1"], - crystalfortification: ["9L1"], - feralrush: ["9L1"], - feralpower: ["9L1"], - feralresilience: ["9L1"], - feralhealing: ["9L1"], - }, - }, - dolphena: { - learnset: { - liquidation: ["9L1"], - flipturn: ["9L1"], - aquatail: ["9L1"], - waterfall: ["9L1"], - outrage: ["9L1"], - dragontail: ["9L1"], - dragonrush: ["9L1"], - scaleshot: ["9L1"], - earthquake: ["9L1"], - bulldoze: ["9L1"], - irontail: ["9L1"], - acrobatics: ["9L1"], - dualwingbeat: ["9L1"], - crunch: ["9L1"], - lashout: ["9L1"], - payback: ["9L1"], - firefang: ["9L1"], - icefang: ["9L1"], - thunderfang: ["9L1"], - psychicfangs: ["9L1"], - brickbreak: ["9L1"], - bodyslam: ["9L1"], - wrap: ["9L1"], - headbutt: ["9L1"], - gigaimpact: ["9L1"], - doubleedge: ["9L1"], - thrash: ["9L1"], - flail: ["9L1"], - surf: ["9L1"], - scald: ["9L1"], - hydropump: ["9L1"], - brine: ["9L1"], - bubblebeam: ["9L1"], - dive: ["9L1"], - waterpulse: ["9L1"], - watergun: ["9L1"], - whirlpool: ["9L1"], - dracometeor: ["9L1"], - dragonpulse: ["9L1"], - dragonbreath: ["9L1"], - twister: ["9L1"], - icebeam: ["9L1"], - blizzard: ["9L1"], - icywind: ["9L1"], - energyball: ["9L1"], - darkpulse: ["9L1"], - dragondance: ["9L1"], - moonlight: ["9L1"], - coil: ["9L1"], - defog: ["9L1"], - lightscreen: ["9L1"], - workup: ["9L1"], - leer: ["9L1"], - raindance: ["9L1"], - sunnyday: ["9L1"], - sandstorm: ["9L1"], - snowscape: ["9L1"], - mistyterrain: ["9L1"], - laserfocus: ["9L1"], - focusenergy: ["9L1"], - substitute: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - round: ["9L1"], - endure: ["9L1"], - chillingwater: ["9L1"], - roar: ["9L1"], - icespinner: ["9L1"], - crystaltail: ["9L1"], - crystalbeam: ["9L1"], - crystalburst: ["9L1"], - crystalcage: ["9L1"], - crystalhealing: ["9L1"], - crystalfortification: ["9L1"], - feralbite: ["9L1"], - feralrush: ["9L1"], - feralshriek: ["9L1"], - feralpower: ["9L1"], - feralbreath: ["9L1"], - feralspray: ["9L1"], - feralresilience: ["9L1"], - }, - }, - soleron: { - learnset: { - thunderbolt: ["9L1"], - thunder: ["9L1"], - discharge: ["9L1"], - voltswitch: ["9L1"], - shockwave: ["9L1"], - chargebeam: ["9L1"], - thundershock: ["9L1"], - hurricane: ["9L1"], - airslash: ["9L1"], - aircutter: ["9L1"], - gust: ["9L1"], - heatwave: ["9L1"], - weatherball: ["9L1"], - hypervoice: ["9L1"], - triattack: ["9L1"], - hyperbeam: ["9L1"], - wildcharge: ["9L1"], - spark: ["9L1"], - bravebird: ["9L1"], - dualwingbeat: ["9L1"], - aerialace: ["9L1"], - fly: ["9L1"], - peck: ["9L1"], - drillpeck: ["9L1"], - skyattack: ["9L1"], - pluck: ["9L1"], - acrobatics: ["9L1"], - uturn: ["9L1"], - doubleedge: ["9L1"], - gigaimpact: ["9L1"], - takedown: ["9L1"], - tackle: ["9L1"], - roost: ["9L1"], - defog: ["9L1"], - thunderwave: ["9L1"], - lightscreen: ["9L1"], - reflect: ["9L1"], - whirlwind: ["9L1"], - workup: ["9L1"], - featherdance: ["9L1"], - charge: ["9L1"], - metalsound: ["9L1"], - magneticflux: ["9L1"], - raindance: ["9L1"], - sunnyday: ["9L1"], - electricterrain: ["9L1"], - laserfocus: ["9L1"], - mistyterrain: ["9L1"], - substitute: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - round: ["9L1"], - endure: ["9L1"], - helpinghand: ["9L1"], - wideguard: ["9L1"], - crystalcutter: ["9L1"], - crystalbeam: ["9L1"], - crystalburst: ["9L1"], - crystalhealing: ["9L1"], - feralbite: ["9L1"], - feralrush: ["9L1"], - feralshriek: ["9L1"], - feralpower: ["9L1"], - feralbreath: ["9L1"], - feralspray: ["9L1"], - }, - }, - soleronawakened: { - learnset: { - thunderbolt: ["9L1"], - thunder: ["9L1"], - discharge: ["9L1"], - voltswitch: ["9L1"], - shockwave: ["9L1"], - chargebeam: ["9L1"], - thundershock: ["9L1"], - hurricane: ["9L1"], - airslash: ["9L1"], - aircutter: ["9L1"], - gust: ["9L1"], - heatwave: ["9L1"], - weatherball: ["9L1"], - hypervoice: ["9L1"], - triattack: ["9L1"], - hyperbeam: ["9L1"], - wildcharge: ["9L1"], - spark: ["9L1"], - bravebird: ["9L1"], - dualwingbeat: ["9L1"], - aerialace: ["9L1"], - fly: ["9L1"], - peck: ["9L1"], - drillpeck: ["9L1"], - skyattack: ["9L1"], - pluck: ["9L1"], - acrobatics: ["9L1"], - uturn: ["9L1"], - doubleedge: ["9L1"], - gigaimpact: ["9L1"], - takedown: ["9L1"], - tackle: ["9L1"], - roost: ["9L1"], - defog: ["9L1"], - thunderwave: ["9L1"], - lightscreen: ["9L1"], - reflect: ["9L1"], - whirlwind: ["9L1"], - workup: ["9L1"], - featherdance: ["9L1"], - charge: ["9L1"], - metalsound: ["9L1"], - magneticflux: ["9L1"], - raindance: ["9L1"], - sunnyday: ["9L1"], - electricterrain: ["9L1"], - laserfocus: ["9L1"], - mistyterrain: ["9L1"], - substitute: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - round: ["9L1"], - endure: ["9L1"], - helpinghand: ["9L1"], - wideguard: ["9L1"], - crystalcutter: ["9L1"], - crystalbeam: ["9L1"], - crystalburst: ["9L1"], - crystalhealing: ["9L1"], - feralbite: ["9L1"], - feralrush: ["9L1"], - feralshriek: ["9L1"], - feralpower: ["9L1"], - feralbreath: ["9L1"], - feralspray: ["9L1"], - }, - }, - jaegorm: { - learnset: { - firstimpression: ["9L1"], - calmmind: ["9L1"], - uturn: ["9L1"], - attackorder: ["9L1"], - lunge: ["9L1"], - leechlife: ["9L1"], - bugbite: ["9L1"], - xscissor: ["9L1"], - photonray: ["9L1"], - zenheadbutt: ["9L1"], - psychocut: ["9L1"], - knockoff: ["9L1"], - darkestlariat: ["9L1"], - payback: ["9L1"], - assurance: ["9L1"], - thief: ["9L1"], - earthquake: ["9L1"], - bulldoze: ["9L1"], - stompingtantrum: ["9L1"], - stoneedge: ["9L1"], - rockslide: ["9L1"], - rocktomb: ["9L1"], - superpower: ["9L1"], - brickbreak: ["9L1"], - rocksmash: ["9L1"], - crosschop: ["9L1"], - dragontail: ["9L1"], - dragonclaw: ["9L1"], - outrage: ["9L1"], - doubleedge: ["9L1"], - bodyslam: ["9L1"], - takedown: ["9L1"], - crushclaw: ["9L1"], - slash: ["9L1"], - gigaimpact: ["9L1"], - tackle: ["9L1"], - bugbuzz: ["9L1"], - strugglebug: ["9L1"], - silverwind: ["9L1"], - infestation: ["9L1"], - psychic: ["9L1"], - psyshock: ["9L1"], - extrasensory: ["9L1"], - futuresight: ["9L1"], - psybeam: ["9L1"], - confusion: ["9L1"], - darkpulse: ["9L1"], - aurasphere: ["9L1"], - focusblast: ["9L1"], - energyball: ["9L1"], - gigadrain: ["9L1"], - triattack: ["9L1"], - hyperbeam: ["9L1"], - cosmicpower: ["9L1"], - honeclaws: ["9L1"], - workup: ["9L1"], - growth: ["9L1"], - acidarmor: ["9L1"], - imprison: ["9L1"], - hypnosis: ["9L1"], - magicroom: ["9L1"], - mirrorcoat: ["9L1"], - powerswap: ["9L1"], - psychicterrain: ["9L1"], - supersonic: ["9L1"], - wonderroom: ["9L1"], - safeguard: ["9L1"], - lightscreen: ["9L1"], - reflect: ["9L1"], - afteryou: ["9L1"], - sunnyday: ["9L1"], - raindance: ["9L1"], - substitute: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - round: ["9L1"], - endure: ["9L1"], - pounce: ["9L1"], - crystalcutter: ["9L1"], - crystaltail: ["9L1"], - crystalbeam: ["9L1"], - crystalcage: ["9L1"], - crystalburst: ["9L1"], - crystalhealing: ["9L1"], - crystalfortification: ["9L1"], - crystalshard: ["9L1"], - feralrush: ["9L1"], - feralshriek: ["9L1"], - feralpower: ["9L1"], - feralspray: ["9L1"], - feralresilience: ["9L1"], - }, - }, - jaegormcollective: { - learnset: { - firstimpression: ["9L1"], - calmmind: ["9L1"], - uturn: ["9L1"], - attackorder: ["9L1"], - lunge: ["9L1"], - leechlife: ["9L1"], - bugbite: ["9L1"], - xscissor: ["9L1"], - photongeyser: ["9L1"], - zenheadbutt: ["9L1"], - psychocut: ["9L1"], - knockoff: ["9L1"], - darkestlariat: ["9L1"], - payback: ["9L1"], - assurance: ["9L1"], - thief: ["9L1"], - earthquake: ["9L1"], - bulldoze: ["9L1"], - stompingtantrum: ["9L1"], - stoneedge: ["9L1"], - rockslide: ["9L1"], - rocktomb: ["9L1"], - superpower: ["9L1"], - brickbreak: ["9L1"], - rocksmash: ["9L1"], - crosschop: ["9L1"], - dragontail: ["9L1"], - dragonclaw: ["9L1"], - outrage: ["9L1"], - doubleedge: ["9L1"], - bodyslam: ["9L1"], - takedown: ["9L1"], - crushclaw: ["9L1"], - slash: ["9L1"], - gigaimpact: ["9L1"], - tackle: ["9L1"], - bugbuzz: ["9L1"], - strugglebug: ["9L1"], - silverwind: ["9L1"], - infestation: ["9L1"], - psychic: ["9L1"], - psyshock: ["9L1"], - extrasensory: ["9L1"], - futuresight: ["9L1"], - psybeam: ["9L1"], - confusion: ["9L1"], - darkpulse: ["9L1"], - aurasphere: ["9L1"], - focusblast: ["9L1"], - energyball: ["9L1"], - gigadrain: ["9L1"], - triattack: ["9L1"], - hyperbeam: ["9L1"], - cosmicpower: ["9L1"], - honeclaws: ["9L1"], - workup: ["9L1"], - growth: ["9L1"], - acidarmor: ["9L1"], - imprison: ["9L1"], - hypnosis: ["9L1"], - magicroom: ["9L1"], - mirrorcoat: ["9L1"], - powerswap: ["9L1"], - psychicterrain: ["9L1"], - supersonic: ["9L1"], - wonderroom: ["9L1"], - safeguard: ["9L1"], - lightscreen: ["9L1"], - reflect: ["9L1"], - afteryou: ["9L1"], - sunnyday: ["9L1"], - raindance: ["9L1"], - substitute: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - round: ["9L1"], - endure: ["9L1"], - pounce: ["9L1"], - crystalcutter: ["9L1"], - crystaltail: ["9L1"], - crystalbeam: ["9L1"], - crystalcage: ["9L1"], - crystalburst: ["9L1"], - crystalhealing: ["9L1"], - crystalfortification: ["9L1"], - crystalshard: ["9L1"], - feralrush: ["9L1"], - feralshriek: ["9L1"], - feralpower: ["9L1"], - feralspray: ["9L1"], - feralresilience: ["9L1"], - }, - }, - elemadillo: { - learnset: { - thunderbolt: ["9L1"], - thunder: ["9L1"], - discharge: ["9L1"], - voltswitch: ["9L1"], - electroball: ["9L1"], - flashcannon: ["9L1"], - steelbeam: ["9L1"], - energyball: ["9L1"], - wildcharge: ["9L1"], - zingzap: ["9L1"], - ironhead: ["9L1"], - spinout: ["9L1"], - highhorsepower: ["9L1"], - uturn: ["9L1"], - rapidspin: ["9L1"], - shiftgear: ["9L1"], - thunderwave: ["9L1"], - reflect: ["9L1"], - lightscreen: ["9L1"], - eerieimpulse: ["9L1"], - agility: ["9L1"], - thundershock: ["9L1"], - tackle: ["9L1"], - growl: ["9L1"], - spark: ["9L1"], - thunderfang: ["9L1"], - metalclaw: ["9L1"], - safeguard: ["9L1"], - doubleedge: ["9L1"], - gigaimpact: ["9L1"], - bodyslam: ["9L1"], - triattack: ["9L1"], - hyperbeam: ["9L1"], - round: ["9L1"], - bulldoze: ["9L1"], - rocktomb: ["9L1"], - rockslide: ["9L1"], - crunch: ["9L1"], - bite: ["9L1"], - electricterrain: ["9L1"], - raindance: ["9L1"], - sunnyday: ["9L1"], - sandstorm: ["9L1"], - substitute: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - endure: ["9L1"], - doubleshock: ["9L1"], - helpinghand: ["9L1"], - quickguard: ["9L1"], - crystaltail: ["9L1"], - crystalbash: ["9L1"], - crystalbeam: ["9L1"], - crystalcage: ["9L1"], - crystalburst: ["9L1"], - crystalfortification: ["9L1"], - crystalshard: ["9L1"], - feralrush: ["9L1"], - feralshriek: ["9L1"], - feralpower: ["9L1"], - feralbreath: ["9L1"], - feralresilience: ["9L1"], - }, - }, - axolacred: { - learnset: { - acrobatics: ["9L1"], - dracometeor: ["9L1"], - coreenforcer: ["9L1"], - dragontail: ["9L1"], - dragonpulse: ["9L1"], - airslash: ["9L1"], - meteorbeam: ["9L1"], - surf: ["9L1"], - scald: ["9L1"], - dazzlinggleam: ["9L1"], - drainingkiss: ["9L1"], - energyball: ["9L1"], - weatherball: ["9L1"], - flipturn: ["9L1"], - shedtail: ["9L1"], - morningsun: ["9L1"], - recover: ["9L1"], - defog: ["9L1"], - encore: ["9L1"], - dragonbreath: ["9L1"], - twister: ["9L1"], - dragonclaw: ["9L1"], - aerialace: ["9L1"], - dualwingbeat: ["9L1"], - fly: ["9L1"], - aircutter: ["9L1"], - gust: ["9L1"], - lightscreen: ["9L1"], - reflect: ["9L1"], - safeguard: ["9L1"], - mist: ["9L1"], - haze: ["9L1"], - futuresight: ["9L1"], - roost: ["9L1"], - extrasensory: ["9L1"], - shadowball: ["9L1"], - psychic: ["9L1"], - hypervoice: ["9L1"], - bodyslam: ["9L1"], - round: ["9L1"], - hyperbeam: ["9L1"], - raindance: ["9L1"], - snowscape: ["9L1"], - sunnyday: ["9L1"], - sandstorm: ["9L1"], - mistyterrain: ["9L1"], - psychicterrain: ["9L1"], - substitute: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - endure: ["9L1"], - chillingwater: ["9L1"], - stealthrock: ["9L1"], - helpinghand: ["9L1"], - crystaltail: ["9L1"], - crystalbeam: ["9L1"], - crystalcage: ["9L1"], - crystalburst: ["9L1"], - crystalhealing: ["9L1"], - crystalfortification: ["9L1"], - feralbite: ["9L1"], - feralrush: ["9L1"], - feralpower: ["9L1"], - feralspray: ["9L1"], - feralresilience: ["9L1"], - feralhealing: ["9L1"], - healingwish: ["9L1"], - wish: ["9L1"], - }, - }, - roscenti: { - learnset: { - pinmissile: ["9L1"], - firstimpression: ["9L1"], - megahorn: ["9L1"], - leechlife: ["9L1"], - lunge: ["9L1"], - uturn: ["9L1"], - bulletseed: ["9L1"], - powerwhip: ["9L1"], - hornleech: ["9L1"], - solarblade: ["9L1"], - superpower: ["9L1"], - swordsdance: ["9L1"], - leechseed: ["9L1"], - growth: ["9L1"], - taunt: ["9L1"], - strugglebug: ["9L1"], - stringshot: ["9L1"], - bugbuzz: ["9L1"], - energyball: ["9L1"], - grassknot: ["9L1"], - solarbeam: ["9L1"], - vinewhip: ["9L1"], - razorleaf: ["9L1"], - bugbite: ["9L1"], - seedbomb: ["9L1"], - scratch: ["9L1"], - furycutter: ["9L1"], - slash: ["9L1"], - nightslash: ["9L1"], - leafblade: ["9L1"], - petalblizzard: ["9L1"], - suckerpunch: ["9L1"], - rockblast: ["9L1"], - rockslide: ["9L1"], - rocktomb: ["9L1"], - bulldoze: ["9L1"], - stompingtantrum: ["9L1"], - drillrun: ["9L1"], - synthesis: ["9L1"], - irontail: ["9L1"], - strength: ["9L1"], - doubleedge: ["9L1"], - bodyslam: ["9L1"], - gigaimpact: ["9L1"], - hyperbeam: ["9L1"], - substitute: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - round: ["9L1"], - endure: ["9L1"], - pounce: ["9L1"], - trailblaze: ["9L1"], - quickguard: ["9L1"], - crystalcutter: ["9L1"], - crystaltail: ["9L1"], - crystalbash: ["9L1"], - crystalcage: ["9L1"], - crystalhealing: ["9L1"], - crystalshard: ["9L1"], - feralbite: ["9L1"], - feralshred: ["9L1"], - feralrush: ["9L1"], - feralpower: ["9L1"], - feralspray: ["9L1"], - feralresilience: ["9L1"], - feralhealing: ["9L1"], - }, - }, - blunderbusk: { - learnset: { - haze: ["9L1"], - waterpulse: ["9L1"], - hydropump: ["9L1"], - surf: ["9L1"], - scald: ["9L1"], - chillingwater: ["9L1"], - aurasphere: ["9L1"], - darkpulse: ["9L1"], - dragonpulse: ["9L1"], - icebeam: ["9L1"], - energyball: ["9L1"], - flashcannon: ["9L1"], - terrainpulse: ["9L1"], - recover: ["9L1"], - shellsmash: ["9L1"], - stealthrock: ["9L1"], - tackle: ["9L1"], - bubble: ["9L1"], - withdraw: ["9L1"], - aquajet: ["9L1"], - whirlpool: ["9L1"], - bubblebeam: ["9L1"], - laserfocus: ["9L1"], - razorshell: ["9L1"], - acidarmor: ["9L1"], - muddywater: ["9L1"], - attract: ["9L1"], - blizzard: ["9L1"], - brine: ["9L1"], - dive: ["9L1"], - doubleteam: ["9L1"], - endure: ["9L1"], - explosion: ["9L1"], - facade: ["9L1"], - focusblast: ["9L1"], - gigaimpact: ["9L1"], - snowscape: ["9L1"], - icywind: ["9L1"], - irondefense: ["9L1"], - lightscreen: ["9L1"], - liquidation: ["9L1"], - mudshot: ["9L1"], - payback: ["9L1"], - poisonjab: ["9L1"], - protect: ["9L1"], - raindance: ["9L1"], - rest: ["9L1"], - rockblast: ["9L1"], - round: ["9L1"], - screech: ["9L1"], - selfdestruct: ["9L1"], - shadowball: ["9L1"], - sleeptalk: ["9L1"], - sludgebomb: ["9L1"], - smartstrike: ["9L1"], - snore: ["9L1"], - steelroller: ["9L1"], - substitute: ["9L1"], - swagger: ["9L1"], - toxic: ["9L1"], - swift: ["9L1"], - torment: ["9L1"], - triattack: ["9L1"], - weatherball: ["9L1"], - crystalbash: ["9L1"], - crystalbeam: ["9L1"], - crystalcage: ["9L1"], - crystalburst: ["9L1"], - crystalhealing: ["9L1"], - crystalfortification: ["9L1"], - crystalshard: ["9L1"], - feralrush: ["9L1"], - feralpower: ["9L1"], - feralspray: ["9L1"], - feralresilience: ["9L1"], - feralhealing: ["9L1"], - }, - }, - barracoth: { - learnset: { - wavecrash: ["9L1"], - chillingwater: ["9L1"], - surf: ["9L1"], - scald: ["9L1"], - hydropump: ["9L1"], - beatup: ["9L1"], - icebeam: ["9L1"], - freezedry: ["9L1"], - liquidation: ["9L1"], - flipturn: ["9L1"], - tripleaxel: ["9L1"], - iceshard: ["9L1"], - iciclecrash: ["9L1"], - earthquake: ["9L1"], - bodypress: ["9L1"], - heavyslam: ["9L1"], - dragontail: ["9L1"], - slackoff: ["9L1"], - curse: ["9L1"], - sheercold: ["9L1"], - roar: ["9L1"], - auroraveil: ["9L1"], - chillyreception: ["9L1"], - slash: ["9L1"], - tackle: ["9L1"], - tailwhip: ["9L1"], - bubble: ["9L1"], - mudshot: ["9L1"], - workup: ["9L1"], - focusenergy: ["9L1"], - icefang: ["9L1"], - haze: ["9L1"], - brine: ["9L1"], - encore: ["9L1"], - nightslash: ["9L1"], - dive: ["9L1"], - aquatail: ["9L1"], - snowscape: ["9L1"], - attract: ["9L1"], - avalanche: ["9L1"], - blizzard: ["9L1"], - confide: ["9L1"], - doubleteam: ["9L1"], - drillrun: ["9L1"], - echoedvoice: ["9L1"], - endure: ["9L1"], - facade: ["9L1"], - fling: ["9L1"], - frostbreath: ["9L1"], - frustration: ["9L1"], - gigaimpact: ["9L1"], - hyperbeam: ["9L1"], - icywind: ["9L1"], - irontail: ["9L1"], - protect: ["9L1"], - raindance: ["9L1"], - rest: ["9L1"], - return: ["9L1"], - round: ["9L1"], - safeguard: ["9L1"], - sleeptalk: ["9L1"], - smartstrike: ["9L1"], - snore: ["9L1"], - substitute: ["9L1"], - superpower: ["9L1"], - swagger: ["9L1"], - thief: ["9L1"], - waterfall: ["9L1"], - waterpulse: ["9L1"], - aquacutter: ["9L1"], - helpinghand: ["9L1"], - wideguard: ["9L1"], - crystalcutter: ["9L1"], - crystaltail: ["9L1"], - crystalbash: ["9L1"], - crystalbeam: ["9L1"], - crystalcage: ["9L1"], - crystalburst: ["9L1"], - crystalhealing: ["9L1"], - crystalfortification: ["9L1"], - crystalshard: ["9L1"], - feralbite: ["9L1"], - feralshred: ["9L1"], - feralrush: ["9L1"], - feralpower: ["9L1"], - feralbreath: ["9L1"], - feralresilience: ["9L1"], - feralhealing: ["9L1"], - }, - }, - sturgard: { - learnset: { - wavecrash: ["9L1"], - headsmash: ["9L1"], - doubleedge: ["9L1"], - flipturn: ["9L1"], - liquidation: ["9L1"], - aquatail: ["9L1"], - aquajet: ["9L1"], - surf: ["9L1"], - scald: ["9L1"], - hydropump: ["9L1"], - earthpower: ["9L1"], - earthquake: ["9L1"], - bulldoze: ["9L1"], - stoneedge: ["9L1"], - waterpulse: ["9L1"], - dive: ["9L1"], - rockslide: ["9L1"], - rockblast: ["9L1"], - drainingkiss: ["9L1"], - chillingwater: ["9L1"], - raindance: ["9L1"], - stealthrock: ["9L1"], - sandstorm: ["9L1"], - sunnyday: ["9L1"], - mistyterrain: ["9L1"], - muddywater: ["9L1"], - mudshot: ["9L1"], - watergun: ["9L1"], - rockpolish: ["9L1"], - irondefense: ["9L1"], - bodypress: ["9L1"], - bodyslam: ["9L1"], - bonerush: ["9L1"], - amnesia: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - protect: ["9L1"], - substitute: ["9L1"], - endure: ["9L1"], - reflect: ["9L1"], - irontail: ["9L1"], - ironhead: ["9L1"], - payback: ["9L1"], - assurance: ["9L1"], - curse: ["9L1"], - feralrush: ["9L1"], - feralspray: ["9L1"], - feralpower: ["9L1"], - feralresilience: ["9L1"], - feralhealing: ["9L1"], - crystalbash: ["9L1"], - crystaltail: ["9L1"], - crystalcage: ["9L1"], - crystalbeam: ["9L1"], - crystalhealing: ["9L1"], - crystalfortification: ["9L1"], - crystalshard: ["9L1"], - } - }, - jamborai: { - learnset: { - sludgebomb: ["9L1"], - sludgewave: ["9L1"], - clearsmog: ["9L1"], - acidspray: ["9L1"], - psychic: ["9L1"], - psyshock: ["9L1"], - storedpower: ["9L1"], - futuresight: ["9L1"], - shadowball: ["9L1"], - hydropump: ["9L1"], - surf: ["9L1"], - scald: ["9L1"], - chillingwater: ["9L1"], - icebeam: ["9L1"], - blizzard: ["9L1"], - energyball: ["9L1"], - gigadrain: ["9L1"], - toxic: ["9L1"], - recover: ["9L1"], - toxicspikes: ["9L1"], - calmmind: ["9L1"], - acidarmor: ["9L1"], - triattack: ["9L1"], - teleport: ["9L1"], - sludge: ["9L1"], - psybeam: ["9L1"], - confusion: ["9L1"], - acid: ["9L1"], - gastroacid: ["9L1"], - bodyslam: ["9L1"], - gunkshot: ["9L1"], - zenheadbutt: ["9L1"], - psychocut: ["9L1"], - wrap: ["9L1"], - wringout: ["9L1"], - hyperbeam: ["9L1"], - bubblebeam: ["9L1"], - darkpulse: ["9L1"], - substitute: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - round: ["9L1"], - endure: ["9L1"], - venoshock: ["9L1"], - poisonsting: ["9L1"], - poisongas: ["9L1"], - skillswap: ["9L1"], - guardswap: ["9L1"], - lightscreen: ["9L1"], - reflect: ["9L1"], - safeguard: ["9L1"], - powertrick: ["9L1"], - trickroom: ["9L1"], - wonderroom: ["9L1"], - mirrorcoat: ["9L1"], - magiccoat: ["9L1"], - magicroom: ["9L1"], - embargo: ["9L1"], - mortalspin: ["9L1"], - twinbeam: ["9L1"], - crystalbeam: ["9L1"], - crystalcage: ["9L1"], - crystalburst: ["9L1"], - crystalhealing: ["9L1"], - crystalfortification: ["9L1"], - feralpower: ["9L1"], - feralhealing: ["9L1"], - }, - }, - dracoil: { - learnset: { - belch: ["9L1"], - roar: ["9L1"], - outrage: ["9L1"], - dragontail: ["9L1"], - dragonrush: ["9L1"], - dualwingbeat: ["9L1"], - acrobatics: ["9L1"], - earthquake: ["9L1"], - irontail: ["9L1"], - defog: ["9L1"], - ironhead: ["9L1"], - dracometeor: ["9L1"], - dragonpulse: ["9L1"], - hurricane: ["9L1"], - airslash: ["9L1"], - fireblast: ["9L1"], - flamethrower: ["9L1"], - icebeam: ["9L1"], - thunderbolt: ["9L1"], - darkpulse: ["9L1"], - coil: ["9L1"], - dragondance: ["9L1"], - glare: ["9L1"], - roost: ["9L1"], - toxic: ["9L1"], - tackle: ["9L1"], - leer: ["9L1"], - gust: ["9L1"], - tailwhip: ["9L1"], - bite: ["9L1"], - twister: ["9L1"], - tailwind: ["9L1"], - uturn: ["9L1"], - bounce: ["9L1"], - aerialace: ["9L1"], - agility: ["9L1"], - attract: ["9L1"], - blizzard: ["9L1"], - bodyslam: ["9L1"], - breakingswipe: ["9L1"], - bulldoze: ["9L1"], - bulletseed: ["9L1"], - crunch: ["9L1"], - doubleteam: ["9L1"], - endure: ["9L1"], - facade: ["9L1"], - falseswipe: ["9L1"], - firespin: ["9L1"], - fly: ["9L1"], - gigaimpact: ["9L1"], - heatwave: ["9L1"], - hyperbeam: ["9L1"], - hypervoice: ["9L1"], - pluck: ["9L1"], - powerswap: ["9L1"], - protect: ["9L1"], - psychup: ["9L1"], - raindance: ["9L1"], - rest: ["9L1"], - whirlwind: ["9L1"], - haze: ["9L1"], - rocksmash: ["9L1"], - round: ["9L1"], - safeguard: ["9L1"], - sleeptalk: ["9L1"], - snore: ["9L1"], - solarbeam: ["9L1"], - steelwing: ["9L1"], - substitute: ["9L1"], - sunnyday: ["9L1"], - swagger: ["9L1"], - swift: ["9L1"], - thief: ["9L1"], - thunder: ["9L1"], - uproar: ["9L1"], - crystaltail: ["9L1"], - crystalbash: ["9L1"], - crystalbeam: ["9L1"], - crystalcage: ["9L1"], - crystalburst: ["9L1"], - crystalhealing: ["9L1"], - crystalfortification: ["9L1"], - feralbite: ["9L1"], - feralrush: ["9L1"], - feralpower: ["9L1"], - feralbreath: ["9L1"], - feralspray: ["9L1"], - feralresilience: ["9L1"], - }, - }, - celespirit: { - learnset: { - shadowball: ["9L1"], - hex: ["9L1"], - moonblast: ["9L1"], - icebeam: ["9L1"], - thunderbolt: ["9L1"], - calmmind: ["9L1"], - moonlight: ["9L1"], - sheercold: ["9L1"], - hypnosis: ["9L1"], - astonish: ["9L1"], - growl: ["9L1"], - fairywind: ["9L1"], - helpinghand: ["9L1"], - nightshade: ["9L1"], - ominouswind: ["9L1"], - lifedew: ["9L1"], - healpulse: ["9L1"], - curse: ["9L1"], - icywind: ["9L1"], - healbell: ["9L1"], - eerieimpulse: ["9L1"], - healingwish: ["9L1"], - attract: ["9L1"], - blizzard: ["9L1"], - chargebeam: ["9L1"], - confide: ["9L1"], - darkpulse: ["9L1"], - dazzlinggleam: ["9L1"], - doubleteam: ["9L1"], - drainingkiss: ["9L1"], - dreameater: ["9L1"], - embargo: ["9L1"], - endure: ["9L1"], - energyball: ["9L1"], - facade: ["9L1"], - flash: ["9L1"], - fling: ["9L1"], - frustration: ["9L1"], - hyperbeam: ["9L1"], - infestation: ["9L1"], - lightscreen: ["9L1"], - magiccoat: ["9L1"], - magicroom: ["9L1"], - meteorbeam: ["9L1"], - painsplit: ["9L1"], - payback: ["9L1"], - protect: ["9L1"], - psychic: ["9L1"], - psychup: ["9L1"], - raindance: ["9L1"], - reflect: ["9L1"], - rest: ["9L1"], - return: ["9L1"], - roleplay: ["9L1"], - round: ["9L1"], - shadowclaw: ["9L1"], - shockwave: ["9L1"], - skillswap: ["9L1"], - sleeptalk: ["9L1"], - snatch: ["9L1"], - snore: ["9L1"], - spite: ["9L1"], - substitute: ["9L1"], - sunnyday: ["9L1"], - swagger: ["9L1"], - taunt: ["9L1"], - telekinesis: ["9L1"], - thief: ["9L1"], - throatchop: ["9L1"], - thunder: ["9L1"], - torment: ["9L1"], - trick: ["9L1"], - trickroom: ["9L1"], - zenheadbutt: ["9L1"], - crystalbash: ["9L1"], - crystalbeam: ["9L1"], - crystalcage: ["9L1"], - crystalburst: ["9L1"], - crystalhealing: ["9L1"], - crystalfortification: ["9L1"], - feralshriek: ["9L1"], - feralpower: ["9L1"], - feralresilience: ["9L1"], - feralhealing: ["9L1"], - }, - }, - noxtrice: { - learnset: { - flareblitz: ["9L1"], - blazekick: ["9L1"], - honeclaws: ["9L1"], - poisonjab: ["9L1"], - defog: ["9L1"], - earthquake: ["9L1"], - gunkshot: ["9L1"], - uturn: ["9L1"], - crunch: ["9L1"], - toxic: ["9L1"], - willowisp: ["9L1"], - taunt: ["9L1"], - roost: ["9L1"], - stompingtantrum: ["9L1"], - dragondance: ["9L1"], - peck: ["9L1"], - growl: ["9L1"], - smokescreen: ["9L1"], - ember: ["9L1"], - smog: ["9L1"], - flamewheel: ["9L1"], - drillpeck: ["9L1"], - scaryface: ["9L1"], - memento: ["9L1"], - bravebird: ["9L1"], - acrobatics: ["9L1"], - aerialace: ["9L1"], - attract: ["9L1"], - beatup: ["9L1"], - bounce: ["9L1"], - breakingswipe: ["9L1"], - corrosivegas: ["9L1"], - crosspoison: ["9L1"], - dragonclaw: ["9L1"], - dragonpulse: ["9L1"], - endure: ["9L1"], - facade: ["9L1"], - faketears: ["9L1"], - fireblast: ["9L1"], - flamethrower: ["9L1"], - fling: ["9L1"], - foulplay: ["9L1"], - doubleedge: ["9L1"], - bodyslam: ["9L1"], - slash: ["9L1"], - hypervoice: ["9L1"], - nightslash: ["9L1"], - heatwave: ["9L1"], - helpinghand: ["9L1"], - hurricane: ["9L1"], - irontail: ["9L1"], - overheat: ["9L1"], - payback: ["9L1"], - pluck: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - round: ["9L1"], - scaleshot: ["9L1"], - outrage: ["9L1"], - shadowclaw: ["9L1"], - sleeptalk: ["9L1"], - sludgebomb: ["9L1"], - sludgewave: ["9L1"], - snore: ["9L1"], - steelwing: ["9L1"], - substitute: ["9L1"], - swift: ["9L1"], - thief: ["9L1"], - thunderwave: ["9L1"], - venomdrench: ["9L1"], - venoshock: ["9L1"], - quickguard: ["9L1"], - crystalcutter: ["9L1"], - crystaltail: ["9L1"], - crystalbeam: ["9L1"], - crystalcage: ["9L1"], - crystalburst: ["9L1"], - crystalshard: ["9L1"], - feralbite: ["9L1"], - feralshred: ["9L1"], - feralrush: ["9L1"], - feralshriek: ["9L1"], - feralpower: ["9L1"], - feralbreath: ["9L1"], - feralspray: ["9L1"], - feralresilience: ["9L1"], - }, - }, - efflor: { - learnset: { - stoneedge: ["9L1"], - rockslide: ["9L1"], - chillyreception: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - round: ["9L1"], - endure: ["9L1"], - substitute: ["9L1"], - sleeptalk: ["9L1"], - rockblast: ["9L1"], - rocktomb: ["9L1"], - smackdown: ["9L1"], - rollout: ["9L1"], - rockthrow: ["9L1"], - grassyglide: ["9L1"], - petalblizzard: ["9L1"], - bulletseed: ["9L1"], - seedbomb: ["9L1"], - vinewhip: ["9L1"], - earthquake: ["9L1"], - highhorsepower: ["9L1"], - bulldoze: ["9L1"], - stompingtantrum: ["9L1"], - bodypress: ["9L1"], - heavyslam: ["9L1"], - ironhead: ["9L1"], - gyroball: ["9L1"], - bite: ["9L1"], - payback: ["9L1"], - assurance: ["9L1"], - zenheadbutt: ["9L1"], - doubleedge: ["9L1"], - bodyslam: ["9L1"], - megapunch: ["9L1"], - megakick: ["9L1"], - takedown: ["9L1"], - pound: ["9L1"], - headbutt: ["9L1"], - powergem: ["9L1"], - meteorbeam: ["9L1"], - ancientpower: ["9L1"], - gigadrain: ["9L1"], - grassknot: ["9L1"], - energyball: ["9L1"], - megadrain: ["9L1"], - absorb: ["9L1"], - magicalleaf: ["9L1"], - leafage: ["9L1"], - earthpower: ["9L1"], - mudbomb: ["9L1"], - mudslap: ["9L1"], - dazzlinggleam: ["9L1"], - leer: ["9L1"], - stealthrock: ["9L1"], - rockpolish: ["9L1"], - curse: ["9L1"], - synthesis: ["9L1"], - grassyterrain: ["9L1"], - raindance: ["9L1"], - sunnyday: ["9L1"], - sandstorm: ["9L1"], - mistyterrain: ["9L1"], - growth: ["9L1"], - watergun: ["9L1"], - defensecurl: ["9L1"], - rapidspin: ["9L1"], - leechseed: ["9L1"], - ingrain: ["9L1"], - solarbeam: ["9L1"], - weatherball: ["9L1"], - bellydrum: ["9L1"], - helpinghand: ["9L1"], - crystalbash: ["9L1"], - crystalbeam: ["9L1"], - crystalcage: ["9L1"], - crystalburst: ["9L1"], - crystalfortification: ["9L1"], - crystalhealing: ["9L1"], - crystalshard: ["9L1"], - feralbite: ["9L1"], - feralrush: ["9L1"], - feralpower: ["9L1"], - feralbreath: ["9L1"], - feralresilience: ["9L1"], - feralhealing: ["9L1"], - }, - }, - avastar: { - learnset: { - psychic: ["9L1"], - psyshock: ["9L1"], - futuresight: ["9L1"], - flashcannon: ["9L1"], - steelbeam: ["9L1"], - dazzlinggleam: ["9L1"], - darkpulse: ["9L1"], - shadowball: ["9L1"], - thunder: ["9L1"], - thunderbolt: ["9L1"], - thunderwave: ["9L1"], - hurricane: ["9L1"], - rapidspin: ["9L1"], - calmmind: ["9L1"], - recover: ["9L1"], - teleport: ["9L1"], - irondefense: ["9L1"], - gravity: ["9L1"], - lightscreen: ["9L1"], - reflect: ["9L1"], - safeguard: ["9L1"], - trickroom: ["9L1"], - quash: ["9L1"], - heavyslam: ["9L1"], - zenheadbutt: ["9L1"], - bodyslam: ["9L1"], - gigaimpact: ["9L1"], - hyperbeam: ["9L1"], - psybeam: ["9L1"], - confusion: ["9L1"], - magnetbomb: ["9L1"], - ironhead: ["9L1"], - gyroball: ["9L1"], - spark: ["9L1"], - psychicterrain: ["9L1"], - crystalbash: ["9L1"], - crystalbeam: ["9L1"], - crystalcage: ["9L1"], - crystalburst: ["9L1"], - crystalhealing: ["9L1"], - crystalfortification: ["9L1"], - feralshred: ["9L1"], - feralrush: ["9L1"], - feralshriek: ["9L1"], - feralpower: ["9L1"], - feralhealing: ["9L1"], - feralresilience: ["9L1"], - }, - }, - faerenheit: { - learnset: { - acrobatics: ["9L1"], - lavaplume: ["9L1"], - aerialace: ["9L1"], - burnup: ["9L1"], - calmmind: ["9L1"], - dazzlinggleam: ["9L1"], - encore: ["9L1"], - firespin: ["9L1"], - fireblast: ["9L1"], - flamecharge: ["9L1"], - flamethrower: ["9L1"], - flash: ["9L1"], - gravity: ["9L1"], - healbell: ["9L1"], - heatcrash: ["9L1"], - hyperbeam: ["9L1"], - imprison: ["9L1"], - lightscreen: ["9L1"], - mistyexplosion: ["9L1"], - mistyterrain: ["9L1"], - moonblast: ["9L1"], - mysticalfire: ["9L1"], - overheat: ["9L1"], - playrough: ["9L1"], - psychup: ["9L1"], - reflect: ["9L1"], - skillswap: ["9L1"], - sunnyday: ["9L1"], - trick: ["9L1"], - trickroom: ["9L1"], - willowisp: ["9L1"], - wish: ["9L1"], - triattack: ["9L1"], - flareblitz: ["9L1"], - fairywind: ["9L1"], - ember: ["9L1"], - safeguard: ["9L1"], - wrap: ["9L1"], - doubleedge: ["9L1"], - bodyslam: ["9L1"], - takedown: ["9L1"], - pound: ["9L1"], - gigaimpact: ["9L1"], - zenheadbutt: ["9L1"], - psychic: ["9L1"], - psyshock: ["9L1"], - substitute: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - round: ["9L1"], - endure: ["9L1"], - morningsun: ["9L1"], - helpinghand: ["9L1"], - crystaltail: ["9L1"], - crystalbeam: ["9L1"], - crystalcage: ["9L1"], - crystalburst: ["9L1"], - crystalhealing: ["9L1"], - crystalfortification: ["9L1"], - crystalshard: ["9L1"], - feralrush: ["9L1"], - feralpower: ["9L1"], - feralspray: ["9L1"], - feralresilience: ["9L1"], - feralhealing: ["9L1"], - }, - }, - cellsius: { - learnset: { - hydropump: ["9L1"], - scald: ["9L1"], - surf: ["9L1"], - brine: ["9L1"], - dive: ["9L1"], - bubblebeam: ["9L1"], - waterpulse: ["9L1"], - watergun: ["9L1"], - moonblast: ["9L1"], - dazzlinggleam: ["9L1"], - mistyexplosion: ["9L1"], - fairywind: ["9L1"], - icebeam: ["9L1"], - icywind: ["9L1"], - blizzard: ["9L1"], - energyball: ["9L1"], - grassknot: ["9L1"], - psychic: ["9L1"], - extrasensory: ["9L1"], - triattack: ["9L1"], - hyperbeam: ["9L1"], - flipturn: ["9L1"], - liquidation: ["9L1"], - waterfall: ["9L1"], - playrough: ["9L1"], - ironhead: ["9L1"], - zenheadbutt: ["9L1"], - acrobatics: ["9L1"], - aerialace: ["9L1"], - doubleedge: ["9L1"], - bodyslam: ["9L1"], - headbutt: ["9L1"], - wrap: ["9L1"], - defog: ["9L1"], - healbell: ["9L1"], - calmmind: ["9L1"], - haze: ["9L1"], - trick: ["9L1"], - lifedew: ["9L1"], - aquaring: ["9L1"], - charm: ["9L1"], - raindance: ["9L1"], - mistyterrain: ["9L1"], - lightscreen: ["9L1"], - reflect: ["9L1"], - sunnyday: ["9L1"], - substitute: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - round: ["9L1"], - endure: ["9L1"], - helpinghand: ["9L1"], - chillingwater: ["9L1"], - crystalcutter: ["9L1"], - crystaltail: ["9L1"], - crystalbeam: ["9L1"], - crystalburst: ["9L1"], - crystalhealing: ["9L1"], - crystalfortification: ["9L1"], - crystalshard: ["9L1"], - feralrush: ["9L1"], - feralpower: ["9L1"], - feralspray: ["9L1"], - feralresilience: ["9L1"], - }, - }, - kelven: { - learnset: { - spiritbreak: ["9L1"], - tripleaxel: ["9L1"], - iciclecrash: ["9L1"], - iceshard: ["9L1"], - avalanche: ["9L1"], - playrough: ["9L1"], - closecombat: ["9L1"], - sacredsword: ["9L1"], - crosschop: ["9L1"], - stoneedge: ["9L1"], - nightslash: ["9L1"], - hornleech: ["9L1"], - ironhead: ["9L1"], - smartstrike: ["9L1"], - zenheadbutt: ["9L1"], - acrobatics: ["9L1"], - aerialace: ["9L1"], - rapidspin: ["9L1"], - slash: ["9L1"], - doubleedge: ["9L1"], - bodyslam: ["9L1"], - headbutt: ["9L1"], - icebeam: ["9L1"], - blizzard: ["9L1"], - frostbreath: ["9L1"], - aurorabeam: ["9L1"], - powdersnow: ["9L1"], - icywind: ["9L1"], - moonblast: ["9L1"], - dazzlinggleam: ["9L1"], - mistyexplosion: ["9L1"], - flashcannon: ["9L1"], - powergem: ["9L1"], - mysticalfire: ["9L1"], - swordsdance: ["9L1"], - spikes: ["9L1"], - sheercold: ["9L1"], - auroraveil: ["9L1"], - calmmind: ["9L1"], - reflect: ["9L1"], - snowscape: ["9L1"], - mistyterrain: ["9L1"], - sunnyday: ["9L1"], - raindance: ["9L1"], - substitute: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - round: ["9L1"], - endure: ["9L1"], - icespinner: ["9L1"], - helpinghand: ["9L1"], - crystalcutter: ["9L1"], - crystaltail: ["9L1"], - crystalbeam: ["9L1"], - crystalburst: ["9L1"], - crystalhealing: ["9L1"], - crystalfortification: ["9L1"], - crystalshard: ["9L1"], - feralrush: ["9L1"], - feralpower: ["9L1"], - feralspray: ["9L1"], - feralresilience: ["9L1"], - }, - }, - salaos: { - learnset: { - aurasphere: ["9L1"], - focusblast: ["9L1"], - beatup: ["9L1"], - fierywrath: ["9L1"], - suckerpunch: ["9L1"], - crunch: ["9L1"], - bite: ["9L1"], - thief: ["9L1"], - payback: ["9L1"], - brutalswing: ["9L1"], - feintattack: ["9L1"], - assurance: ["9L1"], - lashout: ["9L1"], - dragontail: ["9L1"], - dragonclaw: ["9L1"], - outrage: ["9L1"], - firefang: ["9L1"], - psychicfangs: ["9L1"], - zenheadbutt: ["9L1"], - aquatail: ["9L1"], - powerwhip: ["9L1"], - seedbomb: ["9L1"], - doubleedge: ["9L1"], - bodyslam: ["9L1"], - headbutt: ["9L1"], - darkpulse: ["9L1"], - snarl: ["9L1"], - sludgebomb: ["9L1"], - fireblast: ["9L1"], - flamethrower: ["9L1"], - surf: ["9L1"], - scald: ["9L1"], - energyball: ["9L1"], - grassknot: ["9L1"], - solarbeam: ["9L1"], - psychic: ["9L1"], - confusion: ["9L1"], - dazzlinggleam: ["9L1"], - dragonpulse: ["9L1"], - hyperbeam: ["9L1"], - recover: ["9L1"], - toxic: ["9L1"], - toxicspikes: ["9L1"], - amnesia: ["9L1"], - lightscreen: ["9L1"], - psychicterrain: ["9L1"], - sunnyday: ["9L1"], - raindance: ["9L1"], - substitute: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - round: ["9L1"], - endure: ["9L1"], - comeuppance: ["9L1"], - crystaltail: ["9L1"], - crystalbash: ["9L1"], - crystalbeam: ["9L1"], - crystalcage: ["9L1"], - crystalburst: ["9L1"], - crystalhealing: ["9L1"], - crystalfortification: ["9L1"], - feralbite: ["9L1"], - feralshred: ["9L1"], - feralrush: ["9L1"], - feralpower: ["9L1"], - feralbreath: ["9L1"], - feralspray: ["9L1"], - feralresilience: ["9L1"], - feralhealing: ["9L1"], - }, - }, - morndos: { - learnset: { - whirlwind: ["9L1"], - aurasphere: ["9L1"], - focusblast: ["9L1"], - bravebird: ["9L1"], - dualwingbeat: ["9L1"], - acrobatics: ["9L1"], - aerialace: ["9L1"], - fly: ["9L1"], - skyattack: ["9L1"], - wingattack: ["9L1"], - skydrop: ["9L1"], - beatup: ["9L1"], - foulplay: ["9L1"], - darkestlariat: ["9L1"], - lashout: ["9L1"], - nightslash: ["9L1"], - assurance: ["9L1"], - payback: ["9L1"], - thief: ["9L1"], - uturn: ["9L1"], - seedbomb: ["9L1"], - doubleedge: ["9L1"], - bodyslam: ["9L1"], - slash: ["9L1"], - oblivionwing: ["9L1"], - hurricane: ["9L1"], - airslash: ["9L1"], - aircutter: ["9L1"], - gust: ["9L1"], - darkpulse: ["9L1"], - heatwave: ["9L1"], - energyball: ["9L1"], - grassknot: ["9L1"], - psychic: ["9L1"], - mudslap: ["9L1"], - roost: ["9L1"], - defog: ["9L1"], - taunt: ["9L1"], - disable: ["9L1"], - perishsong: ["9L1"], - featherdance: ["9L1"], - torment: ["9L1"], - screech: ["9L1"], - sunnyday: ["9L1"], - raindance: ["9L1"], - tailwind: ["9L1"], - curse: ["9L1"], - substitute: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - round: ["9L1"], - endure: ["9L1"], - comeuppance: ["9L1"], - wideguard: ["9L1"], - quickguard: ["9L1"], - crystalcutter: ["9L1"], - crystalbash: ["9L1"], - crystalbeam: ["9L1"], - crystalcage: ["9L1"], - crystalburst: ["9L1"], - crystalfortification: ["9L1"], - feralbite: ["9L1"], - feralshred: ["9L1"], - feralrush: ["9L1"], - feralshriek: ["9L1"], - feralpower: ["9L1"], - feralbreath: ["9L1"], - feralresilience: ["9L1"], - feralhealing: ["9L1"], - }, - }, - pythos: { - learnset: { - aurasphere: ["9L1"], - crunch: ["9L1"], - knockoff: ["9L1"], - suckerpunch: ["9L1"], - bite: ["9L1"], - brutalswing: ["9L1"], - payback: ["9L1"], - assurance: ["9L1"], - lashout: ["9L1"], - superpower: ["9L1"], - brickbreak: ["9L1"], - rocksmash: ["9L1"], - beatup: ["9L1"], - revenge: ["9L1"], - irontail: ["9L1"], - ironhead: ["9L1"], - psychicfangs: ["9L1"], - firefang: ["9L1"], - dragontail: ["9L1"], - outrage: ["9L1"], - scaleshot: ["9L1"], - superfang: ["9L1"], - doubleedge: ["9L1"], - bodyslam: ["9L1"], - headbutt: ["9L1"], - wrap: ["9L1"], - constrict: ["9L1"], - bind: ["9L1"], - gigaimpact: ["9L1"], - darkpulse: ["9L1"], - focusblast: ["9L1"], - flamethrower: ["9L1"], - psychic: ["9L1"], - gigadrain: ["9L1"], - energyball: ["9L1"], - grassknot: ["9L1"], - solarbeam: ["9L1"], - wringout: ["9L1"], - hyperbeam: ["9L1"], - coil: ["9L1"], - glare: ["9L1"], - nastyplot: ["9L1"], - taunt: ["9L1"], - torment: ["9L1"], - screech: ["9L1"], - sunnyday: ["9L1"], - raindance: ["9L1"], - sandstorm: ["9L1"], - snowscape: ["9L1"], - substitute: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - round: ["9L1"], - endure: ["9L1"], - comeuppance: ["9L1"], - crystaltail: ["9L1"], - crystalbash: ["9L1"], - crystalbeam: ["9L1"], - crystalcage: ["9L1"], - crystalburst: ["9L1"], - crystalhealing: ["9L1"], - crystalfortification: ["9L1"], - feralbite: ["9L1"], - feralrush: ["9L1"], - feralpower: ["9L1"], - feralbreath: ["9L1"], - feralresilience: ["9L1"], - feralhealing: ["9L1"], - }, - }, - corundell: { - learnset: { - stoneedge: ["9L1"], - energyball: ["9L1"], - solarbeam: ["9L1"], - solarblade: ["9L1"], - overheat: ["9L1"], - flareblitz: ["9L1"], - flamecharge: ["9L1"], - rockslide: ["9L1"], - rockblast: ["9L1"], - smackdown: ["9L1"], - rocktomb: ["9L1"], - rockpolish: ["9L1"], - bodypress: ["9L1"], - superpower: ["9L1"], - wildcharge: ["9L1"], - zingzap: ["9L1"], - spark: ["9L1"], - earthquake: ["9L1"], - stompingtantrum: ["9L1"], - bulldoze: ["9L1"], - dualwingbeat: ["9L1"], - doubleedge: ["9L1"], - bodyslam: ["9L1"], - takedown: ["9L1"], - pound: ["9L1"], - slam: ["9L1"], - gigaimpact: ["9L1"], - meteorbeam: ["9L1"], - revelationdance: ["9L1"], - powergem: ["9L1"], - thunderbolt: ["9L1"], - thunder: ["9L1"], - risingvoltage: ["9L1"], - voltswitch: ["9L1"], - discharge: ["9L1"], - chargebeam: ["9L1"], - shockwave: ["9L1"], - thundershock: ["9L1"], - earthpower: ["9L1"], - scorchingsands: ["9L1"], - triattack: ["9L1"], - shadowball: ["9L1"], - extrasensory: ["9L1"], - hyperbeam: ["9L1"], - stealthrock: ["9L1"], - recover: ["9L1"], - thunderwave: ["9L1"], - painsplit: ["9L1"], - electricterrain: ["9L1"], - sandstorm: ["9L1"], - sunnyday: ["9L1"], - raindance: ["9L1"], - metalsound: ["9L1"], - eerieimpulse: ["9L1"], - magnetrise: ["9L1"], - lightscreen: ["9L1"], - reflect: ["9L1"], - substitute: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - round: ["9L1"], - endure: ["9L1"], - crystaltail: ["9L1"], - crystalbeam: ["9L1"], - crystalcage: ["9L1"], - crystalburst: ["9L1"], - crystalhealing: ["9L1"], - crystalfortification: ["9L1"], - crystalshard: ["9L1"], - feralrush: ["9L1"], - feralpower: ["9L1"], - feralresilience: ["9L1"], - feralhealing: ["9L1"], - }, - }, - quadringo: { - learnset: { - dragontail: ["9L1"], - dragonclaw: ["9L1"], - beatup: ["9L1"], - outrage: ["9L1"], - dragonrush: ["9L1"], - spiritbreak: ["9L1"], - playrough: ["9L1"], - earthquake: ["9L1"], - bulldoze: ["9L1"], - rockslide: ["9L1"], - irontail: ["9L1"], - aquatail: ["9L1"], - bravebird: ["9L1"], - dualwingbeat: ["9L1"], - wingattack: ["9L1"], - bounce: ["9L1"], - nightslash: ["9L1"], - brutalswing: ["9L1"], - gigaimpact: ["9L1"], - bodyslam: ["9L1"], - doubleedge: ["9L1"], - takedown: ["9L1"], - strength: ["9L1"], - steelwing: ["9L1"], - slam: ["9L1"], - scratch: ["9L1"], - slash: ["9L1"], - dracometeor: ["9L1"], - dragonpulse: ["9L1"], - dragonbreath: ["9L1"], - twister: ["9L1"], - moonblast: ["9L1"], - drainingkiss: ["9L1"], - dazzlinggleam: ["9L1"], - mistyexplosion: ["9L1"], - fairywind: ["9L1"], - mysticalfire: ["9L1"], - surf: ["9L1"], - waterpulse: ["9L1"], - airslash: ["9L1"], - aircutter: ["9L1"], - swift: ["9L1"], - hypervoice: ["9L1"], - hyperbeam: ["9L1"], - roost: ["9L1"], - defog: ["9L1"], - healbell: ["9L1"], - haze: ["9L1"], - featherdance: ["9L1"], - attract: ["9L1"], - workup: ["9L1"], - confide: ["9L1"], - raindance: ["9L1"], - sunnyday: ["9L1"], - safeguard: ["9L1"], - mimic: ["9L1"], - leer: ["9L1"], - mistyterrain: ["9L1"], - calmmind: ["9L1"], - substitute: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - round: ["9L1"], - endure: ["9L1"], - whirlwind: ["9L1"], - helpinghand: ["9L1"], - crystalcutter: ["9L1"], - crystaltail: ["9L1"], - crystalbeam: ["9L1"], - crystalcage: ["9L1"], - crystalburst: ["9L1"], - crystalhealing: ["9L1"], - crystalfortification: ["9L1"], - crystalshard: ["9L1"], - feralbite: ["9L1"], - feralshred: ["9L1"], - feralrush: ["9L1"], - feralshriek: ["9L1"], - feralpower: ["9L1"], - feralbreath: ["9L1"], - feralspray: ["9L1"], - feralresilience: ["9L1"], - feralhealing: ["9L1"], - }, - }, - saphor: { - learnset: { - doubleedge: ["9L1"], - scorchingsands: ["9L1"], - headlongrush: ["9L1"], - bodyslam: ["9L1"], - earthquake: ["9L1"], - stoneedge: ["9L1"], - superpower: ["9L1"], - bodypress: ["9L1"], - wildcharge: ["9L1"], - hornleech: ["9L1"], - trailblaze: ["9L1"], - heavyslam: ["9L1"], - ironhead: ["9L1"], - megahorn: ["9L1"], - playrough: ["9L1"], - hypervoice: ["9L1"], - triattack: ["9L1"], - shadowball: ["9L1"], - darkpulse: ["9L1"], - aurasphere: ["9L1"], - focusblast: ["9L1"], - earthpower: ["9L1"], - energyball: ["9L1"], - gigadrain: ["9L1"], - grassknot: ["9L1"], - solarbeam: ["9L1"], - meteorbeam: ["9L1"], - powergem: ["9L1"], - psychic: ["9L1"], - dazzlinggleam: ["9L1"], - calmmind: ["9L1"], - milkdrink: ["9L1"], - bulkup: ["9L1"], - stealthrock: ["9L1"], - irondefense: ["9L1"], - roar: ["9L1"], - nobleroar: ["9L1"], - healbell: ["9L1"], - tackle: ["9L1"], - takedown: ["9L1"], - headbutt: ["9L1"], - round: ["9L1"], - bulldoze: ["9L1"], - rocktomb: ["9L1"], - rockslide: ["9L1"], - rockblast: ["9L1"], - highhorsepower: ["9L1"], - gigaimpact: ["9L1"], - hyperbeam: ["9L1"], - substitute: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - endure: ["9L1"], - sunnyday: ["9L1"], - raindance: ["9L1"], - sandstorm: ["9L1"], - mistyterrain: ["9L1"], - grassyterrain: ["9L1"], - helpinghand: ["9L1"], - wideguard: ["9L1"], - crystalcutter: ["9L1"], - crystaltail: ["9L1"], - crystalbash: ["9L1"], - crystalbeam: ["9L1"], - crystalcage: ["9L1"], - crystalburst: ["9L1"], - crystalhealing: ["9L1"], - crystalfortification: ["9L1"], - crystalshard: ["9L1"], - }, - }, - fenreil: { - learnset: { - wildcharge: ["9L1"], - ironhead: ["9L1"], - irontail: ["9L1"], - doubleedge: ["9L1"], - howl: ["9L1"], - bodyslam: ["9L1"], - darkpulse: ["9L1"], - snarl: ["9L1"], - crunch: ["9L1"], - jawlock: ["9L1"], - knockoff: ["9L1"], - playrough: ["9L1"], - uturn: ["9L1"], - stoneedge: ["9L1"], - rockslide: ["9L1"], - rockblast: ["9L1"], - rocktomb: ["9L1"], - psychicfangs: ["9L1"], - firefang: ["9L1"], - flamecharge: ["9L1"], - icefang: ["9L1"], - thunderfang: ["9L1"], - trailblaze: ["9L1"], - hypervoice: ["9L1"], - shadowball: ["9L1"], - aurasphere: ["9L1"], - focusblast: ["9L1"], - earthpower: ["9L1"], - swordsdance: ["9L1"], - nastyplot: ["9L1"], - taunt: ["9L1"], - substitute: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - round: ["9L1"], - endure: ["9L1"], - bite: ["9L1"], - torment: ["9L1"], - assurance: ["9L1"], - meanlook: ["9L1"], - scaryface: ["9L1"], - superpower: ["9L1"], - brutalswing: ["9L1"], - nobleroar: ["9L1"], - growl: ["9L1"], - tackle: ["9L1"], - roar: ["9L1"], - headbutt: ["9L1"], - superfang: ["9L1"], - stompingtantrum: ["9L1"], - helpinghand: ["9L1"], - quickguard: ["9L1"], - feralbite: ["9L1"], - feralshred: ["9L1"], - feralrush: ["9L1"], - feralshriek: ["9L1"], - feralpower: ["9L1"], - feralbreath: ["9L1"], - feralspray: ["9L1"], - feralresilience: ["9L1"], - feralhealing: ["9L1"], - }, - }, - flocura: { - learnset: { - leafstorm: ["9L1"], - focusblast: ["9L1"], - aurasphere: ["9L1"], - seedbomb: ["9L1"], - bulletseed: ["9L1"], - psychocut: ["9L1"], - leechseed: ["9L1"], - earthpower: ["9L1"], - guardswap: ["9L1"], - guardsplit: ["9L1"], - powerswap: ["9L1"], - uturn: ["9L1"], - lunge: ["9L1"], - zenheadbutt: ["9L1"], - acrobatics: ["9L1"], - aerialace: ["9L1"], - fly: ["9L1"], - petalblizzard: ["9L1"], - bodyslam: ["9L1"], - doubleedge: ["9L1"], - takedown: ["9L1"], - gigaimpact: ["9L1"], - pollenpuff: ["9L1"], - shadowball: ["9L1"], - hex: ["9L1"], - psychic: ["9L1"], - futuresight: ["9L1"], - psyshock: ["9L1"], - darkpulse: ["9L1"], - thunderbolt: ["9L1"], - thunder: ["9L1"], - dazzlinggleam: ["9L1"], - powergem: ["9L1"], - meteorbeam: ["9L1"], - energyball: ["9L1"], - gigadrain: ["9L1"], - triattack: ["9L1"], - hyperbeam: ["9L1"], - sleeppowder: ["9L1"], - stealthrock: ["9L1"], - thunderwave: ["9L1"], - painsplit: ["9L1"], - taunt: ["9L1"], - calmmind: ["9L1"], - nastyplot: ["9L1"], - amnesia: ["9L1"], - workup: ["9L1"], - psychicterrain: ["9L1"], - mistyterrain: ["9L1"], - sunnyday: ["9L1"], - raindance: ["9L1"], - snowscape: ["9L1"], - sandstorm: ["9L1"], - cottonspore: ["9L1"], - stunspore: ["9L1"], - attract: ["9L1"], - doubleteam: ["9L1"], - endure: ["9L1"], - facade: ["9L1"], - protect: ["9L1"], - rest: ["9L1"], - sleeptalk: ["9L1"], - substitute: ["9L1"], - swagger: ["9L1"], - helpinghand: ["9L1"], - crystaltail: ["9L1"], - crystalbeam: ["9L1"], - crystalcage: ["9L1"], - crystalburst: ["9L1"], - crystalhealing: ["9L1"], - crystalfortification: ["9L1"], - feralrush: ["9L1"], - feralpower: ["9L1"], - feralresilience: ["9L1"], - feralspray: ["9L1"], - feralhealing: ["9L1"], - }, - }, - flocuranexus: { - learnset: { - }, - }, -}; diff --git a/data/mods/scootopiav2/moves.ts b/data/mods/scootopiav2/moves.ts deleted file mode 100644 index 93f63b3cbe..0000000000 --- a/data/mods/scootopiav2/moves.ts +++ /dev/null @@ -1,1284 +0,0 @@ -export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { - shedtail: { - num: 880, - accuracy: true, - basePower: 0, - category: "Status", - name: "Shed Tail", - pp: 10, - priority: 0, - flags: {}, - shortDesc: "Sac 12.5% HP, switch, heal ally 25%. Ally: 50% dmg redux this turn.", - onTryHit(source) { - if (!this.canSwitch(source.side)) { - this.add('-fail', source); - return this.NOT_FAIL; - } - if (source.hp <= Math.ceil(source.maxhp / 8)) { - this.add('-fail', source, 'move: Shed Tail', '[weak]'); - return this.NOT_FAIL; - } - }, - onHit(target) { - this.directDamage(Math.ceil(target.maxhp / 8)); - }, - slotCondition: 'shedtail', - condition: { - duration: 1, - onSwap(target) { - if (!target.fainted && (target.hp < target.maxhp || target.status)) { - target.heal(target.maxhp / 4); - this.add('-heal', target, target.getHealth, '[from] move: Healing Wish'); - } - }, - onModifyDef(def, pokemon) { - return this.chainModify(2); - }, - onModifySpD(spd, pokemon) { - return this.chainModify(2); - }, - }, - selfSwitch: 'shedtail', - secondary: null, - target: "self", - type: "Normal", - zMove: { effect: 'clearnegativeboost' }, - }, - photonray: { - accuracy: 100, - basePower: 90, - category: "Special", - name: "Photon Ray", - pp: 10, - priority: 0, - flags: { protect: 1, mirror: 1 }, - onModifyMove(move, pokemon) { - if (pokemon.getStat('atk', false, true) > pokemon.getStat('spa', false, true)) move.category = 'Physical'; - }, - onPrepareHit(target, source, move) { - this.attrLastMove('[still]'); - this.add('-anim', source, "Photon Geyser", target); - }, - secondary: null, - target: "normal", - type: "Psychic", - contestType: "Cool", - }, - energysiphon: { - accuracy: 100, - basePower: 50, - category: "Special", - name: "Energy Siphon", - shortDesc: "Drains target's HP for 3 turns.", - pp: 10, - priority: 0, - flags: { protect: 1, mirror: 1, heal: 1, contact: 1 }, - drain: [1, 2], - secondary: null, - target: "normal", - type: "Grass", - volatileStatus: 'energysiphon', - onPrepareHit(target, source, move) { - this.attrLastMove('[still]'); - this.add('-anim', source, "Fell Stinger", target); - }, - condition: { - onStart(target) { - this.add('-start', target, 'move: Energy Siphon'); - }, - duration: 3, - onResidualOrder: 8, - onResidual(pokemon) { - const target = this.getAtSlot(pokemon.volatiles['energysiphon'].sourceSlot); - if (!target || target.fainted || target.hp <= 0) { - console.log('Nothing to leech into'); - return; - } - const damage = this.damage(pokemon.baseMaxhp / 8, pokemon, target); - if (damage) { - this.heal(damage / 2, target, pokemon); - } - }, - }, - }, - sheercold: { - accuracy: 85, - basePower: 0, - category: "Status", - name: "Sheer Cold", - pp: 15, - priority: 0, - flags: { protect: 1, reflectable: 1, mirror: 1 }, - status: 'frz', - shortDesc: "Inflicts Freeze status on the opponent (1/16 Residual damage, halved SpA).", - secondary: null, - target: "normal", - type: "Ice", - zMove: { boost: { atk: 1 } }, - contestType: "Beautiful", - }, - spore: { - inherit: true, - pp: 10, - desc: "Puts the opponent to sleep for 1 turn", - }, - sleeppowder: { - inherit: true, - pp: 15, - accuracy: 90, - desc: "Puts the opponent to sleep for 1 turn", - }, - hypnosis: { - inherit: true, - pp: 20, - accuracy: 85, - desc: "Puts the opponent to sleep for 1 turn", - }, - grasswhistle: { - inherit: true, - isNonstandard: null, - pp: 25, - accuracy: 80, - desc: "Puts the opponent to sleep for 1 turn", - }, - sing: { - inherit: true, - isNonstandard: null, - pp: 25, - accuracy: 80, - desc: "Puts the opponent to sleep for 1 turn", - }, - crystalcutter: { - name: "Crystal Cutter", - accuracy: 100, - basePower: 50, - category: "Physical", - pp: 15, - type: "Crystal", - shortDesc: "Always crits. User recovers 50% of damage dealt", - priority: 0, - flags: { protect: 1, mirror: 1, contact: 1, slicing: 1 }, - target: "normal", - willCrit: true, - onPrepareHit(target, source, move) { - this.attrLastMove('[still]'); - this.add('-anim', source, "Psycho Cut", target); - }, - drain: [1, 2], - }, - crystaltail: { - name: "Crystal Tail", - accuracy: 85, - basePower: 120, - category: "Physical", - pp: 5, - type: "Crystal", - shortDesc: "20% to lower foe's Atk by 1", - priority: 0, - flags: { protect: 1, mirror: 1, contact: 1 }, - target: "normal", - onPrepareHit(target, source, move) { - this.attrLastMove('[still]'); - this.add('-anim', source, "Dragon Tail", target); - }, - secondary: { - chance: 20, - boosts: { - atk: -1, - }, - }, - }, - crystalbash: { - name: "Crystal Bash", - accuracy: 100, - basePower: 100, - category: "Physical", - pp: 10, - type: "Crystal", - shortDesc: "10% to lower foe's Atk by 1", - priority: 0, - flags: { protect: 1, mirror: 1, contact: 1 }, - target: "normal", - onPrepareHit(target, source, move) { - this.attrLastMove('[still]'); - this.add('-anim', source, "Iron Head", target); - }, - secondary: { - chance: 10, - boosts: { - atk: -1, - }, - }, - }, - crystalbeam: { - name: "Crystal Beam", - accuracy: 100, - basePower: 90, - category: "Special", - pp: 15, - type: "Crystal", - shortDesc: "30% to lower foe's SpA by 1", - priority: 0, - flags: { protect: 1, mirror: 1 }, - target: "normal", - onPrepareHit(target, source, move) { - this.attrLastMove('[still]'); - this.add('-anim', source, "Aurora Beam", target); - }, - secondary: { - chance: 30, - boosts: { - spa: -1, - }, - }, - }, - crystalcage: { - name: "Crystal Cage", - accuracy: 85, - basePower: 85, - category: "Special", - pp: 10, - type: "Crystal", - shortDesc: "Traps and damages for 4-5 turns.", - priority: 0, - onPrepareHit(target, source, move) { - this.attrLastMove('[still]'); - this.add('-anim', source, "Diamond Storm", target); - }, - flags: { protect: 1, mirror: 1 }, - volatileStatus: 'partiallytrapped', - target: "normal", - secondary: null, - }, - crystalburst: { - accuracy: 100, - basePower: 120, - category: "Special", - name: "Crystal Burst", - pp: 5, - shortDesc: "Lower's user's SpA by 1", - priority: 0, - flags: { protect: 1, mirror: 1 }, - onPrepareHit(target, source, move) { - this.attrLastMove('[still]'); - this.add('-anim', source, "Clanging Scales", target); - }, - self: { - boosts: { - spa: -1, - }, - }, - secondary: null, - target: "allAdjacentFoes", - type: "Crystal", - contestType: "Beautiful", - }, - crystalhealing: { - accuracy: true, - basePower: 0, - category: "Status", - name: "Crystal Healing", - pp: 5, - priority: 0, - shortDesc: "Cures whole team's status conditions. 1/16 residual healing at the end of each turn.", - flags: { snatch: 1, distance: 1, bypasssub: 1 }, - onHit(pokemon, source) { - this.add('-activate', source, 'move: Crystal Healing'); - const side = pokemon.side; - let success = false; - for (const ally of side.pokemon) { - if (ally.cureStatus()) success = true; - } - return success; - }, - volatileStatus: 'crystalhealing', - condition: { - onStart(pokemon) { - this.add('-start', pokemon, 'Crystal Healing'); - }, - onResidualOrder: 6, - onResidual(pokemon) { - this.heal(pokemon.baseMaxhp / 16); - }, - }, - target: "allyTeam", - type: "Crystal", - zMove: { effect: 'heal' }, - onPrepareHit(target, source, move) { - this.attrLastMove('[still]'); - this.add('-anim', source, "Heal Bell", target); - }, - contestType: "Beautiful", - }, - crystalfortification: { - accuracy: true, - basePower: 0, - category: "Status", - name: "Crystal Fortification", - pp: 20, - priority: 0, - shortDesc: "+1 Def, +1 SpD. Clears negative stat changes.", - flags: { snatch: 1 }, - onHit(pokemon, source) { - let b: BoostID; - let didBoost = false; - const negBoosts: Partial> = {}; - for (b in source.boosts) { - if (source.boosts[b] < 0) negBoosts[b] = source.boosts[b] * -1; - didBoost = true; - } - if (didBoost) { - this.boost(negBoosts, source); - } - }, - boosts: { - def: 1, - spd: 1, - }, - onPrepareHit(target, source, move) { - this.attrLastMove('[still]'); - this.add('-anim', source, "Iron Defense", target); - }, - secondary: null, - target: "self", - type: "Crystal", - zMove: { boost: { spd: 1 } }, - contestType: "Beautiful", - }, - crystalshard: { - accuracy: true, - basePower: 0, - category: "Status", - name: "Crystal Shard", - shortDesc: "Sets a layer of Spikes. (Not a new kind of hazard)", - pp: 20, - priority: 0, - flags: { reflectable: 1, nonsky: 1 }, - onHitSide(side, source) { - source.side.foe.addSideCondition("spikes"); - }, - onPrepareHit(target, source, move) { - this.attrLastMove('[still]'); - this.add('-anim', source, "Spikes", target); - }, - secondary: null, - target: "foeSide", - type: "Crystal", - zMove: { boost: { spd: 1 } }, - contestType: "Beautiful", - }, - feralbite: { - name: "Feral Bite", - accuracy: 100, - basePower: 90, - category: "Physical", - pp: 15, - type: "Feral", - shortDesc: "30% chance to Poison foe.", - priority: 0, - flags: { protect: 1, mirror: 1, contact: 1, bite: 1 }, - target: "normal", - secondary: { - chance: 30, - status: "psn", - }, - onPrepareHit(target, source, move) { - this.attrLastMove('[still]'); - this.add('-anim', source, "Poison Fang", target); - }, - }, - feralshred: { - name: "Feral Shred", - accuracy: 100, - basePower: 20, - category: "Physical", - pp: 15, - type: "Feral", - shortDesc: "Hits twice. Lowers foe's Def by 1 on each hit", - priority: 0, - multihit: 2, - flags: { protect: 1, mirror: 1, contact: 1 }, - target: "normal", - secondary: { - chance: 100, - boosts: { - def: -1, - }, - }, - onPrepareHit(target, source, move) { - this.attrLastMove('[still]'); - this.add('-anim', source, "Dragon Claw", target); - }, - }, - feralrush: { - name: "Feral Rush", - accuracy: 100, - basePower: 120, - category: "Physical", - pp: 10, - type: "Feral", - shortDesc: "User takes 1/3 recoil damage. 20% to lower foe's Def by 1", - priority: 0, - recoil: [33, 100], - flags: { protect: 1, mirror: 1, contact: 1 }, - target: "normal", - secondary: { - chance: 20, - boosts: { - def: -1, - }, - }, - onPrepareHit(target, source, move) { - this.attrLastMove('[still]'); - this.add('-anim', source, "Double-Edge", target); - }, - }, - feralshriek: { - name: "Feral Shriek", - accuracy: 100, - basePower: 90, - category: "Special", - pp: 15, - type: "Feral", - shortDesc: "20% to lower foe's SpD by 1", - priority: 0, - flags: { protect: 1, mirror: 1, sound: 1 }, - target: "allAdjacentFoes", - secondary: { - chance: 20, - boosts: { - spd: -1, - }, - }, - onPrepareHit(target, source, move) { - this.attrLastMove('[still]'); - this.add('-anim', source, "Overdrive", target); - }, - }, - feralpower: { - accuracy: 100, - basePower: 110, - category: "Special", - name: "Feral Power", - pp: 5, - priority: 0, - shortDesc: "Lowers user's Def by 1", - flags: { protect: 1, mirror: 1, bypasssub: 1 }, - selfBoost: { - boosts: { - def: -1, - }, - }, - onPrepareHit(target, source, move) { - this.attrLastMove('[still]'); - this.add('-anim', source, "Searing Shot", target); - }, - secondary: null, - target: "allAdjacentFoes", - type: "Feral", - contestType: "Tough", - }, - feralbreath: { - name: "Feral Breath", - accuracy: 100, - basePower: 80, - category: "Special", - pp: 10, - type: "Feral", - shortDesc: "100% to lower foe's SpD by 1", - priority: 0, - flags: { protect: 1, mirror: 1 }, - target: "normal", - secondary: { - chance: 100, - boosts: { - spd: -1, - }, - }, - onPrepareHit(target, source, move) { - this.attrLastMove('[still]'); - this.add('-anim', source, "Dragon Rage", target); - }, - }, - feralhealing: { - num: 816, - accuracy: true, - basePower: 0, - category: "Status", - priority: 0, - flags: { heal: 1, bypasssub: 1, allyanim: 1 }, - onHit(pokemon) { - const success = !!this.heal(this.modify(pokemon.maxhp, 0.25)); - return pokemon.cureStatus() || success; - }, - secondary: null, - target: "allies", - name: "Feral Healing", - pp: 15, - shortDesc: "Heals user 25% and cures status.", - onPrepareHit(target, source, move) { - this.attrLastMove('[still]'); - this.add('-anim', source, "Jungle Healing", target); - }, - type: "Feral", - zMove: { boost: { def: 1 } }, - contestType: "Cool", - }, - feralspray: { - accuracy: 100, - basePower: 0, - category: "Status", - name: "Feral Spray", - pp: 25, - priority: 0, - shortDesc: "+1 Atk, +1 SpA. Poisons the foe.", - flags: { protect: 1, reflectable: 1, mirror: 1 }, - selfBoost: { - boosts: { - atk: 1, - spa: 1, - }, - }, - status: 'psn', - secondary: null, - target: "normal", - type: "Feral", - onPrepareHit(target, source, move) { - this.attrLastMove('[still]'); - this.add('-anim', source, "Acid Spray", target); - }, - zMove: { boost: { def: 1 } }, - contestType: "Clever", - }, - feralresilience: { - accuracy: true, - basePower: 0, - category: "Status", - name: "Feral Resilience", - pp: 20, - priority: 0, - flags: { snatch: 1 }, - shortDesc: "+1 Atk, +1 SpA. Cures user's status conditions.", - onHit(pokemon) { - if (['', 'slp'].includes(pokemon.status)) return false; - pokemon.cureStatus(); - }, - secondary: null, - target: "self", - boosts: { - atk: 1, - spa: 1, - }, - type: "Feral", - zMove: { effect: 'heal' }, - contestType: "Cute", - onPrepareHit(target, source, move) { - this.attrLastMove('[still]'); - this.add('-anim', source, "Refresh", target); - }, - }, - karatechop: { - inherit: true, - isNonstandard: null, - }, - doubleslap: { - inherit: true, - isNonstandard: null, - }, - cometpunch: { - inherit: true, - isNonstandard: null, - }, - razorwind: { - inherit: true, - isNonstandard: null, - }, - jumpkick: { - inherit: true, - isNonstandard: null, - }, - rollingkick: { - inherit: true, - isNonstandard: null, - }, - twineedle: { - inherit: true, - isNonstandard: null, - }, - sonicboom: { - inherit: true, - isNonstandard: null, - }, - submission: { - inherit: true, - isNonstandard: null, - }, - dragonrage: { - inherit: true, - isNonstandard: null, - }, - meditate: { - inherit: true, - isNonstandard: null, - }, - rage: { - inherit: true, - isNonstandard: null, - }, - barrier: { - inherit: true, - isNonstandard: null, - }, - bide: { - inherit: true, - isNonstandard: null, - }, - mirrormove: { - inherit: true, - isNonstandard: null, - }, - eggbomb: { - inherit: true, - isNonstandard: null, - }, - boneclub: { - inherit: true, - isNonstandard: null, - }, - clamp: { - inherit: true, - isNonstandard: null, - }, - skullbash: { - inherit: true, - isNonstandard: null, - }, - spikecannon: { - inherit: true, - isNonstandard: null, - }, - constrict: { - inherit: true, - isNonstandard: null, - }, - kinesis: { - inherit: true, - isNonstandard: null, - }, - barrage: { - inherit: true, - isNonstandard: null, - }, - lovelykiss: { - inherit: true, - isNonstandard: null, - }, - bubble: { - inherit: true, - isNonstandard: null, - }, - dizzypunch: { - inherit: true, - isNonstandard: null, - }, - flash: { - inherit: true, - isNonstandard: null, - }, - psywave: { - inherit: true, - isNonstandard: null, - }, - bonemerang: { - inherit: true, - isNonstandard: null, - }, - hyperfang: { - inherit: true, - isNonstandard: null, - }, - sharpen: { - inherit: true, - isNonstandard: null, - }, - conversion: { - inherit: true, - isNonstandard: null, - }, - sketch: { - inherit: true, - isNonstandard: null, - }, - triplekick: { - inherit: true, - isNonstandard: null, - }, - spiderweb: { - inherit: true, - isNonstandard: null, - }, - mindreader: { - inherit: true, - isNonstandard: null, - }, - nightmare: { - inherit: true, - isNonstandard: null, - }, - conversion2: { - inherit: true, - isNonstandard: null, - }, - aeroblast: { - inherit: true, - isNonstandard: null, - }, - feintattack: { - inherit: true, - isNonstandard: null, - }, - octazooka: { - inherit: true, - isNonstandard: null, - }, - foresight: { - inherit: true, - isNonstandard: null, - }, - return: { - inherit: true, - isNonstandard: null, - }, - frustration: { - inherit: true, - isNonstandard: null, - }, - sacredfire: { - inherit: true, - isNonstandard: null, - }, - magnitude: { - inherit: true, - isNonstandard: null, - }, - pursuit: { - inherit: true, - isNonstandard: null, - }, - vitalthrow: { - inherit: true, - isNonstandard: null, - }, - hiddenpower: { - inherit: true, - isNonstandard: null, - }, - hail: { - inherit: true, - isNonstandard: null, - }, - smellingsalts: { - inherit: true, - isNonstandard: null, - }, - naturepower: { - inherit: true, - isNonstandard: null, - }, - assist: { - inherit: true, - isNonstandard: null, - }, - magiccoat: { - inherit: true, - isNonstandard: null, - }, - revenge: { - inherit: true, - isNonstandard: null, - }, - refresh: { - inherit: true, - isNonstandard: null, - }, - grudge: { - inherit: true, - isNonstandard: null, - }, - snatch: { - inherit: true, - isNonstandard: null, - }, - secretpower: { - inherit: true, - isNonstandard: null, - }, - camouflage: { - inherit: true, - isNonstandard: null, - }, - tailglow: { - inherit: true, - isNonstandard: null, - }, - lusterpurge: { - inherit: true, - isNonstandard: null, - }, - mistball: { - inherit: true, - isNonstandard: null, - }, - mudsport: { - inherit: true, - isNonstandard: null, - }, - iceball: { - inherit: true, - isNonstandard: null, - }, - needlearm: { - inherit: true, - isNonstandard: null, - }, - aromatherapy: { - inherit: true, - isNonstandard: null, - }, - odorsleuth: { - inherit: true, - isNonstandard: null, - }, - silverwind: { - inherit: true, - isNonstandard: null, - }, - signalbeam: { - inherit: true, - isNonstandard: null, - }, - skyuppercut: { - inherit: true, - isNonstandard: null, - }, - watersport: { - inherit: true, - isNonstandard: null, - }, - doomdesire: { - inherit: true, - isNonstandard: null, - }, - psychoboost: { - inherit: true, - isNonstandard: null, - }, - miracleeye: { - inherit: true, - isNonstandard: null, - }, - wakeupslap: { - inherit: true, - isNonstandard: null, - }, - naturalgift: { - inherit: true, - isNonstandard: null, - }, - embargo: { - inherit: true, - isNonstandard: null, - }, - psychoshift: { - inherit: true, - isNonstandard: null, - }, - trumpcard: { - inherit: true, - isNonstandard: null, - }, - healblock: { - inherit: true, - isNonstandard: null, - }, - wringout: { - inherit: true, - isNonstandard: null, - }, - luckychant: { - inherit: true, - isNonstandard: null, - }, - mefirst: { - inherit: true, - isNonstandard: null, - }, - punishment: { - inherit: true, - isNonstandard: null, - }, - mudbomb: { - inherit: true, - isNonstandard: null, - }, - mirrorshot: { - inherit: true, - isNonstandard: null, - }, - rockclimb: { - inherit: true, - isNonstandard: null, - }, - rockwrecker: { - inherit: true, - isNonstandard: null, - }, - magnetbomb: { - inherit: true, - isNonstandard: null, - }, - captivate: { - inherit: true, - isNonstandard: null, - }, - chatter: { - inherit: true, - isNonstandard: null, - }, - healorder: { - inherit: true, - isNonstandard: null, - }, - crushgrip: { - inherit: true, - isNonstandard: null, - }, - darkvoid: { - inherit: true, - isNonstandard: null, - }, - seedflare: { - inherit: true, - isNonstandard: null, - }, - ominouswind: { - inherit: true, - isNonstandard: null, - }, - autotomize: { - inherit: true, - isNonstandard: null, - }, - telekinesis: { - inherit: true, - isNonstandard: null, - }, - stormthrow: { - inherit: true, - isNonstandard: null, - }, - flameburst: { - inherit: true, - isNonstandard: null, - }, - synchronoise: { - inherit: true, - isNonstandard: null, - }, - chipaway: { - inherit: true, - isNonstandard: null, - }, - skydrop: { - inherit: true, - isNonstandard: null, - }, - bestow: { - inherit: true, - isNonstandard: null, - }, - dualchop: { - inherit: true, - isNonstandard: null, - }, - heartstamp: { - inherit: true, - isNonstandard: null, - }, - leaftornado: { - inherit: true, - isNonstandard: null, - }, - steamroller: { - inherit: true, - isNonstandard: null, - }, - headcharge: { - inherit: true, - isNonstandard: null, - }, - geargrind: { - inherit: true, - isNonstandard: null, - }, - searingshot: { - inherit: true, - isNonstandard: null, - }, - technoblast: { - inherit: true, - isNonstandard: null, - }, - secretsword: { - inherit: true, - isNonstandard: null, - }, - glaciate: { - inherit: true, - isNonstandard: null, - }, - boltstrike: { - inherit: true, - isNonstandard: null, - }, - blueflare: { - inherit: true, - isNonstandard: null, - }, - freezeshock: { - inherit: true, - isNonstandard: null, - }, - iceburn: { - inherit: true, - isNonstandard: null, - }, - fusionflare: { - inherit: true, - isNonstandard: null, - }, - fusionbolt: { - inherit: true, - isNonstandard: null, - }, - matblock: { - inherit: true, - isNonstandard: null, - }, - rototiller: { - inherit: true, - isNonstandard: null, - }, - trickortreat: { - inherit: true, - isNonstandard: null, - }, - iondeluge: { - inherit: true, - isNonstandard: null, - }, - forestscurse: { - inherit: true, - isNonstandard: null, - }, - topsyturvy: { - inherit: true, - isNonstandard: null, - }, - craftyshield: { - inherit: true, - isNonstandard: null, - }, - flowershield: { - inherit: true, - isNonstandard: null, - }, - electrify: { - inherit: true, - isNonstandard: null, - }, - kingsshield: { - inherit: true, - isNonstandard: null, - }, - venomdrench: { - inherit: true, - isNonstandard: null, - }, - powder: { - inherit: true, - isNonstandard: null, - }, - geomancy: { - inherit: true, - isNonstandard: null, - }, - poweruppunch: { - inherit: true, - isNonstandard: null, - }, - oblivionwing: { - inherit: true, - isNonstandard: null, - }, - thousandarrows: { - inherit: true, - isNonstandard: null, - }, - thousandwaves: { - inherit: true, - isNonstandard: null, - }, - landswrath: { - inherit: true, - isNonstandard: null, - }, - lightofruin: { - inherit: true, - isNonstandard: null, - }, - sparklingaria: { - inherit: true, - isNonstandard: null, - }, - floralhealing: { - inherit: true, - isNonstandard: null, - }, - spotlight: { - inherit: true, - isNonstandard: null, - }, - toxicthread: { - inherit: true, - isNonstandard: null, - }, - laserfocus: { - inherit: true, - isNonstandard: null, - }, - gearup: { - inherit: true, - isNonstandard: null, - }, - anchorshot: { - inherit: true, - isNonstandard: null, - }, - purify: { - inherit: true, - isNonstandard: null, - }, - coreenforcer: { - inherit: true, - isNonstandard: null, - }, - beakblast: { - inherit: true, - isNonstandard: null, - }, - clangingscales: { - inherit: true, - isNonstandard: null, - }, - dragonhammer: { - inherit: true, - isNonstandard: null, - }, - shelltrap: { - inherit: true, - isNonstandard: null, - }, - shadowbone: { - inherit: true, - isNonstandard: null, - }, - prismaticlaser: { - inherit: true, - isNonstandard: null, - }, - spectralthief: { - inherit: true, - isNonstandard: null, - }, - sunsteelstrike: { - inherit: true, - isNonstandard: null, - }, - moongeistbeam: { - inherit: true, - isNonstandard: null, - }, - naturesmadness: { - inherit: true, - isNonstandard: null, - }, - multiattack: { - inherit: true, - isNonstandard: null, - }, - mindblown: { - inherit: true, - isNonstandard: null, - }, - plasmafists: { - inherit: true, - isNonstandard: null, - }, - photongeyser: { - inherit: true, - isNonstandard: null, - }, - doubleironbash: { - inherit: true, - isNonstandard: null, - }, - maxguard: { - inherit: true, - isNonstandard: null, - }, - octolock: { - inherit: true, - isNonstandard: null, - }, - boltbeak: { - inherit: true, - isNonstandard: null, - }, - fishiousrend: { - inherit: true, - isNonstandard: null, - }, - clangoroussoul: { - inherit: true, - isNonstandard: null, - }, - decorate: { - inherit: true, - isNonstandard: null, - }, - snaptrap: { - inherit: true, - isNonstandard: null, - }, - aurawheel: { - inherit: true, - isNonstandard: null, - }, - strangesteam: { - inherit: true, - isNonstandard: null, - }, - obstruct: { - inherit: true, - isNonstandard: null, - }, - meteorassault: { - inherit: true, - isNonstandard: null, - }, - eternabeam: { - inherit: true, - isNonstandard: null, - }, -}; diff --git a/data/mods/scootopiav2/pokedex.ts b/data/mods/scootopiav2/pokedex.ts deleted file mode 100644 index 52f1bcbacd..0000000000 --- a/data/mods/scootopiav2/pokedex.ts +++ /dev/null @@ -1,551 +0,0 @@ -export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable = { - arbrella: { - num: 2001, - name: "Arbrella", - types: ["Grass", "Ground"], - baseStats: { hp: 80, atk: 115, def: 100, spa: 80, spd: 80, spe: 75 }, - abilities: { 0: "Overgrow", H: "Tough Claws" }, - weightkg: 211, - eggGroups: ["Undiscovered"], - }, - krachiten: { - num: 2002, - name: "Krachiten", - types: ["Water", "Bug"], - baseStats: { hp: 90, atk: 120, def: 70, spa: 78, spd: 60, spe: 112 }, - abilities: { 0: "Torrent", H: "Sniper" }, - weightkg: 59, - eggGroups: ["Undiscovered"], - }, - scalaron: { - num: 2003, - name: "Scalaron", - types: ["Fire", "Flying"], - baseStats: { hp: 90, atk: 70, def: 90, spa: 100, spd: 105, spe: 75 }, - abilities: { 0: "Blaze", H: "Filter" }, - weightkg: 70, - eggGroups: ["Undiscovered"], - }, - rantler: { - num: 2004, - name: "Rantler", - types: ["Normal", "Ice"], - baseStats: { hp: 68, atk: 118, def: 94, spa: 43, spd: 79, spe: 73 }, - abilities: { 0: "Intimidate", 1: "Slush Rush", H: "Tough Claws" }, - weightkg: 67, - eggGroups: ["Undiscovered"], - }, - woolora: { - num: 2005, - name: "Woolora", - types: ["Fairy"], - baseStats: { hp: 70, atk: 75, def: 70, spa: 95, spd: 115, spe: 70 }, - abilities: { 0: "Fluffy", 1: "Rattled", H: "Pastel Veil" }, - weightkg: 50.3, - eggGroups: ["Undiscovered"], - }, - albatrygon: { - num: 2006, - name: "Albatrygon", - types: ["Flying"], - baseStats: { hp: 80, atk: 105, def: 70, spa: 65, spd: 60, spe: 95 }, - abilities: { 0: "Prankster", 1: "Klutz", H: "Unburden" }, - weightkg: 10.1, - eggGroups: ["Undiscovered"], - }, - orchile: { - num: 2007, - name: "Orchile", - types: ["Grass", "Fairy"], - baseStats: { hp: 65, atk: 60, def: 75, spa: 110, spd: 121, spe: 64 }, - abilities: { 0: "Sweet Veil", 1: "Aroma Veil", H: "Flower Veil" }, - weightkg: 45, - eggGroups: ["Undiscovered"], - }, - embuck: { - num: 2008, - name: "Embuck", - types: ["Fire", "Fighting"], - baseStats: { hp: 90, atk: 125, def: 80, spa: 83, spd: 65, spe: 82 }, - abilities: { 0: "Intimidate", H: "Flash Fire" }, - weightkg: 113, - eggGroups: ["Undiscovered"], - }, - cindoe: { - num: 2009, - name: "Cindoe", - types: ["Fire", "Dark"], - baseStats: { hp: 80, atk: 74, def: 55, spa: 110, spd: 100, spe: 106 }, - abilities: { 0: "Natural Cure", H: "Flash Fire" }, - weightkg: 67, - eggGroups: ["Undiscovered"], - }, - cobracotta: { - num: 2010, - name: "Cobracotta", - types: ["Grass", "Poison"], - baseStats: { hp: 80, atk: 90, def: 95, spa: 80, spd: 115, spe: 35 }, - abilities: { 0: "Mold Breaker", 1: "Weak Armor", H: "Heatproof" }, - weightkg: 68, - eggGroups: ["Undiscovered"], - }, - minillow: { - num: 2011, - name: "Minillow", - types: ["Water", "Fairy"], - baseStats: { hp: 70, atk: 64, def: 75, spa: 90, spd: 95, spe: 81 }, - abilities: { 0: "Swift Swim", 1: "Dazzling", H: "Adaptability" }, - weightkg: 22, - eggGroups: ["Undiscovered"], - }, - crossont: { - num: 2012, - name: "Crossont", - types: ["Bug", "Fighting"], - baseStats: { hp: 80, atk: 125, def: 100, spa: 60, spd: 80, spe: 80 }, - abilities: { 0: "Sniper", 1: "Long Reach", H: "Gooey" }, - weightkg: 121, - eggGroups: ["Undiscovered"], - }, - torgeist: { - num: 2013, - name: "Torgeist", - types: ["Ghost", "Flying"], - baseStats: { hp: 55, atk: 65, def: 95, spa: 115, spd: 100, spe: 105 }, - abilities: { 0: "Cursed Body", 1: "Clear Body", H: "Merciless" }, - weightkg: 9.7, - eggGroups: ["Undiscovered"], - }, - platypad: { - num: 2014, - name: "Platypad", - types: ["Grass", "Water"], - baseStats: { hp: 120, atk: 100, def: 80, spa: 100, spd: 80, spe: 40 }, - abilities: { 0: "Thick Fat", 1: "Triage", H: "Flower Veil" }, - weightkg: 89, - eggGroups: ["Undiscovered"], - }, - lumoth: { - num: 2015, - name: "Lumoth", - types: ["Bug", "Ghost"], - baseStats: { hp: 60, atk: 55, def: 91, spa: 110, spd: 85, spe: 94 }, - abilities: { 0: "Levitate" }, - weightkg: 0.5, - eggGroups: ["Undiscovered"], - }, - aurorowl: { - num: 2016, - name: "Aurorowl", - types: ["Ice", "Flying"], - baseStats: { hp: 70, atk: 70, def: 65, spa: 95, spd: 95, spe: 115 }, - abilities: { 0: "Snow Cloak", H: "Technician" }, - weightkg: 15, - eggGroups: ["Undiscovered"], - }, - carapex: { - num: 2017, - name: "Carapex", - types: ["Bug", "Flying"], - baseStats: { hp: 75, atk: 105, def: 155, spa: 55, spd: 90, spe: 60 }, - abilities: { 0: "Wind Rider", 1: "Mold Breaker", H: "Sturdy" }, - weightkg: 135, - eggGroups: ["Undiscovered"], - }, - dojodo: { - num: 2018, - name: "Dojodo", - types: ["Fighting"], - baseStats: { hp: 90, atk: 115, def: 80, spa: 65, spd: 100, spe: 80 }, - abilities: { 0: "Iron Fist", 1: "Stamina", H: "Supreme Overlord" }, - weightkg: 53, - eggGroups: ["Undiscovered"], - }, - nunopod: { - num: 2019, - name: "Nunopod", - types: ["Ground", "Bug"], - baseStats: { hp: 80, atk: 110, def: 125, spa: 68, spd: 75, spe: 67 }, - abilities: { 0: "Earth Eater", H: "Opportunist" }, - weightkg: 68, - eggGroups: ["Undiscovered"], - }, - zeploom: { - num: 2020, - name: "Zeploom", - types: ["Grass", "Ground"], - baseStats: { hp: 55, atk: 55, def: 145, spa: 65, spd: 150, spe: 45 }, - abilities: { 0: "Wind Rider", H: "Levitate" }, - weightkg: 5, - eggGroups: ["Undiscovered"], - }, - brawnkey: { - num: 2021, - name: "Brawnkey", - types: ["Steel", "Fighting"], - baseStats: { hp: 95, atk: 105, def: 105, spa: 85, spd: 80, spe: 50 }, - abilities: { 0: "Levitate" }, - weightkg: 85, - eggGroups: ["Undiscovered"], - }, - salamalix: { - num: 2022, - name: "Salamalix", - types: ["Rock", "Steel"], - baseStats: { hp: 70, atk: 120, def: 120, spa: 45, spd: 65, spe: 90 }, - abilities: { 0: "No Guard", 1: "Mold Breaker", H: "Intimidate" }, - weightkg: 85, - eggGroups: ["Undiscovered"], - }, - cinnastar: { - num: 2023, - name: "Cinnastar", - types: ["Rock", "Poison"], - baseStats: { hp: 110, atk: 95, def: 80, spa: 95, spd: 80, spe: 80 }, - abilities: { 0: "Liquid Ooze", H: "Regenerator" }, - weightkg: 56, - eggGroups: ["Undiscovered"], - }, - muabboa: { - num: 2024, - name: "MuabBoa", - types: ["Ground", "Fighting"], - baseStats: { hp: 65, atk: 100, def: 75, spa: 55, spd: 65, spe: 120 }, - abilities: { 0: "Anticipation", 1: "Sand Rush", H: "Inner Focus" }, - weightkg: 25, - eggGroups: ["Undiscovered"], - }, - volvolpa: { - num: 2025, - name: "Volvolpa", - types: ["Electric", "Ice"], - baseStats: { hp: 76, atk: 97, def: 64, spa: 70, spd: 102, spe: 121 }, - abilities: { 0: "Slush Rush", 1: "Volt Absorb", H: "Strong Jaw" }, - weightkg: 27, - eggGroups: ["Undiscovered"], - }, - harzodia: { - num: 2026, - name: "Harzodia", - types: ["Psychic"], - baseStats: { hp: 65, atk: 55, def: 75, spa: 125, spd: 75, spe: 95 }, - abilities: { 0: "Prankster", 1: "Unburden", H: "Solar Power" }, - weightkg: 35, - eggGroups: ["Undiscovered"], - }, - cyllindrake: { - num: 2027, - name: "Cyllindrake", - types: ["Steel", "Dragon"], - baseStats: { hp: 70, atk: 85, def: 115, spa: 95, spd: 70, spe: 110 }, - abilities: { 0: "Heavy Metal", 1: "Punk Rock", H: "Scrappy" }, - weightkg: 180, - eggGroups: ["Undiscovered"], - }, - kodokai: { - num: 2028, - name: "Kodokai", - types: ["Ghost", "Fire"], - baseStats: { hp: 110, atk: 65, def: 100, spa: 110, spd: 90, spe: 30 }, - abilities: { 0: "White Smoke", H: "Aroma Veil" }, - weightkg: 50, - eggGroups: ["Undiscovered"], - }, - electangle: { - num: 2029, - name: "Electangle", - types: ["Steel", "Electric"], - baseStats: { hp: 120, atk: 90, def: 110, spa: 90, spd: 90, spe: 25 }, - abilities: { 0: "Filter" }, - weightkg: 190, - eggGroups: ["Undiscovered"], - }, - dolphena: { - num: 2030, - name: "Dolphena", - types: ["Water", "Dragon"], - baseStats: { hp: 95, atk: 125, def: 80, spa: 84, spd: 75, spe: 81 }, - abilities: { 0: "Anger Point", H: "Mythical Presence" }, - weightkg: 271, - eggGroups: ["Undiscovered"], - }, - elemadillo: { - num: 2035, - name: "Elemadillo", - types: ["Steel", "Electric"], - baseStats: { hp: 67, atk: 94, def: 73, spa: 103, spd: 64, spe: 129 }, - abilities: { 0: "Weak Armor", 1: "Motor Drive", H: "Stalwart" }, - weightkg: 58, - eggGroups: ["Undiscovered"], - }, - axolacred: { - num: 2036, - name: "Axolacred", - types: ["Dragon"], - baseStats: { hp: 85, atk: 90, def: 85, spa: 95, spd: 95, spe: 65 }, - abilities: { 0: "Magic Guard", H: "Purifying Salt" }, - weightkg: 33, - eggGroups: ["Undiscovered"], - }, - roscenti: { - num: 2037, - name: "Roscenti", - types: ["Bug", "Grass"], - baseStats: { hp: 80, atk: 115, def: 100, spa: 75, spd: 80, spe: 100 }, - abilities: { 0: "Sheer Force", 1: "Chlorophyll", H: "Skill Link" }, - eggGroups: ["Undiscovered"], - weightkg: 37, - }, - blunderbusk: { - num: 2038, - name: "Blunderbusk", - types: ["Water"], - baseStats: { hp: 73, atk: 67, def: 124, spa: 128, spd: 89, spe: 24 }, - abilities: { 0: "Mega Launcher", H: "Shell Bunker" }, - weightkg: 86, - eggGroups: ["Undiscovered"], - }, - barracoth: { - num: 2039, - name: "Barracoth", - types: ["Ice", "Water"], - baseStats: { hp: 140, atk: 115, def: 110, spa: 55, spd: 65, spe: 35 }, - abilities: { 0: "Filter", 1: "Thick Fat", H: "Multiscale" }, - weightkg: 356, - eggGroups: ["Undiscovered"], - }, - jamborai: { - num: 2040, - name: "Jamborai", - types: ["Poison", "Psychic"], - baseStats: { hp: 75, atk: 55, def: 125, spa: 120, spd: 85, spe: 65 }, - abilities: { 0: "Clear Body", 1: "Gooey", H: "Water Absorb" }, - weightkg: 84, - eggGroups: ["Undiscovered"], - }, - dracoil: { - num: 2041, - name: "Dracoil", - types: ["Dragon", "Flying"], - baseStats: { hp: 105, atk: 106, def: 85, spa: 96, spd: 60, spe: 78 }, - abilities: { 0: "Mythical Presence", 1: "Gluttony", H: "Marvel Scale" }, - weightkg: 428, - eggGroups: ["Undiscovered"], - }, - celespirit: { - num: 2042, - name: "Celespirit", - types: ["Ghost"], - baseStats: { hp: 75, atk: 61, def: 73, spa: 117, spd: 135, spe: 69 }, - abilities: { 0: "Levitate", H: "Power Spot" }, - weightkg: 25.8, - eggGroups: ["Undiscovered"], - }, - noxtrice: { - num: 2043, - name: "Noxtrice", - types: ["Poison", "Fire"], - baseStats: { hp: 65, atk: 118, def: 75, spa: 63, spd: 80, spe: 114 }, - abilities: { 0: "Poison Touch", H: "Flash Fire" }, - weightkg: 73.7, - eggGroups: ["Undiscovered"], - }, - sturgard: { - num: 2055, - name: "Sturgard", - types: ["Water", "Ground"], - baseStats: { hp: 105, atk: 110, def: 105, spa: 65, spd: 70, spe: 70 }, - abilities: { 0: "Rock Head", 1: "Battle Armor", H: "Mold Breaker" }, - weightkg: 143, - eggGroups: ["Undiscovered"], - }, - avastar: { - num: 2034, - name: "Avastar", - types: ["Psychic", "Steel"], - baseStats: { hp: 75, atk: 85, def: 110, spa: 115, spd: 100, spe: 60 }, - abilities: { 0: "Stalwart", 1: "Heavy Metal", H: "Shell Bunker" }, - weightkg: 999.9, - eggGroups: ["Undiscovered"], - }, - faerenheit: { - num: 2044, - name: "Faerenheit", - types: ["Fire", "Fairy"], - baseStats: { hp: 71, atk: 83, def: 127, spa: 97, spd: 109, spe: 83 }, - abilities: { 0: "Beast Boost" }, - weightkg: 2.1, - eggGroups: ["Undiscovered"], - }, - cellsius: { - num: 2045, - name: "Cellsius", - types: ["Water", "Fairy"], - baseStats: { hp: 71, atk: 83, def: 83, spa: 109, spd: 127, spe: 97 }, - abilities: { 0: "Beast Boost" }, - weightkg: 2.4, - eggGroups: ["Undiscovered"], - }, - kelven: { - num: 2046, - name: "Kelven", - types: ["Ice", "Fairy"], - baseStats: { hp: 71, atk: 127, def: 109, spa: 83, spd: 83, spe: 97 }, - abilities: { 0: "Beast Boost" }, - weightkg: 2.8, - eggGroups: ["Undiscovered"], - }, - salaos: { - num: 2047, - name: "Salaos", - types: ["Dark"], - baseStats: { hp: 75, atk: 85, def: 90, spa: 110, spd: 130, spe: 90 }, - abilities: { 0: "Good as Gold" }, - weightkg: 74, - eggGroups: ["Undiscovered"], - }, - morndos: { - num: 2048, - name: "Morndos", - types: ["Dark", "Flying"], - baseStats: { hp: 110, atk: 90, def: 75, spa: 90, spd: 85, spe: 130 }, - abilities: { 0: "Synchronize" }, - weightkg: 56, - eggGroups: ["Undiscovered"], - }, - pythos: { - num: 2049, - name: "Pythos", - types: ["Dark"], - baseStats: { hp: 90, atk: 110, def: 130, spa: 85, spd: 90, spe: 75 }, - abilities: { 0: "Guts" }, - weightkg: 178, - eggGroups: ["Undiscovered"], - }, - corundell: { - num: 2050, - name: "Corundell", - types: ["Rock", "Electric"], - baseStats: { hp: 75, atk: 100, def: 130, spa: 105, spd: 80, spe: 110 }, - abilities: { 0: "Lightning Rod", H: "Protosynthesis" }, - weightkg: 137, - eggGroups: ["Undiscovered"], - }, - quadringo: { - num: 2051, - name: "Quadringo", - types: ["Fairy", "Dragon"], - baseStats: { hp: 80, atk: 120, def: 95, spa: 100, spd: 120, spe: 85 }, - abilities: { 0: "Hydration", 1: "Pastel Veil", H: "Inner Focus" }, - weightkg: 156, - eggGroups: ["Undiscovered"], - }, - saphor: { - num: 2052, - name: "Saphor", - types: ["Ground", "Normal"], - baseStats: { hp: 95, atk: 100, def: 105, spa: 100, spd: 105, spe: 95 }, - abilities: { 0: "Thick Fat", 1: "Crystal Heart" }, - weightkg: 638, - eggGroups: ["Undiscovered"], - }, - fenreil: { - num: 2053, - name: "Fenreil", - types: ["Dark", "Normal"], - baseStats: { hp: 80, atk: 105, def: 97, spa: 105, spd: 97, spe: 116 }, - abilities: { 0: "Natural Cure", 1: "Wild Heart" }, - weightkg: 232, - eggGroups: ["Undiscovered"], - }, - soleron: { - num: 2031, - name: "Soleron", - types: ["Electric", "Flying"], - baseStats: { hp: 70, atk: 75, def: 65, spa: 115, spd: 75, spe: 115 }, - abilities: { 0: "Battle Bond" }, - otherFormes: ["Soleron-Awakened"], - formeOrder: ["Soleron", "Soleron-Awakened"], - weightkg: 12, - eggGroups: ["Undiscovered"], - }, - soleronawakened: { - num: 2031, - name: "Soleron-Awakened", - baseSpecies: "Soleron", - forme: "Awakened", - types: ["Electric", "Flying"], - baseStats: { hp: 70, atk: 105, def: 85, spa: 135, spd: 95, spe: 125 }, - abilities: { 0: "Battle Bond" }, - requiredAbility: "Battle Bond", - battleOnly: "Soleron", - weightkg: 24, - eggGroups: ["Undiscovered"], - }, - efflor: { - num: 2032, - name: "Efflor", - types: ["Rock", "Grass"], - baseStats: { hp: 80, atk: 85, def: 110, spa: 105, spd: 110, spe: 25 }, - abilities: { 0: "Solid Rock", 1: "Unaware", H: "Seed Sower" }, - weightkg: 113, - eggGroups: ["Undiscovered"], - }, - pictagon: { - num: 2055, - name: "Pictagon", - types: ["Dragon", "Ghost"], - baseStats: { hp: 105, atk: 105, def: 60, spa: 80, spd: 85, spe: 95 }, - abilities: { 0: "Clear Body", 1: "Infiltrator", H: "No Guard" }, - weightkg: 113, - eggGroups: ["Undiscovered"], - }, - jaegorm: { - num: 2033, - name: "Jaegorm", - types: ["Bug", "Psychic"], - baseStats: { hp: 60, atk: 65, def: 40, spa: 130, spd: 40, spe: 130 }, - abilities: { 0: "Schooling" }, - otherFormes: ["Jaegorm-Collective"], - formeOrder: ["Jaegorm", "Jaegorm-Collective"], - weightkg: 10, - eggGroups: ["Undiscovered"], - }, - jaegormcollective: { - num: 2033, - name: "Jaegorm-Collective", - baseSpecies: "Jaegorm", - forme: "Collective", - types: ["Bug", "Psychic"], - baseStats: { hp: 60, atk: 145, def: 130, spa: 100, spd: 130, spe: 80 }, - abilities: { 0: "Schooling" }, - requiredAbility: "Schooling", - battleOnly: "Jaegorm", - weightkg: 122, - eggGroups: ["Undiscovered"], - }, - flocura: { - num: 2054, - name: "Flocura", - types: ["Grass", "Psychic"], - baseStats: { hp: 55, atk: 85, def: 55, spa: 107, spd: 180, spe: 118 }, - abilities: { 0: "Levitate", H: "Power Construct" }, - otherFormes: ["Flocura-Nexus"], - formeOrder: ["Flocura", "Flocura-Nexus"], - weightkg: 7.1, - eggGroups: ["Undiscovered"], - }, - flocuranexus: { - num: 2054, - name: "Flocura-Nexus", - baseSpecies: "Flocura", - forme: "Nexus", - types: ["Grass", "Psychic"], - baseStats: { hp: 105, atk: 125, def: 105, spa: 137, spd: 180, spe: 48 }, - abilities: { 0: "Levitate", H: "Power Construct" }, - requiredAbility: "Power Construct", - battleOnly: "Flocura", - weightkg: 999, - eggGroups: ["Undiscovered"], - }, -}; diff --git a/data/mods/scootopiav2/rulesets.ts b/data/mods/scootopiav2/rulesets.ts deleted file mode 100644 index 35ce7bd003..0000000000 --- a/data/mods/scootopiav2/rulesets.ts +++ /dev/null @@ -1,38 +0,0 @@ -export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable = { - supertypemovesrule: { - effectType: 'Rule', - name: 'Super Type Moves Rule', - desc: 'Prevents pokemon from using Crystal or Feral moves unless they have a matching type.', - onBeforeMove(pokemon, target, move) { - move = { - ...this.dex.moves.get(move), - hit: move.hit, - }; - if (move.type === "Crystal" && !pokemon.hasType("Crystal")) return false; - if (move.type === "Feral" && !pokemon.hasType("Feral")) return false; - }, - onDisableMove(pokemon) { - for (const moveSlot of pokemon.moveSlots) { - const move = this.dex.moves.get(moveSlot.id); - if ((move.type === "Crystal" && !pokemon.hasType("Crystal")) || (move.type === "Feral" && !pokemon.hasType("Feral"))) { - pokemon.disableMove(moveSlot.id, false); - } - } - }, - }, - spriteviewer: { - effectType: 'ValidatorRule', - name: 'Sprite Viewer', - desc: "Displays a fakemon's sprite in chat when it is switched in for the first time", - onBegin() { - this.add('rule', 'Sprite Viewer: Displays sprites in chat'); - }, - onSwitchIn(pokemon) { - if (!this.effectState[pokemon.species.id]) { - this.add('-message', `${pokemon.species.name}'s Sprite:`); - this.add(`raw|`); - this.effectState[pokemon.species.id] = true; - } - }, - }, -}; diff --git a/data/mods/scootopiav2/typechart.ts b/data/mods/scootopiav2/typechart.ts deleted file mode 100644 index 2f77447c50..0000000000 --- a/data/mods/scootopiav2/typechart.ts +++ /dev/null @@ -1,550 +0,0 @@ -export const TypeChart: import('../../../sim/dex-data').ModdedTypeDataTable = { - bug: { - num: 6, - damageTaken: { - Bug: 0, - Dark: 0, - Dragon: 0, - Electric: 0, - Fairy: 0, - Fighting: 2, - Fire: 1, - Flying: 1, - Ghost: 0, - Grass: 2, - Ground: 2, - Ice: 0, - Normal: 0, - Poison: 0, - Psychic: 0, - Rock: 1, - Steel: 0, - Water: 0, - Crystal: 0, - Feral: 0, - }, - HPivs: { atk: 30, def: 30, spd: 30 }, - HPdvs: { atk: 13, def: 13 }, - }, - dark: { - num: 16, - damageTaken: { - prankster: 3, - Bug: 1, - Dark: 2, - Dragon: 0, - Electric: 0, - Fairy: 1, - Fighting: 1, - Fire: 0, - Flying: 0, - Ghost: 2, - Grass: 0, - Ground: 0, - Ice: 0, - Normal: 0, - Poison: 0, - Psychic: 3, - Rock: 0, - Steel: 0, - Water: 0, - Crystal: 1, - Feral: 0, - }, - HPivs: {}, - }, - dragon: { - num: 15, - damageTaken: { - Bug: 0, - Dark: 0, - Dragon: 1, - Electric: 2, - Fairy: 1, - Fighting: 0, - Fire: 2, - Flying: 0, - Ghost: 0, - Grass: 2, - Ground: 0, - Ice: 1, - Normal: 0, - Poison: 0, - Psychic: 0, - Rock: 0, - Steel: 0, - Water: 2, - Crystal: 0, - Feral: 2, - }, - HPivs: { atk: 30 }, - HPdvs: { def: 14 }, - }, - electric: { - num: 12, - damageTaken: { - par: 3, - Bug: 0, - Dark: 0, - Dragon: 0, - Electric: 2, - Fairy: 0, - Fighting: 0, - Fire: 0, - Flying: 2, - Ghost: 0, - Grass: 0, - Ground: 1, - Ice: 0, - Normal: 0, - Poison: 0, - Psychic: 0, - Rock: 0, - Steel: 2, - Water: 0, - Crystal: 2, - Feral: 0, - }, - HPivs: { spa: 30 }, - HPdvs: { atk: 14 }, - }, - fairy: { - num: 17, - damageTaken: { - Bug: 2, - Dark: 2, - Dragon: 3, - Electric: 0, - Fairy: 0, - Fighting: 2, - Fire: 0, - Flying: 0, - Ghost: 0, - Grass: 0, - Ground: 0, - Ice: 0, - Normal: 0, - Poison: 1, - Psychic: 0, - Rock: 0, - Steel: 1, - Water: 0, - Crystal: 0, - Feral: 1, - }, - }, - fighting: { - num: 1, - damageTaken: { - Bug: 2, - Dark: 2, - Dragon: 0, - Electric: 0, - Fairy: 1, - Fighting: 0, - Fire: 0, - Flying: 1, - Ghost: 0, - Grass: 0, - Ground: 0, - Ice: 0, - Normal: 0, - Poison: 0, - Psychic: 1, - Rock: 2, - Steel: 0, - Water: 0, - Crystal: 2, - Feral: 0, - }, - HPivs: { def: 30, spa: 30, spd: 30, spe: 30 }, - HPdvs: { atk: 12, def: 12 }, - }, - fire: { - num: 9, - damageTaken: { - brn: 3, - Bug: 2, - Dark: 0, - Dragon: 0, - Electric: 0, - Fairy: 2, - Fighting: 0, - Fire: 2, - Flying: 0, - Ghost: 0, - Grass: 2, - Ground: 1, - Ice: 2, - Normal: 0, - Poison: 0, - Psychic: 0, - Rock: 1, - Steel: 2, - Water: 1, - Crystal: 1, - Feral: 2, - }, - HPivs: { atk: 30, spa: 30, spe: 30 }, - HPdvs: { atk: 14, def: 12 }, - }, - flying: { - num: 2, - damageTaken: { - Bug: 2, - Dark: 0, - Dragon: 0, - Electric: 1, - Fairy: 0, - Fighting: 2, - Fire: 0, - Flying: 0, - Ghost: 0, - Grass: 2, - Ground: 3, - Ice: 1, - Normal: 0, - Poison: 0, - Psychic: 0, - Rock: 1, - Steel: 0, - Water: 0, - Crystal: 0, - Feral: 1, - }, - HPivs: { hp: 30, atk: 30, def: 30, spa: 30, spd: 30 }, - HPdvs: { atk: 12, def: 13 }, - }, - ghost: { - num: 7, - damageTaken: { - trapped: 3, - Bug: 2, - Dark: 1, - Dragon: 0, - Electric: 0, - Fairy: 0, - Fighting: 3, - Fire: 0, - Flying: 0, - Ghost: 1, - Grass: 0, - Ground: 0, - Ice: 0, - Normal: 3, - Poison: 2, - Psychic: 0, - Rock: 0, - Steel: 0, - Water: 0, - Crystal: 1, - Feral: 2, - }, - HPivs: { def: 30, spd: 30 }, - HPdvs: { atk: 13, def: 14 }, - }, - grass: { - num: 11, - damageTaken: { - powder: 3, - Bug: 1, - Dark: 0, - Dragon: 0, - Electric: 2, - Fairy: 0, - Fighting: 0, - Fire: 1, - Flying: 1, - Ghost: 0, - Grass: 2, - Ground: 2, - Ice: 1, - Normal: 0, - Poison: 1, - Psychic: 0, - Rock: 0, - Steel: 0, - Water: 2, - Crystal: 0, - Feral: 1, - }, - HPivs: { atk: 30, spa: 30 }, - HPdvs: { atk: 14, def: 14 }, - }, - ground: { - num: 4, - damageTaken: { - sandstorm: 3, - Bug: 0, - Dark: 0, - Dragon: 0, - Electric: 3, - Fairy: 0, - Fighting: 0, - Fire: 0, - Flying: 0, - Ghost: 0, - Grass: 1, - Ground: 0, - Ice: 1, - Normal: 0, - Poison: 2, - Psychic: 0, - Rock: 2, - Steel: 0, - Water: 1, - Crystal: 0, - Feral: 0, - }, - HPivs: { spa: 30, spd: 30 }, - HPdvs: { atk: 12 }, - }, - ice: { - num: 14, - damageTaken: { - hail: 3, - frz: 3, - Bug: 0, - Dark: 0, - Dragon: 0, - Electric: 0, - Fairy: 0, - Fighting: 1, - Fire: 1, - Flying: 0, - Ghost: 0, - Grass: 0, - Ground: 0, - Ice: 2, - Normal: 0, - Poison: 0, - Psychic: 0, - Rock: 1, - Steel: 1, - Water: 0, - Crystal: 0, - Feral: 0, - }, - HPivs: { atk: 30, def: 30 }, - HPdvs: { def: 13 }, - }, - normal: { - num: 0, - damageTaken: { - Bug: 0, - Dark: 0, - Dragon: 0, - Electric: 0, - Fairy: 0, - Fighting: 1, - Fire: 0, - Flying: 0, - Ghost: 3, - Grass: 0, - Ground: 0, - Ice: 0, - Normal: 0, - Poison: 0, - Psychic: 0, - Rock: 0, - Steel: 0, - Water: 0, - Crystal: 0, - Feral: 1, - }, - }, - poison: { - num: 3, - damageTaken: { - psn: 3, - tox: 3, - Bug: 2, - Dark: 0, - Dragon: 0, - Electric: 0, - Fairy: 2, - Fighting: 2, - Fire: 0, - Flying: 0, - Ghost: 0, - Grass: 2, - Ground: 1, - Ice: 0, - Normal: 0, - Poison: 2, - Psychic: 1, - Rock: 0, - Steel: 0, - Water: 0, - Crystal: 0, - Feral: 2, - }, - HPivs: { def: 30, spa: 30, spd: 30 }, - HPdvs: { atk: 12, def: 14 }, - }, - psychic: { - num: 13, - damageTaken: { - Bug: 1, - Dark: 1, - Dragon: 0, - Electric: 0, - Fairy: 0, - Fighting: 2, - Fire: 0, - Flying: 0, - Ghost: 1, - Grass: 0, - Ground: 0, - Ice: 0, - Normal: 0, - Poison: 0, - Psychic: 2, - Rock: 0, - Steel: 0, - Water: 0, - Crystal: 0, - Feral: 0, - }, - HPivs: { atk: 30, spe: 30 }, - HPdvs: { def: 12 }, - }, - rock: { - num: 5, - damageTaken: { - sandstorm: 3, - Bug: 0, - Dark: 0, - Dragon: 0, - Electric: 0, - Fairy: 0, - Fighting: 1, - Fire: 2, - Flying: 2, - Ghost: 0, - Grass: 1, - Ground: 1, - Ice: 0, - Normal: 2, - Poison: 2, - Psychic: 0, - Rock: 0, - Steel: 1, - Water: 1, - Crystal: 0, - Feral: 0, - }, - HPivs: { def: 30, spd: 30, spe: 30 }, - HPdvs: { atk: 13, def: 12 }, - }, - steel: { - num: 8, - damageTaken: { - psn: 3, - tox: 3, - sandstorm: 3, - Bug: 2, - Dark: 0, - Dragon: 2, - Electric: 0, - Fairy: 2, - Fighting: 1, - Fire: 1, - Flying: 2, - Ghost: 0, - Grass: 2, - Ground: 1, - Ice: 2, - Normal: 2, - Poison: 3, - Psychic: 2, - Rock: 2, - Steel: 2, - Water: 0, - Crystal: 2, - Feral: 0, - }, - HPivs: { spd: 30 }, - HPdvs: { atk: 13 }, - }, - water: { - num: 10, - damageTaken: { - Bug: 0, - Dark: 0, - Dragon: 0, - Electric: 1, - Fairy: 0, - Fighting: 0, - Fire: 2, - Flying: 0, - Ghost: 0, - Grass: 1, - Ground: 0, - Ice: 2, - Normal: 0, - Poison: 0, - Psychic: 0, - Rock: 0, - Steel: 2, - Water: 2, - Crystal: 0, - Feral: 1, - }, - HPivs: { atk: 30, def: 30, spa: 30 }, - HPdvs: { atk: 14, def: 13 }, - }, - crystal: { - num: -1, - damageTaken: { - brn: 3, - sandstorm: 3, - Bug: 0, - Dark: 2, - Dragon: 0, - Electric: 1, - Fairy: 0, - Fighting: 1, - Fire: 2, - Flying: 0, - Ghost: 0, - Grass: 0, - Ground: 2, - Ice: 0, - Normal: 2, - Poison: 0, - Psychic: 0, - Rock: 2, - Steel: 1, - Water: 2, - Crystal: 2, - Feral: 2, - }, - }, - feral: { - num: -1, - damageTaken: { - slp: 3, - Bug: 0, - Dark: 0, - Dragon: 1, - Electric: 0, - Fairy: 2, - Fighting: 0, - Fire: 1, - Flying: 0, - Ghost: 2, - Grass: 0, - Ground: 0, - Ice: 2, - Normal: 0, - Poison: 1, - Psychic: 0, - Rock: 0, - Steel: 0, - Water: 0, - Crystal: 0, - Feral: 0, - }, - }, -}; diff --git a/data/mods/sixbysix/formats-data.ts b/data/mods/sixbysix/formats-data.ts new file mode 100644 index 0000000000..40e510453d --- /dev/null +++ b/data/mods/sixbysix/formats-data.ts @@ -0,0 +1,113 @@ +export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormatsDataTable = { + kingdraclassic: { + tier: "OU", + }, + kingdrabrinepool: { + tier: "OU", + }, + kingdradruid: { + tier: "OU", + }, + kingdrabard: { + tier: "OU", + }, + kingdragourmet: { + tier: "OU", + }, + kingdraancient: { + tier: "OU", + }, + nidoqueenclassic: { + tier: "OU", + }, + nidoqueenerudite: { + tier: "OU", + }, + nidoqueenvolcanic: { + tier: "OU", + }, + nidoqueenrosegold: { + tier: "OU", + }, + nidoqueenshaman: { + tier: "OU", + }, + nidoqueenjasper: { + tier: "OU", + }, + bisharpcenturion: { + tier: "OU", + }, + bisharpsavage: { + tier: "OU", + }, + bisharpronin: { + tier: "OU", + }, + bisharpmantis: { + tier: "OU", + }, + bisharprevenant: { + tier: "OU", + }, + bisharpassassin: { + tier: "OU", + }, + corviknightthunderbird: { + tier: "OU", + }, + corviknightgenie: { + tier: "OU", + }, + corviknightyeti: { + tier: "OU", + }, + corviknightanalytical: { + tier: "OU", + }, + corviknightmartian: { + tier: "OU", + }, + corviknightfalcon: { + tier: "OU", + }, + krookodileinfernal: { + tier: "OU", + }, + krookodileabyssal: { + tier: "OU", + }, + krookodilewetlander: { + tier: "OU", + }, + krookodilecavedweller: { + tier: "OU", + }, + krookodilecliffside: { + tier: "OU", + }, + krookodilequantum: { + tier: "OU", + }, + ogerponmuerta: { + tier: "OU", + }, + ogerponeaster: { + tier: "OU", + }, + ogerponankh: { + tier: "OU", + }, + ogerponeid: { + tier: "OU", + }, + ogerponvessel: { + tier: "OU", + }, + ogerponkitsune: { + tier: "OU", + }, + ogerpontealtera: { + tier: "Illegal", + }, +}; diff --git a/data/mods/sixbysix/items.ts b/data/mods/sixbysix/items.ts new file mode 100644 index 0000000000..df1a3f90c0 --- /dev/null +++ b/data/mods/sixbysix/items.ts @@ -0,0 +1,32 @@ +export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { + cornerstonemask: { + name: "Cornerstone Mask", + spritenum: 758, + fling: { + basePower: 60, + }, + num: 2406, + gen: 9, + desc: "No competitive use.", + }, + hearthflamemask: { + name: "Hearthflame Mask", + spritenum: 760, + fling: { + basePower: 60, + }, + desc: "No competitive use.", + num: 2408, + gen: 9, + }, + wellspringmask: { + name: "Wellspring Mask", + spritenum: 759, + fling: { + basePower: 60, + }, + desc: "No competitive use.", + num: 2407, + gen: 9, + }, +}; diff --git a/data/mods/sixbysix/learnsets.ts b/data/mods/sixbysix/learnsets.ts new file mode 100644 index 0000000000..593627bd62 --- /dev/null +++ b/data/mods/sixbysix/learnsets.ts @@ -0,0 +1,2580 @@ +export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTable = { + kingdraclassic: { + learnset: { + aquajet: ["9L1"], + bodyslam: ["9L1"], + doubleedge: ["9L1"], + dragonhammer: ["9L1"], + dragontail: ["9L1"], + facade: ["9L1"], + flipturn: ["9L1"], + knockoff: ["9L1"], + liquidation: ["9L1"], + outrage: ["9L1"], + waterfall: ["9L1"], + wavecrash: ["9L1"], + breakingswipe: ["9L1"], + dragonrush: ["9L1"], + flail: ["9L1"], + gigaimpact: ["9L1"], + scaleshot: ["9L1"], + takedown: ["9L1"], + blizzard: ["9L1"], + clearsmog: ["9L1"], + dracometeor: ["9L1"], + dragonpulse: ["9L1"], + hydropump: ["9L1"], + icebeam: ["9L1"], + scald: ["9L1"], + surf: ["9L1"], + terablast: ["9L1"], + weatherball: ["9L1"], + aurorabeam: ["9L1"], + bubblebeam: ["9L1"], + chillingwater: ["9L1"], + dragonbreath: ["9L1"], + hyperbeam: ["9L1"], + icywind: ["9L1"], + muddywater: ["9L1"], + swift: ["9L1"], + twister: ["9L1"], + watergun: ["9L1"], + waterpulse: ["9L1"], + whirlpool: ["9L1"], + agility: ["9L1"], + disable: ["9L1"], + dragondance: ["9L1"], + protect: ["9L1"], + rest: ["9L1"], + sleeptalk: ["9L1"], + substitute: ["9L1"], + dragoncheer: ["9L1"], + endure: ["9L1"], + focusenergy: ["9L1"], + leer: ["9L1"], + raindance: ["9L1"], + scaryface: ["9L1"], + smokescreen: ["9L1"], + snowscape: ["9L1"], + splash: ["9L1"], + yawn: ["9L1"], + }, + }, + kingdrabrinepool: { + learnset: { + gunkshot: ["9L1"], + mortalspin: ["9L1"], + sludgebomb: ["9L1"], + sludgewave: ["9L1"], + toxic: ["9L1"], + watershuriken: ["9L1"], + acid: ["9L1"], + acidspray: ["9L1"], + aquaring: ["9L1"], + sludge: ["9L1"], + venoshock: ["9L1"], + aquajet: ["9L1"], + bodyslam: ["9L1"], + doubleedge: ["9L1"], + dragontail: ["9L1"], + facade: ["9L1"], + flipturn: ["9L1"], + knockoff: ["9L1"], + liquidation: ["9L1"], + waterfall: ["9L1"], + wavecrash: ["9L1"], + flail: ["9L1"], + gigaimpact: ["9L1"], + takedown: ["9L1"], + clearsmog: ["9L1"], + hydropump: ["9L1"], + scald: ["9L1"], + surf: ["9L1"], + terablast: ["9L1"], + weatherball: ["9L1"], + bubblebeam: ["9L1"], + chillingwater: ["9L1"], + hyperbeam: ["9L1"], + icywind: ["9L1"], + muddywater: ["9L1"], + swift: ["9L1"], + watergun: ["9L1"], + waterpulse: ["9L1"], + whirlpool: ["9L1"], + agility: ["9L1"], + disable: ["9L1"], + protect: ["9L1"], + rest: ["9L1"], + sleeptalk: ["9L1"], + substitute: ["9L1"], + endure: ["9L1"], + focusenergy: ["9L1"], + leer: ["9L1"], + raindance: ["9L1"], + scaryface: ["9L1"], + smokescreen: ["9L1"], + snowscape: ["9L1"], + splash: ["9L1"], + yawn: ["9L1"], + }, + }, + nidoqueenclassic: { + learnset: { + aquatail: ["9L1"], + barbbarrage: ["9L1"], + bodyslam: ["9L1"], + brickbreak: ["9L1"], + counter: ["9L1"], + crunch: ["9L1"], + dragontail: ["9L1"], + drillrun: ["9L1"], + earthquake: ["9L1"], + facade: ["9L1"], + firepunch: ["9L1"], + focuspunch: ["9L1"], + highhorsepower: ["9L1"], + icepunch: ["9L1"], + outrage: ["9L1"], + poisonjab: ["9L1"], + rockblast: ["9L1"], + rockslide: ["9L1"], + seismictoss: ["9L1"], + shadowclaw: ["9L1"], + smackdown: ["9L1"], + stoneedge: ["9L1"], + suckerpunch: ["9L1"], + superfang: ["9L1"], + superpower: ["9L1"], + throatchop: ["9L1"], + thunderpunch: ["9L1"], + aerialace: ["9L1"], + beatup: ["9L1"], + bite: ["9L1"], + bulldoze: ["9L1"], + cut: ["9L1"], + dig: ["9L1"], + doublekick: ["9L1"], + dynamicpunch: ["9L1"], + fissure: ["9L1"], + fling: ["9L1"], + furycutter: ["9L1"], + furyswipes: ["9L1"], + gigaimpact: ["9L1"], + headbutt: ["9L1"], + horndrill: ["9L1"], + irontail: ["9L1"], + megakick: ["9L1"], + payday: ["9L1"], + poisonfang: ["9L1"], + poisonsting: ["9L1"], + poisontail: ["9L1"], + rocksmash: ["9L1"], + rocktomb: ["9L1"], + sandtomb: ["9L1"], + scratch: ["9L1"], + stompingtantrum: ["9L1"], + strength: ["9L1"], + tackle: ["9L1"], + takedown: ["9L1"], + thief: ["9L1"], + blizzard: ["9L1"], + dragonpulse: ["9L1"], + earthpower: ["9L1"], + fireblast: ["9L1"], + flamethrower: ["9L1"], + focusblast: ["9L1"], + hex: ["9L1"], + icebeam: ["9L1"], + shadowball: ["9L1"], + sludgebomb: ["9L1"], + sludgewave: ["9L1"], + surf: ["9L1"], + terablast: ["9L1"], + thunder: ["9L1"], + thunderbolt: ["9L1"], + bubblebeam: ["9L1"], + echoedvoice: ["9L1"], + hyperbeam: ["9L1"], + icywind: ["9L1"], + incinerate: ["9L1"], + mudshot: ["9L1"], + mudslap: ["9L1"], + round: ["9L1"], + shockwave: ["9L1"], + snore: ["9L1"], + uproar: ["9L1"], + venoshock: ["9L1"], + watergun: ["9L1"], + waterpulse: ["9L1"], + whirlpool: ["9L1"], + curse: ["9L1"], + detect: ["9L1"], + disable: ["9L1"], + honeclaws: ["9L1"], + protect: ["9L1"], + reflect: ["9L1"], + rest: ["9L1"], + roar: ["9L1"], + slackoff: ["9L1"], + sleeptalk: ["9L1"], + spikes: ["9L1"], + substitute: ["9L1"], + taunt: ["9L1"], + toxic: ["9L1"], + toxicspikes: ["9L1"], + wish: ["9L1"], + attract: ["9L1"], + charm: ["9L1"], + confide: ["9L1"], + defensecurl: ["9L1"], + doubleteam: ["9L1"], + endure: ["9L1"], + flatter: ["9L1"], + focusenergy: ["9L1"], + growl: ["9L1"], + helpinghand: ["9L1"], + mimic: ["9L1"], + quash: ["9L1"], + raindance: ["9L1"], + sandstorm: ["9L1"], + sunnyday: ["9L1"], + supersonic: ["9L1"], + swagger: ["9L1"], + tailwhip: ["9L1"], + torment: ["9L1"], + }, + }, + nidoqueenerudite: { + learnset: { + calmmind: ["9L1"], + chillyreception: ["9L1"], + expandingforce: ["9L1"], + futuresight: ["9L1"], + psychic: ["9L1"], + psychicnoise: ["9L1"], + psyshock: ["9L1"], + trickroom: ["9L1"], + zenheadbutt: ["9L1"], + amnesia: ["9L1"], + confusion: ["9L1"], + healpulse: ["9L1"], + imprison: ["9L1"], + magicroom: ["9L1"], + psybeam: ["9L1"], + psychicterrain: ["9L1"], + skillswap: ["9L1"], + wonderroom: ["9L1"], + aquatail: ["9L1"], + bodyslam: ["9L1"], + counter: ["9L1"], + crunch: ["9L1"], + dragontail: ["9L1"], + drillrun: ["9L1"], + earthquake: ["9L1"], + facade: ["9L1"], + firepunch: ["9L1"], + highhorsepower: ["9L1"], + icepunch: ["9L1"], + rockblast: ["9L1"], + rockslide: ["9L1"], + seismictoss: ["9L1"], + shadowclaw: ["9L1"], + smackdown: ["9L1"], + stoneedge: ["9L1"], + superfang: ["9L1"], + throatchop: ["9L1"], + thunderpunch: ["9L1"], + aerialace: ["9L1"], + beatup: ["9L1"], + bite: ["9L1"], + bulldoze: ["9L1"], + cut: ["9L1"], + dig: ["9L1"], + doublekick: ["9L1"], + fissure: ["9L1"], + fling: ["9L1"], + furycutter: ["9L1"], + furyswipes: ["9L1"], + gigaimpact: ["9L1"], + headbutt: ["9L1"], + horndrill: ["9L1"], + irontail: ["9L1"], + megakick: ["9L1"], + payday: ["9L1"], + rocksmash: ["9L1"], + rocktomb: ["9L1"], + sandtomb: ["9L1"], + scratch: ["9L1"], + stompingtantrum: ["9L1"], + strength: ["9L1"], + tackle: ["9L1"], + takedown: ["9L1"], + thief: ["9L1"], + blizzard: ["9L1"], + dragonpulse: ["9L1"], + earthpower: ["9L1"], + fireblast: ["9L1"], + flamethrower: ["9L1"], + focusblast: ["9L1"], + icebeam: ["9L1"], + shadowball: ["9L1"], + surf: ["9L1"], + terablast: ["9L1"], + thunder: ["9L1"], + thunderbolt: ["9L1"], + bubblebeam: ["9L1"], + echoedvoice: ["9L1"], + hyperbeam: ["9L1"], + icywind: ["9L1"], + incinerate: ["9L1"], + mudshot: ["9L1"], + mudslap: ["9L1"], + round: ["9L1"], + shockwave: ["9L1"], + snore: ["9L1"], + uproar: ["9L1"], + watergun: ["9L1"], + waterpulse: ["9L1"], + whirlpool: ["9L1"], + curse: ["9L1"], + detect: ["9L1"], + disable: ["9L1"], + honeclaws: ["9L1"], + protect: ["9L1"], + reflect: ["9L1"], + rest: ["9L1"], + roar: ["9L1"], + sleeptalk: ["9L1"], + substitute: ["9L1"], + taunt: ["9L1"], + wish: ["9L1"], + attract: ["9L1"], + charm: ["9L1"], + confide: ["9L1"], + defensecurl: ["9L1"], + doubleteam: ["9L1"], + endure: ["9L1"], + flatter: ["9L1"], + focusenergy: ["9L1"], + growl: ["9L1"], + helpinghand: ["9L1"], + mimic: ["9L1"], + raindance: ["9L1"], + sandstorm: ["9L1"], + sunnyday: ["9L1"], + supersonic: ["9L1"], + tailwhip: ["9L1"], + }, + }, + bisharpcenturion: { + learnset: { + bodypress: ["9L1"], + brickbreak: ["9L1"], + bulletpunch: ["9L1"], + drainpunch: ["9L1"], + facade: ["9L1"], + focuspunch: ["9L1"], + foulplay: ["9L1"], + hammerarm: ["9L1"], + ironhead: ["9L1"], + lowkick: ["9L1"], + nightslash: ["9L1"], + poisonjab: ["9L1"], + shadowclaw: ["9L1"], + superpower: ["9L1"], + xscissor: ["9L1"], + bulldoze: ["9L1"], + dig: ["9L1"], + dynamicpunch: ["9L1"], + falseswipe: ["9L1"], + feint: ["9L1"], + fling: ["9L1"], + furycutter: ["9L1"], + gigaimpact: ["9L1"], + guillotine: ["9L1"], + headbutt: ["9L1"], + lowsweep: ["9L1"], + metalburst: ["9L1"], + metalclaw: ["9L1"], + retaliate: ["9L1"], + reversal: ["9L1"], + scratch: ["9L1"], + slash: ["9L1"], + takedown: ["9L1"], + thief: ["9L1"], + upperhand: ["9L1"], + airslash: ["9L1"], + flashcannon: ["9L1"], + focusblast: ["9L1"], + grassknot: ["9L1"], + steelbeam: ["9L1"], + terablast: ["9L1"], + weatherball: ["9L1"], + hyperbeam: ["9L1"], + bulkup: ["9L1"], + curse: ["9L1"], + detect: ["9L1"], + irondefense: ["9L1"], + protect: ["9L1"], + rest: ["9L1"], + sleeptalk: ["9L1"], + stealthrock: ["9L1"], + substitute: ["9L1"], + switcheroo: ["9L1"], + swordsdance: ["9L1"], + taunt: ["9L1"], + thunderwave: ["9L1"], + coaching: ["9L1"], + endure: ["9L1"], + leer: ["9L1"], + meanlook: ["9L1"], + metalsound: ["9L1"], + sandstorm: ["9L1"], + sunnyday: ["9L1"], + scaryface: ["9L1"], + spite: ["9L1"], + torment: ["9L1"], + wideguard: ["9L1"], + }, + }, + bisharpsavage: { + learnset: { + knockoff: ["9L1"], + powerwhip: ["9L1"], + leafblade: ["9L1"], + bulletseed: ["9L1"], + grassyglide: ["9L1"], + seedbomb: ["9L1"], + leechseed: ["9L1"], + vinewhip: ["9L1"], + branchpoke: ["9L1"], + leafage: ["9L1"], + megadrain: ["9L1"], + absorb: ["9L1"], + grassyterrain: ["9L1"], + razorleaf: ["9L1"], + bodypress: ["9L1"], + brickbreak: ["9L1"], + bulletpunch: ["9L1"], + facade: ["9L1"], + focuspunch: ["9L1"], + foulplay: ["9L1"], + ironhead: ["9L1"], + nightslash: ["9L1"], + poisonjab: ["9L1"], + superpower: ["9L1"], + xscissor: ["9L1"], + bulldoze: ["9L1"], + dig: ["9L1"], + dynamicpunch: ["9L1"], + falseswipe: ["9L1"], + feint: ["9L1"], + fling: ["9L1"], + furycutter: ["9L1"], + gigaimpact: ["9L1"], + guillotine: ["9L1"], + headbutt: ["9L1"], + lowsweep: ["9L1"], + metalburst: ["9L1"], + metalclaw: ["9L1"], + retaliate: ["9L1"], + reversal: ["9L1"], + scratch: ["9L1"], + slash: ["9L1"], + takedown: ["9L1"], + thief: ["9L1"], + flashcannon: ["9L1"], + grassknot: ["9L1"], + steelbeam: ["9L1"], + terablast: ["9L1"], + weatherball: ["9L1"], + hyperbeam: ["9L1"], + bulkup: ["9L1"], + curse: ["9L1"], + irondefense: ["9L1"], + protect: ["9L1"], + rest: ["9L1"], + sleeptalk: ["9L1"], + stealthrock: ["9L1"], + substitute: ["9L1"], + thunderwave: ["9L1"], + coaching: ["9L1"], + endure: ["9L1"], + leer: ["9L1"], + meanlook: ["9L1"], + metalsound: ["9L1"], + sandstorm: ["9L1"], + sunnyday: ["9L1"], + scaryface: ["9L1"], + spite: ["9L1"], + torment: ["9L1"], + wideguard: ["9L1"], + }, + }, + corviknightthunderbird: { + learnset: { + acrobatics: ["9L1"], + bodypress: ["9L1"], + bodyslam: ["9L1"], + bravebird: ["9L1"], + doubleedge: ["9L1"], + drillpeck: ["9L1"], + facade: ["9L1"], + supercellslam: ["9L1"], + uturn: ["9L1"], + aerialace: ["9L1"], + dualwingbeat: ["9L1"], + fly: ["9L1"], + furyattack: ["9L1"], + gigaimpact: ["9L1"], + peck: ["9L1"], + pluck: ["9L1"], + powertrip: ["9L1"], + skyattack: ["9L1"], + spark: ["9L1"], + takedown: ["9L1"], + thief: ["9L1"], + wildcharge: ["9L1"], + airslash: ["9L1"], + discharge: ["9L1"], + heatwave: ["9L1"], + hurricane: ["9L1"], + terablast: ["9L1"], + thunder: ["9L1"], + thunderbolt: ["9L1"], + voltswitch: ["9L1"], + aircutter: ["9L1"], + chargebeam: ["9L1"], + electroball: ["9L1"], + hyperbeam: ["9L1"], + swift: ["9L1"], + thundershock: ["9L1"], + zapcannon: ["9L1"], + agility: ["9L1"], + curse: ["9L1"], + defog: ["9L1"], + honeclaws: ["9L1"], + irondefense: ["9L1"], + lightscreen: ["9L1"], + protect: ["9L1"], + reflect: ["9L1"], + rest: ["9L1"], + roost: ["9L1"], + sleeptalk: ["9L1"], + substitute: ["9L1"], + tailwind: ["9L1"], + electricterrain: ["9L1"], + endure: ["9L1"], + faketears: ["9L1"], + leer: ["9L1"], + raindance: ["9L1"], + sandattack: ["9L1"], + scaryface: ["9L1"], + screech: ["9L1"], + spite: ["9L1"], + swagger: ["9L1"], + }, + }, + corviknightgenie: { + learnset: { + calmmind: ["9L1"], + earthpower: ["9L1"], + earthquake: ["9L1"], + powergem: ["9L1"], + sandsearstorm: ["9L1"], + scorchingsands: ["9L1"], + stealthrock: ["9L1"], + dig: ["9L1"], + sandstorm: ["9L1"], + acrobatics: ["9L1"], + bodyslam: ["9L1"], + doubleedge: ["9L1"], + facade: ["9L1"], + uturn: ["9L1"], + aerialace: ["9L1"], + dualwingbeat: ["9L1"], + fly: ["9L1"], + furyattack: ["9L1"], + gigaimpact: ["9L1"], + peck: ["9L1"], + pluck: ["9L1"], + powertrip: ["9L1"], + skyattack: ["9L1"], + spark: ["9L1"], + takedown: ["9L1"], + thief: ["9L1"], + heatwave: ["9L1"], + terablast: ["9L1"], + thunder: ["9L1"], + thunderbolt: ["9L1"], + voltswitch: ["9L1"], + aircutter: ["9L1"], + chargebeam: ["9L1"], + electroball: ["9L1"], + hyperbeam: ["9L1"], + swift: ["9L1"], + thundershock: ["9L1"], + agility: ["9L1"], + curse: ["9L1"], + defog: ["9L1"], + honeclaws: ["9L1"], + irondefense: ["9L1"], + lightscreen: ["9L1"], + protect: ["9L1"], + reflect: ["9L1"], + rest: ["9L1"], + sleeptalk: ["9L1"], + substitute: ["9L1"], + tailwind: ["9L1"], + electricterrain: ["9L1"], + endure: ["9L1"], + faketears: ["9L1"], + leer: ["9L1"], + raindance: ["9L1"], + sandattack: ["9L1"], + scaryface: ["9L1"], + screech: ["9L1"], + spite: ["9L1"], + swagger: ["9L1"], + }, + }, + krookodileinfernal: { + learnset: { + bodyslam: ["9L1"], + brickbreak: ["9L1"], + counter: ["9L1"], + crunch: ["9L1"], + doubleedge: ["9L1"], + dragonclaw: ["9L1"], + dragontail: ["9L1"], + endeavor: ["9L1"], + facade: ["9L1"], + firefang: ["9L1"], + firelash: ["9L1"], + flamecharge: ["9L1"], + flareblitz: ["9L1"], + focuspunch: ["9L1"], + foulplay: ["9L1"], + gunkshot: ["9L1"], + knockoff: ["9L1"], + lashout: ["9L1"], + outrage: ["9L1"], + shadowclaw: ["9L1"], + throatchop: ["9L1"], + aerialace: ["9L1"], + bite: ["9L1"], + breakingswipe: ["9L1"], + fling: ["9L1"], + gigaimpact: ["9L1"], + powertrip: ["9L1"], + scaleshot: ["9L1"], + takedown: ["9L1"], + thief: ["9L1"], + thrash: ["9L1"], + darkpulse: ["9L1"], + dragonpulse: ["9L1"], + eruption: ["9L1"], + fierywrath: ["9L1"], + fireblast: ["9L1"], + flamethrower: ["9L1"], + heatwave: ["9L1"], + magmastorm: ["9L1"], + overheat: ["9L1"], + sludgebomb: ["9L1"], + terablast: ["9L1"], + weatherball: ["9L1"], + burningjealousy: ["9L1"], + ember: ["9L1"], + firespin: ["9L1"], + hyperbeam: ["9L1"], + incinerate: ["9L1"], + inferno: ["9L1"], + snarl: ["9L1"], + curse: ["9L1"], + encore: ["9L1"], + partingshot: ["9L1"], + protect: ["9L1"], + rest: ["9L1"], + sleeptalk: ["9L1"], + substitute: ["9L1"], + switcheroo: ["9L1"], + taunt: ["9L1"], + willowisp: ["9L1"], + endure: ["9L1"], + helpinghand: ["9L1"], + leer: ["9L1"], + memento: ["9L1"], + sunnyday: ["9L1"], + scaryface: ["9L1"], + spite: ["9L1"], + swagger: ["9L1"], + torment: ["9L1"], + }, + }, + krookodileabyssal: { + learnset: { + dragondance: ["9L1"], + earthquake: ["9L1"], + hydropump: ["9L1"], + liquidation: ["9L1"], + stoneedge: ["9L1"], + bodyslam: ["9L1"], + brickbreak: ["9L1"], + counter: ["9L1"], + crunch: ["9L1"], + doubleedge: ["9L1"], + dragonclaw: ["9L1"], + dragontail: ["9L1"], + endeavor: ["9L1"], + facade: ["9L1"], + flamecharge: ["9L1"], + flareblitz: ["9L1"], + focuspunch: ["9L1"], + foulplay: ["9L1"], + gunkshot: ["9L1"], + knockoff: ["9L1"], + lashout: ["9L1"], + outrage: ["9L1"], + shadowclaw: ["9L1"], + throatchop: ["9L1"], + aerialace: ["9L1"], + bite: ["9L1"], + breakingswipe: ["9L1"], + fling: ["9L1"], + gigaimpact: ["9L1"], + powertrip: ["9L1"], + scaleshot: ["9L1"], + takedown: ["9L1"], + thief: ["9L1"], + thrash: ["9L1"], + dragonpulse: ["9L1"], + sludgebomb: ["9L1"], + terablast: ["9L1"], + weatherball: ["9L1"], + burningjealousy: ["9L1"], + ember: ["9L1"], + firespin: ["9L1"], + hyperbeam: ["9L1"], + incinerate: ["9L1"], + inferno: ["9L1"], + snarl: ["9L1"], + curse: ["9L1"], + encore: ["9L1"], + partingshot: ["9L1"], + protect: ["9L1"], + rest: ["9L1"], + sleeptalk: ["9L1"], + substitute: ["9L1"], + switcheroo: ["9L1"], + taunt: ["9L1"], + willowisp: ["9L1"], + endure: ["9L1"], + helpinghand: ["9L1"], + leer: ["9L1"], + memento: ["9L1"], + sunnyday: ["9L1"], + scaryface: ["9L1"], + spite: ["9L1"], + swagger: ["9L1"], + torment: ["9L1"], + }, + }, + ogerponmuerta: { + learnset: { + facade: ["9L1"], + knockoff: ["9L1"], + lashout: ["9L1"], + poltergeist: ["9L1"], + quickattack: ["9L1"], + shadowclaw: ["9L1"], + shadowsneak: ["9L1"], + throatchop: ["9L1"], + uturn: ["9L1"], + astonish: ["9L1"], + falseswipe: ["9L1"], + fling: ["9L1"], + gigaimpact: ["9L1"], + phantomforce: ["9L1"], + retaliate: ["9L1"], + rocktomb: ["9L1"], + slam: ["9L1"], + takedown: ["9L1"], + dazzlinggleam: ["9L1"], + drainingkiss: ["9L1"], + fleurcannon: ["9L1"], + hex: ["9L1"], + nightshade: ["9L1"], + shadowball: ["9L1"], + taunt: ["9L1"], + terablast: ["9L1"], + weatherball: ["9L1"], + disarmingvoice: ["9L1"], + icywind: ["9L1"], + hyperbeam: ["9L1"], + batonpass: ["9L1"], + curse: ["9L1"], + destinybond: ["9L1"], + disable: ["9L1"], + perishsong: ["9L1"], + protect: ["9L1"], + reflect: ["9L1"], + rest: ["9L1"], + sleeptalk: ["9L1"], + substitute: ["9L1"], + thunderwave: ["9L1"], + trick: ["9L1"], + trickroom: ["9L1"], + willowisp: ["9L1"], + babydolleyes: ["9L1"], + charm: ["9L1"], + confuseray: ["9L1"], + endure: ["9L1"], + focusenergy: ["9L1"], + followme: ["9L1"], + gravity: ["9L1"], + growth: ["9L1"], + helpinghand: ["9L1"], + imprison: ["9L1"], + magicroom: ["9L1"], + metronome: ["9L1"], + mistyterrain: ["9L1"], + scaryface: ["9L1"], + spite: ["9L1"], + }, + }, + ogerponeaster: { + learnset: { + bodyslam: ["9L1"], + calmmind: ["9L1"], + hypervoice: ["9L1"], + moonblast: ["9L1"], + mysticalfire: ["9L1"], + playrough: ["9L1"], + softboiled: ["9L1"], + springtidestorm: ["9L1"], + stealthrock: ["9L1"], + aromaticmist: ["9L1"], + celebrate: ["9L1"], + confide: ["9L1"], + covet: ["9L1"], + decorate: ["9L1"], + feint: ["9L1"], + playnice: ["9L1"], + safeguard: ["9L1"], + snore: ["9L1"], + stuffcheeks: ["9L1"], + sweetkiss: ["9L1"], + uproar: ["9L1"], + facade: ["9L1"], + knockoff: ["9L1"], + quickattack: ["9L1"], + throatchop: ["9L1"], + uturn: ["9L1"], + falseswipe: ["9L1"], + fling: ["9L1"], + gigaimpact: ["9L1"], + phantomforce: ["9L1"], + retaliate: ["9L1"], + rocktomb: ["9L1"], + slam: ["9L1"], + takedown: ["9L1"], + dazzlinggleam: ["9L1"], + drainingkiss: ["9L1"], + taunt: ["9L1"], + terablast: ["9L1"], + weatherball: ["9L1"], + disarmingvoice: ["9L1"], + icywind: ["9L1"], + hyperbeam: ["9L1"], + protect: ["9L1"], + reflect: ["9L1"], + rest: ["9L1"], + sleeptalk: ["9L1"], + substitute: ["9L1"], + thunderwave: ["9L1"], + trick: ["9L1"], + babydolleyes: ["9L1"], + charm: ["9L1"], + confuseray: ["9L1"], + endure: ["9L1"], + focusenergy: ["9L1"], + followme: ["9L1"], + gravity: ["9L1"], + growth: ["9L1"], + helpinghand: ["9L1"], + imprison: ["9L1"], + metronome: ["9L1"], + mistyterrain: ["9L1"], + scaryface: ["9L1"], + spite: ["9L1"], + }, + }, + ogerponankh: { + learnset: { + swordsdance: ["9L1"], + earthquake: ["9L1"], + earthpower: ["9L1"], + darkpulse: ["9L1"], + stoneedge: ["9L1"], + powergem: ["9L1"], + facade: ["9L1"], + knockoff: ["9L1"], + poltergeist: ["9L1"], + shadowclaw: ["9L1"], + throatchop: ["9L1"], + uturn: ["9L1"], + astonish: ["9L1"], + falseswipe: ["9L1"], + fling: ["9L1"], + gigaimpact: ["9L1"], + phantomforce: ["9L1"], + retaliate: ["9L1"], + rocktomb: ["9L1"], + slam: ["9L1"], + takedown: ["9L1"], + dazzlinggleam: ["9L1"], + hex: ["9L1"], + shadowball: ["9L1"], + taunt: ["9L1"], + terablast: ["9L1"], + disarmingvoice: ["9L1"], + icywind: ["9L1"], + hyperbeam: ["9L1"], + batonpass: ["9L1"], + destinybond: ["9L1"], + perishsong: ["9L1"], + protect: ["9L1"], + reflect: ["9L1"], + rest: ["9L1"], + sleeptalk: ["9L1"], + substitute: ["9L1"], + trick: ["9L1"], + babydolleyes: ["9L1"], + charm: ["9L1"], + confuseray: ["9L1"], + endure: ["9L1"], + focusenergy: ["9L1"], + followme: ["9L1"], + gravity: ["9L1"], + growth: ["9L1"], + helpinghand: ["9L1"], + imprison: ["9L1"], + magicroom: ["9L1"], + metronome: ["9L1"], + mistyterrain: ["9L1"], + scaryface: ["9L1"], + spite: ["9L1"], + }, + }, + kingdradruid: { + learnset: { + bodyslam: ["9L1"], + doubleedge: ["9L1"], + dragontail: ["9L1"], + facade: ["9L1"], + ironhead: ["9L1"], + outrage: ["9L1"], + scaleshot: ["9L1"], + smartstrike: ["9L1"], + breakingswipe: ["9L1"], + dragonrush: ["9L1"], + flail: ["9L1"], + gigaimpact: ["9L1"], + hardpress: ["9L1"], + metalburst: ["9L1"], + steelwing: ["9L1"], + takedown: ["9L1"], + doomdesire: ["9L1"], + dracometeor: ["9L1"], + dragonpulse: ["9L1"], + flamethrower: ["9L1"], + flashcannon: ["9L1"], + hydropump: ["9L1"], + icebeam: ["9L1"], + steelbeam: ["9L1"], + tachyoncutter: ["9L1"], + terablast: ["9L1"], + weatherball: ["9L1"], + aurorabeam: ["9L1"], + bubblebeam: ["9L1"], + chillingwater: ["9L1"], + dragonbreath: ["9L1"], + hyperbeam: ["9L1"], + icywind: ["9L1"], + swift: ["9L1"], + twister: ["9L1"], + watergun: ["9L1"], + waterpulse: ["9L1"], + whirlpool: ["9L1"], + calmmind: ["9L1"], + disable: ["9L1"], + partingshot: ["9L1"], + protect: ["9L1"], + rest: ["9L1"], + substitute: ["9L1"], + dragoncheer: ["9L1"], + endure: ["9L1"], + focusenergy: ["9L1"], + leer: ["9L1"], + metalsound: ["9L1"], + raindance: ["9L1"], + scaryface: ["9L1"], + sleeptalk: ["9L1"], + smokescreen: ["9L1"], + snowscape: ["9L1"], + splash: ["9L1"], + yawn: ["9L1"], + }, + }, + nidoqueenvolcanic: { + learnset: { + bodyslam: ["9L1"], + brickbreak: ["9L1"], + crunch: ["9L1"], + dragontail: ["9L1"], + drillrun: ["9L1"], + dynamicpunch: ["9L1"], + earthquake: ["9L1"], + facade: ["9L1"], + firepunch: ["9L1"], + flareblitz: ["9L1"], + focuspunch: ["9L1"], + headbutt: ["9L1"], + heatcrash: ["9L1"], + highhorsepower: ["9L1"], + outrage: ["9L1"], + rockblast: ["9L1"], + rockslide: ["9L1"], + rocktomb: ["9L1"], + seismictoss: ["9L1"], + stoneedge: ["9L1"], + suckerpunch: ["9L1"], + superfang: ["9L1"], + superpower: ["9L1"], + temperflare: ["9L1"], + throatchop: ["9L1"], + thunderpunch: ["9L1"], + aerialace: ["9L1"], + beatup: ["9L1"], + bite: ["9L1"], + bulldoze: ["9L1"], + counter: ["9L1"], + dig: ["9L1"], + doublekick: ["9L1"], + fissure: ["9L1"], + fling: ["9L1"], + furycutter: ["9L1"], + furyswipes: ["9L1"], + gigaimpact: ["9L1"], + horndrill: ["9L1"], + irontail: ["9L1"], + megakick: ["9L1"], + payday: ["9L1"], + poisontail: ["9L1"], + rocksmash: ["9L1"], + sandtomb: ["9L1"], + scratch: ["9L1"], + stompingtantrum: ["9L1"], + strength: ["9L1"], + tackle: ["9L1"], + takedown: ["9L1"], + thief: ["9L1"], + dragonpulse: ["9L1"], + earthpower: ["9L1"], + fireblast: ["9L1"], + flamethrower: ["9L1"], + focusblast: ["9L1"], + icebeam: ["9L1"], + lavaplume: ["9L1"], + meteorbeam: ["9L1"], + overheat: ["9L1"], + powergem: ["9L1"], + shadowball: ["9L1"], + terablast: ["9L1"], + thunder: ["9L1"], + thunderbolt: ["9L1"], + echoedvoice: ["9L1"], + ember: ["9L1"], + firespin: ["9L1"], + hyperbeam: ["9L1"], + incinerate: ["9L1"], + mudshot: ["9L1"], + mudslap: ["9L1"], + round: ["9L1"], + shockwave: ["9L1"], + snore: ["9L1"], + uproar: ["9L1"], + curse: ["9L1"], + disable: ["9L1"], + honeclaws: ["9L1"], + protect: ["9L1"], + reflect: ["9L1"], + rest: ["9L1"], + roar: ["9L1"], + stealthrock: ["9L1"], + spikes: ["9L1"], + substitute: ["9L1"], + taunt: ["9L1"], + willowisp: ["9L1"], + wish: ["9L1"], + attract: ["9L1"], + charm: ["9L1"], + confide: ["9L1"], + defensecurl: ["9L1"], + doubleteam: ["9L1"], + endure: ["9L1"], + flatter: ["9L1"], + focusenergy: ["9L1"], + followme: ["9L1"], + growl: ["9L1"], + helpinghand: ["9L1"], + mimic: ["9L1"], + quash: ["9L1"], + raindance: ["9L1"], + sandstorm: ["9L1"], + sleeptalk: ["9L1"], + sunnyday: ["9L1"], + supersonic: ["9L1"], + swagger: ["9L1"], + tailwhip: ["9L1"], + torment: ["9L1"], + }, + }, + bisharpronin: { + learnset: { + barbbarrage: ["9L1"], + bodypress: ["9L1"], + brickbreak: ["9L1"], + drainpunch: ["9L1"], + dynamicpunch: ["9L1"], + facade: ["9L1"], + focuspunch: ["9L1"], + foulplay: ["9L1"], + headbutt: ["9L1"], + lowkick: ["9L1"], + mortalspin: ["9L1"], + nightslash: ["9L1"], + poisonjab: ["9L1"], + sacredsword: ["9L1"], + shadowclaw: ["9L1"], + uturn: ["9L1"], + xscissor: ["9L1"], + bulldoze: ["9L1"], + crosspoison: ["9L1"], + dig: ["9L1"], + falseswipe: ["9L1"], + feint: ["9L1"], + fling: ["9L1"], + furycutter: ["9L1"], + gigaimpact: ["9L1"], + guillotine: ["9L1"], + lowsweep: ["9L1"], + poisonsting: ["9L1"], + retaliate: ["9L1"], + reversal: ["9L1"], + scratch: ["9L1"], + slash: ["9L1"], + takedown: ["9L1"], + thief: ["9L1"], + upperhand: ["9L1"], + airslash: ["9L1"], + focusblast: ["9L1"], + sludgebomb: ["9L1"], + terablast: ["9L1"], + weatherball: ["9L1"], + acid: ["9L1"], + acidspray: ["9L1"], + hyperbeam: ["9L1"], + venoshock: ["9L1"], + detect: ["9L1"], + encore: ["9L1"], + protect: ["9L1"], + rest: ["9L1"], + stealthrock: ["9L1"], + substitute: ["9L1"], + switcheroo: ["9L1"], + taunt: ["9L1"], + toxic: ["9L1"], + toxicspikes: ["9L1"], + coaching: ["9L1"], + endure: ["9L1"], + leer: ["9L1"], + meanlook: ["9L1"], + poisongas: ["9L1"], + scaryface: ["9L1"], + sleeptalk: ["9L1"], + spite: ["9L1"], + sunnyday: ["9L1"], + torment: ["9L1"], + wideguard: ["9L1"], + }, + }, + corviknightyeti: { + learnset: { + acrobatics: ["9L1"], + bravebird: ["9L1"], + doubleedge: ["9L1"], + drillpeck: ["9L1"], + dualwingbeat: ["9L1"], + facade: ["9L1"], + iceshard: ["9L1"], + icespinner: ["9L1"], + iciclespear: ["9L1"], + aerialace: ["9L1"], + fly: ["9L1"], + furyattack: ["9L1"], + gigaimpact: ["9L1"], + peck: ["9L1"], + pluck: ["9L1"], + skyattack: ["9L1"], + takedown: ["9L1"], + thief: ["9L1"], + airslash: ["9L1"], + bleakwindstorm: ["9L1"], + blizzard: ["9L1"], + hurricane: ["9L1"], + icebeam: ["9L1"], + terablast: ["9L1"], + voltswitch: ["9L1"], + weatherball: ["9L1"], + aircutter: ["9L1"], + chillingwater: ["9L1"], + hyperbeam: ["9L1"], + icywind: ["9L1"], + powdersnow: ["9L1"], + swift: ["9L1"], + waterpulse: ["9L1"], + curse: ["9L1"], + defog: ["9L1"], + encore: ["9L1"], + haze: ["9L1"], + lightscreen: ["9L1"], + protect: ["9L1"], + reflect: ["9L1"], + rest: ["9L1"], + roost: ["9L1"], + substitute: ["9L1"], + tailwind: ["9L1"], + endure: ["9L1"], + faketears: ["9L1"], + leer: ["9L1"], + mist: ["9L1"], + sandattack: ["9L1"], + scaryface: ["9L1"], + screech: ["9L1"], + sleeptalk: ["9L1"], + snowscape: ["9L1"], + spite: ["9L1"], + swagger: ["9L1"], + }, + }, + krookodilewetlander: { + learnset: { + aquajet: ["9L1"], + bodyslam: ["9L1"], + brickbreak: ["9L1"], + bulletseed: ["9L1"], + crunch: ["9L1"], + doubleedge: ["9L1"], + dragonclaw: ["9L1"], + dragontail: ["9L1"], + endeavor: ["9L1"], + facade: ["9L1"], + focuspunch: ["9L1"], + foulplay: ["9L1"], + gunkshot: ["9L1"], + knockoff: ["9L1"], + lashout: ["9L1"], + leafblade: ["9L1"], + liquidation: ["9L1"], + rapidspin: ["9L1"], + scaleshot: ["9L1"], + waterfall: ["9L1"], + wavecrash: ["9L1"], + woodhammer: ["9L1"], + aerialace: ["9L1"], + bite: ["9L1"], + breakingswipe: ["9L1"], + counter: ["9L1"], + fling: ["9L1"], + gigaimpact: ["9L1"], + takedown: ["9L1"], + thief: ["9L1"], + thrash: ["9L1"], + dragonpulse: ["9L1"], + gigadrain: ["9L1"], + inferno: ["9L1"], + sludgebomb: ["9L1"], + terablast: ["9L1"], + weatherball: ["9L1"], + hyperbeam: ["9L1"], + megadrain: ["9L1"], + snarl: ["9L1"], + whirlpool: ["9L1"], + curse: ["9L1"], + encore: ["9L1"], + leechseed: ["9L1"], + protect: ["9L1"], + rest: ["9L1"], + strengthsap: ["9L1"], + substitute: ["9L1"], + switcheroo: ["9L1"], + synthesis: ["9L1"], + taunt: ["9L1"], + endure: ["9L1"], + helpinghand: ["9L1"], + leer: ["9L1"], + scaryface: ["9L1"], + sleeptalk: ["9L1"], + spite: ["9L1"], + swagger: ["9L1"], + torment: ["9L1"], + }, + }, + krookodilecavedweller: { + learnset: { + bodyslam: ["9L1"], + doubleedge: ["9L1"], + dragonclaw: ["9L1"], + earthquake: ["9L1"], + endeavor: ["9L1"], + explosion: ["9L1"], + facade: ["9L1"], + firefang: ["9L1"], + firelash: ["9L1"], + flamecharge: ["9L1"], + flareblitz: ["9L1"], + knockoff: ["9L1"], + rapidspin: ["9L1"], + rockblast: ["9L1"], + rockslide: ["9L1"], + scaleshot: ["9L1"], + stoneedge: ["9L1"], + aerialace: ["9L1"], + breakingswipe: ["9L1"], + gigaimpact: ["9L1"], + takedown: ["9L1"], + thief: ["9L1"], + thrash: ["9L1"], + dragonpulse: ["9L1"], + fireblast: ["9L1"], + flamethrower: ["9L1"], + heatwave: ["9L1"], + inferno: ["9L1"], + overheat: ["9L1"], + terablast: ["9L1"], + weatherball: ["9L1"], + burningjealousy: ["9L1"], + ember: ["9L1"], + firespin: ["9L1"], + hyperbeam: ["9L1"], + incinerate: ["9L1"], + curse: ["9L1"], + encore: ["9L1"], + lightscreen: ["9L1"], + memento: ["9L1"], + partingshot: ["9L1"], + protect: ["9L1"], + reflect: ["9L1"], + rest: ["9L1"], + stealthrock: ["9L1"], + substitute: ["9L1"], + switcheroo: ["9L1"], + taunt: ["9L1"], + willowisp: ["9L1"], + endure: ["9L1"], + helpinghand: ["9L1"], + leer: ["9L1"], + scaryface: ["9L1"], + sleeptalk: ["9L1"], + spite: ["9L1"], + sunnyday: ["9L1"], + swagger: ["9L1"], + tarshot: ["9L1"], + torment: ["9L1"], + }, + }, + ogerponeid: { + learnset: { + knockoff: ["9L1"], + liquidation: ["9L1"], + rapidspin: ["9L1"], + shadowclaw: ["9L1"], + wavecrash: ["9L1"], + astonish: ["9L1"], + falseswipe: ["9L1"], + fling: ["9L1"], + gigaimpact: ["9L1"], + lick: ["9L1"], + retaliate: ["9L1"], + slam: ["9L1"], + takedown: ["9L1"], + hex: ["9L1"], + moonblast: ["9L1"], + surf: ["9L1"], + shadowball: ["9L1"], + chillingwater: ["9L1"], + hyperbeam: ["9L1"], + icywind: ["9L1"], + watergun: ["9L1"], + waterpledge: ["9L1"], + waterpulse: ["9L1"], + batonpass: ["9L1"], + healbell: ["9L1"], + lunarblessing: ["9L1"], + lunardance: ["9L1"], + protect: ["9L1"], + recover: ["9L1"], + rest: ["9L1"], + spikes: ["9L1"], + stealthrock: ["9L1"], + substitute: ["9L1"], + thunderwave: ["9L1"], + toxic: ["9L1"], + aquaring: ["9L1"], + babydolleyes: ["9L1"], + celebrate: ["9L1"], + confuseray: ["9L1"], + cosmicpower: ["9L1"], + decorate: ["9L1"], + endure: ["9L1"], + focusenergy: ["9L1"], + followme: ["9L1"], + gravity: ["9L1"], + growth: ["9L1"], + helpinghand: ["9L1"], + imprison: ["9L1"], + instruct: ["9L1"], + lifedew: ["9L1"], + magicroom: ["9L1"], + metronome: ["9L1"], + mistyterrain: ["9L1"], + raindance: ["9L1"], + sleeptalk: ["9L1"], + stuffcheeks: ["9L1"], + }, + }, + corviknightanalytical: { + learnset: { + acrobatics: ["9L1"], + bodypress: ["9L1"], + bodyslam: ["9L1"], + doubleedge: ["9L1"], + facade: ["9L1"], + supercellslam: ["9L1"], + uturn: ["9L1"], + zenheadbutt: ["9L1"], + aerialace: ["9L1"], + dualwingbeat: ["9L1"], + fly: ["9L1"], + furyattack: ["9L1"], + gigaimpact: ["9L1"], + peck: ["9L1"], + pluck: ["9L1"], + skyattack: ["9L1"], + spark: ["9L1"], + takedown: ["9L1"], + thief: ["9L1"], + wildcharge: ["9L1"], + discharge: ["9L1"], + heatwave: ["9L1"], + psychic: ["9L1"], + psyshock: ["9L1"], + terablast: ["9L1"], + thunder: ["9L1"], + thunderbolt: ["9L1"], + voltswitch: ["9L1"], + chargebeam: ["9L1"], + electroball: ["9L1"], + hyperbeam: ["9L1"], + swift: ["9L1"], + thundershock: ["9L1"], + psybeam: ["9L1"], + zapcannon: ["9L1"], + agility: ["9L1"], + calmmind: ["9L1"], + curse: ["9L1"], + lightscreen: ["9L1"], + protect: ["9L1"], + reflect: ["9L1"], + rest: ["9L1"], + roost: ["9L1"], + sleeptalk: ["9L1"], + substitute: ["9L1"], + electricterrain: ["9L1"], + endure: ["9L1"], + faketears: ["9L1"], + leer: ["9L1"], + psychicterrain: ["9L1"], + raindance: ["9L1"], + sandattack: ["9L1"], + scaryface: ["9L1"], + screech: ["9L1"], + spite: ["9L1"], + swagger: ["9L1"], + }, + }, + bisharpmantis: { + learnset: { + ceaselessedge: ["9L1"], + facade: ["9L1"], + bitterblade: ["9L1"], + firstimpression: ["9L1"], + foulplay: ["9L1"], + leechlife: ["9L1"], + lowkick: ["9L1"], + nightslash: ["9L1"], + poisonjab: ["9L1"], + shadowclaw: ["9L1"], + suckerpunch: ["9L1"], + knockoff: ["9L1"], + xscissor: ["9L1"], + bulldoze: ["9L1"], + dig: ["9L1"], + falseswipe: ["9L1"], + feint: ["9L1"], + fling: ["9L1"], + furycutter: ["9L1"], + gigaimpact: ["9L1"], + guillotine: ["9L1"], + retaliate: ["9L1"], + reversal: ["9L1"], + scratch: ["9L1"], + slash: ["9L1"], + takedown: ["9L1"], + thief: ["9L1"], + solarblade: ["9L1"], + darkpulse: ["9L1"], + bugbuzz: ["9L1"], + snarl: ["9L1"], + terablast: ["9L1"], + weatherball: ["9L1"], + hyperbeam: ["9L1"], + agility: ["9L1"], + curse: ["9L1"], + detect: ["9L1"], + protect: ["9L1"], + rest: ["9L1"], + sleeptalk: ["9L1"], + substitute: ["9L1"], + switcheroo: ["9L1"], + swordsdance: ["9L1"], + taunt: ["9L1"], + toxic: ["9L1"], + endure: ["9L1"], + leer: ["9L1"], + meanlook: ["9L1"], + stringshot: ["9L1"], + sunnyday: ["9L1"], + scaryface: ["9L1"], + spite: ["9L1"], + torment: ["9L1"], + wideguard: ["9L1"], + }, + }, + nidoqueenrosegold: { + learnset: { + aquatail: ["9L1"], + bodyslam: ["9L1"], + brickbreak: ["9L1"], + crunch: ["9L1"], + dragontail: ["9L1"], + drillrun: ["9L1"], + dynamicpunch: ["9L1"], + facade: ["9L1"], + firepunch: ["9L1"], + focuspunch: ["9L1"], + headbutt: ["9L1"], + icepunch: ["9L1"], + poisonjab: ["9L1"], + rockblast: ["9L1"], + rockslide: ["9L1"], + rocktomb: ["9L1"], + seismictoss: ["9L1"], + shadowclaw: ["9L1"], + stoneedge: ["9L1"], + suckerpunch: ["9L1"], + superfang: ["9L1"], + superpower: ["9L1"], + throatchop: ["9L1"], + aerialace: ["9L1"], + beatup: ["9L1"], + bite: ["9L1"], + bulldoze: ["9L1"], + counter: ["9L1"], + dig: ["9L1"], + doublekick: ["9L1"], + fling: ["9L1"], + furycutter: ["9L1"], + furyswipes: ["9L1"], + gigaimpact: ["9L1"], + horndrill: ["9L1"], + irontail: ["9L1"], + megakick: ["9L1"], + payday: ["9L1"], + poisonfang: ["9L1"], + poisonsting: ["9L1"], + poisontail: ["9L1"], + rocksmash: ["9L1"], + sandtomb: ["9L1"], + scratch: ["9L1"], + stompingtantrum: ["9L1"], + strength: ["9L1"], + tackle: ["9L1"], + takedown: ["9L1"], + thief: ["9L1"], + blizzard: ["9L1"], + dragonpulse: ["9L1"], + energyball: ["9L1"], + flamethrower: ["9L1"], + focusblast: ["9L1"], + gigadrain: ["9L1"], + hex: ["9L1"], + leafstorm: ["9L1"], + shadowball: ["9L1"], + sludgebomb: ["9L1"], + sludgewave: ["9L1"], + surf: ["9L1"], + terablast: ["9L1"], + thunder: ["9L1"], + earthpower: ["9L1"], + absorb: ["9L1"], + bubblebeam: ["9L1"], + echoedvoice: ["9L1"], + hyperbeam: ["9L1"], + icywind: ["9L1"], + incinerate: ["9L1"], + mudslap: ["9L1"], + round: ["9L1"], + shockwave: ["9L1"], + snore: ["9L1"], + uproar: ["9L1"], + venoshock: ["9L1"], + watergun: ["9L1"], + waterpulse: ["9L1"], + whirlpool: ["9L1"], + curse: ["9L1"], + detect: ["9L1"], + disable: ["9L1"], + honeclaws: ["9L1"], + leechseed: ["9L1"], + protect: ["9L1"], + reflect: ["9L1"], + rest: ["9L1"], + roar: ["9L1"], + slackoff: ["9L1"], + spikes: ["9L1"], + spikyshield: ["9L1"], + substitute: ["9L1"], + taunt: ["9L1"], + toxic: ["9L1"], + toxicspikes: ["9L1"], + wish: ["9L1"], + attract: ["9L1"], + charm: ["9L1"], + confide: ["9L1"], + defensecurl: ["9L1"], + doubleteam: ["9L1"], + endure: ["9L1"], + flatter: ["9L1"], + focusenergy: ["9L1"], + growl: ["9L1"], + helpinghand: ["9L1"], + mimic: ["9L1"], + quash: ["9L1"], + raindance: ["9L1"], + sandstorm: ["9L1"], + sleeptalk: ["9L1"], + sunnyday: ["9L1"], + supersonic: ["9L1"], + swagger: ["9L1"], + tailwhip: ["9L1"], + torment: ["9L1"], + }, + }, + kingdrabard: { + learnset: { + aquajet: ["9L1"], + bodyslam: ["9L1"], + doubleedge: ["9L1"], + facade: ["9L1"], + flipturn: ["9L1"], + knockoff: ["9L1"], + waterfall: ["9L1"], + liquidation: ["9L1"], + spiritbreak: ["9L1"], + breakingswipe: ["9L1"], + flail: ["9L1"], + gigaimpact: ["9L1"], + takedown: ["9L1"], + alluringvoice: ["9L1"], + blizzard: ["9L1"], + clearsmog: ["9L1"], + hydropump: ["9L1"], + icebeam: ["9L1"], + moonblast: ["9L1"], + psychicnoise: ["9L1"], + scald: ["9L1"], + surf: ["9L1"], + terablast: ["9L1"], + weatherball: ["9L1"], + aurorabeam: ["9L1"], + bubblebeam: ["9L1"], + chillingwater: ["9L1"], + dragonbreath: ["9L1"], + hyperbeam: ["9L1"], + icywind: ["9L1"], + muddywater: ["9L1"], + swift: ["9L1"], + twister: ["9L1"], + watergun: ["9L1"], + waterpulse: ["9L1"], + whirlpool: ["9L1"], + agility: ["9L1"], + disable: ["9L1"], + moonlight: ["9L1"], + protect: ["9L1"], + rest: ["9L1"], + substitute: ["9L1"], + dragoncheer: ["9L1"], + endure: ["9L1"], + focusenergy: ["9L1"], + leer: ["9L1"], + raindance: ["9L1"], + scaryface: ["9L1"], + sleeptalk: ["9L1"], + smokescreen: ["9L1"], + snowscape: ["9L1"], + splash: ["9L1"], + yawn: ["9L1"], + }, + }, + kingdragourmet: { + learnset: { + bodyslam: ["9L1"], + doubleedge: ["9L1"], + dragontail: ["9L1"], + facade: ["9L1"], + fakeout: ["9L1"], + flipturn: ["9L1"], + knockoff: ["9L1"], + orderup: ["9L1"], + outrage: ["9L1"], + rapidspin: ["9L1"], + scaleshot: ["9L1"], + breakingswipe: ["9L1"], + dragonrush: ["9L1"], + flail: ["9L1"], + gigaimpact: ["9L1"], + takedown: ["9L1"], + clearsmog: ["9L1"], + dracometeor: ["9L1"], + terablast: ["9L1"], + chillingwater: ["9L1"], + dragonbreath: ["9L1"], + hyperbeam: ["9L1"], + icywind: ["9L1"], + swift: ["9L1"], + twister: ["9L1"], + whirlpool: ["9L1"], + banefulbunker: ["9L1"], + defog: ["9L1"], + disable: ["9L1"], + glare: ["9L1"], + healbell: ["9L1"], + protect: ["9L1"], + rest: ["9L1"], + substitute: ["9L1"], + toxic: ["9L1"], + whirlwind: ["9L1"], + wish: ["9L1"], + dragoncheer: ["9L1"], + endure: ["9L1"], + focusenergy: ["9L1"], + leer: ["9L1"], + raindance: ["9L1"], + scaryface: ["9L1"], + sleeptalk: ["9L1"], + smokescreen: ["9L1"], + snowscape: ["9L1"], + splash: ["9L1"], + yawn: ["9L1"], + }, + }, + nidoqueenshaman: { + learnset: { + bodyslam: ["9L1"], + brickbreak: ["9L1"], + drillrun: ["9L1"], + dynamicpunch: ["9L1"], + earthquake: ["9L1"], + facade: ["9L1"], + focuspunch: ["9L1"], + headbutt: ["9L1"], + poisonjab: ["9L1"], + poltergeist: ["9L1"], + rockblast: ["9L1"], + rockslide: ["9L1"], + rocktomb: ["9L1"], + seismictoss: ["9L1"], + shadowclaw: ["9L1"], + shadowsneak: ["9L1"], + superfang: ["9L1"], + superpower: ["9L1"], + aerialace: ["9L1"], + beatup: ["9L1"], + bite: ["9L1"], + bulldoze: ["9L1"], + dig: ["9L1"], + doublekick: ["9L1"], + fissure: ["9L1"], + fling: ["9L1"], + furycutter: ["9L1"], + furyswipes: ["9L1"], + gigaimpact: ["9L1"], + horndrill: ["9L1"], + irontail: ["9L1"], + lick: ["9L1"], + megakick: ["9L1"], + payday: ["9L1"], + poisonfang: ["9L1"], + poisonsting: ["9L1"], + poisontail: ["9L1"], + rocksmash: ["9L1"], + sandtomb: ["9L1"], + scratch: ["9L1"], + stompingtantrum: ["9L1"], + strength: ["9L1"], + tackle: ["9L1"], + takedown: ["9L1"], + thief: ["9L1"], + earthpower: ["9L1"], + fireblast: ["9L1"], + flamethrower: ["9L1"], + focusblast: ["9L1"], + hex: ["9L1"], + icebeam: ["9L1"], + shadowball: ["9L1"], + sludgebomb: ["9L1"], + sludgewave: ["9L1"], + surf: ["9L1"], + terablast: ["9L1"], + thunder: ["9L1"], + thunderbolt: ["9L1"], + bubblebeam: ["9L1"], + echoedvoice: ["9L1"], + hyperbeam: ["9L1"], + icywind: ["9L1"], + incinerate: ["9L1"], + mudshot: ["9L1"], + mudslap: ["9L1"], + round: ["9L1"], + shockwave: ["9L1"], + snore: ["9L1"], + uproar: ["9L1"], + venoshock: ["9L1"], + watergun: ["9L1"], + waterpulse: ["9L1"], + whirlpool: ["9L1"], + curse: ["9L1"], + detect: ["9L1"], + disable: ["9L1"], + honeclaws: ["9L1"], + protect: ["9L1"], + reflect: ["9L1"], + rest: ["9L1"], + roar: ["9L1"], + slackoff: ["9L1"], + spikes: ["9L1"], + substitute: ["9L1"], + taunt: ["9L1"], + toxic: ["9L1"], + toxicspikes: ["9L1"], + willowisp: ["9L1"], + wish: ["9L1"], + attract: ["9L1"], + charm: ["9L1"], + confide: ["9L1"], + defensecurl: ["9L1"], + doubleteam: ["9L1"], + endure: ["9L1"], + flatter: ["9L1"], + focusenergy: ["9L1"], + growl: ["9L1"], + helpinghand: ["9L1"], + mimic: ["9L1"], + quash: ["9L1"], + raindance: ["9L1"], + sandstorm: ["9L1"], + sleeptalk: ["9L1"], + sunnyday: ["9L1"], + supersonic: ["9L1"], + swagger: ["9L1"], + tailwhip: ["9L1"], + torment: ["9L1"], + }, + }, + bisharprevenant: { + learnset: { + behemothblade: ["9L1"], + brickbreak: ["9L1"], + drainpunch: ["9L1"], + facade: ["9L1"], + foulplay: ["9L1"], + headbutt: ["9L1"], + ironhead: ["9L1"], + nightslash: ["9L1"], + poisonjab: ["9L1"], + poltergeist: ["9L1"], + sacredsword: ["9L1"], + shadowclaw: ["9L1"], + shadowsneak: ["9L1"], + superpower: ["9L1"], + xscissor: ["9L1"], + bulldoze: ["9L1"], + dig: ["9L1"], + falseswipe: ["9L1"], + feint: ["9L1"], + fling: ["9L1"], + furycutter: ["9L1"], + gigaimpact: ["9L1"], + guillotine: ["9L1"], + lowsweep: ["9L1"], + metalburst: ["9L1"], + metalclaw: ["9L1"], + phantomforce: ["9L1"], + retaliate: ["9L1"], + reversal: ["9L1"], + scratch: ["9L1"], + slash: ["9L1"], + takedown: ["9L1"], + thief: ["9L1"], + upperhand: ["9L1"], + flashcannon: ["9L1"], + focusblast: ["9L1"], + hex: ["9L1"], + nightshade: ["9L1"], + shadowball: ["9L1"], + steelbeam: ["9L1"], + terablast: ["9L1"], + weatherball: ["9L1"], + hyperbeam: ["9L1"], + curse: ["9L1"], + detect: ["9L1"], + irondefense: ["9L1"], + protect: ["9L1"], + recover: ["9L1"], + rest: ["9L1"], + stealthrock: ["9L1"], + substitute: ["9L1"], + swordsdance: ["9L1"], + thunderwave: ["9L1"], + coaching: ["9L1"], + endure: ["9L1"], + leer: ["9L1"], + meanlook: ["9L1"], + metalsound: ["9L1"], + sandstorm: ["9L1"], + scaryface: ["9L1"], + sleeptalk: ["9L1"], + spite: ["9L1"], + sunnyday: ["9L1"], + torment: ["9L1"], + wideguard: ["9L1"], + }, + }, + corviknightmartian: { + learnset: { + bodypress: ["9L1"], + bodyslam: ["9L1"], + ironhead: ["9L1"], + zenheadbutt: ["9L1"], + aerialace: ["9L1"], + dualwingbeat: ["9L1"], + fly: ["9L1"], + gigaimpact: ["9L1"], + gyroball: ["9L1"], + hardpress: ["9L1"], + psychocut: ["9L1"], + takedown: ["9L1"], + thunderbolt: ["9L1"], + psychic: ["9L1"], + doomdesire: ["9L1"], + flashcannon: ["9L1"], + psychicnoise: ["9L1"], + steelbeam: ["9L1"], + storedpower: ["9L1"], + chargebeam: ["9L1"], + hyperbeam: ["9L1"], + swift: ["9L1"], + psybeam: ["9L1"], + calmmind: ["9L1"], + defog: ["9L1"], + irondefense: ["9L1"], + lightscreen: ["9L1"], + protect: ["9L1"], + reflect: ["9L1"], + rest: ["9L1"], + sleeptalk: ["9L1"], + substitute: ["9L1"], + taunt: ["9L1"], + teleport: ["9L1"], + trickroom: ["9L1"], + electricterrain: ["9L1"], + endure: ["9L1"], + gravity: ["9L1"], + leer: ["9L1"], + psychicterrain: ["9L1"], + raindance: ["9L1"], + scaryface: ["9L1"], + screech: ["9L1"], + skillswap: ["9L1"], + spite: ["9L1"], + swagger: ["9L1"], + }, + }, + krookodilecliffside: { + learnset: { + bodyslam: ["9L1"], + crunch: ["9L1"], + doubleedge: ["9L1"], + dragonclaw: ["9L1"], + dragontail: ["9L1"], + endeavor: ["9L1"], + facade: ["9L1"], + firefang: ["9L1"], + focuspunch: ["9L1"], + foulplay: ["9L1"], + gunkshot: ["9L1"], + knockoff: ["9L1"], + powertrip: ["9L1"], + scaleshot: ["9L1"], + throatchop: ["9L1"], + aerialace: ["9L1"], + bite: ["9L1"], + breakingswipe: ["9L1"], + counter: ["9L1"], + fling: ["9L1"], + gigaimpact: ["9L1"], + takedown: ["9L1"], + thief: ["9L1"], + thrash: ["9L1"], + darkpulse: ["9L1"], + dracometeor: ["9L1"], + dragonpulse: ["9L1"], + flamethrower: ["9L1"], + flashcannon: ["9L1"], + focusblast: ["9L1"], + inferno: ["9L1"], + terablast: ["9L1"], + weatherball: ["9L1"], + burningjealousy: ["9L1"], + ember: ["9L1"], + firespin: ["9L1"], + hyperbeam: ["9L1"], + incinerate: ["9L1"], + snarl: ["9L1"], + curse: ["9L1"], + defog: ["9L1"], + encore: ["9L1"], + memento: ["9L1"], + partingshot: ["9L1"], + protect: ["9L1"], + rest: ["9L1"], + roost: ["9L1"], + stealthrock: ["9L1"], + substitute: ["9L1"], + switcheroo: ["9L1"], + taunt: ["9L1"], + toxic: ["9L1"], + endure: ["9L1"], + helpinghand: ["9L1"], + leer: ["9L1"], + scaryface: ["9L1"], + sleeptalk: ["9L1"], + spite: ["9L1"], + sunnyday: ["9L1"], + swagger: ["9L1"], + torment: ["9L1"], + }, + }, + ogerponvessel: { + learnset: { + axekick: ["9L1"], + explosion: ["9L1"], + knockoff: ["9L1"], + leechlife: ["9L1"], + lunge: ["9L1"], + rocktomb: ["9L1"], + sacredsword: ["9L1"], + thunderouskick: ["9L1"], + uturn: ["9L1"], + gigaimpact: ["9L1"], + highjumpkick: ["9L1"], + retaliate: ["9L1"], + skittersmack: ["9L1"], + slam: ["9L1"], + takedown: ["9L1"], + terablast: ["9L1"], + hyperbeam: ["9L1"], + icywind: ["9L1"], + defog: ["9L1"], + destinybond: ["9L1"], + disable: ["9L1"], + encore: ["9L1"], + lightscreen: ["9L1"], + perishsong: ["9L1"], + protect: ["9L1"], + reflect: ["9L1"], + rest: ["9L1"], + spikes: ["9L1"], + substitute: ["9L1"], + taunt: ["9L1"], + toxic: ["9L1"], + trick: ["9L1"], + endure: ["9L1"], + gravity: ["9L1"], + growth: ["9L1"], + helpinghand: ["9L1"], + imprison: ["9L1"], + metronome: ["9L1"], + scaryface: ["9L1"], + sleeptalk: ["9L1"], + spite: ["9L1"], + topsyturvy: ["9L1"], + }, + }, + kingdraancient: { + learnset: { + bodyslam: ["9L1"], + doubleedge: ["9L1"], + facade: ["9L1"], + flareblitz: ["9L1"], + flipturn: ["9L1"], + knockoff: ["9L1"], + liquidation: ["9L1"], + outrage: ["9L1"], + scaleshot: ["9L1"], + seedbomb: ["9L1"], + breakingswipe: ["9L1"], + dragonrush: ["9L1"], + flail: ["9L1"], + gigaimpact: ["9L1"], + takedown: ["9L1"], + clearsmog: ["9L1"], + energyball: ["9L1"], + fireblast: ["9L1"], + flamethrower: ["9L1"], + gigadrain: ["9L1"], + hydropump: ["9L1"], + leafstorm: ["9L1"], + overheat: ["9L1"], + scald: ["9L1"], + terablast: ["9L1"], + weatherball: ["9L1"], + aurorabeam: ["9L1"], + bubblebeam: ["9L1"], + chillingwater: ["9L1"], + dragonbreath: ["9L1"], + hyperbeam: ["9L1"], + icywind: ["9L1"], + muddywater: ["9L1"], + swift: ["9L1"], + twister: ["9L1"], + watergun: ["9L1"], + waterpulse: ["9L1"], + whirlpool: ["9L1"], + agility: ["9L1"], + disable: ["9L1"], + leechseed: ["9L1"], + protect: ["9L1"], + rest: ["9L1"], + substitute: ["9L1"], + synthesis: ["9L1"], + dragoncheer: ["9L1"], + endure: ["9L1"], + focusenergy: ["9L1"], + leer: ["9L1"], + raindance: ["9L1"], + scaryface: ["9L1"], + sleeptalk: ["9L1"], + smokescreen: ["9L1"], + snowscape: ["9L1"], + splash: ["9L1"], + yawn: ["9L1"], + }, + }, + nidoqueenjasper: { + learnset: { + accelerock: ["9L1"], + aquatail: ["9L1"], + bodyslam: ["9L1"], + brickbreak: ["9L1"], + crunch: ["9L1"], + dragontail: ["9L1"], + drillrun: ["9L1"], + dynamicpunch: ["9L1"], + earthquake: ["9L1"], + facade: ["9L1"], + firepunch: ["9L1"], + focuspunch: ["9L1"], + gunkshot: ["9L1"], + headbutt: ["9L1"], + highhorsepower: ["9L1"], + icepunch: ["9L1"], + outrage: ["9L1"], + poisonjab: ["9L1"], + rockblast: ["9L1"], + rockslide: ["9L1"], + rocktomb: ["9L1"], + saltcure: ["9L1"], + seismictoss: ["9L1"], + shadowclaw: ["9L1"], + stoneedge: ["9L1"], + superfang: ["9L1"], + superpower: ["9L1"], + throatchop: ["9L1"], + thunderpunch: ["9L1"], + aerialace: ["9L1"], + beatup: ["9L1"], + bite: ["9L1"], + bulldoze: ["9L1"], + counter: ["9L1"], + dig: ["9L1"], + doublekick: ["9L1"], + fissure: ["9L1"], + fling: ["9L1"], + furycutter: ["9L1"], + furyswipes: ["9L1"], + gigaimpact: ["9L1"], + horndrill: ["9L1"], + irontail: ["9L1"], + megakick: ["9L1"], + payday: ["9L1"], + poisonfang: ["9L1"], + poisonsting: ["9L1"], + poisontail: ["9L1"], + rocksmash: ["9L1"], + sandtomb: ["9L1"], + scratch: ["9L1"], + stompingtantrum: ["9L1"], + strength: ["9L1"], + tackle: ["9L1"], + takedown: ["9L1"], + thief: ["9L1"], + blizzard: ["9L1"], + dragonpulse: ["9L1"], + earthpower: ["9L1"], + fireblast: ["9L1"], + flamethrower: ["9L1"], + focusblast: ["9L1"], + icebeam: ["9L1"], + shadowball: ["9L1"], + sludgebomb: ["9L1"], + terablast: ["9L1"], + thunder: ["9L1"], + thunderbolt: ["9L1"], + bubblebeam: ["9L1"], + echoedvoice: ["9L1"], + hyperbeam: ["9L1"], + icywind: ["9L1"], + incinerate: ["9L1"], + mudshot: ["9L1"], + mudslap: ["9L1"], + round: ["9L1"], + shockwave: ["9L1"], + snore: ["9L1"], + uproar: ["9L1"], + venoshock: ["9L1"], + watergun: ["9L1"], + waterpulse: ["9L1"], + whirlpool: ["9L1"], + curse: ["9L1"], + disable: ["9L1"], + glare: ["9L1"], + honeclaws: ["9L1"], + protect: ["9L1"], + reflect: ["9L1"], + rest: ["9L1"], + roar: ["9L1"], + stealthrock: ["9L1"], + substitute: ["9L1"], + taunt: ["9L1"], + toxic: ["9L1"], + attract: ["9L1"], + charm: ["9L1"], + confide: ["9L1"], + defensecurl: ["9L1"], + doubleteam: ["9L1"], + endure: ["9L1"], + flatter: ["9L1"], + focusenergy: ["9L1"], + growl: ["9L1"], + helpinghand: ["9L1"], + mimic: ["9L1"], + quash: ["9L1"], + raindance: ["9L1"], + sandstorm: ["9L1"], + sleeptalk: ["9L1"], + sunnyday: ["9L1"], + supersonic: ["9L1"], + swagger: ["9L1"], + tailwhip: ["9L1"], + torment: ["9L1"], + }, + }, + bisharpassassin: { + learnset: { + bodypress: ["9L1"], + brickbreak: ["9L1"], + drainpunch: ["9L1"], + dynamicpunch: ["9L1"], + facade: ["9L1"], + focuspunch: ["9L1"], + foulplay: ["9L1"], + hammerarm: ["9L1"], + headbutt: ["9L1"], + iceshard: ["9L1"], + icespinner: ["9L1"], + lowkick: ["9L1"], + machpunch: ["9L1"], + nightslash: ["9L1"], + poisonjab: ["9L1"], + sacredsword: ["9L1"], + shadowclaw: ["9L1"], + tripleaxel: ["9L1"], + xscissor: ["9L1"], + bulldoze: ["9L1"], + dig: ["9L1"], + falseswipe: ["9L1"], + feint: ["9L1"], + fling: ["9L1"], + furycutter: ["9L1"], + gigaimpact: ["9L1"], + guillotine: ["9L1"], + lowsweep: ["9L1"], + metalburst: ["9L1"], + metalclaw: ["9L1"], + retaliate: ["9L1"], + reversal: ["9L1"], + scratch: ["9L1"], + slash: ["9L1"], + takedown: ["9L1"], + thief: ["9L1"], + upperhand: ["9L1"], + blizzard: ["9L1"], + focusblast: ["9L1"], + grassknot: ["9L1"], + terablast: ["9L1"], + weatherball: ["9L1"], + hyperbeam: ["9L1"], + auroraveil: ["9L1"], + curse: ["9L1"], + detect: ["9L1"], + partingshot: ["9L1"], + protect: ["9L1"], + rest: ["9L1"], + stealthrock: ["9L1"], + substitute: ["9L1"], + taunt: ["9L1"], + coaching: ["9L1"], + endure: ["9L1"], + leer: ["9L1"], + meanlook: ["9L1"], + metalsound: ["9L1"], + sandstorm: ["9L1"], + scaryface: ["9L1"], + sleeptalk: ["9L1"], + spite: ["9L1"], + sunnyday: ["9L1"], + torment: ["9L1"], + wideguard: ["9L1"], + }, + }, + corviknightfalcon: { + learnset: { + acrobatics: ["9L1"], + bodypress: ["9L1"], + bodyslam: ["9L1"], + bravebird: ["9L1"], + closecombat: ["9L1"], + doubleedge: ["9L1"], + drillpeck: ["9L1"], + dualwingbeat: ["9L1"], + facade: ["9L1"], + knockoff: ["9L1"], + lowkick: ["9L1"], + powertrip: ["9L1"], + uturn: ["9L1"], + wildcharge: ["9L1"], + aerialace: ["9L1"], + fly: ["9L1"], + flyingpress: ["9L1"], + furyattack: ["9L1"], + gigaimpact: ["9L1"], + highjumpkick: ["9L1"], + peck: ["9L1"], + pluck: ["9L1"], + skyattack: ["9L1"], + takedown: ["9L1"], + thief: ["9L1"], + airslash: ["9L1"], + focusblast: ["9L1"], + heatwave: ["9L1"], + hurricane: ["9L1"], + terablast: ["9L1"], + aircutter: ["9L1"], + hyperbeam: ["9L1"], + swift: ["9L1"], + agility: ["9L1"], + curse: ["9L1"], + defog: ["9L1"], + lightscreen: ["9L1"], + protect: ["9L1"], + reflect: ["9L1"], + rest: ["9L1"], + roost: ["9L1"], + substitute: ["9L1"], + tailwind: ["9L1"], + taunt: ["9L1"], + endure: ["9L1"], + faketears: ["9L1"], + leer: ["9L1"], + raindance: ["9L1"], + sandattack: ["9L1"], + scaryface: ["9L1"], + screech: ["9L1"], + sleeptalk: ["9L1"], + spite: ["9L1"], + swagger: ["9L1"], + }, + }, + krookodilequantum: { + learnset: { + bodyslam: ["9L1"], + brickbreak: ["9L1"], + doubleshock: ["9L1"], + doubleedge: ["9L1"], + dragontail: ["9L1"], + earthquake: ["9L1"], + endeavor: ["9L1"], + facade: ["9L1"], + flamecharge: ["9L1"], + focuspunch: ["9L1"], + headsmash: ["9L1"], + knockoff: ["9L1"], + powertrip: ["9L1"], + rockblast: ["9L1"], + scaleshot: ["9L1"], + stoneedge: ["9L1"], + volttackle: ["9L1"], + aerialace: ["9L1"], + bite: ["9L1"], + breakingswipe: ["9L1"], + counter: ["9L1"], + fling: ["9L1"], + gigaimpact: ["9L1"], + takedown: ["9L1"], + thief: ["9L1"], + thrash: ["9L1"], + discharge: ["9L1"], + dragonpulse: ["9L1"], + electroshot: ["9L1"], + flamethrower: ["9L1"], + inferno: ["9L1"], + meteorbeam: ["9L1"], + powergem: ["9L1"], + sludgebomb: ["9L1"], + terablast: ["9L1"], + thunderbolt: ["9L1"], + voltswitch: ["9L1"], + weatherball: ["9L1"], + burningjealousy: ["9L1"], + electroball: ["9L1"], + ember: ["9L1"], + firespin: ["9L1"], + hyperbeam: ["9L1"], + incinerate: ["9L1"], + snarl: ["9L1"], + curse: ["9L1"], + encore: ["9L1"], + memento: ["9L1"], + partingshot: ["9L1"], + protect: ["9L1"], + recover: ["9L1"], + rest: ["9L1"], + stealthrock: ["9L1"], + substitute: ["9L1"], + switcheroo: ["9L1"], + taunt: ["9L1"], + thunderwave: ["9L1"], + charge: ["9L1"], + conversion: ["9L1"], + conversion2: ["9L1"], + eerieimpulse: ["9L1"], + electricterrain: ["9L1"], + endure: ["9L1"], + helpinghand: ["9L1"], + leer: ["9L1"], + scaryface: ["9L1"], + sleeptalk: ["9L1"], + spite: ["9L1"], + sunnyday: ["9L1"], + swagger: ["9L1"], + torment: ["9L1"], + }, + }, + ogerponkitsune: { + learnset: { + aquastep: ["9L1"], + blazekick: ["9L1"], + facade: ["9L1"], + knockoff: ["9L1"], + powerwhip: ["9L1"], + rocktomb: ["9L1"], + shadowsneak: ["9L1"], + uturn: ["9L1"], + zingzap: ["9L1"], + astonish: ["9L1"], + falseswipe: ["9L1"], + fling: ["9L1"], + gigaimpact: ["9L1"], + phantomforce: ["9L1"], + retaliate: ["9L1"], + slam: ["9L1"], + takedown: ["9L1"], + aurasphere: ["9L1"], + dazzlinggleam: ["9L1"], + earthpower: ["9L1"], + flashcannon: ["9L1"], + powergem: ["9L1"], + shadowball: ["9L1"], + terablast: ["9L1"], + weatherball: ["9L1"], + disarmingvoice: ["9L1"], + hyperbeam: ["9L1"], + icywind: ["9L1"], + protect: ["9L1"], + rest: ["9L1"], + substitute: ["9L1"], + transform: ["9L1"], + trickroom: ["9L1"], + babydolleyes: ["9L1"], + charm: ["9L1"], + confuseray: ["9L1"], + endure: ["9L1"], + focusenergy: ["9L1"], + followme: ["9L1"], + gravity: ["9L1"], + growth: ["9L1"], + helpinghand: ["9L1"], + imprison: ["9L1"], + magicroom: ["9L1"], + metronome: ["9L1"], + mistyterrain: ["9L1"], + scaryface: ["9L1"], + sleeptalk: ["9L1"], + spite: ["9L1"], + }, + }, +}; diff --git a/data/mods/sixbysix/pokedex.ts b/data/mods/sixbysix/pokedex.ts new file mode 100644 index 0000000000..a06fef7146 --- /dev/null +++ b/data/mods/sixbysix/pokedex.ts @@ -0,0 +1,542 @@ +export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable = { + kingdra: { + inherit: true, + otherFormes: ["Kingdra-Classic", "Kingdra-Brinepool", "Kingdra-Druid", "Kingdra-Bard", "Kingdra-Gourmet", "Kingdra-Ancient"], + formeOrder: ["Kingdra", "Kingdra-Classic", "Kingdra-Brinepool", "Kingdra-Druid", "Kingdra-Bard", "Kingdra-Gourmet", "Kingdra-Ancient"], + }, + kingdraclassic: { + num: 230, + name: "Kingdra-Classic", + baseSpecies: "Kingdra", + forme: "Classic", + types: ["Water", "Dragon"], + baseStats: { hp: 90, atk: 70, def: 80, spa: 130, spd: 90, spe: 90 }, + abilities: { 0: "Berserk", 1: "Heatproof", H: "Dry Skin" }, + heightm: 1.8, + weightkg: 152, + color: "Blue", + prevo: '', + eggGroups: ["Water 1", "Dragon"], + }, + kingdrabrinepool: { + num: 230, + name: "Kingdra-Brinepool", + baseSpecies: "Kingdra", + forme: "Brinepool", + types: ["Water", "Poison"], + baseStats: { hp: 130, atk: 35, def: 105, spa: 130, spd: 85, spe: 65 }, + abilities: { 0: "Storm Drain", 1: "Purifying Salt", H: "Dry Skin" }, + heightm: 1.8, + weightkg: 152, + color: "Blue", + prevo: '', + eggGroups: ["Water 1", "Dragon"], + }, + kingdradruid: { + num: 230, + name: "Kingdra-Druid", + baseSpecies: "Kingdra", + forme: "Druid", + types: ["Steel", "Dragon"], + baseStats: { hp: 105, atk: 65, def: 90, spa: 120, spd: 120, spe: 50 }, + abilities: { 0: "Berserk", 1: "Heatproof", H: "Water Absorb" }, + heightm: 1.8, + weightkg: 152, + color: "Blue", + prevo: '', + eggGroups: ["Water 1", "Dragon"], + }, + kingdrabard: { + num: 230, + name: "Kingdra-Bard", + baseSpecies: "Kingdra", + forme: "Bard", + types: ["Water", "Fairy"], + baseStats: { hp: 90, atk: 70, def: 80, spa: 130, spd: 100, spe: 80 }, + abilities: { 0: "Punk Rock", 1: "Cute Charm", H: "Dancer" }, + heightm: 1.8, + weightkg: 152, + color: "Blue", + prevo: '', + eggGroups: ["Water 1", "Dragon"], + }, + kingdragourmet: { + num: 230, + name: "Kingdra-Gourmet", + baseSpecies: "Kingdra", + forme: "Gourmet", + types: ["Normal", "Dragon"], + baseStats: { hp: 110, atk: 110, def: 80, spa: 90, spd: 100, spe: 60 }, + abilities: { 0: "Emergency Exit", 1: "Thick Fat", H: "Poison Heal" }, + heightm: 1.8, + weightkg: 152, + color: "Blue", + prevo: '', + eggGroups: ["Water 1", "Dragon"], + }, + kingdraancient: { + num: 230, + name: "Kingdra-Ancient", + baseSpecies: "Kingdra", + forme: "Ancient", + types: ["Fire", "Grass"], + baseStats: { hp: 89, atk: 89, def: 91, spa: 111, spd: 91, spe: 79 }, + abilities: { 0: "Competitive", 1: "Heatproof", H: "Protosynthesis" }, + heightm: 1.8, + weightkg: 152, + color: "Blue", + prevo: '', + eggGroups: ["Water 1", "Dragon"], + }, + nidoqueen: { + inherit: true, + otherFormes: ["Nidoqueen-Classic", "Nidoqueen-Erudite", "Nidoqueen-Volcanic", "Nidoqueen-Rosegold", "Nidoqueen-Shaman", "Nidoqueen-Jasper"], + formeOrder: ["Nidoqueen", "Nidoqueen-Classic", "Nidoqueen-Erudite", "Nidoqueen-Volcanic", "Nidoqueen-Rosegold", "Nidoqueen-Shaman", "Nidoqueen-Jasper"], + }, + nidoqueenclassic: { + num: 31, + name: "Nidoqueen-Classic", + baseSpecies: "Nidoqueen", + forme: "Classic", + types: ["Poison", "Ground"], + gender: "F", + baseStats: { hp: 135, atk: 115, def: 60, spa: 90, spd: 85, spe: 55 }, + abilities: { 0: "Poison Point", 1: "Cheek Pouch", H: "Serene Grace" }, + heightm: 1.3, + weightkg: 60, + color: "Blue", + prevo: '', + eggGroups: ["Undiscovered"], + }, + nidoqueenerudite: { + num: 31, + name: "Nidoqueen-Erudite", + baseSpecies: "Nidoqueen", + forme: "Erudite", + types: ["Psychic", "Ground"], + gender: "F", + baseStats: { hp: 95, atk: 100, def: 80, spa: 115, spd: 110, spe: 40 }, + abilities: { 0: "Cute Charm", 1: "Regenerator", H: "Serene Grace" }, + heightm: 1.3, + weightkg: 60, + color: "Blue", + prevo: '', + eggGroups: ["Undiscovered"], + }, + nidoqueenvolcanic: { + num: 31, + name: "Nidoqueen-Volcanic", + baseSpecies: "Nidoqueen", + forme: "Volcanic", + types: ["Fire", "Ground"], + gender: "F", + baseStats: { hp: 125, atk: 75, def: 100, spa: 110, spd: 75, spe: 55 }, + abilities: { 0: "Flame Body", 1: "Cheek Pouch", H: "Sheer Force" }, + heightm: 1.3, + weightkg: 60, + color: "Blue", + prevo: '', + eggGroups: ["Undiscovered"], + }, + nidoqueenrosegold: { + num: 31, + name: "Nidoqueen-Rosegold", + baseSpecies: "Nidoqueen", + forme: "Rosegold", + types: ["Poison", "Grass"], + gender: "F", + baseStats: { hp: 125, atk: 70, def: 100, spa: 100, spd: 85, spe: 60 }, + abilities: { 0: "Rough Skin", 1: "Cheek Pouch", H: "Shield Dust" }, + heightm: 1.3, + weightkg: 60, + color: "Blue", + prevo: '', + eggGroups: ["Undiscovered"], + }, + nidoqueenshaman: { + num: 31, + name: "Nidoqueen-Shaman", + baseSpecies: "Nidoqueen", + forme: "Shaman", + types: ["Poison", "Ghost"], + gender: "F", + baseStats: { hp: 95, atk: 120, def: 60, spa: 90, spd: 80, spe: 95 }, + abilities: { 0: "Toxic Chain", 1: "Regenerator", H: "Sheer Force" }, + heightm: 1.3, + weightkg: 60, + color: "Blue", + prevo: '', + eggGroups: ["Undiscovered"], + }, + nidoqueenjasper: { + num: 31, + name: "Nidoqueen-Jasper", + baseSpecies: "Nidoqueen", + forme: "Jasper", + types: ["Poison", "Rock"], + gender: "F", + baseStats: { hp: 135, atk: 125, def: 70, spa: 80, spd: 85, spe: 45 }, + abilities: { 0: "Clear Body", 1: "Earth Eater", H: "Sand Stream" }, + heightm: 1.3, + weightkg: 60, + color: "Blue", + prevo: '', + eggGroups: ["Undiscovered"], + }, + bisharp: { + inherit: true, + otherFormes: ["Bisharp-Centurion", "Bisharp-Savage", "Bisharp-Ronin", "Bisharp-Mantis", "Bisharp-Revenant", "Bisharp-Assassin"], + formeOrder: ["Bisharp", "Bisharp-Centurion", "Bisharp-Savage", "Bisharp-Ronin", "Bisharp-Mantis", "Bisharp-Revenant", "Bisharp-Assassin"], + }, + bisharpcenturion: { + num: 625, + name: "Bisharp-Centurion", + baseSpecies: "Bisharp", + forme: "Centurion", + types: ["Fighting", "Steel"], + baseStats: { hp: 70, atk: 140, def: 115, spa: 55, spd: 70, spe: 70 }, + abilities: { 0: "Overcoat", 1: "Technician", H: "Solar Power" }, + heightm: 1.6, + weightkg: 70, + color: "Red", + prevo: '', + eggGroups: ["Human-Like"], + }, + bisharpsavage: { + num: 625, + name: "Bisharp-Savage", + baseSpecies: "Bisharp", + forme: "Savage", + types: ["Grass", "Steel"], + baseStats: { hp: 90, atk: 110, def: 135, spa: 40, spd: 80, spe: 65 }, + abilities: { 0: "Bulletproof", 1: "Technician", H: "Leaf Guard" }, + heightm: 1.6, + weightkg: 70, + color: "Red", + prevo: '', + eggGroups: ["Human-Like"], + }, + bisharpronin: { + num: 625, + name: "Bisharp-Ronin", + baseSpecies: "Bisharp", + forme: "Ronin", + types: ["Fighting", "Poison"], + baseStats: { hp: 70, atk: 115, def: 110, spa: 45, spd: 70, spe: 110 }, + abilities: { 0: "Overcoat", 1: "Technician", H: "Dry Skin" }, + heightm: 1.6, + weightkg: 70, + color: "Red", + prevo: '', + eggGroups: ["Human-Like"], + }, + bisharpmantis: { + num: 625, + name: "Bisharp-Mantis", + baseSpecies: "Bisharp", + forme: "Mantis", + types: ["Dark", "Bug"], + baseStats: { hp: 80, atk: 120, def: 105, spa: 45, spd: 85, spe: 85 }, + abilities: { 0: "Overcoat", 1: "Sharpness", H: "Orichalcum Pulse" }, + heightm: 1.6, + weightkg: 70, + color: "Red", + prevo: '', + eggGroups: ["Human-Like"], + }, + bisharprevenant: { + num: 625, + name: "Bisharp-Revenant", + baseSpecies: "Bisharp", + forme: "Revenant", + types: ["Ghost", "Steel"], + baseStats: { hp: 80, atk: 135, def: 120, spa: 45, spd: 70, spe: 70 }, + abilities: { 0: "Magic Bounce", 1: "Mirror Armor", H: "Justified" }, + heightm: 1.6, + weightkg: 70, + color: "Red", + prevo: '', + eggGroups: ["Human-Like"], + }, + bisharpassassin: { + num: 625, + name: "Bisharp-Assassin", + baseSpecies: "Bisharp", + forme: "Assassin", + types: ["Fighting", "Ice"], + baseStats: { hp: 80, atk: 130, def: 110, spa: 55, spd: 70, spe: 75 }, + abilities: { 0: "Dazzling", 1: "No Guard", H: "Slush Rush" }, + heightm: 1.6, + weightkg: 70, + color: "Red", + prevo: '', + eggGroups: ["Human-Like"], + }, + corviknight: { + inherit: true, + otherFormes: ["Corviknight-Thunderbird", "Corviknight-Genie", "Corviknight-Yeti", "Corviknight-Analytical", "Corviknight-Martian", "Corviknight-Falcon"], + formeOrder: ["Corviknight", "Corviknight-Thunderbird", "Corviknight-Genie", "Corviknight-Yeti", "Corviknight-Analytical", "Corviknight-Martian", "Corviknight-Falcon"], + }, + corviknightthunderbird: { + num: 823, + name: "Corviknight-Thunderbird", + baseSpecies: "Corviknight", + forme: "Thunderbird", + types: ["Flying", "Electric"], + baseStats: { hp: 85, atk: 55, def: 105, spa: 115, spd: 85, spe: 85 }, + abilities: { 0: "Pickpocket", 1: "Quick Feet", H: "Drizzle" }, + heightm: 2.2, + weightkg: 75, + color: "Purple", + prevo: '', + eggGroups: ["Flying"], + }, + corviknightgenie: { + num: 823, + name: "Corviknight-Genie", + baseSpecies: "Corviknight", + forme: "Genie", + types: ["Flying", "Ground"], + baseStats: { hp: 89, atk: 45, def: 95, spa: 120, spd: 90, spe: 91 }, + abilities: { 0: "Intimidate", 1: "Sand Force", H: "Prankster" }, + heightm: 2.2, + weightkg: 75, + color: "Purple", + prevo: '', + eggGroups: ["Flying"], + }, + corviknightyeti: { + num: 823, + name: "Corviknight-Yeti", + baseSpecies: "Corviknight", + forme: "Yeti", + types: ["Flying", "Ice"], + baseStats: { hp: 85, atk: 55, def: 80, spa: 95, spd: 110, spe: 110 }, + abilities: { 0: "Mummy", 1: "Quick Feet", H: "Snow Warning" }, + heightm: 2.2, + weightkg: 75, + color: "Purple", + prevo: '', + eggGroups: ["Flying"], + }, + corviknightanalytical: { + num: 823, + name: "Corviknight-Analytical", + baseSpecies: "Corviknight", + forme: "Analytical", + types: ["Psychic", "Electric"], + baseStats: { hp: 85, atk: 55, def: 80, spa: 110, spd: 85, spe: 115 }, + abilities: { 0: "Pickpocket", 1: "Flare Boost", H: "Psychic Surge" }, + heightm: 2.2, + weightkg: 75, + color: "Purple", + prevo: '', + eggGroups: ["Flying"], + }, + corviknightmartian: { + num: 823, + name: "Corviknight-Martian", + baseSpecies: "Corviknight", + forme: "Martian", + types: ["Psychic", "Steel"], + baseStats: { hp: 95, atk: 45, def: 120, spa: 100, spd: 105, spe: 65 }, + abilities: { 0: "Iron Barbs", 1: "Quick Feet", H: "Hadron Engine" }, + heightm: 2.2, + weightkg: 75, + color: "Purple", + prevo: '', + eggGroups: ["Flying"], + }, + corviknightfalcon: { + num: 823, + name: "Corviknight-Falcon", + baseSpecies: "Corviknight", + forme: "Falcon", + types: ["Flying", "Fighting"], + baseStats: { hp: 86, atk: 95, def: 75, spa: 75, spd: 85, spe: 114 }, + abilities: { 0: "Pickpocket", 1: "Guts", H: "Delta Stream" }, + heightm: 2.2, + weightkg: 75, + color: "Purple", + prevo: '', + eggGroups: ["Flying"], + }, + krookodile: { + inherit: true, + otherFormes: ["Krookodile-Infernal", "Krookodile-Abyssal", "Krookodile-Wetlander", "Krookodile-Cave Dweller", "Krookodile-Cliffside", "Krookodile-Quantum"], + formeOrder: ["Krookodile", "Krookodile-Infernal", "Krookodile-Abyssal", "Krookodile-Wetlander", "Krookodile-Cave Dweller", "Krookodile-Cliffside", "Krookodile-Quantum"], + }, + krookodileinfernal: { + num: 553, + name: "Krookodile-Infernal", + baseSpecies: "Krookodile", + forme: "Infernal", + types: ["Fire", "Dark"], + baseStats: { hp: 90, atk: 80, def: 85, spa: 105, spd: 90, spe: 100 }, + abilities: { 0: "Magic Guard", 1: "Wonder Skin", H: "Sturdy" }, + heightm: 1.5, + weightkg: 96.3, + color: "Red", + prevo: '', + eggGroups: ["Field"], + }, + krookodileabyssal: { + num: 553, + name: "Krookodile-Abyssal", + baseSpecies: "Krookodile", + forme: "Abyssal", + types: ["Ground", "Dark"], + baseStats: { hp: 90, atk: 120, def: 85, spa: 75, spd: 90, spe: 90 }, + abilities: { 0: "Rock Head", 1: "Wonder Skin", H: "Multiscale" }, + heightm: 1.5, + weightkg: 96.3, + color: "Red", + prevo: '', + eggGroups: ["Field"], + }, + krookodilewetlander: { + num: 553, + name: "Krookodile-Wetlander", + baseSpecies: "Krookodile", + forme: "Wetlander", + types: ["Grass", "Water"], + baseStats: { hp: 100, atk: 100, def: 75, spa: 85, spd: 110, spe: 80 }, + abilities: { 0: "Rock Head", 1: "Wonder Skin", H: "Wind Rider" }, + heightm: 1.5, + weightkg: 96.3, + color: "Red", + prevo: '', + eggGroups: ["Field"], + }, + krookodilecavedweller: { + num: 553, + name: "Krookodile-Cave Dweller", + baseSpecies: "Krookodile", + forme: "Cave Dweller", + types: ["Fire", "Rock"], + baseStats: { hp: 80, atk: 110, def: 75, spa: 85, spd: 80, spe: 120 }, + abilities: { 0: "Magic Guard", 1: "Wonder Skin", H: "Sturdy" }, + heightm: 1.5, + weightkg: 96.3, + color: "Red", + prevo: '', + eggGroups: ["Field"], + }, + krookodilecliffside: { + num: 553, + name: "Krookodile-Cliffside", + baseSpecies: "Krookodile", + forme: "Cliffside", + types: ["Dragon", "Dark"], + baseStats: { hp: 90, atk: 70, def: 85, spa: 115, spd: 80, spe: 110 }, + abilities: { 0: "Intimidate", 1: "Merciless", H: "Mold Breaker" }, + heightm: 1.5, + weightkg: 96.3, + color: "Red", + prevo: '', + eggGroups: ["Field"], + }, + krookodilequantum: { + num: 553, + name: "Krookodile-Quantum", + baseSpecies: "Krookodile", + forme: "Quantum", + types: ["Electric", "Rock"], + baseStats: { hp: 95, atk: 100, def: 85, spa: 85, spd: 85, spe: 100 }, + abilities: { 0: "Rock Head", 1: "Prankster", H: "Sturdy" }, + heightm: 1.5, + weightkg: 96.3, + color: "Red", + prevo: '', + eggGroups: ["Field"], + }, + ogerpon: { + inherit: true, + otherFormes: ["Ogerpon-Muerta", "Ogerpon-Easter", "Ogerpon-Ankh", "Ogerpon-Eid", "Ogerpon-Vessel", "Ogerpon-Kitsune"], + formeOrder: ["Ogerpon", "Ogerpon-Muerta", "Ogerpon-Easter", "Ogerpon-Ankh", "Ogerpon-Eid", "Ogerpon-Vessel", "Ogerpon-Kitsune"], + }, + ogerponmuerta: { + num: 1017, + name: "Ogerpon-Muerta", + baseSpecies: "Ogerpon", + forme: "Muerta", + types: ["Fairy", "Ghost"], + gender: "F", + baseStats: { hp: 90, atk: 120, def: 70, spa: 100, spd: 90, spe: 130 }, + abilities: { 0: "Wandering Spirit" }, + heightm: 1.2, + weightkg: 39.8, + color: "Green", + eggGroups: ["Undiscovered"], + }, + ogerponeaster: { + num: 1017, + name: "Ogerpon-Easter", + baseSpecies: "Ogerpon", + forme: "Easter", + types: ["Fairy", "Normal"], + gender: "F", + baseStats: { hp: 105, atk: 95, def: 95, spa: 110, spd: 80, spe: 115 }, + abilities: { 0: "Pickpocket" }, + heightm: 1.2, + weightkg: 39.8, + color: "Green", + eggGroups: ["Undiscovered"], + }, + ogerponankh: { + num: 1017, + name: "Ogerpon-Ankh", + baseSpecies: "Ogerpon", + forme: "Ankh", + types: ["Ghost"], + gender: "F", + baseStats: { hp: 85, atk: 130, def: 70, spa: 130, spd: 90, spe: 95 }, + abilities: { 0: "Mummy", H: "Good as Gold" }, + heightm: 1.2, + weightkg: 39.8, + color: "Green", + eggGroups: ["Undiscovered"], + }, + ogerponeid: { + num: 1017, + name: "Ogerpon-Eid", + baseSpecies: "Ogerpon", + forme: "Eid", + types: ["Water", "Ghost"], + gender: "F", + baseStats: { hp: 95, atk: 98, def: 100, spa: 105, spd: 110, spe: 92 }, + abilities: { 0: "Tangling Hair" }, + heightm: 1.2, + weightkg: 39.8, + color: "Green", + eggGroups: ["Undiscovered"], + }, + ogerponvessel: { + num: 1017, + name: "Ogerpon-Vessel", + baseSpecies: "Ogerpon", + forme: "Vessel", + types: ["Bug", "Fighting"], + gender: "F", + baseStats: { hp: 95, atk: 115, def: 80, spa: 80, spd: 80, spe: 150 }, + abilities: { 0: "Trace" }, + heightm: 1.2, + weightkg: 39.8, + color: "Green", + eggGroups: ["Undiscovered"], + }, + ogerponkitsune: { + num: 1017, + name: "Ogerpon-Kitsune", + baseSpecies: "Ogerpon", + forme: "Kitsune", + types: ["Fairy"], + gender: "F", + baseStats: { hp: 100, atk: 100, def: 100, spa: 100, spd: 100, spe: 100 }, + abilities: { 0: "Protean" }, + heightm: 1.2, + weightkg: 39.8, + color: "Green", + eggGroups: ["Undiscovered"], + }, +}; diff --git a/data/mods/sixbysix/rulesets.ts b/data/mods/sixbysix/rulesets.ts new file mode 100644 index 0000000000..6b2be5e210 --- /dev/null +++ b/data/mods/sixbysix/rulesets.ts @@ -0,0 +1,17 @@ +export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable = { + spriteviewer: { + effectType: 'ValidatorRule', + name: 'Sprite Viewer', + desc: "Displays a fakemon's sprite in chat when it is switched in for the first time", + onBegin() { + this.add('rule', 'Sprite Viewer: Displays sprites in chat'); + }, + onSwitchIn(pokemon) { + if (!this.effectState[pokemon.species.id]) { + this.add('-message', `${pokemon.species.name}'s Sprite:`); + this.add(`raw|`); + this.effectState[pokemon.species.id] = true; + } + }, + }, +}; diff --git a/data/mods/scootopiav2/scripts.ts b/data/mods/sixbysix/scripts.ts similarity index 95% rename from data/mods/scootopiav2/scripts.ts rename to data/mods/sixbysix/scripts.ts index 49611260ed..4346dd0db2 100644 --- a/data/mods/scootopiav2/scripts.ts +++ b/data/mods/sixbysix/scripts.ts @@ -1,3 +1,3 @@ -export const Scripts: ModdedBattleScriptsData = { - gen: 9, -}; +export const Scripts: ModdedBattleScriptsData = { + gen: 9, +}; diff --git a/data/moves.ts b/data/moves.ts index 75b8e29dce..8004f48dfb 100644 --- a/data/moves.ts +++ b/data/moves.ts @@ -3480,7 +3480,7 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { flags: { protect: 1, reflectable: 1, mirror: 1, metronome: 1, nosketch: 1 }, status: 'slp', onTry(source, target, move) { - if (source.species.name === 'Darkrai' || move.hasBounced) { + if (source.species.baseSpecies === 'Darkrai' || move.hasBounced) { return; } this.add('-fail', source, 'move: Dark Void'); @@ -14914,10 +14914,9 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, beforeTurnCallback(pokemon) { - for (const side of this.sides) { - if (side.hasAlly(pokemon)) continue; - side.addSideCondition('pursuit', pokemon); - const data = side.getSideConditionData('pursuit'); + for (const target of pokemon.foes()) { + target.addVolatile('pursuit'); + const data = target.volatiles['pursuit']; if (!data.sources) { data.sources = []; } @@ -14927,9 +14926,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { onModifyMove(move, source, target) { if (target?.beingCalledBack || target?.switchFlag) move.accuracy = true; }, - onTryHit(target, pokemon) { - target.side.removeSideCondition('pursuit'); - }, condition: { duration: 1, onBeforeSwitchOut(pokemon) { @@ -17213,35 +17209,8 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: 0, flags: { protect: 1, mirror: 1, bypasssub: 1, allyanim: 1, metronome: 1 }, - onTryHit(target, source) { - const targetAbility = target.getAbility(); - const sourceAbility = source.getAbility(); - if (sourceAbility.flags['failskillswap'] || targetAbility.flags['failskillswap'] || target.volatiles['dynamax']) { - return false; - } - const sourceCanBeSet = this.runEvent('SetAbility', source, source, this.effect, targetAbility); - if (!sourceCanBeSet) return sourceCanBeSet; - const targetCanBeSet = this.runEvent('SetAbility', target, source, this.effect, sourceAbility); - if (!targetCanBeSet) return targetCanBeSet; - }, onHit(target, source, move) { - const targetAbility = target.getAbility(); - const sourceAbility = source.getAbility(); - if (target.isAlly(source)) { - this.add('-activate', source, 'move: Skill Swap', '', '', `[of] ${target}`); - } else { - this.add('-activate', source, 'move: Skill Swap', targetAbility, sourceAbility, `[of] ${target}`); - } - this.singleEvent('End', sourceAbility, source.abilityState, source); - this.singleEvent('End', targetAbility, target.abilityState, target); - source.ability = targetAbility.id; - target.ability = sourceAbility.id; - source.abilityState = this.initEffectState({ id: this.toID(source.ability), target: source }); - target.abilityState = this.initEffectState({ id: this.toID(target.ability), target }); - source.volatileStaleness = undefined; - if (!target.isAlly(source)) target.volatileStaleness = 'external'; - this.singleEvent('Start', targetAbility, source.abilityState, source); - this.singleEvent('Start', sourceAbility, target.abilityState, target); + return this.skillSwap(source, target); }, secondary: null, target: "normal", diff --git a/data/random-battles/chatbats/random-sets.json b/data/random-battles/chatbats/random-sets.json index 8bddf6d58c..615908c2c4 100644 --- a/data/random-battles/chatbats/random-sets.json +++ b/data/random-battles/chatbats/random-sets.json @@ -926,7 +926,7 @@ ] }, "swanna": { - "level": 84, + "level": 82, "sets": [ { "role": "Fast Attacker", @@ -937,7 +937,7 @@ ] }, "typhlosionmega": { - "level": 84, + "level": 82, "sets": [ { "role": "Fast Attacker", @@ -954,7 +954,7 @@ ] }, "terapagos": { - "level": 84, + "level": 82, "sets": [ { "role": "Bulky Setup", @@ -982,7 +982,7 @@ ] }, "genesectburn": { - "level": 84, + "level": 82, "sets": [ { "role": "Wallbreaker", @@ -1004,7 +1004,7 @@ ] }, "genesectdouse": { - "level": 84, + "level": 82, "sets": [ { "role": "Wallbreaker", @@ -1015,7 +1015,7 @@ ] }, "genesectshock": { - "level": 84, + "level": 80, "sets": [ { "role": "Wallbreaker", @@ -1162,5 +1162,27 @@ "teraTypes": ["Grass"] } ] + }, + "wobbuffet": { + "level": 84, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Counter", "Mirror Coat", "Shed Tail", "Encore", "Guillotine", "Night Shade"], + "abilities": ["Jello Body"], + "teraTypes": ["Dark", "Steel"] + } + ] + }, + "raticatemega": { + "level": 84, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Super Fang", "Hyper Fang", "Last Breakfast", "U-turn"], + "abilities": ["Hustle"], + "teraTypes": ["Normal"] + } + ] } } diff --git a/data/random-battles/chatbats/teams.ts b/data/random-battles/chatbats/teams.ts index 162d21c248..fa7f264372 100644 --- a/data/random-battles/chatbats/teams.ts +++ b/data/random-battles/chatbats/teams.ts @@ -236,6 +236,8 @@ export class RandomChatBatsTeams extends RandomTeams { if (species.id === 'feraligatrmega') this.incompatibleMoves(moves, movePool, 'thunderfang', 'poisonfang'); if (species.id === 'salazzle') this.incompatibleMoves(moves, movePool, 'malignantchain', 'venoshock'); if (species.id === 'glimmora') this.incompatibleMoves(moves, movePool, 'powergem', 'meteorbeam'); + if (species.id === 'wobbuffet') this.incompatibleMoves(moves, movePool, 'shedtail', 'encore'); + if (species.id === 'wobbuffet') this.incompatibleMoves(moves, movePool, 'nightshade', 'guillotine'); } override randomMoveset( @@ -724,6 +726,7 @@ export class RandomChatBatsTeams extends RandomTeams { if (species.id === 'ogerponcornerstone') return 'Cornerstone Mask'; if (species.id === 'glimmora' && moves.has('meteorbeam')) return 'Power Herb'; if (species.id === 'glimmora') return 'Air Balloon'; + if (species.id === 'wobbuffet') return 'Covert Cloak'; } override randomSet( @@ -897,7 +900,7 @@ export class RandomChatBatsTeams extends RandomTeams { let leadsRemaining = this.format.gameType === 'doubles' ? 2 : 1; while (baseSpeciesPool.length && pokemon.length < this.maxTeamSize) { const baseSpecies = this.sampleNoReplace(baseSpeciesPool); - if (hasMega && (baseSpecies === "Typhlosion" || baseSpecies === "Altaria")) continue; + if (hasMega && (baseSpecies === "Typhlosion" || baseSpecies === "Altaria" || baseSpecies === "Raticate")) continue; const currentSpeciesPool: Species[] = []; // Check if the base species has a mega forme available // let canMega = false; @@ -1008,7 +1011,7 @@ export class RandomChatBatsTeams extends RandomTeams { // if (potd?.exists && (pokemon.length === 1 || this.maxTeamSize === 1)) species = potd; // testing code - // if (pokemon.length === 0 || this.maxTeamSize === 1) species = this.dex.species.get('Feraligatr-Mega'); + // if (pokemon.length === 0 || this.maxTeamSize === 1) species = this.dex.species.get('Raticate-Mega'); let set: RandomTeamsTypes.RandomSet; diff --git a/data/random-battles/gen1/data.json b/data/random-battles/gen1/data.json index 7c3ff071dd..f6ebda9799 100644 --- a/data/random-battles/gen1/data.json +++ b/data/random-battles/gen1/data.json @@ -574,7 +574,8 @@ }, "mrmime": { "level": 75, - "moves": ["psychic", "seismictoss", "thunderbolt", "thunderwave"] + "moves": ["psychic", "thunderbolt", "thunderwave"], + "exclusiveMoves": ["counter", "seismictoss", "seismictoss"] }, "scyther": { "level": 75, @@ -608,7 +609,8 @@ }, "gyarados": { "level": 74, - "moves": ["blizzard", "bodyslam", "bodyslam", "hyperbeam", "thunderbolt"], + "moves": ["blizzard", "hyperbeam", "thunderbolt"], + "essentialMoves": ["bodyslam"], "exclusiveMoves": ["hydropump", "surf", "surf"] }, "lapras": { @@ -658,8 +660,7 @@ }, "kabuto": { "level": 88, - "moves": ["blizzard", "bodyslam", "slash"], - "exclusiveMoves": ["hydropump", "surf", "surf"] + "moves": ["blizzard", "bodyslam", "slash", "surf"] }, "kabutops": { "level": 75, @@ -704,8 +705,8 @@ }, "dragonite": { "level": 74, - "moves": ["bodyslam", "hyperbeam", "thunderbolt", "thunderwave", "thunderwave"], - "essentialMoves": ["blizzard"] + "moves": ["bodyslam", "hyperbeam", "thunderbolt"], + "essentialMoves": ["blizzard", "thunderwave"] }, "mewtwo": { "level": 60, diff --git a/data/random-battles/gen3/sets.json b/data/random-battles/gen3/sets.json index 7dd8706e39..4549e95064 100644 --- a/data/random-battles/gen3/sets.json +++ b/data/random-battles/gen3/sets.json @@ -387,7 +387,7 @@ "sets": [ { "role": "Setup Sweeper", - "movepool": ["calmmind", "encore", "firepunch", "icepunch", "psychic", "recover", "substitute", "thunderpunch"], + "movepool": ["calmmind", "encore", "firepunch", "hiddenpowerdark", "psychic", "recover", "substitute", "thunderpunch"], "abilities": ["Synchronize"], "preferredTypes": ["Fire"] } @@ -474,7 +474,7 @@ }, { "role": "Setup Sweeper", - "movepool": ["calmmind", "psychic", "rest", "surf"], + "movepool": ["calmmind", "psychic", "surf", "thunderwave"], "abilities": ["Own Tempo"] }, { @@ -544,13 +544,13 @@ "sets": [ { "role": "Wallbreaker", - "movepool": ["explosion", "fireblast", "hiddenpowerground", "rest", "sludgebomb", "toxic"], + "movepool": ["explosion", "fireblast", "hiddenpowerground", "sludgebomb", "toxic"], "abilities": ["Sticky Hold"], "preferredTypes": ["Ground"] }, { "role": "Setup Sweeper", - "movepool": ["curse", "hiddenpowerground", "rest", "sludgebomb"], + "movepool": ["curse", "explosion", "hiddenpowerground", "sludgebomb"], "abilities": ["Sticky Hold"] } ] @@ -1063,7 +1063,7 @@ "sets": [ { "role": "Setup Sweeper", - "movepool": ["doubleedge", "dragondance", "earthquake", "healbell", "hiddenpowerflying", "rest", "substitute"], + "movepool": ["doubleedge", "dragondance", "earthquake", "healbell", "hiddenpowerflying", "substitute"], "abilities": ["Inner Focus"], "preferredTypes": ["Ground"] }, @@ -1479,7 +1479,7 @@ }, { "role": "Setup Sweeper", - "movepool": ["calmmind", "psychic", "rest", "surf"], + "movepool": ["calmmind", "psychic", "surf", "thunderwave"], "abilities": ["Own Tempo"] }, { @@ -1564,7 +1564,7 @@ "sets": [ { "role": "Bulky Setup", - "movepool": ["bodyslam", "curse", "earthquake", "rest", "shadowball"], + "movepool": ["bodyslam", "curse", "earthquake", "rest", "shadowball", "sleeptalk"], "abilities": ["Serene Grace"] }, { @@ -2482,11 +2482,6 @@ "role": "Bulky Support", "movepool": ["encore", "moonlight", "seismictoss", "thunderwave", "toxic"], "abilities": ["Oblivious"] - }, - { - "role": "Generalist", - "movepool": ["batonpass", "encore", "seismictoss", "substitute", "thunderwave", "toxic"], - "abilities": ["Oblivious"] } ] }, @@ -2561,7 +2556,7 @@ "sets": [ { "role": "Bulky Attacker", - "movepool": ["explosion", "fireblast", "flamethrower", "hiddenpowergrass", "rest", "toxic"], + "movepool": ["explosion", "fireblast", "flamethrower", "hiddenpowergrass", "toxic"], "abilities": ["White Smoke"] } ] @@ -2571,7 +2566,7 @@ "sets": [ { "role": "Setup Sweeper", - "movepool": ["calmmind", "firepunch", "psychic", "substitute", "thunderpunch"], + "movepool": ["calmmind", "firepunch", "hiddenpowerdark", "psychic", "substitute"], "abilities": ["Thick Fat"], "preferredTypes": ["Fire"] } @@ -2602,11 +2597,11 @@ }, { "role": "Staller", - "movepool": ["dragonclaw", "earthquake", "fireblast", "protect", "toxic"], + "movepool": ["dragonclaw", "earthquake", "fireblast", "protect", "rockslide", "toxic"], "abilities": ["Levitate"] }, { - "role": "Bulky Attacker", + "role": "Staller", "movepool": ["dragonclaw", "earthquake", "fireblast", "rockslide", "substitute", "toxic"], "abilities": ["Levitate"] } @@ -3053,7 +3048,12 @@ "sets": [ { "role": "Wallbreaker", - "movepool": ["earthquake", "hiddenpowerbug", "overheat", "rockslide", "substitute", "swordsdance", "thunderwave"], + "movepool": ["earthquake", "overheat", "rockslide", "thunderwave"], + "abilities": ["Drought"] + }, + { + "role": "Setup Sweeper", + "movepool": ["earthquake", "hiddenpowerbug", "rockslide", "substitute", "swordsdance", "thunderwave"], "abilities": ["Drought"], "preferredTypes": ["Rock"] } @@ -3086,9 +3086,8 @@ }, { "role": "Setup Sweeper", - "movepool": ["calmmind", "firepunch", "icepunch", "psychic", "substitute", "thunderbolt"], - "abilities": ["Serene Grace"], - "preferredTypes": ["Fire"] + "movepool": ["calmmind", "firepunch", "icepunch", "psychic", "thunderbolt"], + "abilities": ["Serene Grace"] } ] }, @@ -3097,7 +3096,7 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["extremespeed", "firepunch", "icebeam", "psychoboost", "shadowball", "superpower"], + "movepool": ["extremespeed", "icebeam", "psychoboost", "shadowball", "superpower"], "abilities": ["Pressure"], "preferredTypes": ["Fighting", "Ghost"] } @@ -3108,7 +3107,7 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["extremespeed", "firepunch", "icebeam", "psychoboost", "shadowball", "superpower"], + "movepool": ["extremespeed", "icebeam", "psychoboost", "shadowball", "superpower"], "abilities": ["Pressure"], "preferredTypes": ["Fighting", "Ghost"] } diff --git a/data/random-battles/gen3/teams.ts b/data/random-battles/gen3/teams.ts index ff59db9377..6c229c924b 100644 --- a/data/random-battles/gen3/teams.ts +++ b/data/random-battles/gen3/teams.ts @@ -467,16 +467,10 @@ export class RandomGen3Teams extends RandomGen4Teams { if (species.id === 'marowak') return 'Thick Club'; if (species.id === 'pikachu') return 'Light Ball'; if (species.id === 'shedinja') return 'Lum Berry'; - if (species.id === 'shuckle') return 'Leftovers'; if (species.id === 'unown') return counter.get('Physical') ? 'Choice Band' : 'Twisted Spoon'; if (species.id === 'deoxys' || species.id === 'deoxysattack') return 'White Herb'; if (moves.has('trick')) return 'Choice Band'; - if ( - moves.has('rest') && !moves.has('sleeptalk') && - // Altaria wants Chesto Berry on Dragon Dance + Rest - (moves.has('dragondance') || !['Early Bird', 'Natural Cure', 'Shed Skin'].includes(ability)) - ) return 'Chesto Berry'; // Medium priority items if (counter.get('Physical') >= 4) return 'Choice Band'; diff --git a/data/random-battles/gen4/sets.json b/data/random-battles/gen4/sets.json index 672865b259..c9a7112bb5 100644 --- a/data/random-battles/gen4/sets.json +++ b/data/random-battles/gen4/sets.json @@ -1325,7 +1325,7 @@ "sets": [ { "role": "Fast Support", - "movepool": ["destinybond", "explosion", "spikes", "thunderwave", "toxicspikes", "waterfall"], + "movepool": ["destinybond", "explosion", "poisonjab", "spikes", "thunderwave", "toxicspikes", "waterfall"], "abilities": ["Poison Point", "Swift Swim"] } ] @@ -2123,9 +2123,14 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["hiddenpowergrass", "hydropump", "icebeam", "selfdestruct", "waterspout"], + "movepool": ["hydropump", "icebeam", "selfdestruct", "waterspout"], "abilities": ["Water Veil"], "preferredTypes": ["Ice"] + }, + { + "role": "Bulky Attacker", + "movepool": ["icebeam", "selfdestruct", "surf", "toxic"], + "abilities": ["Water Veil"] } ] }, @@ -3022,9 +3027,14 @@ "movepool": ["destinybond", "hiddenpowerfighting", "painsplit", "shadowball", "substitute", "taunt", "willowisp"], "abilities": ["Levitate"] }, + { + "role": "Setup Sweeper", + "movepool": ["hiddenpowerfighting", "nastyplot", "shadowball", "substitute", "thunderbolt"], + "abilities": ["Levitate"] + }, { "role": "Wallbreaker", - "movepool": ["hiddenpowerfighting", "nastyplot", "shadowball", "thunderbolt", "trick"], + "movepool": ["hiddenpowerfighting", "shadowball", "thunderbolt", "trick"], "abilities": ["Levitate"] } ] diff --git a/data/random-battles/gen5/sets.json b/data/random-battles/gen5/sets.json index 23a754ef97..acee027540 100644 --- a/data/random-battles/gen5/sets.json +++ b/data/random-battles/gen5/sets.json @@ -3065,9 +3065,14 @@ "abilities": ["Levitate"] }, { - "role": "Wallbreaker", - "movepool": ["hiddenpowerfighting", "nastyplot", "shadowball", "thunderbolt", "trick"], + "role": "Setup Sweeper", + "movepool": ["hiddenpowerfighting", "nastyplot", "shadowball", "substitute", "thunderbolt"], "abilities": ["Levitate"] + }, + { + "role": "Wallbreaker", + "movepool": ["hiddenpowerfighting", "shadowball", "thunderbolt", "trick"], + "abilities": ["Levitate"] } ] }, @@ -3274,7 +3279,7 @@ { "role": "Fast Attacker", "movepool": ["flashcannon", "hiddenpowerfire", "hiddenpowerground", "hiddenpowerice", "thunderbolt", "voltswitch"], - "abilities": ["Magnet Pull"] + "abilities": ["Analytic", "Magnet Pull"] }, { "role": "Staller", @@ -4574,7 +4579,7 @@ }, { "role": "Wallbreaker", - "movepool": ["bugbuzz", "energyball", "thunder", "voltswitch"], + "movepool": ["bugbuzz", "gigadrain", "thunder", "voltswitch"], "abilities": ["Compound Eyes"] } ] diff --git a/data/random-battles/gen6/sets.json b/data/random-battles/gen6/sets.json index 479d44bed4..d50f9c1849 100644 --- a/data/random-battles/gen6/sets.json +++ b/data/random-battles/gen6/sets.json @@ -31,6 +31,11 @@ "role": "Bulky Attacker", "movepool": ["airslash", "earthquake", "fireblast", "roost", "willowisp"], "abilities": ["Blaze", "Solar Power"] + }, + { + "role": "Setup Sweeper", + "movepool": ["acrobatics", "earthquake", "flareblitz", "swordsdance"], + "abilities": ["Blaze"] } ] }, @@ -791,9 +796,14 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["dazzlinggleam", "encore", "focusblast", "healingwish", "nastyplot", "psychic", "psyshock", "shadowball"], + "movepool": ["dazzlinggleam", "encore", "focusblast", "healingwish", "psychic", "psyshock", "shadowball", "thunderbolt"], "abilities": ["Filter"], - "preferredTypes": ["Psychic"] + "preferredTypes": ["Fighting"] + }, + { + "role": "Setup Sweeper", + "movepool": ["dazzlinggleam", "encore", "focusblast", "nastyplot", "psychic", "psyshock"], + "abilities": ["Filter"] } ] }, @@ -1500,7 +1510,7 @@ "sets": [ { "role": "Fast Support", - "movepool": ["destinybond", "spikes", "taunt", "thunderwave", "toxicspikes", "waterfall"], + "movepool": ["destinybond", "poisonjab", "spikes", "taunt", "thunderwave", "toxicspikes", "waterfall"], "abilities": ["Intimidate"] } ] @@ -1617,12 +1627,14 @@ { "role": "Wallbreaker", "movepool": ["energyball", "fireblast", "gunkshot", "hydropump", "icebeam", "scald"], - "abilities": ["Sniper"] + "abilities": ["Sniper"], + "preferredTypes": ["Poison"] }, { "role": "Bulky Attacker", "movepool": ["energyball", "fireblast", "gunkshot", "icebeam", "scald", "thunderwave"], - "abilities": ["Sniper"] + "abilities": ["Sniper"], + "preferredTypes": ["Poison"] } ] }, @@ -2263,8 +2275,13 @@ "level": 86, "sets": [ { - "role": "Wallbreaker", - "movepool": ["aquatail", "earthquake", "headsmash", "heavyslam", "rockpolish", "stealthrock"], + "role": "Setup Sweeper", + "movepool": ["earthquake", "headsmash", "heavyslam", "rockpolish"], + "abilities": ["Rock Head"] + }, + { + "role": "Bulky Attacker", + "movepool": ["aquatail", "earthquake", "headsmash", "heavyslam", "stealthrock"], "abilities": ["Rock Head"], "preferredTypes": ["Ground"] } @@ -3273,12 +3290,7 @@ "sets": [ { "role": "Bulky Support", - "movepool": ["metalburst", "roar", "rockblast", "stealthrock", "toxic"], - "abilities": ["Sturdy"] - }, - { - "role": "Staller", - "movepool": ["metalburst", "protect", "roar", "rockblast", "stealthrock", "toxic"], + "movepool": ["metalburst", "protect", "roar", "rockslide", "stealthrock", "toxic"], "abilities": ["Sturdy"] } ] @@ -3689,7 +3701,7 @@ { "role": "Fast Attacker", "movepool": ["flashcannon", "hiddenpowerground", "thunderbolt", "voltswitch"], - "abilities": ["Magnet Pull"] + "abilities": ["Analytic", "Magnet Pull"] }, { "role": "Staller", @@ -5893,11 +5905,6 @@ "sylveon": { "level": 84, "sets": [ - { - "role": "Bulky Attacker", - "movepool": ["calmmind", "hiddenpowerground", "hypervoice", "protect", "psyshock", "wish"], - "abilities": ["Pixilate"] - }, { "role": "Bulky Setup", "movepool": ["calmmind", "hypervoice", "protect", "wish"], diff --git a/data/random-battles/gen6/teams.ts b/data/random-battles/gen6/teams.ts index 4e7c261f93..40bbbc656a 100644 --- a/data/random-battles/gen6/teams.ts +++ b/data/random-battles/gen6/teams.ts @@ -97,7 +97,7 @@ export class RandomGen6Teams extends RandomGen7Teams { Normal: movePool => movePool.includes('boomburst'), Poison: (movePool, moves, abilities, types, counter) => !counter.get('Poison'), Psychic: (movePool, moves, abilities, types, counter) => ( - !counter.get('Psychic') && (types.has('Fighting') || movePool.includes('calmmind')) + !counter.get('Psychic') && (types.has('Fighting') || types.has('Fairy') || movePool.includes('calmmind')) ), Rock: (movePool, moves, abilities, types, counter, species) => (!counter.get('Rock') && species.baseStats.atk >= 80), Steel: (movePool, moves, abilities, types, counter, species) => (!counter.get('Steel') && species.baseStats.atk >= 100), @@ -250,6 +250,8 @@ export class RandomGen6Teams extends RandomGen7Teams { ['switcheroo', 'suckerpunch'], // Jirachi ['bodyslam', 'healingwish'], + // Bastiodon + [['roar', 'protect'], ['metalburst', 'protect']], ]; for (const pair of incompatiblePairs) this.incompatibleMoves(moves, movePool, pair[0], pair[1]); @@ -732,12 +734,6 @@ export class RandomGen6Teams extends RandomGen7Teams { ) ) return 'Rocky Helmet'; if (['kingsshield', 'protect', 'spikyshield', 'substitute'].some(m => moves.has(m))) return 'Leftovers'; - if ( - this.dex.getEffectiveness('Ground', species) >= 2 && - ability !== 'Levitate' - ) { - return 'Air Balloon'; - } if ( (role === 'Fast Support' || moves.has('stickyweb')) && isLead && defensiveStatTotal < 255 && !counter.get('recovery') && (counter.get('hazards') || counter.get('setup')) && diff --git a/data/random-battles/gen7/sets.json b/data/random-battles/gen7/sets.json index df1a2c853e..5654350ef9 100644 --- a/data/random-battles/gen7/sets.json +++ b/data/random-battles/gen7/sets.json @@ -33,6 +33,11 @@ "abilities": ["Blaze", "Solar Power"], "preferredTypes": ["Normal"] }, + { + "role": "Setup Sweeper", + "movepool": ["acrobatics", "earthquake", "flareblitz", "swordsdance"], + "abilities": ["Blaze"] + }, { "role": "Bulky Attacker", "movepool": ["airslash", "earthquake", "fireblast", "roost", "willowisp"], @@ -975,9 +980,14 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["dazzlinggleam", "encore", "focusblast", "healingwish", "nastyplot", "psychic", "psyshock", "shadowball"], + "movepool": ["dazzlinggleam", "encore", "focusblast", "healingwish", "psychic", "psyshock", "shadowball", "thunderbolt"], "abilities": ["Filter"], - "preferredTypes": ["Psychic"] + "preferredTypes": ["Fighting"] + }, + { + "role": "Setup Sweeper", + "movepool": ["dazzlinggleam", "encore", "focusblast", "nastyplot", "psychic", "psyshock"], + "abilities": ["Filter"] } ] }, @@ -1716,7 +1726,7 @@ "sets": [ { "role": "Fast Support", - "movepool": ["destinybond", "spikes", "taunt", "thunderwave", "toxicspikes", "waterfall"], + "movepool": ["destinybond", "poisonjab", "spikes", "taunt", "thunderwave", "toxicspikes", "waterfall"], "abilities": ["Intimidate"] } ] @@ -1770,10 +1780,15 @@ "level": 82, "sets": [ { - "role": "Wallbreaker", + "role": "Setup Sweeper", "movepool": ["closecombat", "facade", "knockoff", "swordsdance"], "abilities": ["Guts"] }, + { + "role": "Wallbreaker", + "movepool": ["closecombat", "facade", "knockoff", "megahorn"], + "abilities": ["Guts"] + }, { "role": "Fast Attacker", "movepool": ["closecombat", "knockoff", "megahorn", "stoneedge"], @@ -2493,8 +2508,13 @@ "level": 87, "sets": [ { - "role": "Wallbreaker", - "movepool": ["aquatail", "earthquake", "headsmash", "heavyslam", "rockpolish", "stealthrock"], + "role": "Setup Sweeper", + "movepool": ["earthquake", "headsmash", "heavyslam", "rockpolish"], + "abilities": ["Rock Head"] + }, + { + "role": "Bulky Attacker", + "movepool": ["aquatail", "earthquake", "headsmash", "heavyslam", "stealthrock"], "abilities": ["Rock Head"], "preferredTypes": ["Ground"] } @@ -3557,12 +3577,7 @@ "sets": [ { "role": "Bulky Support", - "movepool": ["metalburst", "roar", "rockblast", "stealthrock", "toxic"], - "abilities": ["Sturdy"] - }, - { - "role": "Staller", - "movepool": ["metalburst", "protect", "roar", "rockblast", "stealthrock", "toxic"], + "movepool": ["metalburst", "protect", "roar", "rockslide", "stealthrock", "toxic"], "abilities": ["Sturdy"] } ] @@ -4003,7 +4018,7 @@ { "role": "Fast Attacker", "movepool": ["flashcannon", "hiddenpowerground", "thunderbolt", "voltswitch"], - "abilities": ["Magnet Pull"] + "abilities": ["Analytic", "Magnet Pull"] }, { "role": "Staller", @@ -6363,11 +6378,6 @@ "sylveon": { "level": 85, "sets": [ - { - "role": "Bulky Attacker", - "movepool": ["calmmind", "hiddenpowerground", "hypervoice", "protect", "psyshock", "wish"], - "abilities": ["Pixilate"] - }, { "role": "Bulky Setup", "movepool": ["calmmind", "hypervoice", "protect", "wish"], @@ -6833,7 +6843,7 @@ "sets": [ { "role": "AV Pivot", - "movepool": ["earthquake", "hiddenpowergrass", "hydropump", "icebeam", "scald", "uturn"], + "movepool": ["earthquake", "hydropump", "icebeam", "scald", "uturn"], "abilities": ["Schooling"], "preferredTypes": ["Ice"] }, @@ -7420,7 +7430,12 @@ "sets": [ { "role": "Bulky Attacker", - "movepool": ["bulkup", "hornleech", "megahorn", "stoneedge", "superpower", "woodhammer"], + "movepool": ["hornleech", "megahorn", "stoneedge", "superpower", "woodhammer"], + "abilities": ["Grassy Surge"] + }, + { + "role": "Bulky Setup", + "movepool": ["hornleech", "stoneedge", "superpower", "swordsdance", "woodhammer"], "abilities": ["Grassy Surge"] } ] @@ -7468,7 +7483,7 @@ }, { "role": "Z-Move user", - "movepool": ["calmmind", "moonblast", "moongeistbeam", "psyshock", "roost"], + "movepool": ["calmmind", "moongeistbeam", "psyshock", "roost"], "abilities": ["Shadow Shield"] } ] @@ -7477,7 +7492,7 @@ "level": 79, "sets": [ { - "role": "Fast Support", + "role": "Bulky Attacker", "movepool": ["grassknot", "hiddenpowerfire", "hiddenpowerground", "powergem", "sludgewave", "stealthrock", "thunderbolt", "toxicspikes"], "abilities": ["Beast Boost"], "preferredTypes": ["Rock"] diff --git a/data/random-battles/gen7/teams.ts b/data/random-battles/gen7/teams.ts index 1f427d5304..553e7e4469 100644 --- a/data/random-battles/gen7/teams.ts +++ b/data/random-battles/gen7/teams.ts @@ -135,7 +135,7 @@ export class RandomGen7Teams extends RandomGen8Teams { Poison: (movePool, moves, abilities, types, counter) => !counter.get('Poison'), Psychic: (movePool, moves, abilities, types, counter) => ( !counter.get('Psychic') && ( - types.has('Fighting') || movePool.includes('psychicfangs') || movePool.includes('calmmind') + types.has('Fighting') || types.has('Fairy') || movePool.includes('psychicfangs') || movePool.includes('calmmind') ) ), Rock: (movePool, moves, abilities, types, counter, species) => (!counter.get('Rock') && species.baseStats.atk >= 80), @@ -367,6 +367,8 @@ export class RandomGen7Teams extends RandomGen8Teams { ['switcheroo', 'suckerpunch'], // Jirachi ['bodyslam', 'healingwish'], + // Bastiodon + [['roar', 'protect'], ['metalburst', 'protect']], ]; for (const pair of incompatiblePairs) this.incompatibleMoves(moves, movePool, pair[0], pair[1]); @@ -955,12 +957,6 @@ export class RandomGen7Teams extends RandomGen8Teams { ) ) return 'Rocky Helmet'; if (['kingsshield', 'protect', 'spikyshield', 'substitute'].some(m => moves.has(m))) return 'Leftovers'; - if ( - this.dex.getEffectiveness('Ground', species) >= 2 && - ability !== 'Levitate' && species.id !== 'golemalola' - ) { - return 'Air Balloon'; - } if ( (role === 'Fast Support' || moves.has('stickyweb')) && isLead && defensiveStatTotal < 255 && !counter.get('recovery') && (counter.get('hazards') || counter.get('setup')) && @@ -1607,8 +1603,7 @@ export class RandomGen7Teams extends RandomGen8Teams { if (isMonotype) { // Prevents Mega Evolutions from breaking the type limits if (itemData.megaStone) { - const megaSpecies = this.dex.species.get(Array.isArray(itemData.megaStone) ? - itemData.megaStone[0] : itemData.megaStone); + const megaSpecies = this.dex.species.get(Object.values(itemData.megaStone)[0]); if (types.length > megaSpecies.types.length) types = [species.types[0]]; // Only check the second type because a Mega Evolution should always share the first type with its base forme. if (megaSpecies.types[1] && types[1] && megaSpecies.types[1] !== types[1]) { diff --git a/data/random-battles/gen8/data.json b/data/random-battles/gen8/data.json index d0f0d2514e..61aefbcef3 100644 --- a/data/random-battles/gen8/data.json +++ b/data/random-battles/gen8/data.json @@ -418,7 +418,7 @@ }, "articunogalar": { "level": 81, - "moves": ["airslash", "calmmind", "freezingglare", "recover"], + "moves": ["calmmind", "freezingglare", "hurricane", "recover"], "doublesLevel": 81, "doublesMoves": ["calmmind", "freezingglare", "hurricane", "recover", "tailwind"], "noDynamaxMoves": ["calmmind", "freezingglare", "hurricane", "recover"] @@ -458,7 +458,7 @@ }, "mewtwo": { "level": 71, - "moves": ["fireblast", "nastyplot", "psystrike", "recover", "shadowball"], + "moves": ["aurasphere", "fireblast", "nastyplot", "psystrike", "recover"], "doublesLevel": 74, "doublesMoves": ["aurasphere", "icebeam", "nastyplot", "psystrike", "recover"] }, @@ -1820,7 +1820,7 @@ }, "sylveon": { "level": 83, - "moves": ["calmmind", "hypervoice", "mysticalfire", "protect", "psyshock", "shadowball", "wish"], + "moves": ["calmmind", "hypervoice", "mysticalfire", "protect", "psyshock", "wish"], "doublesLevel": 80, "doublesMoves": ["calmmind", "hypervoice", "mysticalfire", "protect", "psyshock"] }, @@ -2149,7 +2149,7 @@ }, "silvallyice": { "level": 83, - "moves": ["flamecharge", "multiattack", "psychicfangs", "swordsdance"], + "moves": ["flamecharge", "multiattack", "rockslide", "swordsdance"], "doublesLevel": 88, "doublesMoves": ["flamethrower", "multiattack", "partingshot", "tailwind", "thunderbolt"] }, @@ -2161,7 +2161,7 @@ }, "silvallypsychic": { "level": 83, - "moves": ["crunch", "multiattack", "swordsdance", "uturn"], + "moves": ["flamecharge", "multiattack", "swordsdance", "xscissor"], "doublesLevel": 88, "doublesMoves": ["flamethrower", "multiattack", "partingshot", "tailwind", "xscissor"] }, diff --git a/data/random-battles/gen9/1v1-factory-sets.json b/data/random-battles/gen9/1v1-factory-sets.json index ccc9e65beb..301d468169 100644 --- a/data/random-battles/gen9/1v1-factory-sets.json +++ b/data/random-battles/gen9/1v1-factory-sets.json @@ -1,4 +1,752 @@ { + "Hoopa-Unbound": { + "weight": 9, + "sets": [ + { + "species": "Hoopa-Unbound", + "item": "Choice Band", + "ability": "Magician", + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "moves": [["Hyperspace Fury"], ["Gunk Shot"], ["Zen Headbutt"], ["Drain Punch", "Fire Punch"]], + "weight": 35 + }, + { + "species": "Hoopa-Unbound", + "item": "Choice Specs", + "ability": "Magician", + "nature": "Modest", + "evs": {"def": 4, "spa": 252, "spe": 252}, + "moves": [["Psychic"], ["Dark Pulse"], ["Thunderbolt"], ["Grass Knot", "Focus Blast"]], + "weight": 25 + }, + { + "species": "Hoopa-Unbound", + "item": "Assault Vest", + "ability": "Magician", + "nature": "Adamant", + "evs": {"hp": 168, "atk": 252, "def": 68, "spe": 20}, + "moves": [["Hyperspace Fury"], ["Gunk Shot"], ["Psychic Noise"], ["Knock Off"]], + "weight": 20 + }, + { + "species": "Hoopa-Unbound", + "item": "Life Orb", + "ability": "Magician", + "nature": "Lonely", + "evs": {"hp": 240, "def": 76, "spa": 96, "spe": 96}, + "moves": [["Gunk Shot"], ["Psychic"], ["Dark Pulse"], ["Calm Mind"]], + "weight": 20 + } + ] + }, + "Primarina": { + "weight": 9, + "sets": [ + { + "species": "Primarina", + "item": "Life Orb", + "ability": "Torrent", + "nature": "Modest", + "evs": {"def": 136, "spa": 120, "spe": 252}, + "moves": [["Encore"], ["Icy Wind"], ["Moonblast"], ["Hydro Cannon"]], + "weight": 40 + }, + { + "species": "Primarina", + "item": "Weakness Policy", + "ability": "Torrent", + "nature": "Bold", + "evs": {"hp": 88, "def": 244, "spe": 176}, + "moves": [["Hydro Cannon"], ["Draining Kiss", "Moonblast"], ["Calm Mind"], ["Charm"]], + "weight": 30 + }, + { + "species": "Primarina", + "item": "Choice Specs", + "ability": "Liquid Voice", + "nature": "Modest", + "evs": {"hp": 252, "def": 160, "spa": 24, "spd": 72}, + "moves": [["Hydro Cannon"], ["Moonblast"], ["Energy Ball"], ["Uproar"]], + "weight": 30 + } + ] + }, + "Ursaluna": { + "weight": 9, + "sets": [ + { + "species": "Ursaluna", + "item": "Choice Band", + "ability": "Guts", + "nature": "Adamant", + "evs": {"hp": 184, "atk": 228, "spd": 96}, + "moves": [["Headlong Rush"], ["Giga Impact"], ["Gunk Shot"], ["Avalanche", "Ice Punch"]], + "weight": 40 + }, + { + "species": "Ursaluna", + "item": "Flame Orb", + "ability": "Guts", + "nature": "Adamant", + "evs": {"atk": 164, "spd": 92, "spe": 252}, + "moves": [["Facade"], ["Headlong Rush"], ["Swords Dance"], ["Protect"]], + "weight": 40 + }, + { + "species": "Ursaluna", + "item": "Assault Vest", + "ability": "Guts", + "nature": "Adamant", + "evs": {"hp": 184, "atk": 188, "spd": 136}, + "moves": [["Giga Impact"], ["Earthquake"], ["Avalanche", "Counter"], ["Gunk Shot"]], + "weight": 20 + } + ] + }, + "Iron Crown": { + "weight": 8, + "sets": [ + { + "species": "Iron Crown", + "item": "Weakness Policy", + "ability": "Quark Drive", + "nature": "Bold", + "evs": {"hp": 240, "def": 232, "spe": 36}, + "moves": [["Tachyon Cutter"], ["Iron Defense"], ["Calm Mind"], ["Stored Power", "Psyshock"]], + "weight": 25 + }, + { + "species": "Iron Crown", + "item": "Weakness Policy", + "ability": "Quark Drive", + "nature": "Timid", + "evs": {"hp": 252, "spd": 4, "spe": 252}, + "moves": [["Tachyon Cutter"], ["Iron Defense"], ["Calm Mind"], ["Stored Power", "Psyshock", "Psychic Noise"]], + "weight": 25 + }, + { + "species": "Iron Crown", + "item": "Booster Energy", + "ability": "Quark Drive", + "nature": "Modest", + "evs": {"hp": 244, "def": 16, "spa": 196, "spd": 16, "spe": 36}, + "moves": [["Calm Mind"], ["Psychic Noise"], ["Tachyon Cutter"], ["Focus Blast", "Hyper Beam"]], + "weight": 50 + } + ] + }, + "Iron Valiant": { + "weight": 8, + "sets": [ + { + "species": "Iron Valiant", + "item": "Booster Energy", + "ability": "Quark Drive", + "nature": "Timid", + "evs": {"hp": 252, "def": 232, "spe": 24}, + "moves": [["Moonblast"], ["Protect"], ["Encore"], ["Disable"]], + "weight": 40 + }, + { + "species": "Iron Valiant", + "item": "Booster Energy", + "ability": "Quark Drive", + "nature": "Jolly", + "evs": {"hp": 252, "def": 96, "spd": 136, "spe": 24}, + "moves": [["Spirit Break"], ["Protect"], ["Encore"], ["Disable"]], + "weight": 10 + }, + { + "species": "Iron Valiant", + "item": "Booster Energy", + "ability": "Quark Drive", + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "moves": [["Spirit Break"], ["Reversal"], ["Disable"], ["Substitute"]], + "weight": 20 + }, + { + "species": "Iron Valiant", + "item": "Choice Band", + "ability": "Quark Drive", + "nature": "Jolly", + "evs": {"hp": 4, "atk": 220, "spd": 32, "spe": 252}, + "moves": [["Spirit Break"], ["Close Combat"], ["Giga Impact"], ["Trick", "Ice Punch"]], + "weight": 30 + } + ] + }, + "Metagross": { + "weight": 8, + "sets": [ + { + "species": "Metagross", + "item": "Weakness Policy", + "ability": "Clear Body", + "nature": "Impish", + "evs": {"hp": 248, "atk": 100, "def": 116, "spd": 44}, + "moves": [["Heavy Slam"], ["Bullet Punch"], ["Earthquake"], ["Psychic Fangs"]], + "weight": 40 + }, + { + "species": "Metagross", + "item": "Assault Vest", + "ability": "Clear Body", + "nature": "Impish", + "evs": {"hp": 252, "atk": 108, "def": 116, "spd": 32}, + "moves": [["Heavy Slam"], ["Psychic Fangs"], ["Earthquake"], ["Bullet Punch"]], + "weight": 40 + }, + { + "species": "Metagross", + "item": "Air Balloon", + "ability": "Clear Body", + "nature": "Impish", + "evs": {"hp": 248, "atk": 28, "def": 136, "spe": 96}, + "moves": [["Iron Defense"], ["Body Press"], ["Heavy Slam"], ["Bullet Punch"]], + "weight": 20 + } + ] + }, + "Pecharunt": { + "weight": 8, + "sets": [ + { + "species": "Pecharunt", + "item": "Maranga Berry", + "ability": "Poison Puppeteer", + "nature": "Calm", + "evs": {"hp": 248, "def": 4, "spd": 220, "spe": 36}, + "moves": [["Malignant Chain"], ["Curse"], ["Recover"], ["Parting Shot"]], + "weight": 70 + }, + { + "species": "Pecharunt", + "item": "Air Balloon", + "ability": "Poison Puppeteer", + "nature": "Bold", + "evs": {"hp": 248, "def": 224, "spe": 36}, + "moves": [["Malignant Chain"], ["Curse"], ["Parting Shot"], ["Recover"]], + "weight": 30 + } + ] + }, + "Spectrier": { + "weight": 8, + "sets": [ + { + "species": "Spectrier", + "item": "Life Orb", + "ability": "Grim Neigh", + "nature": "Timid", + "evs": {"hp": 4, "def": 124, "spa": 180, "spe": 200}, + "moves": [["Hex"], ["Hyper Beam"], ["Will-O-Wisp"], ["Calm Mind"]], + "weight": 50 + }, + { + "species": "Spectrier", + "item": "Sitrus Berry", + "ability": "Grim Neigh", + "nature": "Modest", + "evs": {"hp": 196, "def": 68, "spa": 4, "spd": 20, "spe": 220}, + "moves": [["Calm Mind"], ["Will-O-Wisp"], ["Hex"], ["Draining Kiss"]], + "weight": 30 + }, + { + "species": "Spectrier", + "item": "Clear Amulet", + "ability": "Grim Neigh", + "nature": "Calm", + "evs": {"hp": 36, "spd": 252, "spe": 220}, + "moves": [["Calm Mind"], ["Pain Split"], ["Shadow Ball"], ["Taunt"]], + "weight": 20 + } + ] + }, + "Corviknight": { + "weight": 8, + "sets": [ + { + "species": "Corviknight", + "item": "Maranga Berry", + "ability": "Pressure", + "nature": "Careful", + "evs": {"hp": 248, "def": 56, "spd": 84, "spe": 120}, + "moves": [["Iron Defense"], ["Body Press"], ["Taunt"], ["Roost"]], + "weight": 60 + }, + { + "species": "Corviknight", + "item": "Leftovers", + "ability": "Pressure", + "nature": "Timid", + "evs": {"hp": 200, "spd": 56, "spe": 252}, + "moves": [["Protect"], ["Substitute"], ["Roost"], ["Taunt"]], + "weight": 25 + }, + { + "species": "Corviknight", + "item": "Life Orb", + "ability": "Pressure", + "nature": "Adamant", + "evs": {"hp": 24, "atk": 228, "def": 44, "spe": 212}, + "moves": [["Bulk Up"], ["Brave Bird"], ["Iron Head"], ["Taunt"]], + "weight": 15 + } + ] + }, + "Dragapult": { + "weight": 8, + "sets": [ + { + "species": "Dragapult", + "item": "Choice Band", + "ability": "Clear Body", + "nature": "Adamant", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "moves": [["Outrage"], ["Dragon Darts", "Psychic Fangs"], ["Phantom Force"], ["U-turn"]], + "weight": 40 + }, + { + "species": "Dragapult", + "item": "Choice Specs", + "ability": "Infiltrator", + "nature": "Modest", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "moves": [["Shadow Ball"], ["Draco Meteor"], ["Fire Blast"], ["Thunderbolt", "Hydro Pump"]], + "weight": 40 + }, + { + "species": "Dragapult", + "item": "Weakness Policy", + "ability": "Clear Body", + "nature": "Timid", + "evs": {"hp": 48, "def": 248, "spe": 212}, + "moves": [["Will-O-Wisp"], ["Hex"], ["Substitute"], ["Disable"]], + "weight": 20 + } + ] + }, + "Goodra-Hisui": { + "weight": 8, + "sets": [ + { + "species": "Goodra-Hisui", + "item": "Choice Band", + "ability": "Sap Sipper", + "nature": "Adamant", + "evs": {"hp": 248, "atk": 236, "def": 24}, + "moves": [["Outrage"], ["Heavy Slam"], ["Earthquake"], ["Skitter Smack"]], + "weight": 35 + }, + { + "species": "Goodra-Hisui", + "item": "Assault Vest", + "ability": "Sap Sipper", + "nature": "Sassy", + "evs": {"hp": 248, "def": 24, "spa": 60, "spd": 176}, + "moves": [["Acid Spray"], ["Draco Meteor"], ["Flash Cannon"], ["Knock Off"]], + "weight": 30 + }, + { + "species": "Goodra-Hisui", + "item": "Chople Berry", + "ability": "Sap Sipper", + "nature": "Sassy", + "evs": {"hp": 244, "atk": 32, "def": 60, "spa": 84, "spd": 88}, + "moves": [["Acid Spray"], ["Draco Meteor"], ["Heavy Slam"], ["Counter"]], + "weight": 35 + } + ] + }, + "Landorus-Therian": { + "weight": 7, + "sets": [ + { + "species": "Landorus-Therian", + "item": "Life Orb", + "ability": "Intimidate", + "nature": "Adamant", + "evs": {"hp": 8, "atk": 136, "def": 196, "spe": 168}, + "moves": [["Earthquake"], ["Swords Dance"], ["Outrage"], ["Smack Down"]], + "weight": 40 + }, + { + "species": "Landorus-Therian", + "item": "Choice Band", + "ability": "Intimidate", + "nature": "Adamant", + "evs": {"hp": 232, "atk": 32, "def": 36, "spd": 120, "spe": 88}, + "moves": [["Earthquake"], ["Outrage"], ["Rock Tomb"], ["Fly"]], + "weight": 60 + } + ] + }, + "Ninetales-Alola": { + "weight": 7, + "sets": [ + { + "species": "Ninetales-Alola", + "item": "Leftovers", + "ability": "Snow Warning", + "nature": "Timid", + "evs": {"hp": 216, "def": 40, "spe": 252}, + "moves": [["Protect"], ["Encore"], ["Disable"], ["Moonblast"]], + "weight": 80 + }, + { + "species": "Ninetales-Alola", + "item": "Life Orb", + "ability": "Snow Warning", + "nature": "Timid", + "evs": {"hp": 208, "spa": 100, "spe": 200}, + "moves": [["Calm Mind"], ["Freeze-Dry"], ["Blizzard"], ["Moonblast"]], + "weight": 20 + } + ] + }, + "Ogerpon-Wellspring": { + "weight": 7, + "sets": [ + { + "species": "Ogerpon-Wellspring", + "item": "Wellspring Mask", + "ability": "Water Absorb", + "nature": "Jolly", + "evs": {"hp": 248, "atk": 8, "spe": 252}, + "moves": [["Spiky Shield"], ["Ivy Cudgel", "Power Whip"], ["Leech Seed"], ["Substitute"]], + "weight": 30 + }, + { + "species": "Ogerpon-Wellspring", + "item": "Wellspring Mask", + "ability": "Water Absorb", + "nature": "Jolly", + "evs": {"atk": 252, "def": 4, "spe": 252}, + "moves": [["Power Whip"], ["Ivy Cudgel"], ["Encore"], ["Trailblaze", "Rock Tomb"]], + "weight": 25 + }, + { + "species": "Ogerpon-Wellspring", + "item": "Wellspring Mask", + "ability": "Water Absorb", + "nature": "Adamant", + "evs": {"hp": 200, "atk": 192, "spe": 116}, + "moves": [["Power Whip"], ["Ivy Cudgel"], ["Knock Off"], ["Low Kick", "Play Rough", "Encore"]], + "weight": 25 + }, + { + "species": "Ogerpon-Wellspring", + "item": "Wellspring Mask", + "ability": "Water Absorb", + "nature": "Impish", + "evs": {"hp": 252, "atk": 80, "def": 144, "spe": 32}, + "moves": [["Trailblaze"], ["Counter"], ["Encore"], ["Ivy Cudgel"]], + "weight": 20 + } + ] + }, + "Raging Bolt": { + "weight": 7, + "sets": [ + { + "species": "Raging Bolt", + "item": "Booster Energy", + "ability": "Protosynthesis", + "nature": "Modest", + "evs": {"hp": 240, "def": 24, "spa": 240}, + "moves": [["Thunderbolt"], ["Draco Meteor"], ["Thunderclap"], ["Taunt"]], + "weight": 50 + }, + { + "species": "Raging Bolt", + "item": "Booster Energy", + "ability": "Protosynthesis", + "nature": "Modest", + "evs": {"hp": 96, "spa": 232, "spd": 44, "spe": 136}, + "moves": [["Thunderbolt"], ["Draco Meteor"], ["Thunderclap"], ["Calm Mind", "Taunt"]], + "weight": 50 + } + ] + }, + "Urshifu": { + "weight": 7, + "sets": [ + { + "species": "Urshifu", + "item": "Life Orb", + "ability": "Unseen Fist", + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "moves": [["Bulk Up"], ["Wicked Blow"], ["Sucker Punch"], ["Close Combat", "Low Kick"]], + "weight": 65 + }, + { + "species": "Urshifu", + "item": "Assault Vest", + "ability": "Unseen Fist", + "nature": "Adamant", + "evs": {"hp": 160, "atk": 92, "def": 16, "spd": 160, "spe": 80}, + "moves": [["Wicked Blow"], ["Low Kick"], ["Rock Tomb"], ["Iron Head", "Sucker Punch", "U-turn"]], + "weight": 35 + } + ] + }, + "Volcarona": { + "weight": 7, + "sets": [ + { + "species": "Volcarona", + "item": "Life Orb", + "ability": "Swarm", + "nature": "Modest", + "evs": {"hp": 252, "def": 32, "spa": 12, "spd": 16, "spe": 196}, + "moves": [["Quiver Dance"], ["Bug Buzz"], ["Overheat"], ["Substitute"]], + "weight": 60 + }, + { + "species": "Volcarona", + "item": "Passho Berry", + "ability": "Swarm", + "nature": "Calm", + "evs": {"hp": 192, "spa": 76, "spd": 44, "spe": 196}, + "moves": [["Quiver Dance"], ["Overheat"], ["Bug Buzz"], ["Giga Drain"]], + "weight": 40 + } + ] + }, + "Zapdos": { + "weight": 7, + "sets": [ + { + "species": "Zapdos", + "item": "Clear Amulet", + "ability": "Pressure", + "nature": "Timid", + "evs": {"hp": 248, "spd": 84, "spe": 176}, + "moves": [["Hurricane"], ["Thunderbolt"], ["Eerie Impulse"], ["Roost"]], + "weight": 60 + }, + { + "species": "Zapdos", + "item": "Life Orb", + "ability": "Pressure", + "nature": "Timid", + "evs": {"hp": 8, "spa": 200, "spd": 48, "spe": 252}, + "moves": [["Hurricane"], ["Thunderbolt"], ["Charge"], ["Heat Wave"]], + "weight": 20 + }, + { + "species": "Zapdos", + "item": "Leftovers", + "ability": "Pressure", + "nature": "Timid", + "evs": {"hp": 248, "spa": 8, "spe": 252}, + "moves": [["Protect"], ["Substitute"], ["Roost"], ["Thunderbolt"]], + "weight": 20 + } + ] + }, + "Garchomp": { + "weight": 7, + "sets": [ + { + "species": "Garchomp", + "item": "Life Orb", + "ability": "Rough Skin", + "nature": "Adamant", + "evs": {"atk": 252, "spd": 176, "spe": 80}, + "moves": [["Earthquake"], ["Scale Shot"], ["Swords Dance"], ["Outrage"]], + "weight": 60 + }, + { + "species": "Garchomp", + "item": "Choice Band", + "ability": "Rough Skin", + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "moves": [["Outrage"], ["Earthquake"], ["Scale Shot"], ["Fire Fang", "Iron Head"]], + "weight": 40 + } + ] + }, + "Haxorus": { + "weight": 7, + "sets": [ + { + "species": "Haxorus", + "item": "Choice Band", + "ability": "Unnerve", + "nature": "Adamant", + "evs": {"atk": 252, "def": 4, "spe": 252}, + "moves": [["Outrage"], ["Scale Shot"], ["First Impression"], ["Close Combat", "Iron Tail", "Poison Jab", "Earthquake"]], + "weight": 60 + }, + { + "species": "Haxorus", + "item": "Choice Scarf", + "ability": "Unnerve", + "nature": "Adamant", + "evs": {"atk": 252, "def": 4, "spe": 252}, + "moves": [["Outrage"], ["Close Combat"], ["Rock Slide", "X-Scissor"], ["Poison Jab", "Iron Tail", "Earthquake"]], + "weight": 40 + } + ] + }, + "Iron Hands": { + "weight": 7, + "sets": [ + { + "species": "Iron Hands", + "item": "Booster Energy", + "ability": "Quark Drive", + "nature": "Adamant", + "evs": {"atk": 204, "spd": 220, "spe": 84}, + "moves": [["Close Combat"], ["Supercell Slam"], ["Fake Out"], ["Swords Dance", "Earthquake", "Heavy Slam"]], + "weight": 100 + } + ] + }, + "Meowscarada": { + "weight": 7, + "sets": [ + { + "species": "Meowscarada", + "item": "Choice Band", + "ability": "Protean", + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "moves": [["Flower Trick"], ["Knock Off"], ["Triple Axel"], ["Giga Impact", "Low Kick", "Play Rough"]], + "weight": 100 + } + ] + }, + "Roaring Moon": { + "weight": 6, + "sets": [ + { + "species": "Roaring Moon", + "item": "Booster Energy", + "ability": "Protosynthesis", + "nature": "Jolly", + "evs": {"hp": 8, "atk": 156, "spd": 160, "spe": 184}, + "moves": [["Outrage"], ["Knock Off"], ["Acrobatics", "Dragon Dance"], ["Substitute"]], + "weight": 50 + }, + { + "species": "Roaring Moon", + "item": "Choice Band", + "ability": "Protosynthesis", + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "moves": [["Outrage"], ["Knock Off"], ["Earthquake"], ["Iron Head"]], + "weight": 50 + } + ] + }, + "Sylveon": { + "weight": 6, + "sets": [ + { + "species": "Sylveon", + "item": "Life Orb", + "ability": "Pixilate", + "nature": "Modest", + "evs": {"hp": 104, "def": 224, "spa": 180}, + "moves": [["Hyper Beam"], ["Hyper Voice"], ["Calm Mind"], ["Fake Tears", "Shadow Ball", "Psyshock"]], + "weight": 70 + }, + { + "species": "Sylveon", + "item": "Weakness Policy", + "ability": "Pixilate", + "nature": "Bold", + "evs": {"hp": 88, "def": 244, "spe": 176}, + "moves": [["Hyper Beam"], ["Draining Kiss"], ["Charm"], ["Calm Mind"]], + "ivs": {"atk": 0}, + "weight": 30 + } + ] + }, + "Urshifu-Rapid-Strike": { + "weight": 6, + "sets": [ + { + "species": "Urshifu-Rapid-Strike", + "item": "Choice Band", + "ability": "Unseen Fist", + "nature": "Adamant", + "evs": {"hp": 252, "atk": 220, "def": 32, "spd": 4}, + "moves": [["Surging Strikes"], ["Close Combat"], ["Low Kick", "Thunder Punch"], ["Iron Head", "Ice Spinner"]], + "weight": 65 + }, + { + "species": "Urshifu-Rapid-Strike", + "item": "Life Orb", + "ability": "Unseen Fist", + "nature": "Jolly", + "evs": {"atk": 252, "def": 4, "spe": 252}, + "moves": [["Surging Strikes"], ["Close Combat"], ["Bulk Up"], ["Aqua Jet"]], + "weight": 35 + } + ] + }, + "Volcanion": { + "weight": 6, + "sets": [ + { + "species": "Volcanion", + "item": "Life Orb", + "ability": "Water Absorb", + "nature": "Rash", + "evs": {"hp": 136, "atk": 8, "def": 88, "spa": 44, "spe": 232}, + "moves": [["Overheat"], ["Steam Eruption"], ["Sludge Bomb"], ["Flame Charge"]], + "weight": 40 + }, + { + "species": "Volcanion", + "item": "Assault Vest", + "ability": "Water Absorb", + "nature": "Modest", + "evs": {"hp": 244, "spa": 184, "spd": 80}, + "moves": [["Overheat"], ["Steam Eruption"], ["Sludge Wave"], ["Earth Power", "Flame Charge", "Focus Blast"]], + "weight": 35 + }, + { + "species": "Volcanion", + "item": "Air Balloon", + "ability": "Water Absorb", + "nature": "Modest", + "evs": {"hp": 136, "def": 88, "spa": 188, "spe": 96}, + "moves": [["Substitute"], ["Steam Eruption"], ["Overheat"], ["Sludge Wave"]], + "weight": 25 + } + ] + }, + "Walking Wake": { + "weight": 6, + "sets": [ + { + "species": "Walking Wake", + "item": "Booster Energy", + "ability": "Protosynthesis", + "nature": "Timid", + "evs": {"def": 4, "spa": 252, "spe": 252}, + "moves": [["Draco Meteor"], ["Hydro Pump"], ["Flamethrower"], ["Hurricane"]], + "weight": 75 + }, + { + "species": "Walking Wake", + "item": "Booster Energy", + "ability": "Protosynthesis", + "nature": "Timid", + "evs": {"hp": 8, "def": 56, "spa": 192, "spe": 252}, + "moves": [["Draco Meteor"], ["Hydro Pump"], ["Hurricane"], ["Chilling Water"]], + "weight": 25 + } + ] + }, "Annihilape": { "weight": 5, "sets": [ @@ -18,7 +766,7 @@ "nature": "Careful", "evs": {"hp": 248, "def": 156, "spd": 88, "spe": 16}, "moves": [["Bulk Up"], ["Rage Fist"], ["Encore"], ["Low Sweep"]], - "weight": 25 + "weight": 35 }, { "species": "Annihilape", @@ -27,104 +775,7 @@ "nature": "Impish", "evs": {"hp": 248, "def": 244, "spe": 16}, "moves": [["Counter"], ["Bulk Up"], ["Rage Fist"], ["Close Combat"]], - "weight": 25 - } - ] - }, - "Arcanine": { - "weight": 1, - "sets": [ - { - "species": "Arcanine", - "item": "Assault Vest", - "ability": "Intimidate", - "nature": "Naughty", - "evs": {"hp": 224, "atk": 192, "spd": 36, "spe": 56}, - "moves": [["Flare Blitz"], ["Play Rough"], ["Extreme Speed"], ["Overheat"]], - "weight": 100 - } - ] - }, - "Arcanine-Hisui": { - "weight": 2, - "sets": [ - { - "species": "Arcanine-Hisui", - "item": "Choice Band", - "ability": "Rock Head", - "nature": ["Adamant", "Jolly"], - "evs": {"atk": 252, "spd": 4, "spe": 252}, - "moves": [["Head Smash"], ["Flare Blitz"], ["Close Combat"], ["Outrage", "Iron Head"]], - "weight": 50 - }, - { - "species": "Arcanine-Hisui", - "item": "Choice Scarf", - "ability": "Rock Head", - "nature": "Adamant", - "evs": {"atk": 252, "spd": 4, "spe": 252}, - "moves": [["Head Smash"], ["Flare Blitz"], ["Close Combat"], ["Outrage"]], - "weight": 50 - } - ] - }, - "Avalugg": { - "weight": 1, - "sets": [ - { - "species": "Avalugg", - "item": "Choice Band", - "ability": "Sturdy", - "nature": "Adamant", - "evs": {"hp": 4, "atk": 252, "def": 252}, - "moves": [["Avalanche"], ["Body Press"], ["Heavy Slam"], ["Mirror Coat", "Earthquake"]], - "weight": 50 - }, - { - "species": "Avalugg", - "item": "Sitrus Berry", - "ability": "Sturdy", - "nature": "Impish", - "evs": {"hp": 252, "atk": 4, "def": 252}, - "moves": [["Body Press"], ["Iron Defense"], ["Recover"], ["Icicle Spear"]], - "weight": 50 - } - ] - }, - "Avalugg-Hisui": { - "weight": 2, - "sets": [ - { - "species": "Avalugg-Hisui", - "item": "Choice Band", - "ability": "Sturdy", - "nature": "Adamant", - "evs": {"atk": 252, "def": 4, "spe": 252}, - "moves": [["Avalanche"], ["Heavy Slam"], ["Rock Blast", "Stone Edge"], ["Earthquake", "Mirror Coat", "Icicle Spear"]], - "weight": 100 - } - ] - }, - "Azumarill": { - "weight": 3, - "sets": [ - { - "species": "Azumarill", - "item": "Life Orb", - "ability": "Huge Power", - "nature": "Adamant", - "evs": {"hp": 148, "atk": 232, "spd": 84, "spe": 44}, - "moves": [["Play Rough"], ["Liquidation"], ["Trailblaze"], ["Encore"]], - "weight": 50 - }, - { - "species": "Azumarill", - "item": "Leftovers", - "ability": "Sap Sipper", - "nature": "Bold", - "evs": {"hp": 252, "def": 192, "spd": 64}, - "moves": [["Charm"], ["Rest"], ["Amnesia"], ["Chilling Water"]], - "weight": 50 + "weight": 15 } ] }, @@ -142,114 +793,6 @@ } ] }, - "Baxcalibur": { - "weight": 2, - "sets": [ - { - "species": "Baxcalibur", - "item": "Choice Band", - "ability": "Thermal Exchange", - "nature": "Adamant", - "evs": {"atk": 252, "spd": 4, "spe": 252}, - "moves": [["Outrage"], ["Icicle Crash", "Icicle Spear"], ["Earthquake"], ["Ice Shard", "Scale Shot", "Iron Head"]], - "weight": 100 - } - ] - }, - "Bellibolt": { - "weight": 2, - "sets": [ - { - "species": "Bellibolt", - "item": "Custap Berry", - "ability": "Electromorphosis", - "nature": "Quiet", - "evs": {"hp": 252, "def": 24, "spa": 200, "spd": 32}, - "moves": [["Soak"], ["Thunder"], ["Parabolic Charge"], ["Endure"]], - "weight": 50 - }, - { - "species": "Bellibolt", - "item": "Life Orb", - "ability": "Electromorphosis", - "nature": "Quiet", - "evs": {"hp": 240, "def": 80, "spa": 136, "spd": 52}, - "moves": [["Thunder"], ["Parabolic Charge"], ["Sucker Punch"], ["Soak"]], - "weight": 50 - } - ] - }, - "Blastoise": { - "weight": 1, - "sets": [ - { - "species": "Blastoise", - "item": "Life Orb", - "ability": "Torrent", - "nature": "Bold", - "evs": {"hp": 132, "def": 136, "spa": 128, "spe": 112}, - "moves": [["Shell Smash"], ["Hydro Cannon"], ["Ice Beam"], ["Substitute"]], - "weight": 100 - } - ] - }, - "Blaziken": { - "weight": 1, - "sets": [ - { - "species": "Blaziken", - "item": "Liechi Berry", - "ability": "Speed Boost", - "nature": "Adamant", - "evs": {"atk": 252, "def": 4, "spe": 252}, - "moves": [["Endure"], ["Flare Blitz"], ["Reversal"], ["Swords Dance"]], - "weight": 100 - } - ] - }, - "Carbink": { - "weight": 1, - "sets": [ - { - "species": "Carbink", - "item": "Shell Bell", - "ability": "Sturdy", - "nature": "Quirky", - "evs": {"hp": 0, "atk": 0, "def": 0, "spa": 0, "spd": 0, "spe": 0}, - "level": 1, - "moves": [["Endeavor"], ["Sand Tomb"], ["Sandstorm"], ["Trick Room", "Protect", "Moonblast"]], - "weight": 100 - } - ] - }, - "Ceruledge": { - "weight": 1, - "sets": [ - { - "species": "Ceruledge", - "item": "Weakness Policy", - "ability": "Weak Armor", - "nature": "Adamant", - "evs": {"atk": 252, "spd": 4, "spe": 252}, - "moves": [["Endure"], ["Flare Blitz"], ["Close Combat"], ["Poltergeist"]], - "weight": 100 - } - ] - }, - "Chansey": { - "weight": 1, - "sets": [ - { - "species": "Chansey", - "item": "Eviolite", - "ability": "Natural Cure", - "nature": "Bold", - "evs": {"hp": 252, "def": 252, "spd": 4}, - "moves": [["Seismic Toss"], ["Charm", "Defense Curl"], ["Soft-Boiled"], ["Thunder Wave"]], - "weight": 100 - } - ] - }, "Chien-Pao": { "weight": 5, "sets": [ @@ -264,55 +807,18 @@ } ] }, - "Clodsire": { - "weight": 1, - "sets": [ - { - "species": "Clodsire", - "item": "Kee Berry", - "ability": "Unaware", - "nature": "Relaxed", - "evs": {"hp": 252, "def": 252, "spd": 4}, - "moves": [["Curse"], ["Amnesia"], ["Toxic"], ["Recover"]], - "weight": 100 - } - ] - }, - "Corviknight": { - "weight": 8, - "sets": [ - { - "species": "Corviknight", - "item": "Maranga Berry", - "ability": "Pressure", - "nature": "Careful", - "evs": {"hp": 248, "def": 56, "spd": 84, "spe": 120}, - "moves": [["Iron Defense"], ["Body Press"], ["Taunt"], ["Roost"]], - "weight": 40 - }, - { - "species": "Corviknight", - "item": "Leftovers", - "ability": "Pressure", - "nature": "Timid", - "evs": {"hp": 200, "spd": 56, "spe": 252}, - "moves": [["Protect"], ["Substitute"], ["Roost"], ["Taunt"]], - "weight": 40 - }, - { - "species": "Corviknight", - "item": "Life Orb", - "ability": "Pressure", - "nature": "Adamant", - "evs": {"hp": 24, "atk": 228, "def": 44, "spe": 212}, - "moves": [["Bulk Up"], ["Brave Bird"], ["Iron Head"], ["Taunt"]], - "weight": 20 - } - ] - }, "Cresselia": { "weight": 5, "sets": [ + { + "species": "Cresselia", + "item": "Clear Amulet", + "ability": "Levitate", + "nature": "Bold", + "evs": {"hp": 252, "def": 44, "spd": 72, "spe": 140}, + "moves": [["Calm Mind"], ["Moonlight"], ["Stored Power"], ["Reflect"]], + "weight": 50 + }, { "species": "Cresselia", "item": "Choice Scarf", @@ -321,15 +827,245 @@ "evs": {"hp": 240, "def": 64, "spa": 56, "spd": 36, "spe": 112}, "moves": [["Psychic"], ["Ice Beam", "Moonblast"], ["Trick"], ["Moonlight"]], "weight": 50 + } + ] + }, + "Donphan": { + "weight": 5, + "sets": [ + { + "species": "Donphan", + "item": "Choice Band", + "ability": "Sturdy", + "nature": "Adamant", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "moves": [["Earthquake"], ["Gunk Shot"], ["Head Smash"], ["Play Rough", "Ice Shard"]], + "weight": 80 }, { - "species": "Cresselia", - "item": "Clear Amulet", - "ability": "Levitate", - "nature": "Bold", - "evs": {"hp": 252, "def": 44, "spd": 72, "spe": 140}, - "moves": [["Calm Mind"], ["Moonlight"], ["Stored Power"], ["Future Sight", "Reflect"]], + "species": "Donphan", + "item": "Expert Belt", + "ability": "Sturdy", + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "moves": [["Earthquake"], ["Gunk Shot"], ["Trailblaze"], ["Encore"]], + "weight": 20 + } + ] + }, + "Entei": { + "weight": 5, + "sets": [ + { + "species": "Entei", + "item": "Assault Vest", + "ability": "Inner Focus", + "nature": "Adamant", + "evs": {"hp": 240, "atk": 112, "def": 132, "spd": 24}, + "moves": [["Sacred Fire"], ["Eruption"], ["Flame Charge"], ["Extreme Speed"]], "weight": 50 + }, + { + "species": "Entei", + "item": "Leftovers", + "ability": "Pressure", + "nature": "Jolly", + "evs": {"hp": 128, "def": 116, "spd": 12, "spe": 252}, + "moves": [["Sacred Fire"], ["Substitute"], ["Protect"], ["Flame Charge"]], + "weight": 50 + } + ] + }, + "Great Tusk": { + "weight": 5, + "sets": [ + { + "species": "Great Tusk", + "item": "Choice Band", + "ability": "Protosynthesis", + "nature": "Adamant", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "moves": [["Earthquake", "Headlong Rush"], ["Close Combat"], ["Supercell Slam"], ["Ice Spinner", "Heavy Slam", "Megahorn"]], + "weight": 40 + }, + { + "species": "Great Tusk", + "item": "Booster Energy", + "ability": "Protosynthesis", + "nature": "Adamant", + "evs": {"hp": 24, "atk": 224, "def": 56, "spe": 204}, + "moves": [["Bulk Up"], ["Headlong Rush"], ["Close Combat"], ["Ice Spinner", "Knock Off"]], + "weight": 30 + }, + { + "species": "Great Tusk", + "item": "Choice Scarf", + "ability": "Protosynthesis", + "nature": "Adamant", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "moves": [["Earthquake"], ["Close Combat"], ["Head Smash"], ["Ice Spinner", "Knock Off", "Megahorn", "Heavy Slam"]], + "weight": 30 + } + ] + }, + "Manaphy": { + "weight": 5, + "sets": [ + { + "species": "Manaphy", + "item": "Life Orb", + "ability": "Hydration", + "nature": "Timid", + "evs": {"hp": 60, "def": 68, "spa": 128, "spe": 252}, + "moves": [["Tail Glow"], ["Surf"], ["Alluring Voice"], ["Energy Ball"]], + "weight": 50 + }, + { + "species": "Manaphy", + "item": "Clear Amulet", + "ability": "Hydration", + "nature": "Timid", + "evs": {"hp": 172, "def": 84, "spe": 252}, + "moves": [["Take Heart"], ["Acid Armor"], ["Rest"], ["Scald"]], + "weight": 25 + }, + { + "species": "Manaphy", + "item": ["Sitrus Berry", "Chesto Berry"], + "ability": "Hydration", + "nature": "Timid", + "evs": {"hp": 252, "def": 4, "spe": 252}, + "moves": [["Scald"], ["Acid Armor"], ["Take Heart"], ["Rest"]], + "weight": 25 + } + ] + }, + "Moltres-Galar": { + "weight": 5, + "sets": [ + { + "species": "Moltres-Galar", + "item": "Life Orb", + "ability": "Berserk", + "nature": "Modest", + "evs": {"atk": 4, "def": 232, "spa": 96, "spe": 176}, + "moves": [["Fiery Wrath"], ["Hurricane"], ["Taunt", "Sucker Punch"], ["Nasty Plot"]], + "weight": 50 + }, + { + "species": "Moltres-Galar", + "item": "Weakness Policy", + "ability": "Berserk", + "nature": "Modest", + "evs": {"hp": 240, "def": 216, "spa": 36, "spd": 16}, + "moves": [["Fiery Wrath"], ["Hurricane"], ["Sucker Punch"], ["Air Slash", "Nasty Plot", "Taunt"]], + "weight": 50 + } + ] + }, + "Registeel": { + "weight": 4, + "sets": [ + { + "species": "Registeel", + "item": "Leftovers", + "ability": "Clear Body", + "nature": "Timid", + "evs": {"hp": 252, "def": 4, "spe": 252}, + "moves": [["Iron Defense"], ["Amnesia"], ["Rest"], ["Body Press"]], + "weight": 100 + } + ] + }, + "Skeledirge": { + "weight": 4, + "sets": [ + { + "species": "Skeledirge", + "item": "Weakness Policy", + "ability": "Unaware", + "nature": "Bold", + "evs": {"hp": 248, "def": 100, "spa": 124, "spd": 36}, + "moves": [["Shadow Ball"], ["Blast Burn"], ["Torch Song"], ["Encore"]], + "weight": 50 + }, + { + "species": "Skeledirge", + "item": "Air Balloon", + "ability": "Unaware", + "nature": "Bold", + "evs": {"hp": 248, "def": 252, "spe": 8}, + "moves": [["Will-O-Wisp"], ["Torch Song"], ["Encore"], ["Slack Off", "Blast Burn"]], + "weight": 50 + } + ] + }, + "Sneasler": { + "weight": 4, + "sets": [ + { + "species": "Sneasler", + "item": "Normal Gem", + "ability": "Unburden", + "nature": "Adamant", + "evs": {"hp": 160, "atk": 252, "def": 44, "spd": 4, "spe": 48}, + "moves": [["Fake Out"], ["Gunk Shot"], ["Close Combat"], ["Feint"]], + "weight": 50 + }, + { + "species": "Sneasler", + "item": "Liechi Berry", + "ability": "Unburden", + "nature": ["Adamant", "Jolly"], + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "moves": [["Endure"], ["Gunk Shot"], ["Reversal"], ["Taunt", "Substitute"]], + "weight": 50 + } + ] + }, + "Zarude": { + "weight": 4, + "sets": [ + { + "species": "Zarude", + "item": "Weakness Policy", + "ability": "Leaf Guard", + "nature": "Jolly", + "evs": {"hp": 128, "atk": 144, "spd": 4, "spe": 232}, + "moves": [["Power Whip"], ["Knock Off"], ["Encore"], ["Bulk Up"]], + "weight": 50 + }, + { + "species": "Zarude", + "item": "Choice Band", + "ability": "Leaf Guard", + "nature": "Adamant", + "evs": {"hp": 120, "atk": 68, "spd": 76, "spe": 244}, + "moves": [["Knock Off"], ["Power Whip"], ["Rock Slide"], ["Bullet Seed", "Low Kick"]], + "weight": 50 + } + ] + }, + "Azumarill": { + "weight": 3, + "sets": [ + { + "species": "Azumarill", + "item": "Life Orb", + "ability": "Huge Power", + "nature": "Adamant", + "evs": {"hp": 148, "atk": 232, "spd": 84, "spe": 44}, + "moves": [["Play Rough"], ["Liquidation"], ["Trailblaze"], ["Encore"]], + "weight": 65 + }, + { + "species": "Azumarill", + "item": "Leftovers", + "ability": "Sap Sipper", + "nature": "Bold", + "evs": {"hp": 252, "def": 192, "spd": 64}, + "moves": [["Charm"], ["Rest"], ["Amnesia"], ["Chilling Water"]], + "weight": 35 } ] }, @@ -384,84 +1120,6 @@ } ] }, - "Donphan": { - "weight": 5, - "sets": [ - { - "species": "Donphan", - "item": "Choice Band", - "ability": "Sturdy", - "nature": "Adamant", - "evs": {"hp": 8, "atk": 252, "spd": 248}, - "moves": [["Earthquake"], ["Gunk Shot"], ["Head Smash"], ["Play Rough", "Ice Shard"]], - "weight": 50 - }, - { - "species": "Donphan", - "item": "Expert Belt", - "ability": "Sturdy", - "nature": "Jolly", - "evs": {"atk": 252, "spd": 4, "spe": 252}, - "moves": [["Earthquake"], ["Gunk Shot"], ["Trailblaze"], ["Encore"]], - "weight": 50 - } - ] - }, - "Dragapult": { - "weight": 8, - "sets": [ - { - "species": "Dragapult", - "item": "Choice Band", - "ability": "Clear Body", - "nature": "Adamant", - "evs": {"atk": 252, "spd": 4, "spe": 252}, - "moves": [["Outrage"], ["Dragon Darts", "Psychic Fangs"], ["Phantom Force"], ["U-turn"]], - "weight": 40 - }, - { - "species": "Dragapult", - "item": "Choice Specs", - "ability": "Infiltrator", - "nature": "Modest", - "evs": {"spa": 252, "spd": 4, "spe": 252}, - "moves": [["Shadow Ball"], ["Draco Meteor"], ["Fire Blast"], ["Thunderbolt", "Hydro Pump"]], - "weight": 40 - }, - { - "species": "Dragapult", - "item": "Weakness Policy", - "ability": "Clear Body", - "nature": "Timid", - "evs": {"hp": 48, "def": 248, "spe": 212}, - "moves": [["Will-O-Wisp"], ["Hex"], ["Substitute"], ["Disable"]], - "weight": 20 - } - ] - }, - "Entei": { - "weight": 5, - "sets": [ - { - "species": "Entei", - "item": "Assault Vest", - "ability": "Inner Focus", - "nature": "Adamant", - "evs": {"hp": 240, "atk": 112, "def": 132, "spd": 24}, - "moves": [["Sacred Fire"], ["Eruption"], ["Flame Charge"], ["Extreme Speed"]], - "weight": 50 - }, - { - "species": "Entei", - "item": "Leftovers", - "ability": "Pressure", - "nature": "Jolly", - "evs": {"hp": 128, "def": 116, "spd": 12, "spe": 252}, - "moves": [["Sacred Fire"], ["Substitute"], ["Protect"], ["Flame Charge"]], - "weight": 50 - } - ] - }, "Espathra": { "weight": 3, "sets": [ @@ -476,417 +1134,6 @@ } ] }, - "Fezandipiti": { - "weight": 2, - "sets": [ - { - "species": "Fezandipiti", - "item": "Life Orb", - "ability": "Technician", - "nature": "Adamant", - "evs": {"hp": 88, "atk": 220, "spd": 136, "spe": 64}, - "moves": [["Gunk Shot"], ["Play Rough"], ["Dual Wingbeat"], ["Swords Dance"]], - "weight": 60 - }, - { - "species": "Fezandipiti", - "item": "Air Balloon", - "ability": "Toxic Chain", - "nature": "Calm", - "evs": {"hp": 252, "def": 124, "spd": 80, "spe": 52}, - "moves": [["Charm"], ["Moonblast"], ["Icy Wind"], ["Roost"]], - "weight": 40 - } - ] - }, - "Florges": { - "weight": 2, - "sets": [ - { - "species": "Florges", - "item": ["Clear Amulet", "Leftovers"], - "ability": "Flower Veil", - "nature": "Bold", - "evs": {"hp": 108, "def": 252, "spe": 148}, - "moves": [["Calm Mind"], ["Synthesis"], ["Moonblast"], ["Psychic Noise"]], - "weight": 50 - }, - { - "species": "Florges", - "item": "Choice Scarf", - "ability": "Flower Veil", - "nature": "Timid", - "evs": {"hp": 88, "def": 232, "spe": 188}, - "moves": [["Moonblast"], ["Trick"], ["Synthesis"], ["Calm Mind"]], - "weight": 50 - } - ] - }, - "Forretress": { - "weight": 1, - "sets": [ - { - "species": "Forretress", - "item": "Leftovers", - "ability": "Sturdy", - "nature": "Impish", - "evs": {"hp": 248, "def": 252, "spd": 8}, - "moves": [["Iron Defense"], ["Body Press"], ["Rest"], ["Counter"]], - "weight": 100 - } - ] - }, - "Gallade": { - "weight": 1, - "sets": [ - { - "species": "Gallade", - "item": "Choice Band", - "ability": "Sharpness", - "nature": "Jolly", - "evs": {"atk": 252, "spd": 4, "spe": 252}, - "moves": [["Sacred Sword"], ["Psycho Cut"], ["Leaf Blade"], ["Triple Axel"]], - "weight": 100 - } - ] - }, - "Garchomp": { - "weight": 8, - "sets": [ - { - "species": "Garchomp", - "item": "Life Orb", - "ability": "Rough Skin", - "nature": "Adamant", - "evs": {"atk": 252, "spd": 176, "spe": 80}, - "moves": [["Earthquake"], ["Scale Shot"], ["Swords Dance"], ["Outrage"]], - "weight": 50 - }, - { - "species": "Garchomp", - "item": "Choice Band", - "ability": "Rough Skin", - "nature": "Jolly", - "evs": {"atk": 252, "spd": 4, "spe": 252}, - "moves": [["Outrage"], ["Earthquake"], ["Scale Shot"], ["Fire Fang", "Iron Head"]], - "weight": 50 - } - ] - }, - "Glastrier": { - "weight": 1, - "sets": [ - { - "species": "Glastrier", - "item": "Choice Band", - "ability": "Chilling Neigh", - "nature": "Adamant", - "evs": {"hp": 252, "atk": 252, "spd": 4}, - "moves": [["Avalanche"], ["Close Combat"], ["Heavy Slam"], ["High Horsepower", "Crunch"]], - "weight": 100 - } - ] - }, - "Goodra-Hisui": { - "weight": 8, - "sets": [ - { - "species": "Goodra-Hisui", - "item": "Custap Berry", - "ability": "Sap Sipper", - "nature": "Sassy", - "evs": {"hp": 248, "def": 24, "spa": 148, "spd": 88}, - "moves": [["Draco Meteor"], ["Sludge Wave", "Flash Cannon"], ["Acid Spray"], ["Endure"]], - "weight": 25 - }, - { - "species": "Goodra-Hisui", - "item": "Choice Band", - "ability": "Sap Sipper", - "nature": "Adamant", - "evs": {"hp": 248, "atk": 236, "def": 24}, - "moves": [["Outrage"], ["Heavy Slam"], ["Earthquake"], ["Skitter Smack"]], - "weight": 25 - }, - { - "species": "Goodra-Hisui", - "item": "Assault Vest", - "ability": "Sap Sipper", - "nature": "Sassy", - "evs": {"hp": 248, "def": 24, "spa": 60, "spd": 176}, - "moves": [["Acid Spray"], ["Draco Meteor"], ["Flash Cannon"], ["Knock Off"]], - "weight": 25 - }, - { - "species": "Goodra-Hisui", - "item": "Chople Berry", - "ability": "Sap Sipper", - "nature": "Sassy", - "evs": {"hp": 244, "atk": 32, "def": 60, "spa": 84, "spd": 88}, - "moves": [["Acid Spray"], ["Draco Meteor"], ["Heavy Slam"], ["Counter"]], - "weight": 25 - } - ] - }, - "Grafaiai": { - "weight": 1, - "sets": [ - { - "species": "Grafaiai", - "item": "Lagging Tail", - "ability": "Prankster", - "nature": "Sassy", - "evs": {"hp": 248, "def": 96, "spd": 164}, - "ivs": {"spe": 0}, - "moves": [["Poison Jab"], ["Dig"], ["Copycat"], ["Encore"]], - "weight": 100 - } - ] - }, - "Great Tusk": { - "weight": 5, - "sets": [ - { - "species": "Great Tusk", - "item": "Choice Band", - "ability": "Protosynthesis", - "nature": "Adamant", - "evs": {"atk": 252, "spd": 4, "spe": 252}, - "moves": [["Earthquake", "Headlong Rush"], ["Close Combat"], ["Supercell Slam"], ["Ice Spinner", "Heavy Slam", "Megahorn"]], - "weight": 40 - }, - { - "species": "Great Tusk", - "item": "Booster Energy", - "ability": "Protosynthesis", - "nature": "Adamant", - "evs": {"hp": 24, "atk": 224, "def": 56, "spe": 204}, - "moves": [["Bulk Up"], ["Headlong Rush"], ["Close Combat"], ["Ice Spinner", "Knock Off"]], - "weight": 30 - }, - { - "species": "Great Tusk", - "item": "Choice Scarf", - "ability": "Protosynthesis", - "nature": "Adamant", - "evs": {"atk": 252, "spd": 4, "spe": 252}, - "moves": [["Earthquake"], ["Close Combat"], ["Head Smash"], ["Ice Spinner", "Knock Off", "Megahorn", "Heavy Slam"]], - "weight": 30 - } - ] - }, - "Greninja": { - "weight": 2, - "sets": [ - { - "species": "Greninja", - "item": "Choice Specs", - "ability": "Protean", - "nature": "Timid", - "evs": {"spa": 252, "spd": 4, "spe": 252}, - "moves": [["Ice Beam"], ["Hydro Cannon"], ["Sludge Wave"], ["Dark Pulse", "Grass Knot"]], - "weight": 40 - }, - { - "species": "Greninja", - "item": "Petaya Berry", - "ability": "Torrent", - "nature": "Modest", - "evs": {"spa": 252, "spd": 4, "spe": 252}, - "ivs": {"hp": 30}, - "moves": [["Taunt"], ["Hydro Cannon"], ["Dark Pulse"], ["Substitute"]], - "weight": 30 - }, - { - "species": "Greninja", - "item": "Life Orb", - "ability": "Protean", - "nature": "Hasty", - "evs": {"atk": 252, "spa": 8, "spd": 64, "spe": 184}, - "moves": [["Gunk Shot"], ["Hydro Cannon"], ["U-turn"], ["Shadow Sneak"]], - "weight": 30 - } - ] - }, - "Haxorus": { - "weight": 7, - "sets": [ - { - "species": "Haxorus", - "item": "Choice Band", - "ability": "Unnerve", - "nature": "Adamant", - "evs": {"atk": 252, "def": 4, "spe": 252}, - "moves": [["Outrage"], ["Scale Shot"], ["First Impression"], ["Close Combat", "Iron Tail", "Poison Jab", "Earthquake"]], - "weight": 50 - }, - { - "species": "Haxorus", - "item": "Choice Scarf", - "ability": "Unnerve", - "nature": "Adamant", - "evs": {"atk": 252, "def": 4, "spe": 252}, - "moves": [["Outrage"], ["Close Combat"], ["Poison Jab", "Iron Tail"], ["Rock Slide", "Earthquake"]], - "weight": 50 - } - ] - }, - "Heatran": { - "weight": 1, - "sets": [ - { - "species": "Heatran", - "item": "Air Balloon", - "ability": "Flame Body", - "nature": "Modest", - "evs": {"spa": 252, "spd": 4, "spe": 252}, - "moves": [["Overheat"], ["Flash Cannon"], ["Substitute", "Endure", "Earth Power"], ["Metal Sound"]], - "weight": 100 - } - ] - }, - "Hoopa-Unbound": { - "weight": 10, - "sets": [ - { - "species": "Hoopa-Unbound", - "item": "Choice Band", - "ability": "Magician", - "nature": "Jolly", - "evs": {"atk": 252, "spd": 4, "spe": 252}, - "moves": [["Hyperspace Fury"], ["Gunk Shot"], ["Zen Headbutt"], ["Drain Punch", "Fire Punch"]], - "weight": 20 - }, - { - "species": "Hoopa-Unbound", - "item": "Choice Specs", - "ability": "Magician", - "nature": "Modest", - "evs": {"def": 4, "spa": 252, "spe": 252}, - "moves": [["Psychic"], ["Dark Pulse"], ["Thunderbolt"], ["Grass Knot", "Focus Blast"]], - "weight": 20 - }, - { - "species": "Hoopa-Unbound", - "item": "Assault Vest", - "ability": "Magician", - "nature": "Adamant", - "evs": {"hp": 168, "atk": 252, "def": 68, "spe": 20}, - "moves": [["Hyperspace Fury"], ["Gunk Shot"], ["Psychic Noise"], ["Knock Off"]], - "weight": 20 - }, - { - "species": "Hoopa-Unbound", - "item": "Custap Berry", - "ability": "Magician", - "nature": "Naughty", - "evs": {"hp": 132, "atk": 220, "def": 140, "spe": 16}, - "moves": [["Psychic"], ["Hyperspace Fury"], ["Gunk Shot"], ["Endure"]], - "weight": 20 - }, - { - "species": "Hoopa-Unbound", - "item": "Life Orb", - "ability": "Magician", - "nature": "Lonely", - "evs": {"hp": 240, "def": 76, "spa": 96, "spe": 96}, - "moves": [["Gunk Shot"], ["Psychic"], ["Dark Pulse"], ["Calm Mind"]], - "weight": 20 - } - ] - }, - "Iron Boulder": { - "weight": 1, - "sets": [ - { - "species": "Iron Boulder", - "item": "Choice Band", - "ability": "Quark Drive", - "nature": "Jolly", - "evs": {"atk": 252, "spd": 4, "spe": 252}, - "moves": [["Mighty Cleave"], ["Zen Headbutt"], ["Sacred Sword"], ["Megahorn"]], - "weight": 100 - } - ] - }, - "Iron Bundle": { - "weight": 1, - "sets": [ - { - "species": "Iron Bundle", - "item": "Booster Energy", - "ability": "Quark Drive", - "nature": "Modest", - "evs": {"hp": 28, "spa": 116, "spd": 216, "spe": 148}, - "moves": [["Thief"], ["Hydro Pump"], ["Freeze-Dry"], ["Encore"]], - "weight": 50 - }, - { - "species": "Iron Bundle", - "item": "Choice Specs", - "ability": "Quark Drive", - "nature": "Timid", - "evs": {"hp": 44, "def": 152, "spa": 144, "spe": 168}, - "moves": [["Ice Beam"], ["Freeze-Dry"], ["Hydro Pump"], ["Chilling Water"]], - "weight": 50 - } - ] - }, - "Iron Crown": { - "weight": 9, - "sets": [ - { - "species": "Iron Crown", - "item": "Weakness Policy", - "ability": "Quark Drive", - "nature": "Bold", - "evs": {"hp": 240, "def": 232, "spe": 36}, - "moves": [["Tachyon Cutter"], ["Iron Defense"], ["Calm Mind"], ["Stored Power", "Psyshock"]], - "weight": 25 - }, - { - "species": "Iron Crown", - "item": "Weakness Policy", - "ability": "Quark Drive", - "nature": "Timid", - "evs": {"hp": 252, "spd": 4, "spe": 252}, - "moves": [["Tachyon Cutter"], ["Iron Defense"], ["Calm Mind"], ["Stored Power", "Psyshock", "Psychic Noise"]], - "weight": 25 - }, - { - "species": "Iron Crown", - "item": "Booster Energy", - "ability": "Quark Drive", - "nature": "Modest", - "evs": {"hp": 244, "def": 16, "spa": 196, "spd": 16, "spe": 36}, - "moves": [["Calm Mind"], ["Psychic Noise"], ["Tachyon Cutter"], ["Focus Blast", "Hyper Beam"]], - "weight": 50 - } - ] - }, - "Iron Hands": { - "weight": 7, - "sets": [ - { - "species": "Iron Hands", - "item": "Booster Energy", - "ability": "Quark Drive", - "nature": "Adamant", - "evs": {"atk": 204, "spd": 220, "spe": 84}, - "moves": [["Close Combat"], ["Supercell Slam"], ["Fake Out"], ["Swords Dance", "Earthquake", "Heavy Slam"]], - "weight": 75 - }, - { - "species": "Iron Hands", - "item": "Custap Berry", - "ability": "Quark Drive", - "nature": "Adamant", - "evs": {"hp": 32, "atk": 252, "def": 44, "spd": 96, "spe": 84}, - "moves": [["Supercell Slam"], ["Reversal"], ["Endure"], ["Heavy Slam", "Swords Dance"]], - "weight": 25 - } - ] - }, "Iron Moth": { "weight": 3, "sets": [ @@ -896,85 +1143,7 @@ "ability": "Quark Drive", "nature": "Timid", "evs": {"hp": 4, "spa": 252, "spe": 252}, - "moves": [["Overheat"], ["Sludge Wave"], ["Bug Buzz", "Dazzling Gleam", "Hurricane"], ["Protect", "Endure"]], - "weight": 100 - } - ] - }, - "Iron Treads": { - "weight": 2, - "sets": [ - { - "species": "Iron Treads", - "item": "Choice Band", - "ability": "Quark Drive", - "nature": "Jolly", - "evs": {"atk": 252, "spd": 4, "spe": 252}, - "moves": [["Heavy Slam"], ["Earthquake"], ["Megahorn"], ["Ice Spinner"]], - "weight": 70 - }, - { - "species": "Iron Treads", - "item": "Booster Energy", - "ability": "Quark Drive", - "nature": "Jolly", - "evs": {"hp": 252, "atk": 116, "def": 60, "spe": 80}, - "moves": [["Iron Defense"], ["Body Press"], ["Earthquake"], ["Heavy Slam"]], - "weight": 30 - } - ] - }, - "Iron Valiant": { - "weight": 9, - "sets": [ - { - "species": "Iron Valiant", - "item": "Booster Energy", - "ability": "Quark Drive", - "nature": "Timid", - "evs": {"hp": 252, "def": 232, "spe": 24}, - "moves": [["Moonblast"], ["Protect"], ["Encore"], ["Disable"]], - "weight": 25 - }, - { - "species": "Iron Valiant", - "item": "Booster Energy", - "ability": "Quark Drive", - "nature": "Jolly", - "evs": {"hp": 252, "def": 96, "spd": 136, "spe": 24}, - "moves": [["Spirit Break"], ["Protect"], ["Encore"], ["Disable"]], - "weight": 25 - }, - { - "species": "Iron Valiant", - "item": "Booster Energy", - "ability": "Quark Drive", - "nature": "Jolly", - "evs": {"atk": 252, "spd": 4, "spe": 252}, - "moves": [["Spirit Break"], ["Reversal"], ["Disable"], ["Substitute"]], - "weight": 25 - }, - { - "species": "Iron Valiant", - "item": "Choice Band", - "ability": "Quark Drive", - "nature": "Jolly", - "evs": {"hp": 4, "atk": 220, "spd": 32, "spe": 252}, - "moves": [["Spirit Break"], ["Close Combat"], ["Giga Impact"], ["Trick", "Ice Punch"]], - "weight": 25 - } - ] - }, - "Klefki": { - "weight": 1, - "sets": [ - { - "species": "Klefki", - "item": "Leftovers", - "ability": "Prankster", - "nature": "Bold", - "evs": {"hp": 200, "def": 128, "spa": 24, "spd": 156}, - "moves": [["Draining Kiss"], ["Iron Defense"], ["Calm Mind"], ["Stored Power"]], + "moves": [["Overheat"], ["Sludge Wave"], ["Bug Buzz"], ["Dazzling Gleam", "Hurricane"]], "weight": 100 } ] @@ -1011,314 +1180,6 @@ } ] }, - "Landorus": { - "weight": 2, - "sets": [ - { - "species": "Landorus", - "item": "Life Orb", - "ability": "Sheer Force", - "nature": "Timid", - "evs": {"spa": 252, "spd": 4, "spe": 252}, - "moves": [["Earth Power"], ["Sludge Wave"], ["Focus Blast", "Taunt"], ["Smack Down", "Rock Slide"]], - "weight": 100 - } - ] - }, - "Landorus-Therian": { - "weight": 8, - "sets": [ - { - "species": "Landorus-Therian", - "item": "Life Orb", - "ability": "Intimidate", - "nature": "Adamant", - "evs": {"hp": 8, "atk": 136, "def": 196, "spe": 168}, - "moves": [["Earthquake"], ["Swords Dance"], ["Outrage"], ["Smack Down"]], - "weight": 50 - }, - { - "species": "Landorus-Therian", - "item": "Choice Band", - "ability": "Intimidate", - "nature": "Adamant", - "evs": {"hp": 232, "atk": 32, "def": 36, "spd": 120, "spe": 88}, - "moves": [["Earthquake"], ["Outrage"], ["Rock Tomb"], ["Fly"]], - "weight": 50 - } - ] - }, - "Latias": { - "weight": 1, - "sets": [ - { - "species": "Latias", - "item": "Weakness Policy", - "ability": "Levitate", - "nature": "Timid", - "evs": {"hp": 252, "spd": 4, "spe": 252}, - "moves": [["Reflect"], ["Calm Mind"], ["Stored Power"], ["Draco Meteor"]], - "weight": 100 - } - ] - }, - "Magnezone": { - "weight": 1, - "sets": [ - { - "species": "Magnezone", - "item": "Custap Berry", - "ability": "Sturdy", - "nature": "Modest", - "evs": {"spa": 252, "spd": 4, "spe": 252}, - "moves": [["Endure"], ["Thunderbolt"], ["Metal Sound"], ["Flash Cannon"]], - "weight": 50 - }, - { - "species": "Magnezone", - "item": "Choice Specs", - "ability": "Sturdy", - "nature": "Modest", - "evs": {"spa": 252, "spd": 4, "spe": 252}, - "moves": [["Hyper Beam"], ["Thunderbolt"], ["Flash Cannon"], ["Mirror Coat"]], - "weight": 50 - } - ] - }, - "Manaphy": { - "weight": 5, - "sets": [ - { - "species": "Manaphy", - "item": "Life Orb", - "ability": "Hydration", - "nature": "Timid", - "evs": {"hp": 60, "def": 68, "spa": 128, "spe": 252}, - "moves": [["Tail Glow"], ["Surf"], ["Alluring Voice"], ["Energy Ball"]], - "weight": 50 - }, - { - "species": "Manaphy", - "item": "Clear Amulet", - "ability": "Hydration", - "nature": "Timid", - "evs": {"hp": 172, "def": 84, "spe": 252}, - "moves": [["Take Heart"], ["Acid Armor"], ["Rest"], ["Scald"]], - "weight": 25 - }, - { - "species": "Manaphy", - "item": ["Sitrus Berry", "Chesto Berry"], - "ability": "Hydration", - "nature": "Timid", - "evs": {"hp": 252, "def": 4, "spe": 252}, - "moves": [["Scald"], ["Acid Armor"], ["Take Heart"], ["Rest"]], - "weight": 25 - } - ] - }, - "Maushold-Four": { - "weight": 1, - "sets": [ - { - "species": "Maushold-Four", - "item": "Wide Lens", - "ability": "Technician", - "nature": "Jolly", - "evs": {"atk": 252, "def": 4, "spe": 252}, - "moves": [["Population Bomb"], ["Feint"], ["Encore"], ["Tickle", "Tidy Up"]], - "weight": 100 - } - ] - }, - "Meowscarada": { - "weight": 7, - "sets": [ - { - "species": "Meowscarada", - "item": "Choice Band", - "ability": "Protean", - "nature": "Jolly", - "evs": {"atk": 252, "spd": 4, "spe": 252}, - "moves": [["Flower Trick"], ["Knock Off"], ["Triple Axel"], ["Giga Impact", "Low Kick", "Play Rough"]], - "weight": 100 - } - ] - }, - "Metagross": { - "weight": 9, - "sets": [ - { - "species": "Metagross", - "item": "Weakness Policy", - "ability": "Clear Body", - "nature": "Impish", - "evs": {"hp": 248, "atk": 100, "def": 116, "spd": 44}, - "moves": [["Heavy Slam"], ["Bullet Punch"], ["Earthquake"], ["Psychic Fangs"]], - "weight": 40 - }, - { - "species": "Metagross", - "item": "Assault Vest", - "ability": "Clear Body", - "nature": "Impish", - "evs": {"hp": 252, "atk": 108, "def": 116, "spd": 32}, - "moves": [["Heavy Slam"], ["Psychic Fangs"], ["Earthquake"], ["Bullet Punch"]], - "weight": 40 - }, - { - "species": "Metagross", - "item": "Air Balloon", - "ability": "Clear Body", - "nature": "Impish", - "evs": {"hp": 248, "atk": 28, "def": 136, "spe": 96}, - "moves": [["Iron Defense"], ["Body Press"], ["Heavy Slam"], ["Bullet Punch"]], - "weight": 20 - } - ] - }, - "Moltres-Galar": { - "weight": 5, - "sets": [ - { - "species": "Moltres-Galar", - "item": "Custap Berry", - "ability": "Berserk", - "nature": "Modest", - "evs": {"hp": 248, "def": 148, "spa": 104, "spd": 8}, - "moves": [["Hurricane"], ["Fiery Wrath"], ["Endure"], ["Nasty Plot"]], - "weight": 40 - }, - { - "species": "Moltres-Galar", - "item": "Life Orb", - "ability": "Berserk", - "nature": "Modest", - "evs": {"atk": 4, "def": 232, "spa": 96, "spe": 176}, - "moves": [["Fiery Wrath"], ["Hurricane"], ["Taunt", "Sucker Punch"], ["Nasty Plot"]], - "weight": 30 - }, - { - "species": "Moltres-Galar", - "item": "Weakness Policy", - "ability": "Berserk", - "nature": "Modest", - "evs": {"hp": 240, "def": 216, "spa": 36, "spd": 16}, - "moves": [["Fiery Wrath"], ["Hurricane"], ["Sucker Punch"], ["Air Slash", "Nasty Plot", "Taunt"]], - "weight": 30 - } - ] - }, - "Ninetales-Alola": { - "weight": 8, - "sets": [ - { - "species": "Ninetales-Alola", - "item": "Leftovers", - "ability": "Snow Warning", - "nature": "Timid", - "evs": {"hp": 216, "def": 40, "spe": 252}, - "moves": [["Protect"], ["Encore"], ["Disable"], ["Moonblast"]], - "weight": 80 - }, - { - "species": "Ninetales-Alola", - "item": "Life Orb", - "ability": "Snow Warning", - "nature": "Timid", - "evs": {"hp": 208, "spa": 100, "spe": 200}, - "moves": [["Calm Mind"], ["Freeze-Dry"], ["Blizzard"], ["Moonblast"]], - "weight": 20 - } - ] - }, - "Ogerpon-Wellspring": { - "weight": 8, - "sets": [ - { - "species": "Ogerpon-Wellspring", - "item": "Wellspring Mask", - "ability": "Water Absorb", - "nature": "Jolly", - "evs": {"hp": 248, "atk": 8, "spe": 252}, - "moves": [["Spiky Shield"], ["Ivy Cudgel", "Power Whip"], ["Leech Seed"], ["Substitute"]], - "weight": 40 - }, - { - "species": "Ogerpon-Wellspring", - "item": "Wellspring Mask", - "ability": "Water Absorb", - "nature": "Jolly", - "evs": {"atk": 252, "def": 4, "spe": 252}, - "moves": [["Power Whip"], ["Ivy Cudgel"], ["Encore"], ["Trailblaze", "Rock Tomb"]], - "weight": 20 - }, - { - "species": "Ogerpon-Wellspring", - "item": "Wellspring Mask", - "ability": "Water Absorb", - "nature": "Adamant", - "evs": {"hp": 200, "atk": 192, "spe": 116}, - "moves": [["Power Whip"], ["Ivy Cudgel"], ["Knock Off"], ["Low Kick", "Play Rough", "Encore"]], - "weight": 20 - }, - { - "species": "Ogerpon-Wellspring", - "item": "Wellspring Mask", - "ability": "Water Absorb", - "nature": "Impish", - "evs": {"hp": 252, "atk": 80, "def": 144, "spe": 32}, - "moves": [["Trailblaze"], ["Counter"], ["Encore"], ["Ivy Cudgel"]], - "weight": 20 - } - ] - }, - "Okidogi": { - "weight": 1, - "sets": [ - { - "species": "Okidogi", - "item": "Choice Band", - "ability": "Toxic Chain", - "nature": "Adamant", - "evs": {"hp": 216, "atk": 164, "spd": 28, "spe": 100}, - "moves": [["Gunk Shot"], ["Low Kick"], ["Knock Off"], ["Outrage"]], - "weight": 50 - }, - { - "species": "Okidogi", - "item": "Assault Vest", - "ability": "Toxic Chain", - "nature": "Adamant", - "evs": {"hp": 104, "atk": 92, "spd": 96, "spe": 216}, - "moves": [["Gunk Shot"], ["Close Combat"], ["Poison Jab"], ["Counter"]], - "weight": 50 - } - ] - }, - "Pecharunt": { - "weight": 9, - "sets": [ - { - "species": "Pecharunt", - "item": "Maranga Berry", - "ability": "Poison Puppeteer", - "nature": "Calm", - "evs": {"hp": 248, "def": 4, "spd": 220, "spe": 36}, - "moves": [["Malignant Chain"], ["Curse"], ["Recover"], ["Parting Shot"]], - "weight": 50 - }, - { - "species": "Pecharunt", - "item": "Air Balloon", - "ability": "Poison Puppeteer", - "nature": "Bold", - "evs": {"hp": 248, "def": 224, "spe": 36}, - "moves": [["Malignant Chain"], ["Curse"], ["Parting Shot"], ["Recover"]], - "weight": 50 - } - ] - }, "Porygon-Z": { "weight": 3, "sets": [ @@ -1329,7 +1190,7 @@ "nature": "Modest", "evs": {"hp": 132, "def": 16, "spa": 160, "spd": 12, "spe": 188}, "moves": [["Hyper Beam"], ["Uproar"], ["Dark Pulse"], ["Thunderbolt"]], - "weight": 40 + "weight": 50 }, { "species": "Porygon-Z", @@ -1338,131 +1199,7 @@ "nature": ["Timid", "Modest"], "evs": {"hp": 12, "spa": 208, "spd": 36, "spe": 252}, "moves": [["Hyper Beam"], ["Ice Beam"], ["Dark Pulse"], ["Trick"]], - "weight": 40 - }, - { - "species": "Porygon-Z", - "item": "Custap Berry", - "ability": "Adaptability", - "nature": "Modest", - "evs": {"hp": 240, "spa": 252, "spe": 16}, - "moves": [["Nasty Plot"], ["Uproar"], ["Hyper Beam"], ["Endure"]], - "weight": 20 - } - ] - }, - "Porygon2": { - "weight": 1, - "sets": [ - { - "species": "Porygon2", - "item": "Eviolite", - "ability": "Analytic", - "nature": "Bold", - "evs": {"hp": 136, "def": 244, "spa": 128}, - "moves": [["Hyper Beam"], ["Ice Beam"], ["Eerie Impulse"], ["Recover"]], - "weight": 100 - } - ] - }, - "Primarina": { - "weight": 10, - "sets": [ - { - "species": "Primarina", - "item": "Life Orb", - "ability": "Torrent", - "nature": "Modest", - "evs": {"def": 136, "spa": 120, "spe": 252}, - "moves": [["Encore"], ["Icy Wind"], ["Moonblast"], ["Hydro Cannon"]], - "weight": 25 - }, - { - "species": "Primarina", - "item": "Weakness Policy", - "ability": "Torrent", - "nature": "Bold", - "evs": {"hp": 88, "def": 244, "spe": 176}, - "moves": [["Hydro Cannon"], ["Draining Kiss", "Moonblast"], ["Calm Mind"], ["Charm", "Reflect"]], - "weight": 25 - }, - { - "species": "Primarina", - "item": "Custap Berry", - "ability": "Torrent", - "nature": "Modest", - "evs": {"hp": 144, "def": 216, "spa": 148}, - "moves": [["Hydro Cannon"], ["Moonblast"], ["Endure"], ["Encore", "Calm Mind"]], - "weight": 25 - }, - { - "species": "Primarina", - "item": "Choice Specs", - "ability": "Liquid Voice", - "nature": "Modest", - "evs": {"hp": 252, "def": 160, "spa": 24, "spd": 72}, - "moves": [["Hydro Cannon"], ["Moonblast"], ["Energy Ball"], ["Uproar"]], - "weight": 25 - } - ] - }, - "Raging Bolt": { - "weight": 8, - "sets": [ - { - "species": "Raging Bolt", - "item": "Booster Energy", - "ability": "Protosynthesis", - "nature": "Modest", - "evs": {"hp": 240, "def": 24, "spa": 240}, - "moves": [["Thunderbolt"], ["Draco Meteor"], ["Thunderclap"], ["Taunt"]], "weight": 50 - }, - { - "species": "Raging Bolt", - "item": "Booster Energy", - "ability": "Protosynthesis", - "nature": "Modest", - "evs": {"hp": 96, "spa": 232, "spd": 44, "spe": 136}, - "moves": [["Thunderbolt"], ["Draco Meteor"], ["Thunderclap"], ["Calm Mind", "Taunt"]], - "weight": 50 - } - ] - }, - "Registeel": { - "weight": 5, - "sets": [ - { - "species": "Registeel", - "item": "Leftovers", - "ability": "Clear Body", - "nature": "Timid", - "evs": {"hp": 252, "def": 4, "spe": 252}, - "moves": [["Iron Defense"], ["Amnesia"], ["Rest"], ["Body Press"]], - "weight": 100 - } - ] - }, - "Rhyperior": { - "weight": 2, - "sets": [ - { - "species": "Rhyperior", - "item": "Custap Berry", - "ability": "Solid Rock", - "nature": "Adamant", - "evs": {"hp": 72, "atk": 252, "def": 184}, - "moves": [["Earthquake"], ["Rock Wrecker"], ["Endure"], ["Swords Dance"]], - "weight": 60 - }, - { - "species": "Rhyperior", - "item": "Choice Band", - "ability": "Solid Rock", - "nature": "Adamant", - "evs": {"hp": 248, "atk": 252, "def": 8}, - "moves": [["Earthquake"], ["Rock Wrecker"], ["Rock Blast"], ["Avalanche"]], - "weight": 40 } ] }, @@ -1498,49 +1235,457 @@ } ] }, - "Roaring Moon": { - "weight": 7, + "Scizor": { + "weight": 3, "sets": [ { - "species": "Roaring Moon", - "item": "Booster Energy", - "ability": "Protosynthesis", - "nature": "Jolly", - "evs": {"hp": 8, "atk": 156, "spd": 160, "spe": 184}, - "moves": [["Outrage"], ["Knock Off"], ["Acrobatics", "Dragon Dance"], ["Substitute"]], + "species": "Scizor", + "item": "Choice Band", + "ability": "Technician", + "nature": "Adamant", + "evs": {"hp": 228, "atk": 252, "spd": 28}, + "moves": [["Bullet Punch"], ["Bug Bite"], ["Close Combat", "Dual Wingbeat"], ["Knock Off"]], "weight": 50 }, { - "species": "Roaring Moon", - "item": "Choice Band", - "ability": "Protosynthesis", - "nature": "Jolly", - "evs": {"atk": 252, "spd": 4, "spe": 252}, - "moves": [["Outrage"], ["Knock Off"], ["Earthquake"], ["Iron Head"]], + "species": "Scizor", + "item": "Life Orb", + "ability": "Technician", + "nature": "Adamant", + "evs": {"hp": 228, "atk": 60, "def": 136, "spd": 84}, + "moves": [["Bullet Punch"], ["Swords Dance"], ["Dual Wingbeat"], ["Close Combat"]], "weight": 50 } ] }, - "Sableye": { - "weight": 1, + "Serperior": { + "weight": 3, "sets": [ { - "species": "Sableye", - "item": "Choice Scarf", - "ability": "Prankster", - "nature": "Impish", - "evs": {"hp": 252, "def": 252, "spd": 4}, - "moves": [["Trick"], ["Disable"], ["Recover"], ["Fling"]], + "species": "Serperior", + "item": "Leftovers", + "ability": "Contrary", + "nature": "Timid", + "evs": {"hp": 252, "spa": 4, "spe": 252}, + "moves": [["Protect"], ["Substitute"], ["Leech Seed"], ["Leaf Storm"]], + "weight": 100 + } + ] + }, + "Arcanine-Hisui": { + "weight": 3, + "sets": [ + { + "species": "Arcanine-Hisui", + "item": "Choice Band", + "ability": "Rock Head", + "nature": ["Adamant", "Jolly"], + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "moves": [["Head Smash"], ["Flare Blitz"], ["Close Combat"], ["Outrage", "Iron Head"]], "weight": 50 }, { - "species": "Sableye", + "species": "Arcanine-Hisui", + "item": "Choice Scarf", + "ability": "Rock Head", + "nature": "Adamant", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "moves": [["Head Smash"], ["Flare Blitz"], ["Close Combat"], ["Outrage"]], + "weight": 50 + } + ] + }, + "Bellibolt": { + "weight": 3, + "sets": [ + { + "species": "Bellibolt", + "item": "Life Orb", + "ability": "Electromorphosis", + "nature": "Quiet", + "evs": {"hp": 240, "def": 80, "spa": 136, "spd": 52}, + "moves": [["Thunder"], ["Parabolic Charge"], ["Sucker Punch"], ["Soak"]], + "weight": 100 + } + ] + }, + "Florges": { + "weight": 3, + "sets": [ + { + "species": "Florges", + "item": ["Clear Amulet", "Leftovers"], + "ability": "Flower Veil", + "nature": "Bold", + "evs": {"hp": 108, "def": 252, "spe": 148}, + "moves": [["Calm Mind"], ["Synthesis"], ["Moonblast"], ["Charm"]], + "weight": 50 + }, + { + "species": "Florges", + "item": "Choice Scarf", + "ability": "Flower Veil", + "nature": "Timid", + "evs": {"hp": 88, "def": 232, "spe": 188}, + "moves": [["Moonblast"], ["Trick"], ["Synthesis"], ["Calm Mind"]], + "weight": 50 + } + ] + }, + "Landorus": { + "weight": 3, + "sets": [ + { + "species": "Landorus", + "item": "Life Orb", + "ability": "Sheer Force", + "nature": "Timid", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "moves": [["Earth Power"], ["Sludge Wave"], ["Focus Blast", "Taunt"], ["Smack Down", "Rock Slide"]], + "weight": 100 + } + ] + }, + "Rhyperior": { + "weight": 3, + "sets": [ + { + "species": "Rhyperior", + "item": "Choice Band", + "ability": "Solid Rock", + "nature": "Adamant", + "evs": {"hp": 248, "atk": 252, "def": 8}, + "moves": [["Earthquake"], ["Rock Wrecker"], ["Rock Blast"], ["Avalanche"]], + "weight": 100 + } + ] + }, + "Ursaluna-Bloodmoon": { + "weight": 3, + "sets": [ + { + "species": "Ursaluna-Bloodmoon", + "item": "Chople Berry", + "ability": "Mind's Eye", + "nature": "Modest", + "evs": {"hp": 252, "def": 156, "spa": 100}, + "moves": [["Blood Moon"], ["Earth Power"], ["Counter"], ["Vacuum Wave"]], + "weight": 50 + }, + { + "species": "Ursaluna-Bloodmoon", + "item": "Choice Specs", + "ability": "Mind's Eye", + "nature": "Modest", + "evs": {"hp": 252, "def": 52, "spa": 112, "spd": 92}, + "moves": [["Hyper Beam"], ["Snarl", "Vacuum Wave"], ["Earth Power"], ["Uproar"]], + "weight": 50 + } + ] + }, + "Whimsicott": { + "weight": 3, + "sets": [ + { + "species": "Whimsicott", + "item": ["Babiri Berry", "Mental Herb"], + "ability": "Prankster", + "nature": "Bold", + "evs": {"hp": 248, "def": 232, "spd": 28}, + "moves": [["Leech Seed"], ["Substitute"], ["Protect"], ["Taunt"]], + "weight": 100 + } + ] + }, + "Baxcalibur": { + "weight": 2, + "sets": [ + { + "species": "Baxcalibur", + "item": "Choice Band", + "ability": "Thermal Exchange", + "nature": "Adamant", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "moves": [["Outrage"], ["Icicle Crash", "Icicle Spear"], ["Earthquake"], ["Ice Shard", "Scale Shot", "Iron Head"]], + "weight": 100 + } + ] + }, + "Fezandipiti": { + "weight": 2, + "sets": [ + { + "species": "Fezandipiti", + "item": "Life Orb", + "ability": "Technician", + "nature": "Adamant", + "evs": {"hp": 88, "atk": 220, "spd": 136, "spe": 64}, + "moves": [["Gunk Shot"], ["Play Rough"], ["Dual Wingbeat"], ["Swords Dance"]], + "weight": 60 + }, + { + "species": "Fezandipiti", + "item": "Air Balloon", + "ability": "Toxic Chain", + "nature": "Calm", + "evs": {"hp": 252, "def": 124, "spd": 80, "spe": 52}, + "moves": [["Charm"], ["Moonblast"], ["Icy Wind"], ["Roost"]], + "weight": 40 + } + ] + }, + "Greninja": { + "weight": 2, + "sets": [ + { + "species": "Greninja", + "item": "Choice Specs", + "ability": "Protean", + "nature": "Timid", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "moves": [["Ice Beam"], ["Hydro Cannon"], ["Sludge Wave"], ["Dark Pulse", "Grass Knot"]], + "weight": 60 + }, + { + "species": "Greninja", + "item": "Life Orb", + "ability": "Protean", + "nature": "Hasty", + "evs": {"atk": 252, "spa": 8, "spd": 64, "spe": 184}, + "moves": [["Gunk Shot"], ["Hydro Cannon"], ["U-turn"], ["Shadow Sneak"]], + "weight": 40 + } + ] + }, + "Iron Treads": { + "weight": 2, + "sets": [ + { + "species": "Iron Treads", + "item": "Choice Band", + "ability": "Quark Drive", + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "moves": [["Heavy Slam"], ["Earthquake"], ["Megahorn"], ["Ice Spinner"]], + "weight": 70 + }, + { + "species": "Iron Treads", + "item": "Booster Energy", + "ability": "Quark Drive", + "nature": "Jolly", + "evs": {"hp": 252, "atk": 116, "def": 60, "spe": 80}, + "moves": [["Iron Defense"], ["Body Press"], ["Earthquake"], ["Heavy Slam"]], + "weight": 30 + } + ] + }, + "Ting-Lu": { + "weight": 2, + "sets": [ + { + "species": "Ting-Lu", + "item": "Weakness Policy", + "ability": "Vessel of Ruin", + "nature": "Impish", + "evs": {"hp": 80, "atk": 176, "def": 4, "spd": 204, "spe": 44}, + "moves": [["Taunt", "Ruination"], ["Heavy Slam"], ["Earthquake"], ["Payback"]], + "weight": 100 + } + ] + }, + "Avalugg-Hisui": { + "weight": 2, + "sets": [ + { + "species": "Avalugg-Hisui", + "item": "Choice Band", + "ability": "Sturdy", + "nature": "Adamant", + "evs": {"atk": 252, "def": 4, "spe": 252}, + "moves": [["Avalanche"], ["Heavy Slam"], ["Rock Blast", "Stone Edge"], ["Earthquake", "Mirror Coat", "Icicle Spear"]], + "weight": 100 + } + ] + }, + "Zapdos-Galar": { + "weight": 2, + "sets": [ + { + "species": "Zapdos-Galar", + "item": "Assault Vest", + "ability": "Defiant", + "nature": "Adamant", + "evs": {"hp": 144, "atk": 68, "def": 4, "spd": 56, "spe": 236}, + "moves": [["Thunderous Kick"], ["Close Combat"], ["Brave Bird"], ["Knock Off"]], + "weight": 100 + } + ] + }, + "Tinkaton": { + "weight": 2, + "sets": [ + { + "species": "Tinkaton", + "item": "Life Orb", + "ability": "Mold Breaker", + "nature": "Adamant", + "evs": {"hp": 112, "atk": 232, "def": 16, "spd": 4, "spe": 144}, + "moves": [["Play Rough"], ["Gigaton Hammer"], ["Encore"], ["Swords Dance"]], + "weight": 50 + }, + { + "species": "Tinkaton", + "item": "Air Balloon", + "ability": "Mold Breaker", + "nature": "Adamant", + "evs": {"hp": 156, "atk": 220, "spd": 68, "spe": 64}, + "moves": [["Play Rough"], ["Gigaton Hammer"], ["Encore"], ["Swords Dance"]], + "weight": 50 + } + ] + }, + "Heatran": { + "weight": 2, + "sets": [ + { + "species": "Heatran", + "item": "Air Balloon", + "ability": "Flash Fire", + "nature": "Modest", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "moves": [["Overheat"], ["Flash Cannon"], ["Substitute", "Earth Power"], ["Metal Sound"]], + "weight": 100 + } + ] + }, + "Iron Bundle": { + "weight": 2, + "sets": [ + { + "species": "Iron Bundle", + "item": "Booster Energy", + "ability": "Quark Drive", + "nature": "Modest", + "evs": {"hp": 28, "spa": 116, "spd": 216, "spe": 148}, + "moves": [["Thief"], ["Hydro Pump"], ["Freeze-Dry"], ["Encore"]], + "weight": 50 + }, + { + "species": "Iron Bundle", + "item": "Choice Specs", + "ability": "Quark Drive", + "nature": "Timid", + "evs": {"hp": 44, "def": 152, "spa": 144, "spe": 168}, + "moves": [["Ice Beam"], ["Freeze-Dry"], ["Hydro Pump"], ["Chilling Water"]], + "weight": 50 + } + ] + }, + "Sandy Shocks": { + "weight": 1, + "sets": [ + { + "species": "Sandy Shocks", + "item": "Booster Energy", + "ability": "Protosynthesis", + "nature": "Timid", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "moves": [["Earth Power"], ["Thunderbolt"], ["Power Gem"], ["Metal Sound"]], + "weight": 50 + }, + { + "species": "Sandy Shocks", + "item": "Choice Specs", + "ability": "Protosynthesis", + "nature": "Timid", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "moves": [["Earth Power"], ["Thunderbolt"], ["Power Gem"], ["Hyper Beam"]], + "weight": 50 + } + ] + }, + "Ceruledge": { + "weight": 1, + "sets": [ + { + "species": "Ceruledge", + "item": "Weakness Policy", + "ability": "Weak Armor", + "nature": "Adamant", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "moves": [["Endure"], ["Flare Blitz"], ["Close Combat"], ["Poltergeist"]], + "weight": 100 + } + ] + }, + "Klefki": { + "weight": 1, + "sets": [ + { + "species": "Klefki", "item": "Leftovers", "ability": "Prankster", "nature": "Bold", - "evs": {"hp": 252, "def": 252, "spd": 4}, - "moves": [["Protect"], ["Encore"], ["Disable"], ["Recover"]], - "weight": 50 + "evs": {"hp": 200, "def": 128, "spa": 24, "spd": 156}, + "moves": [["Draining Kiss"], ["Iron Defense"], ["Calm Mind"], ["Stored Power"]], + "weight": 100 + } + ] + }, + "Blastoise": { + "weight": 1, + "sets": [ + { + "species": "Blastoise", + "item": "Life Orb", + "ability": "Torrent", + "nature": "Bold", + "evs": {"hp": 132, "def": 136, "spa": 128, "spe": 112}, + "moves": [["Shell Smash"], ["Hydro Cannon"], ["Ice Beam"], ["Substitute"]], + "weight": 100 + } + ] + }, + "Maushold": { + "weight": 1, + "sets": [ + { + "species": "Maushold-Four", + "item": "Wide Lens", + "ability": "Technician", + "nature": "Jolly", + "evs": {"atk": 252, "def": 4, "spe": 252}, + "moves": [["Population Bomb"], ["Encore"], ["Tidy Up"], ["Tickle"]], + "weight": 100 + } + ] + }, + "Blaziken": { + "weight": 1, + "sets": [ + { + "species": "Blaziken", + "item": "Liechi Berry", + "ability": "Speed Boost", + "nature": "Adamant", + "evs": {"atk": 252, "def": 4, "spe": 252}, + "moves": [["Endure"], ["Flare Blitz"], ["Reversal"], ["Swords Dance"]], + "weight": 100 + } + ] + }, + "Tauros-Paldea-Blaze": { + "weight": 1, + "sets": [ + { + "species": "Tauros-Paldea-Blaze", + "item": "Weakness Policy", + "ability": "Intimidate", + "nature": "Adamant", + "evs": {"hp": 168, "atk": 76, "def": 32, "spe": 232}, + "moves": [["Close Combat"], ["Flare Blitz"], ["Bulk Up"], ["Will-O-Wisp"]], + "weight": 100 } ] }, @@ -1567,305 +1712,20 @@ } ] }, - "Salazzle": { + "Torterra": { "weight": 1, "sets": [ { - "species": "Salazzle", - "item": "Leftovers", - "ability": "Oblivious", - "nature": "Timid", - "evs": {"hp": 136, "spd": 120, "spe": 252}, - "moves": [["Protect"], ["Encore"], ["Disable"], ["Flamethrower"]], - "weight": 100 - } - ] - }, - "Sandy Shocks": { - "weight": 1, - "sets": [ - { - "species": "Sandy Shocks", - "item": "Booster Energy", - "ability": "Protosynthesis", - "nature": "Timid", - "evs": {"spa": 252, "spd": 4, "spe": 252}, - "moves": [["Earth Power"], ["Thunderbolt"], ["Power Gem"], ["Protect", "Metal Sound"]], - "weight": 50 - }, - { - "species": "Sandy Shocks", - "item": "Choice Specs", - "ability": "Protosynthesis", - "nature": "Timid", - "evs": {"spa": 252, "spd": 4, "spe": 252}, - "moves": [["Earth Power"], ["Thunderbolt"], ["Power Gem"], ["Hyper Beam"]], - "weight": 50 - } - ] - }, - "Scizor": { - "weight": 3, - "sets": [ - { - "species": "Scizor", - "item": "Choice Band", - "ability": "Technician", - "nature": "Adamant", - "evs": {"hp": 228, "atk": 252, "spd": 28}, - "moves": [["Bullet Punch"], ["Bug Bite"], ["Close Combat", "Dual Wingbeat"], ["Knock Off"]], - "weight": 50 - }, - { - "species": "Scizor", + "species": "Torterra", "item": "Life Orb", - "ability": "Technician", + "ability": "Overgrow", "nature": "Adamant", - "evs": {"hp": 228, "atk": 60, "def": 136, "spd": 84}, - "moves": [["Bullet Punch"], ["Swords Dance"], ["Dual Wingbeat"], ["Close Combat"]], - "weight": 50 - } - ] - }, - "Serperior": { - "weight": 2, - "sets": [ - { - "species": "Serperior", - "item": "Leftovers", - "ability": "Contrary", - "nature": "Timid", - "evs": {"hp": 252, "spa": 4, "spe": 252}, - "moves": [["Protect"], ["Substitute"], ["Leech Seed"], ["Leaf Storm"]], + "evs": {"hp": 152, "atk": 16, "spd": 132, "spe": 208}, + "moves": [["Shell Smash"], ["Wood Hammer"], ["Substitute"], ["Headlong Rush"]], "weight": 100 } ] }, - "Sinistcha": { - "weight": 1, - "sets": [ - { - "species": "Sinistcha", - "item": "Clear Amulet", - "ability": "Heatproof", - "nature": "Timid", - "evs": {"hp": 252, "def": 80, "spe": 176}, - "moves": [["Iron Defense"], ["Calm Mind"], ["Strength Sap"], ["Shadow Ball"]], - "weight": 100 - } - ] - }, - "Skeledirge": { - "weight": 5, - "sets": [ - { - "species": "Skeledirge", - "item": "Custap Berry", - "ability": "Blaze", - "nature": "Modest", - "evs": {"hp": 248, "def": 64, "spa": 160, "spd": 36}, - "moves": [["Torch Song"], ["Endure"], ["Blast Burn"], ["Encore"]], - "weight": 40 - }, - { - "species": "Skeledirge", - "item": "Weakness Policy", - "ability": "Unaware", - "nature": "Bold", - "evs": {"hp": 248, "def": 100, "spa": 124, "spd": 36}, - "moves": [["Shadow Ball"], ["Blast Burn"], ["Torch Song"], ["Encore"]], - "weight": 40 - }, - { - "species": "Skeledirge", - "item": "Air Balloon", - "ability": "Unaware", - "nature": "Bold", - "evs": {"hp": 248, "def": 252, "spe": 8}, - "moves": [["Will-O-Wisp"], ["Torch Song"], ["Encore"], ["Slack Off", "Blast Burn"]], - "weight": 20 - } - ] - }, - "Slaking": { - "weight": 1, - "sets": [ - { - "species": "Slaking", - "item": "Choice Band", - "ability": "Truant", - "nature": "Jolly", - "evs": {"atk": 252, "spd": 4, "spe": 252}, - "moves": [["Giga Impact"], ["Earthquake"], ["Ice Punch"], ["Low Kick", "Heavy Slam"]], - "weight": 100 - } - ] - }, - "Sneasler": { - "weight": 5, - "sets": [ - { - "species": "Sneasler", - "item": "Normal Gem", - "ability": "Unburden", - "nature": "Adamant", - "evs": {"hp": 160, "atk": 252, "def": 44, "spd": 4, "spe": 48}, - "moves": [["Fake Out"], ["Gunk Shot"], ["Close Combat"], ["Feint"]], - "weight": 50 - }, - { - "species": "Sneasler", - "item": "Liechi Berry", - "ability": "Unburden", - "nature": ["Adamant", "Jolly"], - "evs": {"atk": 252, "spd": 4, "spe": 252}, - "moves": [["Endure"], ["Gunk Shot"], ["Reversal"], ["Taunt", "Substitute"]], - "weight": 50 - } - ] - }, "Spectrier": { - "weight": 9, - "sets": [ - { - "species": "Spectrier", - "item": "Life Orb", - "ability": "Grim Neigh", - "nature": "Timid", - "evs": {"hp": 4, "def": 124, "spa": 180, "spe": 200}, - "moves": [["Hex"], ["Hyper Beam"], ["Will-O-Wisp"], ["Calm Mind"]], - "weight": 50 - }, - { - "species": "Spectrier", - "item": "Sitrus Berry", - "ability": "Grim Neigh", - "nature": "Modest", - "evs": {"hp": 196, "def": 68, "spa": 4, "spd": 20, "spe": 220}, - "moves": [["Calm Mind"], ["Will-O-Wisp"], ["Hex"], ["Taunt", "Draining Kiss", "Disable"]], - "weight": 30 - }, - { - "species": "Spectrier", - "item": "Clear Amulet", - "ability": "Grim Neigh", - "nature": "Calm", - "evs": {"hp": 36, "spd": 252, "spe": 220}, - "moves": [["Calm Mind"], ["Pain Split"], ["Shadow Ball"], ["Taunt"]], - "weight": 20 - } - ] - }, - "Suicune": { - "weight": 1, - "sets": [ - { - "species": "Suicune", - "item": "Leftovers", - "ability": "Pressure", - "nature": "Timid", - "evs": {"hp": 240, "def": 8, "spd": 8, "spe": 252}, - "moves": [["Calm Mind"], ["Chilling Water"], ["Substitute"], ["Protect"]], - "weight": 100 - } - ] - }, - "Sylveon": { - "weight": 7, - "sets": [ - { - "species": "Sylveon", - "item": "Life Orb", - "ability": "Pixilate", - "nature": "Modest", - "evs": {"hp": 104, "def": 224, "spa": 180}, - "moves": [["Hyper Beam"], ["Hyper Voice"], ["Calm Mind"], ["Quick Attack", "Fake Tears", "Shadow Ball", "Psyshock"]], - "weight": 40 - }, - { - "species": "Sylveon", - "item": "Custap Berry", - "ability": "Pixilate", - "nature": "Modest", - "evs": {"hp": 96, "def": 164, "spa": 248}, - "moves": [["Hyper Beam"], ["Hyper Voice"], ["Fake Tears"], ["Endure"]], - "weight": 40 - }, - { - "species": "Sylveon", - "item": "Weakness Policy", - "ability": "Pixilate", - "nature": "Bold", - "evs": {"hp": 88, "def": 244, "spe": 176}, - "moves": [["Calm Mind"], ["Hyper Beam"], ["Draining Kiss"], ["Charm"]], - "weight": 20 - } - ] - }, - "Talonflame": { - "weight": 1, - "sets": [ - { - "species": "Talonflame", - "item": "Choice Band", - "ability": "Gale Wings", - "nature": "Adamant", - "evs": {"hp": 8, "atk": 184, "def": 72, "spe": 244}, - "moves": [["Brave Bird"], ["Flare Blitz"], ["U-turn"], ["Steel Wing"]], - "weight": 100 - } - ] - }, - "Tauros-Paldea-Blaze": { - "weight": 1, - "sets": [ - { - "species": "Tauros-Paldea-Blaze", - "item": "Weakness Policy", - "ability": "Intimidate", - "nature": "Adamant", - "evs": {"hp": 168, "atk": 76, "def": 32, "spe": 232}, - "moves": [["Close Combat"], ["Flare Blitz"], ["Bulk Up"], ["Will-O-Wisp"]], - "weight": 100 - } - ] - }, - "Ting-Lu": { - "weight": 2, - "sets": [ - { - "species": "Ting-Lu", - "item": "Weakness Policy", - "ability": "Vessel of Ruin", - "nature": "Impish", - "evs": {"hp": 80, "atk": 176, "def": 4, "spd": 204, "spe": 44}, - "moves": [["Taunt", "Ruination"], ["Heavy Slam"], ["Earthquake"], ["Payback"]], - "weight": 100 - } - ] - }, - "Tinkaton": { - "weight": 1, - "sets": [ - { - "species": "Tinkaton", - "item": "Life Orb", - "ability": "Mold Breaker", - "nature": "Adamant", - "evs": {"hp": 112, "atk": 232, "def": 16, "spd": 4, "spe": 144}, - "moves": [["Play Rough"], ["Gigaton Hammer"], ["Encore"], ["Swords Dance"]], - "weight": 50 - }, - { - "species": "Tinkaton", - "item": "Air Balloon", - "ability": "Mold Breaker", - "nature": "Adamant", - "evs": {"hp": 156, "atk": 220, "spd": 68, "spe": 64}, - "moves": [["Play Rough"], ["Gigaton Hammer"], ["Encore"], ["Swords Dance"]], - "weight": 50 - } - ] - }, "Torkoal": { "weight": 1, "sets": [ @@ -1880,16 +1740,175 @@ } ] }, - "Torterra": { + "Suicune": { "weight": 1, "sets": [ { - "species": "Torterra", - "item": "Life Orb", - "ability": "Overgrow", + "species": "Suicune", + "item": "Leftovers", + "ability": "Pressure", + "nature": "Timid", + "evs": {"hp": 240, "def": 8, "spd": 8, "spe": 252}, + "moves": [["Calm Mind"], ["Chilling Water"], ["Substitute"], ["Protect"]], + "weight": 100 + } + ] + }, + "Iron Boulder": { + "weight": 1, + "sets": [ + { + "species": "Iron Boulder", + "item": "Choice Band", + "ability": "Quark Drive", + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "moves": [["Mighty Cleave"], ["Zen Headbutt"], ["Sacred Sword"], ["Megahorn"]], + "weight": 100 + } + ] + }, + "Talonflame": { + "weight": 1, + "sets": [ + { + "species": "Talonflame", + "item": "Choice Band", + "ability": "Gale Wings", "nature": "Adamant", - "evs": {"hp": 152, "atk": 16, "spd": 132, "spe": 208}, - "moves": [["Shell Smash"], ["Wood Hammer"], ["Substitute"], ["Headlong Rush"]], + "evs": {"atk": 252, "def": 4, "spe": 252}, + "moves": [["Brave Bird"], ["Flare Blitz"], ["U-turn"], ["Fly", "Dual Wingbeat"]], + "weight": 100 + } + ] + }, + "Okidogi": { + "weight": 1, + "sets": [ + { + "species": "Okidogi", + "item": "Choice Band", + "ability": "Toxic Chain", + "nature": "Adamant", + "evs": {"hp": 216, "atk": 164, "spd": 28, "spe": 100}, + "moves": [["Gunk Shot"], ["Low Kick"], ["Knock Off"], ["Outrage"]], + "weight": 50 + }, + { + "species": "Okidogi", + "item": "Assault Vest", + "ability": "Toxic Chain", + "nature": "Adamant", + "evs": {"hp": 104, "atk": 92, "spd": 96, "spe": 216}, + "moves": [["Gunk Shot"], ["Close Combat"], ["Poison Jab"], ["Counter"]], + "weight": 50 + } + ] + }, + "Slaking": { + "weight": 1, + "sets": [ + { + "species": "Slaking", + "item": "Choice Band", + "ability": "Truant", + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "moves": [["Giga Impact"], ["Earthquake"], ["Ice Punch"], ["Low Kick", "Heavy Slam"]], + "weight": 100 + } + ] + }, + "Clodsire": { + "weight": 1, + "sets": [ + { + "species": "Clodsire", + "item": "Kee Berry", + "ability": "Unaware", + "nature": "Relaxed", + "evs": {"hp": 252, "def": 252, "spd": 4}, + "moves": [["Counter"], ["Amnesia"], ["Toxic"], ["Recover"]], + "weight": 100 + } + ] + }, + "Salazzle": { + "weight": 1, + "sets": [ + { + "species": "Salazzle", + "item": "Leftovers", + "ability": "Oblivious", + "nature": "Timid", + "evs": {"hp": 136, "spd": 120, "spe": 252}, + "moves": [["Protect"], ["Encore"], ["Disable"], ["Flamethrower"]], + "weight": 100 + } + ] + }, + "Sableye": { + "weight": 1, + "sets": [ + { + "species": "Sableye", + "item": "Choice Scarf", + "ability": "Prankster", + "nature": "Impish", + "evs": {"hp": 252, "def": 252, "spd": 4}, + "moves": [["Trick"], ["Disable"], ["Recover"], ["Fling"]], + "weight": 50 + }, + { + "species": "Sableye", + "item": "Leftovers", + "ability": "Prankster", + "nature": "Bold", + "evs": {"hp": 252, "def": 252, "spd": 4}, + "moves": [["Protect"], ["Encore"], ["Disable"], ["Night Shade"]], + "weight": 50 + } + ] + }, + "Grafaiai": { + "weight": 1, + "sets": [ + { + "species": "Grafaiai", + "item": "Lagging Tail", + "ability": "Prankster", + "nature": "Sassy", + "evs": {"hp": 248, "def": 96, "spd": 164}, + "moves": [["Dig"], ["Copycat"], ["Encore"], ["Poison Jab"]], + "ivs": {"spe": 0}, + "weight": 100 + } + ] + }, + "Latias": { + "weight": 1, + "sets": [ + { + "species": "Latias", + "item": "Weakness Policy", + "ability": "Levitate", + "nature": "Timid", + "evs": {"hp": 252, "spd": 4, "spe": 252}, + "moves": [["Reflect"], ["Calm Mind"], ["Stored Power"], ["Draco Meteor"]], + "weight": 100 + } + ] + }, + "Glastrier": { + "weight": 1, + "sets": [ + { + "species": "Glastrier", + "item": "Choice Band", + "ability": "Chilling Neigh", + "nature": "Adamant", + "evs": {"hp": 252, "atk": 252, "spd": 4}, + "moves": [["Avalanche"], ["Close Combat"], ["Heavy Slam"], ["High Horsepower", "Crunch"]], "weight": 100 } ] @@ -1908,315 +1927,139 @@ } ] }, - "Ursaluna": { - "weight": 10, - "sets": [ - { - "species": "Ursaluna", - "item": "Choice Band", - "ability": "Guts", - "nature": "Adamant", - "evs": {"hp": 184, "atk": 228, "spd": 96}, - "moves": [["Headlong Rush"], ["Giga Impact"], ["Gunk Shot"], ["Avalanche", "Ice Punch"]], - "weight": 25 - }, - { - "species": "Ursaluna", - "item": "Flame Orb", - "ability": "Guts", - "nature": "Adamant", - "evs": {"atk": 164, "spd": 92, "spe": 252}, - "moves": [["Facade"], ["Headlong Rush"], ["Swords Dance"], ["Protect"]], - "weight": 25 - }, - { - "species": "Ursaluna", - "item": "Custap Berry", - "ability": "Guts", - "nature": "Adamant", - "evs": {"hp": 184, "atk": 216, "spd": 108}, - "moves": [["Endure"], ["Headlong Rush"], ["Giga Impact"], ["Gunk Shot", "Swords Dance"]], - "weight": 25 - }, - { - "species": "Ursaluna", - "item": "Assault Vest", - "ability": "Guts", - "nature": "Adamant", - "evs": {"hp": 184, "atk": 188, "spd": 136}, - "moves": [["Giga Impact"], ["Earthquake"], ["Avalanche", "Counter"], ["Gunk Shot"]], - "weight": 25 - } - ] - }, - "Ursaluna-Bloodmoon": { - "weight": 2, - "sets": [ - { - "species": "Ursaluna-Bloodmoon", - "item": "Chople Berry", - "ability": "Mind's Eye", - "nature": "Modest", - "evs": {"hp": 252, "def": 156, "spa": 100}, - "moves": [["Blood Moon"], ["Earth Power"], ["Counter"], ["Vacuum Wave"]], - "weight": 50 - }, - { - "species": "Ursaluna-Bloodmoon", - "item": "Choice Specs", - "ability": "Mind's Eye", - "nature": "Modest", - "evs": {"hp": 252, "def": 52, "spa": 112, "spd": 92}, - "moves": [["Hyper Beam"], ["Snarl", "Vacuum Wave"], ["Earth Power"], ["Uproar"]], - "weight": 50 - } - ] - }, - "Urshifu": { - "weight": 8, - "sets": [ - { - "species": "Urshifu", - "item": "Life Orb", - "ability": "Unseen Fist", - "nature": "Jolly", - "evs": {"atk": 252, "spd": 4, "spe": 252}, - "moves": [["Bulk Up"], ["Wicked Blow"], ["Sucker Punch"], ["Close Combat", "Low Kick"]], - "weight": 40 - }, - { - "species": "Urshifu", - "item": "Custap Berry", - "ability": "Unseen Fist", - "nature": "Adamant", - "evs": {"hp": 128, "atk": 224, "spd": 156}, - "moves": [["Wicked Blow"], ["Reversal"], ["Endure"], ["Bulk Up", "Sucker Punch"]], - "weight": 40 - }, - { - "species": "Urshifu", - "item": "Assault Vest", - "ability": "Unseen Fist", - "nature": "Adamant", - "evs": {"hp": 160, "atk": 92, "def": 16, "spd": 160, "spe": 80}, - "moves": [["Wicked Blow"], ["Low Kick"], ["Rock Tomb"], ["Iron Head", "Sucker Punch", "U-turn"]], - "weight": 20 - } - ] - }, - "Urshifu-Rapid-Strike": { - "weight": 7, - "sets": [ - { - "species": "Urshifu-Rapid-Strike", - "item": "Choice Band", - "ability": "Unseen Fist", - "nature": "Adamant", - "evs": {"hp": 252, "atk": 220, "def": 32, "spd": 4}, - "moves": [["Surging Strikes"], ["Close Combat"], ["Low Kick", "Thunder Punch"], ["Iron Head", "Ice Spinner"]], - "weight": 30 - }, - { - "species": "Urshifu-Rapid-Strike", - "item": "Custap Berry", - "ability": "Unseen Fist", - "nature": "Adamant", - "evs": {"hp": 4, "atk": 208, "spd": 120, "spe": 176}, - "moves": [["Surging Strikes"], ["Reversal"], ["Bulk Up"], ["Endure"]], - "weight": 40 - }, - { - "species": "Urshifu-Rapid-Strike", - "item": "Life Orb", - "ability": "Unseen Fist", - "nature": "Jolly", - "evs": {"atk": 252, "def": 4, "spe": 252}, - "moves": [["Surging Strikes"], ["Close Combat"], ["Bulk Up"], ["Aqua Jet"]], - "weight": 30 - } - ] - }, - "Venusaur": { + "Carbink": { "weight": 1, "sets": [ { - "species": "Venusaur", - "item": "Custap Berry", - "ability": "Overgrow", - "nature": "Modest", - "evs": {"def": 208, "spa": 204, "spe": 96}, - "moves": [["Frenzy Plant"], ["Sludge Bomb"], ["Endure"], ["Acid Spray"]], + "species": "Carbink", + "item": "Shell Bell", + "ability": "Sturdy", + "nature": "Quirky", + "level": 1, + "evs": {}, + "moves": [["Endeavor"], ["Sand Tomb"], ["Sandstorm"], ["Trick Room", "Protect", "Moonblast"]], "weight": 100 } ] }, - "Volcanion": { - "weight": 7, + "Chansey": { + "weight": 1, "sets": [ { - "species": "Volcanion", - "item": "Life Orb", - "ability": "Water Absorb", - "nature": "Rash", - "evs": {"hp": 136, "atk": 8, "def": 88, "spa": 44, "spe": 232}, - "moves": [["Overheat"], ["Steam Eruption"], ["Sludge Bomb"], ["Flame Charge"]], - "weight": 50 - }, - { - "species": "Volcanion", - "item": "Assault Vest", - "ability": "Water Absorb", - "nature": "Modest", - "evs": {"hp": 244, "spa": 184, "spd": 80}, - "moves": [["Overheat"], ["Steam Eruption"], ["Sludge Wave"], ["Earth Power", "Flame Charge", "Focus Blast"]], - "weight": 25 - }, - { - "species": "Volcanion", - "item": "Air Balloon", - "ability": "Water Absorb", - "nature": "Modest", - "evs": {"hp": 136, "def": 88, "spa": 188, "spe": 96}, - "moves": [["Substitute"], ["Steam Eruption"], ["Overheat"], ["Sludge Wave"]], - "weight": 25 - } - ] - }, - "Volcarona": { - "weight": 8, - "sets": [ - { - "species": "Volcarona", - "item": "Life Orb", - "ability": "Swarm", - "nature": "Modest", - "evs": {"hp": 252, "def": 32, "spa": 12, "spd": 16, "spe": 196}, - "moves": [["Quiver Dance"], ["Bug Buzz"], ["Overheat"], ["Substitute"]], - "weight": 50 - }, - { - "species": "Volcarona", - "item": "Passho Berry", - "ability": "Swarm", - "nature": "Calm", - "evs": {"hp": 192, "spa": 76, "spd": 44, "spe": 196}, - "moves": [["Quiver Dance"], ["Overheat"], ["Bug Buzz"], ["Giga Drain"]], - "weight": 50 - } - ] - }, - "Walking Wake": { - "weight": 7, - "sets": [ - { - "species": "Walking Wake", - "item": "Booster Energy", - "ability": "Protosynthesis", - "nature": "Timid", - "evs": {"def": 4, "spa": 252, "spe": 252}, - "moves": [["Draco Meteor"], ["Hydro Pump"], ["Flamethrower", "Hurricane"], ["Aqua Jet"]], - "weight": 75 - }, - { - "species": "Walking Wake", - "item": "Booster Energy", - "ability": "Protosynthesis", - "nature": "Timid", - "evs": {"hp": 8, "def": 56, "spa": 192, "spe": 252}, - "moves": [["Draco Meteor"], ["Hydro Pump"], ["Hurricane"], ["Chilling Water"]], - "weight": 25 - } - ] - }, - "Whimsicott": { - "weight": 2, - "sets": [ - { - "species": "Whimsicott", - "item": ["Babiri Berry", "Mental Herb"], - "ability": "Prankster", + "species": "Chansey", + "item": "Eviolite", + "ability": "Natural Cure", "nature": "Bold", - "evs": {"hp": 248, "def": 232, "spd": 28}, - "moves": [["Leech Seed"], ["Substitute"], ["Protect"], ["Taunt"]], + "evs": {"hp": 252, "def": 252, "spd": 4}, + "moves": [["Seismic Toss"], ["Charm", "Defense Curl"], ["Soft-Boiled"], ["Thunder Wave"]], "weight": 100 } ] }, - "Zapdos": { - "weight": 8, + "Forretress": { + "weight": 1, "sets": [ { - "species": "Zapdos", - "item": "Clear Amulet", - "ability": "Pressure", - "nature": "Timid", - "evs": {"hp": 248, "spd": 84, "spe": 176}, - "moves": [["Hurricane"], ["Thunderbolt"], ["Eerie Impulse"], ["Roost"]], - "weight": 50 - }, - { - "species": "Zapdos", - "item": "Life Orb", - "ability": "Pressure", - "nature": "Timid", - "evs": {"hp": 8, "spa": 200, "spd": 48, "spe": 252}, - "moves": [["Hurricane"], ["Thunderbolt"], ["Charge"], ["Heat Wave"]], - "weight": 25 - }, - { - "species": "Zapdos", + "species": "Forretress", "item": "Leftovers", - "ability": "Pressure", - "nature": "Timid", - "evs": {"hp": 248, "spa": 8, "spe": 252}, - "moves": [["Protect"], ["Substitute"], ["Roost"], ["Thunderbolt"]], - "weight": 25 + "ability": "Sturdy", + "nature": "Impish", + "evs": {"hp": 248, "def": 252, "spd": 8}, + "moves": [["Iron Defense"], ["Body Press"], ["Rest"], ["Counter"]], + "weight": 100 } ] }, - "Zapdos-Galar": { - "weight": 2, + "Arcanine": { + "weight": 1, "sets": [ { - "species": "Zapdos-Galar", - "item": "Custap Berry", - "ability": "Defiant", - "nature": "Adamant", - "evs": {"atk": 252, "spd": 4, "spe": 252}, - "moves": [["Reversal"], ["Brave Bird"], ["Endure"], ["Knock Off", "Bulk Up", "Thunderous Kick"]], - "weight": 50 - }, - { - "species": "Zapdos-Galar", + "species": "Arcanine", "item": "Assault Vest", - "ability": "Defiant", + "ability": "Intimidate", + "nature": "Naughty", + "evs": {"hp": 224, "atk": 192, "spd": 36, "spe": 56}, + "moves": [["Flare Blitz"], ["Play Rough"], ["Extreme Speed"], ["Overheat"]], + "weight": 100 + } + ] + }, + "Porygon2": { + "weight": 1, + "sets": [ + { + "species": "Porygon2", + "item": "Eviolite", + "ability": "Analytic", + "nature": "Bold", + "evs": {"hp": 136, "def": 244, "spa": 128}, + "moves": [["Hyper Beam"], ["Ice Beam"], ["Eerie Impulse"], ["Recover"]], + "weight": 100 + } + ] + }, + "Avalugg": { + "weight": 1, + "sets": [ + { + "species": "Avalugg", + "item": "Choice Band", + "ability": "Sturdy", "nature": "Adamant", - "evs": {"hp": 144, "atk": 68, "def": 4, "spd": 56, "spe": 236}, - "moves": [["Thunderous Kick"], ["Close Combat"], ["Brave Bird"], ["Knock Off"]], + "evs": {"hp": 4, "atk": 252, "def": 252}, + "moves": [["Avalanche"], ["Body Press"], ["Heavy Slam"], ["Mirror Coat", "Earthquake"]], + "weight": 50 + }, + { + "species": "Avalugg", + "item": "Sitrus Berry", + "ability": "Sturdy", + "nature": "Impish", + "evs": {"hp": 252, "atk": 4, "def": 252}, + "moves": [["Body Press"], ["Iron Defense"], ["Recover"], ["Icicle Spear"]], "weight": 50 } ] }, - "Zarude": { - "weight": 5, + "Magnezone": { + "weight": 1, "sets": [ { - "species": "Zarude", - "item": "Weakness Policy", - "ability": "Leaf Guard", - "nature": "Jolly", - "evs": {"hp": 128, "atk": 144, "spd": 4, "spe": 232}, - "moves": [["Power Whip"], ["Knock Off"], ["Encore"], ["Bulk Up"]], - "weight": 50 - }, + "species": "Magnezone", + "item": "Choice Specs", + "ability": "Sturdy", + "nature": "Modest", + "evs": {"spa": 252, "spd": 4, "spe": 252}, + "moves": [["Hyper Beam"], ["Thunderbolt"], ["Flash Cannon"], ["Mirror Coat"]], + "weight": 100 + } + ] + }, + "Gallade": { + "weight": 1, + "sets": [ { - "species": "Zarude", + "species": "Gallade", "item": "Choice Band", - "ability": "Leaf Guard", - "nature": "Adamant", - "evs": {"hp": 120, "atk": 68, "spd": 76, "spe": 244}, - "moves": [["Knock Off"], ["Power Whip"], ["Low Kick", "Rock Slide"], ["Bullet Seed"]], - "weight": 50 + "ability": "Sharpness", + "nature": "Jolly", + "evs": {"atk": 252, "spd": 4, "spe": 252}, + "moves": [["Sacred Sword"], ["Psycho Cut"], ["Leaf Blade"], ["Triple Axel"]], + "weight": 100 + } + ] + }, + "Sinistcha": { + "weight": 1, + "sets": [ + { + "species": "Sinistcha", + "item": "Clear Amulet", + "ability": "Heatproof", + "nature": "Timid", + "evs": {"hp": 252, "def": 80, "spe": 176}, + "moves": [["Iron Defense"], ["Calm Mind"], ["Strength Sap"], ["Shadow Ball"]], + "weight": 100 } ] } diff --git a/data/random-battles/gen9/doubles-sets.json b/data/random-battles/gen9/doubles-sets.json index 4e41b7b691..2045bd1ba4 100644 --- a/data/random-battles/gen9/doubles-sets.json +++ b/data/random-battles/gen9/doubles-sets.json @@ -49,7 +49,7 @@ }, { "role": "Doubles Bulky Attacker", - "movepool": ["Dragon Tail", "Glare", "Gunk Shot", "Knock Off", "Toxic Spikes"], + "movepool": ["Glare", "Gunk Shot", "Knock Off", "Toxic Spikes"], "abilities": ["Intimidate"], "teraTypes": ["Dark"] } @@ -186,7 +186,7 @@ "role": "Doubles Support", "movepool": ["Aurora Veil", "Blizzard", "Moonblast", "Protect"], "abilities": ["Snow Warning"], - "teraTypes": ["Ice", "Steel", "Water"] + "teraTypes": ["Steel", "Water"] } ] }, @@ -349,7 +349,7 @@ "level": 85, "sets": [ { - "role": "Doubles Bulky Attacker", + "role": "Doubles Support", "movepool": ["Acid Spray", "Hydro Pump", "Icy Wind", "Knock Off", "Muddy Water", "Sludge Bomb", "Toxic Spikes"], "abilities": ["Clear Body"], "teraTypes": ["Grass"] @@ -451,8 +451,8 @@ "sets": [ { "role": "Doubles Bulky Attacker", - "movepool": ["Drain Punch", "Gunk Shot", "Haze", "Helping Hand", "Ice Punch", "Knock Off", "Poison Gas", "Poison Jab", "Shadow Sneak"], - "abilities": ["Poison Touch"], + "movepool": ["Drain Punch", "Gunk Shot", "Helping Hand", "Ice Punch", "Knock Off", "Poison Gas", "Poison Jab", "Shadow Sneak"], + "abilities": ["Poison Touch", "Sticky Hold"], "teraTypes": ["Dark"] } ] @@ -589,9 +589,9 @@ "level": 91, "sets": [ { - "role": "Doubles Support", + "role": "Doubles Bulky Attacker", "movepool": ["Clear Smog", "Fire Blast", "Gunk Shot", "Poison Gas", "Protect", "Taunt", "Will-O-Wisp"], - "abilities": ["Levitate", "Neutralizing Gas"], + "abilities": ["Levitate"], "teraTypes": ["Dark"] } ] @@ -602,13 +602,13 @@ { "role": "Doubles Bulky Attacker", "movepool": ["Gunk Shot", "Poison Gas", "Protect", "Strange Steam", "Taunt", "Will-O-Wisp"], - "abilities": ["Levitate", "Neutralizing Gas"], + "abilities": ["Levitate"], "teraTypes": ["Dark", "Steel"] }, { "role": "Offensive Protect", "movepool": ["Dazzling Gleam", "Fire Blast", "Gunk Shot", "Protect"], - "abilities": ["Levitate", "Neutralizing Gas"], + "abilities": ["Levitate"], "teraTypes": ["Fire"] } ] @@ -848,7 +848,7 @@ "sets": [ { "role": "Doubles Fast Attacker", - "movepool": ["Freezing Glare", "Hurricane", "Protect", "Recover", "Tailwind"], + "movepool": ["Freezing Glare", "Hurricane", "Protect", "Tailwind"], "abilities": ["Competitive"], "teraTypes": ["Flying", "Ground", "Steel"] } @@ -886,10 +886,16 @@ "level": 79, "sets": [ { - "role": "Doubles Bulky Attacker", - "movepool": ["Brave Bird", "Fire Blast", "Heat Wave", "Protect", "Scorching Sands", "Tailwind"], + "role": "Doubles Support", + "movepool": ["Brave Bird", "Fire Blast", "Heat Wave", "Protect", "Tailwind"], "abilities": ["Flame Body"], "teraTypes": ["Fire", "Ground"] + }, + { + "role": "Doubles Bulky Attacker", + "movepool": ["Brave Bird", "Fire Blast", "Heat Wave", "Scorching Sands", "Tailwind"], + "abilities": ["Flame Body"], + "teraTypes": ["Ground"] } ] }, @@ -1289,7 +1295,13 @@ "sets": [ { "role": "Doubles Bulky Attacker", - "movepool": ["Crunch", "Gunk Shot", "Icy Wind", "Throat Chop", "Toxic Spikes"], + "movepool": ["Crunch", "Gunk Shot", "Icy Wind", "Toxic Spikes"], + "abilities": ["Intimidate"], + "teraTypes": ["Flying"] + }, + { + "role": "Doubles Support", + "movepool": ["Gunk Shot", "Icy Wind", "Throat Chop", "Toxic Spikes"], "abilities": ["Intimidate"], "teraTypes": ["Flying"] } @@ -1538,7 +1550,7 @@ "role": "Doubles Bulky Setup", "movepool": ["Dragon Dance", "High Horsepower", "Knock Off", "Protect", "Rock Slide", "Stone Edge"], "abilities": ["Sand Stream"], - "teraTypes": ["Ghost", "Rock"] + "teraTypes": ["Ghost"] }, { "role": "Doubles Bulky Attacker", @@ -1721,7 +1733,13 @@ "sets": [ { "role": "Doubles Bulky Attacker", - "movepool": ["After You", "Double-Edge", "Encore", "Icy Wind", "Knock Off", "Slack Off", "Thunder Wave"], + "movepool": ["Double-Edge", "Icy Wind", "Knock Off", "Slack Off", "Thunder Wave"], + "abilities": ["Vital Spirit"], + "teraTypes": ["Ghost"] + }, + { + "role": "Doubles Support", + "movepool": ["Body Slam", "Encore", "Icy Wind", "Knock Off"], "abilities": ["Vital Spirit"], "teraTypes": ["Ghost"] } @@ -1963,7 +1981,7 @@ { "role": "Offensive Protect", "movepool": ["Flamethrower", "Glare", "Gunk Shot", "Knock Off", "Protect"], - "abilities": ["Infiltrator"], + "abilities": ["Shed Skin"], "teraTypes": ["Dark", "Fire", "Poison"] } ] @@ -2289,6 +2307,18 @@ "movepool": ["Headlong Rush", "Protect", "Shell Smash", "Wood Hammer"], "abilities": ["Overgrow"], "teraTypes": ["Fire", "Ground"] + }, + { + "role": "Doubles Setup Sweeper", + "movepool": ["Headlong Rush", "Rock Slide", "Shell Smash", "Wood Hammer"], + "abilities": ["Overgrow"], + "teraTypes": ["Rock"] + }, + { + "role": "Doubles Setup Sweeper", + "movepool": ["Headlong Rush", "Protect", "Rock Slide", "Shell Smash"], + "abilities": ["Overgrow"], + "teraTypes": ["Rock"] } ] }, @@ -2555,7 +2585,7 @@ "role": "Doubles Support", "movepool": ["High Horsepower", "Slack Off", "Stealth Rock", "Stone Edge", "Whirlwind"], "abilities": ["Sand Stream"], - "teraTypes": ["Dragon", "Rock", "Steel", "Water"] + "teraTypes": ["Dragon", "Steel", "Water"] } ] }, @@ -2624,8 +2654,8 @@ "level": 84, "sets": [ { - "role": "Doubles Bulky Attacker", - "movepool": ["Body Press", "Electroweb", "Flash Cannon", "Protect", "Thunderbolt", "Volt Switch"], + "role": "Doubles Support", + "movepool": ["Electroweb", "Flash Cannon", "Protect", "Thunderbolt", "Volt Switch"], "abilities": ["Sturdy"], "teraTypes": ["Flying"] } @@ -2670,7 +2700,7 @@ "sets": [ { "role": "Choice Item user", - "movepool": ["Fire Blast", "Focus Blast", "Heat Wave", "Scorching Sands", "Thunderbolt"], + "movepool": ["Fire Blast", "Focus Blast", "Heat Wave", "Thunderbolt"], "abilities": ["Flame Body"], "teraTypes": ["Fighting", "Fire", "Grass"] }, @@ -3167,9 +3197,15 @@ "sets": [ { "role": "Doubles Setup Sweeper", - "movepool": ["Calm Mind", "Fire Blast", "Judgment", "Recover", "Sludge Bomb"], + "movepool": ["Calm Mind", "Fire Blast", "Judgment", "Recover"], "abilities": ["Multitype"], - "teraTypes": ["Fire", "Poison"] + "teraTypes": ["Fire"] + }, + { + "role": "Doubles Bulky Setup", + "movepool": ["Calm Mind", "Judgment", "Recover", "Sludge Bomb"], + "abilities": ["Multitype"], + "teraTypes": ["Poison"] } ] }, @@ -3189,9 +3225,9 @@ "sets": [ { "role": "Doubles Bulky Setup", - "movepool": ["Calm Mind", "Dazzling Gleam", "Earth Power", "Fire Blast", "Recover"], + "movepool": ["Calm Mind", "Dazzling Gleam", "Earth Power", "Recover"], "abilities": ["Multitype"], - "teraTypes": ["Fairy", "Fire", "Ground"] + "teraTypes": ["Fairy", "Ground"] }, { "role": "Doubles Support", @@ -3228,9 +3264,15 @@ "sets": [ { "role": "Doubles Setup Sweeper", - "movepool": ["Calm Mind", "Earth Power", "Fire Blast", "Judgment", "Recover"], + "movepool": ["Calm Mind", "Earth Power", "Judgment", "Recover"], "abilities": ["Multitype"], "teraTypes": ["Flying", "Ground"] + }, + { + "role": "Doubles Support", + "movepool": ["Judgment", "Recover", "Snarl", "Tailwind", "Taunt", "Will-O-Wisp"], + "abilities": ["Multitype"], + "teraTypes": ["Steel"] } ] }, @@ -3241,13 +3283,13 @@ "role": "Doubles Setup Sweeper", "movepool": ["Brick Break", "Extreme Speed", "Phantom Force", "Swords Dance"], "abilities": ["Multitype"], - "teraTypes": ["Ghost", "Normal"] + "teraTypes": ["Normal"] }, { "role": "Doubles Bulky Setup", - "movepool": ["Calm Mind", "Dazzling Gleam", "Focus Blast", "Judgment", "Recover"], + "movepool": ["Calm Mind", "Focus Blast", "Judgment", "Recover"], "abilities": ["Multitype"], - "teraTypes": ["Fairy", "Fighting"] + "teraTypes": ["Fighting"] } ] }, @@ -3267,9 +3309,15 @@ "sets": [ { "role": "Doubles Bulky Setup", - "movepool": ["Calm Mind", "Fire Blast", "Ice Beam", "Judgment", "Recover"], + "movepool": ["Calm Mind", "Ice Beam", "Judgment", "Recover"], "abilities": ["Multitype"], - "teraTypes": ["Ground", "Ice"] + "teraTypes": ["Dragon", "Steel", "Water"] + }, + { + "role": "Doubles Bulky Attacker", + "movepool": ["Calm Mind", "Fire Blast", "Judgment", "Recover"], + "abilities": ["Multitype"], + "teraTypes": ["Fire"] }, { "role": "Doubles Setup Sweeper", @@ -3283,10 +3331,16 @@ "level": 73, "sets": [ { - "role": "Doubles Bulky Setup", - "movepool": ["Calm Mind", "Earth Power", "Judgment", "Recover", "Thunderbolt"], + "role": "Doubles Setup Sweeper", + "movepool": ["Calm Mind", "Earth Power", "Judgment", "Recover"], "abilities": ["Multitype"], - "teraTypes": ["Electric", "Ground"] + "teraTypes": ["Ground"] + }, + { + "role": "Doubles Bulky Setup", + "movepool": ["Calm Mind", "Judgment", "Recover", "Thunderbolt"], + "abilities": ["Multitype"], + "teraTypes": ["Electric"] } ] }, @@ -3486,7 +3540,13 @@ "sets": [ { "role": "Doubles Bulky Attacker", - "movepool": ["Encore", "Helping Hand", "Moonblast", "Tailwind", "Taunt"], + "movepool": ["Encore", "Moonblast", "Tailwind", "Taunt"], + "abilities": ["Prankster"], + "teraTypes": ["Fire", "Ghost", "Steel"] + }, + { + "role": "Doubles Support", + "movepool": ["Encore", "Helping Hand", "Moonblast", "Tailwind"], "abilities": ["Prankster"], "teraTypes": ["Fire", "Ghost", "Steel"] } @@ -3884,7 +3944,7 @@ { "role": "Doubles Setup Sweeper", "movepool": ["Bug Buzz", "Heat Wave", "Protect", "Quiver Dance"], - "abilities": ["Flame Body", "Swarm"], + "abilities": ["Flame Body"], "teraTypes": ["Fire", "Ground", "Water"] }, { @@ -3972,14 +4032,14 @@ "level": 79, "sets": [ { - "role": "Bulky Protect", + "role": "Doubles Support", "movepool": ["Grass Knot", "Knock Off", "Protect", "Snarl", "Taunt", "Thunder Wave", "Thunderbolt"], "abilities": ["Prankster"], "teraTypes": ["Steel"] }, { "role": "Offensive Protect", - "movepool": ["Acrobatics", "Grass Knot", "Knock Off", "Protect", "Snarl", "Wildbolt Storm"], + "movepool": ["Acrobatics", "Grass Knot", "Knock Off", "Protect", "Wildbolt Storm"], "abilities": ["Defiant"], "teraTypes": ["Electric", "Flying", "Steel"] }, @@ -4242,13 +4302,7 @@ "sets": [ { "role": "Doubles Bulky Attacker", - "movepool": ["Fake Out", "Fake Tears", "Helping Hand", "Light Screen", "Psychic", "Reflect"], - "abilities": ["Prankster"], - "teraTypes": ["Dark", "Steel"] - }, - { - "role": "Doubles Support", - "movepool": ["Fake Out", "Helping Hand", "Psychic", "Thunder Wave"], + "movepool": ["Fake Out", "Helping Hand", "Light Screen", "Psychic", "Reflect", "Thunder Wave"], "abilities": ["Prankster"], "teraTypes": ["Dark", "Steel"] } @@ -4317,7 +4371,7 @@ "role": "Tera Blast user", "movepool": ["Hyper Voice", "Protect", "Quick Attack", "Tera Blast"], "abilities": ["Pixilate"], - "teraTypes": ["Fire", "Ground"] + "teraTypes": ["Ground"] } ] }, @@ -4593,7 +4647,7 @@ "sets": [ { "role": "Doubles Wallbreaker", - "movepool": ["Drain Punch", "Gunk Shot", "Ice Hammer", "Protect", "Wide Guard"], + "movepool": ["Drain Punch", "Gunk Shot", "Ice Hammer", "Protect"], "abilities": ["Iron Fist"], "teraTypes": ["Fire", "Poison"] } @@ -4609,7 +4663,7 @@ "teraTypes": ["Ground"] }, { - "role": "Doubles Bulky Setup", + "role": "Bulky Protect", "movepool": ["Air Slash", "Protect", "Quiver Dance", "Revelation Dance"], "abilities": ["Dancer"], "teraTypes": ["Ground"] @@ -4626,7 +4680,7 @@ "teraTypes": ["Ground"] }, { - "role": "Doubles Bulky Setup", + "role": "Bulky Protect", "movepool": ["Air Slash", "Protect", "Quiver Dance", "Revelation Dance"], "abilities": ["Dancer"], "teraTypes": ["Ground"] @@ -4643,7 +4697,7 @@ "teraTypes": ["Fighting", "Ground"] }, { - "role": "Doubles Bulky Setup", + "role": "Bulky Protect", "movepool": ["Air Slash", "Protect", "Quiver Dance", "Revelation Dance"], "abilities": ["Dancer"], "teraTypes": ["Fighting", "Ground"] @@ -4660,7 +4714,7 @@ "teraTypes": ["Fighting", "Ground"] }, { - "role": "Doubles Bulky Setup", + "role": "Bulky Protect", "movepool": ["Air Slash", "Protect", "Quiver Dance", "Revelation Dance"], "abilities": ["Dancer"], "teraTypes": ["Fighting", "Ground"] @@ -5010,13 +5064,13 @@ { "role": "Doubles Setup Sweeper", "movepool": ["Clanging Scales", "Clangorous Soul", "Drain Punch", "Iron Head"], - "abilities": ["Soundproof"], + "abilities": ["Bulletproof", "Soundproof"], "teraTypes": ["Steel"] }, { "role": "Doubles Bulky Setup", "movepool": ["Clanging Scales", "Clangorous Soul", "Iron Head", "Protect"], - "abilities": ["Soundproof"], + "abilities": ["Bulletproof", "Soundproof"], "teraTypes": ["Steel"] }, { @@ -5273,7 +5327,7 @@ "sets": [ { "role": "Doubles Bulky Attacker", - "movepool": ["Fake Out", "Light Screen", "Parting Shot", "Reflect", "Spirit Break"], + "movepool": ["Fake Out", "Light Screen", "Parting Shot", "Reflect", "Spirit Break", "Thunder Wave"], "abilities": ["Prankster"], "teraTypes": ["Steel"] }, @@ -5476,7 +5530,13 @@ "sets": [ { "role": "Offensive Protect", - "movepool": ["Draco Meteor", "Dragon Darts", "Fire Blast", "Protect", "Shadow Ball"], + "movepool": ["Draco Meteor", "Dragon Darts", "Protect", "Shadow Ball"], + "abilities": ["Clear Body"], + "teraTypes": ["Dragon"] + }, + { + "role": "Offensive Protect", + "movepool": ["Dragon Darts", "Fire Blast", "Protect", "Shadow Ball"], "abilities": ["Clear Body"], "teraTypes": ["Dragon"] }, @@ -5868,9 +5928,15 @@ }, { "role": "Doubles Fast Attacker", - "movepool": ["First Impression", "Leech Life", "Protect", "Sucker Punch"], + "movepool": ["First Impression", "Knock Off", "Protect", "Sucker Punch"], "abilities": ["Tinted Lens"], - "teraTypes": ["Bug"] + "teraTypes": ["Bug", "Dark"] + }, + { + "role": "Doubles Wallbreaker", + "movepool": ["First Impression", "Knock Off", "Leech Life", "Protect"], + "abilities": ["Tinted Lens"], + "teraTypes": ["Bug"] } ] }, @@ -6018,7 +6084,7 @@ "sets": [ { "role": "Doubles Bulky Attacker", - "movepool": ["Electroweb", "Muddy Water", "Slack Off", "Thunder Wave", "Thunderbolt", "Volt Switch"], + "movepool": ["Electroweb", "Muddy Water", "Slack Off", "Thunder Wave", "Thunderbolt"], "abilities": ["Electromorphosis"], "teraTypes": ["Water"] } @@ -6159,7 +6225,7 @@ { "role": "Doubles Support", "movepool": ["Encore", "Fake Out", "Gigaton Hammer", "Knock Off", "Play Rough", "Stealth Rock"], - "abilities": ["Mold Breaker"], + "abilities": ["Mold Breaker", "Own Tempo"], "teraTypes": ["Steel", "Water"] } ] @@ -6490,7 +6556,7 @@ "sets": [ { "role": "Doubles Wallbreaker", - "movepool": ["Close Combat", "First Impression", "Flare Blitz", "U-turn", "Wild Charge"], + "movepool": ["Close Combat", "First Impression", "Flare Blitz", "Protect", "U-turn", "Wild Charge"], "abilities": ["Protosynthesis"], "teraTypes": ["Bug", "Electric", "Fighting", "Fire"] } diff --git a/data/random-battles/gen9/sets.json b/data/random-battles/gen9/sets.json index bf8b2e3984..6740222d10 100644 --- a/data/random-battles/gen9/sets.json +++ b/data/random-battles/gen9/sets.json @@ -643,7 +643,7 @@ }, { "role": "Bulky Setup", - "movepool": ["Calm Mind", "Giga Drain", "Psychic", "Psyshock", "Substitute"], + "movepool": ["Calm Mind", "Giga Drain", "Psychic", "Psyshock", "Sleep Powder", "Substitute"], "abilities": ["Harvest"], "teraTypes": ["Steel"] } @@ -695,7 +695,7 @@ { "role": "Setup Sweeper", "movepool": ["Drain Punch", "Ice Punch", "Knock Off", "Mach Punch", "Rapid Spin", "Swords Dance"], - "abilities": ["Inner Focus", "Iron Fist"], + "abilities": ["Iron Fist"], "teraTypes": ["Dark", "Fighting"] }, { @@ -703,6 +703,12 @@ "movepool": ["Bulk Up", "Drain Punch", "Knock Off", "Poison Jab", "Rapid Spin"], "abilities": ["Iron Fist"], "teraTypes": ["Dark", "Poison", "Steel"] + }, + { + "role": "Bulky Support", + "movepool": ["Drain Punch", "Encore", "Knock Off", "Poison Jab", "Rapid Spin", "Taunt"], + "abilities": ["Iron Fist"], + "teraTypes": ["Steel"] } ] }, @@ -2382,6 +2388,12 @@ "luvdisc": { "level": 100, "sets": [ + { + "role": "Fast Support", + "movepool": ["Endeavor", "Flip Turn", "Substitute", "Surf"], + "abilities": ["Swift Swim"], + "teraTypes": ["Ghost", "Ground"] + }, { "role": "Fast Support", "movepool": ["Endeavor", "Substitute", "Surf", "Whirlpool"], @@ -3185,7 +3197,7 @@ "sets": [ { "role": "Wallbreaker", - "movepool": ["Earthquake", "Ice Shard", "Icicle Crash", "Knock Off", "Stealth Rock", "Trailblaze"], + "movepool": ["Earthquake", "Ice Shard", "Icicle Crash", "Knock Off", "Stealth Rock"], "abilities": ["Thick Fat"], "teraTypes": ["Ground", "Ice"] } @@ -3247,7 +3259,7 @@ }, { "role": "Bulky Support", - "movepool": ["Earthquake", "Pain Split", "Poltergeist", "Will-O-Wisp"], + "movepool": ["Earthquake", "Pain Split", "Poltergeist", "Shadow Sneak", "Will-O-Wisp"], "abilities": ["Frisk"], "teraTypes": ["Dark", "Fairy"] }, @@ -3288,7 +3300,13 @@ "role": "Bulky Attacker", "movepool": ["Hydro Pump", "Nasty Plot", "Pain Split", "Thunderbolt", "Trick", "Volt Switch", "Will-O-Wisp"], "abilities": ["Levitate"], - "teraTypes": ["Electric", "Water"] + "teraTypes": ["Electric", "Steel"] + }, + { + "role": "Bulky Support", + "movepool": ["Discharge", "Hydro Pump", "Pain Split", "Volt Switch", "Will-O-Wisp"], + "abilities": ["Levitate"], + "teraTypes": ["Electric", "Steel"] } ] }, @@ -3299,7 +3317,13 @@ "role": "Bulky Attacker", "movepool": ["Nasty Plot", "Overheat", "Pain Split", "Thunderbolt", "Volt Switch", "Will-O-Wisp"], "abilities": ["Levitate"], - "teraTypes": ["Electric", "Fire"] + "teraTypes": ["Electric", "Fire", "Steel"] + }, + { + "role": "Bulky Support", + "movepool": ["Discharge", "Overheat", "Pain Split", "Volt Switch", "Will-O-Wisp"], + "abilities": ["Levitate"], + "teraTypes": ["Electric", "Steel"] } ] }, @@ -3319,7 +3343,7 @@ "sets": [ { "role": "Bulky Attacker", - "movepool": ["Air Slash", "Nasty Plot", "Thunderbolt", "Volt Switch", "Will-O-Wisp"], + "movepool": ["Air Slash", "Nasty Plot", "Thunder Wave", "Thunderbolt", "Volt Switch", "Will-O-Wisp"], "abilities": ["Levitate"], "teraTypes": ["Electric", "Steel"] } @@ -3740,16 +3764,10 @@ "level": 69, "sets": [ { - "role": "Bulky Support", - "movepool": ["Focus Blast", "Judgment", "Recover", "Will-O-Wisp"], + "role": "Bulky Attacker", + "movepool": ["Calm Mind", "Focus Blast", "Judgment", "Recover", "Will-O-Wisp"], "abilities": ["Multitype"], - "teraTypes": ["Fighting", "Normal"] - }, - { - "role": "Bulky Setup", - "movepool": ["Calm Mind", "Focus Blast", "Judgment", "Recover"], - "abilities": ["Multitype"], - "teraTypes": ["Fighting", "Ghost", "Normal"] + "teraTypes": ["Dark", "Fighting"] } ] }, @@ -4017,7 +4035,13 @@ "sets": [ { "role": "Fast Support", - "movepool": ["Encore", "Giga Drain", "Leech Seed", "Moonblast", "Stun Spore", "Substitute", "U-turn"], + "movepool": ["Encore", "Giga Drain", "Moonblast", "Stun Spore", "U-turn"], + "abilities": ["Prankster"], + "teraTypes": ["Poison", "Steel"] + }, + { + "role": "Bulky Support", + "movepool": ["Encore", "Leech Seed", "Moonblast", "Substitute"], "abilities": ["Prankster"], "teraTypes": ["Poison", "Steel"] } @@ -5011,7 +5035,7 @@ "sets": [ { "role": "Wallbreaker", - "movepool": ["Drain Punch", "Horn Leech", "Poltergeist", "Rest", "Trick Room", "Will-O-Wisp", "Wood Hammer"], + "movepool": ["Drain Punch", "Horn Leech", "Poltergeist", "Rest", "Will-O-Wisp", "Wood Hammer"], "abilities": ["Natural Cure"], "teraTypes": ["Fighting"] }, @@ -5515,9 +5539,9 @@ "sets": [ { "role": "Setup Sweeper", - "movepool": ["Drain Punch", "Play Rough", "Shadow Sneak", "Swords Dance", "Wood Hammer"], + "movepool": ["Drain Punch", "Play Rough", "Shadow Sneak", "Swords Dance"], "abilities": ["Disguise"], - "teraTypes": ["Fairy", "Fighting", "Grass"] + "teraTypes": ["Fairy", "Fighting"] }, { "role": "Fast Bulky Setup", @@ -6563,7 +6587,7 @@ "sets": [ { "role": "Bulky Support", - "movepool": ["Body Press", "Play Rough", "Protect", "Stomping Tantrum", "Wish"], + "movepool": ["Body Press", "Play Rough", "Protect", "Wish", "Yawn"], "abilities": ["Well-Baked Body"], "teraTypes": ["Steel"] } @@ -7126,7 +7150,7 @@ "sets": [ { "role": "Bulky Attacker", - "movepool": ["Close Combat", "Seed Bomb", "Spore", "Sucker Punch"], + "movepool": ["Close Combat", "Crunch", "Spore", "Sucker Punch"], "abilities": ["Protosynthesis"], "teraTypes": ["Fighting", "Poison"] }, diff --git a/data/random-battles/gen9/teams.ts b/data/random-battles/gen9/teams.ts index 4eaaa10da4..99fea6cb97 100644 --- a/data/random-battles/gen9/teams.ts +++ b/data/random-battles/gen9/teams.ts @@ -104,7 +104,7 @@ const SPEED_CONTROL = [ ]; // Moves that shouldn't be the only STAB moves: const NO_STAB = [ - 'accelerock', 'aquajet', 'bounce', 'breakingswipe', 'bulletpunch', 'chatter', 'chloroblast', 'clearsmog', 'covet', + 'acidspray', 'accelerock', 'aquajet', 'bounce', 'breakingswipe', 'bulletpunch', 'chatter', 'chloroblast', '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', 'trailblaze', @@ -501,7 +501,7 @@ export class RandomTeams { // Team-based move culls if (teamDetails.screens) { - if (movePool.includes('auroraveil')) this.fastPop(movePool, movePool.indexOf('auroraveil')); + if (movePool.includes('auroraveil') && !isDoubles) this.fastPop(movePool, movePool.indexOf('auroraveil')); if (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')); @@ -568,7 +568,6 @@ export class RandomTeams { [SETUP, HAZARDS], [SETUP, ['defog', 'nuzzle', 'toxic', 'yawn', 'haze']], [PHYSICAL_SETUP, PHYSICAL_SETUP], - [SPECIAL_SETUP, 'thunderwave'], ['substitute', PIVOT_MOVES], [SPEED_SETUP, ['aquajet', 'rest', 'trickroom']], ['curse', ['irondefense', 'rapidspin']], @@ -816,12 +815,6 @@ export class RandomTeams { } } - // Enforce Encore on Whimsicott - if (movePool.includes('encore') && species.id === 'whimsicott') { - counter = this.addMove('encore', moves, types, abilities, teamDetails, species, isLead, isDoubles, - movePool, teraType, role); - } - // Enforce moves in doubles if (isDoubles) { const doublesEnforcedMoves = ['mortalspin', 'spore']; @@ -841,11 +834,6 @@ export class RandomTeams { counter = this.addMove('tailwind', moves, types, abilities, teamDetails, species, isLead, isDoubles, movePool, teraType, role); } - // Enforce Thunder Wave on Prankster users as well - if (movePool.includes('thunderwave') && abilities.includes('Prankster')) { - counter = this.addMove('thunderwave', moves, types, abilities, teamDetails, species, isLead, isDoubles, - movePool, teraType, role); - } } // Enforce STAB priority @@ -1111,7 +1099,6 @@ export class RandomTeams { // Hard-code abilities here if (species.id === 'drifblim') return moves.has('defog') ? 'Aftermath' : 'Unburden'; if (abilities.includes('Flash Fire') && this.dex.getEffectiveness('Fire', teraType) >= 1) return 'Flash Fire'; - if (species.id === 'hitmonchan' && counter.get('ironfist')) return 'Iron Fist'; if ((species.id === 'thundurus' || species.id === 'tornadus') && !counter.get('Physical')) return 'Prankster'; if (species.id === 'swampert' && (counter.get('Water') || moves.has('flipturn'))) return 'Torrent'; if (species.id === 'toucannon' && counter.get('skilllink')) return 'Skill Link'; @@ -3020,7 +3007,6 @@ export class RandomTeams { ): RandomTeamsTypes.RandomFactorySet | null { const setList = this.random1v1FactorySets[species.name].sets; - const itemsLimited = ['choicespecs', 'choiceband', 'choicescarf']; const movesLimited: { [k: string]: string } = {}; const abilitiesLimited: { [k: string]: string } = {}; @@ -3039,7 +3025,8 @@ export class RandomTeams { if (!Array.isArray(ogItem)) ogItem = [ogItem]; for (const itemString of ogItem) { const itemId = toID(itemString); - if (itemsLimited.includes(itemId) && teamData.has[itemId]) continue; + if (teamData.has[itemId]) continue; + teamData.has[itemId] = 1; allowedItems.push(itemString); } if (!allowedItems.length) continue; @@ -3130,14 +3117,6 @@ export class RandomTeams { weaknesses: {}, resistances: {}, }; - const resistanceAbilities: { [k: string]: string[] } = { - dryskin: ['Water'], waterabsorb: ['Water'], stormdrain: ['Water'], - flashfire: ['Fire'], heatproof: ['Fire'], waterbubble: ['Fire'], wellbakedbody: ['Fire'], - lightningrod: ['Electric'], motordrive: ['Electric'], voltabsorb: ['Electric'], - sapsipper: ['Grass'], - thickfat: ['Ice', 'Fire'], - eartheater: ['Ground'], levitate: ['Ground'], - }; const movesLimited: { [k: string]: string } = {}; const abilitiesLimited: { [k: string]: string } = {}; const limitFactor = Math.ceil(this.maxTeamSize / 3); @@ -3185,7 +3164,7 @@ export class RandomTeams { for (const typeName of this.dex.types.names()) { // it's weak to the type if (this.dex.getEffectiveness(typeName, species) > 0 && this.dex.getImmunity(typeName, types)) { - if (teamData.weaknesses[typeName] >= 2 * limitFactor) { + if (teamData.weaknesses[typeName] >= limitFactor) { skip = true; break; } @@ -3196,6 +3175,22 @@ export class RandomTeams { const set = this.random1v1FactorySet(species, teamData); if (!set) continue; + teamData.has[toID(set.item)] = 1; + + const atkEVs = set.evs['atk']; + const spaEVs = set.evs['spa']; + const physMoveCount = set.moves.map(x => this.dex.moves.get(x).category).filter(x => x === 'Physical').length; + const specMoveCount = set.moves.map(x => this.dex.moves.get(x).category).filter(x => x === 'Special').length; + const atkBoostingMoves = set.moves.map(x => this.dex.moves.get(x)) + .filter(x => (x.target === 'self' && x.boosts?.atk) || (x.id === 'curse' && !species.types.includes('Ghost'))).length; + const spaBoostingMoves = set.moves.map(x => this.dex.moves.get(x)) + .filter(x => (x.target === 'self' && x.boosts?.spa) || x.id === 'takeheart').length; + if (teamData.has['physical'] && (atkEVs || physMoveCount >= 2 || atkBoostingMoves)) continue; + if (teamData.has['special'] && (spaEVs || specMoveCount >= 2 || spaBoostingMoves)) continue; + if (!teamData.has['physical']) teamData.has['physical'] = 0; + if (!teamData.has['special']) teamData.has['special'] = 0; + if (atkEVs || physMoveCount >= 2 || atkBoostingMoves) teamData.has['physical']++; + if (spaEVs || specMoveCount >= 2 || spaBoostingMoves) teamData.has['special']++; // Limit 1 of any type combination let typeCombo = types.slice().sort().join(); @@ -3240,16 +3235,7 @@ export class RandomTeams { for (const typeName of this.dex.types.names()) { const typeMod = this.dex.getEffectiveness(typeName, types); - // Track resistances because we will require it for triple weaknesses - if ( - typeMod < 0 || - resistanceAbilities[ability.id]?.includes(typeName) || - !this.dex.getImmunity(typeName, types) - ) { - // We don't care about the number of resistances, so just set to 1 - teamData.resistances[typeName] = 1; - // Track weaknesses - } else if (typeMod > 0) { + if (typeMod > 0) { teamData.weaknesses[typeName] = (teamData.weaknesses[typeName] || 0) + 1; } } @@ -3259,9 +3245,7 @@ export class RandomTeams { // Quality control we cannot afford for monotype if (!teamData.forceResult && !this.forceMonotype) { for (const type in teamData.weaknesses) { - // We reject if our team is triple weak to any type without having a resist - if (teamData.resistances[type]) continue; - if (teamData.weaknesses[type] >= 2 * limitFactor) return this.random1v1FactoryTeam(side, ++depth); + if (teamData.weaknesses[type] >= limitFactor) return this.random1v1FactoryTeam(side, ++depth); } } return pokemon; diff --git a/data/random-battles/gen9baby/sets.json b/data/random-battles/gen9baby/sets.json index 8f41c6ea17..0507dbd0ac 100644 --- a/data/random-battles/gen9baby/sets.json +++ b/data/random-battles/gen9baby/sets.json @@ -1101,7 +1101,7 @@ "level": 5, "sets": [ { - "role": "Setup Sweeper", + "role": "Bulky Setup", "movepool": ["Dual Wingbeat", "Earthquake", "Knock Off", "Swords Dance"], "abilities": ["Immunity"], "teraTypes": ["Steel", "Water"] @@ -1970,7 +1970,7 @@ "level": 6, "sets": [ { - "role": "Setup Sweeper", + "role": "Bulky Setup", "movepool": ["Iron Head", "Night Slash", "Sucker Punch", "Swords Dance"], "abilities": ["Defiant"], "teraTypes": ["Dark", "Fairy", "Steel"] @@ -2599,7 +2599,7 @@ ] }, "skiddo": { - "level": 7, + "level": 6, "sets": [ { "role": "Bulky Setup", diff --git a/data/random-battles/scootopiav2/random-sets.json b/data/random-battles/scootopiav2/random-sets.json deleted file mode 100644 index 1812a60a0b..0000000000 --- a/data/random-battles/scootopiav2/random-sets.json +++ /dev/null @@ -1,856 +0,0 @@ -{ - "albatrygon": { - "level": 100, - "sets": [ - { - "role": "Fast Support", - "movepool": ["Sticky Web", "Taunt", "Encore", "Brave Bird", "Memento", "Parting Shot"], - "abilities": ["Prankster"] - }, - { - "role": "Setup Sweeper", - "movepool": ["Tidy Up", "Brave Bird", "Drill Peck", "Feral Rush", "Feral Bite", "Sacred Sword"], - "abilities": ["Prankster"] - } - ] - }, - "aurorowl": { - "level": 100, - "sets": [ - { - "role": "Setup Sweeper", - "movepool": ["Frost Breath", "Air Cutter", "Focus Blast", "Nasty Plot"], - "abilities": ["Technician"] - } - ] - }, - "arbrella": { - "level": 100, - "sets": [ - { - "role": "Wallbreaker", - "movepool": ["Earthquake", "Wood Hammer", "Swords Dance", "Synthesis", "Stone Edge", "Superpower"], - "abilities": ["Tough Claws"] - }, - { - "role": "Choice Scarf", - "movepool": ["Earthquake", "Wood Hammer", "Stone Edge", "Superpower"], - "abilities": ["Tough Claws"] - } - ] - }, - "avastar": { - "level": 100, - "sets": [ - { - "role": "Bulky Support", - "movepool": ["Thunder Wave", "Heavy Slam", "Psychic", "Recover", "Teleport"], - "abilities": ["Shell Bunker"] - }, - { - "role": "Setup Sweeper", - "movepool": ["Calm Mind", "Psychic", "Flash Cannon", "Recover", "Thunderbolt"], - "abilities": ["Shell Bunker"] - } - ] - }, - "axolacred": { - "level": 100, - "sets": [ - { - "role": "Bulky Support", - "movepool": ["Stealth Rock", "Dragon Tail", "Roost", "Core Enforcer", "Scald", "Defog", "Shed Tail"], - "abilities": ["Magic Guard"] - }, - { - "role": "Bulky Attacker", - "movepool": ["Feral Rush", "Core Enforcer", "Flip Turn", "Recover"], - "abilities": ["Magic Guard"] - } - ] - }, - "barracoth": { - "level": 100, - "sets": [ - { - "role": "Bulky Support", - "movepool": ["Sheer Cold", "Flip Turn", "Triple Axel", "Slack Off"], - "abilities": ["Multiscale", "Filter"] - } - ] - }, - "blunderbusk": { - "level": 100, - "sets": [ - { - "role": "Bulky Attacker", - "movepool": ["Hydro Pump", "Aura Sphere", "Ice Beam", "Dark Pulse", "Dragon Pulse"], - "abilities": ["Mega Launcher"] - } - ] - }, - "brawnkey": { - "level": 100, - "sets": [ - { - "role": "Bulky Support", - "movepool": ["Stealth Rock", "Drain Punch", "Iron Head", "Chilly Reception", "Spikes"], - "abilities": ["Levitate"] - }, - { - "role": "Setup Sweeper", - "movepool": ["Iron Defense", "Body Press", "Iron Head", "Stealth Rock"], - "abilities": ["Levitate"] - }, - { - "role": "Setup Sweeper", - "movepool": ["Bulk Up", "Drain Punch", "Iron Head", "Stealth Rock"], - "abilities": ["Levitate"] - } - ] - }, - "carapex": { - "level": 100, - "sets": [ - { - "role": "Setup Sweeper", - "movepool": ["Tailwind", "Acrobatics", "Earthquake", "Stone Edge"], - "abilities": ["Wind Rider"] - }, - { - "role": "Bulky Support", - "movepool": ["Stealth Rock", "Roost", "Body Press", "Knock Off", "Crystal Bash", "U-Turn"], - "abilities": ["Wind Rider"] - } - ] - }, - "celespirit": { - "level": 100, - "sets": [ - { - "role": "Bulky Support", - "movepool": ["Sheer Cold", "Moonlight", "Hex", "Ice Beam", "Moonblast"], - "abilities": ["Levitate"] - }, - { - "role": "Setup Sweeper", - "movepool": ["Calm Mind", "Crystal Burst", "Shadow Ball", "Moonlight"], - "abilities": ["Levitate"] - } - ] - }, - "cellsius": { - "level": 100, - "sets": [ - { - "role": "Setup Sweeper", - "movepool": ["Calm Mind", "Hydro Pump", "Moonblast", "Ice Beam", "Psychic"], - "abilities": ["Beast Boost"] - }, - { - "role": "Fast Attacker", - "movepool": ["Hydro Pump", "Moonblast", "Ice Beam", "Flip Turn", "Psychic"], - "abilities": ["Beast Boost"] - } - ] - }, - "cindoe": { - "level": 100, - "sets": [ - { - "role": "Fast Support", - "movepool": ["Overheat", "Fiery Wrath", "Parting Shot", "Morning Sun"], - "abilities": ["Natural Cure"] - }, - { - "role": "Setup Sweeper", - "movepool": ["Nasty Plot", "Fiery Wrath", "Fire Blast", "Morning Sun"], - "abilities": ["Natural Cure"] - }, - { - "role": "Setup Sweeper", - - "movepool": ["Nasty Plot", "Fiery Wrath", "Crystal Burst", "Morning Sun"], - "abilities": ["Natural Cure"] - } - ] - }, - "cinnastar": { - "level": 100, - "sets": [ - { - "role": "AV Pivot", - "movepool": ["Sludge Bomb", "Earth Power", "Focus Blast", "Mortal Spin"], - "abilities": ["Regenerator"] - }, - { - "role": "Bulky Support", - "movepool": ["Earth Power", "Mortal Spin", "Recover", "Stealth Rock", "Power Gem"], - "abilities": ["Regenerator"] - } - ] - }, - "cobracotta": { - "level": 100, - "sets": [ - { - "role": "Bulky Support", - "movepool": ["Poison Fang", "Leech Seed", "Knock Off", "Synthesis", "Stealth Rock", "Power Whip"], - "abilities": ["Heatproof"] - } - ] - }, - "corundell": { - "level": 100, - "sets": [ - { - "role": "Fast Attacker", - "movepool": ["Meteor Beam", "Power Gem", "Overheat", "Earth Power", "Volt Switch", "Energy Ball"], - "abilities": ["Lightning Rod"] - } - ] - }, - "crossont": { - "level": 100, - "sets": [ - { - "role": "Bulky Support", - "movepool": ["Spikes", "Recover", "Knock Off", "Circle Throw"], - "abilities": ["Mold Breaker", "Sniper"] - }, - { - "role": "Bulky Attacker", - - "movepool": ["Crystal Cutter", "Close Combat", "Bulk Up", "Substitute"], - "abilities": ["Sniper"] - } - ] - }, - "cyllindrake": { - "level": 100, - "sets": [ - { - "role": "Bulky Support", - "movepool": ["Body Press", "Rapid Spin", "Morning Sun", "Stealth Rock", "Boomburst"], - "abilities": ["Scrappy"] - }, - { - "role": "Fast Support", - "movepool": ["Stealth Rock", "Rapid Spin", "Steel Beam", "Fire Blast"], - "abilities": ["Scrappy"] - }, - { - "role": "Fast Attacker", - - "movepool": ["Feral Shriek", "Flash Cannon", "Earth Power", "Feral Spray", "Rapid Spin"], - "abilities": ["Punk Rock"] - } - ] - }, - "dojodo": { - "level": 100, - "sets": [ - { - "role": "Setup Sweeper", - "movepool": ["Bulk Up", "Drain Punch", "Jet Punch", "Knock Off", "Substitute"], - "abilities": ["Supreme Overlord"] - }, - { - "role": "Setup Sweeper", - - "movepool": ["Bulk Up", "Drain Punch", "Crystal Bash", "Jet Punch", "Crystal Healing"], - "abilities": ["Supreme Overlord"] - } - ] - }, - "dolphena": { - "level": 100, - "sets": [ - { - "role": "Setup Sweeper", - "movepool": ["Coil", "Scale Shot", "Iron Tail", "Liquidation"], - "abilities": ["Mythical Presence"] - }, - { - "role": "Setup Sweeper", - "movepool": ["Dragon Dance", "Scale Shot", "Liquidation", "Iron Head", "Substitute"], - "abilities": ["Mythical Presence"] - }, - { - "role": "Setup Sweeper", - "movepool": ["Coil", "Scale Shot", "Iron Tail", "Liquidation"], - - "abilities": ["Mythical Presence"] - }, - { - "role": "Bulky Support", - "movepool": ["Defog", "Flip Turn", "Moonlight", "Dragon Tail"], - "abilities": ["Mythical Presence"] - } - ] - }, - "dracoil": { - "level": 100, - "sets": [ - { - "role": "Bulky Support", - "movepool": ["Defog", "Roost", "U-Turn", "Hurricane", "Fire Blast", "Glare", "Draco Meteor", "Earthquake"], - "abilities": ["Mythical Presence"] - }, - { - "role": "Setup Sweeper", - "movepool": ["Dragon Dance", "Acrobatics", "Substitute", "Earthquake"], - "abilities": ["Gluttony"] - }, - { - "role": "Setup Sweeper", - "movepool": ["Dragon Dance", "Dragon Rush", "Coil", "Earthquake", "Dual Wingbeat"], - "abilities": ["Mythical Presence"] - }, - { - "role": "Bulky Support", - "movepool": ["Feral Bite", "Dragon Tail", "Roost", "Glare", "Defog"], - "abilities": ["Mythical Presence"] - } - ] - }, - "efflor": { - "level": 100, - "sets": [ - { - "role": "Bulky Support", - "movepool": ["Giga Drain", "Leech Seed", "Rapid Spin", "Stealth Rock", "Chilly Reception"], - "abilities": ["Seed Sower"] - }, - { - "role": "Bulky Setup", - "movepool": ["Curse", "Stone Edge", "Body Press", "Synthesis"], - "abilities": ["Unaware"] - } - ] - }, - "electangle": { - "level": 100, - "sets": [ - { - "role": "Bulky Support", - "movepool": ["Gyro Ball", "Stealth Rock", "Body Press", "Volt Switch", "Discharge"], - "abilities": ["Filter"] - } - ] - }, - "elemadillo": { - "level": 100, - "sets": [ - { - "role": "Fast Attacker", - "movepool": ["Flash Cannon", "Thunderbolt", "Volt Switch", "Energy Ball"], - "abilities": ["Motor Drive", "Weak Armor"] - }, - { - "role": "Fast Attacker", - - "movepool": ["Feral Power", "Flash Cannon", "Earth Power", "Feral Resilience"], - "abilities": ["Motor Drive", "Weak Armor"] - } - ] - }, - "embuck": { - "level": 100, - "sets": [ - { - "role": "Bulky Support", - "movepool": ["Blaze Kick", "Will-o-Wisp", "Morning Sun", "U-Turn", "Close Combat"], - "abilities": ["Intimidate"] - }, - { - "role": "Bulky Support", - - "movepool": ["Blaze Kick", "Crystal Bash", "Will-o-Wisp", "Morning Sun", "U-Turn"], - "abilities": ["Intimidate"] - }, - { - "role": "Fast Attacker", - "movepool": ["Flare Blitz", "Wild Charge", "U-Turn", "Close Combat"], - "abilities": ["Intimidate"] - } - ] - }, - "faerenheit": { - "level": 100, - "sets": [ - { - "role": "Bulky Setup", - "movepool": ["Calm Mind", "Lava Plume", "Moonblast", "Morning Sun"], - "abilities": ["Beast Boost"] - }, - { - "role": "Bulky Setup", - - "movepool": ["Calm Mind", "Lava Plume", "Crystal Cage", "Morning Sun"], - "abilities": ["Beast Boost"] - } - ] - }, - "fenreil": { - "level": 100, - "sets": [ - { - "role": "Fast Attacker", - "movepool": ["Double Edge", "Knock Off", "Superpower", "U-Turn"], - "abilities": ["Natural Cure"] - }, - { - "role": "Fast Attacker", - - "movepool": ["Feral Bite", "Knock Off", "Iron Head", "Feral Shred"], - "abilities": ["Natural Cure"] - } - ] - }, - "flocura": { - "level": 100, - "sets": [ - { - "role": "Fast Support", - "movepool": ["Stealth Rock", "Thunder Wave", "U-Turn", "Leaf Storm"], - "abilities": ["Power Construct"] - }, - { - "role": "Setup Sweeper", - "movepool": ["Nasty Plot", "Giga Drain", "Psychic", "Earth Power"], - "abilities": ["Levitate"] - }, - { - "role": "Setup Sweeper", - - "movepool": ["Nasty Plot", "Giga Drain", "Feral Power", "Earth Power"], - "abilities": ["Levitate"] - }, - { - "role": "Fast Attacker", - "movepool": ["Leaf Storm", "U-Turn", "Psychic", "Earth Power"], - "abilities": ["Levitate"] - }, - { - "role": "Bulky Support", - "movepool": ["Leech Seed", "U-Turn", "Thunder Wave", "Psychic", "Giga Drain", "Stealth Rock"], - "abilities": ["Power Construct"] - } - ] - }, - "harzodia": { - "level": 100, - "sets": [ - { - "role": "Bulky Support", - "movepool": ["Light Screen", "Reflect", "Teleport", "Thunder Wave", "Psychic"], - "abilities": ["Prankster"] - }, - { - "role": "Setup Sweeper", - "movepool": ["Meteor Beam", "Psychic", "Shadow Ball", "Calm Mind", "Focus Blast"], - "abilities": ["Unburden"] - } - ] - }, - "jaegorm": { - "level": 100, - "sets": [ - { - "role": "Fast Attacker", - "movepool": ["First Impression", "U-Turn", "Photon Ray", "Knock Off", "Superpower", "Earthquake"], - "abilities": ["Schooling"] - } - ] - }, - "jamborai": { - "level": 100, - "sets": [ - { - "role": "Bulky Support", - "movepool": ["Mortal Spin", "Recover", "Pyschic", "Scald", "Teleport"], - "abilities": ["Water Absorb"] - }, - { - "role": "Bulky Setup", - "movepool": ["Calm Mind", "Recover", "Pyschic", "Scald", "Sludge Bomb", "Stored Power"], - "abilities": ["Water Absorb"] - }, - { - "role": "Bulky Support", - - "movepool": ["Mortal Spin", "Recover", "Crystal Cage", "Crystal Healing", "Teleport"], - "abilities": ["Gooey"] - }, - { - "role": "Bulky Setup", - - "movepool": ["Crystal Fortification", "Recover", "Stored Power", "Crystal Beam"], - "abilities": ["Gooey"] - } - ] - }, - "kodokai": { - "level": 100, - "sets": [ - { - "role": "Bulky Support", - - "movepool": ["Crystal Cage", "Hex", "Will-o-Wisp", "Moonlight"], - "abilities": ["Aroma Veil"] - }, - { - "role": "Bulky Support", - "movepool": ["Wish", "Hex", "Will-o-Wisp", "Moonlight"], - "abilities": ["Aroma Veil"] - } - ] - }, - "krachiten": { - "level": 100, - "sets": [ - { - "role": "Fast Attacker", - "movepool": ["First Impression", "U-Turn", "Liquidation", "Rapid Spin"], - "abilities": ["Torrent"] - }, - { - "role": "Fast Attacker", - - "movepool": ["Crystal Cutter", "U-Turn", "Aqua Cutter", "Superpower", "Rapid Spin"], - "abilities": ["Sniper"] - } - ] - }, - "lumoth": { - "level": 100, - "sets": [ - { - "role": "Setup Sweeper", - "movepool": ["Quiver Dance", "Hex", "Sleep Powder", "Bug Buzz"], - "abilities": ["Levitate"] - } - ] - }, - "minillow": { - "level": 100, - "sets": [ - { - "role": "Setup Sweeper", - "movepool": ["Nasty Plot", "Agility", "Hydro Pump", "Moonblast", "Substitute"], - "abilities": ["Adaptability"] - } - ] - }, - "muabboa": { - "level": 100, - "sets": [ - { - "role": "Fast Attacker", - "movepool": ["Earthquake", "U-Turn", "Close Combat", "Knock Off"], - "abilities": ["Inner Focus"] - }, - { - "role": "Setup Sweeper", - - "movepool": ["Swords Dance", "Earthquake", "Feral Rush", "Close Combat"], - "abilities": ["Inner Focus"] - } - ] - }, - "noxtrice": { - "level": 100, - "sets": [ - { - "role": "Fast Support", - "movepool": ["Poison Jab", "Flare Blitz", "Roost", "U-Turn"], - "abilities": ["Poison Touch"] - }, - { - "role": "Setup Sweeper", - "movepool": ["Gunk Shot", "Flare Blitz", "Earthquake", "Dragon Dance"], - "abilities": ["Poison Touch"] - }, - { - "role": "Setup Sweeper", - "movepool": ["Gunk Shot", "Feral Rush", "Earthquake", "Dragon Dance"], - "abilities": ["Flash Fire"] - } - ] - }, - "nunopod": { - "level": 100, - "sets": [ - { - "role": "Bulky Support", - "movepool": ["Earthquake", "Body Press", "Triple Axel", "Flip Turn", "Stealth Rock", "Rapid Spin", "Recover"], - "abilities": ["Opportunist"] - }, - { - "role": "Bulky Support", - - "movepool": ["Crystal Bash", "Body Press", "Earthquake", "Flip Turn", "Stealth Rock", "Rapid Spin", "Recover"], - "abilities": ["Opportunist"] - } - ] - }, - "orchile": { - "level": 100, - "sets": [ - { - "role": "Bulky Support", - "movepool": ["Moonblast", "Earth Power", "Will-o-Wisp", "Strength Sap", "Spikes"], - "abilities": ["Flower Veil"] - }, - { - "role": "Bulky Setup", - "movepool": ["Moonblast", "Earth Power", "Calm Mind", "Strength Sap"], - "abilities": ["Flower Veil"] - } - ] - }, - "platypad": { - "level": 100, - "sets": [ - { - "role": "Bulky Support", - "movepool": ["Revival Blessing", "Wave Crash", "Flip Turn", "Synthesis"], - "abilities": ["Flower Veil"] - }, - { - "role": "Bulky Setup", - - "movepool": ["Feral Resilience", "Feral Breath", "Giga Drain", "Synthesis"], - "abilities": ["Triage"] - } - ] - }, - "pythos": { - "level": 100, - "sets": [ - { - "role": "Bulky Setup", - "movepool": ["Coil", "Knock Off", "Iron Tail", "Sucker Punch", "Superpower", "Facade"], - "abilities": ["Guts"] - } - ] - }, - "quadringo": { - "level": 100, - "sets": [ - { - "role": "Bulky Support", - "movepool": ["Defog", "Roost", "Dragon Tail", "Earthquake", "Moonblast"], - "abilities": ["Pastel Veil"] - }, - { - "role": "Bulky Setup", - "movepool": ["Calm Mind", "Moonblast", "Mystical Fire", "Roost"], - "abilities": ["Pastel Veil"] - }, - { - "role": "Fast Attacker", - "movepool": ["Moonblast", "Draco Meteor", "Mystical Fire", "Earthquake"], - "abilities": ["Pastel Veil"] - }, - { - "role": "Fast Attacker", - - "movepool": ["Feral Rush", "Earthquake", "Feral Shred", "Roost"], - "abilities": ["Pastel Veil"] - } - ] - }, - "rantler": { - "level": 100, - "sets": [ - { - "role": "Fast Attacker", - "movepool": ["Double Edge", "Ice Spinner", "Superpower", "Earthquake"], - "abilities": ["Slush Rush"] - }, - { - "role": "Setup Sweeper", - "movepool": ["Swords Dance", "Double Edge", "Ice Spinner", "Superpower", "Earthquake", "Quick Attack"], - "abilities": ["Slush Rush"] - }, - { - "role": "Fast Attacker", - "movepool": ["Double Edge", "Ice Spinner", "Superpower", "Quick Attack", "Fake Out"], - "abilities": ["Tough Claws"] - } - ] - }, - "roscenti": { - "level": 100, - "sets": [ - { - "role": "Fast Attacker", - "movepool": ["First Impression", "U-Turn", "Superpower", "Rock Blast", "Bullet Seed"], - "abilities": ["Skill Link"] - }, - { - "role": "Fast Attacker", - - "movepool": ["First Impression", "U-Turn", "Feral Rush", "Drill Run", "Iron Tail"], - "abilities": ["Sheer Force"] - }, - { - "role": "Fast Attacker", - - "movepool": ["First Impression", "U-Turn", "Crystal Tail", "Superpower", "Rock Slide"], - "abilities": ["Sheer Force"] - } - ] - }, - "salamalix": { - "level": 100, - "sets": [ - { - "role": "Bulky Support", - "movepool": ["Stealth Rock", "Spikes", "Stone Edge", "Close Combat", "Iron Head"], - "abilities": ["Intimidate"] - }, - { - "role": "Bulky Setup", - "movepool": ["Swords Dance", "Iron Head", "Close Combat", "Accelerock"], - "abilities": ["Intimidate"] - } - ] - }, - "salaos": { - "level": 100, - "sets": [ - { - "role": "Bulky Support", - "movepool": ["Toxic", "Recover", "Fiery Wrath", "Scald", "Flamethrower", "Toxic Spikes"], - "abilities": ["Good as Gold"] - }, - { - "role": "Bulky Support", - - "movepool": ["Toxic", "Recover", "Crystal Cage", "Flamethrower", "Toxic Spikes"], - "abilities": ["Good as Gold"] - } - ] - }, - "saphor": { - "level": 100, - "sets": [ - { - "role": "Bulky Support", - "movepool": ["Stealth Rock", "Earthquake", "Body Slam", "Slack Off", "Roar", "Heal Bell"], - "abilities": ["Thick Fat"] - }, - { - "role": "Bulky Support", - - "movepool": ["Stealth Rock", "Crystal Tail", "Crystal Shard", "Slack Off", "Roar", "Crystal Healing"], - "abilities": ["Thick Fat"] - }, - { - "role": "Bulky Setup", - - "movepool": ["Bulk Up", "Crystal Cutter", "Slack Off", "Body Press"], - "abilities": ["Thick Fat"] - }, - { - "role": "Bulky Setup", - - "movepool": ["Calm Mind", "Crystal Cage", "Slack Off", "Focus Blast"], - "abilities": ["Thick Fat"] - }, - { - "role": "Fast Attacker", - "movepool": ["Headlong Rush", "Double Edge", "Heavy Slam", "Superpower", "Stone Edge"], - "abilities": ["Thick Fat"] - } - ] - }, - "scalaron": { - "level": 100, - "sets": [ - { - "role": "Bulky Support", - "movepool": ["Flamethrower", "Hurricane", "Roost", "U-Turn", "Defog", "Toxic", "Will-o-Wisp"], - "abilities": ["Filter"] - }, - { - "role": "Bulky Support", - - "movepool": ["Flamethrower", "Crystal Cage", "Roost", "U-Turn", "Defog", "Will-o-Wisp", "Crystal Shard"], - "abilities": ["Filter"] - } - ] - }, - "soleron": { - "level": 100, - "sets": [ - { - "role": "Fast Attacker", - "movepool": ["Thunderbolt", "Hurricane", "Heat Wave", "U-Turn", "Air Slash", "Volt Switch", "Roost"], - "abilities": ["Battle Bond"] - }, - { - "role": "Fast Attacker", - "movepool": ["Thunderbolt", "Feral Power", "Feral Spray", "Volt Switch", "Roost"], - - "abilities": ["Battle Bond"] - }, - { - "role": "Fast Attacker", - "movepool": ["Thunderbolt", "Crystal Burst", "Heat Wave", "Volt Switch", "Hurricane"], - - "abilities": ["Battle Bond"] - } - ] - }, - "torgeist": { - "level": 100, - "sets": [ - { - "role": "Fast Attacker", - "movepool": ["Toxic Thread", "Hex", "Hurricane", "Heat Wave", "Pain Split", "Taunt"], - "abilities": ["Merciless"] - }, - { - "role": "Fast Attacker", - - "movepool": ["Toxic Thread", "Hex", "Feral Power", "Pain Split", "Taunt", "Nasty Plot"], - "abilities": ["Merciless"] - }, - { - "role": "Setup Sweeper", - - "movepool": ["Will-o-Wisp", "Hex", "Feral Power", "Nasty Plot"], - "abilities": ["Cursed Body"] - } - ] - }, - "woolora": { - "level": 100, - "sets": [ - { - "role": "Bulky Setup", - "movepool": ["Calm Mind", "Cotton Guard", "Stored Power", "Draining Kiss"], - "abilities": ["Fluffy", "Pastel Veil"] - }, - { - "role": "Bulky Setup", - "movepool": ["Calm Mind", "Moonlight", "Stored Power", "Moonblast"], - "abilities": ["Fluffy"] - } - ] - }, - "zeploom": { - "level": 100, - "sets": [ - { - "role": "Bulky Support", - "movepool": ["Energy Siphon", "Synthesis", "Stealth Rock", "U-Turn", "Defog", "Toxic", "Earth Power"], - "abilities": ["Wind Rider"] - } - ] - } -} diff --git a/data/random-battles/sixbysix/random-sets.json b/data/random-battles/sixbysix/random-sets.json new file mode 100644 index 0000000000..fe3959a1d6 --- /dev/null +++ b/data/random-battles/sixbysix/random-sets.json @@ -0,0 +1,557 @@ +{ + "kingdraancient": { + "level": 100, + "sets": [ + { + "role": "Fast Bulky Setup", + "movepool": ["Fire Blast", "Agility", "Energy Ball", "Hydro Pump"], + "abilities": ["Protosynthesis"] + }, + { + "role": "Bulky Attacker", + "movepool": ["Giga Drain", "Fire Blast", "Flip Turn", "Synthesis"], + "abilities": ["Competitive"] + } + ] + }, + "kingdrabard": { + "level": 100, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Hydro Pump", "Agility", "Psychic Noise", "Alluring Voice"], + "abilities": ["Punk Rock"] + }, + { + "role": "Wallbreaker", + "movepool": ["Hydro Pump", "Flip Turn", "Psychic Noise", "Alluring Voice"], + "abilities": ["Punk Rock"] + } + ] + }, + "kingdrabrinepool": { + "level": 100, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Scald", "Protect", "Knock Off", "Mortal Spin"], + "abilities": ["Purifying Salt"] + }, + { + "role": "Wallbreaker", + "movepool": ["Hydro Pump", "Water Shuriken", "Sludge Wave", "Flip Turn"], + "abilities": ["Purifying Salt", "Storm Drain"] + } + ] + }, + "kingdraclassic": { + "level": 100, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Hydro Pump", "Draco Meteor", "Agility", "Ice Beam"], + "abilities": ["Berserk"] + }, + { + "role": "Wallbreaker", + "movepool": ["Hydro Pump", "Draco Meteor", "Flip Turn", "Ice Beam"], + "abilities": ["Berserk"] + } + ] + }, + "kingdradruid": { + "level": 100, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["Tachyon Cutter", "Draco Meteor", "Flamethrower", "Ice Beam"], + "abilities": ["Berserk"] + }, + { + "role": "Bulky Setup", + "movepool": ["Tachyon Cutter", "Protect", "Flamethrower", "Calm Mind"], + "abilities": ["Berserk"] + }, + { + "role": "Bulky Attacker", + "movepool": ["Doom Desire", "Parting Shot", "Draco Meteor", "Protect"], + "abilities": ["Berserk", "Heatproof"] + } + ] + }, + "kingdragourmet": { + "level": 100, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Facade", "Baneful Bunker", "Knock Off", "Toxic"], + "abilities": ["Poison Heal"] + }, + { + "role": "Bulky Attacker", + "movepool": ["Facade", "Fake Out", "Knock Off", "Flip Turn"], + "abilities": ["Poison Heal"] + } + ] + }, + "nidoqueenclassic": { + "level": 100, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Barb Barrage", "Earthquake", "Spikes", "Slack Off"], + "abilities": ["Poison Point"] + }, + { + "role": "Bulky Attacker", + "movepool": ["Poison Jab", "Earthquake", "Ice Punch", "Slack Off"], + "abilities": ["Sheer Force"] + } + ] + }, + "nidoqueenerudite": { + "level": 100, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Calm Mind", "Earth Power", "Psychic", "Slack Off"], + "abilities": ["Sheer Force"] + }, + { + "role": "Bulky Attacker", + "movepool": ["Trick Room", "Earth Power", "Psychic", "Ice Beam"], + "abilities": ["Sheer Force"] + }, + { + "role": "Bulky Support", + "movepool": ["Future Sight", "Earth Power", "Roar", "Chilly Reception"], + "abilities": ["Regenerator"] + } + ] + }, + "nidoqueenjasper": { + "level": 100, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Salt Cure", "Earthquake", "Protect", "Glare"], + "abilities": ["Earth Eater"] + }, + { + "role": "Wallbreaker", + "movepool": ["Accelerock", "Earthquake", "Gunk Rock", "Stone Edge"], + "abilities": ["Earth Eater"] + } + ] + }, + "nidoqueenrosegold": { + "level": 100, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Slack Off", "Giga Drain", "Earth Power", "Toxic Spikes"], + "abilities": ["Rough Skin"] + }, + { + "role": "Bulky Attacker", + "movepool": ["Spiky Shield", "Earth Power", "Sludge Bomb", "Leech Seed"], + "abilities": ["Rough Skin"] + } + ] + }, + "nidoqueenshaman": { + "level": 100, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["Poltergeist", "Poison Jab", "Superpower", "Shadow Sneak"], + "abilities": ["Toxic Chain"] + }, + { + "role": "AV Pivot", + "movepool": ["Poltergeist", "Poison Jab", "Earthquake", "Shadow Sneak"], + "abilities": ["Regenerator"] + } + ] + }, + "nidoqueenvolcanic": { + "level": 100, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Protect", "Lava Plume", "Earth Power", "Wish"], + "abilities": ["Flame Body"] + }, + { + "role": "Wallbreaker", + "movepool": ["Thunderbolt", "Fire Blast", "Earth Power", "Ice Beam"], + "abilities": ["Sheer Force"] + }, + { + "role": "Bulky Attacker", + "movepool": ["Protect", "Fire Blast", "Earth Power", "Wish"], + "abilities": ["Sheer Force"] + } + ] + }, + "bisharpassassin": { + "level": 100, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["Triple Axel", "Dynamic Punch", "Parting Shot", "Ice Shard"], + "abilities": ["No Guard"] + }, + { + "role": "Bulky Setup", + "movepool": ["Triple Axel", "Dynamic Punch", "Curse", "Ice Shard"], + "abilities": ["No Guard"] + } + ] + }, + "bisharpcenturion": { + "level": 100, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["Bullet Punch", "Superpower", "Switcheroo", "Iron Head"], + "abilities": ["Technician"] + }, + { + "role": "Wallbreaker", + "movepool": ["Bullet Punch", "Drain Punch", "Bulk Up", "Iron Head"], + "abilities": ["Technician"] + }, + { + "role": "Setup Sweeper", + "movepool": ["Bullet Punch", "Drain Punch", "Swords Dance", "Iron Head"], + "abilities": ["Technician"] + } + ] + }, + "bisharpmantis": { + "level": 100, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Ceaseless Edge", "Leech Life", "First Impression", "Bitter Blade"], + "abilities": ["Orichalcum Pulse"] + }, + { + "role": "Setup Sweeper", + "movepool": ["Sucker Punch", "Leech Life", "Swords Dance", "Bitter Blade"], + "abilities": ["Orichalcum Pulse"] + } + ] + }, + "bisharprevenant": { + "level": 100, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Recover", "Shadow Sneak", "Sacred Sword", "Poltergeist"], + "abilities": ["Magic Bounce"] + }, + { + "role": "Bulky Setup", + "movepool": ["Recover", "Shadow Sneak", "Swords Dance", "Behemoth Blade"], + "abilities": ["Magic Bounce"] + } + ] + }, + "bisharpronin": { + "level": 100, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Barb Barrage", "U-turn", "Sacred Sword", "Stealth Rock"], + "abilities": ["Technician"] + }, + { + "role": "Wallbreaker", + "movepool": ["Barb Barrage", "U-turn", "Sacred Sword", "Bulldoze"], + "abilities": ["Technician"] + } + ] + }, + "bisharpsavage": { + "level": 100, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Leech Seed", "Bullet Punch", "Power Whip", "Thunder Wave"], + "abilities": ["Technician"] + }, + { + "role": "Bulky Setup", + "movepool": ["Bulk Up", "Bullet Punch", "Power Whip", "Body Press"], + "abilities": ["Technician"] + } + ] + }, + "corviknightanalytical": { + "level": 100, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Psychic", "Thunderbolt", "U-turn", "Heat Wave"], + "abilities": ["Psychic Surge"] + }, + { + "role": "Fast Support", + "movepool": ["Reflect", "Light Screen", "U-turn", "Psychic"], + "abilities": ["Psychic Surge"] + }, + { + "role": "Fast Bulky Setup", + "movepool": ["Psychic", "Thunderbolt", "Calm Mind", "Heat Wave"], + "abilities": ["Psychic Surge"] + } + ] + }, + "corviknightfalcon": { + "level": 100, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Brave Bird", "Close Combat", "U-turn", "Knock Off"], + "abilities": ["Guts"] + }, + { + "role": "Fast Support", + "movepool": ["Reflect", "Light Screen", "U-turn", "Taunt"], + "abilities": ["Delta Stream"] + } + ] + }, + "corviknightgenie": { + "level": 100, + "sets": [ + { + "role": "Fast Bulky Setup", + "movepool": ["Earth Power", "Calm Mind", "Heat Wave", "Rest"], + "abilities": ["Prankster"] + }, + { + "role": "AV Pivot", + "movepool": ["Scorching Sands", "U-turn", "Heat Wave", "Thunderbolt"], + "abilities": ["Intimidate"] + }, + { + "role": "Fast Support", + "movepool": ["Reflect", "Light Screen", "U-turn", "Earth Power"], + "abilities": ["Prankster"] + } + ] + }, + "corviknightmartian": { + "level": 100, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Trick Room", "Teleport", "Thunderbolt", "Psychic"], + "abilities": ["Hadron Engine"] + }, + { + "role": "Bulky Support", + "movepool": ["Doom Desire", "Teleport", "Thunderbolt", "Psychic"], + "abilities": ["Hadron Engine"] + }, + { + "role": "Bulky Setup", + "movepool": ["Calm Mind", "Flash Cannon", "Thunderbolt", "Psychic Noise"], + "abilities": ["Hadron Engine"] + } + ] + }, + "corviknightthunderbird": { + "level": 100, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Thunder", "Hurricane", "U-turn", "Roost"], + "abilities": ["Drizzle"] + }, + { + "role": "Fast Support", + "movepool": ["Reflect", "Light Screen", "U-turn", "Hurricane"], + "abilities": ["Drizzle"] + } + ] + }, + "corviknightyeti": { + "level": 100, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Blizzard", "Bleakwind Storm", "Volt Switch", "Roost"], + "abilities": ["Snow Warning"] + }, + { + "role": "Fast Support", + "movepool": ["Reflect", "Light Screen", "U-turn", "Blizzard"], + "abilities": ["Snow Warning"] + } + ] + }, + "krookodileabyssal": { + "level": 100, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Dragon Dance", "Earthquake", "Knock Off", "Flare Blitz"], + "abilities": ["Multiscale"] + }, + { + "role": "Fast Attacker", + "movepool": ["Parting Shot", "Earthquake", "Knock Off", "Flare Blitz"], + "abilities": ["Multiscale"] + } + ] + }, + "krookodilecavedweller": { + "level": 100, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Parting Shot", "Earthquake", "Stone Edge", "Flare Blitz"], + "abilities": ["Magic Guard"] + }, + { + "role": "Wallbreaker", + "movepool": ["Explosion", "Earthquake", "Stone Edge", "Flare Blitz"], + "abilities": ["Magic Guard"] + } + ] + }, + "krookodilecliffside": { + "level": 100, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Parting Shot", "Dark Pulse", "Draco Meteor", "Flamethrower"], + "abilities": ["Intimidate"] + }, + { + "role": "Wallbreaker", + "movepool": ["Switcheroo", "Dark Pulse", "Draco Meteor", "Flamethrower"], + "abilities": ["Intimidate"] + } + ] + }, + "krookodileinfernal": { + "level": 100, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Parting Shot", "Magma Storm", "Fiery Wrath", "Eruption"], + "abilities": ["Magic Guard"] + }, + { + "role": "Fast Support", + "movepool": ["Parting Shot", "Fire Lash", "Knock Off", "Will-O-Wisp"], + "abilities": ["Magic Guard"] + } + ] + }, + "krookodilequantum": { + "level": 100, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Parting Shot", "Volt Tackle", "Head Smash", "Earthquake"], + "abilities": ["Rock Head"] + }, + { + "role": "Fast Support", + "movepool": ["Parting Shot", "Encore", "Head Smash", "Volt Tackle"], + "abilities": ["Prankster"] + } + ] + }, + "krookodilewetlander": { + "level": 100, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Synthesis", "Wave Crash", "Wood Hammer", "Knock Off"], + "abilities": ["Wind Rider", "Wonder Skin"] + }, + { + "role": "Wallbreaker", + "movepool": ["Parting Shot", "Wave Crash", "Wood Hammer", "Knock Off"], + "abilities": ["Wind Rider", "Wonder Skin"] + } + ] + }, + "ogerponankh": { + "level": 100, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Swords Dance", "Poltergeist", "Earthquake", "Stone Edge"], + "abilities": ["Good as Gold"] + }, + { + "role": "Wallbreaker", + "movepool": ["U-turn", "Shadow Ball", "Earth Power", "Dazzling Gleam"], + "abilities": ["Good as Gold"] + } + ] + }, + "ogerponeaster": { + "level": 100, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["U-turn", "Moonblast", "Hyper Voice", "Mystical Fire"], + "abilities": ["Pickpocket"] + }, + { + "role": "Setup Sweeper", + "movepool": ["Calm Mind", "Moonblast", "Soft-Boiled", "Mystical Fire"], + "abilities": ["Pickpocket"] + } + ] + }, + "ogerponeid": { + "level": 100, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Knock Off", "Recover", "Surf", "Shadow Ball"], + "abilities": ["Tangling Hair"] + }, + { + "role": "Fast Support", + "movepool": ["Hex", "Recover", "Surf", "Toxic"], + "abilities": ["Tangling Hair"] + } + ] + }, + "ogerponkitsune": { + "level": 100, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Knock Off", "U-turn", "Earth Power", "Power Whip"], + "abilities": ["Protean"] + } + ] + }, + "ogerponmuerta": { + "level": 100, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Poltergeist", "Moonblast", "U-turn", "Will-O-Wisp"], + "abilities": ["Wandering Spirit"] + }, + { + "role": "Wallbreaker", + "movepool": ["Poltergeist", "Moonblast", "U-turn", "Shadow Sneak"], + "abilities": ["Wandering Spirit"] + } + ] + } +} diff --git a/data/random-battles/scootopiav2/teams.ts b/data/random-battles/sixbysix/teams.ts similarity index 94% rename from data/random-battles/scootopiav2/teams.ts rename to data/random-battles/sixbysix/teams.ts index c03dcede03..e321ed1a71 100644 --- a/data/random-battles/scootopiav2/teams.ts +++ b/data/random-battles/sixbysix/teams.ts @@ -1,1001 +1,960 @@ -import { RandomTeams, type MoveCounter } from "../gen9/teams"; - -// Moves that restore HP: -const RECOVERY_MOVES = [ - 'healorder', 'milkdrink', 'moonlight', 'morningsun', 'recover', 'roost', 'shoreup', 'slackoff', 'softboiled', 'strengthsap', 'synthesis', -]; -// Moves that boost Attack: -const PHYSICAL_SETUP = [ - 'bellydrum', 'bulkup', 'coil', 'curse', 'dragondance', 'honeclaws', 'howl', 'meditate', 'poweruppunch', 'swordsdance', 'tidyup', 'victorydance', - 'filletaway', -]; -// Moves which boost Special Attack: -const SPECIAL_SETUP = [ - 'calmmind', 'chargebeam', 'geomancy', 'nastyplot', 'quiverdance', 'tailglow', 'takeheart', 'torchsong', 'filletaway', -]; -// Some moves that only boost Speed: -const SPEED_SETUP = [ - 'agility', 'autotomize', 'flamecharge', 'rockpolish', 'trailblaze', -]; -// Conglomerate for ease of access -const SETUP = [ - 'acidarmor', 'agility', 'autotomize', 'bellydrum', 'bulkup', 'calmmind', 'clangoroussoul', 'coil', 'cosmicpower', 'curse', 'dragondance', - 'filletaway', 'flamecharge', 'growth', 'honeclaws', 'howl', 'irondefense', 'meditate', 'nastyplot', 'noretreat', 'poweruppunch', 'quiverdance', - 'rockpolish', 'shellsmash', 'shiftgear', 'swordsdance', 'tailglow', 'takeheart', 'tidyup', 'trailblaze', 'trickroom', 'workup', 'victorydance', - 'feralresilience', 'feralspray', 'crystalfortification', -]; -const SPEED_CONTROL = [ - 'electroweb', 'glare', 'icywind', 'lowsweep', 'quash', 'stringshot', 'tailwind', 'thunderwave', 'trickroom', -]; -// Hazard-setting moves -const HAZARDS = [ - 'spikes', 'stealthrock', 'stickyweb', 'toxicspikes', 'crystalshard', -]; -// Protect and its variants -const PROTECT_MOVES = [ - 'banefulbunker', 'burningbulwark', 'protect', 'silktrap', 'spikyshield', -]; -// Moves that switch the user out -const PIVOT_MOVES = [ - 'chillyreception', 'flipturn', 'partingshot', 'shedtail', 'teleport', 'uturn', 'voltswitch', -]; - -// Moves that should be paired together when possible -const MOVE_PAIRS = [ - ['lightscreen', 'reflect'], - ['sleeptalk', 'rest'], - ['protect', 'wish'], - ['spikyshield', 'wish'], - ['leechseed', 'protect'], - ['leechseed', 'substitute'], - ['moongeistbeam', 'moonlight'], - ['hex', 'willowisp'], - ['hex', 'toxic'], - ['hex', 'thunderwave'], - ['nightmare', 'willowisp'], - ['nightmare', 'toxic'], - ['nightmare', 'thunderwave'], -]; - -/** Pokemon who always want priority STAB, and are fine with it as its only STAB move of that type */ -const PRIORITY_POKEMON = [ - 'breloom', 'brutebonnet', 'cacturne', 'honchkrow', 'mimikyu', 'ragingbolt', 'scizor', -]; - -/** Pokemon who should never be in the lead slot */ -const NO_LEAD_POKEMON = [ - 'Zacian', 'Zamazenta', -]; -const DOUBLES_NO_LEAD_POKEMON = [ - 'Basculegion', 'Houndstone', 'Iron Bundle', 'Roaring Moon', 'Zacian', 'Zamazenta', -]; -export class RandomSCTeams extends RandomTeams { - override cullMovePool( - types: string[], - moves: Set, - abilities: string[], - 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 is not room for them 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])); - } - } - } - - // Develop additional move lists - const statusMoves = this.cachedStatusMoves; - - // Team-based move culls - if (teamDetails.screens) { - if (movePool.includes('auroraveil')) this.fastPop(movePool, movePool.indexOf('auroraveil')); - if (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 (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; - } - 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 = [ - // In order of decreasing generalizability - [SPEED_CONTROL, SPEED_CONTROL], - [HAZARDS, HAZARDS], - ['rockslide', 'stoneedge'], - [SETUP, ['fakeout', 'helpinghand']], - [PROTECT_MOVES, 'wideguard'], - [['fierydance', 'fireblast'], 'heatwave'], - ['dazzlinggleam', ['fleurcannon', 'moonblast']], - ['poisongas', ['toxicspikes', 'willowisp']], - [RECOVERY_MOVES, ['healpulse', 'lifedew']], - ['healpulse', 'lifedew'], - ['haze', 'icywind'], - [['hydropump', 'muddywater'], ['muddywater', 'scald']], - ['disable', 'encore'], - ['freezedry', 'icebeam'], - ['energyball', 'leafstorm'], - ['earthpower', 'sandsearstorm'], - ['coaching', ['helpinghand', 'howl']], - ]; - - for (const pair of doublesIncompatiblePairs) this.incompatibleMoves(moves, movePool, pair[0], pair[1]); - - if (role !== 'Offensive Protect') this.incompatibleMoves(moves, movePool, PROTECT_MOVES, ['flipturn', 'uturn']); - } - - // General incompatibilities - const incompatiblePairs = [ - // These moves don't mesh well with other aspects of the set - [statusMoves, ['healingwish', 'switcheroo', 'trick']], - [SETUP, PIVOT_MOVES], - [SETUP, HAZARDS], - [SETUP, ['defog', 'nuzzle', 'toxic', 'yawn', 'haze']], - [PHYSICAL_SETUP, PHYSICAL_SETUP], - [SPECIAL_SETUP, 'thunderwave'], - ['substitute', PIVOT_MOVES], - [SPEED_SETUP, ['aquajet', 'rest', 'trickroom']], - ['curse', ['irondefense', 'rapidspin']], - ['dragondance', 'dracometeor'], - ['yawn', 'roar'], - ['trick', 'uturn'], - - // These attacks are redundant with each other - [['psychic', 'psychicnoise'], ['psyshock', 'psychicnoise']], - ['surf', ['hydropump', 'scald']], - ['liquidation', 'wavecrash'], - ['aquajet', 'flipturn'], - ['gigadrain', 'leafstorm'], - ['powerwhip', 'hornleech'], - ['airslash', 'hurricane'], - ['knockoff', 'foulplay'], - ['throatchop', ['crunch', 'lashout']], - ['doubleedge', ['bodyslam', 'headbutt']], - [['fireblast', 'magmastorm'], ['fierydance', 'flamethrower', 'lavaplume']], - ['thunderpunch', 'wildcharge'], - ['thunderbolt', 'discharge'], - ['gunkshot', ['direclaw', 'poisonjab', 'sludgebomb']], - ['aurasphere', 'focusblast'], - ['closecombat', 'drainpunch'], - [['dragonpulse', 'spacialrend'], 'dracometeor'], - ['heavyslam', 'flashcannon'], - ['alluringvoice', 'dazzlinggleam'], - ['defog', 'rapidspin'], - - // These status moves are redundant with each other - ['taunt', 'disable'], - [['thunderwave', 'toxic'], ['thunderwave', 'willowisp']], - [['thunderwave', 'toxic', 'willowisp'], 'toxicspikes'], - - // This space reserved for assorted hardcodes that otherwise make little sense out of context - // Landorus and Thundurus - ['nastyplot', ['rockslide', 'knockoff']], - // Persian - ['switcheroo', 'fakeout'], - // Amoonguss, though this can work well as a general rule later - ['toxic', 'clearsmog'], - // Chansey and Blissey - ['healbell', 'stealthrock'], - // Araquanid and Magnezone - ['mirrorcoat', ['hydropump', 'bodypress']], - ]; - - for (const pair of incompatiblePairs) this.incompatibleMoves(moves, movePool, pair[0], pair[1]); - - if (!types.includes('Ice')) this.incompatibleMoves(moves, movePool, 'icebeam', 'icywind'); - - if (!isDoubles) this.incompatibleMoves(moves, movePool, 'taunt', 'encore'); - - if (!types.includes('Dark') && teraType !== 'Dark') this.incompatibleMoves(moves, movePool, 'knockoff', 'suckerpunch'); - - if (!abilities.includes('Prankster')) this.incompatibleMoves(moves, movePool, 'thunderwave', 'yawn'); - - // This space reserved for assorted hardcodes that otherwise make little sense out of context: - // To force Close Combat on Barraskewda without locking it to Tera Fighting - if (species.id === 'barraskewda') { - this.incompatibleMoves(moves, movePool, ['psychicfangs', 'throatchop'], ['poisonjab', 'throatchop']); - } - // To force Toxic on Quagsire - if (species.id === 'quagsire') this.incompatibleMoves(moves, movePool, 'spikes', 'icebeam'); - // Taunt/Knock should be Cyclizar's flex moveslot - if (species.id === 'cyclizar') this.incompatibleMoves(moves, movePool, 'taunt', 'knockoff'); - // To force Stealth Rock on Camerupt - if (species.id === 'camerupt') this.incompatibleMoves(moves, movePool, 'roar', 'willowisp'); - // nothing else rolls these lol - if (species.id === 'coalossal') this.incompatibleMoves(moves, movePool, 'flamethrower', 'overheat'); - } - - override randomMoveset( - types: string[], - abilities: string[], - teamDetails: RandomTeamsTypes.TeamDetails, - species: Species, - isLead: boolean, - isDoubles: boolean, - movePool: string[], - teraType: string, - role: RandomTeamsTypes.Role, - ): Set { - const moves = new Set(); - if (this.getSuperType(moves)) types[1] = this.getSuperType(moves); - 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; - } - - 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.includes('Guts')) { - counter = this.addMove('facade', moves, types, abilities, teamDetails, species, isLead, isDoubles, - movePool, teraType, role); - } - - // Enforce Night Shade, Revelation Dance, Revival Blessing, and Sticky Web - for (const moveid of ['nightshade', 'revelationdance', 'revivalblessing', 'stickyweb']) { - if (movePool.includes(moveid)) { - counter = this.addMove(moveid, moves, types, abilities, teamDetails, species, isLead, isDoubles, - movePool, teraType, role); - } - } - - // Enforce Trick Room on Doubles Wallbreaker - if (movePool.includes('trickroom') && role === 'Doubles Wallbreaker') { - counter = this.addMove('trickroom', 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 in singles - if (!isDoubles && 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 Flip Turn on pure Water-type Wallbreakers - if (types.length === 1 && types.includes('Water') && - role === 'Wallbreaker' && movePool.includes('flipturn')) { - counter = this.addMove('flipturn', moves, types, abilities, teamDetails, species, isLead, isDoubles, - movePool, teraType, role); - } - - // Enforce Spore on Smeargle - if (species.id === 'smeargle') { - if (movePool.includes('spore')) { - counter = this.addMove('spore', moves, types, abilities, teamDetails, species, isLead, isDoubles, - movePool, teraType, role); - } - } - - // Enforce moves in doubles - if (isDoubles) { - const doublesEnforcedMoves = ['auroraveil', 'mortalspin', 'spore']; - for (const moveid of doublesEnforcedMoves) { - if (movePool.includes(moveid)) { - counter = this.addMove(moveid, moves, types, abilities, teamDetails, species, isLead, isDoubles, - movePool, teraType, role); - } - } - // Enforce Fake Out on slow Pokemon - if (movePool.includes('fakeout') && species.baseStats.spe <= 50) { - counter = this.addMove('fakeout', moves, types, abilities, teamDetails, species, isLead, isDoubles, - movePool, teraType, role); - } - // Enforce Tailwind on Prankster and Gale Wings users - if (movePool.includes('tailwind') && (abilities.includes('Prankster') || abilities.includes('Gale Wings'))) { - counter = this.addMove('tailwind', moves, types, abilities, teamDetails, species, isLead, isDoubles, - movePool, teraType, role); - } - // Enforce Thunder Wave on Prankster users as well - if (movePool.includes('thunderwave') && abilities.includes('Prankster')) { - counter = this.addMove('thunderwave', moves, types, abilities, teamDetails, species, isLead, isDoubles, - movePool, teraType, role); - } - } - - // Enforce STAB priority - if ( - ['Bulky Attacker', 'Bulky Setup', 'Wallbreaker', 'Doubles Wallbreaker'].includes(role) || - PRIORITY_POKEMON.includes(species.id) - ) { - 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.includes('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 a single STAB for Moltres - if (species.id === 'moltres') { - const typeToEnforce = this.randomChance(1, 2) ? 'Fire' : 'Flying'; - - 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) && typeToEnforce === moveType) { - stabMoves.push(moveid); - } - } - while (runEnforcementChecker(typeToEnforce)) { - if (!stabMoves.length) break; - const moveid = this.sampleNoReplace(stabMoves); - counter = this.addMove(moveid, moves, types, abilities, teamDetails, species, isLead, isDoubles, - movePool, teraType, role); - } - } - - // Enforce STAB - for (const type of types) { - // Moltres already has STAB, so ignore this block - if (species.id === 'moltres') break; - // prevents Meowscarada from being enforced stab moves - if (species.id === 'meowscarada') break; - // 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 - // prevents Meowscarada from being enforced stab moves (since it has Protean and doesn't care) - if (!counter.get('stabtera') && !['Bulky Support', 'Doubles Support'].includes(role) && - !abilities.includes('Protean')) { - 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 - // prevents Meowscarada from being enforced stab moves (since it has Protean and doesn't care) - if (!counter.get('stab') && !abilities.includes('Protean')) { - 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 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 redirecting moves and Fake Out on Doubles Support - if (role === 'Doubles Support') { - for (const moveid of ['fakeout', 'followme', 'ragepowder']) { - if (movePool.includes(moveid)) { - counter = this.addMove(moveid, moves, types, abilities, teamDetails, species, isLead, isDoubles, - movePool, teraType, role); - } - } - } - - // Enforce Protect - if (role.includes('Protect')) { - const protectMoves = movePool.filter(moveid => PROTECT_MOVES.includes(moveid)); - if (protectMoves.length) { - const moveid = this.sample(protectMoves); - 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 (!['AV Pivot', 'Fast Support', 'Bulky Support', 'Bulky Protect', 'Doubles Support'].includes(role)) { - 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; - } - - override getPriorityItem( - ability: string, - types: string[], - moves: Set, - counter: MoveCounter, - teamDetails: RandomTeamsTypes.TeamDetails, - species: Species, - isLead: boolean, - isDoubles: boolean, - teraType: string, - role: RandomTeamsTypes.Role, - ) { - if (this.getSuperType(moves)) return this.getSuperType(moves) + " Orb"; - if (!isDoubles) { - if (role === 'Fast Bulky Setup' && (ability === 'Quark Drive' || ability === 'Protosynthesis')) { - return 'Booster Energy'; - } - if (species.id === 'lokix') { - return (role === 'Fast Attacker') ? 'Silver Powder' : 'Life Orb'; - } - } - if (species.requiredItems) { - // Z-Crystals aren't available in Gen 9, so require Plates - if (species.baseSpecies === 'Arceus') { - return species.requiredItems[0]; - } - return this.sample(species.requiredItems); - } - if (role === 'AV Pivot') return 'Assault Vest'; - // Super Type hardcodes - if (species.id === 'cyllindrake' && moves.has('shiftgear')) return 'Throat Spray'; - if (species.id === 'albatrygon' && moves.has('acrobatics')) return 'Sitrus Berry'; - if (species.id === 'yiankutku' && moves.has('facade') || species.id === 'bluekutku' && moves.has('facade')) { - return 'Frost Orb'; - } - if (species.id === 'xenojiiva' && ability === 'Quark Drive') return 'Booster Energy'; - if (species.id === 'odogaron' && moves.has('closecombat')) return 'White Herb'; - if (species.id === 'odogaron' && !moves.has('closecombat')) return 'Sitrus Berry'; - if ( - ability === 'Magic Guard' || ability === 'Fervent Scales' || - (ability === 'Sheer Force' && counter.get('sheerforce')) - ) { - return 'Life Orb'; - } - if (moves.has('devour') && ability === 'Unburden') return 'Liechi Berry'; - if (moves.has('virulentvolley')) return 'Loaded Dice'; - if (moves.has('magnalance') && ability === 'Reactive Core') return 'Flame Orb'; - if (moves.has('dragondance') && ability === 'Reactive Core') return 'Frost Orb'; - // other - if (moves.has('substitute')) return 'Leftovers'; - if (moves.has('protect') && ability !== 'Speed Boost') return 'Leftovers'; - if (counter.get('skilllink') && ability !== 'Skill Link' && species.id !== 'breloom') return 'Loaded Dice'; - if (moves.has('shellsmash') && ability !== 'Weak Armor') return 'White Herb'; - if ((ability === 'Guts' || moves.has('facade')) && !moves.has('sleeptalk')) { - return (types.includes('Fire') || ability === 'Toxic Boost' || ability === 'Poison Heal') ? 'Toxic Orb' : 'Flame Orb'; - } - if (['healingwish', 'switcheroo', 'trick'].some(m => moves.has(m))) { - if ( - species.baseStats.spe >= 60 && species.baseStats.spe <= 108 && - role !== 'Wallbreaker' && role !== 'Doubles Wallbreaker' && !counter.get('priority') - ) { - return 'Choice Scarf'; - } else { - return (counter.get('Physical') > counter.get('Special')) ? 'Choice Band' : 'Choice Specs'; - } - } - if ( - role === 'Wallbreaker' && (counter.get('Physical') > counter.get('Special')) && !counter.get('Status') - ) { - return 'Choice Band'; - } - if ( - role === 'Wallbreaker' && (counter.get('Physical') < counter.get('Special')) && !counter.get('Status') - ) { - return 'Choice Specs'; - } - if (ability === 'Poison Heal' || ability === 'Quick Feet') return 'Toxic Orb'; - if (moves.has('acrobatics') && ability !== 'Quark Drive' && ability !== 'Protosynthesis') return ''; - if (moves.has('auroraveil') || moves.has('lightscreen') && moves.has('reflect')) return 'Light Clay'; - if (ability === 'Gluttony') return `${this.sample(['Aguav', 'Figy', 'Iapapa', 'Mago', 'Wiki'])} Berry`; - if ( - ['Cheek Pouch', 'Cud Chew', 'Harvest', 'Ripen'].some(m => ability === m) || - moves.has('bellydrum') || moves.has('filletaway') - ) { - return 'Sitrus Berry'; - } - if (this.dex.getEffectiveness('Rock', species) >= 2) return 'Heavy-Duty Boots'; - if (species.nfe) return 'Eviolite'; - if (['Bulky Attacker', 'Bulky Support', 'Bulky Setup'].some(m => role === (m))) return 'Leftovers'; - if (role === 'Fast Support' || role === 'Fast Bulky Setup') { - return (counter.get('Physical') + counter.get('Special') >= 3) ? 'Life Orb' : 'Leftovers'; - } - } - - getSuperType(moves: Set | string[]): string { - for (const move of moves) { - if (move.includes('crystal')) return "Crystal"; - if (move.includes('feral')) return "Feral"; - } - return ""; - } - - override 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: RandomTeamsTypes.RandomSetData[] = []; - - // 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 = set.abilities!; - if ( - isLead && (abilities.includes('Protosynthesis') || abilities.includes('Quark Drive')) && - set.role === 'Fast Bulky Setup' - ) continue; - // Prevent Tera Blast user if the team already has one, or if Terastallizion is prevented. - // used here to limit team to 1 Super Types user - if (teamDetails.teraBlast && 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 = []; - types[0] = species.types[0]; - if (species.types[1]) types[1] = species.types[1]; - const abilities = set.abilities!; - - // Get moves - const moves = this.randomMoveset(types, abilities, teamDetails, species, isLead, isDoubles, movePool, teraType, role); - const counter = this.queryMoves(moves, species, teraType, abilities); - - if (this.getSuperType(moves)) types[1] = this.getSuperType(moves); - - // 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) { - if (isDoubles) { - item = this.getDoublesItem(ability, types, moves, counter, teamDetails, species, isLead, teraType, role); - } else { - 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', 'Eviolite'].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'; - }); - // prevents Illumise (who can turn into Volbeat with Physical moves) from having 0 Atk EVs - if (noAttackStatMoves && !moves.has('transform') && this.format.mod !== 'partnersincrime' && - species.id !== 'illumise') { - evs.atk = 0; - ivs.atk = 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 || (this.random(2) ? 'F' : 'M')), - shiny: this.randomChance(1, 1024), - level, - moves: shuffledMoves, - ability, - evs, - ivs, - item, - teraType, - role, - }; - } - - override randomSets: { [species: string]: RandomTeamsTypes.RandomSpeciesData } = require('./random-sets.json'); - - randomSCTeam() { - this.enforceNoDirectCustomBanlistChanges(); - - const seed = this.prng.getSeed(); - const ruleTable = this.dex.formats.getRuleTable(this.format); - const pokemon: RandomTeamsTypes.RandomSet[] = []; - - // For Monotype - const isMonotype = !!this.forceMonotype || ruleTable.has('sametypeclause'); - const isDoubles = this.format.gameType !== 'singles'; - const typePool = this.dex.types.names().filter(name => name !== "Stellar"); - const type = this.forceMonotype || this.sample(typePool); - - // PotD stuff - // const usePotD = global.Config && Config.potd && ruleTable.has('potd'); - // const potd = usePotD ? this.dex.species.get(Config.potd) : null; - - const baseFormes: { [k: string]: number } = {}; - - // const superTypeCount = 0; - 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 [pokemonPool, baseSpeciesPool] = this.getPokemonPool(type, pokemon, isMonotype, pokemonList); - - let leadsRemaining = this.format.gameType === 'doubles' ? 2 : 1; - 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[species.baseSpecies]) continue; - - // Treat Ogerpon formes and Terapagos like the Tera Blast user role; reject if team has one already - if (['ogerpon', 'ogerponhearthflame', 'terapagos'].includes(species.id) && teamDetails.teraBlast) continue; - - // Illusion shouldn't be on the last slot - if (species.baseSpecies === 'Sorrowcean' && 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; - - // Limit three of any type combination in Monotype - if (!this.forceMonotype && isMonotype && (typeComboCount[typeCombo] >= 3 * limitFactor)) continue; - - // The Pokemon of the Day - // if (potd?.exists && (pokemon.length === 1 || this.maxTeamSize === 1)) species = potd; - - // testing code - // if (pokemon.length === 0 || this.maxTeamSize === 1) species = this.dex.species.get('Terapagos'); - - let set: RandomTeamsTypes.RandomSet; - - if (leadsRemaining) { - if ( - isDoubles && DOUBLES_NO_LEAD_POKEMON.includes(species.baseSpecies) || - !isDoubles && NO_LEAD_POKEMON.includes(species.baseSpecies) - ) { - if (pokemon.length + leadsRemaining === this.maxTeamSize) continue; - set = this.randomSet(species, teamDetails, false, isDoubles); - if (teamDetails.teraBlast && this.getSuperType(set.moves)) continue; - pokemon.push(set); - } else { - set = this.randomSet(species, teamDetails, true, isDoubles); - if (teamDetails.teraBlast && this.getSuperType(set.moves)) continue; - pokemon.unshift(set); - leadsRemaining--; - } - } else { - set = this.randomSet(species, teamDetails, false, isDoubles); - if (teamDetails.teraBlast && this.getSuperType(set.moves)) continue; - 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 item counter - if (set.item === "Crystal Orb" || set.item === "Feral Orb") { - teamDetails.teraBlast = 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]++; - } - } - // Count Dry Skin/Fluffy as Fire weaknesses - if (['Dry Skin', 'Fluffy'].includes(set.ability) && this.dex.getEffectiveness('Fire', species) === 0) { - typeWeaknesses['Fire']++; - } - 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 RandomSCTeams; +import { RandomTeams, type MoveCounter } from "../gen9/teams"; + +// Moves that restore HP: +const RECOVERY_MOVES = [ + 'healorder', 'milkdrink', 'moonlight', 'morningsun', 'recover', 'roost', 'shoreup', 'slackoff', 'softboiled', 'strengthsap', 'synthesis', +]; +// Moves that boost Attack: +const PHYSICAL_SETUP = [ + 'bellydrum', 'bulkup', 'coil', 'curse', 'dragondance', 'honeclaws', 'howl', 'meditate', 'poweruppunch', 'swordsdance', 'tidyup', 'victorydance', + 'filletaway', +]; +// Moves which boost Special Attack: +const SPECIAL_SETUP = [ + 'calmmind', 'chargebeam', 'geomancy', 'nastyplot', 'quiverdance', 'tailglow', 'takeheart', 'torchsong', 'filletaway', +]; +// Some moves that only boost Speed: +const SPEED_SETUP = [ + 'agility', 'autotomize', 'flamecharge', 'rockpolish', 'trailblaze', +]; +// Conglomerate for ease of access +const SETUP = [ + 'acidarmor', 'agility', 'autotomize', 'bellydrum', 'bulkup', 'calmmind', 'clangoroussoul', 'coil', 'cosmicpower', 'curse', 'dragondance', + 'filletaway', 'flamecharge', 'growth', 'honeclaws', 'howl', 'irondefense', 'meditate', 'nastyplot', 'noretreat', 'poweruppunch', 'quiverdance', + 'rockpolish', 'shellsmash', 'shiftgear', 'swordsdance', 'tailglow', 'takeheart', 'tidyup', 'trailblaze', 'trickroom', 'workup', 'victorydance', + 'feralresilience', 'feralspray', 'crystalfortification', +]; +const SPEED_CONTROL = [ + 'electroweb', 'glare', 'icywind', 'lowsweep', 'quash', 'stringshot', 'tailwind', 'thunderwave', 'trickroom', +]; +// Hazard-setting moves +const HAZARDS = [ + 'spikes', 'stealthrock', 'stickyweb', 'toxicspikes', 'crystalshard', +]; +// Protect and its variants +const PROTECT_MOVES = [ + 'banefulbunker', 'burningbulwark', 'protect', 'silktrap', 'spikyshield', +]; +// Moves that switch the user out +const PIVOT_MOVES = [ + 'chillyreception', 'flipturn', 'partingshot', 'shedtail', 'teleport', 'uturn', 'voltswitch', +]; + +// Moves that should be paired together when possible +const MOVE_PAIRS = [ + ['lightscreen', 'reflect'], + ['sleeptalk', 'rest'], + ['protect', 'wish'], + ['spikyshield', 'wish'], + ['leechseed', 'protect'], + ['leechseed', 'substitute'], + ['moongeistbeam', 'moonlight'], + ['hex', 'willowisp'], + ['hex', 'toxic'], + ['hex', 'thunderwave'], + ['nightmare', 'willowisp'], + ['nightmare', 'toxic'], + ['nightmare', 'thunderwave'], +]; + +/** Pokemon who always want priority STAB, and are fine with it as its only STAB move of that type */ +const PRIORITY_POKEMON = [ + 'breloom', 'brutebonnet', 'cacturne', 'honchkrow', 'mimikyu', 'ragingbolt', 'scizor', +]; + +/** Pokemon who should never be in the lead slot */ +const NO_LEAD_POKEMON = [ + 'Zacian', 'Zamazenta', +]; +const DOUBLES_NO_LEAD_POKEMON = [ + 'Basculegion', 'Houndstone', 'Iron Bundle', 'Roaring Moon', 'Zacian', 'Zamazenta', +]; +export class Random6x6Teams extends RandomTeams { + override cullMovePool( + types: string[], + moves: Set, + abilities: string[], + 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 is not room for them 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])); + } + } + } + + // Develop additional move lists + const statusMoves = this.cachedStatusMoves; + + // Team-based move culls + if (teamDetails.screens) { + if (movePool.includes('auroraveil')) this.fastPop(movePool, movePool.indexOf('auroraveil')); + if (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 (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; + } + 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 = [ + // In order of decreasing generalizability + [SPEED_CONTROL, SPEED_CONTROL], + [HAZARDS, HAZARDS], + ['rockslide', 'stoneedge'], + [SETUP, ['fakeout', 'helpinghand']], + [PROTECT_MOVES, 'wideguard'], + [['fierydance', 'fireblast'], 'heatwave'], + ['dazzlinggleam', ['fleurcannon', 'moonblast']], + ['poisongas', ['toxicspikes', 'willowisp']], + [RECOVERY_MOVES, ['healpulse', 'lifedew']], + ['healpulse', 'lifedew'], + ['haze', 'icywind'], + [['hydropump', 'muddywater'], ['muddywater', 'scald']], + ['disable', 'encore'], + ['freezedry', 'icebeam'], + ['energyball', 'leafstorm'], + ['earthpower', 'sandsearstorm'], + ['coaching', ['helpinghand', 'howl']], + ]; + + for (const pair of doublesIncompatiblePairs) this.incompatibleMoves(moves, movePool, pair[0], pair[1]); + + if (role !== 'Offensive Protect') this.incompatibleMoves(moves, movePool, PROTECT_MOVES, ['flipturn', 'uturn']); + } + + // General incompatibilities + const incompatiblePairs = [ + // These moves don't mesh well with other aspects of the set + [statusMoves, ['healingwish', 'switcheroo', 'trick']], + [SETUP, PIVOT_MOVES], + [SETUP, HAZARDS], + [SETUP, ['defog', 'nuzzle', 'toxic', 'yawn', 'haze']], + [PHYSICAL_SETUP, PHYSICAL_SETUP], + [SPECIAL_SETUP, 'thunderwave'], + ['substitute', PIVOT_MOVES], + [SPEED_SETUP, ['aquajet', 'rest', 'trickroom']], + ['curse', ['irondefense', 'rapidspin']], + ['dragondance', 'dracometeor'], + ['yawn', 'roar'], + ['trick', 'uturn'], + + // These attacks are redundant with each other + [['psychic', 'psychicnoise'], ['psyshock', 'psychicnoise']], + ['surf', ['hydropump', 'scald']], + ['liquidation', 'wavecrash'], + ['aquajet', 'flipturn'], + ['gigadrain', 'leafstorm'], + ['powerwhip', 'hornleech'], + ['airslash', 'hurricane'], + ['knockoff', 'foulplay'], + ['throatchop', ['crunch', 'lashout']], + ['doubleedge', ['bodyslam', 'headbutt']], + [['fireblast', 'magmastorm'], ['fierydance', 'flamethrower', 'lavaplume']], + ['thunderpunch', 'wildcharge'], + ['thunderbolt', 'discharge'], + ['gunkshot', ['direclaw', 'poisonjab', 'sludgebomb']], + ['aurasphere', 'focusblast'], + ['closecombat', 'drainpunch'], + [['dragonpulse', 'spacialrend'], 'dracometeor'], + ['heavyslam', 'flashcannon'], + ['alluringvoice', 'dazzlinggleam'], + ['defog', 'rapidspin'], + + // These status moves are redundant with each other + ['taunt', 'disable'], + [['thunderwave', 'toxic'], ['thunderwave', 'willowisp']], + [['thunderwave', 'toxic', 'willowisp'], 'toxicspikes'], + + // This space reserved for assorted hardcodes that otherwise make little sense out of context + // Landorus and Thundurus + ['nastyplot', ['rockslide', 'knockoff']], + // Persian + ['switcheroo', 'fakeout'], + // Amoonguss, though this can work well as a general rule later + ['toxic', 'clearsmog'], + // Chansey and Blissey + ['healbell', 'stealthrock'], + // Araquanid and Magnezone + ['mirrorcoat', ['hydropump', 'bodypress']], + ]; + + for (const pair of incompatiblePairs) this.incompatibleMoves(moves, movePool, pair[0], pair[1]); + + if (!types.includes('Ice')) this.incompatibleMoves(moves, movePool, 'icebeam', 'icywind'); + + if (!isDoubles) this.incompatibleMoves(moves, movePool, 'taunt', 'encore'); + + if (!types.includes('Dark') && teraType !== 'Dark') this.incompatibleMoves(moves, movePool, 'knockoff', 'suckerpunch'); + + if (!abilities.includes('Prankster')) this.incompatibleMoves(moves, movePool, 'thunderwave', 'yawn'); + + // This space reserved for assorted hardcodes that otherwise make little sense out of context: + // To force Close Combat on Barraskewda without locking it to Tera Fighting + if (species.id === 'barraskewda') { + this.incompatibleMoves(moves, movePool, ['psychicfangs', 'throatchop'], ['poisonjab', 'throatchop']); + } + // To force Toxic on Quagsire + if (species.id === 'quagsire') this.incompatibleMoves(moves, movePool, 'spikes', 'icebeam'); + // Taunt/Knock should be Cyclizar's flex moveslot + if (species.id === 'cyclizar') this.incompatibleMoves(moves, movePool, 'taunt', 'knockoff'); + // To force Stealth Rock on Camerupt + if (species.id === 'camerupt') this.incompatibleMoves(moves, movePool, 'roar', 'willowisp'); + // nothing else rolls these lol + if (species.id === 'coalossal') this.incompatibleMoves(moves, movePool, 'flamethrower', 'overheat'); + } + + override randomMoveset( + types: string[], + abilities: string[], + 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; + } + + 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.includes('Guts')) { + counter = this.addMove('facade', moves, types, abilities, teamDetails, species, isLead, isDoubles, + movePool, teraType, role); + } + + // Enforce Night Shade, Revelation Dance, Revival Blessing, and Sticky Web + for (const moveid of ['nightshade', 'revelationdance', 'revivalblessing', 'stickyweb']) { + if (movePool.includes(moveid)) { + counter = this.addMove(moveid, moves, types, abilities, teamDetails, species, isLead, isDoubles, + movePool, teraType, role); + } + } + + // Enforce Trick Room on Doubles Wallbreaker + if (movePool.includes('trickroom') && role === 'Doubles Wallbreaker') { + counter = this.addMove('trickroom', 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 in singles + if (!isDoubles && 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 Flip Turn on pure Water-type Wallbreakers + if (types.length === 1 && types.includes('Water') && + role === 'Wallbreaker' && movePool.includes('flipturn')) { + counter = this.addMove('flipturn', moves, types, abilities, teamDetails, species, isLead, isDoubles, + movePool, teraType, role); + } + + // Enforce Spore on Smeargle + if (species.id === 'smeargle') { + if (movePool.includes('spore')) { + counter = this.addMove('spore', moves, types, abilities, teamDetails, species, isLead, isDoubles, + movePool, teraType, role); + } + } + + // Enforce moves in doubles + if (isDoubles) { + const doublesEnforcedMoves = ['auroraveil', 'mortalspin', 'spore']; + for (const moveid of doublesEnforcedMoves) { + if (movePool.includes(moveid)) { + counter = this.addMove(moveid, moves, types, abilities, teamDetails, species, isLead, isDoubles, + movePool, teraType, role); + } + } + // Enforce Fake Out on slow Pokemon + if (movePool.includes('fakeout') && species.baseStats.spe <= 50) { + counter = this.addMove('fakeout', moves, types, abilities, teamDetails, species, isLead, isDoubles, + movePool, teraType, role); + } + // Enforce Tailwind on Prankster and Gale Wings users + if (movePool.includes('tailwind') && (abilities.includes('Prankster') || abilities.includes('Gale Wings'))) { + counter = this.addMove('tailwind', moves, types, abilities, teamDetails, species, isLead, isDoubles, + movePool, teraType, role); + } + // Enforce Thunder Wave on Prankster users as well + if (movePool.includes('thunderwave') && abilities.includes('Prankster')) { + counter = this.addMove('thunderwave', moves, types, abilities, teamDetails, species, isLead, isDoubles, + movePool, teraType, role); + } + } + + // Enforce STAB priority + if ( + ['Bulky Attacker', 'Bulky Setup', 'Wallbreaker', 'Doubles Wallbreaker'].includes(role) || + PRIORITY_POKEMON.includes(species.id) + ) { + 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.includes('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 a single STAB for Moltres + if (species.id === 'moltres') { + const typeToEnforce = this.randomChance(1, 2) ? 'Fire' : 'Flying'; + + 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) && typeToEnforce === moveType) { + stabMoves.push(moveid); + } + } + while (runEnforcementChecker(typeToEnforce)) { + if (!stabMoves.length) break; + const moveid = this.sampleNoReplace(stabMoves); + counter = this.addMove(moveid, moves, types, abilities, teamDetails, species, isLead, isDoubles, + movePool, teraType, role); + } + } + + // Enforce STAB + for (const type of types) { + // Moltres already has STAB, so ignore this block + if (species.id === 'moltres') break; + // prevents Meowscarada from being enforced stab moves + if (species.id === 'meowscarada') break; + // 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 + // prevents Meowscarada from being enforced stab moves (since it has Protean and doesn't care) + if (!counter.get('stabtera') && !['Bulky Support', 'Doubles Support'].includes(role) && + !abilities.includes('Protean')) { + 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 + // prevents Meowscarada from being enforced stab moves (since it has Protean and doesn't care) + if (!counter.get('stab') && !abilities.includes('Protean')) { + 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 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 redirecting moves and Fake Out on Doubles Support + if (role === 'Doubles Support') { + for (const moveid of ['fakeout', 'followme', 'ragepowder']) { + if (movePool.includes(moveid)) { + counter = this.addMove(moveid, moves, types, abilities, teamDetails, species, isLead, isDoubles, + movePool, teraType, role); + } + } + } + + // Enforce Protect + if (role.includes('Protect')) { + const protectMoves = movePool.filter(moveid => PROTECT_MOVES.includes(moveid)); + if (protectMoves.length) { + const moveid = this.sample(protectMoves); + 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 (!['AV Pivot', 'Fast Support', 'Bulky Support', 'Bulky Protect', 'Doubles Support'].includes(role)) { + 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; + } + + override getPriorityItem( + ability: string, + types: string[], + moves: Set, + counter: MoveCounter, + teamDetails: RandomTeamsTypes.TeamDetails, + species: Species, + isLead: boolean, + isDoubles: boolean, + teraType: string, + role: RandomTeamsTypes.Role, + ) { + if (!isDoubles) { + if (role === 'Fast Bulky Setup' && (ability === 'Quark Drive' || ability === 'Protosynthesis')) { + return 'Booster Energy'; + } + if (species.id === 'lokix') { + return (role === 'Fast Attacker') ? 'Silver Powder' : 'Life Orb'; + } + } + if (species.requiredItems) { + // Z-Crystals aren't available in Gen 9, so require Plates + if (species.baseSpecies === 'Arceus') { + return species.requiredItems[0]; + } + return this.sample(species.requiredItems); + } + if (role === 'AV Pivot') return 'Assault Vest'; + // other + if (moves.has('substitute')) return 'Leftovers'; + if (moves.has('protect') && ability !== 'Speed Boost') return 'Leftovers'; + if (counter.get('skilllink') && ability !== 'Skill Link' && species.id !== 'breloom') return 'Loaded Dice'; + if (moves.has('shellsmash') && ability !== 'Weak Armor') return 'White Herb'; + if ((ability === 'Guts' || moves.has('facade')) && !moves.has('sleeptalk')) { + return (types.includes('Fire') || ability === 'Toxic Boost' || ability === 'Poison Heal') ? 'Toxic Orb' : 'Flame Orb'; + } + if (['healingwish', 'switcheroo', 'trick'].some(m => moves.has(m))) { + if ( + species.baseStats.spe >= 60 && species.baseStats.spe <= 108 && + role !== 'Wallbreaker' && role !== 'Doubles Wallbreaker' && !counter.get('priority') + ) { + return 'Choice Scarf'; + } else { + return (counter.get('Physical') > counter.get('Special')) ? 'Choice Band' : 'Choice Specs'; + } + } + if ( + role === 'Wallbreaker' && (counter.get('Physical') > counter.get('Special')) && !counter.get('Status') + ) { + return 'Choice Band'; + } + if ( + role === 'Wallbreaker' && (counter.get('Physical') < counter.get('Special')) && !counter.get('Status') + ) { + return 'Choice Specs'; + } + if (ability === 'Poison Heal' || ability === 'Quick Feet') return 'Toxic Orb'; + if (moves.has('acrobatics') && ability !== 'Quark Drive' && ability !== 'Protosynthesis') return ''; + if (moves.has('auroraveil') || moves.has('lightscreen') && moves.has('reflect')) return 'Light Clay'; + if (ability === 'Gluttony') return `${this.sample(['Aguav', 'Figy', 'Iapapa', 'Mago', 'Wiki'])} Berry`; + if ( + ['Cheek Pouch', 'Cud Chew', 'Harvest', 'Ripen'].some(m => ability === m) || + moves.has('bellydrum') || moves.has('filletaway') + ) { + return 'Sitrus Berry'; + } + if (this.dex.getEffectiveness('Rock', species) >= 2) return 'Heavy-Duty Boots'; + if (species.nfe) return 'Eviolite'; + if (['Bulky Attacker', 'Bulky Support', 'Bulky Setup'].some(m => role === (m))) return 'Leftovers'; + if (role === 'Fast Support' || role === 'Fast Bulky Setup') { + return (counter.get('Physical') + counter.get('Special') >= 3) ? 'Life Orb' : 'Leftovers'; + } + } + + override 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: RandomTeamsTypes.RandomSetData[] = []; + + // 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 = set.abilities!; + if ( + isLead && (abilities.includes('Protosynthesis') || abilities.includes('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 && 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 = []; + types[0] = species.types[0]; + if (species.types[1]) types[1] = species.types[1]; + const abilities = set.abilities!; + + // 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) { + if (isDoubles) { + item = this.getDoublesItem(ability, types, moves, counter, teamDetails, species, isLead, teraType, role); + } else { + 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', 'Eviolite'].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'; + }); + // prevents Illumise (who can turn into Volbeat with Physical moves) from having 0 Atk EVs + if (noAttackStatMoves && !moves.has('transform') && this.format.mod !== 'partnersincrime' && + species.id !== 'illumise') { + evs.atk = 0; + ivs.atk = 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 || (this.random(2) ? 'F' : 'M')), + shiny: this.randomChance(1, 1024), + level, + moves: shuffledMoves, + ability, + evs, + ivs, + item, + teraType, + role, + }; + } + + override randomSets: { [species: string]: RandomTeamsTypes.RandomSpeciesData } = require('./random-sets.json'); + + random6x6Team() { + this.enforceNoDirectCustomBanlistChanges(); + + const seed = this.prng.getSeed(); + const ruleTable = this.dex.formats.getRuleTable(this.format); + const pokemon: RandomTeamsTypes.RandomSet[] = []; + + // For Monotype + const isMonotype = !!this.forceMonotype || ruleTable.has('sametypeclause'); + const isDoubles = this.format.gameType !== 'singles'; + const typePool = this.dex.types.names().filter(name => name !== "Stellar"); + const type = this.forceMonotype || this.sample(typePool); + + // PotD stuff + // const usePotD = global.Config && Config.potd && ruleTable.has('potd'); + // const potd = usePotD ? this.dex.species.get(Config.potd) : null; + + 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 = {}; + + const pokemonList = Object.keys(this.randomSets); + const [pokemonPool, baseSpeciesPool] = this.getPokemonPool(type, pokemon, isMonotype, pokemonList); + + let leadsRemaining = this.format.gameType === 'doubles' ? 2 : 1; + while (baseSpeciesPool.length && pokemon.length < this.maxTeamSize) { + const baseSpecies = this.sampleNoReplace(baseSpeciesPool); + // const z = 0; + const 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 (['ogerpon', 'ogerponhearthflame', 'terapagos'].includes(species.id) && teamDetails.teraBlast) 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; + + // Limit three of any type combination in Monotype + if (!this.forceMonotype && isMonotype && (typeComboCount[typeCombo] >= 3 * limitFactor)) continue; + + // The Pokemon of the Day + // if (potd?.exists && (pokemon.length === 1 || this.maxTeamSize === 1)) species = potd; + + // testing code + // if (pokemon.length === 0 || this.maxTeamSize === 1) species = this.dex.species.get('Terapagos'); + + let set: RandomTeamsTypes.RandomSet; + + if (leadsRemaining) { + if ( + isDoubles && DOUBLES_NO_LEAD_POKEMON.includes(species.baseSpecies) || + !isDoubles && NO_LEAD_POKEMON.includes(species.baseSpecies) + ) { + if (pokemon.length + leadsRemaining === this.maxTeamSize) continue; + set = this.randomSet(species, teamDetails, false, isDoubles); + if (teamDetails.teraBlast) continue; + pokemon.push(set); + } else { + set = this.randomSet(species, teamDetails, true, isDoubles); + // if (teamDetails.teraBlast) continue; + pokemon.unshift(set); + leadsRemaining--; + } + } else { + set = this.randomSet(species, teamDetails, false, isDoubles); + // if (teamDetails.teraBlast) continue; + 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]++; + } + } + // Count Dry Skin/Fluffy as Fire weaknesses + if (['Dry Skin', 'Fluffy'].includes(set.ability) && this.dex.getEffectiveness('Fire', species) === 0) { + typeWeaknesses['Fire']++; + } + 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 Random6x6Teams; diff --git a/data/rulesets.ts b/data/rulesets.ts index f051d043f3..8472973ebd 100644 --- a/data/rulesets.ts +++ b/data/rulesets.ts @@ -1507,17 +1507,9 @@ export const Rulesets: import('../sim/dex-formats').FormatDataTable = { typeTable = typeTable.filter(type => species.types.includes(type)); } const item = this.dex.items.get(set.item); - if (item.megaStone) { - if (Array.isArray(item.megaStone)) { - const index = (item.megaEvolves as string[]).indexOf(species.name); - if (index >= 0) { - species = this.dex.species.get(item.megaStone[index]); - typeTable = typeTable.filter(type => species.types.includes(type)); - } - } else { - species = this.dex.species.get(item.megaStone); - typeTable = typeTable.filter(type => species.types.includes(type)); - } + if (item.megaStone?.[species.name]) { + species = this.dex.species.get(item.megaStone[species.name]); + typeTable = typeTable.filter(type => species.types.includes(type)); } if (item.id === "ultranecroziumz" && species.baseSpecies === "Necrozma") { species = this.dex.species.get("Necrozma-Ultra"); @@ -1556,17 +1548,9 @@ export const Rulesets: import('../sim/dex-formats').FormatDataTable = { } color = species.color; const item = this.dex.items.get(set.item); - if (item.megaStone) { - if (Array.isArray(item.megaStone)) { - const index = (item.megaEvolves as string[]).indexOf(species.name); - if (index >= 0) { - species = this.dex.species.get(item.megaStone[index]); - color = species.color; - } - } else { - species = this.dex.species.get(item.megaStone); - color = species.color; - } + if (item.megaStone?.[species.name]) { + species = this.dex.species.get(item.megaStone[species.name]); + color = species.color; } if (item.id === "ultranecroziumz" && species.baseSpecies === "Necrozma") { species = this.dex.species.get("Necrozma-Ultra"); @@ -1622,35 +1606,6 @@ export const Rulesets: import('../sim/dex-formats').FormatDataTable = { this.add('rule', 'Terastal Clause: You cannot Terastallize'); }, }, - arceusevlimit: { - effectType: 'ValidatorRule', - name: 'Arceus EV Limit', - desc: "Restricts Arceus to a maximum of 100 EVs in any one stat, and only multiples of 10", - onValidateSet(set) { - const species = this.dex.species.get(set.species); - if (species.num === 493 && set.evs) { - let stat: StatID; - for (stat in set.evs) { - const ev = set.evs[stat]; - if (ev > 100) { - return [ - "Arceus can't have more than 100 EVs in any stat, because Arceus is only obtainable from level 100 events.", - "Level 100 Pokemon can only gain EVs from vitamins (Carbos etc), which are capped at 100 EVs.", - ]; - } - if (!( - ev % 10 === 0 || - (ev % 10 === 8 && ev % 4 === 0) - )) { - return [ - "Arceus can only have EVs that are multiples of 10, because Arceus is only obtainable from level 100 events.", - "Level 100 Pokemon can only gain EVs from vitamins (Carbos etc), which boost in multiples of 10.", - ]; - } - } - } - }, - }, inversemod: { effectType: 'Rule', name: 'Inverse Mod', @@ -2666,12 +2621,10 @@ export const Rulesets: import('../sim/dex-formats').FormatDataTable = { ) { species = this.dex.species.get(`${species.baseSpecies}-Crowned`); } - if (set.item && this.dex.items.get(set.item).megaStone) { + if (set.item) { const item = this.dex.items.get(set.item); - if (item.megaEvolves?.includes(species.name)) { - species = this.dex.species.get(Array.isArray(item.megaEvolves) ? - (item.megaStone as string[])[item.megaEvolves.indexOf(species.name)] : - item.megaStone as string); + if (item.megaStone?.[species.name]) { + species = this.dex.species.get(item.megaStone[species.name]); } } if (this.ruleTable.isRestrictedSpecies(species) || @@ -2693,10 +2646,8 @@ export const Rulesets: import('../sim/dex-formats').FormatDataTable = { } if (set.item) { const item = this.dex.items.get(set.item); - if (item.megaEvolves?.includes(set.species)) { - godSpecies = this.dex.species.get(Array.isArray(item.megaEvolves) ? - (item.megaStone as string[])[item.megaEvolves.indexOf(set.species)] : - item.megaStone as string); + if (item.megaStone?.[set.species]) { + godSpecies = this.dex.species.get(item.megaStone[set.species]); } if (["Zacian", "Zamazenta"].includes(godSpecies.baseSpecies) && item.id.startsWith('rusted')) { godSpecies = this.dex.species.get(set.species + "-Crowned"); diff --git a/lib/utils.ts b/lib/utils.ts index d96407d622..54f1a972a0 100644 --- a/lib/utils.ts +++ b/lib/utils.ts @@ -122,7 +122,7 @@ export function visualize(value: any, depth = 0): string { return `${constructor} (${value.size}) { ${mapped.join(', ')} }`; case 'Set': if (depth > 2) return `Set`; - return `${constructor} (${value.size}) { ${[...value].map(v => visualize(v), depth + 1).join(', ')} }`; + return `${constructor} (${value.size}) { ${[...value].map(v => visualize(v, depth + 1)).join(', ')} }`; } if (value.toString) { diff --git a/server/chat-commands/core.ts b/server/chat-commands/core.ts index 439cb4d898..2247792bd1 100644 --- a/server/chat-commands/core.ts +++ b/server/chat-commands/core.ts @@ -675,9 +675,9 @@ export const commands: Chat.ChatCommands = { if (!target) target = user.name; const values = await Ladders.visualizeAll(target); - let buffer = `
`; - buffer += Utils.html``; - + let buffer = `
`; + buffer += Utils.html`
User: ${target}
`; + buffer += `
User: ${target}
`; const ratings = values.join(``); if (!ratings) { buffer += ``; @@ -685,8 +685,7 @@ export const commands: Chat.ChatCommands = { buffer += ``; buffer += ratings; } - buffer += `
${this.tr`This user has not played any ladder games yet.`}
${this.tr`Format`}Elo${this.tr`W`}${this.tr`L`}${this.tr`Total`}
`; - + buffer += ``; this.sendReply(`|raw|${buffer}`); }, rankhelp: [ diff --git a/server/chat-formatter.ts b/server/chat-formatter.ts index 322688a220..1eb8be2e20 100644 --- a/server/chat-formatter.ts +++ b/server/chat-formatter.ts @@ -35,7 +35,7 @@ SOURCE FOR LINKREGEX (compile with https://regexfree.k55.io/ ) ( # characters allowed inside URL paths ( - [^\s()&<>[\]] | & | " + [^\s()&<>[\]`] | & | " | # parentheses in URLs should be matched, so they're not confused # for parentheses around URLs @@ -60,7 +60,7 @@ SOURCE FOR LINKREGEX (compile with https://regexfree.k55.io/ ) (?! [^ ]*> ) */ -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()[\]{}".,!?;:&<>*`^~\\]|\((?:[^\s()<>&[\]]|&)*\)))?)?|[a-z0-9.]+@[a-z0-9-]+(?:\.[a-z0-9-]+)*\.[a-z]{2,})(?![^ ]*>)/ig; +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()[\]{}".,!?;:&<>*`^~\\]|\((?:[^\s()<>&[\]]|&)*\)))?)?|[a-z0-9.]+@[a-z0-9-]+(?:\.[a-z0-9-]+)*\.[a-z]{2,})(?![^ ]*>)/ig; /** * A span is a part of the text that's formatted. In the text: @@ -422,7 +422,12 @@ class TextFormatter { 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++; + while (this.at(i) !== '<' || this.at(i + 1) !== '/' || this.at(i + 3) !== '>') { + if (i >= this.str.length) { + throw new Error(`Unclosed URL span when parsing: ${this.str}`); + } + i++; + } i += 4; this.pushSlice(i); } diff --git a/server/chat-plugins/auction.ts b/server/chat-plugins/auction.ts index 34a632eedb..77ac2d405d 100644 --- a/server/chat-plugins/auction.ts +++ b/server/chat-plugins/auction.ts @@ -259,8 +259,11 @@ export class Auction extends Rooms.SimpleRoomGame { sendBidInfo() { let buf = `
`; buf += Utils.html`Player: ${this.nominatedPlayer.name} `; - if (this.type === 'auction') buf += `Top bid: ${this.highestBid} `; - if (this.type === 'auction') buf += Utils.html`Top bidder: ${this.highestBidder.name}
`; + if (this.type === 'auction') { + buf += `Top bid: ${this.highestBid} `; + buf += Utils.html`Top bidder: ${this.highestBidder.name} `; + buf += `Managers: ${this.highestBidder.getManagers().map(m => `${Utils.escapeHTML(m)}`).join(' ')}
`; + } buf += Utils.html`Tiers Played: ${this.nominatedPlayer.tiersPlayed.length ? `${this.nominatedPlayer.tiersPlayed.join(', ')}` : 'N/A'}
`; buf += Utils.html`Tiers Not Played: ${this.nominatedPlayer.tiersNotPlayed.length ? `${this.nominatedPlayer.tiersNotPlayed.join(', ')}` : 'N/A'}`; buf += `
`; diff --git a/server/chat-plugins/othermetas.ts b/server/chat-plugins/othermetas.ts index fd356b3cd5..284fd2bde1 100644 --- a/server/chat-plugins/othermetas.ts +++ b/server/chat-plugins/othermetas.ts @@ -29,14 +29,23 @@ function getMegaStone(stone: string, mod = 'gen9'): Item | null { id: move.id, name: move.name, fullname: move.name, - megaEvolves: 'Rayquaza', - megaStone: 'Rayquaza-Mega', + megaStone: { 'Rayquaza': 'Rayquaza-Mega' }, exists: true, // Adding extra values to appease typescript gen: 6, num: -1, effectType: 'Item', sourceEffect: '', + isBerry: false, + ignoreKlutz: false, + isGem: false, + isPokeball: false, + isPrimalOrb: false, + shortDesc: "", + desc: "", + isNonstandard: null, + noCopy: false, + affectsFainted: false, } as Item; } else { return null; @@ -131,8 +140,8 @@ export const commands: Chat.ChatCommands = { megaSpecies = dex.species.get(forcedForme); baseSpecies = dex.species.get(forcedForme.split('-')[0]); } else { - megaSpecies = dex.species.get(Array.isArray(stone.megaStone) ? stone.megaStone[0] : stone.megaStone); - baseSpecies = dex.species.get(Array.isArray(stone.megaEvolves) ? stone.megaEvolves[0] : stone.megaEvolves); + megaSpecies = dex.species.get(Object.values(stone.megaStone!)[0]); + baseSpecies = dex.species.get(Object.keys(stone.megaStone!)[0]); } break; } @@ -282,8 +291,8 @@ export const commands: Chat.ChatCommands = { megaSpecies = dex.species.get(forcedForme); baseSpecies = dex.species.get(forcedForme.split('-')[0]); } else { - megaSpecies = dex.species.get(Array.isArray(aStone.megaStone) ? aStone.megaStone[0] : aStone.megaStone); - baseSpecies = dex.species.get(Array.isArray(aStone.megaEvolves) ? aStone.megaEvolves[0] : aStone.megaEvolves); + megaSpecies = dex.species.get(Object.values(aStone.megaStone!)[0]); + baseSpecies = dex.species.get(Object.keys(aStone.megaStone!)[0]); } break; } @@ -840,20 +849,30 @@ export const commands: Chat.ChatCommands = { reevo: 'showevo', showevo(target, room, user, connection, cmd) { - if (!this.runBroadcast()) return; - const targetid = toID(target); + const args = target.split(','); + if (!toID(args[0])) return this.parse('/help reevohelp'); + this.runBroadcast(); + let dex = Dex; + if (args[1] && toID(args[1]) in Dex.dexes) { + dex = Dex.dexes[toID(args[1])]; + } else if (room?.battle) { + const format = Dex.formats.get(room.battle.format); + dex = Dex.mod(format.mod); + } + + const targetid = toID(args[0]); const isReEvo = cmd === 'reevo'; if (!targetid) return this.parse(`/help ${isReEvo ? 're' : 'show'}evo`); - const evo = Dex.species.get(target); + const evo = dex.species.get(targetid); if (!evo.exists) { - throw new Chat.ErrorMessage(`Error: Pok\u00e9mon ${target} not found.`); + throw new Chat.ErrorMessage(`Error: Pok\u00e9mon ${targetid} not found.`); } if (!evo.prevo) { - const evoBaseSpecies = Dex.species.get( + const evoBaseSpecies = dex.species.get( (Array.isArray(evo.battleOnly) ? evo.battleOnly[0] : evo.battleOnly) || evo.changesFrom || evo.name ); if (!evoBaseSpecies.prevo) throw new Chat.ErrorMessage(`Error: ${evoBaseSpecies.name} is not an evolution.`); - const prevoSpecies = Dex.species.get(evoBaseSpecies.prevo); + const prevoSpecies = dex.species.get(evoBaseSpecies.prevo); const deltas = Utils.deepClone(evo); if (!isReEvo) { deltas.tier = 'CE'; @@ -892,14 +911,14 @@ export const commands: Chat.ChatCommands = { const details = { Gen: evo.gen, Weight: `${deltas.weighthg < 0 ? "" : "+"}${deltas.weighthg / 10} kg`, - Stage: (Dex.species.get(prevoSpecies.prevo).exists ? 3 : 2), + Stage: (dex.species.get(prevoSpecies.prevo).exists ? 3 : 2), }; this.sendReply(`|raw|${Chat.getDataPokemonHTML(deltas)}`); if (!isReEvo) { this.sendReply(`|raw|Gen: ${details["Gen"]} |  Weight: ${details["Weight"]} |  Stage: ${details["Stage"]}`); } } else { - const prevoSpecies = Dex.species.get(evo.prevo); + const prevoSpecies = dex.species.get(evo.prevo); const deltas = Utils.deepClone(evo); if (!isReEvo) { deltas.tier = 'CE'; @@ -932,7 +951,7 @@ export const commands: Chat.ChatCommands = { const details = { Gen: evo.gen, Weight: `${deltas.weighthg < 0 ? "" : "+"}${deltas.weighthg / 10} kg`, - Stage: (Dex.species.get(prevoSpecies.prevo).exists ? 3 : 2), + Stage: (dex.species.get(prevoSpecies.prevo).exists ? 3 : 2), }; this.sendReply(`|raw|${Chat.getDataPokemonHTML(deltas)}`); if (!isReEvo) { diff --git a/server/chat-plugins/randombattles/index.ts b/server/chat-plugins/randombattles/index.ts index e9a767c76c..2929d17d08 100644 --- a/server/chat-plugins/randombattles/index.ts +++ b/server/chat-plugins/randombattles/index.ts @@ -257,21 +257,21 @@ function getLetsGoMoves(species: string | Species) { return data.moves.map(formatMove).sort().join(`, `); } -function battleFactorySets(species: string | Species, tier: string | null, gen = 'gen9', isBSS = false) { +function battleFactorySets(species: string | Species, tier: string | null, gen = 'gen9', isBSS = false, is1v1 = false) { species = Dex.species.get(species); if (typeof species.battleOnly === 'string') { species = Dex.species.get(species.battleOnly); } gen = toID(gen); const genNum = parseInt(gen[3]); - if (isNaN(genNum) || genNum < 6 || (isBSS && genNum < 7)) return null; + if (isNaN(genNum) || genNum < 6 || (isBSS && genNum < 7) || (is1v1 && genNum < 9)) return null; const statsFile = JSON.parse( - FS(`data/random-battles/gen${genNum}/${isBSS ? `bss-` : ``}factory-sets.json`).readIfExistsSync() || + FS(`data/random-battles/gen${genNum}/${isBSS ? `bss-` : is1v1 ? `1v1-` : ``}factory-sets.json`).readIfExistsSync() || "{}" ); if (!Object.keys(statsFile).length) return null; let buf = ``; - if (!isBSS) { + if (!isBSS && !is1v1) { if (!tier) throw new Chat.ErrorMessage(`Please provide a valid tier.`); if (!(toID(tier) in TIERS)) throw new Chat.ErrorMessage(`That tier isn't supported.`); if (!(TIERS[toID(tier)] in statsFile)) { @@ -330,19 +330,26 @@ function battleFactorySets(species: string | Species, tier: string | null, gen = buf += ``; } } else { - const format = Dex.formats.get(`${gen}bssfactory`); - if (!(species.id in statsFile)) throw new Chat.ErrorMessage(`${species.name} doesn't have any sets in ${format.name}.`); - const setObj = statsFile[species.id]; + const format = Dex.formats.get(`${gen}${is1v1 ? '1v1' : 'bss'}factory`); + if (!((is1v1 ? species.name : species.id) in statsFile)) + throw new Chat.ErrorMessage(`${species.name} doesn't have any sets in ${format.name}.`); + const setObj = statsFile[is1v1 ? species.name : species.id]; 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(' / ')}
  • `; + const item = !Array.isArray(set.item) ? [set.item] : set.item; + buf += `
  • ${Dex.forFormat(format).species.get(set.species).name} @ ${item.map(formatItem).join(" / ")}
  • `; + const ability = !Array.isArray(set.ability) ? [set.ability] : set.ability; + buf += `
  • Ability: ${ability.map(formatAbility).join(" / ")}
  • `; + if (isBSS) { + buf += `
  • Level: 50
  • `; + } else if (set.level) { + buf += `
  • Level: ${set.level}
  • `; + } + if (!is1v1) buf += `
  • Tera Type: ${set.teraType.map(formatType).join(' / ')}
  • `; if (set.evs) { buf += `
  • EVs: `; const evs: string[] = []; @@ -353,7 +360,8 @@ function battleFactorySets(species: string | Species, tier: string | null, gen = } buf += `${evs.join(" / ")}
  • `; } - buf += `
  • ${formatNature(set.nature)} Nature
  • `; + const nature = !Array.isArray(set.nature) ? [set.nature] : set.nature; + buf += `
  • ${nature.map(formatNature).join(" / ")} Nature
  • `; if (set.ivs) { buf += `
  • IVs: `; const ivs: string[] = []; @@ -603,10 +611,12 @@ export const commands: Chat.ChatCommands = { `/randomdoublesbattle OR /randdubs [pokemon], [gen] - Same as above, but instead displays Random Doubles Battle moves.`, ], + '1v1factory': 'battlefactory', bssfactory: 'battlefactory', battlefactory(target, room, user, connection, cmd) { if (!this.runBroadcast()) return; const isBSS = cmd === 'bssfactory'; + const is1v1 = cmd === '1v1factory'; if (isBSS) { const args = target.split(','); if (!args[0]) return this.parse(`/help battlefactory`); @@ -619,6 +629,15 @@ export const commands: Chat.ChatCommands = { const bssSets = battleFactorySets(species, null, mod, true); if (!bssSets) return this.parse(`/help battlefactory`); return this.sendReplyBox(bssSets); + } else if (is1v1) { + if (!target) return this.parse(`/help battlefactory`); + const species = Dex.species.get(target); + if (!species.exists) { + throw new Chat.ErrorMessage(`Error: Pok\u00e9mon '${target.trim()}' not found.`); + } + const onevoneSets = battleFactorySets(species, null, 'gen9', false, true); + if (!onevoneSets) return this.parse(`/help battlefactory`); + return this.sendReplyBox(onevoneSets); } else { const args = target.split(','); if (!args[0]) return this.parse(`/help battlefactory`); diff --git a/server/chat-plugins/randombattles/ssb.tsx b/server/chat-plugins/randombattles/ssb.tsx index 5f7df25a44..10d2f329d3 100644 --- a/server/chat-plugins/randombattles/ssb.tsx +++ b/server/chat-plugins/randombattles/ssb.tsx @@ -373,7 +373,7 @@ class SSBSetsHTML extends Chat.JSX.Component<{ target: string }> { {(!Array.isArray(set.item) && item.megaStone) && } {/* keys and Kennedy have an itemless forme change */} {['Rayquaza'].includes(set.species) && } diff --git a/server/chat-plugins/randombattles/winrates.tsx b/server/chat-plugins/randombattles/winrates.tsx index cbba1ce0a4..f61e95652f 100644 --- a/server/chat-plugins/randombattles/winrates.tsx +++ b/server/chat-plugins/randombattles/winrates.tsx @@ -134,7 +134,7 @@ export function getSpeciesName(set: PokemonSet, format: Format) { } else if (species === "Groudon" && item.name === "Red Orb") { return "Groudon-Primal"; } else if (item.megaStone) { - return Array.isArray(item.megaStone) ? item.megaStone[0] : item.megaStone; + return Object.values(item.megaStone)[0]; } else if (species === "Rayquaza" && moves.includes('Dragon Ascent') && !item.zMove && megaRayquazaPossible) { return "Rayquaza-Mega"; } else if (species === "Poltchageist-Artisan") { // Babymons from here on out diff --git a/server/chat-plugins/thing-of-the-day.ts b/server/chat-plugins/thing-of-the-day.ts index 755b260270..aa38e72590 100644 --- a/server/chat-plugins/thing-of-the-day.ts +++ b/server/chat-plugins/thing-of-the-day.ts @@ -1021,3 +1021,13 @@ export const roomSettings: Chat.SettingsHandler[] = [ ] : [['disabled', true]], }), ]; + +export const destroy = () => { + for (const [, v] of otds) { + if (v.autoStartTimer) { + clearInterval(v.autoStartTimer); + v.autoStartTimer = null; + v.room.modlog({ action: `${v.id.toUpperCase()} TIMER RESTART` }); + } + } +}; diff --git a/server/friends.ts b/server/friends.ts index 5a76237267..30bc8a88fd 100644 --- a/server/friends.ts +++ b/server/friends.ts @@ -167,7 +167,7 @@ export class FriendsDatabase { } private async query(input: DatabaseRequest) { const process = PM.acquire(); - if (!process || !Config.usesqlite) { + if (!process || !Config.usesqlite || !Config.usesqlitefriends) { return null; } const result = await process.query(input); @@ -431,7 +431,7 @@ export const PM = new ProcessManager.QueryProcessManager { diff --git a/server/rooms.ts b/server/rooms.ts index 8433eed21a..b98bb0331a 100644 --- a/server/rooms.ts +++ b/server/rooms.ts @@ -1078,7 +1078,7 @@ export abstract class BasicRoom { runAutoModchat() { if (!this.settings.autoModchat || this.settings.autoModchat.active) return; // they are staff and online - const staff = Object.values(this.users).filter(u => this.auth.atLeast(u, '%')); + const staff = Object.values(this.users).filter(u => this.auth.atLeast(u, '%') && u.statusType === 'online'); if (!staff.length) { const { time } = this.settings.autoModchat; if (!time || time < 5) { diff --git a/sim/battle-actions.ts b/sim/battle-actions.ts index 55243f4f23..b87cf131b0 100644 --- a/sim/battle-actions.ts +++ b/sim/battle-actions.ts @@ -100,7 +100,6 @@ export class BattleActions { // will definitely switch out at this point - oldActive.illusion = null; this.battle.singleEvent('End', oldActive.getAbility(), oldActive.abilityState, oldActive); this.battle.singleEvent('End', oldActive.getItem(), oldActive.itemState, oldActive); @@ -1871,21 +1870,15 @@ export class BattleActions { pokemon.baseMoves.includes(toID(altForme.requiredMove)) && !item.zMove) { return altForme.name; } + if (!item.megaStone) return null; // Temporary hardcode until generation shift - if ((species.baseSpecies === "Floette" || species.baseSpecies === "Zygarde") && item.megaEvolves === species.name) { - return item.megaStone as string; + if ((species.baseSpecies === "Floette" || species.baseSpecies === "Zygarde") && item.megaStone[species.name]) { + return item.megaStone[species.name]; } // a hacked-in Megazard X can mega evolve into Megazard Y, but not into Megazard X - if (Array.isArray(item.megaStone)) { - // FIXME: Change to species.name when champions comes - const index = (item.megaEvolves as string[]).indexOf(species.baseSpecies); - if (index < 0) return null; - return item.megaStone[index]; - // FIXME: Change to species.name when champions comes - } else if (item.megaEvolves === species.baseSpecies && item.megaStone !== species.name) { - return item.megaStone; - } - return null; + // FIXME: Change to species.name when champions comes + const megaEvolution = item.megaStone[species.baseSpecies]; + return megaEvolution && megaEvolution !== species.name ? megaEvolution : null; } canUltraBurst(pokemon: Pokemon) { diff --git a/sim/battle.ts b/sim/battle.ts index 8b787b026a..cbfbda0de2 100644 --- a/sim/battle.ts +++ b/sim/battle.ts @@ -1298,6 +1298,39 @@ export class Battle { return !!move.flags['contact']; } + skillSwap(source: Pokemon, target: Pokemon) { + if (source.fainted || target.fainted) return false; + if (source.volatiles['dynamax'] || target.volatiles['dynamax']) return false; + const sourceAbility = source.getAbility(); + const targetAbility = target.getAbility(); + if (sourceAbility.flags['failskillswap'] || targetAbility.flags['failskillswap']) return false; + if (this.gen <= 5 && sourceAbility.id === targetAbility.id) return false; + + const sourceEffect = this.dex.conditions.get('skillswap'); + const targetCanBeSet = this.runEvent('SetAbility', target, source, sourceEffect, sourceAbility); + if (!targetCanBeSet) return targetCanBeSet; + const sourceCanBeSet = this.runEvent('SetAbility', source, source, sourceEffect, targetAbility); + if (!sourceCanBeSet) return sourceCanBeSet; + + if (this.gen <= 4 || source.isAlly(target)) { + this.add('-activate', source, 'Skill Swap'); + } else { + this.add('-activate', source, 'Skill Swap', target, `[ability] ${targetAbility.name}`, `[ability2] ${sourceAbility.name}`); + } + this.singleEvent('End', sourceAbility, source.abilityState, source); + this.singleEvent('End', targetAbility, target.abilityState, target); + source.ability = targetAbility.id; + target.ability = sourceAbility.id; + source.abilityState = this.initEffectState({ id: toID(source.ability), target: source }); + target.abilityState = this.initEffectState({ id: toID(target.ability), target }); + source.volatileStaleness = undefined; + if (!source.isAlly(target)) target.volatileStaleness = 'external'; + if (this.gen > 3) { + this.singleEvent('Start', sourceAbility, target.abilityState, target); + this.singleEvent('Start', targetAbility, source.abilityState, source); + } + } + getPokemon(fullname: string | Pokemon) { if (typeof fullname !== 'string') fullname = fullname.fullname; for (const side of this.sides) { @@ -1790,7 +1823,7 @@ export class Battle { if (this.turn <= 100) return; // the turn limit is not a part of Endless Battle Clause - if (this.turn >= 1000) { + if (this.turn > 1000) { this.add('message', `It is turn 1000. You have hit the turn limit!`); this.tie(); return true; @@ -3144,9 +3177,9 @@ export class Battle { this.log[this.lastMoveLine] = parts.join('|'); } - debug(activity: string) { + debug(...activity: Part[]) { if (this.debugMode) { - this.add('debug', activity); + this.add('debug', ...activity); } } diff --git a/sim/dex-abilities.ts b/sim/dex-abilities.ts index 63e406cc52..c3af1b2ccf 100644 --- a/sim/dex-abilities.ts +++ b/sim/dex-abilities.ts @@ -85,7 +85,7 @@ export class DexAbilities { } getByID(id: ID): Ability { - if (id === '') return EMPTY_ABILITY; + if (id === '' || id === 'constructor') return EMPTY_ABILITY; let ability = this.abilityCache.get(id); if (ability) return ability; diff --git a/sim/dex-conditions.ts b/sim/dex-conditions.ts index 990ce7cd93..057d6f3284 100644 --- a/sim/dex-conditions.ts +++ b/sim/dex-conditions.ts @@ -665,7 +665,7 @@ export class DexConditions { } getByID(id: ID): Condition { - if (id === '') return EMPTY_CONDITION; + if (id === '' || id === 'constructor') return EMPTY_CONDITION; let condition = this.conditionCache.get(id); if (condition) return condition; diff --git a/sim/dex-data.ts b/sim/dex-data.ts index e09d649250..55578ba14f 100644 --- a/sim/dex-data.ts +++ b/sim/dex-data.ts @@ -172,7 +172,7 @@ export class DexNatures { return this.getByID(toID(name)); } getByID(id: ID): Nature { - if (id === '') return EMPTY_NATURE; + if (id === '' || id === 'constructor') return EMPTY_NATURE; let nature = this.natureCache.get(id); if (nature) return nature; @@ -297,7 +297,7 @@ export class DexTypes { } getByID(id: ID): TypeInfo { - if (id === '') return EMPTY_TYPE_INFO; + if (id === '' || id === 'constructor') return EMPTY_TYPE_INFO; let type = this.typeCache.get(id); if (type) return type; diff --git a/sim/dex-items.ts b/sim/dex-items.ts index ef97fd8f43..d8558177e7 100644 --- a/sim/dex-items.ts +++ b/sim/dex-items.ts @@ -43,17 +43,11 @@ export class Item extends BasicEffect implements Readonly { */ readonly onMemory?: string; /** - * If this is a mega stone: The name (e.g. Charizard-Mega-X) of the - * forme this allows transformation into. + * If this is a mega stone: A pair (e.g. Charizard: Charizard-Mega-X) of the + * forme this allows transformation from and into. * undefined, if not a mega stone. */ - readonly megaStone?: string | string[]; - /** - * If this is a mega stone: The name (e.g. Charizard) of the - * forme this allows transformation from. - * undefined, if not a mega stone. - */ - readonly megaEvolves?: string | string[]; + readonly megaStone?: { [megaEvolves: string]: string }; /** * If this is a Z crystal: true if the Z Crystal is generic * (e.g. Firium Z). If species-specific, the name @@ -116,7 +110,6 @@ export class Item extends BasicEffect implements Readonly { this.onDrive = data.onDrive || undefined; this.onMemory = data.onMemory || undefined; this.megaStone = data.megaStone || undefined; - this.megaEvolves = data.megaEvolves || undefined; this.zMove = data.zMove || undefined; this.zMoveType = data.zMoveType || undefined; this.zMoveFrom = data.zMoveFrom || undefined; @@ -176,7 +169,7 @@ export class DexItems { } getByID(id: ID): Item { - if (id === '') return EMPTY_ITEM; + if (id === '' || id === 'constructor') return EMPTY_ITEM; let item = this.itemCache.get(id); if (item) return item; if (this.dex.getAlias(id)) { diff --git a/sim/dex-moves.ts b/sim/dex-moves.ts index 63f9a13afa..5b56490430 100644 --- a/sim/dex-moves.ts +++ b/sim/dex-moves.ts @@ -621,7 +621,7 @@ export class DexMoves { } getByID(id: ID): Move { - if (id === '') return EMPTY_MOVE; + if (id === '' || id === 'constructor') return EMPTY_MOVE; let move = this.moveCache.get(id); if (move) return move; if (this.dex.getAlias(id)) { diff --git a/sim/dex-species.ts b/sim/dex-species.ts index fab61861ca..4a05d4ca0c 100644 --- a/sim/dex-species.ts +++ b/sim/dex-species.ts @@ -436,7 +436,7 @@ export class DexSpecies { } getByID(id: ID): Species { - if (id === '') return EMPTY_SPECIES; + if (id === '' || id === 'constructor') return EMPTY_SPECIES; let species: Mutable | undefined = this.speciesCache.get(id); if (species) return species; diff --git a/sim/pokemon.ts b/sim/pokemon.ts index ba51b073a0..418bdc3bd2 100644 --- a/sim/pokemon.ts +++ b/sim/pokemon.ts @@ -1900,10 +1900,18 @@ export class Pokemon { this.ability = ability.id; this.abilityState = this.battle.initEffectState({ id: ability.id, target: this }); if (sourceEffect && !isFromFormeChange && !isTransform) { - if (source) { - this.battle.add('-ability', this, ability.name, oldAbility.name, `[from] ${sourceEffect.fullname}`, `[of] ${source}`); - } else { - this.battle.add('-ability', this, ability.name, oldAbility.name, `[from] ${sourceEffect.fullname}`); + switch (sourceEffect.id) { + case 'mummy': + case 'lingeringaroma': + this.battle.add('-activate', source, sourceEffect.fullname, this, '[ability] ' + oldAbility.name); + break; + default: + if (source) { + this.battle.add('-ability', this, ability.name, oldAbility.name, `[from] ${sourceEffect.fullname}`, `[of] ${source}`); + } else { + this.battle.add('-ability', this, ability.name, oldAbility.name, `[from] ${sourceEffect.fullname}`); + } + break; } } if (ability.id && this.battle.gen > 3 && diff --git a/sim/team-validator.ts b/sim/team-validator.ts index 8d234a9ea7..91eea6d65c 100644 --- a/sim/team-validator.ts +++ b/sim/team-validator.ts @@ -526,14 +526,8 @@ export class TeamValidator { if (ruleTable.has('obtainableformes')) { const canMegaEvo = dex.gen <= 7 || ruleTable.has('+pokemontag:past'); - if (item.megaEvolves?.includes(species.name)) { - if (!item.megaStone) throw new Error(`Item ${item.name} has no base form for mega evolution`); - if (Array.isArray(item.megaEvolves)) { - const idx = item.megaEvolves.indexOf(species.name); - tierSpecies = dex.species.get(item.megaStone[idx]); - } else { - tierSpecies = dex.species.get(item.megaStone as string); - } + if (item.megaStone?.[species.name]) { + tierSpecies = dex.species.get(item.megaStone[species.name]); } else if (item.id === 'redorb' && species.id === 'groudon') { tierSpecies = dex.species.get('Groudon-Primal'); } else if (item.id === 'blueorb' && species.id === 'kyogre') { @@ -2099,6 +2093,25 @@ export class TeamValidator { if (fastReturn) return true; problems.push(`${name} must be at least level ${eventData.level}${etc}.`); } + if ((dex.gen === 3 || dex.gen === 4) && eventData.level === 100 && set.evs) { + let statName: StatID; + for (statName in set.evs) { + const ev = set.evs[statName]; + if (ev > 100) { + problems.push( + `${name} can't have more than 100 EVs in any stat, because it is only obtainable from level 100 events. Level 100 Pokemon can only gain EVs from vitamins (Carbos etc), which are capped at 100 EVs.`, + ); + } + if (!( + ev % 10 === 0 || + (ev % 10 === 8 && ev % 4 === 0) + )) { + problems.push( + `${name} can only have EVs that are multiples of 10, because it is only obtainable from level 100 events. Level 100 Pokemon can only gain EVs from vitamins (Carbos etc), which boost in multiples of 10.`, + ); + } + } + } if ((eventData.shiny === true && !set.shiny) || (!eventData.shiny && set.shiny)) { if (fastReturn) return true; const shinyReq = eventData.shiny ? ` be shiny` : ` not be shiny`; diff --git a/sim/tools/exhaustive-runner.ts b/sim/tools/exhaustive-runner.ts index db239828ae..90cdecad54 100644 --- a/sim/tools/exhaustive-runner.ts +++ b/sim/tools/exhaustive-runner.ts @@ -137,8 +137,8 @@ export class ExhaustiveRunner { const signatures = new Map(); for (const id of pools.items.possible) { const item = dex.data.Items[id]; - if (item.megaEvolves) { - const pokemon = toID(item.megaEvolves); + if (item.megaStone) { + const pokemon = toID(Object.keys(item.megaStone)[0]); const combo = { item: id }; let combos = signatures.get(pokemon); if (!combos) { diff --git a/test/main.js b/test/main.js index 946a9dcf7c..5c2495e002 100644 --- a/test/main.js +++ b/test/main.js @@ -29,12 +29,16 @@ config.crashguard = false; config.watchconfig = false; // Don't try to write to file system config.nofswriting = true; -// allow renaming without a token +// Don't try to listen to the network +config.lazysockets = true; +// Allow renaming without a token config.noguestsecurity = true; // Test a normal ladder config.fakeladder = false; // Don't log monitor messages to the console (necessary so that chat monitor tests don't clog up stdout) config.loglevel = 3; +// If sqlite is enabled at all, run tests in server/modlog +config.usesqlitemodlog = true; require('./../dist/lib/process-manager').ProcessManager.disabled = true; diff --git a/test/server/chat-plugins/friends.js b/test/server/chat-plugins/friends.js index 7eb04b449e..25aec02464 100644 --- a/test/server/chat-plugins/friends.js +++ b/test/server/chat-plugins/friends.js @@ -8,7 +8,7 @@ const assert = require('../../assert'); describe.skip("Friends lists", () => { const { FriendsDatabase } = require('../../../dist/server/friends'); - const test = (Config.usesqlite ? it : it.skip); + const test = (Config.usesqlite && Config.usesqlitefriends ? it : it.skip); test("Should properly setup database", () => { assert.doesNotThrow(() => FriendsDatabase.setupDatabase(':memory:')); }); diff --git a/test/server/chat.js b/test/server/chat.js index 02a1e58dfa..b202664a7c 100644 --- a/test/server/chat.js +++ b/test/server/chat.js @@ -3,6 +3,17 @@ const assert = require('assert').strict; describe('Chat', () => { + it('should not infinite loop formatText', () => { + assert.equal( + Chat.formatText(`<\\\\||^^**~~\`\`https://a/Olaaaseusbobalhos\`\`~~**^^||\\\\`), + `<https://a/Olaaaseusbobalhos` + ); + assert.equal( + Chat.formatText(`[[https://google.com/]]text`), + `https://google.com/text` + ); + }); + it('should run formatText correctly', () => { assert.equal( Chat.formatText(`hi **__bold italics__** ^^superscript^^ \\\\subscript\\\\ normal ~~strikethrough~~ bye`), diff --git a/test/server/modlog.js b/test/server/modlog.js index eb5b751a40..a4ab3835ce 100644 --- a/test/server/modlog.js +++ b/test/server/modlog.js @@ -5,12 +5,8 @@ 'use strict'; -const ModlogConstructor = Config.usesqlite ? (require('../../dist/server/modlog')).Modlog : null; -const modlog = ModlogConstructor ? new ModlogConstructor(':memory:', {}) : null; const assert = require('assert').strict; -Config.usesqlitemodlog = true; - const DATASET_A = [ { action: 'ROOMBAN', userid: 'sometroll', ip: '127.0.0.1', loggedBy: 'annika', note: 'FIRST ENTRY', time: 1 }, { action: 'LOCK', userid: 'sometroll', ip: '127.0.0.1', loggedBy: 'annika', note: 'ENTRY 2', time: 2 }, @@ -38,23 +34,26 @@ async function lastLine(database, roomid) { return database.get(prepared, [roomid]); } -(Config.usesqlite ? describe : describe.skip)('Modlog', () => { +(Config.usesqlite && Config.usesqlitemodlog ? describe : describe.skip)('Modlog', () => { before(async () => { - if (modlog.readyPromise) await modlog.readyPromise; + if (Rooms.Modlog.readyPromise) { + await Rooms.Modlog.readyPromise; + } + if (!Rooms.Modlog.databaseReady) throw new Error(`Failed to ready up modlog database`); }); describe('Modlog#prepareSQLSearch', () => { it('should respect the maxLines parameter', async () => { - const query = modlog.prepareSQLSearch(['lobby'], 1337, false, { note: [], user: [], ip: [], action: [], actionTaker: [] }); + const query = Rooms.Modlog.prepareSQLSearch(['lobby'], 1337, false, { note: [], user: [], ip: [], action: [], actionTaker: [] }); assert(query.queryText.endsWith('LIMIT ?')); assert(query.args.includes(1337)); - const noMaxLines = modlog.prepareSQLSearch(['lobby'], 0, false, { note: [], user: [], ip: [], action: [], actionTaker: [] }); + const noMaxLines = Rooms.Modlog.prepareSQLSearch(['lobby'], 0, false, { note: [], user: [], ip: [], action: [], actionTaker: [] }); assert(!noMaxLines.queryText.includes('LIMIT')); }); it('should attempt to respect onlyPunishments', async () => { - const query = modlog.prepareSQLSearch(['lobby'], 0, true, { note: [], user: [], ip: [], action: [], actionTaker: [] }); + const query = Rooms.Modlog.prepareSQLSearch(['lobby'], 0, true, { note: [], user: [], ip: [], action: [], actionTaker: [] }); assert(query.queryText.includes('action IN (')); assert(query.args.includes('WEEKLOCK')); }); @@ -62,20 +61,20 @@ async function lastLine(database, roomid) { describe('Modlog#getSharedID', () => { it('should detect shared modlogs', () => { - assert(modlog.getSharedID('battle-gen8randombattle-42')); - assert(modlog.getSharedID('groupchat-annika-shitposting')); - assert(modlog.getSharedID('help-mePleaseIAmTrappedInAUnitTestFactory')); + assert(Rooms.Modlog.getSharedID('battle-gen8randombattle-42')); + assert(Rooms.Modlog.getSharedID('groupchat-annika-shitposting')); + assert(Rooms.Modlog.getSharedID('help-mePleaseIAmTrappedInAUnitTestFactory')); - assert(!modlog.getSharedID('1v1')); - assert(!modlog.getSharedID('development')); + assert(!Rooms.Modlog.getSharedID('1v1')); + assert(!Rooms.Modlog.getSharedID('development')); }); }); describe('Modlog#write', () => { it('should write messages serially to the modlog', async () => { - await modlog.write('development', { note: 'This message is logged first', action: 'UNITTEST' }); - await modlog.write('development', { note: 'This message is logged second', action: 'UNITTEST' }); - const lines = await modlog.database.all(await modlog.database.prepare( + await Rooms.Modlog.write('development', { note: 'This message is logged first', action: 'UNITTEST' }); + await Rooms.Modlog.write('development', { note: 'This message is logged second', action: 'UNITTEST' }); + const lines = await Rooms.Modlog.database.all(await Rooms.Modlog.database.prepare( // Order by modlog_id since the writes most likely happen at the same second `SELECT * FROM modlog WHERE roomid = 'development' ORDER BY modlog_id DESC LIMIT 2` )); @@ -85,8 +84,8 @@ async function lastLine(database, roomid) { }); it('should use overrideID if specified', async () => { - await modlog.write('battle-gen8randombattle-1337', { note: "I'm testing overrideID", action: 'UNITTEST' }, 'heyadora'); - const line = await lastLine(modlog.database, 'battle-gen8randombattle-1337'); + await Rooms.Modlog.write('battle-gen8randombattle-1337', { note: "I'm testing overrideID", action: 'UNITTEST' }, 'heyadora'); + const line = await lastLine(Rooms.Modlog.database, 'battle-gen8randombattle-1337'); assert.equal(line.note, "I'm testing overrideID"); assert.equal(line.visual_roomid, 'heyadora'); }); @@ -96,17 +95,17 @@ async function lastLine(database, roomid) { it('should rename modlogs', async () => { const entry = { note: 'This is in a modlog that will be renamed!', action: 'UNITTEST' }; - await modlog.write('oldroom', entry); - await modlog.rename('oldroom', 'newroom'); - const line = await lastLine(modlog.database, 'newroom'); + await Rooms.Modlog.write('oldroom', entry); + await Rooms.Modlog.rename('oldroom', 'newroom'); + const line = await lastLine(Rooms.Modlog.database, 'newroom'); assert.equal(entry.action, line.action); assert.equal(entry.note, line.note); const newEntry = { note: 'This modlog has been renamed!', action: 'UNITTEST' }; - await modlog.write('newroom', newEntry); + await Rooms.Modlog.write('newroom', newEntry); - const newLine = await lastLine(modlog.database, 'newroom'); + const newLine = await lastLine(Rooms.Modlog.database, 'newroom'); assert.equal(newEntry.action, newLine.action); assert.equal(newEntry.note, newLine.note); @@ -116,23 +115,23 @@ async function lastLine(database, roomid) { describe('Modlog#search', () => { before(async () => { for (const entry of DATASET_A) { - await modlog.write('readingtest', entry); + await Rooms.Modlog.write('readingtest', entry); } for (const entry of DATASET_B) { - await modlog.write('readingtest2', entry); + await Rooms.Modlog.write('readingtest2', entry); } }); it('should be capable of reading the entire modlog file', async () => { - const results = await modlog.search('readingtest2', { note: [], user: [], ip: [], action: [], actionTaker: [] }, 10000); + const results = await Rooms.Modlog.search('readingtest2', { note: [], user: [], ip: [], action: [], actionTaker: [] }, 10000); assert.equal(results.results.length, DATASET_B.length); }); it('user searches should be case-insensitive', async () => { - const notExactUpper = await modlog.search('readingtest', { user: [{ search: 'sOmETRoll', isExact: false }], note: [], ip: [], action: [], actionTaker: [] }); - const notExactLower = await modlog.search('readingtest', { user: [{ search: 'sometroll', isExact: false }], note: [], ip: [], action: [], actionTaker: [] }); - const exactUpper = await modlog.search('readingtest', { user: [{ search: 'sOMEtroLL', isExact: true }], note: [], ip: [], action: [], actionTaker: [] }); - const exactLower = await modlog.search('readingtest', { user: [{ search: 'sometroll', isExact: true }], note: [], ip: [], action: [], actionTaker: [] }); + const notExactUpper = await Rooms.Modlog.search('readingtest', { user: [{ search: 'sOmETRoll', isExact: false }], note: [], ip: [], action: [], actionTaker: [] }); + const notExactLower = await Rooms.Modlog.search('readingtest', { user: [{ search: 'sometroll', isExact: false }], note: [], ip: [], action: [], actionTaker: [] }); + const exactUpper = await Rooms.Modlog.search('readingtest', { user: [{ search: 'sOMEtroLL', isExact: true }], note: [], ip: [], action: [], actionTaker: [] }); + const exactLower = await Rooms.Modlog.search('readingtest', { user: [{ search: 'sometroll', isExact: true }], note: [], ip: [], action: [], actionTaker: [] }); assert.deepEqual(notExactUpper.results, notExactLower.results); assert.deepEqual(exactUpper.results, exactLower.results); @@ -141,17 +140,17 @@ async function lastLine(database, roomid) { // isExact is currently set up to search for the entire note equalling the search // this could be redesigned, but is what we currently test for. it('note searches should respect isExact', async () => { - const notExact = await modlog.search('readingtest', { note: [{ search: 'has man', isExact: false }], user: [], ip: [], action: [], actionTaker: [] }); - const exact = await modlog.search('readingtest', { note: [{ search: 'has man', isExact: true }], user: [], ip: [], action: [], actionTaker: [] }); + const notExact = await Rooms.Modlog.search('readingtest', { note: [{ search: 'has man', isExact: false }], user: [], ip: [], action: [], actionTaker: [] }); + const exact = await Rooms.Modlog.search('readingtest', { note: [{ search: 'has man', isExact: true }], user: [], ip: [], action: [], actionTaker: [] }); assert.equal(exact.results.length, 0); assert(notExact.results.length); }); it('should be LIFO (last-in, first-out)', async () => { - await modlog.write('lifotest', { note: 'firstwrite', action: 'UNITTEST', timestamp: 1 }); - await modlog.write('lifotest', { note: 'secondwrite', action: 'UNITTEST', timestamp: 2 }); - const search = await modlog.search('lifotest'); + await Rooms.Modlog.write('lifotest', { note: 'firstwrite', action: 'UNITTEST', timestamp: 1 }); + await Rooms.Modlog.write('lifotest', { note: 'secondwrite', action: 'UNITTEST', timestamp: 2 }); + const search = await Rooms.Modlog.search('lifotest'); // secondwrite was last in, so it should be first out (results[0]) assert.notEqual(search.results[0].note, 'firstwrite'); @@ -163,8 +162,8 @@ async function lastLine(database, roomid) { }); it('should support limiting the number of responses', async () => { - const unlimited = await modlog.search('readingtest'); - const limited = await modlog.search('readingtest', { note: [], user: [], ip: [], action: [], actionTaker: [] }, 5); + const unlimited = await Rooms.Modlog.search('readingtest'); + const limited = await Rooms.Modlog.search('readingtest', { note: [], user: [], ip: [], action: [], actionTaker: [] }, 5); assert.equal(limited.results.length, 5); assert(unlimited.results.length > limited.results.length); @@ -180,8 +179,8 @@ async function lastLine(database, roomid) { }); it('should support filtering out non-punishment-related logs', async () => { - const all = (await modlog.search('readingtest2', { note: [], user: [], ip: [], action: [], actionTaker: [] }, 20, false)).results; - const onlyPunishments = (await modlog.search('readingtest2', { note: [], user: [], ip: [], action: [], actionTaker: [] }, 20, true)).results; + const all = (await Rooms.Modlog.search('readingtest2', { note: [], user: [], ip: [], action: [], actionTaker: [] }, 20, false)).results; + const onlyPunishments = (await Rooms.Modlog.search('readingtest2', { note: [], user: [], ip: [], action: [], actionTaker: [] }, 20, true)).results; assert(all.length > onlyPunishments.length); assert.equal( diff --git a/test/sim/abilities/illusion.js b/test/sim/abilities/illusion.js index a49e097d54..49917c37d4 100644 --- a/test/sim/abilities/illusion.js +++ b/test/sim/abilities/illusion.js @@ -10,6 +10,19 @@ describe('Illusion', () => { battle.destroy(); }); + it('should not wear off when switching out', () => { + battle = common.createBattle([[ + { species: "Zoroark", ability: 'illusion', moves: ['sleeptalk'] }, + { species: "Diglett", moves: ['sleeptalk'] }, + ], [ + { species: "Wynaut", moves: ['sleeptalk'] }, + ]]); + + battle.makeChoices('move sleeptalk', 'auto'); + battle.makeChoices('switch 2', 'auto'); + assert(battle.log.every(line => !line.includes('|-end|p1a: Zoroark|Illusion'))); + }); + it(`should not instantly wear off before Dynamaxing`, () => { battle = common.gen(8).createBattle([[ { species: "Zoroark", ability: 'illusion', moves: ['sleeptalk'] }, diff --git a/test/sim/data.js b/test/sim/data.js index dcae534243..9c8f96a2c5 100644 --- a/test/sim/data.js +++ b/test/sim/data.js @@ -132,12 +132,6 @@ describe('Dex data', () => { const entry = Items[itemid]; assert.equal(toID(entry.name), itemid, `Mismatched Item key "${itemid}" of "${entry.name}"`); assert.equal(typeof entry.num, 'number', `Item ${entry.name} should have a number`); - if (entry.megaStone) { - assert.equal(typeof entry.megaStone, typeof entry.megaEvolves, `Item ${entry.name} megaStone and megaEvolves should both be the same type`); - if (Array.isArray(entry.megaStone)) { - assert.equal(entry.megaStone.length, entry.megaEvolves.length, `Item ${entry.name} megaStone and megaEvolves arrays should be the same length`); - } - } } }); diff --git a/test/sim/misc/endlessbattleclause.js b/test/sim/misc/endlessbattleclause.js index eb2cc3437d..a61dd2d007 100644 --- a/test/sim/misc/endlessbattleclause.js +++ b/test/sim/misc/endlessbattleclause.js @@ -182,7 +182,7 @@ describe('Endless Battle Clause (slow)', () => { { species: "Blissey", moves: ['splash'] }, { species: "Vaporeon", moves: ['splash'] }, ] }); - for (let i = 0; i < 998; i++) { + for (let i = 0; i < 999; i++) { battle.makeChoices('switch 2', 'switch 2'); } assert(!battle.ended); diff --git a/test/sim/moves/pursuit.js b/test/sim/moves/pursuit.js index 504a0a548c..f3d634df71 100644 --- a/test/sim/moves/pursuit.js +++ b/test/sim/moves/pursuit.js @@ -35,28 +35,6 @@ describe(`Pursuit`, () => { assert.bounded(damage, [256, 304], 'Actual damage: ' + damage); }); - it(`should continue the switch in Gen 3`, () => { - battle = common.gen(3).createBattle([[ - { species: "Tyranitar", ability: 'sandstream', moves: ['pursuit'] }, - ], [ - { species: "Alakazam", ability: 'magicguard', moves: ['psyshock'] }, - { species: "Clefable", ability: 'unaware', moves: ['calmmind'] }, - ]]); - battle.makeChoices('move Pursuit', 'switch 2'); - assert(battle.p2.active[0].hp); - }); - - it(`should continue the switch in Gen 4`, () => { - battle = common.gen(4).createBattle([[ - { species: "Tyranitar", ability: 'sandstream', moves: ['pursuit'] }, - ], [ - { species: "Alakazam", ability: 'magicguard', moves: ['psyshock'] }, - { species: "Clefable", ability: 'unaware', moves: ['calmmind'] }, - ]]); - battle.makeChoices('move Pursuit', 'switch 2'); - assert(battle.p2.active[0].hp); - }); - it(`should not repeat`, () => { battle = common.createBattle([[ { species: "Beedrill", ability: 'swarm', item: 'beedrillite', moves: ['pursuit'] }, @@ -86,6 +64,57 @@ describe(`Pursuit`, () => { assert.bounded(furret.maxhp - furret.hp, [60, 70]); }); + it(`should activate on the first target switching out`, () => { + battle = common.createBattle({ gameType: 'doubles' }, [[ + { species: "Beedrill", moves: ['pursuit'] }, + { species: "Furret", moves: ['pursuit'] }, + ], [ + { species: "Clefable", ability: 'shellarmor', moves: ['calmmind'] }, + { species: "Toxapex", moves: ['calmmind'] }, + { species: "Wynaut", moves: ['calmmind'] }, + { species: "Alakazam", moves: ['calmmind'] }, + ]]); + const [clefable, toxapex, wynaut, alakazam] = battle.p2.pokemon; + battle.makeChoices('move pursuit 1, move pursuit 2', 'switch 3, switch 4'); // Does not matter who Pursuit targets + assert.bounded(clefable.maxhp - clefable.hp, [34 + 30, 40 + 35]); + assert.fullHP(toxapex); + assert.fullHP(wynaut); + assert.fullHP(alakazam); + }); + + it(`should activate on the second target switching out, if the first fainted`, () => { + battle = common.createBattle({ gameType: 'doubles' }, [[ + { species: "Beedrill", moves: ['pursuit'] }, + { species: "Furret", moves: ['pursuit'] }, + ], [ + { species: "Clefable", ability: 'shellarmor', moves: ['calmmind'] }, + { species: "Shedinja", moves: ['calmmind'], evs: { spe: 252 } }, + { species: "Wynaut", moves: ['calmmind'] }, + { species: "Alakazam", moves: ['calmmind'] }, + ]]); + const [clefable, shedinja, wynaut, alakazam] = battle.p2.pokemon; + battle.makeChoices('move pursuit 1, move pursuit 2', 'switch 3, switch 4'); + assert.bounded(clefable.maxhp - clefable.hp, [34, 40]); + assert.fainted(shedinja); + assert.fullHP(wynaut); + assert.fullHP(alakazam); + }); + + it(`should activate on a switching opponent even if targeting an ally`, () => { + battle = common.createBattle({ gameType: 'doubles' }, [[ + { species: "Beedrill", item: 'beedrillite', moves: ['pursuit'] }, + { species: "Clefable", moves: ['calmmind'] }, + { species: "Furret", moves: ['calmmind'] }, + ], [ + { species: "Clefable", moves: ['calmmind'] }, + { species: "Alakazam", moves: ['calmmind'] }, + { species: "Roserade", moves: ['calmmind'] }, + ]]); + const clefable = battle.p2.pokemon[0]; + battle.makeChoices('move pursuit mega -2, switch 3', 'switch 3, move calmmind'); + assert.bounded(clefable.maxhp - clefable.hp, [53, 63]); + }); + it(`should not double in power or activate before a switch triggered by Red Card`, () => { battle = common.createBattle([[ { species: 'Steelix', item: 'redcard', moves: ['pursuit'] }, @@ -146,4 +175,156 @@ describe(`Pursuit`, () => { battle.makeChoices('move pursuit 1, move sleeptalk', 'auto'); assert.false.fullHP(gengar); }); + + it(`should be able to be paralyzed to prevent activation`, () => { + battle = common.createBattle({ forceRandomChance: true }, [[ + { species: "Tyranitar", moves: ['pursuit', 'sleeptalk'] }, + ], [ + { species: "Jolteon", moves: ['thunderwave'] }, + { species: "Clefable", moves: ['calmmind'] }, + ]]); + const jolteon = battle.p2.pokemon[0]; + battle.makeChoices('move sleeptalk', 'move thunderwave'); + assert.equal(battle.p1.active[0].status, 'par'); + battle.makeChoices('move pursuit', 'switch 2'); + assert.fullHP(jolteon); + }); + + describe(`[Gen 4]`, () => { + it(`should continue the switch`, () => { + battle = common.gen(4).createBattle([[ + { species: "Tyranitar", ability: 'sandstream', moves: ['pursuit'] }, + ], [ + { species: "Alakazam", ability: 'magicguard', moves: ['psyshock'] }, + { species: "Clefable", ability: 'unaware', moves: ['calmmind'] }, + ]]); + battle.makeChoices('move Pursuit', 'switch 2'); + assert(battle.p2.active[0].hp); + }); + + it(`should not activate if the user is asleep at the beginning of the turn`, () => { + battle = common.gen(4).createBattle([[ + { species: "Tyranitar", moves: ['pursuit'] }, + ], [ + { species: "Breloom", moves: ['spore'] }, + { species: "Breloom", moves: ['sleeptalk'] }, + ]]); + battle.makeChoices('move pursuit', 'move spore'); + assert.equal(battle.p1.active[0].status, 'slp'); + while (battle.p1.active[0].status === 'slp') { + battle.makeChoices('move pursuit', 'switch 2'); + } + // Tyranitar woke up and used Pursuit + const activeBreloom = battle.p2.active[0]; + assert.bounded(activeBreloom.maxhp - activeBreloom.hp, [33, 40]); + assert.fullHP(battle.p2.pokemon[1].hp); + }); + + it(`should be able to be paralyzed to prevent activation`, () => { + battle = common.gen(4).createBattle({ forceRandomChance: true }, [[ + { species: "Tyranitar", moves: ['pursuit', 'sleeptalk'] }, + ], [ + { species: "Jolteon", moves: ['thunderwave'] }, + { species: "Clefable", moves: ['calmmind'] }, + ]]); + const jolteon = battle.p2.pokemon[0]; + battle.makeChoices('move sleeptalk', 'move thunderwave'); + assert.equal(battle.p1.active[0].status, 'par'); + battle.makeChoices('move pursuit', 'switch 2'); + assert.false.fullHP(jolteon); + }); + }); + + describe(`[Gen 3]`, () => { + it(`should continue the switch`, () => { + battle = common.gen(3).createBattle([[ + { species: "Tyranitar", ability: 'sandstream', moves: ['pursuit'] }, + ], [ + { species: "Alakazam", ability: 'magicguard', moves: ['psyshock'] }, + { species: "Clefable", ability: 'unaware', moves: ['calmmind'] }, + ]]); + battle.makeChoices('move Pursuit', 'switch 2'); + assert(battle.p2.active[0].hp); + }); + + it(`should only activate on the targeted opponent`, () => { + battle = common.gen(3).createBattle({ gameType: 'doubles' }, [[ + { species: "Beedrill", moves: ['pursuit'] }, + { species: "Furret", moves: ['pursuit'] }, + ], [ + { species: "Clefable", ability: 'shellarmor', moves: ['calmmind'] }, + { species: "Clefable", ability: 'shellarmor', moves: ['calmmind'] }, + { species: "Wynaut", moves: ['calmmind'] }, + { species: "Alakazam", moves: ['calmmind'] }, + ]]); + const [clefable, clefable2, wynaut, alakazam] = battle.p2.pokemon; + battle.makeChoices('move pursuit 1, move pursuit 2', 'switch 3, switch 4'); + assert.bounded(clefable.maxhp - clefable.hp, [35, 42]); + assert.bounded(clefable2.maxhp - clefable2.hp, [35, 42]); + assert.fullHP(wynaut); + assert.fullHP(alakazam); + }); + + it(`should not activate on a switching opponent if targeting an ally`, () => { + battle = common.gen(3).createBattle({ gameType: 'doubles' }, [[ + { species: "Beedrill", moves: ['pursuit'] }, + { species: "Clefable", moves: ['calmmind'] }, + { species: "Furret", moves: ['calmmind'] }, + ], [ + { species: "Clefable", moves: ['calmmind'] }, + { species: "Alakazam", moves: ['calmmind'] }, + { species: "Roserade", moves: ['calmmind'] }, + ]]); + const clefable = battle.p2.pokemon[0]; + battle.makeChoices('move pursuit -2, switch 3', 'switch 3, move calmmind'); + assert.fullHP(clefable); + const furret = battle.p1.pokemon[1]; + assert.bounded(furret.maxhp - furret.hp, [25, 30]); + }); + }); + + describe(`[Gen 2]`, () => { + it(`should continue the switch`, () => { + battle = common.gen(2).createBattle([[ + { species: "Tyranitar", moves: ['pursuit'] }, + ], [ + { species: "Alakazam", moves: ['psyshock'] }, + { species: "Clefable", moves: ['calmmind'] }, + ]]); + battle.makeChoices('move Pursuit', 'switch 2'); + assert(battle.p2.active[0].hp); + }); + + it(`should try to activate even if the user is asleep at the beginning of the turn`, () => { + battle = common.gen(2).createBattle([[ + { species: "Paras", moves: ['pursuit'], evs: { spa: 252 } }, + ], [ + { species: "Parasect", moves: ['spore'], evs: { hp: 252, spd: 252 } }, + { species: "Parasect", moves: ['sleeptalk'], evs: { hp: 252, spd: 252 } }, + ]]); + battle.makeChoices('move pursuit', 'move spore'); + assert.equal(battle.p1.active[0].status, 'slp'); + while (battle.p1.active[0].status === 'slp') { + battle.makeChoices('move pursuit', 'switch 2'); + } + // Paras woke up and used Pursuit + assert.fullHP(battle.p2.active[0].hp); + const inactiveParasect = battle.p2.pokemon[1]; + assert.bounded(inactiveParasect.maxhp - inactiveParasect.hp, [42, 50]); + }); + + it(`should be able to be paralyzed to prevent activation`, () => { + battle = common.gen(2).createBattle({ forceRandomChance: true }, [[ + { species: "Tyranitar", moves: ['pursuit', 'sleeptalk'] }, + ], [ + { species: "Jolteon", moves: ['thunderwave'] }, + { species: "Clefable", moves: ['calmmind'] }, + ]]); + const jolteon = battle.p2.pokemon[0]; + battle.makeChoices('move sleeptalk', 'move thunderwave'); + assert.equal(battle.p1.active[0].status, 'par'); + battle.makeChoices('move pursuit', 'switch 2'); + assert.fullHP(jolteon); + }); + }); }); diff --git a/test/sim/team-validator/basic.js b/test/sim/team-validator/basic.js index db18072a5b..d0926240a7 100644 --- a/test/sim/team-validator/basic.js +++ b/test/sim/team-validator/basic.js @@ -156,7 +156,7 @@ describe('Team Validator', () => { const team = [ { species: 'smeargle', ability: 'owntempo', moves: ['bellydrum', 'spore', 'sketch'], evs: { hp: 1 } }, ]; - assert.legalTeam(team, 'gen4ou'); + assert.legalTeam(team, 'gen4anythinggoes'); }); it('should accept both ability types for Mega Evolutions', () => { diff --git a/test/sim/team-validator/events.js b/test/sim/team-validator/events.js index 3c093f0d8b..3132ca4a67 100644 --- a/test/sim/team-validator/events.js +++ b/test/sim/team-validator/events.js @@ -164,4 +164,21 @@ describe('Team Validator', () => { ]; assert.legalTeam(team, 'gen5ou'); }); + + it(`should force Gen 4 Arceus to have max 100 EVs in any one stat and only multiples of 10`, () => { + let team = [ + { species: 'arceus', ability: 'multitype', moves: ['judgment'], evs: { hp: 110 } }, + ]; + assert.false.legalTeam(team, 'gen4anythinggoes'); + + team = [ + { species: 'arceus', ability: 'multitype', moves: ['judgment'], evs: { hp: 99 } }, + ]; + assert.false.legalTeam(team, 'gen4anythinggoes'); + + team = [ + { species: 'arceus', ability: 'multitype', moves: ['judgment'], evs: { hp: 100, atk: 100, def: 100, spa: 100, spd: 100, spe: 10 } }, + ]; + assert.legalTeam(team, 'gen4anythinggoes'); + }); }); diff --git a/tools/set-import/importer.ts b/tools/set-import/importer.ts index 9458ad0d7f..ab59d11bd2 100644 --- a/tools/set-import/importer.ts +++ b/tools/set-import/importer.ts @@ -312,7 +312,8 @@ function skip(dex: ModdedDex, format: Format, pokemon: string, set: DeepPartial< if (pokemon === 'Rayquaza-Mega') { return format.id.includes('ubers') || !hasMove('Dragon Ascent'); } else { - return dex.items.get(set.item).megaStone !== pokemon; + const item = dex.items.get(set.item); + return !item.megaStone || !Object.values(item.megaStone).includes(pokemon); } } if (pokemon === 'Necrozma-Ultra' && set.item !== 'Ultranecrozium Z') return true;